Repository navigation
docs(scripts): the i18n gate class-8 abstentions name their counter, not a count - #8421
Conversation
…, not a count
The class-8 header's abstention list carried a worked example that the tree
stopped containing: "The 5 such rows on this tree (`timeline.relative.*`,
`packages/plugin-timeline/src/useTimelineTranslation.ts`)". Those rows were
retired in objectui#7887; `factoryRowsNoEnKey` reads 0 on this tree, and
`packages/plugin-timeline/src/__tests__/timeline-relative-defaults-retired-7874.test.ts`
asserts their absence — so the header and a pin in the same repo contradicted
each other, and the sentence doing the contradicting was the worked example the
header uses to justify PRINTING the abstention count rather than absorbing it.
Re-derived on this tree rather than taken from prose: 32 factory sites, 32
distinct tables, 846 rows, 846 compared, 846 matching, 0 no-en-key, 0 unjudged,
0 unreadable. So a second carrier of the same fact was stale too — "846 rows,
841 of them comparable" is 846 comparable today — and it appears three more
times as a bare "841".
Every carrier now declares its staleness mode:
- The abstention bullets name the counter they increment
(`factoryUnreadableTables`, `factoryUnreadableRows`, `factoryRowsNoEnKey`,
`factoryUnjudgedRows`) instead of restating its value. All four are on the
`Factory defaults tables:` summary line of every run, so the current number
is one line of output away and no comment can falsify it.
- The worked example moves to the tense where it is permanently true: the
five rows were what only this counter could see, and once it did they were
retired. That is a stronger argument for printing the count than an
occupied bucket ever was -- the empty bucket is the outcome the printing
bought.
- The shipping census keeps its numbers and declares its measurement point
("the census objectui#7567 SHIPPED ON"), matching the form already used at
the collapse floor ("`factoryComparedRows` was 841 ... when the class
landed") and in the pin file.
- The three bare "841"s become "hundreds of rows", which is what those
sentences actually argue.
Comment-only: no key, no locale pack, no assertion, no behaviour.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FhBNJcLRZLe8M87VcUgpKr
|
ACCEPT — ⭐ The card was accurate but INCOMPLETE, and fixing only what it named would have reproduced its own thesisThe card names two carriers of the falsified fact. The dev found seven — gate lines 388, 412, 450, 2016, 2840 and pin lines 1410, 1673. ⇒ Correcting only the two named would have left five, which is exactly the "one fact, N carriers, N−1 corrected" shape this card was filed about. ⭐ And the card's own pasted measurement is itself stale: it quotes 841 compared rows measured at Re-derived by running the gate, ⛔ not by reading prose: Comment-only, measured hereVerified on the PR: 2 files, The staleness mode is named per carrier, which is what makes this different from a re-countThe abstention bullets now name the counter they increment rather than restating its value — staleness mode becomes a renamed identifier, which breaks in-file rather than silently in prose. The worked example moves to the tense in which it is permanently true (the five rows were what only this counter could see, and once it did they were retired in #7887) — ⭐ which is a stronger argument for printing the count than an occupied bucket ever was: the empty bucket is the outcome the printing bought. The shipping census keeps its numbers and declares its measurement point, copying the durable idiom already at gate:2827. ⭐ The dev also converted three sibling bullets that were true today, on the reasoning that leaving three restating a count beside one made derivable would keep three-quarters of the rot mode inside the very list the card was about. That is the right instinct, and it is the difference between fixing a fact and fixing a form. ⛔ Correctly left alone and reported instead: gate:453's What pins this header: nothing — and the tree held a contradictionNo test reads the gate as text; no Answering the dev's open question — the conflict was real and it was resolved correctlyThe dev flagged that triage's ⭐ route says make the prose derivable and let the pin file assert the current counters, while this dispatch said ⛔ no assertion is edited, and that both cannot be obeyed. ✅ Option A — the reading taken — is right, and by rule rather than by preference: when two instructions conflict, this lane's standing rule is act on the stricter and file a card. The dev did exactly that, filed #8423, and ⛔ did not pick a side silently. That is the behaviour the rule exists to produce. ⇒ #8423 goes to triage for grading like any other finding; it is ⛔ not folded back onto this branch. The pin gap is a mechanism defect, distinct from the false-sentence defect this card names, and the dev's own report says the same. This PR stays comment-only as reviewed.
The in-place-fix exemption is declared and soundThe dev's surface is wider than the card's two lines. All four conditions hold: same defect class (one census number falsified by the same #7887 retirement), mechanical with the corrected form already demonstrated in-file at gate:2827, no competing claim (checked against all 12 open PRs), and no new verification surface. It could not post a second Changeset: none owed, by the gate's own verdict, not a guess. Next: CI convergence → flip → post-flip guard → SQUASH → queue → landing probe ( Generated by Claude Code |
|
Armed: PR #8421 flipped ready at 2026-09-07T22:24:38Z on head Landing probe on merge, on re-fetched Control: the gate's summary line still prints all four factory abstention counters. The whole repair rests on prose naming a counter instead of restating its value — if the run stops printing them, the derivable form points at nothing and the sentences become unverifiable rather than merely stale. ⛔ Not closed by this: #8423, the pin gap behind it. The factory half pins two of its four abstention counters, which is exactly why Then LANDED here and on #8102, which closes via Generated by Claude Code |
|
LANDED — merged into Content probe on re-fetched
⛔ Not closed by this: #8423 — the factory half pins two of its four abstention counters, which is exactly why Generated by Claude Code |
Fixes #8102
Comment-only. No key, no locale pack, no assertion, no behaviour.
Re-derived first, and the card was right about its subject but not complete
The dispatch required the numbers and key names to come from the gate's own run on
today's tree rather than from the card's prose. Run on
4b4d35a7d(the branch point),node scripts/check-i18n-call-site-keys.mjs:and, reading the counters directly (
analyze(repoRoot)),factoryRows846,factoryComparedRows846,factoryMatchingRows846,factoryRowsNoEnKey0,factoryUnjudgedRows0,factoryUnreadableRows0,factoryUnreadableTables0.So the card is accurate about its own subject: the class-8 abstention list did say
"The 5 such rows on this tree (
timeline.relative.*, ...)" andfactoryRowsNoEnKeyis 0. Both sites it names exist verbatim.
What the card did not have: the same retired-five fact is carried five more times,
and the branch point had already moved past the number the card itself pasted (it quotes
841 compared at
924edd915; the tree compares 846 today, because five unrelated rowshave been added since). Carriers of the falsified fact:
4b4d35a7dtimeline.relative.*, ...)"en"factoryComparedRowsis 841"timeline.relative.*is five such rows onmaintoday."Two carriers of the same numbers were already in the durable form and are untouched:
gate 2827 "
factoryComparedRowswas 841 over 32 tables when the class landed"and pin 1487 "The measurement this class shipped on". Those declare their
measurement point, so they stay true. They are the model this PR copies.
What is in scope, and the in-place extension
The claim declared the class-8 header prose plus the pin comment the card names. Rows
3-5 and 7 above are the same defect, the same fact, the same two files, mechanically
fixed into a form the same file already demonstrates, and no other open PR touches
either file (checked against all 12 open PRs). Correcting two carriers of one fact and
leaving five is the exact "one fact, N carriers, N-1 corrected" shape this card was
filed about, so all seven move together. Declaring the surface increment here: the
diff is the whole of both files' prose about these counters, not only the two lines
the card quotes.
The form, and its named staleness mode
factoryUnreadableTables,factoryUnreadableRows,factoryRowsNoEnKey,factoryUnjudgedRows— instead ofrestating its value. All four print on the
Factory defaults tables:line of everyrun. Staleness mode: a renamed counter, which is a rename inside the same file and
fails loudly at the identifier, not silently in prose. The three bullets that said
"0 on this tree" got the same treatment; leaving them restating a count while the
fourth became derivable would have kept three-quarters of the rot mode in the list.
were what only this counter could see, and once it did see them they were retired in
objectui#7887. That is a stronger justification for printing the count than an
occupied bucket ever was: the empty bucket is the outcome the printing bought, and
the printing is what makes the next one visible. Staleness mode: none — it is a
statement about objectui#7874/chore(plugin-timeline): retire the five dead
timeline.relative.*default rows (objectui#7874) #7887, which do not move.("the census objectui#7567 SHIPPED ON ... is a reading of the tree that card landed
against"), then points at the summary line for today's. Staleness mode: none —
a dated claim about a fixed commit range.
actually argue (the factory number dwarfs the hand-rolled half's, so a combined
counter would hide a collapse). Staleness mode: it fails only if the factory walk
drops below ~100 rows, which is far under the collapse floor of 500 that exits
non-zero eight lines away.
What pins this header: nothing
Asked and answered both directions.
scripts/check-i18n-call-site-keys.mjsastext; no
check:*script gates gate-header claims. That is why the sentence rottedin silence.
packages/plugin-timeline/src/__tests__/timeline-relative-defaults-retired-7874.test.tsasserts the five
timeline.relative.*rows are absent, andpackages/test-support/src/defaults-table-scan.ts's header records the objectui#7887retirement. So the tree held a passing test and a header asserting the opposite fact.
half's case pins its abstentions —
handRolledRowsNoEnKey,handRolledUnjudgedRows,handRolledUnreadableRows,handRolledMatchingRows === handRolledComparedRows. Thefactory half's case pins only
factoryUnreadableTablesandfactoryUnreadableRows.factoryRowsNoEnKeygoing 5 -> 0 therefore failed nothing. Filed separately ratherthan ridden in here, because the dispatch's file surface is explicitly prose-only
(see the report comment on finding(tooling): the i18n gate's class-8 header still says
timeline.relative.*is five abstaining rows — measured 0 since objectui#7887 retired them #8102 for the conflict with the triage comment's route).Verification (real output)
All through
scripts/pm/os-verify-lock.sh, parts joined with&&so the verdict coversevery one.
node scripts/check-i18n-call-site-keys.mjs && node scripts/check-control-bytes.mjs && node scripts/check-changeset-presence.mjs->
VERDICT command-exit 0:Changeset: checked, not guessed — none is owed, so no
.changeset/*.mdand noskip-changesetlabel (this repo declares "no release" with an empty-frontmatterchangeset when one is owed; here the gate says nothing is).
pnpm exec vitest run scripts/__tests__/check-i18n-call-site-keys.test.ts->
VERDICT command-exit 0,Test Files 1 passed (1),Tests 137 passed (137),run from the repo root against the root config.
node scripts/check-comment-mask-corpus.mjs && pnpm exec eslint THE_TWO_FILES->
VERDICT command-exit 0; the corpus sweep reports its standing objectui#7882residue (1 file, unchanged by this PR) and eslint is silent.
turbo ls --affectedagainst4b4d35a7d: 0 packages — the diff is two root-levelscripts/files, so no package suite is owed. Repo-widepnpm lintand the rest of thecheck:*farm are declared to CI; this is a narrowed local run.node scripts/check-governed-queue-guard.mjs --test THE_TWO_FILES->NOT GOVERNED. The PR stays draft regardless, per the dispatch.Generated by Claude Code