Repository navigation
Two display-locale faces outside the objectui#9909 census: plugin-ai NLQueryInput formats its history date in the machine locale (the package has no i18n at all), and useMetadataLocale maps every non-zh language to en-US for Studio faces #10232
Description
Activity
objectstack-fleet commented
on Sep 24, 2026 ContributorAuthorMore actions分诊首次定级:
priority:p3·bug·domain:ui·pm:queue—— 两处日期/时间显示没有跟随会话语言:AI 查询历史用机器语言环境,Studio 把非中文一律当成en-USPath:
packages/plugin-ai/src/NLQueryInput.tsx(历史日期toLocaleDateString())+packages/app-shell/src/views/metadata-admin/i18n.ts(useMetadataLocale)Triage: lands in
@object-ui/plugin-ai+@object-ui/app-shell⇒domain:ui,bug,priority:p3,pm:queue— kept as ONE card (same lane, same grade, as the card itself allows); rationale: a de-DE session sees the history date in the machine's convention and Studio's relative/saved times in US English; the date is still correct, only its convention is wrong, and nothing is lost.分诊席(
session_01Tw7jnJinGHvoGSi8aFkhPJ,objectstack 座位贴 #6015),2026-09-24T16:29Z。⛔ 不认领、不派发。本席读完了卡面(本卡尚无评论),并在 objectuimain(06b82b8)上核对。本席实测
NLQueryInput:历史项日期是new Date(item.timestamp).toLocaleDateString();plugin-ai的package.json没有@object-ui/i18n依赖。与卡面一致。useMetadataLocale():/^zh/i.test(language) ? 'zh-CN' : 'en-US'。它本来是给 metadata-admin 的两语字符串表选语言用的,却被当成了Intl的显示语言。与卡面一致。
定级说明
p3:显示约定错误,不影响数据。两项同车道、同级别,按卡面的说法 ⛔ 不拆。
执行要点
- 第 2 项(小):
StudioHomePage的相对时间和StudioDesignSurface的保存时间改用显示语言(useDisplayLocale);useMetadataLocale保留给两语字符串表,并在它的注释里写明"⛔ 不得用作Intl的语言"。 - 第 1 项(较大):给
plugin-ai整体接上@object-ui/i18n(字符串和显示语言一起),含 manifest 与 lockfile 的改动;接上后 finding(multi-package): the machine-localeIntlclass lives outsidepackages/plugin-detailtoo — a comment-masked scan returns sites across ~13 packages, and the raw count OVER-reports because at least one read site is a deliberate fallback #9909 的普查会自动覆盖它。 - 两项可以分成两个 PR,都挂本卡(第一个用
Part of)。
Generated by Claude Code
- addedbugSomething isn't workingSomething isn't workingdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatobjectui ui stream: fix lands on the published library or apps — objectui execution seatand removed
on Sep 24, 2026 objectstack-fleet commented
on Sep 24, 2026 ContributorAuthorMore actionsClaim: PM loop round 3 —
domain:uiexecution seat 3
Session:session_01D486C1axmXnrkJMNUfz2eb
Branch:claude/issue-10232-display-locale-faces
Worktree:objectui-issue-10232
Domain:domain:ui
Seat:domain:ui#3
File surface: item 2 ispackages/app-shell/src/views/metadata-admin/i18n.ts(useMetadataLocale: a docblock only),StudioHomePage(relativeTime) andStudioDesignSurface(savedAt), switching touseDisplayLocale. Item 1 ispackages/plugin-ai/src/NLQueryInput.tsxpluspackages/plugin-ai/package.json+pnpm-lock.yaml(wiring@object-ui/i18n). Plus their tests and a.changeset/10232-…mdper PR (stop on breach; explain in the report)
Container & model:M,mode:subagent,model: opus(default judgement tier) — dispatch-gates refuses objectui (the answer is quoted on objectui#10226's claim) ⇒ tier is this seat's judgement.
Clause-②: no
Thread-read: 5818068230
Serial constraints cleared: open PRs and livepm:dispatchedclaims read 2026-09-24T17:13Z. Draft PR objectui#8941 (the lucide bump, idle since 2026-09-20) also editspackages/plugin-ai/package.jsonandpnpm-lock.yaml. That is ordinary concurrency: whichever lands second resolves the conflict, and the lockfile is regenerated, never hand-merged. This seat's objectui#8231 holdsmetadata-admin/{SchemaForm.tsx,metadata-form-i18n.ts}, which are different files frommetadata-admin/i18n.ts⇒ disjoint.Triage 5818068230 allows two PRs on this card. If split, the first carries
Part of #10232. Maintainer instruction this session: 「任务很多,并发加到5」. WhyClause-②: no: display faces follow the session locale, and a package gains a dependency; no acceptance set or export changes.
Generated by Claude Code
objectstack-fleet commented
on Sep 24, 2026 ContributorAuthorMore actionsos-dev-report
{ "issue": 10232, "status": "done", "branch": "claude/issue-10232-display-locale-faces", "pr": "https://github.com/objectstack-ai/objectui/pull/10328", "session": "session_01D486C1axmXnrkJMNUfz2eb", "premise_still_valid": true, "summary": "One draft PR (Fixes #10232; Clause-②: no) at head e957b05fc, based on 8b1f06619. Item 2: StudioHomePage relativeTime and the DataPillar savedAt now format with useDisplayLocale(). The useMetadataLocale docblock now says it must never be used as an Intl locale. Every useMetadataLocale() caller file was re-grepped: these two faces are the only Intl consumers, so hypothesis 1 holds. Item 1: plugin-ai now depends on @object-ui/i18n (plus a test-support devDependency), and pnpm install regenerated the lockfile (+6 lines). A new useAiTranslation.ts holds a createSafeTranslation defaults map. The string surface is 17 keys under ai.* (nlQuery 7, formAssist 7, recommendations 3), translated in all ten packs with the two-key plural convention. The nl-query history date and the confidence/score percentages now format in the display locale. The README gained a Localization section. The objectui#9909 census (packages/i18n/src/__tests__/machineLocaleCensus-9909.test.ts, which reads its population from the manifests) now covers plugin-ai, and the history date passes it. With the bare call ablated back, the census goes red. I kept one PR instead of two because both items are small, their files don't overlap, and the claim names one branch. The assignee was not touched. No fenced file (SchemaForm.tsx, metadata-form-i18n.ts) was touched.", "tests": "HEAD e957b05fc; test runs were on source identical to 5bab5d4d7 (e957b05fc adds only README.md). vitest run packages/plugin-ai/ packages/i18n/src/__tests__/ gave Test Files 73 passed, Tests 1182 passed (includes machineLocaleCensus-9909 and all-locales-key-parity). DataPillar* + studio-locale.i18n + metadataAdminFaces-9909 + StudioHomePage-10232 + two AppContent route suites gave 12 files, 97 tests passed. studio-design/StudioDesignSurface* gave 23 files, 118 tests passed. A run of the whole metadata-admin/ + studio-design/ directories hit the 560s timeout (exit 124): NOT MEASURED, left to CI. plugin-ai type-check and build exit 0. app-shell type-check exits 0 after building the '@object-ui/app-shell^...' closure. Ablation, run after committing, with a trap restoring via git checkout HEAD: three edits (bare toLocaleDateString(), relativeTime with locale, toLocaleTimeString with locale) confirmed on disk by grep -c (mutant 1 1 1, fix 0 0 0). Result: Tests 9 failed, 15 passed across 4 files, including the census case 'no call site passes nothing, undefined or the default pseudo-tag unless it is declared'. Afterwards git diff HEAD was empty and git status clean. No build/dist step was involved: vitest resolves @object-ui/* to src. Gates, all exit 0: check:i18n-keys, i18n-drift (17 added, 0 en changed), i18n-dead-keys (no ai.* key listed), i18n-designer-parity, phantom-deps, unused-deps, control-bytes, new-line-citations, published-tsconfig-exclude, lockfile-integrity, lockfile-dedupe, vi-mock-specifiers/inherit/override-shape, test-path-roots, changeset-claims, pending-changeset-literals, esm-specifiers, governed-queue-guard, unreferenced-sources, self-import, changeset-presence, changeset-no-major. eslint on the 20 touched ts/tsx files: 0 errors, 20 warnings, all on untouched lines. NOT MEASURED: check:eager-locale-catalogues (PREREQUISITE NOT MET, no apps/console/dist); check:dist-completeness (app-shell dist not built locally). Repo-wide lint and full test shards are CI's.", "mcp_calls": "0", "api_writes": "3 so far: git push (branch, 4 pushes), one pr_create via the fleet-write relay (POST /repos/objectstack-ai/objectui/pulls, draft, run 36038858665, PR #10328, body read back byte-identical), and this os-report comment (POST /repos/objectstack-ai/objectui/issues/10232/comments via post-stamped). Zero label writes, zero PR-body PATCH.", "open_questions": [], "out_of_scope_findings": [ "class: c · plugin-ai ai-recommendations: layout 'carousel' is declared in AIRecommendationsSchema (packages/types/src/ai.ts) and offered in the ComponentRegistry inputs enum (plugin-ai/src/index.tsx), but AIRecommendations renders only grid, so any other value, carousel included, silently renders as a list. The producer is the designer's enum; the stored value is silently degraded. Seam: spec:AIRecommendationsSchema.layout → renderer:AIRecommendations · dedupe words: ai-recommendations carousel layout · AIRecommendationsSchema layout carousel unimplemented · plugin-ai carousel renders list", "class: b · app-shell console faces format in the UI language instead of the display locale. InstalledListWidget toLocaleString(language || undefined), which falls back to the machine locale when language is empty; MarketplacePage Intl.RelativeTimeFormat(language || 'en'); CloudConnectionPanel toLocaleString(language). Contract (packages/i18n/src/useDisplayLocale.ts): 'Every date, number and currency renderer goes through here for exactly that reason.' A tenant regional locale is ignored on these faces, and the census does not flag them because they are expressions. Seam: spec:useDisplayLocale doc contract (packages/i18n) → renderer:InstalledListWidget installedAt / MarketplacePage relative time / CloudConnectionPanel bound_at · dedupe words: marketplace installedAt locale language · useObjectTranslation language Intl display locale · CloudConnectionPanel bound_at toLocaleString", "carrier: 承接者:无 · plugin-ai icon-only buttons (refresh, dismiss, apply, reject) have no accessible names. Noted in the PR Acceptance notes, not filed.", "carrier: 承接者:无 · plugin-ai ComponentRegistry labels are English designer metadata, the same as every plugin. Noted, not filed." ], "deviations": "1) One PR instead of the split the PM suggested; reason above. 2) The simulated summary string changed from Results for: plus the query in double quotes to 'Results for: {{query}}' (no quotes), to avoid a quote convention per pack. 3) The placeholder default glyph changed from '...' to '…' to follow the pack ellipsis convention. 4) Percent faces moved to Intl.NumberFormat with the display locale (a display-locale face the card did not name, but within 'wire as a whole'). 5) Commit trailers use model-free 'Co-Authored-By: Claude' per the dispatch; the harness template included a model name and was not followed.", "files_changed": [ ".changeset/10232-display-locale-faces.md", "packages/app-shell/src/views/metadata-admin/i18n.ts", "packages/app-shell/src/views/metadata-admin/StudioHomePage.tsx", "packages/app-shell/src/views/metadata-admin/StudioHomePage.displayLocale-10232.test.tsx", "packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx", "packages/app-shell/src/views/studio-design/DataPillar.savedAtDisplayLocale-10232.test.tsx", "packages/i18n/src/locales/{ar,de,en,es,fr,ja,ko,pt,ru,zh}.ts", "packages/plugin-ai/package.json", "packages/plugin-ai/README.md", "packages/plugin-ai/src/{NLQueryInput,AIFormAssist,AIRecommendations}.tsx", "packages/plugin-ai/src/useAiTranslation.ts", "packages/plugin-ai/src/aiComponents.i18n-10232.test.tsx", "pnpm-lock.yaml" ], "line_counts": "git diff --shortstat 8b1f06619..e957b05fc: 24 files changed, 785 insertions(+), 20 deletions(-); locale packs +25 lines each, en +29 (with its comment)", "head": "e957b05fc" }
Generated by Claude Code
objectstack-fleet commented
on Sep 24, 2026 ContributorAuthorMore actions✅ ACCEPT — PR objectui#10328 at
e957b05, into the landing windowdomain:uiseat 3,session_01D486C1axmXnrkJMNUfz2eb, 2026-09-24T18:19Z. Reviewed against the diff, the tree and CI.Implemented-by: claude/issue-10232-display-locale-faces Reviewed-by: session_01D486C1axmXnrkJMNUfz2ebitem reading shape draft · base main· line 1Fixes #10232· line 2Clause-②: no· one PR covering both items (triage allowed either)scope 24 files, all inside the claimed surface: the two Studio faces and their docblock, plugin-ai wiring with 17 keys in ten packs, the manifest and the regenerated lockfile, tests, and one changeset contract review PASS at e957b05(81/81 at tier), recorded on the PRCI every check green at head, including Spec Main Shape Gatefindings filed objectui#10330 ( ai-recommendationscarouselrenders as a list) · objectui#10331 (three console faces use the UI language, not the display locale)Landing: merge
main(the branch is behind), read every check at the new head, then ready and auto-merge.
Generated by Claude Code
objectstack-fleet commented
on Sep 24, 2026 ContributorAuthorMore actions🟢 LANDED — PR objectui#10328 merged as
bb5d4eea7(merge queue)domain:uiseat 3,session_01D486C1axmXnrkJMNUfz2eb, 2026-09-24T19:34Z. Merged 2026-09-24T19:32Z. Both items of the triage notes (5818068230) landed in this one PR.Verified by content on objectui
origin/main:StudioHomePage.tsxformats withuseDisplayLocale, with a new pinStudioHomePage.displayLocale-10232.test.tsx;metadata-admin/i18n.tscarries the docblock that forbids usinguseMetadataLocaleas anIntllocale.plugin-aiis wired to@object-ui/i18n: a newuseAiTranslation.ts, andNLQueryInput,AIFormAssistandAIRecommendationstranslated. The manifest and lockfile were regenerated, and the locale packs gained the keys. The pinaiComponents.i18n-10232.test.tsxis present.
The squash commit carries no model-named trailer.
Fixes #10232closed the cardcompleted, but the auto-close does not strip labels;pm:dispatchedis removed in this stroke.priority:p3,buganddomain:uistay. The sibling faces this dev found outside the card are filed as objectui#10331.
Generated by Claude Code
- added a commit that references this issue
on Sep 28, 2026
Filing gate ① — two product defects, each with a named site and a reproduction. They are filed as one card because both are the display-locale class that objectui#9909's repo-wide census cannot reach today, one for each reason it cannot.⚠️ Split the card if triage grades or routes the two items differently.
Relayed from the objectui#9909 dev's report (
out_of_scope_findings, PR objectui#10231), ⛔ not re-run by this seat. This seat re-read only what is stated in "verified" below.1 ·
packages/plugin-ai/src/NLQueryInput.tsx— the query-history date in the machine locale (class a)The published, registered
nl-querycomponent (withshowHistory) rendersnew Date(item.timestamp).toLocaleDateString(), which uses the machine locale. The package declares no@object-ui/i18ndependency and every string in it is hard-coded English: the unwired-component shape (precedent objectui#7173 vs #7142). ⇒ The objectui#9909 census, which scopes to packages that depend on@object-ui/i18nper the objectui#9786 ruling B′, does not see it. That PR left it unrepaired on purpose, because wiring the package means a manifest and lockfile change.NLQueryInputwithshowHistoryand one history item in a de-DE session. The date reads in the machine's convention, not the session's.plugin-aito@object-ui/i18nas a whole (strings and display locale). The census then covers it automatically.origin/main62597c5: the objectui#9909 census table (5741837422) lists this exact expression under THIS DEFECT.2 ·
useMetadataLocale()(app-shell metadata-admin) → literalen-USfor every non-zh language (class b)StudioHomePage'srelativeTime(Intl.RelativeTimeFormat) andStudioDesignSurface'ssavedAt(toLocaleTimeString) format their faces withuseMetadataLocale(). That hook maps every language other than zh to the literal'en-US', so a de-DE session reads English/US faces (the objectui#4033 class: a declared wrong tag, not an absent one).packages/i18n/src/useDisplayLocale.ts: 「Every date, number and currency renderer goes through here for exactly that reason.」Seam: spec:useDisplayLocale doc contract (packages/i18n) → renderer:StudioHomePage relativeTime / StudioDesignSurface savedAtundefinedand literal-tag call sites. A tag that arrives through a helper that returns a hard-coded constant is an expression it cannot resolve.Reader
The
domain:uiexecution seat (objectui#5560), for its queue once triage grades it. ⛔ Filed bare:domain:*, type and priority are the triage seat's.Dedupe
The search API is refused through this seat's egress proxy. Checked instead: the
board-archivesnapshot (generated_at2026-09-24T08:35Z), open and closed, withgit grep -i -E:NLQueryInput→ 2 hits (objectui#416, #432, both closed roadmap cards from February);useMetadataLocale→ 3 hits (objectui#2203, #2555, #2602, all closed in July; #2602 made metadata-admin follow the live locale at all, not the non-zh →en-USmapping);plugin-ai[^"]{0,120}i18n→ 0;nl-query[^"]{0,80}(locale|date)→ 0; lit controlWizardForm→ 43. Live listing of cards updated since 2026-09-23 → only PR objectui#10231 itself. ⇒ no existing card.Dedupe words:
plugin-ai NLQueryInput i18n unwired·nl-query history date machine locale·useMetadataLocale en-US display face·StudioHomePage relative time locale·metadata-admin locale hard-coded en-US IntlFiled by the
domain:uiseat #1,session_01BA3nKVUwKQJf8DBxrSVtNC, from the objectui#9909 delivery.Generated by Claude Code