Skip to content

state-mcp rejects the documented decisions/decisions.md key #2378

Open

Description

@cyrusjamula

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

  1. Configure stateBackend: "two-layer".
  2. Start the configured state-MCP server (@bradygaster/squad-cli@1.1.0).
  3. Confirm squad_state_health succeeds.
  4. Read decisions/decisions.md; observe State key not found: decisions/decisions.md.
  5. Attempt to initialize the absent key with squad_state_create_if_absent or squad_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

  1. tamirdresher commented on Nov 1, 2026

    @tamirdresher
    Collaborator

    Thanks for the detailed report. The decision ledger key is decisions.md, relative to the .squad state root, in both 1.1.0 and 2.0.0-preview.3. decisions/decisions.md is not a valid ledger key because the decisions directory is reserved for inbox entries. Please retry the read and the create or write calls with decisions.md.

    You did find something real though. The repository root .gitattributes has a stale line that names .squad/decisions/decisions.md, next to the correct .squad/decisions.md rule. That line is wrong and we are removing it. The init and upgrade templates, the state tool description and the mutable key allowlist all use decisions.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.md unblocks you and I will close this once the cleanup PR lands.

  2. tamirdresher commented on Nov 1, 2026

    @tamirdresher
    Collaborator

    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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    wave1:P1Wave 1 PR group P1wave:1-nextWave 1 — immediate next sprint

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions