fix(881): the docstring quoted an outcome the branch had already narrowed

The `Claim` docstring motivated the GREEN direction by enumerating three corpus
sites and restating what each asserts. The middle restatement said
`scripts/check-doc-narrative.py` "says removing its `/dev/null` arm reddens no
test" — the universal a9341d841 removed from that file when it narrowed the
comment to the scope the harness actually executes
("`test_check_doc_narrative.py` stays green with this arm removed"). The
docstring was written before that narrowing and kept re-asserting the wider
claim, attributed to a file that no longer makes it: `git grep -F "reddens no
test"` returned exactly one hit, the line asserting it. That is #881's own
defect #2 reproduced inside the fix.

Restating an outcome is what makes it drift, so the enumeration now names the
three sites and the mutation each describes, states the shape they share, and
says why the outcome wording is not repeated. The only two copies of that
outcome left in the tree are the site comment and the `CLAIMS` quote bound to
it, which is the binding by construction. Both other members were re-checked
today and hold: `.gitea/workflows/review-verdict.yml:2411` and
`scripts/tests/hook_fire_isolation.py:82`.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015QqCpYFsKgnAnx6jVwrKiV
This commit is contained in:
2026-09-05 06:25:54 +02:00
co-authored by Claude Fable 5.1
parent b1c4cdb6d7
commit ff65e5e7c9
+11 -9
View File
@@ -124,15 +124,17 @@ class Claim:
`outcome` is `RED` or `GREEN`, and the GREEN direction is why this is not just another `Mutation`.
A `MUTATION` row always claims a red, so the harness only ever had to recognise one. Prose does
not, and the corpus carries the other direction too: `.gitea/workflows/review-verdict.yml` says of
one arm that disarming it alone reddens nothing, `scripts/check-doc-narrative.py` says removing
its `/dev/null` arm reddens no test, and `scripts/tests/hook_fire_isolation.py` says deleting a
dead branch left that branch's own test green. Each is a claim that a mutation is NOT noticed,
and the rule "declare it or do not write it" is unsatisfiable for them unless the harness can
execute a negative. A GREEN entry therefore carries NO `expect`: there is no failing run to read a
diagnostic out of, and the three things that could make a green vacuous — a run that errored, a
run in which nothing passed, and a proof that never reaches the mutated clause at all — are
checked in `verify_claim` instead.
not, and the corpus carries the other direction too: `.gitea/workflows/review-verdict.yml`,
`scripts/check-doc-narrative.py` and `scripts/tests/hook_fire_isolation.py` each name a mutation —
an arm disarmed on its own, an arm removed, a dead branch deleted — and assert that nothing
notices it. How each of those sentences words its outcome is deliberately not repeated here: a
restatement is a second copy of an outcome, free to drift from the site while the entry that
executes it stays green, which is the drift a `Claim` exists to close. What they share is the
shape — a claim that a mutation is NOT noticed — and for that shape the rule "declare it or do
not write it" is unsatisfiable unless the harness can execute a negative. A GREEN entry therefore
carries NO `expect`: there is no failing run to read a diagnostic out of, and the three things
that could make a green vacuous — a run that errored, a run in which nothing passed, and a proof
that never reaches the mutated clause at all — are checked in `verify_claim` instead.
THE THIRD OF THOSE IS WHAT MAKES A GREEN READABLE, and it needs its own declaration. A red is
self-checking: a proof that ignores the mutated file stays green and `verify_mutation` refuses it,