fix(881): the gate order I called load-bearing is a cost choice, measured
`verify_claim`'s docstring and the record's `mechanics` both said the relevance
gate must run LAST or the status and vacuity gates could never be witnessed
failing alone. Executed at ff65e5e7c: moving the `reset_sandbox` + reach
`verify_mutation` + `if not reach.ok:` block ahead of both earlier gates and
changing nothing else, then running `pytest scripts/tests/test_mutation_harness.py
-p no:randomly -k "GREEN_EXIT_STATUS or GREEN_VACUITY or GREEN_RELEVANCE or
UNKNOWN_outcome"` gives 4 passed. Two of those four assert the reasons the LATER
gates produce ("exited 1", "NOTHING PASSED"), so with the relevance gate first
both earlier gates were still read and still witnessed refusing alone. It cannot
hold, and the branch already said why one line away: the reach mutation injects a
failing test, so it reddens in every fixture except the relevance one, which is
what `_inert_claim_sandbox`'s own docstring states. What the order actually buys
is cost - the relevance gate is the only one of the three that costs a second run
of the proof - and that is what both sites now say. #881's own defect shape,
inside the record that establishes the rule against it.
Second, the record twice gave line-wrapping as the reason a sentence was
paraphrased rather than quoted. The branch's own first `CLAIMS` entry quotes a
sentence that spans a comment line break, embedding the `# ` continuation, and
the harness resolves it exactly once - so a wrapped sentence is quotable by this
very mechanism. The real reason at the calibration site is the replacement
itself: that sentence is not in the tree any more, measured 2026-09-05 by a
fixed-string search over `git ls-files`, which returns no file. At the second
site the referent (`docs/defect-shapes-773.md` section 4) is present and
quotable, so the causal clause is dropped and only the paraphrase marker stays.
refs #881
Decisions-Edit: yes
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015QqCpYFsKgnAnx6jVwrKiV
This commit is contained in:
File diff suppressed because one or more lines are too long
@@ -430,11 +430,13 @@ def verify_claim(sandbox: Path, claim: Claim) -> Verdict:
|
||||
disarmed on its own and seen to matter; a single clause covering all three would be a guard
|
||||
nothing can witness failing.
|
||||
|
||||
THE RELEVANCE GATE RUNS LAST, and the order is load-bearing rather than incidental. Run first, it
|
||||
would refuse before the status and vacuity gates were ever read, and neither could then be
|
||||
witnessed failing on its own — two gates that mask each other are worth one (#685). The sandbox is
|
||||
reset between the two runs because the first proof run can dirty the tree, and a second result
|
||||
that is a function of the first's is what `reset_sandbox` exists to prevent.
|
||||
THE RELEVANCE GATE RUNS LAST BECAUSE IT IS THE EXPENSIVE ONE, and that is the whole of what the
|
||||
order buys: it is the only one of the three that costs a second full run of the proof — under the
|
||||
reach mutation, with a sandbox reset in between — so an entry the status or the vacuity gate has
|
||||
already refused never pays for it. What keeps the three worth three is that each carries its own
|
||||
disarm proof, not the sequence they are written in. The sandbox is reset between the two runs
|
||||
because the first proof run can dirty the tree, and a second result that is a function of the
|
||||
first's is what `reset_sandbox` exists to prevent.
|
||||
"""
|
||||
if claim.outcome == Claim.RED:
|
||||
return verify_mutation(
|
||||
|
||||
Reference in New Issue
Block a user