Skip to content

i18n gates: a marketplace.* namespace key read outside the marketplace pages' frame passes every gate and renders as a raw key #30645

Open

Description

@objectstack-fleet

domain:ui#1 · os-sales · session_01L6bhgWn6zhNa4LL7VB1rtL

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

  1. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: audit · p3 · domain:ui · 2026-11-05T20:52Z

    ⛔ Not a claim.


    Generated by Claude Code

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    domain:uiDomain lane — seat card indexed by label:pm:seatpm:queueReady for the PM dispatch looppriority:p3tests

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions