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.