Synapse v2.1.2 — "real root cause + live loose ends"¶
Patch release fixing the actual root cause behind non-convergent ingest runs that kept recurring after 2.1.1, plus six smaller fixes/improvements surfaced from live usage. No schema migrations.
Fixed¶
- Non-convergent ingest runs, actual root cause: 2.1.1 fixed the
folderContexthint's wording, but that was not the whole story — the default source-summary FILE path was computed viasource_filename.rsplit(".", 1), which strips only the file extension, not the directory. Sincesource_filename(the D3 "source identity") legitimately keeps the raw subfolder path forsources[]traceability, a source underraw/sources/Procurement/04_Deliverables/.../Deck.mdstill got a default summary path ofwiki/sources/Procurement/04_Deliverables/.../Deck.mdinstead of the required flatwiki/sources/Deck.md(K6) — failingvalidate_page_routingidentically on every retry. Fixed by deriving the default path viaPath(source_filename).stem, matching the sibling helperwriter._source_identity_stem(). Also added an explicit "FILE path MUST match frontmatter type" reminder to the generation prompt to reduce a separately observed compliance miss (atype: comparisonpage written underwiki/concepts/instead ofwiki/comparisons/). - overview.md updates were invisible until a manual reload:
overview.mdis regenerated once per ingest-queue drain (matching the original llm_wikionQueueDrainedbehavior, per ADR-0078) but never bumpeddata_version, so the SSE/eventschannel never told live clients it had changed. Fixed (ADR-0089) — the bump fires only on a successful overwrite. - "Other" nav-tree bucket showed unlabeled ghost entries: alongside the expected
log.md/index.md, stray Page rows with both a null title and a null/unrecognized type (partial-ingest leftovers) were also falling into "Other". The tree now drops them.
Added¶
- Retry button for non-convergent ingest runs:
POST /ingest/runs/{id}/retryalready re-injected prior validation errors into a fresh attempt, but nothing in the UI called it, and it only recognized true pipeline failures —converged_falsecompletions were invisible to it.IngestRunDetailnow has a "Retry run" action for both cases. - NavTree live refresh: the wiki tree now subscribes to the existing
data_versionSSE signal (previously only refetched on mount or after an explicit page-create/meta-save), so newly ingested pages and overview.md updates appear during a bulk import without a reload. - Synthesis/comparison suggestions in the regular review sweep:
propose_corpus_shape_review()was only reachable via an explicitPOST /ops/synthesizecall. Added it as sweep Pass 3 (deterministic, no extra provider call) so borderline-confidence synthesis/comparison clusters reach the F9 review queue during normal operation, not only on an explicit synthesize run. Gated byreview_corpus_shape_enabled(default on). - macOS: closing the window now hides it instead of quitting the whole app — matching standard macOS convention, using the tray Show/Quit menu that already existed. Cmd+Q and the tray's Quit still fully exit. Windows/Linux close behavior is unchanged.
- Changelog bundling safety net:
copy-changelog.mjsno longer silently ships a desktop build withoutCHANGELOG.md— it now falls back to a repo-root search and fails loudly during a release prebuild if the file genuinely can't be found. CI now also verifiesfrontend/dist/CHANGELOG.mdexists and is non-empty before a release ships.
Upgrade notes¶
No schema migrations. If you had an ingest run stuck at "Non convergito" from a source living
in a raw subfolder, or one that failed on a spurious wiki/log.md/comparison-routing error,
retry it — it should now converge.