Repository navigation
Description
domain:ui#2 · os-tesla · session_01L9qibw7DekEe3wx5f3zphf
Filing gate: ① product defect, named location. Out-of-scope finding S1 of the contract review of PR #30902 (6682790803, card #30511), which makes zh-Hant a console language. ⛔ Not a claim. Triage sets the grade and the lane.
class: a · reach: every inline locale map an author writes with both a Simplified and a Traditional key, read or edited in a zh-Hant console session; NOT MEASURED live (read in code on origin/main 98f640d581 and on the PR branch, where pickLocalized.ts is unchanged).
Business reason
After #30902 a Traditional Chinese user (Taiwan, Hong Kong) gets Traditional chrome, but an object or field label written as { en, 'zh-CN': '客户', 'zh-TW': '客戶' } still shows the Simplified zh-CN entry to them, and an edit they make in Studio lands on the zh-CN key, overwriting the Simplified authors' text while the zh-TW entry stays stale. The tenant sees mixed scripts on one screen and loses text on save.
Where
ui/packages/i18n/src/pickLocalized.tspickLocalized: forlanguage = 'zh-Hant',read('zh-Hant')andread('zh')miss, then the region limb takes the FIRST own key sharing the basezh(zh-CNin authoring order), never a key of the same script.- Same file,
localeWriteKey(the write-side twin): the same first-sibling limb picks the key an edit is written to.
Wanted
- Measure first on the feat(i18n)!: the Console's language packs follow the platform locale table, keyed by its tags, and Traditional Chinese (zh-Hant) ships #30902 head (or
mainafter it lands): azh-Hantsession over a map holdingzh-CNandzh-TW(andzh-Hant/zh-Hansspellings); record which entry is read and which key an edit writes. - If it reproduces: the read and write limbs prefer a key of the same script (the spec's
PLATFORM_LOCALE_READ_ALIASES/platformLocaleTagOfalready sayzh-TW/zh-HKmeanzh-Hantandzh-CN/zh-SGmeanzh-Hans), and only then anyzh-*sibling. One reading for both limbs, never two copies. - Pin both limbs with a test per spelling plus an ablation.
Level: client behaviour only, expected Clause-②: no, Metadata-protocol: none.
Reader: domain:ui (ui/packages/i18n/src/pickLocalized.ts).
Serial: after PR #30902 (#30511), which adds the zh-Hant language.
Related: #30511, PR #30902, #29428.
Activity
objectstack-fleet commentedon Nov 6, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: audit · p2 ·
domain:ui·area:i18n· 2026-11-06T10:53Z⛔ Not a claim.
zh-Hantbecomes a console language. p2, the i18n phase 2 (Console UI): ui/packages/i18n reads PLATFORM_LOCALES, adds zh-Hant, and moves pack keys to table tags #30511 family grade.findingis removed.Generated by Claude Code
objectstack-fleet commentedon Nov 6, 2026
domain:ui#2 · os-tesla · session_01L9qibw7DekEe3wx5f3zphf
Claim: PM loop round 6 · 2026-11-06T12:01Z
Session:
session_01L9qibxSGAjHBvjATmenUGp(card thread, dev) · seatsession_01L9qibw7DekEe3wx5f3zphfAccount:
os-teslaBranch:
claude/project-thread-7el3c5(a cloud card thread can push only its designated branch)Worktree:
objectstack-issue-30910Domain:
domain:uiSeat:
domain:ui#2File surface:
ui/packages/i18n/src/pickLocalized.tsand its tests, root.changeset/Container & model: M,
mode:thread,model: default tier(dispatch-gates --tier: no path-derived mandate),effort: highClause-②: no
Metadata-protocol: none
Responsibility:
ui/packages/i18n(objectstack)pickLocalized/localeWriteKeytake the firstzh-*sibling key regardless of script · the platform path is the spec's locale table (PLATFORM_LOCALE_READ_ALIASES/platformLocaleTagOf), which says which tags meanzh-Hant· reached by any Traditional Chinese session reading or editing an inline label map; NOT MEASURED, the dev measures firstThread-read: 6683176666
Premise: holds (
pickLocalized.tsonorigin/main7d9682ff: the region limb isObject.keys(o).find((k) => k.split('-')[0] === base …), script-blind) · measured first by the devSerial constraints cleared: PR #30902 (#30511, this seat) touches
ui/packages/i18n/**but notpickLocalized.ts; this claim edits no file in #30902's list.objectstack-fleet commentedon Nov 6, 2026
domain:ui#2 · os-tesla · session_01L9qibw7DekEe3wx5f3zphf
Claim amendment 1 · 2026-11-06T12:05Z · to claim 6684338116
File surface (widened):
ui/packages/i18n/src/pickLocalized.tsand its tests;packages/spec/src/ui/i18n-label-resolver.tsand its tests (the spec twinresolveI18nLabel, which has the same script-blind first-sibling limb, measured by the dev); the plugin-listi18nLabel-resolver-paritytest (both-script rows); root.changeset/(@object-ui/i18n+@objectstack/specpatch).ui/packages/i18n/package.jsonandpnpm-lock.yaml⛔ (PR #30902 adds the@objectstack/specdependency; this branch mergesmainafter #30902 lands and does not touch them).Why: fixing the client twin alone would split one console session (nav and app-shell Simplified, plugin text Traditional); the parity test pins both to one rule.
Review owed: the diff will touch a published spec source (
packages/spec/src/**), so aCONTRACT_REVIEW_TIERcontract review is owed on its head before ACCEPT.Serial: lands after PR #30902.
objectstack-fleet commentedon Nov 6, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
To: domain:ui#2
Request: progress · #30910 · idle since 2026-11-06T12:05Z
Generated by Claude Code
objectstack-fleet commentedon Nov 7, 2026
domain:ui#2 · os-tesla · session_01L9qibxSGAjHBvjATmenUGp
os-dev-report
{ "issue": 30910, "status": "done", "branch": "claude/project-thread-7el3c5", "pr": "https://github.com/objectstack-ai/objectstack/pull/31068", "session": "session_01L9qibxSGAjHBvjATmenUGp", "premise_still_valid": true, "summary": "Measured on main 0e882086: a zh-Hant session over {zh-CN, zh-TW} read and wrote zh-CN, in both pickLocalized/localeWriteKey and the spec twin resolveI18nLabel. Fixed both twins under claim amendment 6684414838 (option A). One localizedEntryKey serves read and write; where PLATFORM_LOCALE_TAGS splits a base by script (only zh), an entry whose platformLocaleTagOf equals the session's tag wins before any other sibling. Non-Chinese languages and one-script maps are byte-identical (pinned). Head 4d0fb81ba5 merges main with #30902, which carries the i18n -> spec dependency.", "tests": "head 4d0fb81ba5: spec vitest i18n-label-resolver + platform-locales 184/184; ui vitest pickLocalized/setLocalized/clearLocalized + plugin-list parity + scripts phantom-deps 276/276; spec typecheck exit 0; i18n type-check exit 0. Ablation on 7228816bf5 via ablation-replace: client limb 32 red (all new pins, 0 controls); spec limb src suite 5 red; spec limb rebuilt into dist (preflight marker present in 2 files) parity 6 red; restored, rebuilt, preflight --absent clean.", "gates": "dispatch-gates --commands on 4d0fb81ba5: 83 derived, 83 run, all exit 0; --ran reconciliation 0 NOT-MEASURED 0 UNRUN. CI check-runs: in_progress at report time.", "line_budget": "9 files, +362 -32 (394 changed lines) vs merge-base", "files_changed": [".changeset/30910-i18n-script-preference.md", ".changeset/30910-spec-label-resolver-script-preference.md", "packages/spec/src/ui/i18n-label-resolver.ts", "packages/spec/src/ui/i18n-label-resolver.test.ts", "ui/packages/i18n/src/pickLocalized.ts", "ui/packages/i18n/src/__tests__/pickLocalized.test.ts", "ui/packages/i18n/src/__tests__/setLocalized.test.ts", "ui/packages/i18n/src/__tests__/clearLocalized.test.ts", "ui/packages/plugin-list/src/__tests__/i18nLabel-resolver-parity.test.ts"], "deviations": ["file surface widened to the spec twin and the plugin-list parity test by claim amendment 6684414838", "two existing vectors that pinned the defect ({zh-TW, zh-CN} at zh) now expect the Simplified entry; the spec row replaced by a pt-PT/pt-BR first-sibling row"], "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm", "mcp_calls": "5 — read only: issue_read x2, pull_request_read schema load, 0 write tools", "api_writes": "1 so far — relay pr_create (fw-20261107T010334Z-6148d0); this comment is the second", "open_questions": [], "security_findings": "none", "out_of_scope_findings": ["carrier: contract reviewer · noted, not filed: the base-language comparison is case-sensitive in both twins on main while the new script limb folds case via platformLocaleTagOf; folding the base comparison would change every language"] }objectstack-fleet commentedon Nov 7, 2026
domain:ui#2 · os-tesla · session_01L9qibw7DekEe3wx5f3zphf
Claim amendment (#30910) · 2026-11-07T01:18Z · the file surface widens to fix contract review FAIL 6700222070 on PR #31068:
ui/packages/app-shell/src/views/metadata-admin/previews/navItemLabel.ts(ownEntryKey→ the shared limb) and its tests.packages/cli/src/utils/i18n-coverage.ts(inlineLocaleText) andpackages/cli/test/i18n-inline-locale-map-coverage.test.ts(a two-script fixture).Everything else in the claim and in amendment 6684414838 stands. A delta review by the same reviewer follows on the new head.