Filed by the domain:ui PM seat as the B half of the ruling on objectui#7567 Q2 (PR objectui#7870). That card's brief left the population choice open and said the three candidate numbers (26 / 33 / 74) are not interchangeable; the PM ruled A (factory-resolved only) now, B as a separate card — this is that card.
What landed, and what it deliberately does not cover
objectui#7870 landed scripts/check-i18n-call-site-keys.mjs's value-compare over the factory-resolved population: every createSafeTranslation / createSafeTranslationHook invocation, read from source with no registry. Its census on that PR's tree:
32 createSafeTranslation site(s) over 32 distinct table(s) (0 unreadable)
841 row(s) compared against their en value, 841 matching, 5 on a key en does not define
⚠️ Two tables hand-roll fallbackT instead of taking the factory, and are therefore outside that population. They were measured while writing objectui#7870 and are currently clean:
| table |
rows |
compared |
drifted |
GANTT_DEFAULT_TRANSLATIONS |
80 |
80 |
0 |
IMPORT_DEFAULT_TRANSLATIONS |
135 |
135 |
0 |
⚠️ Those readings are from 2026-09-06 and are the baseline, not a standing guarantee. Nothing watches them today, which is the whole point of this card. Re-measure before acting.
Why A was chosen first, so this card is not a re-litigation
The factory-resolved population is registry-free: a 33rd createSafeTranslation site is covered the day it is written, with nobody needing to remember to register it. That is a structural property, not a convenience, and it is why it went first.
A registry is the opposite: nothing in the source says which local function is a fallbackT, so covering the hand-rolled tables requires a declaration. The PM ruling's words: "a second thing to keep from rotting, with its own staleness ratchet obligations — and that is a decision rather than a measurement." objectui#7567's deliverable was a measurement, so the decision was split out here.
Proposed shape
The precedent exists in-repo: the objectui#3512 test's HAND_ROLLED_TABLES. Reuse that declaration form rather than inventing a second one.
⛔ Two things this card must not do
- ⛔ Do not infer the population. Option C on objectui#7567 was "gate every
Record<string, string> table that looks like a defaults map, inferred rather than declared" — the PM rejected it: "it would invent a heuristic where a declaration is available." If you find yourself pattern-matching identifier names, you are building C.
- ⛔ Do not weaken the collapse guard. objectui#7870 ships
factoryComparedRows < 500 → exit 1, because "0 drifted" and "0 rows compared" read identically in the output. Widening the population must not make that threshold vacuous, and the widened population needs its own equivalent floor. A blocking rule whose scan set collapses to empty is green forever and never speaks again, with nobody notified.
Required of whoever picks this up
- A positive control on the widened half specifically. Reintroduce a real drift into one of the two hand-rolled tables and show the gate naming itself; restore and show green. ⛔ A control that has not been shown to fail is not a control. (objectui#7466 cost this lane a full dispatch on exactly that: the loop instrument returned 0/32 on the broken tree and 0/32 on the fixed one — zero demonstrated power.)
- A staleness reading on the registry itself. A declared list rots when a table is added and not declared. State how a missing declaration is detected, or state plainly that it is not — do not leave it implied.
- Report the abstention count, as objectui#7870 does. Its 5 abstaining rows became objectui#7874 purely because the count was printed rather than swallowed internally; a gate that hides its blind-spot size reads as 100% coverage forever.
Back-links
objectui#7567 (the card that measured the factory half) · PR objectui#7870 (the implementation and the census) · objectui#3512 (HAND_ROLLED_TABLES, the precedent declaration) · objectui#7454 / b8fc1e2bf (PR objectui#7574 — the one known historical drift instance, landed 2026-09-04, which is why objectui#7870's census reported zero) · objectui#7874 (the abstention bucket that census surfaced)
Clause-② is expected to be no — a gate's scan population widens, but no published contract's accept/reject behaviour changes. ⚠️ Confirm rather than assume, and note that widening a gate's scan population is exactly the class that this lane requires to ship report-only first, with the census as the deliverable, if the widened set turns out to hold unfixed members.
Filed by the
domain:uiPM seat as the B half of the ruling on objectui#7567 Q2 (PR objectui#7870). That card's brief left the population choice open and said the three candidate numbers (26 / 33 / 74) are not interchangeable; the PM ruled A (factory-resolved only) now, B as a separate card — this is that card.What landed, and what it deliberately does not cover
objectui#7870 landed
scripts/check-i18n-call-site-keys.mjs's value-compare over the factory-resolved population: everycreateSafeTranslation/createSafeTranslationHookinvocation, read from source with no registry. Its census on that PR's tree:fallbackTinstead of taking the factory, and are therefore outside that population. They were measured while writing objectui#7870 and are currently clean:GANTT_DEFAULT_TRANSLATIONSIMPORT_DEFAULT_TRANSLATIONSWhy A was chosen first, so this card is not a re-litigation
The factory-resolved population is registry-free: a 33rd
createSafeTranslationsite is covered the day it is written, with nobody needing to remember to register it. That is a structural property, not a convenience, and it is why it went first.A registry is the opposite: nothing in the source says which local function is a
fallbackT, so covering the hand-rolled tables requires a declaration. The PM ruling's words: "a second thing to keep from rotting, with its own staleness ratchet obligations — and that is a decision rather than a measurement." objectui#7567's deliverable was a measurement, so the decision was split out here.Proposed shape
The precedent exists in-repo: the objectui#3512 test's
HAND_ROLLED_TABLES. Reuse that declaration form rather than inventing a second one.⛔ Two things this card must not do
Record<string, string>table that looks like a defaults map, inferred rather than declared" — the PM rejected it: "it would invent a heuristic where a declaration is available." If you find yourself pattern-matching identifier names, you are building C.factoryComparedRows < 500→ exit 1, because "0 drifted" and "0 rows compared" read identically in the output. Widening the population must not make that threshold vacuous, and the widened population needs its own equivalent floor. A blocking rule whose scan set collapses to empty is green forever and never speaks again, with nobody notified.Required of whoever picks this up
Back-links
objectui#7567 (the card that measured the factory half) · PR objectui#7870 (the implementation and the census) · objectui#3512 (
HAND_ROLLED_TABLES, the precedent declaration) · objectui#7454 /b8fc1e2bf(PR objectui#7574 — the one known historical drift instance, landed 2026-09-04, which is why objectui#7870's census reported zero) · objectui#7874 (the abstention bucket that census surfaced)Clause-② is expected to be⚠️ Confirm rather than assume, and note that widening a gate's scan population is exactly the class that this lane requires to ship report-only first, with the census as the deliverable, if the widened set turns out to hold unfixed members.
no— a gate's scan population widens, but no published contract's accept/reject behaviour changes.