Repository navigation
required-regen: discriminating REDs for the drift arms, which had none - #8603
Merged
Merged
Conversation
The admission wall's population arms (zero planned, zero executed,
planned/executed mismatch) each had a control. Its DRIFT arms did not:
GeneratedDrift and HandUnverifiableRefused -- the two refusals that exist
precisely to catch a committed surface disagreeing with the emitter -- were
untested, so nothing established that they fire.
Adds four controls:
- a SurfaceDrifted row refuses AND names the drifted path, asserting a
matching sibling ABSENT from the named set, so the refusal is
attributable rather than merely present
- an EmittedNotCommitted/CommittedNotEmitted pair refuses naming both
- a HandUnverifiable row refuses naming both filename and reason
- the near-miss positive control: HandDrifted ALONE still ADMITS, since
hand-maintained drift is expected on a clean tree
The admitting case is what gives the refusing cases meaning: a wall that
refused everything drift-shaped would satisfy all three REDs identically.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DY4WxMYnZKvxCpWTTwjaDy
4 tasks
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.
Owned by session
stern-tern-636(opened from a non-session branch).The headline: the existing control establishes nothing
The required-regen admission wall (
v2.workflow.required_regenrequired_regen_sync_admission) already had a witness over its drift arms' neighbourhood. Mutating the wall and observing that witness:truetruesurface_is_drift:SurfaceDrifted => falsetruefalsehand_is_unverifiable:HandUnverifiable => falsetruefalseHandDriftedmade to over-refuse (predicate and collector)truefalseThe pre-existing witness returns
trueunder every mutation, including one that disables the entireSurfaceDriftedrefusal arm outright. That is not a weak control; it is a control that establishes nothing, and it sat in the tree looking like coverage. This PR's witness goesfalseon three.Measured, not inferred: executed with a
gunbcbuilt from main's own stage0 (c4642e0a8ae), against main's corpus.Summary
The wall had discriminating REDs for its population arms only — zero planned, zero executed, planned/executed mismatch, plus one matching positive control. Its drift arms had none.
GeneratedDriftandHandUnverifiableRefusedare the two refusals that exist precisely to catch a committed surface disagreeing with the emitter. Nothing established that they fire. This PR adds four controls so they do.Claiming exactly what this establishes and no more: the drift arms now have discriminating REDs and a positive control, where before they had none. This does not claim the wall would have caught any particular historical staleness — the wall's subject may not even cover the deferred-regen case, and that has not been shown.
The four controls
witness_drifted_surface_refuses_naming_the_path— aSurfaceDriftedrow refuses and the refusal names the drifted path, while a matching sibling is asserted absent from the named set. That second half turns "refused" into "refused for the right reason", which is the difference between a control and a smoke test.witness_surface_population_asymmetry_refuses— anEmittedNotCommitted/CommittedNotEmittedpair refuses with both paths named.witness_hand_unverifiable_refuses_naming_the_entry— aHandUnverifiablerow refuses naming both filename and reason.witness_hand_drift_alone_admits— the near-miss positive control.HandDriftedis one variant away fromHandUnverifiableand must not refuse, since hand-maintained drift is expected on a clean tree. Without it the three REDs would prove only that the wall refuses something drift-shaped; they would not establish which distinction it draws.One mutation reported as not discriminating
Flipping
hand_is_unverifiable'sHandDriftedarm alone is an equivalent mutant rather than a miss:collect_hand_unverifiable'sHandDriftedarm returns the accumulator unchanged and neutralizes it. Both halves must be mutated together for the over-refusal to exist at all.Noted rather than swept up: the variant classification is expressed twice across that predicate/collector pair, which is why a one-sided mutation cannot be seen — a §3 duplication whose consequence is an unobservable arm. Not changed here; it is not this PR's subject.
Execution on CI
These execute on CI as things stand. CI builds main's committed stage0 mirror, which resolves main's corpus — that is the binary this receipt used. They stop executing on the day the mirror is repaired, at which point corpus resolve currently fails for an unrelated reason: 46 reported / 72 constructed
expected 'Product(NonEmptyStr)', got 'Primitive(String)'errors, latent in main today, invisible to main's mirror, reproduced on a clean main worktree under a non-stale binary.That population has since been located and counted — one class, dominated by 51 sites in
src/v2/std/node.dagpassing bare symbol literals intocontent_hash_atom(value: NonEmptyStr), with no coercion path fromStringinto the refinement at the call boundary. It is routed as its own lane and is not this PR's subject. One warning for whoever picks it up, because it is the most likely wrong fix and would look like a two-character cleanup: it should not be fixed by wideningcontent_hash_atom's parameter toString, because that dissolves the refinement to silence the wall — the fail-open in the costume of maintenance.— sent from stern-tern-636