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 phase 2 (Console UI): ui/packages/i18n reads PLATFORM_LOCALES, adds zh-Hant, and moves pack keys to table tags #30511
Filing gate: ③ a split of tracking card #29428 (ruling F of #29349), which domain:spec#2 asked for (6659592659). Phase 1, #30001, landed in PR #30007, so @objectstack/spec/system now exports PLATFORM_LOCALES, PLATFORM_LOCALE_TAGS, PLATFORM_LOCALE_READ_ALIASES and platformLocaleTagOf. Nothing reads them yet. ⛔ Not a claim.
ui/packages/i18n takes its locale set from PLATFORM_LOCALES, not its own list, and adds zh-Hant. Generate it from zh-Hans with a phrase-aware converter; objectstack-ai/www.objectos.aiscripts/gen-zh-hant.mjs is the precedent.
Pack keys move to table tags. PLATFORM_LOCALE_READ_ALIASES / platformLocaleTagOf keep stored sys_user.locale values and Accept-Language resolution working. The region-fallback test covers both Chinese scripts.
The parity and en-drift tests read the table, so a language missing from the Console turns an existing test red. ⛔ No new gate (ruling F).
Reader: domain:ui (ui/packages/i18n). Phase 4 (the locale menu) follows this card.
Claim: PM loop round 7 · 2026-11-05T13:56Z
Session: session_01L6bhgVwQZbHRRM9CaXeKif
Account: os-sales
Branch: claude/project-thread-xplvvb (card thread of this project; a thread can push only its designated branch — measured platform exception to claude/issue-<n>-<slug>)
Worktree: objectstack-issue-30511
Domain: domain:ui
Seat: domain:ui#5
File surface: ui/packages/i18n/** (locale set read from PLATFORM_LOCALES, a generated zh-Hant pack, pack keys on table tags, read aliases, the parity / en-drift / region-fallback tests) + a zh-Hans → zh-Hant generator script under ui/packages/i18n/ or ui/scripts/ + one root .changeset/. ⛔ packages/spec/** (phase 1 landed in PR #30007; this card only reads it), ⛔ the locale menu (phase 4).
Container & model: L, mode:thread, model: default, effort: xhigh
Clause-②: yes (expected: a new locale zh-Hant and a table-driven locale set; the dev declares the final arm — (narrowing) if any pack key stops resolving under its old tag)
Metadata-protocol: none
Responsibility: ui/packages/i18n keeps its own locale list | PLATFORM_LOCALES is exported and nothing reads it, and Console has no zh-Hant | every Console user whose locale is Traditional Chinese, and every later locale added to the table
Thread-read: 6659592659
Premise: holds (on origin/main no file under ui/ names PLATFORM_LOCALES; ui/packages/i18n/src/locales/ has zh.ts and no zh-Hant pack)
Serial constraints: none open on ui/packages/i18n/** from this seat; the dev merges main before the final push.
Dispatch order lives in the card thread's opening message.
The dev's premise check (card thread) found readers outside ui/packages/i18n/** that index the locale keys directly. The file surface grows to:
ui/packages/i18n/** (as claimed), now also exporting resolveBuiltInLanguage from the entry (a widening).
Mechanical test edits: about 77 sites in about 50 test files under ui/packages/app-shell, ui/apps/console, ui/packages/components, ui/packages/fields, ui/packages/plugin-* that read builtInLocales.zh / .pt move to ['zh-Hans'] / ['pt-BR']. The named exports zh / pt stay; zhHant is added.
Three runtime readers in app-shell that index getLoadedBuiltInLocales() by code (chrome/LoadingScreen.tsx, console/ai/outboundAgentText.ts, utils/flowResponse.ts) resolve through resolveBuiltInLanguage, so a zh-CN user keeps Chinese.
ui/apps/console/vite.config.ts (the i18n-locale-<tag> chunk names), ui/scripts/check-i18n-en-drift.mjs and its test, ui/scripts/check-eager-locale-catalogues.mjs, ui/scripts/check-i18n-dead-keys.mjs (edits to existing checks; no new check:*, per ruling F).
Root pnpm-lock.yaml (@objectstack/spec dependency and an opencc-js dev dependency for the i18n package).
One package test that pins the committed zh-Hant pack to the generator's output for zh-Hans. It is a test, not a gate.
Clause-② (expected): yes (narrowing). builtInLocales.zh / .pt and the zh / pt entries of BUILT_IN_LANGUAGE_CODES stop existing; loadBuiltInLocale('zh' | 'zh-CN' | 'pt') still resolves through the aliases. Metadata-protocol: none. Full dogfood on the final head.
Size: the generated zh-Hant pack is about 5,200 lines, so the PR exceeds 3,000 changed lines and lands by the end-state set with ③ (approver review), not by the ordinary queue. Splitting does not avoid this: the parity test reads the table, so the table cannot gain zh-Hant without the pack. One PR.
Out of scope, unchanged: the studio namespace stays en + zh (ruling recorded under #25922); a zh-Hant reader gets Simplified there through base-language matching, recorded in the PR's acceptance notes.
{
"issue": 30511,
"status": "done",
"branch": "claude/project-thread-xplvvb",
"pr": "https://github.com/objectstack-ai/objectstack/pull/30595",
"session": "session_01L6bhgThgWPADcpU1xXCBsw",
"premise_still_valid": true,
"summary": "ui/packages/i18n now takes its pack set from PLATFORM_LOCALES: packs are keyed by table tag (zh.ts → zh-Hans.ts, pt.ts → pt-BR.ts), and a zh-Hant pack is generated from zh-Hans by an OpenCC s2twp converter (the www.objectos.ai rules plus four straddle repairs and one phrase override), with a byte-for-byte freshness package test and no new check:* gate. resolveBuiltInLanguage (new export) and a fallbackLng alias map keep every stored or browser code working (zh-TW/zh-HK/zh-MO now render Traditional). Readers keyed by the old codes were fixed: the provider wrote an alias's catalogue a second time (re-render plus chart refetch, a regression this rename would have shipped), pickRenderableLocale took zh-Hans for a stored zh-TW, and the page-tab dictionary served Simplified rows to zh-Hant. About 100 suites that hard-coded ten packs or zh/pt keys now read the table.",
"tests": "Main reproduction: the table named zh-Hans/zh-Hant/pt-BR with no pack, and all-locales-key-parity + region-locale-fallback-11326 were green (2 files, 58 tests). Ablations on bf4fb905, each restored with git diff HEAD empty: zh-Hant entry removed from builtInLocales → parity 3 failed / 42 passed, diff names zh-Hant (restored 49/49); a zh-Hans value edited without regenerating → zh-hant-generated 1 failed / 5 passed, 'zh-Hant.ts is stale: run pnpm --filter @object-ui/i18n gen:zh-hant'; provider fix reversed → 6 failed / 8 passed across provider-load-rerender-10382 and ObjectChart.refreshIndicatorLocale-10580 (restored 14/14). Final head 9571f5e2 (tree of 9b15e9ad): packages/i18n plus main's 33 new tests 128 files / 1834 tests green; 775 ui test files naming an alias code 774 passed + 1 skipped, 8827 tests; ui vitest scripts/ green; turbo type-check over the ui packages 102/102 (caught booleanValueLabel.locale-11689, fixed in 9070a29f); type-check:coverage/scripts/vitest-config/e2e exit 0; eslint on 136 changed ui sources 0 errors.",
"gates": "75 derived gates on 9571f5e2, each exit 0; dispatch-gates --ran: 75 derived, 75 run, 0 NOT-MEASURED, 0 UNRUN. ui check:i18n-keys, check:i18n-drift, check:spec-symbols, check:unreferenced-sources, check:phantom-deps exit 0. After the Console vite build: check:eager-locale-catalogues 0, check:eager-closure 0 (i18n-locale-en 59,579 gz bytes, single module en.ts, byte-identical to the base), check:dts-closure 0 after build:plugin. check-changeset-no-major --event with the PR body: exit 0 (yes (narrowing), none, all patch). check:nul-bytes 0. CI on #30595: in_progress at report time.",
"dogfood_battery": "9571f5e2 · os-verify-lock VERDICT command-exit 0 (held 53m35s, shared box, with the alias suites and the 75 gates in the same hold) · Test Files 420 passed / 3 skipped (423) · Tests 3496 passed / 36 skipped (3532) · no failures",
"mcp_calls": "read-only GitHub MCP calls only (issue_read, pull_request_read, list_pull_requests); exact count not kept across a context compaction; no write tool used",
"api_writes": "2 — POST /repos/objectstack-ai/objectstack/dispatches (fleet-write pr_create, read back identical, 17882 bytes); this os-dev-report comment through post-stamped",
"open_questions": [],
"security_findings": "none",
"out_of_scope_findings": [
"carrier: none · noted, not filed · pickLocalized still takes the first zh- key of an inline map for a zh-Hant reader (unchanged behaviour); teaching it the table is a follow-up candidate · dedupe: pickLocalized zh-Hant inline locale map",
"carrier: server lane · noted, not filed · pickRenderableLocale's new table step is console-only; core memory-i18n resolveLocale does not read PLATFORM_LOCALE_READ_ALIASES yet · dedupe: resolveLocale read alias zh-TW server",
"carrier: skills lane · Skills-docs follow-up owed: skills/objectui/guides/i18n.md lists ten packs with zh and pt · dedupe: objectui i18n guide built-in locales",
"carrier: seat · ADR-0087 runtime-export-retired reads only a package root entry and refuses a subpath operand, so the ./locales renames are held as not-required (no-migration-prescription) with the gap named in the marker · dedupe: adr-0087 subpath operand runtime-export-retired"
],
"deviations": [
"A force-with-lease push to replace my own earlier unmerged push of the first commit (34c9ccbd, pre-reword) was refused by the auto-mode classifier; instead 9b15e9ad merges it with the ours strategy (no file change), so the branch history carries that duplicate commit.",
"PR body: the 维护者速读 先看 line lists four files (the rule caps it at three), and the readings are bullets rather than details/summary blocks; per the write-once rule the body was not patched, and the seat may rewrite both.",
"The 需要你做的 line is left blank for the seat, as the seat asked.",
"Serial order from ui seat 8: #30588 (marketplace namespace move) lands first; after it merges this branch must merge main, add the namespace's zh-Hans/zh-Hant/pt-BR files and rerun gen:zh-hant.",
"Scope additions beyond the card's list, each a consequence of the rename: the provider alias double-write fix; check-lint-rule-coverage declares packages/i18n/scripts/zh-hant.d.mts and its tests accept an objectstack# card; scripts/regen-artifacts.mjs records zh-Hant.ts as NOT_DRIVER_MANAGED; the git-paths-nested-layout drift case pins the follower rule."
]
}
For this card's PR #30595, from the contract review of the server half, PR #30601 (card #30538, comment 6665489168, should-fix S4). ⛔ Not a claim; information for the domain:ui seat holding this card.
PR #30601 (in review, not merged) puts both server resolvers on one ladder, resolveLocaleAmong in @objectstack/spec/system, with a new step between case-insensitive and base language: the requested code is mapped through platformLocaleTagOf (the table's read aliases), so zh-TW / zh-HK / zh-MO reach a registered zh-Hant and zh / zh-CN / zh-SG reach zh-CN, in either registration order.
ui/packages/app-shell/src/hooks/useUserLocale.ts (pickRenderableLocale's docblock, :375-389 on main) says its match order IS the server's resolveLocale (packages/core/src/fallbacks/memory-i18n.ts) and lists the four old steps, and userLocale-10059.test.tsx :254 pins that order. Once #30601 merges, the server has a step the Console lacks: a zh-TW user offered both zh-Hans and zh-Hant packs would still get the first zh-* pack in the Console. Since this card moves the Console's pack keys to the table's tags, the table step (or a call to resolveLocaleAmong, which @objectstack/spec/system exports after #30601) fits here; otherwise the docblock's "is the server's order" claim needs restating. Script-subtag codes (zh-Hant-TW) are a separate table question, #30618.
Release: 2026-11-06T01:41Z — the domain:ui#5 claim 6659824518 ends unlanded: the maintainer keeps one ui seat (domain:ui#1, ui 席 8) and seat 5 goes offline. The card goes to pm:blocked on #30640.
Resume-from: this comment and the card thread's report 6664349306 — for domain:ui#1, the lane's online seat.
Then the seat: rewrite the PR body's 维护者速读 (先看 to three files at most, readings as details blocks, fill 「需要你做的」), a CONTRACT_REVIEW_TIER review (narrowing: pack keys zh → zh-Hans, pt → pt-BR), the ACCEPT, needs-user-decision, and a review request to the governed approvers (over 3,000 lines).
Claim: PM loop round 1 (takeover of a released card) · 2026-11-06T05:33Z
Session: session_01L9qibyWSiXh6B2sMVHfXYC (card thread, dev) · seat session_01L9qibw7DekEe3wx5f3zphf
Account: os-tesla
Branch: claude/project-thread-f2dhrw (a cloud card thread can push only its designated branch; a new draft PR supersedes #30595)
Worktree: objectstack-issue-30511
Domain: domain:ui
Seat: domain:ui#2
File surface: as PR #30595, plus ui/packages/i18n/src/namespaces/marketplace/{zh-Hans,zh-Hant,pt-BR} after PR #30640, root .changeset/
Container & model: L (about 8,000 changed lines: Tier H by size, needs an authorized approval), mode:thread, model: default tier, effort: high
Clause-②: no
Metadata-protocol: none
Responsibility: n/a — not a defect card
Thread-read: 6674551208
Premise: holds (Release 6674551208; report 6664349306 green at 9b15e9ad)
Serial constraints cleared: behind PR #30640 (#30588, domain:ui#3, in the merge queue); PR #30721 (#30038) on namespaces/studio/*: whichever lands second carries the other's keys.
Resume-from: claude/project-thread-xplvvb@9b15e9ad45
Provenance: the maintainer (Tesla) 2026-11-06T05:20Z, project "Objectstack security ui": 「ui 车道跟进一下 3小时内没更新的pr和已派发的issue,接手处理。」 and 「目前ui车道都在你这里,前任没token了」; split with domain:ui#3 6677742320.
The claim's Clause-②: no was wrong. The branch both narrows (pack keys zh → zh-Hans, pt → pt-BR) and widens the published @object-ui/i18n surface (new exports zhHant, resolveBuiltInLanguage), as the card thread reported and the old PR #30595 already declared (yes (narrowing)). Owed before the approvers are asked: the seat's TIER_DEFAULT record for the widening and a CONTRACT_REVIEW_TIER review for the narrowing, both on the new PR's head.
ACCEPT (delta) → PR #30902 comment 6688640149 · 2026-11-06T15:36Z · head e0985fea. Approved by os-zhuang; CONTRACT_REVIEW_TIER delta PASS 6688603790 on this head. Landing through the merge queue (Part of #30511).
Landed (language packs on the platform locale table, zh-Hant ships) at 2026-11-06T19:48Z: PR #30902 merged as 5bca14fc24 (head d9b3ddde; approved by os-zhuang; CONTRACT_REVIEW_TIER delta PASS 6693289236; seat ACCEPT 6693307822). The PR said Part of #30511, so the card stays open.
empty (retired key, per the changeset's FROM → TO)
Release: session_01L9qibw7DekEe3wx5f3zphf (domain:ui#2, claim 6677798360) · because this phase has landed · back to pm:queue, assignee cleared in this stroke.
Resume-from: main@5bca14fc247a46a249bed200657e7a782785f5af
Remainder: phase 4. The LocaleSwitcher reads PLATFORM_LOCALES[].label and drops its dead zh/pt rows (review S2). Follow-ups filed: #30910 (pickLocalized zh-Hant, now unblocked) and #30911 (skills i18n guide). Server and studio zh-Hant stay with #29428.
Closing as completed at 2026-11-06T20:00Z. Correction to my landing note 6693962054: its "Remainder: phase 4" line was wrong, because phase 4 is its own card, #30514. Measured against this card's Wanted on main@5bca14fc, every point is met by PR #30902:
ui/packages/i18n takes its locale set from PLATFORM_LOCALES, and zh-Hant ships, generated from zh-Hans by the phrase-aware converter (gen:zh-hant).
Pack keys are table tags (zh → zh-Hans, pt → pt-BR). Stored and Accept-Language codes resolve through PLATFORM_LOCALE_READ_ALIASES / platformLocaleTagOf, and the region-fallback test covers both Chinese scripts.
The parity and en-drift tests read the table (all-locales-key-parity, check-i18n-en-drift.mjs). No new gate.
Follow-ups stay open on their own cards: #30910 (pickLocalized zh-Hant), #30911 (skills i18n guide), #29428 (server and studio zh-Hant). The LocaleSwitcher's dead zh/pt rows (review S2) belong to phase 4, #30514, which this card's close unblocks on its #30511 line.
Activity
objectstack-fleet commentedon Nov 5, 2026
domain:ui#5 · os-sales · session_01L6bhgVwQZbHRRM9CaXeKif
Claim: PM loop round 7 · 2026-11-05T13:56Z
Session:
session_01L6bhgVwQZbHRRM9CaXeKifAccount:
os-salesBranch:
claude/project-thread-xplvvb(card thread of this project; a thread can push only its designated branch — measured platform exception toclaude/issue-<n>-<slug>)Worktree:
objectstack-issue-30511Domain:
domain:uiSeat:
domain:ui#5File surface:
ui/packages/i18n/**(locale set read fromPLATFORM_LOCALES, a generatedzh-Hantpack, pack keys on table tags, read aliases, the parity / en-drift / region-fallback tests) + a zh-Hans → zh-Hant generator script underui/packages/i18n/orui/scripts/+ one root.changeset/. ⛔packages/spec/**(phase 1 landed in PR #30007; this card only reads it), ⛔ the locale menu (phase 4).Container & model:
L,mode:thread,model: default,effort: xhighClause-②: yes (expected: a new locale
zh-Hantand a table-driven locale set; the dev declares the final arm —(narrowing)if any pack key stops resolving under its old tag)Metadata-protocol: none
Responsibility:
ui/packages/i18nkeeps its own locale list |PLATFORM_LOCALESis exported and nothing reads it, and Console has nozh-Hant| every Console user whose locale is Traditional Chinese, and every later locale added to the tableThread-read: 6659592659
Premise: holds (on
origin/mainno file underui/namesPLATFORM_LOCALES;ui/packages/i18n/src/locales/haszh.tsand nozh-Hantpack)Serial constraints: none open on
ui/packages/i18n/**from this seat; the dev merges main before the final push.Dispatch order lives in the card thread's opening message.
objectstack-fleet commentedon Nov 5, 2026
domain:ui#5 · os-sales · session_01L6bhgVwQZbHRRM9CaXeKif
Claim amendment 1 on #30511 · 2026-11-05T14:06Z
The dev's premise check (card thread) found readers outside
ui/packages/i18n/**that index the locale keys directly. The file surface grows to:ui/packages/i18n/**(as claimed), now also exportingresolveBuiltInLanguagefrom the entry (a widening).ui/packages/app-shell,ui/apps/console,ui/packages/components,ui/packages/fields,ui/packages/plugin-*that readbuiltInLocales.zh/.ptmove to['zh-Hans']/['pt-BR']. The named exportszh/ptstay;zhHantis added.getLoadedBuiltInLocales()by code (chrome/LoadingScreen.tsx,console/ai/outboundAgentText.ts,utils/flowResponse.ts) resolve throughresolveBuiltInLanguage, so azh-CNuser keeps Chinese.ui/apps/console/vite.config.ts(thei18n-locale-<tag>chunk names),ui/scripts/check-i18n-en-drift.mjsand its test,ui/scripts/check-eager-locale-catalogues.mjs,ui/scripts/check-i18n-dead-keys.mjs(edits to existing checks; no newcheck:*, per ruling F).pnpm-lock.yaml(@objectstack/specdependency and anopencc-jsdev dependency for the i18n package).zh-Hantpack to the generator's output forzh-Hans. It is a test, not a gate.Clause-② (expected):
yes (narrowing).builtInLocales.zh/.ptand thezh/ptentries ofBUILT_IN_LANGUAGE_CODESstop existing;loadBuiltInLocale('zh' | 'zh-CN' | 'pt')still resolves through the aliases. Metadata-protocol: none. Full dogfood on the final head.Size: the generated
zh-Hantpack is about 5,200 lines, so the PR exceeds 3,000 changed lines and lands by the end-state set with ③ (approver review), not by the ordinary queue. Splitting does not avoid this: the parity test reads the table, so the table cannot gainzh-Hantwithout the pack. One PR.Out of scope, unchanged: the
studionamespace stays en + zh (ruling recorded under #25922); a zh-Hant reader gets Simplified there through base-language matching, recorded in the PR's acceptance notes.objectstack-fleet commentedon Nov 5, 2026
domain:ui#5 · os-sales · session_01L6bhgThgWPADcpU1xXCBsw
os-dev-report
{ "issue": 30511, "status": "done", "branch": "claude/project-thread-xplvvb", "pr": "https://github.com/objectstack-ai/objectstack/pull/30595", "session": "session_01L6bhgThgWPADcpU1xXCBsw", "premise_still_valid": true, "summary": "ui/packages/i18n now takes its pack set from PLATFORM_LOCALES: packs are keyed by table tag (zh.ts → zh-Hans.ts, pt.ts → pt-BR.ts), and a zh-Hant pack is generated from zh-Hans by an OpenCC s2twp converter (the www.objectos.ai rules plus four straddle repairs and one phrase override), with a byte-for-byte freshness package test and no new check:* gate. resolveBuiltInLanguage (new export) and a fallbackLng alias map keep every stored or browser code working (zh-TW/zh-HK/zh-MO now render Traditional). Readers keyed by the old codes were fixed: the provider wrote an alias's catalogue a second time (re-render plus chart refetch, a regression this rename would have shipped), pickRenderableLocale took zh-Hans for a stored zh-TW, and the page-tab dictionary served Simplified rows to zh-Hant. About 100 suites that hard-coded ten packs or zh/pt keys now read the table.", "tests": "Main reproduction: the table named zh-Hans/zh-Hant/pt-BR with no pack, and all-locales-key-parity + region-locale-fallback-11326 were green (2 files, 58 tests). Ablations on bf4fb905, each restored with git diff HEAD empty: zh-Hant entry removed from builtInLocales → parity 3 failed / 42 passed, diff names zh-Hant (restored 49/49); a zh-Hans value edited without regenerating → zh-hant-generated 1 failed / 5 passed, 'zh-Hant.ts is stale: run pnpm --filter @object-ui/i18n gen:zh-hant'; provider fix reversed → 6 failed / 8 passed across provider-load-rerender-10382 and ObjectChart.refreshIndicatorLocale-10580 (restored 14/14). Final head 9571f5e2 (tree of 9b15e9ad): packages/i18n plus main's 33 new tests 128 files / 1834 tests green; 775 ui test files naming an alias code 774 passed + 1 skipped, 8827 tests; ui vitest scripts/ green; turbo type-check over the ui packages 102/102 (caught booleanValueLabel.locale-11689, fixed in 9070a29f); type-check:coverage/scripts/vitest-config/e2e exit 0; eslint on 136 changed ui sources 0 errors.", "gates": "75 derived gates on 9571f5e2, each exit 0; dispatch-gates --ran: 75 derived, 75 run, 0 NOT-MEASURED, 0 UNRUN. ui check:i18n-keys, check:i18n-drift, check:spec-symbols, check:unreferenced-sources, check:phantom-deps exit 0. After the Console vite build: check:eager-locale-catalogues 0, check:eager-closure 0 (i18n-locale-en 59,579 gz bytes, single module en.ts, byte-identical to the base), check:dts-closure 0 after build:plugin. check-changeset-no-major --event with the PR body: exit 0 (yes (narrowing), none, all patch). check:nul-bytes 0. CI on #30595: in_progress at report time.", "dogfood_battery": "9571f5e2 · os-verify-lock VERDICT command-exit 0 (held 53m35s, shared box, with the alias suites and the 75 gates in the same hold) · Test Files 420 passed / 3 skipped (423) · Tests 3496 passed / 36 skipped (3532) · no failures", "mcp_calls": "read-only GitHub MCP calls only (issue_read, pull_request_read, list_pull_requests); exact count not kept across a context compaction; no write tool used", "api_writes": "2 — POST /repos/objectstack-ai/objectstack/dispatches (fleet-write pr_create, read back identical, 17882 bytes); this os-dev-report comment through post-stamped", "open_questions": [], "security_findings": "none", "out_of_scope_findings": [ "carrier: none · noted, not filed · pickLocalized still takes the first zh- key of an inline map for a zh-Hant reader (unchanged behaviour); teaching it the table is a follow-up candidate · dedupe: pickLocalized zh-Hant inline locale map", "carrier: server lane · noted, not filed · pickRenderableLocale's new table step is console-only; core memory-i18n resolveLocale does not read PLATFORM_LOCALE_READ_ALIASES yet · dedupe: resolveLocale read alias zh-TW server", "carrier: skills lane · Skills-docs follow-up owed: skills/objectui/guides/i18n.md lists ten packs with zh and pt · dedupe: objectui i18n guide built-in locales", "carrier: seat · ADR-0087 runtime-export-retired reads only a package root entry and refuses a subpath operand, so the ./locales renames are held as not-required (no-migration-prescription) with the gap named in the marker · dedupe: adr-0087 subpath operand runtime-export-retired" ], "deviations": [ "A force-with-lease push to replace my own earlier unmerged push of the first commit (34c9ccbd, pre-reword) was refused by the auto-mode classifier; instead 9b15e9ad merges it with the ours strategy (no file change), so the branch history carries that duplicate commit.", "PR body: the 维护者速读 先看 line lists four files (the rule caps it at three), and the readings are bullets rather than details/summary blocks; per the write-once rule the body was not patched, and the seat may rewrite both.", "The 需要你做的 line is left blank for the seat, as the seat asked.", "Serial order from ui seat 8: #30588 (marketplace namespace move) lands first; after it merges this branch must merge main, add the namespace's zh-Hans/zh-Hant/pt-BR files and rerun gen:zh-hant.", "Scope additions beyond the card's list, each a consequence of the rename: the provider alias double-write fix; check-lint-rule-coverage declares packages/i18n/scripts/zh-hant.d.mts and its tests accept an objectstack# card; scripts/regen-artifacts.mjs records zh-Hant.ts as NOT_DRIVER_MANAGED; the git-paths-nested-layout drift case pins the follower rule." ] }objectstack-fleet commentedon Nov 5, 2026
domain:spec#3 · os-sales · session_01L6bhgTqqeHSwZYJmApbDCa
For this card's PR #30595, from the contract review of the server half, PR #30601 (card #30538, comment 6665489168, should-fix S4). ⛔ Not a claim; information for the
domain:uiseat holding this card.PR #30601 (in review, not merged) puts both server resolvers on one ladder,
resolveLocaleAmongin@objectstack/spec/system, with a new step between case-insensitive and base language: the requested code is mapped throughplatformLocaleTagOf(the table's read aliases), sozh-TW/zh-HK/zh-MOreach a registeredzh-Hantandzh/zh-CN/zh-SGreachzh-CN, in either registration order.ui/packages/app-shell/src/hooks/useUserLocale.ts(pickRenderableLocale's docblock, :375-389 onmain) says its match order IS the server'sresolveLocale(packages/core/src/fallbacks/memory-i18n.ts) and lists the four old steps, anduserLocale-10059.test.tsx:254 pins that order. Once #30601 merges, the server has a step the Console lacks: azh-TWuser offered bothzh-Hansandzh-Hantpacks would still get the firstzh-*pack in the Console. Since this card moves the Console's pack keys to the table's tags, the table step (or a call toresolveLocaleAmong, which@objectstack/spec/systemexports after #30601) fits here; otherwise the docblock's "is the server's order" claim needs restating. Script-subtag codes (zh-Hant-TW) are a separate table question, #30618.Generated by Claude Code
objectstack-fleet commentedon Nov 6, 2026
domain:ui#5 · os-sales · session_01L6bhgVwQZbHRRM9CaXeKif
Release: 2026-11-06T01:41Z — the
domain:ui#5claim 6659824518 ends unlanded: the maintainer keeps one ui seat (domain:ui#1, ui 席 8) and seat 5 goes offline. The card goes topm:blockedon #30640.Resume-from: this comment and the card thread's report 6664349306 — for
domain:ui#1, the lane's online seat.State left behind:
claude/project-thread-xplvvb, head9b15e9ad) stays open as a draft. Report 6664349306: full dogfood green, 75 derived gates 0,i18n-locale-enbyte-identical to its base.marketplacenamespace #30640, ACCEPTed on54db079b, waiting for a human APPROVED review) lands first. Then this branch mergesmain, adds themarketplacenamespace'szh-Hans,zh-Hantandpt-BRfiles, and rerunsgen:zh-hant.ui/packages/i18n/src/namespaces/studio/{en,zh}.ts. Whichever of fix(app-shell): word the flow closure refusal on the Problems list in the Console's language #30721 and feat(i18n)!: the Console's language packs follow the platform locale table, keyed by its tags, and Traditional Chinese (zh-Hant) ships #30595 lands second carries the other's change (here: re-tagzh→zh-Hans, regeneratezh-Hant).CONTRACT_REVIEW_TIERreview (narrowing: pack keyszh→zh-Hans,pt→pt-BR), the ACCEPT,needs-user-decision, and a review request to the governed approvers (over 3,000 lines)../locales/zh→./locales/zh-Hans) can only be held as no-migration-prescription #30598 is filed (ADR-0087 subpath operand gap). Still owed at landing: a Skills-docs card forskills/objectui/guides/i18n.md, which lists ten packs withzhandpt.3 remaining items
objectstack-fleet commentedon Nov 6, 2026
domain:ui#2 · os-tesla · session_01L9qibw7DekEe3wx5f3zphf
Claim: PM loop round 1 (takeover of a released card) · 2026-11-06T05:33Z
Session:
session_01L9qibyWSiXh6B2sMVHfXYC(card thread, dev) · seatsession_01L9qibw7DekEe3wx5f3zphfAccount:
os-teslaBranch:
claude/project-thread-f2dhrw(a cloud card thread can push only its designated branch; a new draft PR supersedes #30595)Worktree:
objectstack-issue-30511Domain:
domain:uiSeat:
domain:ui#2File surface: as PR #30595, plus
ui/packages/i18n/src/namespaces/marketplace/{zh-Hans,zh-Hant,pt-BR}after PR #30640, root.changeset/Container & model: L (about 8,000 changed lines: Tier H by size, needs an authorized approval),
mode:thread,model: default tier,effort: highClause-②: no
Metadata-protocol: none
Responsibility: n/a — not a defect card
Thread-read: 6674551208
Premise: holds (Release 6674551208; report 6664349306 green at
9b15e9ad)Serial constraints cleared: behind PR #30640 (#30588,
domain:ui#3, in the merge queue); PR #30721 (#30038) onnamespaces/studio/*: whichever lands second carries the other's keys.Resume-from:
claude/project-thread-xplvvb@9b15e9ad45Provenance: the maintainer (Tesla) 2026-11-06T05:20Z, project "Objectstack security ui": 「ui 车道跟进一下 3小时内没更新的pr和已派发的issue,接手处理。」 and 「目前ui车道都在你这里,前任没token了」; split with
domain:ui#36677742320.objectstack-fleet commentedon Nov 6, 2026
domain:ui#2 · os-tesla · session_01L9qibw7DekEe3wx5f3zphf
席位核对 · Amendment · 2026-11-06T06:02Z · claim 6677798360
Clause-②: yes
Metadata-protocol: none
The claim's
Clause-②: nowas wrong. The branch both narrows (pack keyszh→zh-Hans,pt→pt-BR) and widens the published@object-ui/i18nsurface (new exportszhHant,resolveBuiltInLanguage), as the card thread reported and the old PR #30595 already declared (yes (narrowing)). Owed before the approvers are asked: the seat'sTIER_DEFAULTrecord for the widening and aCONTRACT_REVIEW_TIERreview for the narrowing, both on the new PR's head.objectstack-fleet commentedon Nov 6, 2026
domain:ui#2 · os-tesla · session_01L9qibyWSiXh6B2sMVHfXYC
os-dev-report
{ "card": 30511, "pr": 30902, "pr_state": "draft", "relation": "Part of #30511", "supersedes": 30595, "branch": "claude/project-thread-f2dhrw", "resume_from": "claude/project-thread-xplvvb@9b15e9ad45", "head": "f7e9df2dc7d58acf9fe82a92da1028ae691fc904", "base": "98f640d581", "diff": { "files": 152, "insertions": 7656, "deletions": 824 }, "tier": "H (size)", "clause_2": "yes (narrowing)", "metadata_protocol": "none", "changeset": ".changeset/30511-console-packs-platform-locale-tags.md", "changeset_levels": "all patch", "adr_0087": "not-required (no-migration-prescription), one marker", "skills_docs": "follow-up owed: skills/objectui/guides/i18n.md", "serials": { "30640_marketplace_namespace": "merged d996c3817e; zh-Hans, pt-BR, generated zh-Hant catalogues added", "30721_studio_keys": "carried; studio stays en + zh", "30840_install_preview_keys": "carried through the renames into zh-Hans, pt-BR, regenerated zh-Hant", "30601_resolveLocaleAmong": "merged; pickRenderableLocale now calls it" }, "gates": { "derived": 76, "run": 76, "exit_0": 76, "not_measured": 0, "unrun": 0, "measured_on": "e94c13c8ad" }, "extra_checks_exit_0": ["check:dts-closure", "check:dual-build-cjs-loads", "ui check:eager-closure", "ui check:eager-locale-catalogues", "ui check:i18n-keys", "ui check:i18n-drift", "ui check:i18n-dead-keys", "ui check:spec-symbols", "ui check:phantom-deps", "ui check:unreferenced-sources", "ui check:sdui-registration-pins", "node scripts/check-sdui-manifest.mjs", "check-adr-0087-registration --base origin/main", "check-changeset-no-major --base origin/main --event <this PR body>"], "build": { "full_workspace_with_dts": "118/118", "caught_and_fixed": "marketplace loader indexed with string (e94c13c8)" }, "type_check": { "turbo_affected": "101/101", "ui_type_check_scripts": "5/5 exit 0" }, "eslint": { "files": 144, "errors": 0 }, "tests": { "ui_full_suite": { "head": "d06324827a", "files_passed": 6631, "files_red": 21, "red_rerun_after_build": "21/21 pass, 513 tests" }, "i18n_scripts_hooks_plus_main_new": { "head": "e94c13c8ad", "files": 401, "tests": 7830, "failed": 0 }, "final_head_targeted": { "head": "f7e9df2dc7", "files": 131, "tests": 2014, "failed": 0 }, "dogfood": { "head": "e94c13c8ad", "files": 424, "tests": 3538, "failed": 0 } }, "ablation": "marketplace zh-Hant loader removed: tsc TS2741 + 6 failed / 64 passed in the two marketplace suites; restored green", "size_ceiling_raised": false, "en_chunk": "i18n-locale-en is the single module en.ts, source identical to main; 57625 gz bytes", "relay_writes": 2, "relay_write_list": ["pr_create #30902", "this os-dev-report comment"], "mcp_calls": { "writes": 0, "reads": "issue_read, pull_request_read only" }, "deviations": [ "One read of #30595's body through `gh api` REST (read-only) rather than the GitHub MCP read tool.", "The full ui suite was measured on d06324827a and dogfood plus the 76 gates on e94c13c8ad; the final head f7e9df2dc7 adds a merge of main and the regenerated zh-Hant, and was rechecked with the targeted suites and checks listed above." ], "owed_by_others": ["CONTRACT_REVIEW_TIER review on the draft head (seat)", "Tier H human approval via os-zhuang (seat requests)", "close #30595 (seat)"] }objectstack-fleet commentedon Nov 6, 2026
domain:ui#2 · os-tesla · session_01L9qibw7DekEe3wx5f3zphf
ACCEPT → PR #30902 comment 6683409459 · 2026-11-06T11:07Z · head
c1f166cc(phase 2 Console packs on the platform table, 8,497 lines, Tier H by size; contract review PASS 6683373168). Waiting for os-zhuang / hotlong approval (pm:awaiting-merge).objectstack-fleet commentedon Nov 6, 2026
domain:ui#2 · os-tesla · session_01L9qibw7DekEe3wx5f3zphf
ACCEPT (delta) → PR #30902 comment 6688640149 · 2026-11-06T15:36Z · head
e0985fea. Approved byos-zhuang;CONTRACT_REVIEW_TIERdelta PASS 6688603790 on this head. Landing through the merge queue (Part of #30511).objectstack-fleet commentedon Nov 6, 2026
domain:ui#2 · os-tesla · session_01L9qibw7DekEe3wx5f3zphf
Landed (language packs on the platform locale table,
zh-Hantships) at 2026-11-06T19:48Z: PR #30902 merged as5bca14fc24(headd9b3ddde; approved byos-zhuang;CONTRACT_REVIEW_TIERdelta PASS 6693289236; seat ACCEPT 6693307822). The PR saidPart of #30511, so the card stays open.git ls-tree origin/main ui/packages/i18n/src/locales/zh-Hans.ts/zh-Hant.ts/pt-BR.tsgit ls-tree origin/main ui/packages/i18n/src/locales/zh.tsRelease:
session_01L9qibw7DekEe3wx5f3zphf(domain:ui#2, claim 6677798360) · because this phase has landed · back topm:queue, assignee cleared in this stroke.Resume-from:
main@5bca14fc247a46a249bed200657e7a782785f5afRemainder: phase 4. The
LocaleSwitcherreadsPLATFORM_LOCALES[].labeland drops its deadzh/ptrows (review S2). Follow-ups filed: #30910 (pickLocalizedzh-Hant, now unblocked) and #30911 (skills i18n guide). Server andstudiozh-Hant stay with #29428.objectstack-fleet commentedon Nov 6, 2026
domain:ui#2 · os-tesla · session_01L9qibw7DekEe3wx5f3zphf
Closing as completed at 2026-11-06T20:00Z. Correction to my landing note 6693962054: its "Remainder: phase 4" line was wrong, because phase 4 is its own card, #30514. Measured against this card's Wanted on
main@5bca14fc, every point is met by PR #30902:ui/packages/i18ntakes its locale set fromPLATFORM_LOCALES, andzh-Hantships, generated fromzh-Hansby the phrase-aware converter (gen:zh-hant).zh→zh-Hans,pt→pt-BR). Stored andAccept-Languagecodes resolve throughPLATFORM_LOCALE_READ_ALIASES/platformLocaleTagOf, and the region-fallback test covers both Chinese scripts.all-locales-key-parity,check-i18n-en-drift.mjs). No new gate.Follow-ups stay open on their own cards: #30910 (
pickLocalizedzh-Hant), #30911 (skills i18n guide), #29428 (server andstudiozh-Hant). TheLocaleSwitcher's deadzh/ptrows (review S2) belong to phase 4, #30514, which this card's close unblocks on its #30511 line.