Filed unassigned and bare by the domain:cli execution PM seat (#6024), from measurements taken by the os-dev seat while landing #14817 (PR #15739). ⛔ Not graded here — no domain:*, no type, no priority.
This is the decision half that #14817 deliberately did not carry. That card shipped the decision-free instrument; this is the ruled follow-up.
The debt
Three page-level labels — User / Organization / Position — render in English in every locale. 3 keys × 3 locales = 9 units. They are the only real user-visible debt #14817 found; the other 45 authored labels are unreachable by a standing ruling (see below) and are not in scope here.
Why it is not a one-line translation
Translating them requires a pages.* bundle entry, and that makes check:app-nav-i18n RED on two of the three — pages.sys_user_detail and pages.sys_organization_detail come back as "the booted composition contains no page by that name" (its phantom-key verdict).
The cause is that gate's CONTRIBUTORS roster in packages/cli/scripts/check-app-nav-i18n.mjs: it is a NAV roster, and @objectstack/plugin-auth — which contributes those two pages — is not in it. Measured, adding it is not mechanical:
new AuthPlugin({}) refuses to boot: secret is required;
- the roster separately requires every entry to land at least one nav id, which
plugin-auth's conditional nav_sso_providers cannot promise.
Only sys_position_detail (from plugin-security, which is in the roster) verifies clean today.
The ruling: option B
⇒ Move the pages.* parity verdict out of the nav gate entirely and onto packages/cli/test/platform-page-i18n-parity.test.ts, which already imports the pages from the @objectstack/platform-objects/pages barrel and needs no boot at all. The nav gate keeps nav; the page test keeps pages. Then translate the three labels.
Ruled by the domain:cli seat at PR #15739 (5549604828), on the four axes with 项目长远合理性 weighted ≥50% per the 2026-09-01 maintainer ruling. The decisive reasoning, from the measuring agent:
the defect class this whole card is about is ONE roster silently serving TWO populations — exactly what produced the ambiguous 0
Option A (split the roster into NAV and PAGE populations, boot plugin-auth with a test secret, exempt pages from the nav-id invariant) was refused: it fixes the symptom by making the same roster serve two populations explicitly, with a hand-carved exemption — the original defect with better documentation — and it needs a credential fixture plus an invariant exemption before it can even run. Three new commitments to translate three strings.
⛔ This is not a governed-surface decision. It concerns where a verdict lives inside packages/cli (scripts/**, packages/cli/**), reverses no ruling, and touches no docs/adr/**. It was ruled by the execution seat rather than escalated, and that boundary is stated so the next reader can check it.
⚠️ Explicitly OUT of scope — do not widen the walk
The other 45 authored labels sit under slots.* and are unreachable by the shared i18n walk. That is not a defect: packages/spec/src/system/translation.zod.ts records the 2026-08-06 maintainer ruling that the inline locale map is a delivered capability, declines content on the bundle face for the identical shape, and defers extractor visibility to #14749.
⛔ Widening the walk here would reverse a standing maintainer ruling in passing. Anyone taking this card must leave packages/spec/src/system/i18n-resolver.ts alone.
Corrections to #14817's numbers, carried forward
- "48 of 48 sit under
slots.*" is 45 of 48 — the other three are page-level label, not under slots, and reachable. Those three are this card.
- "neither plugin has an
i18n-extract.config.ts at all" is false for plugin-security (it exists, baselined at 0). True only for plugin-auth.
Dedup — bounded, and the bound is stated
A pattern sweep (app-nav-i18n / nav roster / pages.* / page-level label / check-app-nav) over a 376-issue snapshot of all open issues taken earlier in this session. One hit: #14817 itself. Two live positive controls passed — the corpus demonstrably contains #14817 and #14749 — so the result is a reading, not a silent zero.
⚠️ The live search channel is rate-limited for this seat right now, and the snapshot predates cards filed in the last hours. Worth one more check when the channel recovers.
Refs: #14817 (the instrument half, PR #15739), #14749 (the deferred extractor-visibility question — ⛔ independent of this card).
Filed unassigned and bare by the
domain:cliexecution PM seat (#6024), from measurements taken by theos-devseat while landing #14817 (PR #15739). ⛔ Not graded here — nodomain:*, no type, no priority.This is the decision half that #14817 deliberately did not carry. That card shipped the decision-free instrument; this is the ruled follow-up.
The debt
Three page-level labels — User / Organization / Position — render in English in every locale. 3 keys × 3 locales = 9 units. They are the only real user-visible debt #14817 found; the other 45 authored labels are unreachable by a standing ruling (see below) and are not in scope here.
Why it is not a one-line translation
Translating them requires a
pages.*bundle entry, and that makescheck:app-nav-i18nRED on two of the three —pages.sys_user_detailandpages.sys_organization_detailcome back as "the booted composition contains no page by that name" (its phantom-key verdict).The cause is that gate's
CONTRIBUTORSroster inpackages/cli/scripts/check-app-nav-i18n.mjs: it is a NAV roster, and@objectstack/plugin-auth— which contributes those two pages — is not in it. Measured, adding it is not mechanical:new AuthPlugin({})refuses to boot:secret is required;plugin-auth's conditionalnav_sso_providerscannot promise.Only
sys_position_detail(fromplugin-security, which is in the roster) verifies clean today.The ruling: option B
⇒ Move the
pages.*parity verdict out of the nav gate entirely and ontopackages/cli/test/platform-page-i18n-parity.test.ts, which already imports the pages from the@objectstack/platform-objects/pagesbarrel and needs no boot at all. The nav gate keeps nav; the page test keeps pages. Then translate the three labels.Ruled by the
domain:cliseat at PR #15739 (5549604828), on the four axes with 项目长远合理性 weighted ≥50% per the 2026-09-01 maintainer ruling. The decisive reasoning, from the measuring agent:Option A (split the roster into NAV and PAGE populations, boot
plugin-authwith a test secret, exempt pages from the nav-id invariant) was refused: it fixes the symptom by making the same roster serve two populations explicitly, with a hand-carved exemption — the original defect with better documentation — and it needs a credential fixture plus an invariant exemption before it can even run. Three new commitments to translate three strings.⛔ This is not a governed-surface decision. It concerns where a verdict lives inside
packages/cli(scripts/**,packages/cli/**), reverses no ruling, and touches nodocs/adr/**. It was ruled by the execution seat rather than escalated, and that boundary is stated so the next reader can check it.The other 45 authored labels sit under
slots.*and are unreachable by the shared i18n walk. That is not a defect:packages/spec/src/system/translation.zod.tsrecords the 2026-08-06 maintainer ruling that the inline locale map is a delivered capability, declinescontenton the bundle face for the identical shape, and defers extractor visibility to #14749.⛔ Widening the walk here would reverse a standing maintainer ruling in passing. Anyone taking this card must leave
packages/spec/src/system/i18n-resolver.tsalone.Corrections to #14817's numbers, carried forward
slots.*" is 45 of 48 — the other three are page-levellabel, not under slots, and reachable. Those three are this card.i18n-extract.config.tsat all" is false forplugin-security(it exists, baselined at 0). True only forplugin-auth.Dedup — bounded, and the bound is stated
A pattern sweep (
app-nav-i18n/nav roster/pages.*/page-level label/check-app-nav) over a 376-issue snapshot of all open issues taken earlier in this session. One hit: #14817 itself. Two live positive controls passed — the corpus demonstrably contains #14817 and #14749 — so the result is a reading, not a silent zero.Refs: #14817 (the instrument half, PR #15739), #14749 (the deferred extractor-visibility question — ⛔ independent of this card).