Repository navigation
Description
Summary
With the current @bradygaster/squad-cli@1.1.0 state-MCP server and a two-layer backend, the documented canonical decision ledger key decisions/decisions.md cannot be initialized even when squad_state_read explicitly reports that the key is absent. This blocks the coordinator's required state handshake and stops all work.
Reproduction
- Configure
stateBackend: "two-layer". - Start the configured state-MCP server (
@bradygaster/squad-cli@1.1.0). - Confirm
squad_state_healthsucceeds. - Read
decisions/decisions.md; observeState key not found: decisions/decisions.md. - Attempt to initialize the absent key with
squad_state_create_if_absentorsquad_state_write, using the canonical empty-ledger seed documented by Squad's init procedure.
Actual behavior
Both mutation tools fail with:
State mutations are limited to mutable runtime state (decisions, inbox, casting policy, logs, sessions, scratch files, agent history, and identity). The casting registry/history pair must only be changed through the atomic casting protocol. Static config such as config.json, team.md, routing.md, charters, templates, and skills must not be changed with state tools.
The bridge is not wholly unavailable: health succeeds, squad_state_list(dir: "log") returns existing logs, and squad_state_list(dir: "decisions/inbox") returns existing inbox entries. The logical ledger key remains not found after the failed writes.
Expected behavior
Allow the exact documented mutable key decisions/decisions.md to be initialized and written through the state-MCP API, with successful read-back. Continue rejecting unrelated static paths and arbitrary keys. Add regression coverage for initial creation and normal subsequent decision-ledger updates under a two-layer backend.
This appears related to the state-MCP mutable-key allowlist issues #1876 and #2084, but those cover casting keys and built-in audit-trail keys rather than the canonical decision ledger.
Impact
A healthy state bridge that rejects initialization of a required mutable key leaves an established Squad unable to pass its startup/round-start gate. In this repository the overdue retro gate prevents Ralph's requested dependency-update work from beginning.
Activity
tamirdresher commentedon Nov 1, 2026
Thanks for the detailed report. The decision ledger key is
decisions.md, relative to the.squadstate root, in both 1.1.0 and 2.0.0-preview.3.decisions/decisions.mdis not a valid ledger key because thedecisionsdirectory is reserved for inbox entries. Please retry the read and the create or write calls withdecisions.md.You did find something real though. The repository root
.gitattributeshas a stale line that names.squad/decisions/decisions.md, next to the correct.squad/decisions.mdrule. That line is wrong and we are removing it. The init and upgrade templates, the state tool description and the mutable key allowlist all usedecisions.md, so this is a config and docs mismatch rather than another allowlist bug like #1876 or #2084. Thanks for catching it.Let me know if the retry with
decisions.mdunblocks you and I will close this once the cleanup PR lands.chore: remove stale .squad/decisions/decisions.md gitattributes rule (#…
tamirdresher commentedon Nov 1, 2026
Cleanup landed in #2380, the stale .gitattributes line is gone from dev. Leaving this open until you confirm that decisions.md works for you, then I will close it.