Skip to content

fix(deck): the slide-count arm reads the deck itself — the row citing this gate was stale - #41

Merged
joyful-ii-V-I merged 1 commit into
mainfrom
claude/jolly-turing-545107
Sep 1, 2026
Merged

joyful-ii-V-I merged 1 commit into
mainfrom
claude/jolly-turing-545107

Conversation

@joyful-ii-V-I

Copy link
Copy Markdown
Collaborator

What was wrong

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. 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:

(B1) SCAN No site may state a count that disagrees. The generator joins the two READMEs — a claim about the deck is not exempt from the arm for living inside 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 exactly 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) — "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:

deckclaimcheck: present/deck5_ripwire_build.js:907 states "26 slides" — the generator builds 27

Then mutation-tested from a correct tree, since a missing-claim defect has to be synthesized:

  • deck row stale → red
  • deck row's slide half deleted, flag half kept → red
  • each README's count deleted → red, named individually
  • all three deleted at once → all three named, not just the first
  • a wrong count in present/README.md → fires (B1) at :3 and (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

  • Full suite: 509 gates, 506 pass, 3 skip, 0 fail, on a tree byte-identical to this commit.
  • 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.
  • The 3 skips are the standing environment ones (editchecknotecheck / argvdiffcheck want a reference binary, g1freshcheck wants an asan/ 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 new claimSites bash 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

… 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>
@coderabbitai

coderabbitai Bot commented Sep 1, 2026

Copy link
Copy Markdown

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Team

Run ID: 1e669b86-ac46-4016-a8fc-4da530ac7a4f


Comment @coderabbitai help to get the list of available commands.

@joyful-ii-V-I
joyful-ii-V-I force-pushed the claude/jolly-turing-545107 branch from 6c6806a to 0885c6e Compare September 1, 2026 01:39
@joyful-ii-V-I
joyful-ii-V-I merged commit 6cbfa4a into main Sep 1, 2026
12 checks passed
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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant