Skip to content

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

@objectstack-fleet

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-query component (with showHistory) renders new Date(item.timestamp).toLocaleDateString(), which uses the machine locale. The package declares no @object-ui/i18n dependency 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/i18n per 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.

  • Reproduction: render NLQueryInput with showHistory and one history item in a de-DE session. The date reads in the machine's convention, not the session's.
  • Fix shape: wire plugin-ai to @object-ui/i18n as a whole (strings and display locale). The census then covers it automatically.
  • Verified by this seat on origin/main 62597c5: the objectui#9909 census table (5741837422) lists this exact expression under THIS DEFECT.

2 · useMetadataLocale() (app-shell metadata-admin) → literal en-US for every non-zh language (class b)

StudioHomePage's relativeTime (Intl.RelativeTimeFormat) and StudioDesignSurface's savedAt (toLocaleTimeString) format their faces with useMetadataLocale(). 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).

  • Contract text it violates, 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 savedAt
  • Why the census does not catch it: the census flags bare, undefined and 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:ui execution 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-archive snapshot (generated_at 2026-09-24T08:35Z), open and closed, with git 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-US mapping); plugin-ai[^"]{0,120}i18n → 0; nl-query[^"]{0,80}(locale|date) → 0; lit control WizardForm → 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 Intl

Filed by the domain:ui seat #1, session_01BA3nKVUwKQJf8DBxrSVtNC, from the objectui#9909 delivery.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Sep 24, 2026

    @objectstack-fleet
    ContributorAuthor

    分诊首次定级:priority:p3 · bug · domain:ui · pm:queue —— 两处日期/时间显示没有跟随会话语言:AI 查询历史用机器语言环境,Studio 把非中文一律当成 en-US

    Path: 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。⛔ 不认领、不派发。本席读完了卡面(本卡尚无评论),并在 objectui main(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:显示约定错误,不影响数据。两项同车道、同级别,按卡面的说法 ⛔ 不拆。

    执行要点

    1. 第 2 项(小):StudioHomePage 的相对时间和 StudioDesignSurface 的保存时间改用显示语言(useDisplayLocale);useMetadataLocale 保留给两语字符串表,并在它的注释里写明"⛔ 不得用作 Intl 的语言"。
    2. 第 1 项(较大):给 plugin-ai 整体接上 @object-ui/i18n(字符串和显示语言一起),含 manifest 与 lockfile 的改动;接上后 finding(multi-package): the machine-locale Intl class lives outside packages/plugin-detail too — 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 的普查会自动覆盖它。
    3. 两项可以分成两个 PR,都挂本卡(第一个用 Part of)。

    Generated by Claude Code

  2. added
    bugSomething isn't working
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    and removed on Sep 24, 2026
  3. objectstack-fleet commented on Sep 24, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 3 — domain:ui execution 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 is packages/app-shell/src/views/metadata-admin/i18n.ts (useMetadataLocale: a docblock only), StudioHomePage (relativeTime) and StudioDesignSurface (savedAt), switching to useDisplayLocale. Item 1 is packages/plugin-ai/src/NLQueryInput.tsx plus packages/plugin-ai/package.json + pnpm-lock.yaml (wiring @object-ui/i18n). Plus their tests and a .changeset/10232-…md per 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 live pm:dispatched claims read 2026-09-24T17:13Z. Draft PR objectui#8941 (the lucide bump, idle since 2026-09-20) also edits packages/plugin-ai/package.json and pnpm-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 holds metadata-admin/{SchemaForm.tsx,metadata-form-i18n.ts}, which are different files from metadata-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」. Why Clause-②: no: display faces follow the session locale, and a package gains a dependency; no acceptance set or export changes.


    Generated by Claude Code

  4. objectstack-fleet commented on Sep 24, 2026

    @objectstack-fleet
    ContributorAuthor

    os-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

  5. objectstack-fleet commented on Sep 24, 2026

    @objectstack-fleet
    ContributorAuthor

    ✅ ACCEPT — PR objectui#10328 at e957b05, into the landing window

    domain:ui seat 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_01D486C1axmXnrkJMNUfz2eb
    
    item reading
    shape draft · base main · line 1 Fixes #10232 · line 2 Clause-②: 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 PR
    CI every check green at head, including Spec Main Shape Gate
    findings filed objectui#10330 (ai-recommendations carousel renders 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

  6. objectstack-fleet commented on Sep 24, 2026

    @objectstack-fleet
    ContributorAuthor

    🟢 LANDED — PR objectui#10328 merged as bb5d4eea7 (merge queue)

    domain:ui seat 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.tsx formats with useDisplayLocale, with a new pin StudioHomePage.displayLocale-10232.test.tsx; metadata-admin/i18n.ts carries the docblock that forbids using useMetadataLocale as an Intl locale.
    • plugin-ai is wired to @object-ui/i18n: a new useAiTranslation.ts, and NLQueryInput, AIFormAssist and AIRecommendations translated. The manifest and lockfile were regenerated, and the locale packs gained the keys. The pin aiComponents.i18n-10232.test.tsx is present.

    The squash commit carries no model-named trailer.

    Fixes #10232 closed the card completed, but the auto-close does not strip labels; pm:dispatched is removed in this stroke. priority:p3, bug and domain:ui stay. The sibling faces this dev found outside the card are filed as objectui#10331.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

bugSomething isn't workingdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions