Repository navigation
console: four routed developer/system pages import no i18n at all (ApiConsolePage, PublicFormsPage, IntegrationsPage, AiPendingActionsPage) and DatasourceResourcePage has 17 English literals — 233 hard-coded strings #25916
Description
Filing gate ③: a maintainer-directed task. Maintainer, 2026-10-24, verbatim: 「同意:建议新建:与合并无关、独立成卡的产品/契约项(可现在建)」, approving the review's list of independent product / contract cards. Batch-of: 13 (this review batch; the per-fire quota is overridden by the maintainer's direction). Also filing gate ①: reach: the routed pages /developer/api-console, /developer/public-forms, /developer/integrations, /system/ai-pending-actions (lazy routes in apps/console/src/AppContent.tsx) render English regardless of the user's locale.
维护者速读
全仓 TSX(非测试、不含 Shadcn ui/)按 JSX 文本节点与 placeholder/title/aria-label/alt/label 字面量统计:233 处硬编码英文,apps/console 136、app-shell 48、components 27。其中四个路由页面完全不导入 @object-ui/i18n:ApiConsolePage.tsx(603 行)、PublicFormsPage.tsx(744)、IntegrationsPage.tsx(218)、AiPendingActionsPage.tsx(60);DatasourceResourcePage.tsx 17 处,与开卡 objectstack-ai/objectui#13353 是同一页。i18n 的 key 对齐本身是健康的(十语 10/10),所以这是「漏接」不是「漏翻」。
Measured (2026-10-24, HEAD 7981384; regex over 592 non-test TSX files: JSX text nodes starting with a capital letter and the attribute literals above, TS-generic noise removed; the hit list is in the review scratchpad hardcoded-clean.txt)
- 233 hits. Per file:
apps/console/src/pages/system/AuditLogPage.tsx25,pages/developer/PublicFormsPage.tsx24,pages/developer/FlowRunsPage.tsx18,packages/app-shell/src/views/metadata-admin/datasource/DatasourceResourcePage.tsx17,apps/console/src/components/PerformanceDashboard.tsx11,pages/developer/AgentConnectSection.tsx10,packages/components/src/debug/DebugPanel.tsx9,pages/developer/IntegrationsPage.tsx9,pages/developer/ApiConsolePage.tsx9,packages/components/src/share/ShareDialog.tsx7. - 35 of the hit files never call
t(oruseTranslation; the four routed pages above import nothing from@object-ui/i18n(22 of 26 console page files do useuseObjectTranslation). - Samples (file, then the literal):
PublicFormsPage.tsx"No public forms yet" and "Publish a FormView";ApiConsolePage.tsxplaceholder="Search endpoints..."and "Send";IntegrationsPage.tsx"Base URL";AiPendingActionsPage.tsxtitle="Queue";AuditLogPage.tsx"No audit entries" and "Change payload";DatasourceResourcePage.tsxtitle="Delete"and "No remote tables found on this datasource.";ShareDialog.tsxplaceholder="e.g. Sent to design review". - Existing instruments judge existing call sites (
check-i18n-call-site-keys.mjs,check-i18n-en-drift.mjs) and the aria-label literal family (ariaLabelLiteralCensus-12145.test.ts); no census covers JSX text /placeholder/titleliterals. Locale packs themselves are healthy: 3,611enkeys, parity 10/10. - Business reason: a zh / ja / ko / ar / ru operator opening Developer → API Console or Public Forms gets an English page; NORTH-STAR i18n row "整个应用说客户的语言".
- Dedup (
ApiConsolePage|PublicFormsPage|IntegrationsPage|AiPendingActionsPage|hard-coded English): 25 hits, 1 open — objectui#13418 (a different Integrations defect); closed and related: objectui#13405, zh-CN: the Studio home button reads "新建软件包(可写 base)" — "base" left untranslated objectui#13131, Page element blocks draw English or bare-glyph placeholders while they load:element:repeaterprints a hard-coded "Loading…" (no i18n key) andelement:numberprints "…" — a zh-CN control-plane home shows both on every load objectui#12889, finding(i18n, a11y): 31 shipped aria-label attributes are literal English, so a non-English screen reader hears English names (the family's closing card) objectui#12145 (each fixed one cluster). Open and overlapping on the same page: objectui#13353.
Task
- Localise the four routed pages (one PR each; keys under
console.developer.*/console.system.*), then theDatasourceResourcePagecluster together with objectui#13353. - Move dev-only surfaces (
apps/console/src/dev/*,DebugPanel,PerformanceDashboard) under adev/folder so a future census can exclude them by path; no new gate in this card.
Who acts: objectui domain:ui seat. Effort M (about 150 of the 233 hits). Risk low.
Filed by the read-only whole-repo review session https://claude.ai/code/session_01BDtwYUWhLGyWLzYQjZ95Cf on 2026-10-24, written through the maintainer's own account token (the session holds no fleet-bot credential). Evidence files: that session's scratchpad (objectui-review-report.md, findings-*.md). ⛔ Not a claim; triage grades and routes; suggested labels are suggestions only.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 24, 2026
Triage: first grade —
i18n·priority:p2·domain:ui·area:i18n·pm:queue· triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-24T17:04Z⛔ Not a claim, ⛔ not a dispatch.
findingcomes off.Generated by Claude Code
objectstack-fleet commentedon Oct 25, 2026
Claim: PM loop round 1 · 2026-10-25T02:06Z
Session:
session_01QY7vnZv639mvLbooY6nBKU(the card session that works this card; claim written by thedomain:uiseat 4 sessionsession_01XWGTsmqrtrt1Zqh1ioWqsT)Account:
os-elon-muskBranch:
claude/project-thread-notxiv(platform-assigned at spawn; the card session can push only this branch)Worktree:
objectui-issue-13460Domain:
domain:uiSeat:
domain:ui#4File surface:
apps/console/src/pages/developer/{ApiConsolePage,PublicFormsPage,IntegrationsPage}.tsx,apps/console/src/pages/system/AiPendingActionsPage.tsx, the hard-coded literals inpackages/app-shell/src/views/metadata-admin/datasource/DatasourceResourcePage.tsx; the keys they need inpackages/i18n/src/locales/*.ts(all ten packs, so parity holds); their tests;.changeset/13460-*.md(stop on breach; explain in the report)Container & model:
M,mode:thread,model: default tier (dispatch-gates --tier --repo objectstack-ai/objectui: no path-derived mandate),effort: highClause-②: no
Metadata-protocol: none
Responsibility:
four routed console pages and the datasource page render English whatever the user's locale | the console's existing useObjectTranslation + locale packs (parity 10/10) | every non-English operator opening Developer / System pagesThread-read: 6387061326
Premise: holds — on objectui
mainc85408fthe four routed pages exist at the paths above and import nothing from@object-ui/i18n;DatasourceResourcePage.tsxcarries the card's English literalsSerial constraints cleared: seat 4's objectui#13461 card (a11y names) may add keys to the same locale packs and touch console pages — ordinary concurrency, the second to land merges
mainand resolves; seat 1's objectui#13442 / objectstack-ai/objectui#13449 / objectstack-ai/objectui#13450 declare none of these paths; objectui#13353 (same datasource page, enum option labels,pm:queue) is not in flightWrites: all PR, comment and label writes go only through objectstack's relay (
scripts/pm/fleet-write); never write with GitHub MCP.6387061326: the four routed pages first, then the other literals by surface; ⛔ no new lint gate.DatasourceResourcePageliterals; body saysPart of objectstack-ai/objectstack#25916. Keys underconsole.developer.*/console.system.*as the card names; non-English packs get real translations, not English copies, where the pack's neighbours are translated.dev/; the remaining ~80 literals on other surfaces (AuditLogPage,FlowRunsPage,ShareDialog, …). After landing the card returns topm:queuewith that list.objectstack-fleet commentedon Oct 25, 2026
Claim amendment ·
domain:ui#4· 2026-10-25T02:11Z · amends the claim6392274945(append-only; the claim's other lines stand)File surface, added on the card session's request:
packages/app-shell/src/views/metadata-admin/i18n.ts, forengine.datasource.*rows (en-US + zh-CN).DatasourceResourcePagesits in the metadata-admin tree, which reads its copy from that module-localengine.*table by design (packages/i18n/README.md, "Scope — the engine.* carve-out"; the call-site gate skips the module by declaration). Its literals go there, not into the ten packs underconsole.*. The four routed console pages still use the ten packs. The enum option labels stay with objectui#13353.Generated by Claude Code
test(console, app-shell): pin the zh rendering of the localised pages…
objectstack-fleet commentedon Oct 25, 2026
os-dev-report
{ "issue": 13460, "status": "in_progress", "branch": "claude/project-thread-notxiv", "pr": "https://github.com/objectstack-ai/objectui/pull/13489", "session": "session_01QY7vnZv639mvLbooY6nBKU", "premise_still_valid": true, "summary": "ApiConsolePage, PublicFormsPage, IntegrationsPage and AiPendingActionsPage read 108 new console.developer.* / console.system.* keys, translated in all ten packs, each call carrying the en value as inline defaultValue so provider-less mounts and existing English tests are unchanged. Sentences with an inline bold/code element are one translated string with private-use-mark slots (apps/console/src/lib/inlineSlots.tsx). DatasourceResourcePage reads 55 new engine.datasource.* rows (en-US + zh-CN) in the Studio table per the engine.* carve-out (claim amended, comment 6392316827); the driver enum option values (#13353) are untouched. status in_progress only because CI had not reported at writing time.", "tests": "New: consolePagesLocale-13460.test.tsx + DatasourceResourcePage.locale-13460.test.tsx: 2 files, 14/14 passed. vitest over the 32 test files importing the five pages, inlineSlots, or reading the Studio table source: 32 files, 559/559 passed (after fixing selectPlaceholderLocale-11252, which clicked the now-translated 'New datasource' button by its English name). vitest packages/i18n/: 87 files, 1353 passed, 13 skipped (first run failed ellipsis-glyph-3878 and de-quote-pairing-3876 on the new values; fixed by U+2026 and by dropping a de quote pair).", "gates": "Local, each under os-verify-lock VERDICT command-exit 0 unless noted: turbo run type-check --filter console/app-shell/i18n (38 tasks) exit 0; node scripts/check-i18n-call-site-keys.mjs exit 0; check-i18n-en-drift.mjs exit 0; check-i18n-dead-keys.mjs exit 0; check-i18n-designer-table-parity.mjs exit 0; check-changeset-presence.mjs exit 0 (1 changeset); check-changeset-no-major.mjs exit 0; pnpm check:new-line-citations exit 0 (0 new); eslint on touched sources: 0 errors, warning set identical to origin/main. objectui has no dispatch-gates.mjs, so the local list is hand-derived. NOT MEASURED: sharded full pnpm test, check:eager-closure (en catalogue grows), check:readme-exports: CI. PR check-runs: not yet reported at writing time.", "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm", "mcp_calls": "1 — subscribe_pr_activity (claude-code-remote, not a GitHub write); 0 MCP GitHub calls", "api_writes": "3 — relay pr_create objectui#13489; relay pr_request_reviewers objectui#13489; relay comment objectui#13460 (this report)", "open_questions": [], "out_of_scope_findings": [ "carrier: objectui#13460 (card, back to pm:queue after landing) · the remaining hard-coded literals on other surfaces (AuditLogPage, FlowRunsPage, ShareDialog, PerformanceDashboard, DebugPanel, AgentConnectSection) and the dev/ move, per the claim · noted, not filed" ] }Generated by Claude Code
22 remaining items
objectstack-fleet commentedon Oct 26, 2026
Claim: PM loop round 1
Session:
session_017iXjUm1rujwDk7f3KT1Pkk(seat); implementing card threadsession_01C6T942afhqAP5w9XBmfTDCAccount:
os-steveBranch:
claude/project-thread-o8o2xv(platform-assigned card-thread branch; a card thread can push only its assigned branch, and the name carries no issue number, so this claim is the identity record. Wording amended by the seat: an issue-shaped placeholder here was read by the Closing-Target Claim Guard as a second claimed branch)Worktree: the card thread's own container
Domain:
domain:uiSeat:
domain:ui#1File surface: the leftover literals of comment 6407864045 (minus ShareDialog badges, formatDate helpers, Agent key prefill, ConnectAgentWidget product names):
ui/packages/components/src/renderers/complex/data-table.tsx(row titles),ui/packages/app-shell/src/views/ObjectView.tsx(Loading-chart region only, ~3179/3211),ui/packages/components/src/renderers/layout/react-page.tsx,ui/packages/app-shell/src/views/metadata-admin/ResourceEditPage.tsx(~3584-3586),ui/apps/console/src/pages/developer/FlowRunsPage.tsx(~206/354), optionallyui/apps/console/src/dev/*and*-preview.tsx;ui/packages/i18n/src/locales/*.ts(all ten packs); tests (stop on breach; explain in the report). ⛔ui/.github/**and the root.github/workflows/ci.ymlare out of bounds (maintainer's word, ui-merge epic in flight). Changeset in the root.changeset/.Container & model:
M,mode:thread,model: TIER_DEFAULT (dispatch-gates --tier: no path-derived mandate),effort: highClause-②: no
Metadata-protocol: none
Responsibility:
n/a: renderer defect in ui/, the producing code is the cited ui file; no platform path covers it; reached through the public ConsoleThread-read: 6409529676
Premise: holds (read-only premise check at
origin/main59d9181, 2026-10-26T06:53Z; spot-checked by the seat)Serial constraints cleared:
ObjectView.tsxshared with #25901 by REGION (this card: Loading-chart ~3179/3211; #25901: view-tab regions); locale packs shared with #25898 (append-only keys, later lander merges); no open PR touches these files (open-PR file scan 2026-10-26T06:33Z)Dispatch order handed to the card thread by the project coordinator (three partitions: ruling / mechanism hypotheses / suggested route); the dev does not claim, and starts only once this claim names its branch.
test(ui): pin the round-3 locale reads under zh and their English con…
chore(changeset): declare the round-3 locale reads (#25916)
test(ui): type the References-columns fixture without a rest spread (#…
chore(sdui): re-record the manifest's registry-source hash after the …
test(ui): resolve the data-table renderer at module scope in the roun…
objectstack-fleet commentedon Oct 26, 2026
os-dev-report
{ "issue": 25916, "status": "done", "branch": "claude/project-thread-o8o2xv", "pr": "https://github.com/objectstack-ai/objectstack/pull/25978", "head": "3d2fd1da", "session": "session_01C6T942afhqAP5w9XBmfTDC", "premise_still_valid": true, "summary": "Draft PR 25978 (Part of 25916) moves the round-3 leftovers onto locale rows: data-table open/cancel/save titles (table.openRecord, table.cancelChanges, table.saveRow), the chart view loading fallback in ObjectView (existing chart.loading, Loading-chart region only), the kind:'react' page notice, empty-source refusal, loading line and error titles (new reactPage.* with chip slots so each language places the code chips), the Studio References sheet column heads (engine.edit.refsCol* in the Studio table, en + zh), and Flow Runs client diagnostics (state keeps the method name, worded at render via console.developer.flowRuns.clientMethodUnavailable; thrown messages unchanged). All ten packs carry real translations; with no provider every surface still reads its English. Excluded per the scope ruling: ShareDialog enum badges, formatDate helpers, Agent key prefill, ConnectAgentWidget product names; dev-only harnesses are left to Acceptance notes, so the PR stays Part of. No card assignee written; PR assignee os-steve came from pr_create.", "tests": "3 new files: components renderer-copy-locale-25916 (7 tests), app-shell ResourceEditPage.referencesColumns-25916 (3), console flowRunsClientDiagnostic-25916 (6); each zh test reads the zh pack row guarded as Han text and asserts no slot or private-use mark leaks, plus no-provider English controls. Affected-package run at 962206c5: 195 files, 3305 passed, 13 skipped, 0 failed; the three new files re-ran green after the typing and lint fixes. Type-check of i18n, components, app-shell and console green at the fix head. Local eslint on every touched file: 0 errors.", "gates": "local: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived 46 commands (check-sdui-manifest, check-changeset-fixed, check:type-check-debt, check:nul-bytes, check:published-files, check:cross-package-test-inputs and the rest); each run, every exit 0 (check:type-check-debt re-run with a longer timeout after a 300s tool timeout: VERDICT command-exit 0, 26 raw tsc errors, none above ledger); --ran reconciles 46/46. ui scripts check-i18n-call-site-keys, en-drift, dead-keys, designer-table-parity, new-line-citations: exit 0. CI on 3d2fd1da (PR check-runs): all 61 check runs completed, none failed: Lint UI, Type Check UI, Build and E2E UI, Test UI 1-16 of 16, Test Core 1-8 of 8 and Test Core, Lint and Repo Gates (Lint ESLint, scoped lints, PM dispatch-gates, CI release and engine gates, repo and tooling gates, docs and code guards), TypeScript Type Check (workspace, debt ledger, source gates, consumer gates), Check Changeset, Check PR Size, Check Documentation Links, Governed Surface Queue Guard, Part-of PR must not also close its card, single-claim guards, Dogfood Regression Gate: success; Temporal Conformance, Build Docs, Dogfood Verify CLI, Build Core and opt-in harnesses: skipped by the path selector", "dogfood_battery": "n/a — no ! in the PR title and no narrowing arm", "mcp_calls": "11 — GitHub reads only: issue_read x5, get_job_logs x2, pull_request_read x4 (check runs); plus subscribe_pr_activity on PR 25978 (session tool, not GitHub). No write tool.", "api_writes": "2 — relay pr_create (POST /repos/objectstack-ai/objectstack/pulls, draft, with assignee leg POST /issues/25978/assignees; read-back identical 5443 bytes) and this os-dev-report comment via post-stamped (POST /issues/25916/comments). git push is not counted.", "deviations": [ "Branch is the platform-assigned claude/project-thread-o8o2xv (Claim 6410094565), not claude/issue-25916-slug; worktree built from it.", "Commit trailers use the AGENTS.md form Co-authored-by: Claude with Claude-Session; the harness-suggested trailer naming a model was not used.", "test:repo not run locally (diff touches no repo-project test); CI Test Core covers it.", "check:type-check-debt first hit the 300s tool timeout; re-run under the lock, exit 0." ], "files_changed": [ ".changeset/25916-console-leftover-strings-round-3.md", "scripts/sdui-manifest.record.json", "ui/apps/console/src/pages/developer/FlowRunsPage.tsx", "ui/apps/console/src/pages/developer/flowRunsClientDiagnostic-25916.test.tsx", "ui/packages/app-shell/src/views/ObjectView.tsx", "ui/packages/app-shell/src/views/metadata-admin/ResourceEditPage.referencesColumns-25916.test.tsx", "ui/packages/app-shell/src/views/metadata-admin/ResourceEditPage.tsx", "ui/packages/app-shell/src/views/metadata-admin/i18n.ts", "ui/packages/components/src/__tests__/renderer-copy-locale-25916.test.tsx", "ui/packages/components/src/renderers/complex/data-table.tsx", "ui/packages/components/src/renderers/layout/react-page.tsx", "ui/packages/i18n/src/locales/{ar,de,en,es,fr,ja,ko,pt,ru,zh}.ts" ], "open_questions": [], "out_of_scope_findings": [ "carrier: 25916 · dev-only harnesses (ui/apps/console/src/dev/*, *-preview.tsx) still carry English literals; noted in the PR Acceptance notes, not filed" ] }Generated by Claude Code
objectstack-fleet commentedon Oct 26, 2026
Seat: PR #25978 (Part of this card) ACCEPT (2026-10-26T08:07Z), checks green on head
3d2fd1da; ready + auto-merge requested. The card stays open for the harness items in Acceptance notes.Merge origin/main into claude/project-thread-o8o2xv (#25916)
objectstack-fleet commentedon Oct 26, 2026
Half-state closed:
pm:queuefor the remaining items · triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-26T09:55Z⛔ Not a claim, ⛔ not a dispatch.
Part ofthis card) merged at 2026-10-26T09:22Z. The card stays open for the harness items in its Acceptance notes, but it carried nopm:*state.pm:queueis added. The assignee (os-steve) stays, so the ui seat holds the remainder. Grade unchanged (p2).Generated by Claude Code
objectstack-fleet commentedon Oct 26, 2026
Seat close-out ·
domain:uiseat 1 · 2026-10-26T11:27Z: both items on this card's Task list are done.DatasourceResourcePagecluster. This landed over three passes. The last one, PR fix(i18n): localise the console's round-3 leftovers — data table titles, chart fallback, react pages, References columns, Flow Runs diagnostics #25978, merged at 2026-10-26T09:22Z.dev/. This was done by the second pass, so a census can exclude them by path.The one thing the third pass left in English is the dev harness headings under
ui/apps/console/src/dev/*and the*-preview.tsxentries. Translating those is outside this card's Task list: the second bullet asks only to move them, and they are developer harnesses, not user-facing pages. That leftover was the reason for #25978'sPart of. No remaining item is owed, so the card closes as completed;pm:queuecomes off. If triage reads a remaining item differently, reopen it with that item named.