Claude Code First, specification version 0.1.0. The plain-language guide
Version 0.1.0. Grade R3/S3.
F104 A task recorded as shipped was found not to hold, because the ledger records the shipping session's own claim
| Field | Value |
|---|---|
| Status | active |
| Topic | Planning, recording, and what the person decides |
| Grade | R3/S3 |
| Cases | Shio, winwright, freewilly |
| Contrary | none |
| Harness facts | none |
Claim
In three projects a ledger entry recorded as shipped was later found not to hold: the fix was half done, the claim rested on cases that had never run, or later work undid it without the entry changing.
Mechanism
The ledger entry is written by the session that did the work, at the moment it decides the work is done, and nothing in the planning files records whether anybody else ever tried it. Checks that exist hold the entry's form, not its truth. A later change that removes the shipped behaviour touches the code, not the ledger, so the entry stays. Shio's commit names the resulting mode: verification is a person asking the agent to look afterwards.
Observations
- Shio. "Six corrections shipped half of themselves" [shio@14acb91ce], the other half
each becoming a new task, and "three of those shipped the report and left the behaviour" [shio@14acb91ce]. The same commit names the verification mode, "with verification being a person asking an agent to look afterwards" [shio@14acb91ce]. The remedy, SH527, requires that "a defect closes with an assertion carrying its id (SH527)" [shio@821f18d74:agents.md#L223], computed by a test whose first run read itself as the evidence: "its own declaration made all forty entries read as" [shio@821f18d74:agents.md#L234-L235] asserted. Separately, "SH1016 shipped saying there is no React SDK." [shio@c952ebc33], which was false.
- winwright. WW88's ledger entry was corrected after shipping, because "The cases were written on a desk with no controller, so the two that need one had never run." [winwright@d2a9081]
The correction says "So the entry no longer says a claim runs everywhere" [winwright@d2a9081]. The project's done-when criteria are checked for presence and pairing, and "Nothing goes red when a" [winwright@861b82e:.claude/skills/roadmap-docs/SKILL.md#L151-L152] criterion is untrue.
- freewilly. DD118 shipped on 2026-08-14 [freewilly@956e91e] and its entry still reads
"The gate runs the vendored engine beside the action it floats on and prints both versions" [freewilly@c1c2eaf:docs/CHANGELOG.md#L202]. On 2026-08-19 a commit with no task id removed the lint workflow and the test that held DD118, "workflow as it is no longer needed" [freewilly@cd630d6]; the workflow restored later calls only the published action [freewilly@c1c2eaf:.github/workflows/roadkeep.yml#L13-L19]. The entry was true when written and is untrue at the pin.
- roadkeep. No incident is recorded. The tool filed a design for the gap on 2026-09-21,
arguing that a shipping session checking its own criterion "is not a person using the thing" [roadkeep@9ecfa187:docs/IMPROVEMENTS.md] and adding a question, "Whether a person tried what shipped (RK1692)" [roadkeep@91754240:roadkeep.toml#L335]. This is prose (S1) and does not count towards the grade.
Independence
Three origins, one per project, each a failure where it happened (rule 1). They are two mechanisms: an entry that overclaimed when written (Shio, winwright) and an entry that went stale after it (freewilly). The finding holds for both, and a rule citing it should say which it addresses.
Counter-evidence
No project measures how many shipped entries hold. Shio's six are a count of the cases found, not of all corrections shipped in that week, and the other observations are single entries. polyweave and roadkeep record no shipped entry found untrue, which may mean none was, or that none was looked for.
Grade
R3: independent occurrences in three projects. S3: Shio's commit counts six half-shipped corrections, three of which shipped the report without the behaviour. Not S4: Shio's assertion-debt test encodes part of the remedy, but the sources record its first run misreading itself rather than failing on an untrue entry.