This release includes 3 breaking changes for platform teams planning a safe upgrade.
Published 6d
MCP Developer Tools
✓ No known CVEs patched
✓ No known CVEs patched in this version
Topics
agentic-ai
ai
analytics-engineering
database
harness
mcp
+1 more
self-hosted
Affected surfaces
breaking_upgrade
auth
Summary
AI summaryUpdates Upgrade notes for admins, 0.6.5 — 2026-07-16, and JSON across a mixed release.
Full changelog
0.6.5 — 2026-07-16
Upgrade notes for admins
- Run migrations after upgrading.
0008_remove_documentationsource_file_patterns
drops thefile_patternscolumn — any custom glob patterns previously set
are gone; every documentation source now only ever parses*.mdfiles.
0009_alter_documentationsource_folder_nameis metadata-only (updated
help_text), no data changes. - The app no longer ships a default "TetherDust Documentation" source under
sources/docs/— a fresh install now starts with zero documentation
sources. If you relied on the shipped product docs being registered out of
the box, pull them from an earlier tag or write your own.
Changed
- Generate Documentation and Generate Documentation Library both gained a
fourth wizard step, Prompt, after Sources — a read-only live preview
of the exact prompt that will be sent to the agent (base template + Scope
& goals + thecreate_documentationtool instructions built from the
selected destination/sources), debounced 400ms after the last edit to
Type/Library type, Scope, or Sources. Backed by two new no-side-effect
API actions,generate-previewandgenerate-library-preview, which
reuse the exact prompt-building code the realgenerate/generate-library
actions call (extracted intodocgen.build_single_generation_prompt()/
build_library_generation_prompt()so there's one source of truth for
what gets sent). The preview renders as formatted Markdown (reusing the
samereact-markdown/remark-gfm+.doc-result-preview__content
styling as the generation result preview) rather than raw text, since the
prompt itself is Markdown. - The Codebases admin list's Activity column is now labeled Status,
matching the Database Connections list's column name for the same
ACTIVE/INACTIVE badge. - The Documentation Sources admin list's Validate result now renders as
a full-width row under the source, matching the Database Connections
list's Test result — instead of a small badge squeezed next to the
button. - Add Documentation's option picker now groups its choices into Manual
and Generate using AI sections, matching the grouped pickers on Add
Database Connection and Add Codebase. - Delete confirmation on the Documentation Sources admin list now uses the
same styled in-app dialog as the Database Connections and Codebases
lists, instead of the browser's nativeconfirm()popup. - Delete failure on the Documentation Sources admin list (e.g. the folder
still exists on disk) now shows the error in a new styledAlertDialog
(components/AlertDialog.tsx) matchingConfirmDialog's look, instead of
the browser's nativealert()popup. - Edit Documentation Source now shares the same numbered wizard-section
layout as Add Documentation Source (Identity / Configuration), instead of
a plain two-card layout — matching how Edit/Add already look identical on
Database Connections and Codebases. - Added a
CustomSelectcomponent (admin/components/forms.tsx) — a styled
dropdown matching the app's look (glass panel, cyan focus ring, uppercase
labels) instead of the browser's native<select>popup, using CSS
(.custom-select, already present informs.css/tokens.cssfor both
themes but previously unused by any component) with full keyboard support
(arrow keys, Enter, Escape). Wired it into the Type dropdown on
Generate Documentation, the Library type dropdown on Generate
Documentation Library, and the Type dropdown on Edit Documentation
Source's Configuration step, replacing their native selects. - Added a
ComboInputcomponent (admin/components/forms.tsx) — a styled
text input + suggestions dropdown (see.combo-inputindocsgen.css,
likewise already present but unused) replacing the browser's native
<input list>/<datalist>autocomplete. UnlikeCustomSelectit stays
free-text: any value can still be typed and submitted, and the dropdown
shows matching existing folders plus aCreate "…"entry when the typed
value doesn't match one of them. Wired it into Generate Documentation's
Destination folder field, replacing its<datalist>-backed input. - Removed the configurable File patterns feature from Documentation
Sources entirely — every source now only ever parses*.mdfiles, with no
way to widen or narrow that per source. Removed: thefile_patterns
column onDocumentationSource(migration
0008_remove_documentationsource_file_patterns), the field from the
admin API/serializer and bothDocSourceInput/DocSourcefrontend
types, the "File patterns (JSON)" field and "Optional Configurations"
step on Edit Documentation Source (back down to two steps: Identity,
Configuration), the Patterns column on the Documentation Sources
list, andDocumentationSourceConfig.file_patternsplus every glob-list
loop intdmcp(markdown_parser.py,server.py,
tools/create_documentation.py,tools/__init__.py's direct-SQL admin-DB
loader) — all hardcoded to*.mdinstead. The Documentation Sources
admin list's Validate action and the docs viewer's file tree
(api/v1/docs.py) both still work the same, just without the
configurability. - Removed the built-in "TetherDust Documentation" source (24 Markdown files
undersources/docs/TetherDust Documentation/) and the boot-time code that
registered it. The app no longer ships any default documentation source —
sources/docs/starts empty. Removed the.gitignorecarve-out that kept
that one folder tracked (sources/docs/*now has no exception). Deleted
engine/builtin_docs.pyand itsapps.pypost-migrate hook entirely —
besides seeding the shipped source, it only ran the same
sync_from_filesystem()thatdocker-entrypoint.shalready runs on every
boot andDocSourceViewSet.list()already runs on every admin-list load,
so it added no coverage beyond those two once the seeding was gone. - Swept for leftovers from the file-patterns/register-a-folder/shipped-docs
removals above: fixed remaining "documentations/" copy (a folder name that
never actually existed — the real path issources/docs/) across Add/Edit
Documentation Source, Generate Documentation, and Generate Documentation
Library, plus their backend docstrings/help_text; fixed the Documentation
Sources empty-state copy ("Register a folder…") and the Add Documentation
"Edit it" step (still mentioned setting "file patterns") to match current
behavior. - Removed the Register a folder option from Add Documentation — dropping
a folder under documentations/ already auto-registers it (with default
type/description/patterns) the next time the admin list loads, so the
manual create form was redundant with editing the auto-created source
afterward. The Manual section now explains those three steps (create,
auto-register, edit) instead of showing a button. Documentation Sources
are edit-only in the admin UI now;DocSourceFormPagedropped its create
branch, thedocsources/registerroute,createDocSource/
getDocSourceFoldersAPI calls, and the backend's now-unusedfolders
action.
Fixed
DATABASE_LIBRARY_GUIDE(the library-generation prompt template used by
the new Prompt step) had two spots where a fenced example was nested
inside another fence using the same 3-backtick marker (a
```mermaid/```sqlblock inside a```markdownblock) —
CommonMark can't nest identical fences, so the inner fence's non-bare
line doesn't close anything, but its own bare closingdoes close the *outer* fence early, leaving a stray trailingthat opens a new,
never-closed fence. In the "Data Flows" example this self-corrected by
chance a few blocks later, but the "Example Queries" example's stray
fence stayed open for the rest of the document — every heading and table
after it (Style rules, Checklist, ...) got swallowed into one
giant code block and rendered as flat text instead of real Markdown
structure. Fixed both by bumping the outer fence to 4 backticks, the
standard way to nest a 3-backtick fence inside another. Verified all
fences in the file now balance.- The Prompt step's live preview flashed to "Loading preview…" on every edit
to Type/Library type, Scope, or Sources — each debounced input change gave
the preview query a new key, and withoutplaceholderData, TanStack
Query cleareddata(soisLoadingwent true again) until the refetch
resolved. AddedplaceholderData: keepPreviousDataso the previous
prompt stays on screen while the next one is fetched, and the loading
message only ever shows once, before the very first preview arrives. - Removed the Agent picker from Generate Documentation and Generate
Documentation Library's Configuration step. Both forms already
auto-selected the active agent as the default and never offered a real
reason to pick a different one, so the dropdown just added a step to a
choice that was already made. Both forms now always use the active
agent; if none is active, the form shows an error and disables the
Generate button instead of submitting and failing with a generic
"Missing required fields" response. - Removed the Is active toggle from Edit Documentation Source — it was
silently non-functional.is_activeis derived from folder presence
under sources/docs/ byDocSourceService.sync_from_filesystem(), which
runs on every admin-list load and unconditionally reactivates any source
whose folder still exists. So manually turning a source inactive got
reverted the moment the admin list was fetched again, undoing the change
before an admin could even see it take effect.is_activeis now a
read-only field on the API (DocSourceSerializer) — it only ever changes
via deleting/restoring the folder on disk, matching the actual behavior. - Generate Documentation Library was missing the Scope & goals field
that Generate Documentation (single page) already had — the gap ran the
whole way down:build_library_prompt()had noscopeparameter,
docgen.start_library()never threaded one through, and the
generate-libraryAPI action never read one from the request. Added
scopeend-to-end (prompt builder → engine → API → frontend) for both
Generate Documentation and Generate Documentation Library. On both forms,
Scope & goals now lives in the Configuration step (alongside Type/
Library type) instead of a separate "Optional Configurations" step, and
Source material moved out of Configuration into its own new Sources
step — three required steps (Identity, Configuration, Sources) instead of
two required plus one optional. - The Sources step's category headings ("Database", "Documentation",
"Codebase") on Generate Documentation, Generate Documentation Library,
and Generate Dashboard Chart now use the same bold, full-contrast,
wide-letter-spaced style as the Config step's field labels (Type, Library
type, Agent), instead of a dimmer, tighter-spaced, muted-gray style that
read as a lower priority than it should. - The Source material picker (shared by Generate Documentation, Generate
Documentation Library, and Generate Dashboard Chart) laid its Database /
Documentation / Codebase category columns out stacked on top of each
other. They now render side by side in a 3-column grid (stacking back to
one column below 800px), and the redundant "Source material" heading was
removed from the Sources step on the two documentation-generation forms —
the step heading already says "Sources". - Delete Documentation Source used to attempt removing the folder from disk
itself, but thebackendcontainer's./sources/docsmount is read-only,
so that silently failed — and since the folder still existed, the very
next admin-list refetch re-discovered it via the filesystem sync and
recreated the source, making the delete look like a no-op. The mount stays
read-only; Delete now instead checks whether the folder is still present
and, if so, rejects with a message asking the admin to delete the folder
from disk first and click Delete again to remove it from the list. - The docs viewer sidebar's file tree indented files by
depth * var(--md)in
an inline style, double-counting nesting depth on top of themargin-left
each ancestor folder already contributes via.docs-dir— files ended up
one tab short of their sibling folders at the top level (and drifted
further off at deeper nesting). Removed the inline style so files fall
back to.docs-file-btn's existing fixedcalc(var(--lg) + var(--md))
left padding, which combined with the inherited ancestor margins now lines
files up with their sibling folders at every depth. backend/engine/prompts/docs.py's wiki-link instructions (WIKILINK_NOTE,
TETHERDUST_CONTEXT, andLIBRARY_GUIDE) under-specified how[[...]]
paths resolve, andLIBRARY_GUIDE's subsystem cross-link example (see [[X]]) actively modeled the wrong pattern: bare filenames only resolve
against the library root, never the current page's folder, but the guide
didn't say that plainly and its own example omitted the folder-qualified
path deep-dive pages actually need. AI-generated libraries whose deep-dive
pages live in subfolders (the common case —LIBRARY_GUIDEitself tells
the agent to reach forSubsystems/,Schemas/,API/folders) ended up
with bare-filename and relative../links between subfolder pages, none
of which the frontend'swikilink.tsresolver supports — every such link
rendered "This page doesn't exist or you don't have permission". Reworded
all three to state the rule unambiguously (bare filenames only work
library-root-to-library-root; every other link, including between two
pages in the same subfolder, needs the full<LibraryRoot>/Subfolder/ Page.mdpath; there is no../syntax), fixedLIBRARY_GUIDE's example
to use a folder-qualified path, and added the same rule to its "What to
avoid" and checklist sections.DATABASE_LIBRARY_GUIDEalready stated the
full-path rule correctly and was left as-is.
Breaking Changes
- Removed `file_patterns` column and configurable glob support from DocumentationSource – all sources now only parse `*.md` files (migration `0008_remove_documentationsource_file_patterns`).
- Dropped the default "TetherDust Documentation" source shipped with fresh installs; `sources/docs/` starts empty.
- Eliminated the **Register a folder** option and associated create‑form from Add Documentation, making documentation sources edit‑only.
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
About TetherDust
All releases →Related context
Related tools
Beta — feedback welcome: [email protected]