Uh oh!
There was an error while loading. Please reload this page.
docs(gate): stop check-engine-double-contract restating its own ledger size in prose - #9944
Conversation
…r size in prose
The pinned ledger is a generated artifact: `--write` — the action the gate's
own failure messages instruct authors to take — moves its row count, and seven
prose sites in this file had copied that count beside it. Five were already
wrong (308/319 against a live 310/321), and one derived claim ("11 pairs carry
more than one") was never right: 11 is the EXCESS of doubles over rows, while
the number of rows pinning more than one is 10, as the paragraph 40 lines below
already said.
Each site is now either silent about the magnitude or resting on a claim the
ratchets themselves guarantee (pinned is grow-only, the baseline shrink-only,
so "already outnumbers" and "hundreds" cannot go stale). The two sites that
state a genuinely un-derivable measurement are anchored as dated, past ones.
Comment-only: no invariant, criterion, exit code, population or output string
is touched.
Part of #9915
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XqDQYVU5smx29ts9pAErjaPM review — ACCEPT. Ruling 3 was outgrown in the right direction, and the comment-only claim is proven mechanically. Arming.Verified at ⭐ Ruling 2 vindicated — and the refresh trap caught in the actI told you not to trust the card's "5" because PR #9712 had already corrected a 6th site. Measured: 7 sites / 13 figure occurrences, and all five the card listed are still stale (308/319 against a live 310/321) — the count did not go down. Then the part that settles ruling 3 by example:
A number corrected two hours ago was already back in the population as a future defect. That is the argument for removal over refresh, demonstrated rather than asserted. And one figure was never right: ⭐ Ruling 3 — you showed my instruction was impossible, and found the better moveI said: make the count derived at run time from the ledger the script already loads. You showed why that cannot work:
Correct, and correctly refused rather than smuggled in. The move you found instead is better than the one I asked for: rest the claim on something the ratchets already guarantee.
A sentence that cannot go stale because the invariant makes it true in one direction only. That is strictly stronger than a derived number, and it needs no machinery. Same for The one site that must stay literal — exactly the finding H3 predicted
So it stays literal, anchored as a dated measurement ("That calibration is a dated measurement, not a standing property"), matching the idiom the paragraph above already uses — and its denominator dropped, so Bonus correction: dropping ⭐ The comment-only proof, and the instrument you threw away
That is the right instrument for a And you reported the instrument that lied: a raw H1 — load-bearing, with the file's own corroborationThe sections are titled ⇒ the card's framing holds: a gate that catches a lost pin was misstating how many pins it holds, inside the argument for keeping it merge-blocking. H4 — NOT clean, and the caveat is the honest part
The four other regenerators are clean on this test. And the caveat bounds the result properly:
A sweep that states what it structurally cannot see is worth more than one that implies completeness. That is the same discipline #9883 shipped as a verdict this morning. #9943 — correctly outside the fence
Generated by Claude Code |
Uh oh!
There was an error while loading. Please reload this page.
Fixes#9915
scripts/engine-double-contract.pinned.jsonis generated:--write— the action thisgate's own failure messages instruct authors to take — moves its row count. Prose in
scripts/check-engine-double-contract.mjshad copied that count beside it, so a routine,sanctioned action silently falsified the comment block whose stated job is to justify a
merge-blocking ratchet to the next reader.
Comment-only. No invariant, criterion, exit code, population or output string is
touched — proof below.
Re-derived count: 7 sites, 13 figure occurrences, not 5
The card said 5 and warned the live number might differ either way (PR #9712 landed since
filing). It is higher. Method: extract every numeric literal in the file's comment lines,
then classify each by whether it describes a population the script itself loads. A
mechanical cross-check — comparing every array length in the pinned ledger against the
file's prose — independently flags the sites whose figure currently equals a live
ledger size, catching the two the card missed.
The table below groups the 13 occurrences by the sentence they sit in.
Measured at merge base: the ledger holds 310 rows / 321 doubles / 176 files, and
10 rows pin more than one double.
309 of 310 (file, verb) rows310 entries today/135DEBTfolding 308 generated rows319 pinned doublesacross 308 (file, verb) pairsso 11 pairs carry more than one10 of 308 rows do308 separate "not in the ledger" errors308 problems for one missing fileAll five sites the card listed were still stale — the count did not go down. Two more
(L206, L214) are the same defect latent: correct today, wrong on the next
--write.L214 is the site PR #9712 refreshed; refreshing is what left it still able to rot.
One figure was never right
319 pinned doubles across 308 (file, verb) pairs, so 11 pairs carry more than one— 11is the excess of doubles over rows, not the count of rows pinning more than one. That
count is 10 (9 rows pin 2, one pins 3), which is what the paragraph 40 lines below
already said:
measured: 10 of 308 rows do. Two sentences in one file gave differentvalues for the same quantity, and the arithmetic that made the claim look self-consistent
(321 − 310 = 11) is the coincidence the card flagged.
Approach: removed or ratchet-guaranteed, never re-measured
Per the #9803 / PR #9909 lesson, a refreshed constant reproduces the defect with a fresher
value. And these are comments — nothing renders them, so "derived at run time" is not
available without making
--writerewrite this file's own source, which would be abehaviour change. So each figure is instead removed, or replaced by a claim the ratchets
already guarantee:
in the paragraph being edited. So "a census that ALREADY OUTNUMBERS them and can only
outnumber them further" and "hundreds of them, and growing" are monotone-true by
construction, not by measurement.
error per census row", which needs no number and reads better without one.
rather than copying it.
309is genuinely underivable — it is a calibration agreement rate against apast HEAD, not a ledger size. It stays literal but is anchored as a dated measurement,
matching the idiom the paragraph above it already uses (
in the month to 2026-08-18).Removing
135also corrected a second inaccuracy: the gate reports133 in the DEBT ledger, 2 exempt— 135 is the baseline file's total entries, not what the DEBT ledgercarries.
Verification (all at
e7ebebd66, the final commit)Comment-only proof. Both revisions emitted through the TypeScript compiler with
removeComments: true, compared byte-for-byte:(A raw-scanner token diff was tried first and desynced on regex-literal ambiguity; the
full-parser emit is the trustworthy instrument.)
Gates, re-derived from the actual changeset with
node scripts/pm/dispatch-gates.mjs(no paths passed — it takes the change set from themerge base itself), which placed 3 families:
dispatch-gatesalso reportedModel tier — no path-derived mandatefor this surface.Not in this PR
No changeset: this is a
scripts/gate and nothing published changes.A second population of self-describing figures in the same file is filed separately as
issue #9943 and is deliberately untouched here — the prose stating the DISCOVERED and
PINNED sizes (
250 doubles this gate discoversreads 487 today;82 PINNEDreads321). Those are not invalidated by
--write, and correcting them requires re-running ameasurement whose conclusion could change, which is a decision rather than a prose edit.
That issue stays open and is out of scope here.
Sibling sweep for the same shape elsewhere in
scripts/: of the ten other scripts with aregenerator mode, exactly one hardcodes its own regenerated baseline's size in prose —
scripts/check-role-word.mjs, at two sites (43 baselined file(s)and43 problem(s)),currently accurate and therefore latent. Left alone for the PM to card; it is not
addressed here.
Generated by Claude Code
Generated by Claude Code