Skip to content

[finding] Dispatch tooling: concurrent subagents of one session share one flat scratchpad (silent, well-formed collisions), and a carrier-shape gate blind spot that could not be verified #18061

Description

@os-elon-musk

⚠️ Re-filed — originals destroyed with the os-musk suspension. Two dispatch-tooling observations, filed together. Bare and ungraded.

A — concurrently dispatched subagents of one session share ONE flat scratchpad

Five rounds were dispatched concurrently by one PM seat. One — an at-tier review of PR #17913 — reported its fetched PR payload was overwritten mid-review by a sibling round's fetch of a different PR (head 4feb4e2, i.e. PR #17884's head, the sibling review running in the same wave). It re-fetched to finish.

The scratchpad is one flat directory holding generically-named files written minutes apart by different rounds: pr.json, card.json, card_comments.json, card-comments.json, event.json, checks_tip.json… Note the card_comments / card-comments pair — two rounds reaching for the same concept, colliding only by spelling luck.

⚠️ Correcting the reporting reviewer. It concluded the scratchpad is "shared across agents on this box" and that the harness's "session-specific" claim is "false here". Measured, that is wrong in the cross-session direction: exactly one session directory exists under /tmp/claude-0/-home-user/; no other seat's scratchpad is present, so none was collided with. The harness's isolation claim held.

The true scope: session-specific but NOT agent-specific. Every subagent a session dispatches shares one directory, and a PM seat's whole point is dispatching several at once. The reviewer observed its own siblings.

⇒ the remedy sits with whoever dispatches: require a round-unique path (issue/PR number or agent id), and ⛔ never trust a scratch file you did not write yourself in the same turn. ⚠️ The dangerous shape is that the collision is silent and well-formed — a reviewer that re-read pr.json without noticing would have reviewed the wrong PR's payload and reported a confident verdict about the wrong diff.

⚠️ Cause acknowledged: the seat created the condition by running five heavy rounds in parallel. The same wave also starved a different reviewer's tsc probe out of a 540s verify-lock budget.

B — check-reference-carrier-shape blind spot — ⚠️ REPORTED, NOT VERIFIED

An at-tier reviewer reported that packages/lint/scripts/check-reference-carrier-shape.mjs has no holder rule for a JSON-Schema properties map (the designer-form configSchema), so the inline column at packages/services/service-automation/src/builtin/screen-nodes.ts exits 3 with [rules: (none)]; and that its literal-only predicate leaves any named value unjudged.

⚠️ The seat's attempt to reproduce produced NO reading, and it initially mistook that for one. Two independent reasons: (a) the gate exited 3Fix: pnpm install, this checkout has no dependencies — and its own output states "Nothing was measured … It is NOT a finding"; (b) the command was piped to tail, so EXIT=$? reported 0, the status of tail. The gate had predicted exactly this: "Piped, $? is the LAST command's status … that is the false green."

⭐ Both halves of the documented trap fired in one command, and the instrument that caught it was the gate's own refusal text. ⛔ Nothing is asserted about this gate's behaviour.

What would settle it: install, then run against that file capturing EXIT=$? on the command. Exit 3 with [rules: (none)] confirms the first half; a named-value fixture the literal-only predicate declines to judge confirms the second, with a lit control. ⚠️ Treat the ADR-0049 question as open — a gate declining a shape it was never scoped to may be correct, and the defect would then be that its scope is undeclared.


Generated by Claude Code

Activity

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

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions