Skip to content

Releases: RMANOV/sqlite-memory-mcp

v3.12.7 - The Recurring Task Learns to Surface

Choose a tag to compare

@RMANOV RMANOV released this 27 Jun 10:12

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_task now picks each spawned copy's section by due date via the new active_section_for_due helper — today for a due-today copy, next otherwise — 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_properties in fastmcp_compat.py re-derives any parameter FastMCP (~2.1) drops from parameters.properties while still listing it in required — notably a title param. 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.json self-repairs on pull. db_utils.ensure_kanban_payload_parseable() is a parse-or-regenerate guard wired into bridge_pull and the worker pull_only path (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-level oneOf/anyOf/allOf/enum/not, and every required name present in properties (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 into tests/fixtures/surface_contract_snapshot.json, failing on any drift with a precise add/remove/rename diff. Deterministic, network-free regeneration via tests/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

Choose a tag to compare

@RMANOV RMANOV released this 27 Jun 10:12

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/CONDUCTOR control surface over projections of the debate, not a replay of debate_messages. The immutable raw log stays the ledger; the tray presents bounded, drill-back-capable views to turn read cost from O(everything × agents) into O(changes × interested actor).
    • Specifies the required projections: HUMAN_BRIEF, CONDUCTOR_INBOX, LANE_STATE, ADVOCATE_QUEUE, EXECUTOR_QUEUE, STALE_OR_OVERCOORDINATION, and SYNC_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 the CONDUCTOR stop reasons (STOP_PASS, STOP_STANDBY, STOP_HANDOFF, STOP_BLOCKED, STOP_COST, STOP_USER_DECISION). Reaffirms that STOP_SYNC_PROTECTION is not valid — bridge sync must never halt over a dirty generated/render-only artifact.
  • CI — actions bumped to Node 24-ready majors (.github/workflows/ci.yml). actions/checkout v4 → v6 and actions/setup-python v5 → v6.
  • Tests — stale-entity dates made relative (tests/test_lazy_enrichment.py). TestStaleEntities now derives updated_at from datetime.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

Choose a tag to compare

@RMANOV RMANOV released this 27 Jun 10:12

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-only kanban_payload.json artifact into surface_contract and the merge driver, but missed db_utils.is_generated_bridge_path() and the generated_paths restore 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

Choose a tag to compare

@RMANOV RMANOV released this 27 Jun 10:12

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.json artifact. The Kanban PWA had been loading the full shared.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_worker and bridge_server.bridge_push before git staging, keeping the two sync routes in lockstep.
  • Transport stays full and authoritative. shared.json, index.json, and tasks/*.json keep complete bodies, so a fresh pull/restore recovers full descriptions. The new file is wired into surface_contract as pull=False (never an import source) with merge=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.py and expands tests/test_bridge_server.py to 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 because pwa/app.js is read-write and a naive preview-read could write truncated bodies back to the transport shared.json.
  • Version bump only in __init__.py / pyproject.toml; no migration required.

v3.12.3 - The Conductor Curates the Day

Choose a tag to compare

@RMANOV RMANOV released this 27 Jun 10:12

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_dashboard table + DAO with day-scoped reads and item caps (8/40), guarded by a hard conductor write-guard (cooperative session-binding, not identity-proof). Adds bin/task verbs dash-set / dash-rm / dash / fb and a new Dashboard tab in the task tray (with an Other / debate-work-items group). Covered by tests/test_daily_dashboard.py.
  • Tombstone-safe bridge merge driver. New bridge_merge_driver.py registers a git merge driver for shared.json / index.json that 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 in tests/test_bridge_merge_driver.py.
  • Managed .gitattributes readiness gate fix. The merge driver's managed .gitattributes block is now recognized via a content-verified, path-pinned is_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 from git diff --quiet to git status --porcelain so 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_dashboard table 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 .gitattributes rides the worker's next commit. A transient, recoverable edge exists if two peers concurrently seed differently-contented managed .gitattributes before 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

Choose a tag to compare

@RMANOV RMANOV released this 27 Jun 10:12

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() in db_utils.py now requires the explicit ARCHIVED DUPLICATE marker (no longer matching a bare DUPLICATE anywhere in the text), combined with DO NOT USE or SUPERSEDED. The loose CANONICAL redirect 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.py pin down the stricter marker requirements.

Notes

  • Patch release: version bumped to 3.12.2 in __init__.py and pyproject.toml. No schema, API, or migration changes — drop-in upgrade from v3.12.1.

v3.12.1 - The Bridge Lets the Redirect Stand

Choose a tag to compare

@RMANOV RMANOV released this 27 Jun 10:12

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 an archived task 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_safety and _auto_heal_sync_safety now 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 selects title and status to 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.03.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 in bridge_sync_worker.py / db_utils.py.

v3.12.0

Choose a tag to compare

@RMANOV RMANOV released this 01 Jun 15:46

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

Choose a tag to compare

@RMANOV RMANOV released this 27 May 04:24

Task tray memory guard hardening.

Changes

  • ef5ac3d Harden 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

Choose a tag to compare

@RMANOV RMANOV released this 27 May 04:24

Bridge sync recovery hardening.

Changes

  • 1fb0ecb Harden 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(-)