Skip to content

showcase (zh-CN): pages, objects and actions outside the bundle render in English beside translated navigation — the 414-key coverage baseline is user-visible on the first screens #25505

Closed

Description

@objectstack-fleet

Filing-gate: ① product defect · reach: a zh-CN session as admin and as phone.demo@example.com, on the app's first screens
Reader: objectstack triage seat → the lane that owns examples/app-showcase; the fix is keys in src/system/translations/index.ts, which shrinks examples/app-showcase/objectstack.config.ts: 414 in scripts/i18n-coverage-baseline.json
Duplicate search: semantic search "showcase zh-CN untranslated English option labels page titles i18n coverage baseline" in objectstack, incl. closed → 58 hits. The top 10 are platform-wide contracts (#25459, #24968, #22507, #20462, #14882, …), and none is a showcase burn-down. No open issue tracks the showcase's own baseline.

Measured during an exploratory showcase walkthrough on 2026-10-23: objectstack main b9c7a8f (PORT=3000 pnpm dev, stock showcase), objectui main 6fb31dc console (Vite dev, :5180), locale zh-CN.

What happens

The sidebar is fully translated, but most screens it opens are not. These were seen on stock screens, in zh-CN:

  • Page titles: Capability Map, My Work, Approvals, Task Board, Delivery Operations, Projects by Health, Active Projects, At-Risk (Red), Awaiting Review, Total Budget.
  • Object titles and descriptions: Expense Reports, Business Units, Cascading Selects. The Contacts list header carries the English description "Demonstrates derive-default + sparse-override forms: …".
  • Select options on translated objects: Projects → Status (Planned / Active / …) and Health (Green / Yellow / Red). Expense Reports → Status (Draft / Submitted / Approved). In the same grid the task statuses are in Chinese.
  • Columns on translated objects: Projects → Labels, Team Members, Budget Remaining, Tasks, Total Estimate (h). fields in the zh-CN showcase_project block stops at end_date.
  • Actions and their toasts: Mark Done, Log Time, Archive, Reassign…, Open Docs, and "Task marked done.".

index.ts says outright that it does not claim full coverage, and that scripts/i18n-coverage-baseline.json (414 keys for the showcase) is the measure. This issue is the user-visible cost of that baseline. The showcase advertises en + zh-CN, and a zh-CN reader meets English on the landing page, the first dashboard and the first record they open.

Expected

The surfaces above have zh-CN keys, and the baseline count drops to match. If some of these strings have no translation key at all, the gap is in the contract and belongs in its own issue. The toast successMessage and the page title are the likely candidates.

Session: https://claude.ai/code/session_01A48x1XYLTmiM2pgQxsgeKJ

Activity

  1. added
    area:i18nThe customer's own language, across UI, metadata and notifications
    bugSomething isn't working
    domain:serverDomain lane — seat card indexed by label:pm:seat
    on Oct 23, 2026
  2. objectstack-fleet commented on Oct 23, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: lands in examples/app-showcase/src/system/translations/index.ts, shrinking the examples/app-showcase/objectstack.config.ts row in scripts/i18n-coverage-baseline.json; rationale: the showcase advertises en + zh-CN and a zh-CN reader meets English on the first screens. If a string (toast successMessage, page title) has no translation key at all, that is a contract gap for its own card, not this one.
    Path: i18n · 整个应用说客户的语言 | i18n.surface-matrix (P1 upper bound) | step ③
    Grade: priority:p2 — many user-visible surfaces on the landing screens; a tax, not a wall, so one step under the P1 bound.
    Type: Bug

    Session: session_01AkmasAfXt3cu83xGzkuKhe (objectstack triage, run on the maintainer's request in the project thread)


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 23, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1 · domain:services seat 1 (seat post #6021, project run by the Sales account) · S mechanical card, in-seat subagent · 2026-10-23T19:32Z
    Session: session_016g7nYP9wdNx1GDa5XDr7Uy
    Account: os-sales (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-25505-showcase-zh-cn-keys
    Worktree: objectstack-issue-25505
    Domain: domain:server
    Seat: domain:services#1
    File surface: examples/app-showcase/src/system/translations/index.ts (zh-CN keys for the page titles, object titles and descriptions, select options, columns and actions/toasts the card lists), and the matching shrink of examples/app-showcase/objectstack.config.ts in scripts/i18n-coverage-baseline.json (414 → the measured count; shrink only). ⛔ packages/spec is not edited. A string with no translation key in the contract is reported as an out-of-scope finding, not worked around. Stop on breach; explain in the report.
    Container & model: S 级机械卡, mode:subagent (general-purpose subagent loading .claude/agents/os-dev.md as its role file), model: default tier, effort: medium
    Clause-②: no
    Metadata-protocol: none
    Responsibility: the showcase advertises zh-CN but its first screens read English | a zh-CN reader on the landing page, first dashboard and first record | anyone evaluating the demo in Chinese, today
    Thread-read: none
    Serial constraints cleared: no open PR touches the showcase translations file or the i18n baseline at claim (10 open PRs read at 2026-10-23T19:31:00Z on b2411c001d).
    Resume-from: none

  4. objectstack-fleet commented on Oct 23, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    {
    "issue": 25505,
    "status": "done",
    "branch": "claude/issue-25505-showcase-zh-cn-keys",
    "pr": "#25535",
    "session": "session_016g7nYP9wdNx1GDa5XDr7Uy",
    "premise_still_valid": true,
    "summary": "Added zh-CN keys to examples/app-showcase/src/system/translations/index.ts for every surface the card lists. That covers five page labels plus the My Work subtitle; the Delivery Operations dashboard label, description and all 9 widget titles; and the Expense Report, Business Unit and Cascading Select objects in full. On Projects it adds the description, the status/health/labels options and 5 columns; on Contacts the description and the stage options; and on the task, 7 action labels and 2 toasts. Wording reuses the bundle's existing vocabulary: the sidebar labels, 计划中 from project_status_flow, 评审中, 工时, 重新分配, 合计. The showcase row of scripts/i18n-coverage-baseline.json went 414 → 320, as measured by os lint and written by check-i18n-coverage --update. The 94 disappearing keys are exactly these surfaces, and nothing new appeared. The card guessed at a contract gap that does not exist: page title/subtitle and action successMessage are both bundle keys (TranslationBundle in translation.zod.ts; translatePage / resolvePageHeaderTitle in i18n-resolver.ts), and spec is untouched. Quick View and New Task (same task row/toolbar) and the Contacts stage options go slightly past the card's list; the PR body says so. Assignee and labels on the card were left alone. The PR carries assignee os-sales and the skip-changeset label.",
    "tests": "Pin: extended the existing seed.test.ts coverage pattern (the #8231 section sweep) with 'showcase zh-CN first screens are translated (#25505)'. It derives every declared string of the named objects, pages, ops dashboard and task actions from the composed stack and requires a non-empty, non-ASCII zh-CN value; 13 tests, green. Reverse verification after committing the fix: restored the translation file to base b2411c0 (tree only; blob 030a32adae equal to the base blob) → 12 failed / 1 passed (every surface red, vacuity guard green). Restored via git checkout HEAD, blob cb0f979923 equal to HEAD. Final head 4ddea0e, after merging origin/main: pnpm --filter @objectstack/example-showcase typecheck exit 0 (tsc --listFiles includes test/seed.test.ts); pnpm --filter @objectstack/example-showcase test: Test Files 38 passed (38), Tests 474 passed (474), lock VERDICT command-exit 0. node scripts/check-i18n-coverage.mjs at 4ddea0e: 'OK (14 config(s), 527 baselined untranslated string(s), none new).' exit 0.",
    "gates": "Local at 4ddea0e: node scripts/pm/dispatch-gates.mjs --commands derived 54 commands, and all 54 were run, each exit 0. pnpm check:dual-build-cjs-loads first exited 3 (PREREQUISITE NOT MET: 7 unrelated packages had no dist in this worktree); after building those packages under the lock it exited 0. Reconciliation: dispatch-gates --ran with 'cmd :: exit N' lines → '54 derived famil(ies) accounted for — 54 run, 0 NOT-MEASURED (a DERIVED zero — all 54 recorded an exit code and none of them is 3)'. pnpm check:i18n-coverage is in that set (exit 0). Pre-push check:commit-card-trailers passed on each push. CI on PR head 4ddea0e at report time: 42 check-runs, 8 success, 12 skipped, 22 in_progress, including the required Build Core and Governed Surface Queue Guard (in_progress). CI convergence belongs to the PM.",
    "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm (Clause-②: no)",
    "mcp_calls": "0",
    "api_writes": "2 relay writes: fleet-write pr_create (POST /repos/objectstack-ai/objectstack/pulls draft + POST issues/25535/assignees [os-sales] + POST issues/25535/labels [skip-changeset]; body read back identical, 6441 bytes), and this os-dev-report comment via post-stamped (POST /repos//issues/25505/comments). Plus 3 direct git pushes (empty branch, fix+test, merge).",
    "open_questions": [],
    "out_of_scope_findings": [
    "carrier: none · noted, not filed — the card's suspected contract gap (page title, action successMessage) does not exist: TranslationBundle declares objects.OBJ._actions.ACTION.successMessage (packages/spec/src/system/translation.zod.ts), and translatePage reads pages.NAME.title / subtitle (packages/spec/src/system/i18n-resolver.ts; the header title falls back to the label key via resolvePageHeaderTitle). No card is needed.",
    "carrier: none · noted in the PR's Acceptance notes only — the showcase keeps 320 baselined untranslated strings, including the project default list's six bulkActions (17 keys: label, confirmText, params), expense/invoice line objects, Field Zoo, other dashboards' widgets and datasets. The ops dashboard task_status filter options use a second word set (待办池/待处理/审核中) for the task statuses (待规划/待办/评审中). Polish, not a filing class."
    ]
    }

  5. objectstack-fleet commented on Oct 23, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed · domain:services seat 1 (seat post #6021) · os-sales · session_016g7nYP9wdNx1GDa5XDr7Uy · 2026-10-23T21:16Z

    reading value
    PR #25535 MERGED through the queue (ACCEPT 6374518001), head 4ddea0ee7d
    origin/main carries 5ea211ccd8

    State: Fixes #25505 closed the card. pm:dispatched is now off and the assignee is cleared.


    Generated by Claude Code

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:i18nThe customer's own language, across UI, metadata and notificationsbugSomething isn't workingdomain:serverDomain lane — seat card indexed by label:pm:seatpriority:p2Medium: important, M3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions