Twinned from https://github.com/cfsh/ninefold/issues/542 by tools/beads/import_github.py's reconcile pass.
Filed unclaimed and unlabelled from ninefold-a at the close of design-001 pieces 6–11. Backlog, for a future triage round.
Sibling to #481 and deliberately separate. #481 is about replies to the reviewer — what we say we did. This is about the durable text itself: CLAUDE.md, design docs, and code comments, which are read long after the reply is forgotten and are the only thing a cold-start session has.
presubmit.py gates three lanes — dotnet, python, shellcheck — and every one of them gates code. Nothing anywhere checks a factual claim in prose. A sentence asserting something false about the repo compiles, passes, merges, and then becomes what the next session believes.
Measured on one PR (#532, a *docs* PR), across five reviewer rounds:
| finding | the claim | reality |
|---|---|---|
| F1 | "trivial launchers … carry set -Eeuo pipefail and an ERR trap" | zero of three did |
| F2 | "mergeable in any order" | true of conflicts, false of content |
| F6 | "Docs only — no code, no probes, no behaviour" | three shell scripts and a behaviour change |
| F7 | launcher line counts (8) (16) (34) | 9 / 25 / 35 — *the same PR's later commits moved them* |
| F9 | "§4:365 already contains the counter-argument" | head 365 is an unrelated paragraph; the amendment shifted the body +68 lines |
Six of the eight findings on that PR were prose asserting something unmeasured. The code in it was fine throughout.
It is not isolated to one PR. Two more from the same chunk, both retracted in place:
f5.sh justified keeping a path because *"the editor's external-tool binding calls it"*. No such binding exists — nothing outside two .md files references the path (#509 F5).release.sh cited *"tools/release/README.md"* as naming the path. That file has never existed (#522 F5).ninefold-reviewer, none by a gate and none by me. A PR merged without a review round keeps all of them.Ordered by cost. None is obviously right, which is why this is filed rather than built.
wc -l; §N:LINE self-citations in a design doc must land on the section named. Would have caught F5 (#509), F5 (#522), F7 and F9 outright — four of eight — and it is a small script over git ls-files.< 50 instead. A short "don't write claims that rot" convention would have prevented F7 and F9 by construction rather than catching them.rev:off PR or a merge-on-approval-without-a-round keeps every one — and prose defects are exactly the kind a human approver skims past, because they read as summary rather than as change.I wrote all eight. The common factor is not carelessness about facts — it is that I write the summary from what I intended and the code from what I checked. The summary is then the artefact with the longest half-life and the least verification. That asymmetry is the thing worth fixing, and it is structural rather than personal: any author writing prose about their own change has already decided what it says.
Same shape as #389 — the UI gate existed, nothing ran it, and main rotted unnoticed. Here the standard exists (CLAUDE.md is held to "real industry standards" by its own first paragraph); nothing checks it.
Related: #481 (reply claims), #450 (nothing verifies the verifier), #484 (prose-to-code ratio), #539 (diff before pushing — the code-side sibling).
None.
No comments.