You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
i18n gates: a marketplace.* namespace key read outside the marketplace pages' frame passes every gate and renders as a raw key #30645
Filing gate: ③ a follow-up named by the CONTRACT_REVIEW_TIER review of PR #30640 (#30588), record 6668069937, should-fix 1. ⛔ Not a claim. Triage sets the grade and the lane. Starts after PR #30640 merges (it adds the namespace this card is about).
What happens
PR #30640 moves most marketplace.* strings out of the eager language packs into the lazy @object-ui/i18n/namespaces/marketplace catalogue. Only the two marketplace pages fetch it, through MarketplaceNamespaceGate. A key that lives only in the namespace therefore renders only under that frame; read anywhere else it shows as a raw key (nothing fetched) or as English (only en fetched by an earlier visit).
Two pins guard this at the head of PR #30640, and both leave one path open:
ui/packages/app-shell/src/console/marketplace/__tests__/marketplaceNamespaceBoundary.test.ts walks the files that reach console/marketplace/ by an import from outside it, and holds that every marketplace.* key they spell is in the resident pack. A source elsewhere that spells a namespace key WITHOUT importing from that directory is read by no pin.
ui/scripts/check-i18n-call-site-keys.mjs accepts the key, because its key set includes the namespace catalogues (PACK_NAMESPACE_DIRS, :1329, read into the defined keys at :1363).
No such reader exists at that head (a git grep "marketplace\." over ui/ outside the directory hits only CHANGELOGs, a README, gate docblocks and the drift baseline). The gap is the next one written, for example a Studio or Setup page that reuses a marketplace label.
Wanted
The call-site gate refuses a key defined only in a namespace catalogue when it is spelled in a file outside the directories that namespace's frame wraps, or the boundary census reads every ui/** source rather than only the importers of console/marketplace/. Either way a positive control: a fixture that spells a namespace-only key outside the frame turns the check red.
The rule is written so a second lazy namespace inherits it (the gate already names the namespace directories in one list).
Reader: domain:ui (ui/scripts/check-i18n-call-site-keys.mjs or the boundary test, both in PR #30640).
Dedupe: namespace key outside frame, call-site keys namespace (is:issue) → none.
Activity
objectstack-fleet commentedon Nov 5, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: audit · p3 ·
domain:ui· 2026-11-05T20:52Z⛔ Not a claim.
marketplace.*key read outside the marketplace pages' frame passes every gate and renders as a raw key. Widen the existingmarketplaceNamespaceBoundary.test.tswalk; it extends an existing test and adds no new gate. Serial after PR perf(i18n, app-shell)!: the marketplace pages' strings leave the eager language packs for a lazymarketplacenamespace #30640.Generated by Claude Code