Skip to content

Synapse v1.9.4 — "completion pack"

Fifth release of the v2.0 train — the last of the refactor/feature "completion" set before 2.0.0's breaking changes. Long-source chunking finally reaches the default block-loop pipeline (closing the last blocker to deleting the legacy JSON path), review-create moves onto the same engine, ingest gets a self-healing 429 queue, per-device scoped API tokens land, MCP/clipper go multi-vault-aware, pages get a one-line gloss in the index catalogue, and the deprecations that 2.0.0 will act on start warning now. Five workstreams, two migrations.

Added

  • Chunked-analysis long-source support in the block loop (flagship, PF-LONGSRC-1): run_block_loop's Stage 1 now chunks sources past ingest_long_source_char_threshold (48K chars) via the same bounded chunker long_source.py already used for the legacy JSON path, then merges per-chunk analyses under ## Source section i/N analysis headers. This fixes the silent truncation of long regulatory PDFs.
  • Smart ingest queue (PF-QUEUE-429-1): the queue now auto-pauses on a 429 from any provider with a decaying backoff ladder (30s → 60s → 120s → 300s, hard-capped per I7) instead of failing the run outright. New per-capability concurrency caps (ingest_concurrency_cli/_api/_local, default 1/3/1).
  • Scoped, revocable API tokens (PF-AUTH-1): new api_tokens table (migration) — label, PBKDF2-hashed secret (plaintext returned once, at creation, never again), optional vault scope, read-only flag, last_used_at. POST/GET/DELETE /config/api-tokens + a Settings → Security UI card.
  • Multi-vault MCP and clipper (PF-MCP-VAULT-1, PF-F11-PICKER-1): every MCP tool gains an optional vault parameter (falls back to the active vault when omitted or unknown). The Chrome clipper's ClipRequest gains vault_id and its popup UI gets a vault picker.
  • Gloss catalogue (PF-INDEX-GLOSS-1): a new nullable Page.summary column (migration), populated from each page's first paragraph at write time and rendered as an em-dash gloss next to every index.md entry, capped at 120 chars.
  • Deprecation warnings for 2.0.0's planned removals: a startup warning fires when ingest_pipeline_format is set to "json", and importing from the orchestrator compatibility facade or the app.main.* aliases now raises DeprecationWarning.

Changed

  • Review-create migrated onto the block loop (BE-DEBT-1): the single-page generation route now calls ingest.block_loop.run_block_loop instead of ingest.loop.run_orchestrated_loop.

Fixed

  • A real import-linter layering violation found during this release's own verification: the new MCP vault-parameter code picked up a transitive import of app.main through app.projects. Fixed with a clean extraction: the pure, read-only registry model moved into a new app/project_registry.py.
  • Two rounds of docs-gate drift caught before merge (ER diagram missing the new api_tokens table and pages.summary; OpenAPI missing the new MCP vault parameters).
  • A migration-number collision between this release's two independently-developed branches — resolved at merge time by renumbering the second-merged migration to 0037.

Upgrade

Run Alembic migrations 0036 (api_tokens table) and 0037 (pages.summary column). Both are additive. A one-time idempotent --dry-run-capable backfill script covers the summary column for pages written before this release.