fix(falsify): two falsifications that proved nothing, and the budget the first finished night measured - #788
Merged
Conversation
…the first finished night measured
The suite has been red since it stopped being cancelled. It named two guards as
no longer biting, and **neither guard had stopped working**. Both verdicts came
from the falsification, not from the subject, and each failed in a different way.
**touch-attribution was non-deterministic.** `barrierPack`'s comment claims the
two handlers "hold each other in flight for the entire window in which they
touch the store". Its single barrier only synchronised them BEFORE the first
touch: a handler that finished its touches and returned left the flight before
the other touched anything, so the other attributed correctly even with the
goroutine check removed. Measured on 2026-09-21, the mutation went undetected in
three runs out of five. A second barrier now holds both requests in flight until
both have touched, which is what the sentence always claimed. Five runs out of
five bite.
**probe-side-zeros aimed at an axis the record can no longer contradict.** The
mutation declared `shape` client-borne, and the test looks for undriven
operations that earned it. The committed record holds 21 undriven operations and
**not one** carries a recorded answer, so there was no discrepancy to find. The
mutation now aims at `contract`, which has 21 witnesses.
The non-vacuity guard that should have caught this is global — one witnessed
axis satisfies it — so flipping a different axis passed underneath it. It now
also reports, per axis, which ones this record cannot contradict:
this record cannot contradict a declaration on 1 axis/axes, because no
undriven operation earns them: shape. A falsification aimed at one of
those proves nothing.
Logged rather than failed, on purpose: an axis no undriven operation earns is an
ordinary state of the record, not a defect, and failing on it would be a red
nobody can clear. What is not ordinary is nobody noticing.
**The budget moves to 210 minutes.** 30 cancelled this job for twenty-four
nights (#737); 150 came from a local projection of 97 minutes; the first night
that actually finished took **145** (04:30 to 06:55 on 2026-09-20), on a suite
that grew from 199 to 207 specs in the same week. Five minutes of margin turns
the next dozen specs into a cancelled night.
Both specs bite again, and `a-silent-night-is-refused` was retargeted at the new
budget rather than left pointing at a line that no longer exists — which
`falsify:lint` refused, correctly.
Assisted-by: Claude Code (claude-opus-5)
stephrobert
deleted the
fix/781-falsifications-that-depend-on-timing
branch
September 21, 2026 08:15
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
The suite has been red ever since #737 stopped it being cancelled — which is the mechanism working: it now finishes and says something. It named two guards as no longer biting, and neither guard had stopped working. Both verdicts came from the falsification rather than from the subject, each in a different way.
touch-attributionwas non-deterministicbarrierPack's comment claims the two handlers "hold each other in flight for the entire window in which they touch the store". Its single barrier only synchronised them before the first touch. A handler that finished its touches and returned left the flight before the other touched anything, so the other attributed correctly even with the goroutine check removed.A second barrier holds both requests in flight until both have touched — what the sentence always claimed, and what the guard actually has to survive.
probe-side-zerosaimed at an axis the record can no longer contradictThe mutation declared
shapeclient-borne, and the test looks for undriven operations that earned it. Measured on the committed record:contractprobedshapeThere was no discrepancy to find, so the mutation proved nothing. It now aims at
contract.The non-vacuity guard that should have caught this is global — one witnessed axis satisfies it — so flipping a different axis passed underneath it. It now also reports, per axis, what this record cannot judge:
Logged rather than failed, deliberately: an axis no undriven operation earns is an ordinary state of the record, not a defect, and failing on it would be a red nobody can clear. What is not ordinary is nobody noticing.
The budget moves to 210 minutes
Each raise is measured, not chosen:
Five minutes of margin, on a suite that grew from 199 to 207 specs in that same week, turns the next dozen specs into a cancelled night.
a-silent-night-is-refusedwas retargeted at the new budget rather than left pointing at a line that no longer exists — whichfalsify:lintrefused, correctly.Type of change
Checklist
Always
mise run checkpasses, andmise run prepushin full — includingfalsify:lint, which caught the stale fragment aboveinternal/corestill knows no provider — the change ininternal/core/emulatoris in a test, and adds a secondsync.WaitGroupto a stub packmise run testplanwas run.conformanceis not played: no route, no handler and no response shape changed. Two test files, one spec, one workflow budget. The falsifications themselves are the proof this change is about, and each was replayed five times.When a model wrote a substantive part of this
Assisted-by:trailer names the tool and the model versionmise run conformance, for the reason stated just aboveevidence_axes.goand the witness counts fromcoverage/evidence.json, both read directlyWhen a route is added or changed
N/A.
When behaviour a client can observe changes
N/A — nothing a client sees changes.
When
.github/workflows/is touchedstep-security/harden-runneris the job's first step — unchangedpermissions:least-privilege — unchangedtimeout-minutesmovesWhen a machine runtime is involved
N/A.
Related issues
Should close #781 once a night finishes green. The issue is a
scheduled-redone, so the first green night closes it automatically.🤖 Generated with Claude Code