tri gates mutate: give the boundary operator a flag (Refs #2161) - #2612
Merged
Conversation
Recomputed the full five-operator table with the repaired cache: silent 47/52 90% loud 28/32 88% invert 72/78 92% boundary 26/77 34% assert 2/16 12% total 175/255 69% 80 survivors Previously 157/244 with 87. The verdict-reaching operators sit near 90%; the whole weakness is two columns, and 40 of the 80 survivors are in one file. READING the survivors changes what they mean. `invert_sites` keeps only conditions whose body carries a verdict -- hence 92%. `boundary_sites` mutates EVERY comparison, and its survivors are `while len(v) < N`, `if len(out) > 6`, `while j < len(src)`: loop bounds and display cutoffs. Moving those cannot make a gate stop failing, so they were never the question. A 34% rate over sites that reach no verdict is a finding about the operator, not about the gates. The assert survivors are thresholds with margin: floor 54, measured 58 56 59 59 55 55. Two sit ONE point above the line, so the threshold is doing real work and the boundary operator survives because 55 satisfies both `>= 54` and `> 54`. So: "survivor" means "defect" for the return operators and does not for the other two, and this campaign had been reading one number across all five. The flag. `--loud`, `--invert` and `--assert` each select one operator; boundary was reachable only through `--all`, which runs all five over every gate. The one operator you cannot iterate on alone was the one with the worst rate. No measurement would have found that -- the gap was in the argument parser, where none of these instruments look. It surfaced because the CLI refused a single-column run. Added, with a test that every operator has a flag and that a misspelling is refused. The negative control earned its place at once: my first version built the wrong argv and reported every flag unaccepted, including three that worked, and `--loud` failing was the tell that the harness was wrong rather than the parser. Restricting boundary_sites to verdict-bearing comparisons is the fix for the 34%, and it is a change to the instrument that deserves its own measurement rather than being folded into the tick that found it. Refs #2161
Contributor
PR DashboardGenerated at: 2026-08-23 21:40:32 UTC
Summary
Seal Status
|
Contributor
|
📓 NotebookLM Notebook linked to this PR
This notebook contains session context, decisions, and artifacts for this work. |
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.
Recomputed the full five-operator table with the repaired cache:
Previously 157/244 with 87. The verdict-reaching operators sit near 90%; the whole weakness is two columns, and 40 of the 80 survivors are in one file.
Reading the survivors changes what they mean
invert_siteskeeps only conditions whose body carries a verdict — hence 92%.boundary_sitesmutates every comparison, and its survivors arewhile len(v) < N,if len(out) > 6,while j < len(src): loop bounds and display cutoffs. Moving those cannot make a gate stop failing. A 34% rate over sites that reach no verdict is a finding about the operator, not about the gates.The assert survivors are thresholds with margin: floor
int(0.9*60) = 54, measured 58 56 59 59 55 55. Two sit one point above the line — so the threshold is doing real work, and the boundary operator survives because 55 satisfies both>= 54and> 54."Survivor" means "defect" for the return operators and does not for the other two, and this campaign had been reading one number across all five.
The flag
--loud,--invertand--asserteach select one operator. Boundary was reachable only through--all. The one operator you cannot iterate on alone was the one with the worst rate — and no measurement would have found that, because the gap was in the argument parser, where none of these instruments look. It surfaced when the CLI refused a single-column run.Added, with a test that every operator has a flag and that a misspelling is refused. The negative control earned its place at once: my first version built the wrong argv and reported every flag unaccepted, including three that worked.
--loudfailing was the tell that the harness was wrong rather than the parser.Restricting
boundary_sitesto verdict-bearing comparisons is the fix for the 34%, and deserves its own measurement rather than being folded into the tick that found it.193 tests pass.
Refs #2161