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: 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
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.
Which label wins (the extension's or the bundle's translation) is the server seat's call, from the existing i18n precedent. Only a genuine divergence goes to the maintainer.
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).
{
"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."
]
}
No server reader disagrees (os-dev-report 6593898980, live on c9636f1e): /meta/object and the app bundle both answer Account (Success Overlay) under zh-CN; CONTROL showcase_project reads 项目. The sidebar's 客户 is the nav entry's own translation key, not the object label.
Activity
objectstack-fleet commentedon Nov 3, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: first-touch audit · p2 kept ·
domain:serverkept ·pm:queue· 2026-11-03T01:54Z⛔ Not a claim.
showcase_accountreads its extension label in every locale, while the bundle holds 客户. p2 kept. Platform-checklist reds get fixed.Generated by Claude Code
objectstack-fleet commentedon Nov 3, 2026
domain:server#1 · os-warren · session_01JQwxbXsK9j25sd7eVwW96G
Claim: PM loop round 3 · card thread · 2026-11-03T02:20Z
Session:
session_01JQwxbXsK9j25sd7eVwW96G(the seat); card threadsession_01JQwxbXrRZT67bZYRELTfgvAccount:
os-warrenBranch:
claude/project-thread-8pmc7pWorktree: the card thread's own container checkout
Domain:
domain:serverSeat:
domain:server#1File surface: UNKNOWN until the measure-first step names it: the object read's localiser and the
object_extensionmerge (expectedpackages/objectql/packages/metadata-protocol/packages/runtimei18n read path), their tests, one.changeset/29675-*.md; ⛔ nopackages/spec, noui/**, noprotocol.tswithout a fresh serial checkContainer & model:
M,mode:thread,model: TIER_DEFAULT(--tiernames no path mandate),effort: project defaultClause-②: 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).
objectstack-fleet commentedon Nov 3, 2026
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
objectstack-fleet commentedon Nov 3, 2026
domain:server#1 · os-warren · session_01JQwxbXsK9j25sd7eVwW96G
Closed · not planned · the measured behaviour is the ruled one · 2026-11-03T02:31Z
/meta/objectread — and neither do extension scalar overrides #8284 maintainer ruling (2026-08-13) and ADR-0029 D9.2a ("an explicit override beats a packaged default"), implemented inpackages/spec/src/system/i18n-resolver.tstranslateObject(catalog applies only while the scalar still equalspackagedBase) and pinned byi18n-resolver.test.tsandpackages/rest/src/meta-object-i18n-explicit-override.test.ts. The showcase label is the Object-extension fold leaks the extension'slabelonto?layers=trueonly — the two reads #7556 reconciled on FIELDS now disagree on LABEL #8037 fixture for exactly this. The card's own Wanted allows this outcome ("If the extension's label is meant to win in every locale, say so, and correct the showcase and the checklist clause instead").c9636f1e):/meta/objectand the app bundle both answerAccount (Success Overlay)under zh-CN; CONTROLshowcase_projectreads 项目. The sidebar's 客户 is the nav entry's own translation key, not the object label.domain:devx) as an addendum row. The showcase stays as is (it is the ruling's fixture).pm:dispatchedremoved in the same stroke.