Repository navigation
fix(settings): grant create_session, the fan-out primitive the fleet procedure requires - #454
Conversation
CLOUD-178 claude.ai connector tools flip between readable and UUID names, silently breaking the permission allowlist
Split out of CLOUD-177, which is Done on its own scope. Evidence thread: the comments on CLOUD-177, in particular the final correction establishing verdict (a). ReadyA claude.ai connector MCP server is exposed to a session under two different names over its lifetime, and a permission allow rule can only name one of them. At session start the Linear connector appears as This hits the board-in-lockstep rule directly: moving a Measured, across two containers
Verdict: the UUID is stable and equal across containers. It is a durable identity for the connector; what varies is which of the two names is live at a given moment. This was initially mis-called as "unstable per boot" from a session that had not yet reconnected — absence of a reconnect is not evidence of naming stability, and any future measurement here needs to span at least one reconnect to say anything. Confirmed load-bearing, not cosmetic: a Note this is a second, independent defect from the one that originally masked it: an org-level Ready predicateA session survives a connector reconnect with Linear calls still auto-approved — no prompt on a Done (proposed)
"mcp__Linear",
"mcp__4db58e41-cd4e-4818-8922-46cf616593f4"
Open questions
Why the repo cannot fix this itselfIn Claude Code on the web, connectors are "provisioned by the remote host and arrive as explicit Generated by Claude Code |
…t procedure requires `.claude/settings.json` allowed `get_session` and `list_sessions` but never `create_session`, so `/plan-fleet` and `mem:workflow/agent-fanout` — both built on it — required a tool the allowlist did not grant. Every dispatch prompted. Measured 2026-08-14: five consecutive `create_session` calls returned `MCP tool call requires approval` while the user reported approving each one. Two independent causes, both necessary; this commit fixes the second. The first is CLOUD-178's name flip: the connector attached as `mcp__<uuid>__*`, so no rule here matched any tool the session exposed. That half cannot be fixed in a tracked file — the UUID is account-specific (rule 1) — and CLOUD-191 is its durable answer. Detail and the measurement series are on CLOUD-178. `set_session_title`/`set_session_tags` come along because a dispatcher that can create a session but not label it cannot keep the board legible. The trigger denies are untouched: AGENTS.md's ban on heartbeats stands. Refs: CLOUD-178
c9ec8fb to
121de48
Compare
|
|
/fast-forward |



.claude/settings.jsonallowedget_sessionandlist_sessionsbut nevercreate_session, so/plan-fleetandmem:workflow/agent-fanout— both built on it — required a tool the allowlist did not grant. Every dispatch prompted.Measured 2026-08-14. Five consecutive
create_sessioncalls returnedMCP tool call requires approvalwhile the operator reported approving each one. Two independent causes, both necessary; this PR fixes the second:mcp__<uuid>__*, so no rule in this file matched any tool the session exposed. That half cannot be fixed in a tracked file — the UUID is account-specific (non-negotiable rule 1) — and CLOUD-191 is its durable answer.create_sessionwas never allowlisted under any name. Independent of the flip, and what this PR closes.set_session_title/set_session_tagscome along because a dispatcher that can create a session but cannot label it cannot keep the board legible.The trigger denies are untouched. AGENTS.md's ban on heartbeats stands. Worth stating because
mem:connector-allowlist-recovery's recovery step 2 recommends allowing the baremcp__<uuid>__*prefix, and doing that would silently un-denysend_laterandcreate_trigger— the deny rules name the readable alias and match nothing under the UUID form. A user-level grant must mirror the denies; that correction is recorded on CLOUD-178.Verification.
mise run mcp-allow-checkpasses: every allow rule names a tool it can match, and every enabled server has a grant. Note the gate cannot catch cause 1 —mem:connector-allowlist-recoveryrecords that it "passed throughout the session where writes were denied, because it was checking a name nothing was using." Only the injected config can answer which name is live.DO-NOT-CLOSE — CLOUD-178 stays open for the name flip, which this does not address.
Refs: CLOUD-178