Releases: RMANOV/sqlite-memory-mcp
Release list
v3.12.7 - The Recurring Task Learns to Surface
Recurring task copies now spawn into the active board where you can actually see them, and the tool surface holds firm against OpenAI-compatible clients. This release pairs two user-facing fixes (recurring visibility, FastMCP schema compat) with a corrupt-preview self-repair on the bridge and two new drift guards.
Highlights
- Recurring copies land in a visible active section.
build_new_tasknow picks each spawned copy's section by due date via the newactive_section_for_duehelper —todayfor a due-today copy,nextotherwise — instead of inheriting the source template's section. Generated recurrences no longer vanish into a hidden/template lane (recurring_tasks.py;tests/test_recurring_tasks.py). - FastMCP tool schemas stay OpenAI-client compatible. New
_patch_missing_parameter_propertiesinfastmcp_compat.pyre-derives any parameter FastMCP (~2.1) drops fromparameters.propertieswhile still listing it inrequired— notably atitleparam. Without this, OpenAI-compatible clients reject the entire tool list before the model can run. Conservative per-parameter schema inference; FastMCP-generated schemas otherwise left untouched. Regression test added. - Corrupt
kanban_payload.jsonself-repairs on pull.db_utils.ensure_kanban_payload_parseable()is a parse-or-regenerate guard wired intobridge_pulland the workerpull_onlypath (the only pull path with no export behind it). Valid file → untouched; missing → no-op; corrupt → regenerated from the freshly loaded transport payload. Never raises, never blocks sync, never deletes, transport never touched. A fresh-DB restore recovers the full 540,408-char description even when a truncated preview sits in the bridge dir (completes SPEC e401c69d). - OpenAI-compat schema regression now covers all 8 public servers. The former task_server-only check is parametrized over server/session/task/bridge/collab/entity/intel/unified: top-level
type=object, no top-leveloneOf/anyOf/allOf/enum/not, and everyrequiredname present inproperties(tests/test_server_imports.py). - Surface-contract snapshot guard (D0). Snapshots console scripts, per-server live
mcp.list_tools()tool names, and claim-sensitive file presence intotests/fixtures/surface_contract_snapshot.json, failing on any drift with a precise add/remove/rename diff. Deterministic, network-free regeneration viatests/test_surface_contract_guard.py --regenerate. - Chore:
.claude/(local Claude worktrees/config) added to.gitignore.
Notes
No migrations or breaking API changes — fixes plus new test/drift guards on the 3.x line. Full suite reported 1086 passing at merge.
v3.12.6 - The Tray Learns to Project Its Debate
A documentation-and-housekeeping release: the debate protocol learns to describe the Task Tray as a bounded projection surface rather than a raw transcript, while CI and the lazy-enrichment tests are tuned to age gracefully. No runtime or library code changed.
Highlights
- Docs — Task Tray operator dashboard defined (
docs/DEBATE_PROTOCOL.md, +91 lines). A new section establishes the Task Tray window as a human/CONDUCTORcontrol surface over projections of the debate, not a replay ofdebate_messages. The immutable raw log stays the ledger; the tray presents bounded, drill-back-capable views to turn read cost fromO(everything × agents)intoO(changes × interested actor).- Specifies the required projections:
HUMAN_BRIEF,CONDUCTOR_INBOX,LANE_STATE,ADVOCATE_QUEUE,EXECUTOR_QUEUE,STALE_OR_OVERCOORDINATION, andSYNC_HEALTH. - Requires every projection row to carry provenance (
raw_event_ids/payload_ref/artifact_ref) so drill-back stays possible and summaries don't become a new stale-read source. - Codifies backpressure exemptions (high severity, operator/
CONDUCTOR-addressed,decision_needed, failing sync, security/legal/reputation flags, user overrides) and theCONDUCTORstop reasons (STOP_PASS,STOP_STANDBY,STOP_HANDOFF,STOP_BLOCKED,STOP_COST,STOP_USER_DECISION). Reaffirms thatSTOP_SYNC_PROTECTIONis not valid — bridge sync must never halt over a dirty generated/render-only artifact.
- Specifies the required projections:
- CI — actions bumped to Node 24-ready majors (
.github/workflows/ci.yml).actions/checkoutv4 → v6 andactions/setup-pythonv5 → v6. - Tests — stale-entity dates made relative (
tests/test_lazy_enrichment.py).TestStaleEntitiesnow derivesupdated_atfromdatetime.now(UTC) - timedelta(days=...)instead of hard-coded 2025/2026 timestamps, so the staleness assertions don't rot as the calendar advances.
Notes
- Documentation, CI, and test-only changes — no behavioral or schema changes and no migration required.
v3.12.5 - The Bridge Recognizes Its Own Handwriting
A small but important follow-up to v3.12.4: the bridge now recognizes the kanban_payload.json it generates as its own artifact, so the sync gate stops mistaking it for a user edit and freezing the mirror. Ships with one documentation-honesty pass.
Highlights
- Bridge sync no longer blocks on
kanban_payload.json. v3.12.4 wired the render-onlykanban_payload.jsonartifact intosurface_contractand the merge driver, but misseddb_utils.is_generated_bridge_path()and thegenerated_pathsrestore list. Because the export regenerates the file every run and leaves it uncommitted, the pre-sync readiness check (_path_allowed_dirty) treated it as a user-managed edit and failed closed with "commit or stash bridge repo edits before sync: kanban_payload.json" — silently freezing the mirror and any downstream restore that depends on it. - The file is now treated as a regenerable generated artifact: allowed-dirty through the readiness gate and restorable from DB state alongside
shared.json/index.json. This restores the v3.12.4 "sync stays ON" guarantee. - Regression test added (
test_kanban_payload_is_recognized_as_generated_bridge_path). - README honesty pass (docs-only). Dropped the unsourced "proven 2000+ tasks across 3 machines" bridge claim in favor of stating conflict/recovery discipline without an absolute data-loss guarantee; renamed the "Premium / enterprise boundary" section to "Optional private-runtime boundary" and removed anti-fork / moat / airlock marketing framing while keeping the factual contract description.
Notes
- Version bumped to
3.12.5(__init__.py,pyproject.toml). No schema or API changes; the bridge fix and docs edit require no migration.
v3.12.4 - The Bridge Learns to Mirror Lightly
The bridge now exports a slimmed-down companion mirror so the Kanban PWA can render without choking on giant notes, while the transport copy stays complete and lossless.
Highlights
- New render-only
kanban_payload.jsonartifact. The Kanban PWA had been loading the fullshared.json(~18 MB, with single task notes up to ~540 KB), which hung the browser render. Exports now also emit a separate, lighter mirror sized for the UI. - Description truncation tuned for rendering. In the payload mirror, non-active notes (done/archived/someday) collapse broadly, active notes over 20 KB truncate, and small active notes pass through full. Each truncated copy carries
_mirror_preview,_full_len, and_full_hash(sha256) so consumers can detect and recover the elided body. - Generated on both export paths. The artifact is produced in both
bridge_sync_workerandbridge_server.bridge_pushbefore git staging, keeping the two sync routes in lockstep. - Transport stays full and authoritative.
shared.json,index.json, andtasks/*.jsonkeep complete bodies, so a fresh pull/restore recovers full descriptions. The new file is wired intosurface_contractaspull=False(never an import source) withmerge=union+ self-heal, so a corrupt union-merged copy is rebuilt from the DB on the next export, and write failures are non-fatal to push. - Regression coverage. Adds
tests/test_kanban_payload.pyand expandstests/test_bridge_server.pyto lock in the truncation rules and contract behavior.
Notes
- This change covers the export/artifact-generation side only. The Kanban PWA consumer repoint (actually reading
kanban_payload.json) is deferred to a later release becausepwa/app.jsis read-write and a naive preview-read could write truncated bodies back to the transportshared.json. - Version bump only in
__init__.py/pyproject.toml; no migration required.
v3.12.3 - The Conductor Curates the Day
This release gives the conductor a curated, day-scoped dashboard surface across CLI and tray, and hardens cross-machine bridge sync with a tombstone-safe git merge driver that refuses to resurrect deleted tasks.
Highlights
- Daily dashboard v1. New, intentionally non-bridge-synced
daily_dashboardtable + DAO with day-scoped reads and item caps (8/40), guarded by a hard conductor write-guard (cooperative session-binding, not identity-proof). Addsbin/taskverbsdash-set/dash-rm/dash/fband a new Dashboard tab in the task tray (with an Other / debate-work-items group). Covered bytests/test_daily_dashboard.py. - Tombstone-safe bridge merge driver. New
bridge_merge_driver.pyregisters a git merge driver forshared.json/index.jsonthat does tombstone-union (never resurrects a deleted/archived task), ranks via_dominating_status_clock, fails closed on ambiguity, and guarantees a merged tombstone strictly out-ranks both inputs. Extensive coverage intests/test_bridge_merge_driver.py. - Managed
.gitattributesreadiness gate fix. The merge driver's managed.gitattributesblock is now recognized via a content-verified, path-pinnedis_managed_gitattributes(), so first-time runtime seeding no longer trips the bridge dirty-gate ("commit or stash bridge repo edits before sync"). Staging detection switched fromgit diff --quiettogit status --porcelainso the untracked file in a fresh repo is actually staged, and the readiness preflight deliberately makes no commit (avoids converting a fast-forwardable peer push into a stuck divergence). - Tray full-window launch restored (the tag tip). The tray once again opens the full window when the dashboard is empty.
- Docs / claim-control hygiene. New
docs/ops/CORE_VS_ADVANCED_PATH.md; D1 (NATO DIANA) docs cleanup that removes STRIX-specific "simulator-first" framing wrongly imported into sqlite_memory's posture and restates it as application-enforced append-only governance, local-first, single-operator, test-backed; dashboard write-guard documented as cooperative session-binding rather than identity-proof.
Notes
- The
daily_dashboardtable is not bridge-synced by design — it is local, ephemeral, and day-scoped. - The merge driver is active via local git config the moment it is installed; the managed
.gitattributesrides the worker's next commit. A transient, recoverable edge exists if two peers concurrently seed differently-contented managed.gitattributesbefore either pulls (identical content — the common case — fast-forwards cleanly; not data-loss, not resurrection). - Full test suite reported at 1042 passing at the bridge merge integration.
v3.12.2 - The Bridge Insists on the Full Marker
A small, surgical patch that teaches the bridge sync worker to distinguish a genuine archived-duplicate redirect from an ordinary note that merely mentions deduplication. The redirect detector now demands explicit markers instead of trusting a lone keyword.
Highlights
- Tighter archived duplicate redirect detection.
is_archived_duplicate_redirect_task()indb_utils.pynow requires the explicitARCHIVED DUPLICATEmarker (no longer matching a bareDUPLICATEanywhere in the text), combined withDO NOT USEorSUPERSEDED. The looseCANONICALredirect signal was dropped. - Fewer false positives at the bridge shrink guard. Ordinary archived notes that simply talk about deduplication or canonicalization no longer get misclassified as redirect tasks and slip past the bridge shrink guards.
- Regression coverage added. 107 new lines in
tests/test_bridge_sync_worker.pypin down the stricter marker requirements.
Notes
- Patch release: version bumped to
3.12.2in__init__.pyandpyproject.toml. No schema, API, or migration changes — drop-in upgrade from v3.12.1.
v3.12.1 - The Bridge Lets the Redirect Stand
A focused one-commit patch: bridge sync now recognizes archived "duplicate redirect" tasks as intentional canonical pointers, so its content-shrink guards stop resurrecting stale full task bodies over a short DO NOT USE stub.
Highlights
- New
is_archived_duplicate_redirect_task()helper (db_utils.py): flags anarchivedtask whose title/description/notes carry both a duplicate marker (ARCHIVED DUPLICATE/DUPLICATE) and a redirect marker (DO NOT USE/SUPERSEDED/CANONICAL). Accepts either dict or sqlite3.Row. - Sync safety + auto-heal skip these stubs (
bridge_sync_worker.py):_check_sync_safetyand_auto_heal_sync_safetynow short-circuit on archived duplicate redirects so the anti-shrink heuristic no longer treats the short redirect body as a suspicious content loss. The safety lookup now also selectstitleandstatusto make the check. - Export respects the stub (
db_utils.export_task_files): the "restore meaningful content / revert suspicious shrink" path is bypassed for archived duplicate redirects, so exports keep the short stub instead of overwriting it with the previously-exported full body. - Regression test added:
test_auto_heal_sync_safety_preserves_archived_duplicate_redirect.
Notes
- Patch release, single commit; version bumped
3.12.0→3.12.1(__init__.py,pyproject.toml). Behavior-only fix to bridge sync content guards — no schema or migration changes, no action required. The diff also includes some cosmetic black line-wrap reflows inbridge_sync_worker.py/db_utils.py.
v3.12.0
Flexible debate roles (debate_add_role) · push-aware tombstone retention (tray sync) · n8n connector (loopback, deny-by-default 14-tool allowlist, bearer fail-closed) · Obsidian governed one-way markdown publication · vehicle fail-closed router (analysis|review|implementation) · README positioning rewrite — "Governed cross-agent memory for coding agents". 1012 tests green.
v3.11.19 - The Tray Learns to Watch Its Memory
Task tray memory guard hardening.
Changes
ef5ac3dHarden task tray memory guard
Verification
- Backfilled from existing pushed tag
v3.11.19. - Notes-only release; no assets uploaded, matching the v3.11.0-v3.11.9 release pattern.
- Tag range:
v3.11.18..v3.11.19. - Diffstat: 2 files changed, 347 insertions(+), 54 deletions(-)
v3.11.18 - The Bridge Learns to Recover Cleanly
Bridge sync recovery hardening.
Changes
1fb0ecbHarden bridge sync recovery
Verification
- Backfilled from existing pushed tag
v3.11.18. - Notes-only release; no assets uploaded, matching the v3.11.0-v3.11.9 release pattern.
- Tag range:
v3.11.17..v3.11.18. - Diffstat: 6 files changed, 367 insertions(+), 42 deletions(-)