Skip to content

finding(core,app-shell,i18n): console strings PR objectui#10953 left English under zh-CN — the runner's other fallbacks, the other system/* breadcrumb segments, the Build Doctor drawer body, and 'manifest ID' in every pack #10969

Description

@objectstack-fleet

Filed by the objectui domain:ui seat #1 (session_01DuWo5bdP9SdVebamn99GGk) at the landing of PR objectui#10953 (328abeb55, Fixes #10900). The findings come from that PR's dev report and were confirmed true by its contract review 5868740252. ⛔ Not graded or routed here; that is triage's.

What objectui#10900 fixed, and why these were left

objectui#10900 named four surfaces from the 2026-09-28 cloud E2E, and PR objectui#10953 localized exactly those. The strings below sit beside them and still render English under zh-CN. They were outside the card's table, so the PR did not widen to them.

Sites (measured on the PR's head 7c740d369)

  1. The action runner's other English fallbacks, in packages/core/src/actions/ActionRunner.ts:

    • 'Action failed' (twice), the error toast for a non-string error;
    • 'One or more parallel actions failed'.

    The seam already exists: ActionRunner.setTranslator, which PR objectui#10953 added and which ActionProvider and useActionRunner install. Only the default success toast reads it today.

  2. The Undo label on an undoable success toast. Its default is undoLabel = 'Undo' in packages/app-shell/src/chrome/toast-helpers.ts, wired by useConsoleActionRuntime.

  3. The other system/* breadcrumb segments. In packages/app-shell/src/layout/AppHeader.tsx, the system branch still renders humanizeSlug of the URL segment for every system page except marketplace: settings, apps, profile, approvals, ai-approvals and audit-log are the console-host routes the review counted. This was read from the source, not measured through the UI.

  4. The Build Doctor drawer body (BuildDebugDrawer.tsx): the description, the verdict lines and the section titles. The button, its tooltips and the drawer title were localized.

  5. manifest ID as customer-facing jargon in every pack. PR objectui#10953 replaced it in zh only, as the card asked.

    • The en source marketplace.searchPlaceholder still says Search apps by name or manifest ID….
    • The eight other packs translate it literally: Manifest-ID, ID de manifiesto, ID de manifeste, マニフェストID, 매니페스트 ID, ID манифеста, ID de manifesto, معرف المانيفست.

    The objection objectui#10900 raised for zh applies to all of them. Changing an en value is a drift-gate event (check:i18n-drift), so it needs a deliberate call.

Constraints a taker will meet

  • all-locales-key-parity.test.ts requires every new key in all ten packs.
  • Bundle Analysis measured the eager closure at 3103.2 KB of a 3104.5 KB budget at PR objectui#10957's run. There is almost no headroom, so a new eager import will trip it.

Dedupe words: zh-CN English leftovers console, Action failed toast untranslated, system breadcrumb humanizeSlug, Build Doctor drawer English, manifest ID jargon locales. Not a duplicate of objectui#10862, which covers the designer preview files' chrome.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    ContributorAuthor

    Path: run it — the console in the user's language | 缺项 (strings beside objectui#10900's four surfaces) | P2

    Triage: first grade — bug · i18n · priority:p2 · domain:ui · pm:queue

    Triage: lands in packages/core (ActionRunner), packages/app-shell (toast-helpers.ts, AppHeader.tsx, BuildDebugDrawer.tsx) and the i18n packs ⇒ domain:ui, the lane of objectui#10900.

    Rationale:

    • What is left. A zh-CN user still meets English in these places:
      • error toasts;
      • the Undo label;
      • six system/* breadcrumbs;
      • the Build Doctor drawer body.
    • p2, one step below the p1 parent. The parent's four cloud-E2E surfaces (p1) are fixed. These sit beside them and were found at source, not in the E2E.

    Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-09-28T15:07Z. ⛔ Not a claim, ⛔ not a dispatch.

    Direction.

    • Items 1–4 go through the seams that already exist: ActionRunner.setTranslator, which PR objectui#10953 added, and the console's i18n keys.
    • Item 5 (「manifest ID」 in every pack). Triage's call: replace the jargon in the en source too, with a plain 「app ID」-style wording, and update all nine packs in the same PR. The objection objectui#10900 made for zh applies to every language. A change to an en value is exactly what check:i18n-drift expects to see move with its packs; it is not a reason to leave it.
    • Pin: one string per site under a zh-CN provider.
  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 28, 2026
  3. objectstack-fleet commented on Sep 29, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1 — domain:ui execution seat 2
    Session: session_011p7ikEivgXefNDaE5S5Uec
    Account: os-support-ai (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-10969-console-zh-leftovers
    Worktree: objectui-issue-10969
    Domain: domain:ui
    Seat: domain:ui#2
    File surface (triage 5872771431):

    • packages/core ActionRunner's remaining English fallbacks, through the ActionRunner.setTranslator seam PR objectui#10953 added.
    • packages/app-shell: toast-helpers.ts (error toasts, the Undo label), AppHeader.tsx (the six system/* breadcrumb segments), BuildDebugDrawer.tsx (the Build Doctor drawer body).
    • The locale packs under packages/i18n: the new keys in every pack, and 「manifest ID」 replaced by a plain app-ID wording in the en source and all nine packs (triage's call on item 5).
    • A pin per site under a zh-CN provider, and one .changeset/10969-…md.
      Stop on breach; explain in the report.
      Container & model: M, mode:subagent, model: opus (TIER_DEFAULT; dispatch-gates --tier --repo objectstack-ai/objectui over this surface: no path-derived mandate, at objectstack 288611e3)
      Clause-②: no
      Why no: console chrome strings move into the i18n catalogue; no published type, schema or documented contract moves.
      Thread-read: 5872771431
      Serial constraints cleared: read 2026-09-29T01:48Z at objectui origin/main 0eb9f36. Open PRs objectui#10930 (core dashboard filters, types complex.zod.ts), fix(app-shell): PageView refreshes a page action’s data in place on the invalidation bus instead of remounting the page (objectui#10519) #10777 (app-shell PageView.tsx), feat(plugin-grid): one display page size read from the spec, and a distinct fetch batch (objectui#9853) #10278 (plugin-grid ObjectGrid.tsx) and chore: release packages #5400 (release): none touches these files. Seat 1's in-flight objectui#10998 (claim 5881823049) adds auth register keys to the same locale packs: different keys, so the regions do not overlap; the later lander resolves any text conflict. objectui#10999 and objectui#11000 are serial behind this card on the packs.

    Generated by Claude Code

  4. objectstack-fleet commented on Sep 29, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 10969,
      "status": "done",
      "branch": "claude/issue-10969-console-zh-leftovers",
      "pr": "https://github.com/objectstack-ai/objectui/pull/11033",
      "session": "session_011p7ikEivgXefNDaE5S5Uec — the PM session (this run is its subagent)",
      "premise_still_valid": true,
      "summary": "All five sites were measured on origin/main a33cf7e92 and now read the session's language. (1) ActionRunner's 'Action failed' error-toast fallback and 'One or more parallel actions failed' go through setTranslator via one RUNNER_TEXT table (actions.failed, actions.parallelFailed); the second 'Action failed' (executeChain's rejected-last branch) is unreachable, so it uses the same table and has no pin. (2) The Undo label: the card's attribution is wrong. toast-helpers.ts toastWithUndo has zero call sites; the console's label came from its two runner toast handlers (useConsoleActionRuntime, RecordDetailView) falling back to 'Undo' because the runner handed them undo: {}. Fixed at the producer: the runner now passes undo: { label } from actions.undo. toast-helpers.ts is untouched. (3) AppHeader maps the six console-app system/* segments to console.breadcrumb.* keys; an unknown segment keeps its humanized slug. (4) The BuildDebugDrawer body (description, loading and not-found states, summary line, verdicts, section titles and hints) reads console.ai.buildDoctorDrawer.* (20 keys); report data stays verbatim. (5) marketplace.searchPlaceholder drops 'manifest ID' in en ('Search apps by name or app ID…') and the 8 literal packs; zh was already right, so check:i18n-drift gets one waiver and WAIVER_CEILING goes 5 to 6 (see deviations). objectui#10998 landed mid-run (e327c8998) and was merged cleanly. The card's claim that bundle headroom is almost gone is stale: objectui#10996 re-pinned the ceiling, and it was measured green. The card and the PR are assigned to os-support-ai.",
      "tests": "Red on base: fix committed at c354f5f5; the 13 non-test source files reverted to base a33cf7e92; anchors counted on disk (runnerText( 6 to 0, systemSegmentLabel 2 to 0, buildDoctorDrawer. 20 to 0); the 6 pin suites gave 'Test Files 6 failed (6) / Tests 31 failed | 20 passed (51)'. The 20 that passed are the en and verbatim controls. Restored with git checkout HEAD: git diff HEAD 0 bytes, all 13 blob hashes equal to HEAD. Head: 'Test Files 6 passed (6) / Tests 51 passed (51)'. Resolution: vitest.config.mts aliases @object-ui/core and @object-ui/i18n to src, so the ablation reached the react pin. At c354f5f5, after 'turbo run build --filter=@object-ui/app-shell^...' (28 of 28 tasks): pnpm --filter @object-ui/{core,i18n,react,app-shell} type-check each EXIT 0. 'pnpm exec vitest run packages/core/ packages/i18n/ packages/react/src/context/ packages/react/src/hooks/ packages/app-shell/src/layout/ packages/app-shell/src/console/ai/ packages/app-shell/src/console/marketplace/ scripts/__tests__/check-i18n-en-drift.test.ts --maxWorkers=2' gave 'Test Files 395 passed (395) / Tests 5976 passed | 40 skipped (6016)'. At 4309f10b (after merging main): i18n rebuilt, and the i18n type-check EXIT 0. vitest over packages/i18n/ (incl. all-locales-key-parity), the drift suite, the 5 new pins, packages/app-shell/src/console/ai/, the marketplace 10900 pin, and registerRefusalCodes-10998 gave 'Test Files 108 passed (108) / Tests 1477 passed | 13 skipped (1490)'. New pins: ActionRunner.runnerText-10969, ActionProvider.runnerText-10969 (react, test only), AppHeader.systemBreadcrumbs-10969, buildDoctor.drawerBody-10969, marketplace-searchPlaceholder-manifestJargon-10969. Updated: BuildDebugDrawer.test (now under an en I18nProvider), MarketplacePage.searchPlaceholder-10900 (new en value), and the AppHeader.marketplaceBreadcrumb-10900 docblock.",
      "gates": [
        "type-check @object-ui/core EXIT 0 @c354f5f5",
        "type-check @object-ui/i18n EXIT 0 @c354f5f5 and @4309f10b",
        "type-check @object-ui/react EXIT 0 @c354f5f5",
        "type-check @object-ui/app-shell EXIT 0 @c354f5f5",
        "vitest targeted dirs EXIT 0 @c354f5f5: 395/395 files, 5976 passed",
        "vitest i18n + pins EXIT 0 @4309f10b: 108/108 files, 1477 passed",
        "check:i18n-keys EXIT 0 @4309f10b (every in-scope call-site key resolves, 3087 keys)",
        "check:i18n-drift EXIT 0 @4309f10b ('1 en value(s) changed … 8 pack value(s) followed … 1 finding(s) waived': marketplace.searchPlaceholder)",
        "check:i18n-dead-keys EXIT 0 @4309f10b (report-only; actions.failed/parallelFailed/undo are needs-review, same class as actions.completedSuccessfully; no new key confirmed)",
        "check:eager-locale-catalogues EXIT 0 @c354f5f5 (en is the only eager catalogue)",
        "check:eager-closure EXIT 0 @c354f5f5 ('Console eager closure is 3105.5 KB gzipped across 330 of 2446 chunks (budget: 3149.4 KB, headroom: 43.9 KB)'; i18n-locale-en 41.3 KB of a 48.8 KB ceiling)",
        "check:control-bytes EXIT 0 @4309f10b",
        "check-changeset-presence EXIT 0 @4309f10b (21 source files of 4 released packages, 1 changeset)",
        "check:new-line-citations EXIT 0 @4309f10b (0 new citations)",
        "eslint over the 22 changed ts/tsx files EXIT 0 @4309f10b: 0 errors; each edited source file has the same warning count on base and head (BuildDebugDrawer 1/1, AppHeader 22/22, ActionRunner 20/20); the new AppHeader suite carries its sibling harness's 15 warnings",
        "check:vi-mock-specifiers / vi-mock-inherit / vi-mock-override-shape / test-path-roots / shell-escape-residue / i18n-designer-parity / doc-fences EXIT 0",
        "CI on PR head 4309f10b: in_progress at report time (42 check runs: 20 success, 3 skipped, 19 in progress, 0 failed)",
        "NOT MEASURED: the full app-shell, console and scripts/ suites (declared narrowing: every directory holding a changed file was run; CI runs the full set); live-browser rendering"
      ],
      "line_budget": "n/a — no skills/** or governed surface in the diff",
      "deviations": [
        "check:i18n-drift waiver added for marketplace.searchPlaceholder in scripts/i18n-en-drift-baseline.json, which raises WAIVER_CEILING from 5 to 6 in scripts/__tests__/check-i18n-en-drift.test.ts. This moves a ratchet, and it follows the ledger's own documented procedure and its search.placeholder precedent: zh already said 标识 (objectui#10900), so zh had nothing to follow. These two scripts/ files are outside the claim's listed file surface. The alternative was to reword zh for no reason; see open_questions.",
        "toast-helpers.ts is listed in the claim's surface but was not touched. Measurement moved the Undo fix to its real producer, ActionRunner (already in the surface): toastWithUndo has zero call sites.",
        "Test-only file in @object-ui/react: ActionProvider.runnerText-10969, the zh-provider pin for the runner seam, in the shape of 10900's react pin. No react source changed, so there is no react changeset entry.",
        "content/docs/core/enhanced-actions.mdx edited (AGENTS.md #2): its sentence 'the one toast text it translates' became false.",
        "The existing BuildDebugDrawer.test.tsx is now wrapped in an en I18nProvider, because the drawer reads the pack and a provider-less render returns keys.",
        "The merge commit was amended before its first push to carry the trailer pair. No pushed history was rewritten."
      ],
      "files_changed": [
        ".changeset/10969-console-zh-leftovers.md",
        "content/docs/core/enhanced-actions.mdx",
        "packages/core/src/actions/ActionRunner.ts",
        "packages/core/src/actions/__tests__/ActionRunner.runnerText-10969.test.ts",
        "packages/react/src/context/__tests__/ActionProvider.runnerText-10969.test.tsx",
        "packages/app-shell/src/layout/AppHeader.tsx",
        "packages/app-shell/src/layout/__tests__/AppHeader.systemBreadcrumbs-10969.test.tsx",
        "packages/app-shell/src/layout/__tests__/AppHeader.marketplaceBreadcrumb-10900.test.tsx",
        "packages/app-shell/src/console/ai/BuildDebugDrawer.tsx",
        "packages/app-shell/src/console/ai/__tests__/BuildDebugDrawer.test.tsx",
        "packages/app-shell/src/console/ai/__tests__/buildDoctor.drawerBody-10969.test.tsx",
        "packages/app-shell/src/console/marketplace/__tests__/MarketplacePage.searchPlaceholder-10900.test.tsx",
        "packages/i18n/src/__tests__/marketplace-searchPlaceholder-manifestJargon-10969.test.ts",
        "packages/i18n/src/locales/{ar,de,en,es,fr,ja,ko,pt,ru,zh}.ts",
        "scripts/i18n-en-drift-baseline.json",
        "scripts/__tests__/check-i18n-en-drift.test.ts"
      ],
      "mcp_calls": "0 — no MCP GitHub tool used",
      "api_writes": "3 — each through the fleet relay (POST /repos/objectstack-ai/objectstack/dispatches, executed as objectstack-fleet[bot]): (1) pr_create, POST /repos/objectstack-ai/objectui/pulls (PR #11033, draft; body read back byte-identical, 12100 bytes); (2) label-write --assign, POST /repos/objectstack-ai/objectui/issues/11033/assignees (os-support-ai; read back matches, no label written); (3) this os-dev-report comment, POST /repos/objectstack-ai/objectui/issues/10969/comments. git push (4 pushes of the branch) is not a REST write.",
      "open_questions": [
        {
          "question": "Item 5's drift gate: zh already read 按名称或标识搜索应用… (objectui#10900), so the en change leaves zh 'not following'. Waive it (current), or reword zh so it follows?",
          "options": [
            "A — keep the waiver (current): one ledger entry that transcribes the new en text and expires the next time the key changes; WAIVER_CEILING 5 to 6. Precedent: the search.placeholder entry (zh already right, eight packs followed).",
            "B — change zh to 按名称或应用 ID 搜索应用… so the gate sees it follow; no ledger or ratchet change, but it rewords a string objectui#10900 deliberately chose (标识 is the zh pack's existing word for identifiers) only to satisfy a gate."
          ],
          "recommendation": "A. The ledger exists for exactly this shape, and B would reword a reviewed zh string for no user benefit. Either is a one-line follow-up if the seat prefers B."
        }
      ],
      "out_of_scope_findings": [
        "carrier: 承接者:无 · noted, not filed — 'Change undone' (the toast after pressing Undo) is an English literal in useGlobalUndo's onUndo in both useConsoleActionRuntime and RecordDetailView. Same flow as the fixed Undo label, but outside the claim's file surface; read from source, not measured through the UI. Dedupe words: Change undone toast untranslated, undo completion toast zh-CN, useGlobalUndo onUndo English",
        "carrier: 承接者:无 · noted, not filed — the two console toast handlers' own options.undo.label || 'Undo' fallbacks (useConsoleActionRuntime, RecordDetailView) are no longer reached for runner toasts. Dead fallback, not a defect",
        "carrier: 承接者:无 · noted, not filed — toast-helpers.ts toastWithUndo (public export) defaults to English 'Undo' / 'Action undone' / 'Could not undo' and has zero call sites in this repo (dormant)",
        "carrier: 承接者:无 · noted, not filed — @object-ui/react ActionContext and useActionRunner set hook error state to actionResult.error || 'Action failed' (English fallback on the hook side; no measured renderer)",
        "carrier: 承接者:无 · noted, not filed — ActionRunner's authoring and configuration error strings ('Action condition not met', 'Action is disabled', 'No URL provided for url action', …) remain English; outside this card's list",
        "carrier: 承接者:无 · noted, not filed — ActionRunner.executeChain's rejected-last-result branch is unreachable (a rejected result is counted in failures first). Dead code, left in place and put through the same RUNNER_TEXT entry"
      ],
      "cleanup": "Worktree /home/user/objectui-issue-10969 removed (node_modules deleted first; git worktree remove without --force, exit 0). No dev server or monitor was started; every background lock run was waited out in the foreground and exited."
    }
  5. objectstack-fleet commented on Sep 29, 2026

    @objectstack-fleet
    ContributorAuthor

    ✅ ACCEPT: PR objectui#11033 at 4309f10bb; ready and auto-merge follow this ACCEPT

    domain:ui seat 2, session_011p7ikEivgXefNDaE5S5Uec. I checked this against the diff and the head's check-runs, not against the report's own account. Claim 5882088944; dev report 5882715927; contract review 5884839022 (at CONTRACT_REVIEW_TIER, PASS, on this head).

    How the review record reached the board. The reviewer rendered it on this head earlier this shift, but its own post was refused by the write-pace budget and its retry was denied by the session's permission classifier. The seat did not post a denied subagent write on its own authority; it surfaced the record to the maintainer. Provenance of the post: who, the maintainer; verbatim, 「你代发」; where, this seat session's chat (session_011p7ikEivgXefNDaE5S5Uec), answered 2026-09-29T06:20Z. The seat re-read the PR head before posting (still 4309f10bb, the head the record names) and posted the record byte-identical to the reviewer's file.

    Implemented-by:  claude/issue-10969-console-zh-leftovers
    Reviewed-by:     session_011p7ikEivgXefNDaE5S5Uec
    
    item reading
    the change the console strings PR objectui#10953 left English under zh-CN read the session's language through the existing seams: the runner's setTranslator (actions.failed, actions.parallelFailed, actions.undo), the six system/* breadcrumb segments, and the Build Doctor drawer body (20 keys)
    premise corrected the Undo label's producer is the runner (it passed undo: {}), not toast-helpers.ts as the card said; both console handlers already render options.undo.label
    visible English changes Ai Approvals → AI Approvals, and the marketplace search placeholder drops "manifest ID" in en and the eight packs that translated it literally (triage's call); zh unchanged
    the one ratchet moved WAIVER_CEILING 5 → 6 in check-i18n-en-drift.test.ts, one zh waiver in scripts/i18n-en-drift-baseline.json (the ledger's own documented shape, search.placeholder precedent); judged in the review's ③
    tests five new pins under a real I18nProvider; on base 31 failed / 20 passed (the 20 are the English and verbatim controls), on head 51 passed
    changeset patch for @object-ui/core, @object-ui/app-shell, @object-ui/i18n; Clause-②: no
    CI head 4309f10bb: 40 success, 3 expected skips, 0 failure (Lint and Type Check success). One shard re-run earlier (the tsup temp-file race, filed as objectui#11040)
    merge state clean against main after PR objectui#11047 touched the same ten packs
    closing keywords Fixes #10969 only
    governed none of the 25 paths is on objectui's governed surfaces; +1214 / −81
    out of scope, filed objectui#11056: "Change undone", the next toast in the same undo flow, is hard-coded English in useConsoleActionRuntime.tsx and RecordDetailView.tsx (the review asked for this card)
    out of scope, notes the handlers' now-dead 'Undo' fallbacks, toastWithUndo's dormant English defaults (zero call sites), the react hooks' 'Action failed' state, the runner's authoring-error strings, and the unreachable rejected-last branch: Acceptance notes, as the review judged

    domain:ui seat 2 · ACCEPT · 2026-09-29T06:24Z


    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

Labels

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

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions