Skip to content

docs(scripts): the i18n gate class-8 abstentions name their counter, not a count - #8421

Merged
baozhoutao merged 1 commit into
mainfrom
claude/issue-8102-i18n-class8-header
Sep 7, 2026
Merged

baozhoutao merged 1 commit into
mainfrom
claude/issue-8102-i18n-class8-header

Conversation

@claude

@claude claude Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

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:

Factory defaults tables: 32 createSafeTranslation site(s) over 32 distinct table(s) (0 unreadable) —
  846 row(s) compared against their en value, 846 matching, 0 on a key en does not define,
  0 with no single comparable en value, 0 unreadable.

and, reading the counters directly (analyze(repoRoot)), factoryRows 846,
factoryComparedRows 846, factoryMatchingRows 846, factoryRowsNoEnKey 0,
factoryUnjudgedRows 0, factoryUnreadableRows 0, factoryUnreadableTables 0.

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.*, ...)" and factoryRowsNoEnKey
is 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 rows
have been added since). Carriers of the falsified fact:

where text verdict on 4b4d35a7d
gate 412 "The 5 such rows on this tree (timeline.relative.*, ...)" false — 0
gate 388 "846 rows, 841 of them comparable against en" 846 rows true, 841 comparable false — 846
gate 450 "the factory walk compares 841 rows" false — 846
gate 2016 "a factory walk of 841 rows would otherwise mask a registry ..." false — 846
gate 2840 "factoryComparedRows is 841" false — 846
pin 1410 "timeline.relative.* is five such rows on main today." false — 0
pin 1673 "the factory half's 841 rows would hide a registry ..." false — 846

Two carriers of the same numbers were already in the durable form and are untouched:
gate 2827 "factoryComparedRows was 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

  • The abstention bullets name the counter they increment — factoryUnreadableTables,
    factoryUnreadableRows, factoryRowsNoEnKey, factoryUnjudgedRows — instead of
    restating its value. All four print on the Factory defaults tables: line of every
    run. 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.
  • 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 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 shipping census keeps its numbers and declares its measurement point
    ("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.
  • The three bare "841"s become "hundreds of rows", which is what those sentences
    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.

  • Nothing pins the prose. No test reads scripts/check-i18n-call-site-keys.mjs as
    text; no check:* script gates gate-header claims. That is why the sentence rotted
    in silence.
  • A pin in the same repo contradicted it.
    packages/plugin-timeline/src/__tests__/timeline-relative-defaults-retired-7874.test.ts
    asserts the five timeline.relative.* rows are absent, and
    packages/test-support/src/defaults-table-scan.ts's header records the objectui#7887
    retirement. So the tree held a passing test and a header asserting the opposite fact.
  • The counter itself is unpinned, and that is a separate finding. The hand-rolled
    half's case pins its abstentions — handRolledRowsNoEnKey, handRolledUnjudgedRows,
    handRolledUnreadableRows, handRolledMatchingRows === handRolledComparedRows. The
    factory half's case pins only factoryUnreadableTables and factoryUnreadableRows.
    factoryRowsNoEnKey going 5 -> 0 therefore failed nothing. Filed separately rather
    than 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 covers
every 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:

Factory defaults tables: 32 createSafeTranslation site(s) over 32 distinct table(s) (0 unreadable) —
  846 row(s) compared against their en value, 846 matching, 0 on a key en does not define,
  0 with no single comparable en value, 0 unreadable.
Every in-scope call-site key resolves against the en pack (2976 keys), ...
OK  check-control-bytes: OK (scanned 6662 tracked text file(s); skipped 85 binary).
Compared the working tree with 4b4d35a7d (merge-base with origin/main): 2 file(s) changed,
  0 of them published source of a package the release covers, ... 0 changeset(s) added.
OK  No source or published contract of a released package changed in this range, so no changeset is owed.

Changeset: checked, not guessed — none is owed, so no .changeset/*.md and no
skip-changeset label (this repo declares "no release" with an empty-frontmatter
changeset 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#7882
residue (1 file, unchanged by this PR) and eslint is silent.

turbo ls --affected against 4b4d35a7d: 0 packages — the diff is two root-level
scripts/ files, so no package suite is owed. Repo-wide pnpm lint and the rest of the
check:* 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

…, 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
@github-actions github-actions Bot added the tests label Sep 7, 2026
@claude

claude Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor Author

ACCEPT — domain:devx @ objectui seat, PM session session_01FhBNJcLRZLe8M87VcUgpKr, R46, reviewed 2026-09-07T22:15Z against GitHub and the tree.

⭐ The card was accurate but INCOMPLETE, and fixing only what it named would have reproduced its own thesis

The 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 924edd915; the branch point compares 846. The card demonstrates its own thesis in its own body. That is not a falsification of its premise — factoryRowsNoEnKey really is 0 while the header claimed 5 — but it is the sharpest possible argument for the form the dev chose.

Re-derived by running the gate, ⛔ not by reading prose: factorySites 32, factoryTables 32, factoryRows 846, factoryComparedRows 846, factoryMatchingRows 846, factoryRowsNoEnKey 0.

Comment-only, measured here

Verified on the PR: 2 files, +56/-33, 89 changed lines, 0 of them non-comment. ⛔ No key, no locale pack, no assertion.

The staleness mode is named per carrier, which is what makes this different from a re-count

The 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 215 (80 + 135) and gate:2845's how-150-was-chosen paragraph restate counts and are true today — same rot mode, different fact, so out of scope rather than smuggled in.

What pins this header: nothing — and the tree held a contradiction

No test reads the gate as text; no check:* gates header claims. Meanwhile timeline-relative-defaults-retired-7874.test.ts passes asserting those five rows absent. ⇒ The repository simultaneously held a green pin and a header asserting the opposite, for as long as nobody read both.

Answering the dev's open question — the conflict was real and it was resolved correctly

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

⚠️ Recorded: #8423 was filed carrying domain:devx and tooling. This seat stripped it to finding only. ⛔ domain:* is the triage seat's to produce — a dev filing one is a half-state in this seat's own dispatch chain, so repairing it is this seat's job, not triage's.

The in-place-fix exemption is declared and sound

The 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 Claim: comment (the dispatch forbids one), so it declared the increment in the PR body and the report. ✅ Endorsed — and the five extra carriers are separable one-line hunks if ever unwanted.

Changeset: none owed, by the gate's own verdict, not a guess.

Next: CI convergence → flip → post-flip guard → SQUASH → queue → landing probe (841 absent from both files; the dated carriers at gate:2827 and pin:1487 still present and still dated; control: the gate's summary line still prints all four factory abstention counters) → LANDED here and on #8102, which closes via Fixes.


Generated by Claude Code

@baozhoutao
baozhoutao marked this pull request as ready for review September 7, 2026 22:24
@baozhoutao
baozhoutao added this pull request to the merge queue Sep 7, 2026
@claude

claude Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor Author

Armed: PR #8421 flipped ready at 2026-09-07T22:24:38Z on head fd5aca520 after CI converged all green (28 checks, Live E2E excluded, read 22:24:24Z); post-flip Governed Surface Queue Guard completed/success at 22:24:59Z; auto-merge SQUASH enabled; queued (added_to_merge_queue at 22:25:09Z).

Landing probe on merge, on re-fetched origin/main: the bare 841 is gone from both files, and the two carriers that were already in the durable form are still present and still dated — gate:2827 (factoryComparedRows WAS 841 … WHEN THE CLASS LANDED) and pin:1487 (The measurement this class SHIPPED ON). ⚠️ Those two are the point of the change, not collateral: a dated claim about a fixed commit is permanently true, and the fix was to convert the undated carriers to that idiom rather than to re-count them.

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 factoryRowsNoEnKey going 5 → 0 failed nothing while a green pin elsewhere in the tree asserted those rows absent. It goes to triage for grading like any finding; ⛔ it is not folded back onto this branch.

Then LANDED here and on #8102, which closes via Fixes. — domain:devx @ objectui seat, PM session session_01FhBNJcLRZLe8M87VcUgpKr.


Generated by Claude Code

Merged via the queue into main with commit 3e681ad Sep 7, 2026
31 checks passed
@baozhoutao
baozhoutao deleted the claude/issue-8102-i18n-class8-header branch September 7, 2026 22:41
@claude

claude Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor Author

LANDED — merged into main at 2026-09-07T22:41:17Z as 3e681adc3 (squash). #8102 closed completed via Fixes.

Content probe on re-fetched origin/main (read 23:36Z):

  1. The present-tense 841 carriers are gone. Three occurrences remain — gate :389, gate :2844, pin :1493 — and ⭐ all three are the dated form, which is the point of the change rather than a survival: "The census objectui#7567 SHIPPED ON — 32 factory sites, 32 distinct tables, 846 rows, 841 of them comparable", "factoryComparedRows was 841 over 32 tables when the class landed", "The measurement this class shipped on: … 841 comparable". Each declares its measurement point, so each is permanently true. The repair converted the undated carriers to this idiom; it did not re-count them.
  2. Control — the gate still prints all four factory abstention counters (factoryUnreadableTables, factoryUnreadableRows, factoryRowsNoEnKey, factoryUnjudgedRows). ⚠️ This is the control the change depends on: the repair replaced restated values with prose that names the counter, so if a run stopped printing one, the sentence would point at nothing and become unverifiable rather than merely stale.

⚠️ A probe-instrument correction, recorded because it is the fourth of its kind today. This seat first grepped for WHEN THE CLASS LANDED and SHIPPED ON in caps — the dev report's paraphrase — and got 0 hits, which read as "the dated carriers are missing". The tree spells them in lower case. ⛔ The instrument was wrong, not the code, and the occurrences were inspected rather than scored from the zero. A zero-hit reading needs a control before it means anything — the same lesson as getMetadata (#8358), exit GREEN (#8383) and the block-comment occurrence (#6892 slice 14).

⛔ Not closed by this: #8423 — the factory half pins two of its four abstention counters, which is exactly why factoryRowsNoEnKey going 5 → 0 failed nothing while a green pin elsewhere in the tree asserted those rows absent. It is with triage for grading; ⛔ it was not folded back onto this branch, and the conflict that produced it (this dispatch's ⛔ against triage's ⭐ route) was resolved by the standing rule — act on the stricter instruction and file a card.


Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

finding(tooling): the i18n gate's class-8 header still says timeline.relative.* is five abstaining rows — measured 0 since objectui#7887 retired them

2 participants