#2709 — reject undeclared tool arguments instead of silently dropping them. FastMCP's pydantic validation ignored extra fields, so create_note(content=...) reported success and stored an empty body — invisible to embedding/search. StrictArgsFastMCP now rejects any tool call carrying undeclared arguments before dispatch, with a did-you-mean hint, on every tool.
#2683 — evidence-carrying bootstrap ask for mature zero-Systems projects. A project with ≥20 records and no Systems gets a concrete, self-retiring ask (record count + recent titles → propose 3–6 Systems, confirm, create) at both the write moment (systems_hint escalation) and arrival (enter_project.systems_bootstrap). Young projects keep the mild question; the first create_system retires the ask everywhere.
Two fixes from the open-issue list:
- **#2709 — reject undeclared tool arguments instead of silently dropping them.** FastMCP's pydantic validation ignored extra fields, so `create_note(content=...)` reported success and stored an empty body — invisible to embedding/search. `StrictArgsFastMCP` now rejects any tool call carrying undeclared arguments before dispatch, with a did-you-mean hint, on every tool.
- **#2683 — evidence-carrying bootstrap ask for mature zero-Systems projects.** A project with ≥20 records and no Systems gets a concrete, self-retiring ask (record count + recent titles → propose 3–6 Systems, confirm, create) at both the write moment (`systems_hint` escalation) and arrival (`enter_project.systems_bootstrap`). Young projects keep the mild question; the first `create_system` retires the ask everywhere.
CI green on both commits (runs 3869, 3889).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
FastMCP validates tool arguments with a pydantic model whose extra-field
policy is 'ignore', so create_note(content=...) — a plausible near-miss
for body=, primed by add_task_log's content — ran successfully, stored
body: '', and left a record embedding/search cannot see. Two real notes
were persisted body-less before the pattern was noticed; create_task
only 'worked' because those calls happened to use the right name.
StrictArgsFastMCP rejects any tool call carrying arguments the tool does
not declare, before dispatch, with a did-you-mean hint when one is close
and the declared list when none is. Applied at the dispatch seam so
every tool gets the guarantee — an error the caller sees once beats data
half-written forever.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The generic zero-state systems_hint never converts: identical on every
record, maximal in scope, asked at wrap-up time — Minstrel reached 282
records with zero Systems while vocabularied projects grew organically.
What converts is the project's own evidence at the moment of action.
bootstrap_systems_ask (mcp/tools/systems.py) fires only in a project
with >=20 records and no Systems: it names the record count and recent
titles, and asks for a concrete deliverable — propose 3-6 Systems,
confirm with the operator, create_system the set. Self-retiring: the
first System ends it everywhere. Wired at both moments the task named:
untagged_systems_hint escalates to it at write time, and enter_project
carries it as systems_bootstrap at arrival (attached only when it
applies). Young projects keep the mild question; populated vocabularies
never pay the count query.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Two fixes from the open-issue list:
create_note(content=...)reported success and stored an empty body — invisible to embedding/search.StrictArgsFastMCPnow rejects any tool call carrying undeclared arguments before dispatch, with a did-you-mean hint, on every tool.systems_hintescalation) and arrival (enter_project.systems_bootstrap). Young projects keep the mild question; the firstcreate_systemretires the ask everywhere.CI green on both commits (runs 3869, 3889).
🤖 Generated with Claude Code