Skip to content

submit_verified:true is a FALSE POSITIVE on boot — agent shows 0 tokens with the prompt still sitting in its composer #427

Description

@EtanHey

Two independent reproductions, two machines, same shape. This breaks the one receipt field that was verified as never-wrong in the #409 review.

Evidence A — M1 Pro, mimirClaude surfaces 4 and 5, both panes

spawn_agent returned:

"boot_prompt_receipt": {
  "delivered": true, "terminal": true, "typed": true,
  "submit_attempted": true, "submit_verified": true,
  "delivery": "submitted", "delivery_state": "submitted", "bytes": 369
}

The panes at that moment:

› Read and follow /Users/happycampr/Gits/mimir/docs.local/plans/…/S1-HYGIENE-BRIEF.md
  cmuxlayer mailbox contract for mimirClaude-e9f217f8: monitor with tail -n0 -F …
                                                                        0 tokens
  Fable 5 | $0.00 | 0m

Prompt still in the composer. 0 tokens. $0.00. 0m. The agent never processed anything. Both surfaces, independently.

Evidence B — this Mac, surface:1068, ~90 minutes earlier

Same: spawn_agent reported the boot prompt submitted; the pane showed › Res[Pasted Content 1038 chars] unsubmitted. Distinguishing detail captured there: an MCP server (computer-history) timed out after 30 seconds during boot, and the codex banner showed MCP startup incomplete.

Why this is worse than the earlier receipt bugs

submit_verified: true is the strong claim — it is supposed to mean the composer was observed to clear. The #404/#409 work made the weak fields honest and the #409 reviewer explicitly verified "a delivered:true receipt was never wrong — zero false positives on the strong claim, under every adversarial condition I could build." These are counter-examples, and they were not reachable by that reviewer's method because they require a slow real boot, not a constructed screen.

Consequence in practice: a lead spawns a worker, gets a fully-verified receipt, walks away — and the worker sits at 0 tokens forever with its entire brief unsent. That is the "spawned worker idle with its whole assignment unsent" failure we have hit repeatedly, now with a mechanism.

Likely mechanism

A boot-timing race: the submit verification window elapses while the CLI is still initialising (MCP servers connecting, banner rendering), so the check inspects a composer that is not yet in its post-submit state and reads that as success. It is not machine-specific — the M1 case had no MCP timeout in view, so slow boot alone appears sufficient.

The cheap discriminator we should be using

0 tokens is definitive. An agent that was handed a prompt and has consumed zero tokens did not receive it, whatever the receipt says. Token count is already parsed and displayed (read_screen returns token_count). Post-boot verification should require evidence of consumption — a nonzero token count or an observable turn start — not merely a composer that looks clear.

Suggested

  1. Boot-prompt verification must not accept a composer state observed before the CLI is ready; gate it on readiness, not on elapsed time.
  2. Require positive evidence of consumption (token_count > 0, or a parsed turn start) before emitting submit_verified: true for a boot prompt.
  3. Add a probe that spawns against a deliberately slow boot (stall an MCP server) and asserts the receipt does not claim verified while the prompt sits unsent. The existing tests cannot catch this — they do not boot a real slow CLI.

Related: #415 (spawn reports failure while creating a live agent — the mirror of this), #424 (prompt_text bloat, visible in the same receipt), skillcreator's defect #1 (3 occurrences reported 2026-08-13).

— cmuxlayerClaude (lead) · claude-code/claude-opus-5

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions