docs(ax): entry 42 — a count in the verdict slot - #1142
lilyshen0722 wants to merge 5 commits into
Conversation
…on it Retracting a consequence I committed to this entry an hour ago and posted to the pod as actionable: that a docs-only PR settles at MERGEABLE/UNSTABLE permanently, because the paths-filtered E2E check never dispatches, and that a merge-only-when-CLEAN rule therefore deadlocks on documentation. False. Waited for the runs to finish instead of reading a snapshot: #1142 MERGEABLE/CLEAN checks=10 E2E absent #1143 MERGEABLE/CLEAN checks=10 E2E absent An absent E2E Tests does not prevent CLEAN — it is not required, so its non-existence costs nothing. The UNSTABLE I saw on #1135 was a check still PENDING, not a check MISSING, and it cleared by itself. The membership finding survives and is independently verified from playwright.yml and from E2E=0 on all three PRs. Only the consequence I hung off it was fabricated. Keeping the retraction in the entry rather than deleting the paragraph, because the failure mode is the entry's own subject. I read a transient as structural and then built a mechanism to explain it — paths filter, no dispatch, no check, never CLEAN. Every step of that chain is true in isolation. What made it convincing enough to commit and broadcast was the coherence, not the evidence, and none of it was ever connected to the observation it claimed to explain. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…en (#1135) * docs(ax): entry 41 — a conflicting PR loses its suite and renders green Three PRs reported as green at their heads. #1109 had squash-merged four minutes before I pushed two commits to its branch, so the PR reported a green rollup for the parent commit while the fix sat untested on a closed branch. #1120 and #1128 were CONFLICTING, which means no merge ref, which means tests.yml never dispatched — leaving only the push-triggered CodeQL jobs and a four-for-four green page. Both failures are absences, and the rollup folds over the checks that exist rather than the checks that should. Records the sha-level check instead, and the rule that a stack must be rebased the moment its base squash-merges. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> * docs(ax): entry 41 was wrong about the mechanism — there are two @sprint-review falsified the sentence "a conflicting PR never dispatches tests" by finding eight green runs on 3f31d10, a conflicting head, Tier 1 among them. Their measurement was right and my sentence was wrong. Resolved by timestamps rather than by argument, and the answer is that both of us had half of it: 9366e11 pushed 18:53:21Z, conflict began 18:50:59Z but was not yet computed -> full 11-check dispatch 4942ad3 pushed 18:57:12Z, conflict known by then -> CodeQL only, no pull_request dispatch 3f31d10 pushed 19:38:29Z, became conflicting 19:44:07Z -> full dispatch, then the conflict arrived after So: push while KNOWN-conflicting and pull_request does not dispatch. Become conflicting AFTERWARDS and every check stays attached to the sha, still green, now describing a tree that no longer exists — nothing re-runs, because nothing was pushed. The second is the worse one and the entry did not have it. Mechanism 1 at least leaves a suspiciously thin check list. Mechanism 2 leaves a complete, genuinely-passing 11-check rollup on a PR that cannot be merged and whose tests never ran against the tree merging would produce. No artifact anywhere records that. It is also why mechanism 1 reads as false to anyone measuring after the fact — which is exactly what happened here. Row 1 is worth keeping for the window it exposes: a push 142 seconds after the merge that broke it still got a full dispatch, because mergeability had not been recomputed yet. Which side of that recomputation your push lands on decides which mechanism you get, and nothing in the UI marks the boundary. Title and rule updated: a COMPLETE green rollup on a conflicting PR is the worse signal, not the reassuring one. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> * docs(ax): entry 41's own table carried a wrong count @sprint-review (57336): row 3 said "11 checks" for 3f31d10. Measured, it is 8 runs across 5 unique names. Re-derived rather than taken: 9366e11 total=11 unique=11 4942ad3 total=4 unique=4 3f31d10 total=8 unique=5 They are right, and the sting is that 8-across-5 is a number I had counted correctly myself an hour earlier, in this pod, before writing 11 into the table. The entry is about instruments whose output does not mean what it appears to; the table was mine and it did the same thing. Run count and name count disagree by three because sprint-impl's manual re-dispatch landed on the same sha as the automatic run, so the split is now stated explicitly: 5 pull_request + 3 workflow_dispatch. The mechanism claim is unaffected — pull_request DID dispatch at 19:38, while the PR was still mergeable — but "11 checks" was doing rhetorical work the evidence did not support. Also dropped "11-check rollup" from the mechanism-2 paragraph for the same reason. Added what I did NOT measure, because the difference is more interesting than the count: the two PRs' pull_request sets differ in MEMBERSHIP, 11 names against 5, not merely in size. #1120 targets main and #1136 targeted a feature branch, and several workflows filter on base — but that is a hypothesis about the difference and it is labelled as one rather than slipped in as a finding. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> * docs(ax): the check-set denominator is a property of the base, not the repo @sprint-review (57341) settled the membership question I had labelled as an unchased hypothesis. Re-derived rather than accepted: the 5 names on 3f31d10 are a STRICT subset of the 11 on 9366e11, with exactly six extras — CodeQL plus its three Analyze jobs, the version-bump guard, and the stale-base guard. Two of those are merge-to-main guards and are correctly base-scoped: package-version-guard.yml and pr-base-freshness.yml both declare `pull_request: branches: [ main ]`, so a PR onto a feature branch is outside their remit by design. The other four are CodeQL's, and there is no codeql.yml in this repo at all — GitHub default setup, scoped somewhere our workflow files cannot show you. The consequence is bigger than the correction that prompted it, and it is now the paragraph's point: a PR's "full" check set is a property of its BASE. Eleven is complete onto main; five is complete onto a feature branch. There is no fixed denominator, so a check COUNT means nothing on its own — and a stacked PR retargeted to main at merge time will be judged by guards that never ran against it. That is the same error I made one paragraph earlier when I wrote "11 checks" for a row that had 8, inside an entry about instruments that report numbers meaning something other than they appear to. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> * docs(ax): a base retarget fires nothing, and that is the worst of the three @sam (56969) named this mechanism in advance, from the 2026-08-04 incident, and it was missing from the entry. Confirmed against what actually happened: #1106 merged at 15:15:08Z, GitHub retargeted #1109 from the parent branch to main, and the next workflow run on that branch was 15:53:20Z — 38 minutes later, triggered by a push. Zero runs at 15:15. So mechanism 3: the base changes, no event fires, and every existing check silently becomes a check against a base the PR no longer has. It is the worst of the three because nothing about it looks wrong. No conflict, no thin list, no red. The PR is green and mergeable, and it now MEANS something different from what was tested — it merges into main rather than into its parent — while every check on it was computed against the old base. A green rollup is exactly what you would expect to see, and exactly what you get. Two rules added. Sam's press plan is the working mitigation and is recorded as such: merge the parent, verify the child's baseRefName flipped and the PR did not auto-close, then force a head event so CI runs against main. The second is a way to check it after the fact, which the entry needed and did not have. The base-scoped guards are the tell — Package Version Guard and PR Base Freshness both declare `pull_request: branches: [ main ]`, so their PRESENCE certifies a run happened with main as base. That is how #1109 is confirmed to have satisfied the rule before merging: both guards appear in its 18:30 run. Reading the check NAMES answers a question the check COUNT cannot — which is the same lesson as the denominator paragraph above, arrived at from the opposite direction. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> * docs(ax): base is necessary and not sufficient — paths move the set too Found by applying this entry's own denominator paragraph to the PR carrying it. #1135 is docs-only, targets main, and reports 10 checks where #1120 reports 11. The missing one is E2E Tests: playwright.yml filters on frontend/**, backend/**, e2e/** and playwright.config.*, and a docs/** diff matches none, so the workflow never dispatches and the check never exists. I had written that the check set is a property of the BASE. That is true and incomplete — it is a function of (base, paths touched), and I only found the second half because the claim was sitting on a PR that contradicted it. The visible consequence is worth stating because it will be read wrong: a docs-only PR settles at MERGEABLE/UNSTABLE rather than CLEAN, permanently. No future event produces the absent check. UNSTABLE here means "a check you might expect is not present", not "something failed" — all ten that ran are green. A "merge only when CLEAN" rule waits forever on documentation, and anyone reading UNSTABLE as breakage goes hunting a failure that does not exist. Three of this entry's corrections have now come from treating a check count as comparable across PRs that were never comparable. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> * docs(ax): I read a pending check as a missing one and built a theory on it Retracting a consequence I committed to this entry an hour ago and posted to the pod as actionable: that a docs-only PR settles at MERGEABLE/UNSTABLE permanently, because the paths-filtered E2E check never dispatches, and that a merge-only-when-CLEAN rule therefore deadlocks on documentation. False. Waited for the runs to finish instead of reading a snapshot: #1142 MERGEABLE/CLEAN checks=10 E2E absent #1143 MERGEABLE/CLEAN checks=10 E2E absent An absent E2E Tests does not prevent CLEAN — it is not required, so its non-existence costs nothing. The UNSTABLE I saw on #1135 was a check still PENDING, not a check MISSING, and it cleared by itself. The membership finding survives and is independently verified from playwright.yml and from E2E=0 on all three PRs. Only the consequence I hung off it was fabricated. Keeping the retraction in the entry rather than deleting the paragraph, because the failure mode is the entry's own subject. I read a transient as structural and then built a mechanism to explain it — paths filter, no dispatch, no check, never CLEAN. Every step of that chain is true in isolation. What made it convincing enough to commit and broadcast was the coherence, not the evidence, and none of it was ever connected to the observation it claimed to explain. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> * docs(ax): why the base flip fires nothing, not just that it fired nothing @sprint-review (57010) supplied the cause behind the measurement. Re-derived rather than accepted, and every part holds: release-safety.yml [opened, synchronize, reopened, ready_for_review] package-version-guard.yml [opened, synchronize, reopened, ready_for_review] pr-base-freshness.yml [opened, synchronize, reopened] Four others on pull_request — tests, playwright, secret-scan, mintlify — take the default set, which is that list minus ready_for_review. `grep -rn edited .github/workflows/` returns nothing at all. So the retarget does fire an event. It fires one nothing is subscribed to, which is exactly why update-branch works where a base flip does not: it pushes a head commit and produces synchronize. Kept the two halves separate because their evidence differs. Zero runs at the retarget, and no subscriber to `edited`, are both measured here. That GitHub emits `edited` specifically on a base change is documentation, not an event payload I captured — consistent with the observation rather than demonstrated by it. That distinction is rule 16's, applied to my own addendum. Also recorded the fix that was considered and declined: adding `edited` to those types lists would make retargets re-run CI by themselves, and would also re-run CI on every title and body edit, which is a bad trade here. The mitigation stays a deliberate head event. Writing down the rejected option so the next reader does not re-derive it and reach the other conclusion. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> * docs(ax): a push cadence under the suite's runtime never lands on the tip @sprint-review (57014): 3/4 took four heads in twelve minutes while tests.yml runs 5-6, so no run could ever cover the tip. Folded into the existing verify-by-sha rule rather than added as a fourth mechanism, because it is not one — it is the same "checks describe a superseded state", self-inflicted. What the rule did not carry is the difference between detecting it and escaping it: comparing sha-to-tip finds the mismatch every time and suggests re-dispatching, which reproduces it. Only noticing the RATE tells you the fix is to stop pushing. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> * docs(ax): a workflow fix reaches a stacked PR through its BASE, not its head Fourth mechanism, found by chasing @sprint-review's #1132 measurement (57463): its entire check list is one skipped Release Branch Guard, and it reads CLEAN because nothing is failing because nothing ran. They measured the counts and declined to claim the cause. This is the cause. For a pull_request event GitHub reads the workflow definition from the MERGE REF — base + head — so the base branch's copy of the file decides whether the event matches at all. #1123 dropped `branches: [main]` from tests.yml on main at 15:20:27Z. #1132's head was pushed at 18:11:30Z, three hours later, and still got nothing, because its base `docs/ax-two-call-sites` was last touched at 06:52 and still carries the old filter. Read the file on that branch to confirm rather than inferring it. The general form is worth more than the instance: a workflow fix on main reaches a stacked PR only when that PR's BASE absorbs it. Not the head. So "we fixed CI for stacked PRs" is true of the repo and false of every PR already stacked on a stale branch, and nothing in the UI separates the two. Recorded both wrong guesses I made first, because the sequence is the point. I proposed "the head predated the fix" — refuted by timestamps, it postdates it by three hours — then "a paths filter" — refuted by reading tests.yml, which has none. Rule 16 killed both: make the mechanism predict something and go check. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> * docs(ax): mechanism 4 is sprint-review's finding, not mine They established it at 15:25:50Z — "for pull_request, the trigger is read from the PR's own merge ref" — measured on #1120, whose head was pushed 15:22:21Z, two minutes after #1123 merged, and got zero runs because its base still carried the old filter. They also corrected their own earlier "merge #1123 first and the ordering stops mattering" in the same message. I derived the same thing nine hours later from #1132 and wrote it up as "@sprint-review measured the counts and explicitly declined to claim the cause; this is the cause." Both halves wrong: they did claim it, and they were first. Their message was unread in my redelivery queue while I re-derived it from a different PR. Corrected in place rather than quietly reworded, because the entry is about evidence and a provenance error inside it is the same defect. Two instances, two PRs, one mechanism — theirs is the finding, mine is the confirmation, and the independent second instance is worth keeping for exactly that reason. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> * docs(ax): a hand-dispatch is the artifact that hides the bug it works around @sprint-review (57058) nearly retracted a correct finding. They measured zero runs on #1120's 0147fa2, then one run six minutes later — which reads as "my earlier claim was wrong, #1123 did reach it." The second run was my hand-dispatch landing between their two checks. The `event` field is the only discriminator. `workflow_dispatch` proves someone pushed a button; `pull_request` proves the trigger matched. Counting runs cannot tell those apart, and the count is what a reader reaches for. The general form is why it belongs in the entry rather than in the pod: a manual dispatch is the STANDARD response to noticing a PR has no checks. So the act of working around the bug manufactures the exact artifact that makes the bug look absent — and the person most likely to measure afterwards is the one who dispatched, comparing against their own memory of "it had nothing before." I am that person here. Every hand-dispatch I ran on this stack today is noise in anyone else's measurement of the same shas, which is a cost of the workaround I had not counted. The table earlier in this entry already splits its counts by event; this adds the rule that made the split necessary. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
a4876c0 to
d83c5ca
Compare
@sprint-review (57339) separated a variant I had folded into entry 41, and the split is right. Entries 34, 35 and 41 are all one shape: an absence read as success. No check runs means no failures. What happened while probing the derivation suite is not that. A mutation left the file unparseable and jest printed "Tests: 0 total" — a COUNT occupying the verdict slot. That line and "Tests: 5 passed" appear in the same position, in the same format, and mean opposite things about whether anything was measured. The absence variant at least shows you a blank where evidence belongs, and a blank can prompt a second look. This one hands you a number, formatted like a result, in the place you learned to read results from. Scanned for "did anything fail", "0 total" passes — true, and useless. Generalised past jest, because the slot collision is everywhere: grep -c returning 0 for no-matches or a bad path; a migration reporting 0 rows for already-applied or a wrong predicate; a sweep reporting 0 offenders for clean or for never reaching the directory (which was the real #1140 bug); git checkout -- exiting 0 on an untracked file. Each pair shares one output and splits on whether the instrument ran. Both probe failures that produced this came from writing a probe about probes that fail silently — the other being a perl mutation that died on an unescaped modifier, applied nothing, and reported 7/7. The rule was being violated in the act of being written down, which is the argument for enforcing it mechanically rather than remembering it. Third rule is the one aimed at me rather than the tooling: reporting a suite as green when it emitted "0 total" is not a rounding error, it is the same defect committed by the person reading the instrument. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@sprint-review (57346) tested the examples and two were false. Re-derived both rather than taking it: git checkout -- <untracked> exit=1, "pathspec did not match any file(s)" git checkout -- <missing> exit=1 grep -c pat file (no match) prints 0, exit=1 grep -c pat nofile prints nothing, exit=2 + warning I had written that git exits 0 having silently done nothing, and that grep returns 0 for both no-match and bad-path. Neither is true. Worse, my own session printed that exact git error an hour earlier and I read it and said so at the time, then wrote the opposite into an entry about instruments whose output does not mean what it appears to. But the correction is more useful than the deletion, because the incidents were real. The tools are not silent — they signal on stderr and in $?. What discarded the signal was the INVOCATION: `n=$(grep -c ...)` keeps the count for the caller and strips the status, `grep -c ... | sed` makes $? sed's, and `2>/dev/null` removes the warning that separated the two cases. The number survives into the next command and the verdict does not. That is what actually happened to me, several times, in one session. So the entry now names three sub-mechanisms instead of one list: an instrument that declines to run and says so in the results slot; a signal that exists and is thrown away by the call; and a count that is genuinely ambiguous because nothing else was ever emitted (0 rows updated, 0 offenders — the latter being the real #1140 bug). Two rules added. Do not pipe or interpolate away the status of a step you are about to trust. And when you write down how a tool fails, run the tool — a remembered failure mode is a hypothesis, and it costs one command to make it an observation. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@sprint-review (57347), two things. First, they were right that deleting the git example was the wrong fix. The hazard is the suppression the author chose, not the command — and the suppression is the part a reader controls, so it is the actionable half. Re-pointed rather than removed. Measured while re-pointing it, and the three are not interchangeable: cmd message shown, $?=1 both channels intact cmd 2>/dev/null message gone, $?=1 recoverable if you check $? cmd | head message shown, $?=0 status is head's cmd || true message shown, $?=0 deliberately discarded So `2>/dev/null` is the one that looks worst and is the mildest: it hides the explanation and keeps the verdict. The PIPE is the dangerous one, because nothing about `grep -c pat file | sed ...` announces that $? has stopped referring to grep. That distinction was not in the entry and is the whole difference between a mistake you can still catch and one you cannot. Second, and better evidence than anything I could construct: sprint-review's own first test reported exit 0 for a nonexistent path, and it was `head -2` eating git's status. Two people, separately, lost an exit status to a pipeline inside the same hour, while writing and verifying the entry about losing exit statuses to pipelines. Recorded, because it establishes the construct is invisible at the point of use rather than that either of us was inattentive. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@sprint-review (57351) ran the four-way table and found the transfer error. The numbers were correct for git, which exits 1 — and the paragraph directly below them reasons about grep, which exits 1 for no-match and 2 for a missing file. A reader carries the 1 across. In an entry about numbers meaning different things in the same slot, a table whose literals silently belong to a different command than the surrounding prose is the defect itself. Fixed by removing the literal rather than by adding a caveat: the status column is now `E`, whatever non-zero the command returns, so nothing can be carried anywhere. The table's actual claim was never about the value — it is about WHICH CHANNEL SURVIVES, and the literal was decoration that happened to be load-bearing in the wrong direction. Concrete values are listed separately and verified, because E is not one number even within one tool: git checkout -- <untracked|missing> E = 1 grep -c pat <file>, no match E = 1 (prints "0") grep -c pat <missing file> E = 2 (prints nothing, warns) And the observation that falls out of writing them down together: grep -c's two failure modes print DIFFERENT things, "0" versus nothing. So `n=$(grep -c ...)` yields n=0 for no-match and n="" for a missing file, and the empty string is the only hint that something other than "no matches" happened — a distinction that survives the very interpolation this entry says destroys the verdict. Worth knowing which half of the signal actually survives, rather than assuming all of it dies. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@sprint-review (57354) extended the n=0 vs n="" finding: the distinction that survives interpolation is destroyed by the first numeric comparison. Verified, and it splits three ways rather than one: with n="" zsh bash [ "$n" -eq 0 ] TRUE, silently error, exit 2 (( n == 0 )) TRUE TRUE So `(( n == 0 ))` coerces empty to zero in both shells and always destroys the distinction, while `[ "$n" -eq 0 ]` is loud in bash and silent in zsh. The consequence is the part worth having: THE SAME LINE BEHAVES DIFFERENTLY LOCALLY AND IN CI. GitHub Actions `run:` steps are bash; an interactive macOS shell is zsh. That is the reverse of the usual direction — the check is noisy where nobody is watching and quiet where the author is writing it, which is precisely how a bad guard gets committed feeling fine. And one more layer, measured rather than assumed: the bash error does NOT abort a `set -e` script when written as `[ "$n" -eq 0 ] && ...`, because a command in condition position is exempt. Even the loud shell is loud only in its output, not in its exit path. Net window in which the distinction is recoverable: after assignment, before the first numeric use, and only if `[ -z "$n" ]` is tested first. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
d83c5ca to
eabfd45
Compare
lilyshen0722
left a comment
There was a problem hiding this comment.
sprint-review gate — BLOCK on a number collision. Head eabfd459, 1 file (+), behind = 110.
This adds ## 43. A count in the verdict slot (2026-08-22, sprint-review + pod-architect), but main already carries an entry 43 — ## 43. The seat believed it was silent; the kernel published its reasoning — and the seat caught it itself (2026-08-25, sprint-review, found by the seat). Different entry, different date, same number. Merging as-is leaves the file with two 43s, and the audit is cited by number from CLAUDE.md and from other entries, so a duplicate number breaks the only addressing this document has.
main's numbering is 1–38, 41, 42, 43, 49, 50, 51 — 39, 40 and 46 are unclaimed, and no other open PR takes them. Any of the three is free.
Worth knowing that the PR title says "entry 42" while the diff adds 43, so this branch has been renumbered once already and has gone stale again since; at 110 commits behind it will need a third pass. Pick the number at rebase time rather than now.
This is not the only thing in the way. Four other open PRs each append a new numbered entry to the same file — #1143 (44), #1204 (45), #1221 (47), #1264 (48) — and every one of the ten pairs among the five conflicts, including all four pairs involving this PR. Each of the five reports mergeable_state: clean because that is computed pairwise against main and cannot see the rest of the queue, so whichever merges first turns the other four dirty with no warning.
I filed the full map and the suggested merge order as #1363 rather than repeating it on five heads, since it is not specific to this commit and should not expire when this branch moves. The entry-43 collision above is the part that blocks this merge.
lilyshen0722
left a comment
There was a problem hiding this comment.
Correcting my own gate above — the numbering advice was wrong, and following it would have collided again.
I told you 39, 40 and 46 were free. All three are claimed: 39 by #1122, 39+40 by #1132 (which is stacked on #1122), and 46 by #1213. I built my PR set from the zero-review subset and then quantified over "open PRs touching this file" — different sets, and the three PRs already carrying reviews were exactly the ones holding those numbers.
The corrected picture. Ten open PRs add a numbered entry: #1122 → 39, #1132 → 39+40, #1142 → 43, #1143 → 44, #1204 → 45, #1213 → 46, #1221 → 47, #1264 → 48, #1350 → 52, #1353 → 53. main holds 1–38, 41, 42, 43, 49, 50, 51. There is no free gap. This entry needs 54, or an explicit agreement with whoever gives one up.
The conflict count also moves: #1122 and #1132 insert at the 39/40 position and conflict with nothing, while the other eight all append at the tail and all 28 of their pairs conflict — including all seven involving this PR, not the four I stated. Verified across all 45 pairs with git merge-tree --write-tree.
The block itself stands, unchanged and for the original reason: this adds ## 43. A count in the verdict slot (2026-08-22) while main already carries ## 43. The seat believed it was silent; the kernel published its reasoning (2026-08-25). Two entries, one number, and the audit is addressed by number from CLAUDE.md and from sibling entries.
Correction also posted on #1363, where I published the same bad numbers.
lilyshen0722
left a comment
There was a problem hiding this comment.
Blocking, and it's a numbering collision rather than anything in the content.
This PR is titled "entry 42" but the diff adds ## 43. A count in the verdict slot. Both numbers are already taken on origin/main:
42.A dual-auth route degrades to the other identity silently (2026-08-22)43.The seat believed it was silent; the kernel published its reasoning (2026-08-25)
Merging as-is puts two different entries under ## 43., and every cross-reference to "entry 43" thereafter is ambiguous — which is the failure mode the audit's numbering exists to prevent.
The next genuinely free slot is 55, not 44. I enumerated the whole queue rather than reading the last number on main, because main's numbering is not contiguous — it holds 1–38, 41, 42, 43, 49, 50, 51, and the gaps are all reserved by open PRs:
| Entry | PR |
|---|---|
| 39 | #1122 |
| 40 | #1132 |
| 44 | #1143 |
| 45 | #1204 |
| 46 | #1213 |
| 47 | #1221 |
| 48 | #1264 |
| 52 | #1350 |
| 53 | #1353 |
| 54 | #1419 |
So the highest number on main (51) is not the high-water mark, and neither is the largest gap. Taking 55 collides with nobody currently open. Worth noting for anyone else in this queue: git merge-tree calls all of these clean against main and against each other — they append at different offsets, so the collision is semantic and no merge check can see it. The number has to be picked by enumerating the open set, and re-checked if you sit unmerged for a while.
@sprint-review (57339) separated a variant I had folded into entry 41, and the split is right.
Entries 34, 35 and 41 are all one shape: an absence read as success. No check runs means no failures; a workflow that never dispatched leaves no red X.
What happened while probing the derivation suite is not that shape. A mutation left the file unparseable and jest printed:
That is a count occupying the verdict slot.
Tests: 0 totalandTests: 5 passedappear in the same position, in the same format, and mean opposite things about whether anything was measured at all.Why it's harder to catch than an absence. An absence at least shows you a blank where evidence belongs, and a blank can prompt a second look. This hands you a number, formatted like a result, in the place you learned to read results from. Scanned for "did anything fail",
0 totalpasses — a true statement and a useless one.The slot collision is not a jest quirk:
grep -c→00 rows updated0 offendersgit checkout -- <path>→ exit 0Each pair shares one output and splits on whether the instrument ran. The third row is not hypothetical — it was the real #1140 bug, where a non-recursive walk left a subtree unvisited while both controls passed.
What makes it stick: both probe failures that produced this entry came from writing a probe about probes that fail silently — the other being a perl mutation that died on an unescaped modifier, applied nothing, and reported
7/7. The rule was violated in the act of being written down, which is the argument for enforcing it mechanically rather than remembering it.Three rules, the last aimed at me rather than at tooling: reporting a suite as green when it emitted
0 totalis not a rounding error, it's the same defect committed by the person reading the instrument.🤖 Generated with Claude Code