fix(tri): rank baseline holes by failure history, not by trigger table (Closes #2359) - #2360
Conversation
Closes #2359) The sweep landed yesterday reported four gates with no default-branch baseline, on the premise that each could turn a pull request red while no green state had ever existed. Measured, the premise does not hold for all of them. seal-staleness-warn is advisory by construction -- its own header says so and every path through its script ends in exit 0. Over its whole history: 169 runs, 0 failures. It appears in the check list and cannot block anything, so a missing baseline costs nobody anything there. Printing it beside emit-bitexact -- 144 runs, 84 failures, no baseline, the gate that actually blocked two merges -- presented four findings that are not the same size. The trigger table was never the signal. Whether a workflow has ever concluded failure is. This measures that per hole, prints it, sorts loudest-first, and makes --strict alarm only on gates observed to fail. A fourth kind joins the taxonomy: advisory by construction. Third correction in this line, and they rhyme: triggers alone said 47, run counts alone said 46, the intersection said 4, and the intersection ranked by failure history says one alarm and one footnote. Every stage was confident and every stage was too coarse.
The previous commit's `git add docs/NOW.md` matched nothing: master has since replaced the single file with per-day entries under docs/now/, so the freshness note was written and then silently left out of the commit. Same shape as every other no-op this project keeps finding -- the command succeeded, and nothing happened.
|
📓 NotebookLM Notebook linked to this PR
This notebook contains session context, decisions, and artifacts for this work. |
PR DashboardGenerated at: 2026-08-21 18:05:35 UTC
Summary
Seal Status
|
|
One inaccuracy in the second commit message, corrected here rather than by rewriting history: it says |
Review: not merging yet. The premise checks out; the gate relaxation that rides with it is untested and fails open twice.Reviewed at head What is right, and it is most of the PRThe central claim reproduces. Re-derived today against the live API, independently of the PR:
Drift on the top two is ordinary elapsed-time drift and moves in the direction that strengthens the argument. "Advisory by construction" verifies against the source, not just the run count. The reported list is not truncated. I looked hard for the failure mode where ranking quietly becomes filtering. There is no Finding 1 — the new test does not touch the new code
Mutant 1 — invert the production sort at line 194 to Survived. A survivor is a lead, not a verdict, so — Mutant 2, invert the test's own copy at line 293 with production untouched: So the assertion is live and Mutant 1 is not an equivalent mutant — line 194 is observably load-bearing (on this repo the holes carry Finding 2 —
|
…hes the command Repairs three defects #2360 merged into master. Its ranking idea is right and its other measurements reproduce exactly, so nothing is reverted. 1. --strict failed open on unknown history. gh() bails on any non-zero exit, so a rate limit or a 502 became "", num("") returned -1, and -1 lost both > 0 tests it met: the hole dropped out of the strict count AND the verdict ladder printed "has never run anywhere at all" about a workflow nobody had measured. Counts are Option<i64> now and None propagates to the exit code. A gate that has never run anywhere (0 runs, 0 failures) is no longer exempt either. The one exemption that was earned survives: a gate that HAS run and has never once concluded failure. The same swallow one level up is closed too: an unreadable default-branch run count used to mean "has a baseline", which deleted the finding. A 404 from the contents API stays a real answer -- 12 of this repo's 54 registered active workflows have no file on master -- so Fetch::Absent is kept apart from Fetch::Failed. 2. The guard constrained std::slice::sort_by, not tri ci baseline. It copied the production sort and the loud predicate into its own body. Inverting the PRODUCTION sort survived (3 passed; 0 failed); so did replacing `if strict && loud > 0` with `if false`. rank, severity, verdict, alarming, strict_verdict, count and is_not_found are lifted out of the command body and the tests call them. Both mutants now die. 3. emit-bitexact was never one of #2309's four holes. It has had a master baseline since 2026-08-20T01:05:13Z, 41 hours before #2360 opened, and #2309 says so in its own body. The claim is corrected in the module doc, the test doc-comment and its fixture; the NOW entry is a dated record, so a correction is appended rather than the claim edited away. Latent, not live: cibase.rs is the only reference to `ci baseline` in the tree, so no job changes colour today. Closes #2361
…hes the command (#2367) Repairs three defects #2360 merged into master. Its ranking idea is right and its other measurements reproduce exactly, so nothing is reverted. 1. --strict failed open on unknown history. gh() bails on any non-zero exit, so a rate limit or a 502 became "", num("") returned -1, and -1 lost both > 0 tests it met: the hole dropped out of the strict count AND the verdict ladder printed "has never run anywhere at all" about a workflow nobody had measured. Counts are Option<i64> now and None propagates to the exit code. A gate that has never run anywhere (0 runs, 0 failures) is no longer exempt either. The one exemption that was earned survives: a gate that HAS run and has never once concluded failure. The same swallow one level up is closed too: an unreadable default-branch run count used to mean "has a baseline", which deleted the finding. A 404 from the contents API stays a real answer -- 12 of this repo's 54 registered active workflows have no file on master -- so Fetch::Absent is kept apart from Fetch::Failed. 2. The guard constrained std::slice::sort_by, not tri ci baseline. It copied the production sort and the loud predicate into its own body. Inverting the PRODUCTION sort survived (3 passed; 0 failed); so did replacing `if strict && loud > 0` with `if false`. rank, severity, verdict, alarming, strict_verdict, count and is_not_found are lifted out of the command body and the tests call them. Both mutants now die. 3. emit-bitexact was never one of #2309's four holes. It has had a master baseline since 2026-08-20T01:05:13Z, 41 hours before #2360 opened, and #2309 says so in its own body. The claim is corrected in the module doc, the test doc-comment and its fixture; the NOW entry is a dated record, so a correction is appended rather than the claim edited away. Latent, not live: cibase.rs is the only reference to `ci baseline` in the tree, so no job changes colour today. Closes #2361 Co-authored-by: Claude <claude@anthropic.com>
Closes #2359. Corrects #2309, merged yesterday as #2312.
That sweep's premise was: a gate with no default-branch baseline can turn a pull request red while no green state has ever existed. Measured, it does not hold for all four it reported.
emit-bitexact-gatecheck-now-freshnessseal-staleness-warnloop-tools-gateseal-staleness-warnis advisory by construction — its own header says so, and every path through its script ends inexit 0. It appears in the check list and cannot block anything. Reporting it besideemit-bitexact— 84 failures, no baseline, the gate that actually blocked two merges — presented four findings that are not the same size.The trigger table was never the signal; whether the workflow has ever concluded
failureis. The command now measures that per hole, prints it, sorts loudest-first, and--strictalarms only on gates observed to fail. A fourth kind joins the taxonomy: advisory by construction.Two of yesterday's four have left the list on their own since:
catalog-count-gate(dispatched on master, which gave it the baseline it never had) andloop-tools-gate(itspush:paths finally changed there). The sweep is live, not a snapshot.Third correction in this line, and they rhyme: triggers alone said 47, run counts alone said 46, the intersection said 4, and the intersection ranked by failure history says one alarm and one footnote. Every stage was confident and every stage was too coarse.
🤖 Generated with Claude Code