fix(deck): the slide-count arm reads the deck itself — the row citing this gate was stale - #41
Merged
Merged
Conversation
… this gate was stale
The deck's self-verification slide ("Every claim, and the command that re-derives it")
stated "173 long flags · 26 slides" and named `bash test/deckclaimcheck.sh` as its own
evidence. The generator builds 27. The gate was green.
Arm (A) had scanned the generator for `[0-9]+ long flags` since it was written; arm (B)
scanned only README.md and present/README.md for `[0-9]+ slides`. So the two halves of
one row had different provenance — the flag half derived, the slide half remembered —
and the remembered half drifted, under a claim citing the gate that was not reading it.
Arm (B) is widened to three sites and two demands:
(B1) SCAN — no site may state a count that disagrees. The generator joins the two
READMEs; a claim about the deck is not exempt for living in the deck.
(B2) REQUIRE — every site must STATE the count, not merely avoid contradicting it.
Deletion is the easier way out for whoever a (B1) red lands on, and a
claim that vanished is as much a drift as a claim that is wrong. Arm
(A) has required this of the generator since it was written; the slide
half of that one row was the asymmetry.
Both loops read ONE list, declared once. That is not tidiness: a duplicated list is the
bug being fixed here — arm (A) scanned the generator and arm (B) did not, and nothing
tied the two lists together, which is why the row read "26 slides" through a release. A
fourth site added to claimSites is scanned AND required, with no second edit to forget.
The loops keep one deliberate difference, documented in place: a MISSING file is skipped
by (B1) and fails (B2), because "states no wrong count" is vacuously true of a file that
does not exist and "states the count" is not.
Gate before code, red before green: the (B1) widening reported
present/deck5_ripwire_build.js:907 states "26 slides" — the generator builds 27, exit 1,
before the number was touched. Then mutation-tested from a correct tree, since a
missing-claim defect has to be synthesized — deck row stale; deck row deleted; each
README's count deleted; all three deleted at once (all three named, not just the first);
a WRONG count in present/README.md firing (B1) at :3 as well as (B2), which is what
proves the shared list feeds both loops and not only the one each site was added to.
The file header is updated in the same commit: it described arm (B) as scanning TWO
prose files, which is the drift this gate exists to prevent.
Gate suite: 509 gates, 506 pass, 3 skip, 0 fail. gateexitcheck — which slices this
file's terminal region and runs it in isolation — ALL PASS: both loops write the
accumulator above its final read, never in a subshell.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
Important
This repository does not receive automatic reviews because it has fewer than 10 stars. ⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Team Run ID: Comment |
joyful-ii-V-I
force-pushed
the
claude/jolly-turing-545107
branch
from
September 1, 2026 01:39
6c6806a to
0885c6e
Compare
joyful-ii-V-I
added a commit
that referenced
this pull request
Sep 4, 2026
fix(deck): the slide-count arm reads the deck itself — the row citing this gate was stale
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.
What was wrong
The deck's self-verification slide — "Every claim, and the command that re-derives it" — stated
173 long flags · 26 slidesand namedbash test/deckclaimcheck.shas its own evidence. The generator builds 27. The gate was green.Arm (A) had scanned the generator for
[0-9]+ long flagssince it was written; arm (B) scanned onlyREADME.mdandpresent/README.mdfor[0-9]+ slides. The two halves of one row therefore had different provenance — the flag half derived, the slide half remembered — and the remembered half drifted, under a claim citing the gate that was not reading it.What changed
Arm (B) is widened to three sites and two demands:
Both loops read one list, declared once. That is not tidiness — a duplicated list is the bug being fixed here. Arm (A) scanned the generator and arm (B) did not, and nothing tied the two lists together, which is why the row read
26 slidesthrough a release. A fourth site added toclaimSitesis scanned and required, with no second edit to forget.The loops keep one deliberate difference, documented in place: a missing file is skipped by (B1) and fails (B2) — "states no wrong count" is vacuously true of a file that does not exist; "states the count" is not.
Evidence
Gate before code, red before green. The (B1) widening reported this before the number was touched:
Then mutation-tested from a correct tree, since a missing-claim defect has to be synthesized:
present/README.md→ fires (B1) at:3and (B2)That last one is the one that matters: it proves the shared list feeds both loops, not only the one each site was added to.
The file header is updated in the same commit — it described arm (B) as scanning "TWO prose files", which is the drift this gate exists to prevent.
Verification
gateexitcheck— which slices this file's terminal region and runs it in isolation — ALL PASS. Both loops write the accumulator above its final read, never in a subshell.editchecknotecheck/argvdiffcheckwant a reference binary,g1freshcheckwants anasan/tree).Why a PR rather than a direct landing
CI is
push: branches: [main]+pull_request:, so a pushed branch gets no CI. This change has been verified on exactly one leg — macOS AppleClang, plain build. Since what changed is a gate, it executes in all six release legs and the ubi9 leg on every future change; a portability slip in it turns the suite red downstream rather than failing quietly. The narrow untested surface is the newclaimSitesbash array and its${site%%:*}splitting under GNU grep instead of BSD grep. The Release/NDEBUG and ASan axes are noise for this one — no C++ is touched.🤖 Generated with Claude Code