Skip to content

i18n: an object with an extension label keeps that label in every locale, so Studio shows "Account (Success Overlay)" in zh-CN while the bundle holds 客户 #29675

Closed as not planned

Description

@objectstack-fleet

epic:#28130#1 · hotlong · session_040dfd80c4c9411b895c698e785a6848

Filing gate: ① a measured break. Filed on the maintainer's word in direct chat with the epic PM seat, 2026-11-03: 「发记录并立卡」. ⛔ Not a claim.
QA-source: #29672 · i18n.studio-follows-app-locale · acceptance[2]
Reader: domain:server (the label localisation on the object read). Root cause not read.
Dedupe: Success Overlay, extension label locale. #8037 and #8284 (both closed) are nearby. New.
type: Bug

Measured on main at 3482f3d8d2: GET /api/v1/meta/object/showcase_account?locale=zh-CN answers label: "Account (Success Overlay)". Runner readings, not re-derived: pluralLabel in the same read is 客户; showcase_project reads 项目; the bundle holds objects.showcase_account.label 客户; the app shell's sidebar reads 客户; Studio's rail and header read the English. The label comes from examples/app-showcase/src/data/extensions/account.extension.ts.

Wanted: one rule for which wins when an extension sets a label and a bundle translates it, the same on every read. If the extension's label is meant to win in every locale, say so, and correct the showcase and the checklist clause instead.

Links back: #29672.

Activity

  1. added
    bugSomething isn't working
    area:i18nThe customer's own language, across UI, metadata and notifications
    domain:serverDomain lane — seat card indexed by label:pm:seat
    on Nov 3, 2026
  2. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: first-touch audit · p2 kept · domain:server kept · pm:queue · 2026-11-03T01:54Z

    ⛔ Not a claim.


    Generated by Claude Code

  3. added
    pm:queueReady for the PM dispatch loop
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 3, 2026
  4. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#1 · os-warren · session_01JQwxbXsK9j25sd7eVwW96G

    Claim: PM loop round 3 · card thread · 2026-11-03T02:20Z
    Session: session_01JQwxbXsK9j25sd7eVwW96G (the seat); card thread session_01JQwxbXrRZT67bZYRELTfgv
    Account: os-warren
    Branch: claude/project-thread-8pmc7p
    Worktree: the card thread's own container checkout
    Domain: domain:server
    Seat: domain:server#1
    File surface: UNKNOWN until the measure-first step names it: the object read's localiser and the object_extension merge (expected packages/objectql / packages/metadata-protocol / packages/runtime i18n read path), their tests, one .changeset/29675-*.md; ⛔ no packages/spec, no ui/**, no protocol.ts without a fresh serial check
    Container & model: M, mode:thread, model: TIER_DEFAULT (--tier names no path mandate), effort: project default
    Clause-②: no
    Metadata-protocol: none
    Responsibility: the object read answers an extension's default-locale label in every locale while the bundle holds the translation | the translation bundle path already localises base labels | every non-default-locale user of an object an extension relabels (measured on showcase_account, zh-CN)
    Thread-read: 6593395076
    Premise: holds
    Serial constraints cleared: none known; the card thread names the files at measure-first and re-checks open PRs and live claims before its first edit

    Order: project file pm-orders/server/seat1/order-29675.md (overflow, confirmed for seat 1 by the coordinator).

  5. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#1 · os-warren · session_01JQwxbXrRZT67bZYRELTfgv
    os-dev-report

    {
      "issue": 29675,
      "status": "done",
      "branch": "claude/project-thread-8pmc7p",
      "pr": null,
      "session": "session_01JQwxbXrRZT67bZYRELTfgv",
      "premise_still_valid": false,
      "summary": "No reader disagrees, so the server has nothing to fix and no PR is opened. The extension label winning in every locale is ruled behaviour: translateObject in packages/spec/src/system/i18n-resolver.ts carries the #8284 maintainer ruling of 2026-08-13 ('the catalog applies only while the document's scalar still equals packagedBase's', where packagedBase is the owner's declaration 'BEFORE objectExtensions are folded on'), ADR-0029 D9.2a states 'an explicit override beats a packaged default', and i18n-resolver.test.ts ('a code-shipped extension's scalars beat the catalog — all three') plus packages/rest/src/meta-object-i18n-explicit-override.test.ts (both /meta/object reads, this same showcase_account fixture) pin it. Seat ruled route A from that precedent. Measured live on c9636f1e: the app metadata bundle answers the same object label as GET /meta/object (both 'Account (Success Overlay)' under zh-CN), because meta-app-bundle-routes.ts answers each member through createMetaItemAnswer, the same item chain. The sidebar's 客户 is not the object label: it is the navigation entry nav_accounts' own label 'Accounts' (examples/app-showcase/src/ui/apps/index.ts:52) translated by its own key apps.showcase_app.navigation.nav_accounts.label, so in en the sidebar reads 'Accounts', not the extension label. The card's 'bundle holds objects.showcase_account.label 客户' is the translation bundle's packaged entry, which the ruling deliberately withholds once the label has diverged.",
      "tests": "No code change, so no tests or ablation. Live readings on a booted showcase (objectstack dev --seed-admin, signed in as the dev admin), commit c9636f1e. GET /api/v1/meta/object/showcase_account?locale=zh-CN: label 'Account (Success Overlay)', pluralLabel 客户. Same, no locale: 'Account (Success Overlay)', 'Accounts'. CONTROL GET /api/v1/meta/object/showcase_project?locale=zh-CN: 项目, 项目; no locale: 'Project', 'Projects'. GET /api/v1/meta/app/showcase_app/bundle with Accept-Language zh-CN: objects[showcase_account] 'Account (Success Overlay)' / 客户, objects[showcase_project] 项目 / 项目, navigation nav_accounts 客户, nav_projects 项目. Same with Accept-Language en: 'Account (Success Overlay)' / 'Accounts', 'Project' / 'Projects', nav_accounts 'Accounts', nav_projects 'Projects'. GET /api/v1/i18n/translations/zh-CN: objects.showcase_account.label 客户, apps.showcase_app.navigation.nav_accounts.label 客户. pluralLabel reads 客户 only because the extension sets no pluralLabel, so that scalar still equals the packaged one and the catalog applies, per the same rule.",
      "gates": "node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack :: exit 2, 'this branch changes nothing against origin/main (merge base c9636f1e5) — nothing to derive'. No diff, so no local gates, no pnpm lint, no --ran reconciliation and no CI check-runs. Build for the live boot: os-verify-lock VERDICT command-exit 0 (showcase dependency closure plus cli).",
      "dogfood_battery": "n/a — no PR",
      "mcp_calls": "0",
      "api_writes": "1 — this report comment, POST issues/29675/comments through post-stamped.mjs and the fleet relay. REST reads: 2 (GET issues/29675, GET issues/29675/comments).",
      "open_questions": [],
      "security_findings": "withheld",
      "out_of_scope_findings": [
        "Checklist accuracy, not a product defect: docs/qa/platform-checklist/areas/i18n.json item i18n.studio-follows-app-locale, acceptance clause 2 (index 1, 'no mixed-language session … every string the bundle DOES translate renders translated') and negative[0] judge an object label against the bundle without the #8284 / ADR-0029 D9.2a exception. A label authored over the packaged declaration (a code objectExtensions scalar, or a tenant's Studio rename) is served in its authored text in every locale, so 'Account (Success Overlay)' on Studio's rail and header under zh-CN is expected and should tick, not FAIL. The fix is a clause and negative amendment naming that exception and citing translateObject's docblock. carrier: seat (domain:server#1) · noted, not filed. Dedupe words: studio-follows-app-locale, explicit override, Success Overlay."
      ]
    }

    Generated by Claude Code

  6. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#1 · os-warren · session_01JQwxbXsK9j25sd7eVwW96G

    Closed · not planned · the measured behaviour is the ruled one · 2026-11-03T02:31Z

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

    area:i18nThe customer's own language, across UI, metadata and notificationsbugSomething isn't workingdomain:serverDomain lane — seat card indexed by label:pm:seatpriority:p2Medium: important, M3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions