Skip to content

zh-CN leftovers from the 2026-09-28 cloud E2E: action success toast, env login SSO button and divider, Build Doctor, marketplace breadcrumb and placeholder #10900

Closed

Description

@hotlong

Source

Same two 2026-09-28 end-to-end runs as its sibling cards, with the browser in zh-CN. These are the objectui-owned strings from objectstack-ai/cloud#2435; the cloud-owned strings stay on that card. Epic: objectstack-ai/cloud#2440.

Strings shown in English under zh-CN

where text
generic action success toast, e.g. after a cloud welcome CTA Action completed successfully
environment login page Continue with ObjectStack · OR CONTINUE WITH EMAIL
build conversation header button Build Doctor
environment Setup → marketplace breadcrumb / search placeholder Marketplace · 「按名称或 manifest ID 搜索」 (manifest ID is jargon for customers)

Acceptance

Under zh-CN each surface above renders Chinese. The English source stays the default.

Activity

  1. added
    pm:epicParent delegated to a dedicated epic PM — other PMs never dispatch into its subtree
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    on Sep 28, 2026
  2. hotlong commented on Sep 28, 2026

    @hotlong
    ContributorAuthor

    Handoff from epic objectstack-ai/cloud#2440 (session 786273a0-0246-4bb2-b026-bb37ba5d7295) to the domain:ui lane.

    Maintainer, verbatim (epic session, 2026-09-28): 「除了你在飞的卡,其他卡交给 cloud 项目经理优先处理可以吗」

    What changes for this card:

    What stays: every ruling already recorded on this card remains binding.

    Notes for the dispatcher: strings only, all owned by objectui (table in the body). No overlap with the epic's in-flight #10899 beyond packages/app-shell generally; check its claim.

  3. added and removed
    pm:epicParent delegated to a dedicated epic PM — other PMs never dispatch into its subtree
    on Sep 28, 2026
  4. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    Contributor

    Claim: PM loop round 6
    Session: session_01DuWo5bdP9SdVebamn99GGk
    Account: os-steve (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-10900-zh-cn-leftovers
    Worktree: objectui-issue-10900
    Domain: domain:ui
    Seat: domain:ui#1
    File surface:

    • The generic action success toast default Action completed successfully, in packages/core/src/actions/ActionRunner.ts. It must render Chinese under zh-CN; the dev measures which layer can reach the translator.
    • The environment login's provider button (Continue with plus the provider name) and the or continue with email divider, in packages/auth/src/SocialSignInButtons.tsx and its callers LoginForm.tsx / RegisterForm.tsx.
    • The Build Doctor button and drawer title, in packages/app-shell/src/console/ai/AiChatPage.tsx and BuildDebugDrawer.tsx.
    • The environment Setup → marketplace breadcrumb Marketplace and the zh search placeholder's manifest ID jargon, in packages/app-shell/src/console/marketplace/** and the packages/i18n/src/locales/*.ts keys they read.
    • Tests pinning each surface under zh-CN with English as the default, and a patch changeset.

    The English source stays the default, per the card's acceptance. ⛔ Cloud-owned strings stay on objectstack-ai/cloud#2435.

    Stop on breach; explain in the report.
    Container & model: M, mode:subagent, model: opus (TIER_DEFAULT, objectstack scripts/pm/dispatch-gates.mjs:12692 at 7db1332f)
    Clause-②: no
    Why no: display strings and locale entries only; no schema, spec, published type or accepted document changes.
    Thread-read: 5864728339
    Serial constraints cleared: read 2026-09-28T08:58Z at objectui origin/main 29c76e573.

    • PR objectui#10924 (epic objectui#10899) holds MarketplacePackagePage.tsx and all ten locale files. The dev maps its hunks and keeps every new key and edit at least 5 lines clear of them; any overlap is a stop.
    • PRs objectui#10910 and fix(app-shell): read the single AI quota pool and draw one ring (objectui#8524) #10911 are in the merge queue with locale edits, and PR objectui#10914 is in the queue with comment-only lines in ActionRunner.ts. The dev merges origin/main before pushing, if they have landed by then.

    domain:ui seat #1 · claim · 2026-09-28T08:58Z


    Generated by Claude Code

  5. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    Contributor

    os-dev-report
    {
    "issue": 10900,
    "status": "done",
    "branch": "claude/issue-10900-zh-cn-leftovers",
    "pr": "#10953",
    "session": "session_01DuWo5bdP9SdVebamn99GGk — the dispatching seat's session (this run is a subagent of it)",
    "premise_still_valid": true,
    "summary": "All four surfaces now read the session's language, and English is unchanged as the default. (1) The runner's fallback toast goes through a translator injected by the new ActionRunner.setTranslator, which ActionProvider and useActionRunner install. An author's successMessage and a server message stay verbatim. (2) LoginForm / RegisterForm take a new socialButton template, and their existing orText label (documented as the divider but rendered nowhere) now reaches SocialSignInButtons. All four callers pass the new auth.* keys. (3) The Build Doctor button and drawer title read console.ai.* keys. (4) The system/marketplace breadcrumb segment reads console.breadcrumb.marketplace, and the zh placeholder drops the manifest ID jargon. Nine keys are in all ten packs, the draft PR is 10953, and CI on head f658263 completed 40 success and 3 skipped. Measured against the brief and claim: Clause-② is yes, not no (four optional public members), core and auth are declared minor, not patch (see open_questions), and the breadcrumb lives in layout/AppHeader.tsx, not console/marketplace/. Housekeeping slip: an unset shell variable made four gate logs land in the container root as /drift2.log, /keys2.log, /nlc2.log and /presence2.log. A safety check refused my removal, so they are still there for a person to delete.",
    "strings_changed": [
    "actions.completedSuccessfully (new key) — en 'Action completed successfully' (the runner's former English literal, unchanged) · zh 'Action completed successfully' → '操作已成功完成'",
    "auth.login.socialButton (new key) — en 'Continue with {provider}' (was the literal 'Continue with' + name, unchanged) · zh English → '使用 {provider} 继续'",
    "auth.login.orText (new key) — en 'or continue with email' (unchanged; CSS uppercases it) · zh English → '或使用邮箱继续'",
    "auth.register.socialButton (new key) — en 'Sign up with {provider}' (unchanged) · zh English → '使用 {provider} 注册'",
    "auth.register.orText (new key) — en 'or continue with email' (unchanged) · zh English → '或使用邮箱继续'",
    "console.ai.buildDoctor (new key; button accessible name and drawer title) — en 'Build Doctor' (unchanged) · zh English → '构建诊断'",
    "console.ai.buildDoctorTitle (new key; button tooltip) — en 'Build Doctor — what actually landed?' (unchanged) · zh English → '构建诊断 — 实际生效了哪些变更?'",
    "console.ai.buildDoctorDisabledTitle (new key; tooltip before the first message) — en 'Send a message first' (unchanged) · zh English → '请先发送一条消息'",
    "console.breadcrumb.marketplace (new key) — en 'Marketplace' (was humanizeSlug of the URL segment, same text) · zh 'Marketplace' → '应用市场'",
    "marketplace.searchPlaceholder (existing key, zh value only) — en 'Search apps by name or manifest ID…' unchanged · zh '按名称或 manifest ID 搜索应用…' → '按名称或标识搜索应用…'",
    "The other eight packs got their own translations of the nine new keys; no existing en value changed (check:i18n-drift: 0 en values changed, 9 keys added)."
    ],
    "zone2_measurements": [
    "Toast. @object-ui/core cannot import a translator: @object-ui/i18n depends on core, so importing it back would be a cycle. A toast handler gets only the final string, so it cannot tell the runner's fallback from an author's identical text. Every production runner is built by ActionProvider (ConsoleShell, ObjectView, RecordDetailView, DeclaredActionsBar, useConsoleActionRuntime's provider) or by useActionRunner (AppContent, useObjectActions), both in @object-ui/react, which already depends on @object-ui/i18n. Chosen: an injected translator on the runner, the same seam recordDelete takes its t through, installed by those two owners. It reads the latest t at call time, pinned by a language switch on an existing runner. No new dependency edge. The provider-less useAction() fallback stays English.",
    "Login. @object-ui/auth has no i18n dependency. Its channel is the forms' labels prop with English defaults, which the host fills from its t. SocialSignInButtons got no text props from the forms, and the orText label was defaulted but never rendered (its divider was folded into SocialSignInButtons). The uppercase is the divider's 'uppercase' class. The provider name goes in verbatim through a replacer function, so a dollar sign in a name is never read as a replacement pattern. Callers kept consistent: the console's LoginPage / RegisterPage and app-shell's DefaultLoginPage / DefaultRegisterPage.",
    "Build Doctor. ChatPane's Share button beside it already read console.ai.share* through ChatPane's useObjectTranslation t; the button and BuildDebugDrawer's title use the same one. The drawer body is left English (scope: the title).",
    "Marketplace. Falsified: the breadcrumb is not under console/marketplace/
    . AppHeader's system branch rendered humanizeSlug of the segment after 'system' for every system page. AppContent mounts only the system/marketplace routes itself; the other system pages are host-mounted. The search filter matches the localized display name, manifest_id and the localized description by substring. The zh placeholder names the name and 标识, the identifier each card prints under its name as code, which is the zh pack's existing word for identifiers. A pin types a name-only term and an identifier-only term into the real filter.",
    "Parity rule. packages/i18n all-locales-key-parity.test.ts: every en key must be in all nine other packs and no pack may define a key en lacks. So all ten packs got the nine keys; a fallback-only (en/zh) addition would be red.",
    "Serial constraints. 10910, 10911 and 10914 had landed before the first edit (merge-base --is-ancestor exit 0 for both merge commits), and the branch fast-forwarded onto 1dae95a before any commit. 10924 landed mid-work (ac15833) and is merged in by merge commit f658263; git merge-tree reported the merge clean beforehand. Hunk map: 10924's locale hunks add commentFailed and widgetForbiddenTitle / widgetForbiddenMessage in the detail and dashboard blocks, while mine are in actions, console.breadcrumb, console.ai, auth.login, auth.register and zh marketplace.searchPlaceholder, hundreds of lines clear. 10924 also touched AppHeader.tsx (not named in the brief): the imports, the useWorkspaceAdminStatus block and the studioDesignPath block, 30+ lines from my system-branch edit. MarketplacePackagePage.tsx is untouched."
    ],
    "tests": "Pins, 8 new suites, each rendering the real component or running the real runner under a real I18nProvider in zh and in en: core ActionRunner.defaultSuccessToast-10900; react ActionProvider.defaultSuccessToast-10900 (ActionProvider + useActionRunner + language switch); auth socialButtonLabels-10900; console socialButtonsLocale-10900; app-shell authPages.socialLabels-10900, buildDoctor.locale-10900, AppHeader.marketplaceBreadcrumb-10900 and MarketplacePage.searchPlaceholder-10900. RED ON BASE: with the fix committed (4304af1), 23 non-test source files were checked out at base 1dae95a. On disk, setTranslator / buttonText / console.ai.buildDoctor / console.breadcrumb.marketplace / completedSuccessfully each counted 0, and 'manifest ID' in zh counted 1. Result: 'Test Files 8 failed (8)', 'Tests 19 failed | 17 passed (36)'. The 17 passing are the en controls; the core translator cases fail on base with 'TypeError: runner.setTranslator is not a function'. The trap restored from HEAD, then 'RESTORE OK: 23 paths byte-equal to HEAD, git diff HEAD empty'. GREEN: all 8 pin suites pass inside the head union run below. REVERSE TYPE CHECK (objectstack scripts/ablation-replace.mjs; the first attempt was a no-op that the tool refused because the anchor did not drop): 'orText' became 'orTextTypo' in app-shell LoginPage, and app-shell tsc --noEmit answered exactly 'TS2353 ... orTextTypo does not exist in type LoginFormLabels'. That proves the rebuilt auth .d.ts is read; restore was blob == HEAD and git diff HEAD empty. UNION AT HEAD f658263 (after merging main 5c94589): turbo build of @object-ui/console^... 34/34; type-check exit 0 with 0 'error TS' for core, i18n, react, auth, app-shell and console (script name echoed in each log). vitest --maxWorkers=2 over packages/core/ packages/react/ packages/auth/ packages/i18n/, app-shell src/layout, src/console/ai, src/console/auth and src/console/marketplace, and apps/console/src/pages/auth: 'Test Files 479 passed (479)', 'Tests 7063 passed | 13 skipped'. check:control-bytes, check:i18n-keys, check:i18n-drift ('0 en value(s) changed (9 key(s) added)'), check-changeset-presence and check:new-line-citations ('0 new citation(s)') all exit 0. AT 9ab3b72 (pre-merge): full packages/app-shell/ + apps/console/ 'Test Files 978 passed | 1 skipped (979)', 'Tests 10202 passed | 9 skipped'; core+react+auth+i18n 'Test Files 385 passed (385)'; all scripts/ suites 'Test Files 177 passed | 2 skipped (179)'. ESLint --no-inline-config over the 32 changed TS files: 0 errors, and each changed source file's warning count equals base (per-file base vs head via --stdin). check:readme-exports judged the auth README clean; its remaining 8 unjudged imports are cli / plugin-ai, which this diff does not build or touch. check:i18n-dead-keys (report-only) lists actions.completedSuccessfully as needs-review with a textual hit in ActionRunner.ts, not confirmed dead. DECLARED NARROWING: after the merge, the full app-shell / console / scripts suites were not re-run locally. CI on f658263: all 43 check-runs completed, 40 success and 3 skipped (Test coverage x2, dependabot), including Spec Main Shape Gate, Type Check, Lint, Test shards 1-8, Test (dist pins) and Bundle Analysis, so the locally NOT MEASURED eager-closure budget is green in CI.",
    "mcp_calls": "0 — none; all GitHub reads were REST GETs with curl.",
    "api_writes": "3 — each one POST /repos/objectstack-ai/objectstack/dispatches through the fleet-write relay: (1) pr_create, which became POST /repos/objectstack-ai/objectui/pulls, draft, PR 10953, relay run 36410595241 success; (2) label-write --assign os-steve on PR 10953 via the relay, run 36410695805 success, read back with assignees os-steve; (3) this os-dev-report comment on issue 10900. git push is not counted: 4 pushes to the branch (the empty-branch probe, then three fast-forward updates).",
    "open_questions": [
    {
    "question": "Clause-② on PR 10953. The claim and the brief said 'Clause-②: no' on the premise of strings only. The implementation adds four optional public members: ActionRunner.setTranslator in core, SocialSignInButtonsProps.buttonText, and LoginFormLabels.socialButton / RegisterFormLabels.socialButton in auth. The PR body's line-start therefore reads 'Clause-②: yes'. Keep it, or amend?",
    "options": [
    "A keep 'Clause-②: yes' (the public surface widens additively; nothing narrows)",
    "B the seat amends the body to 'no', on the view that optional additive members are not a widening in the sense the line asks"
    ],
    "recommendation": "A. The question the line answers is whether the card widens the accept set or the public surface, and four new exported members answer it yes. The repository's precedent writes 'Clause-②: yes' for an additive widening."
    },
    {
    "question": "Changeset bump levels. The brief said patch for every released package touched. The changeset declares minor for @object-ui/core and @object-ui/auth, because they widen, and patch for react, i18n, app-shell and console. Keep it, or make all six patch?",
    "options": [
    "A keep minor for core and auth",
    "B the seat edits the changeset to patch for all six"
    ],
    "recommendation": "A. This follows the repository's precedent for a widening (minor plus 'Clause-②: yes'). Because the fixed group has many pending minors, the release version does not move either way; only the CHANGELOG section differs."
    }
    ],
    "out_of_scope_findings": [
    "carrier: 承接者:无 · noted, not filed — the other system/* breadcrumb segments the console host mounts (settings, apps, profile, approvals, ai-approvals, audit-log) still render their humanized English slug under zh. Read from AppHeader's system branch, not measured through the UI; recorded in the PR's Acceptance notes.",
    "carrier: 承接者:无 · noted, not filed — the Build Doctor drawer body (description, verdict lines, section titles) is still English. Only the title was in this card's scope.",
    "carrier: 承接者:无 · noted, not filed — the runner's other English fallbacks remain: 'Action failed' (error toast for a non-string error), 'One or more parallel actions failed', and the 'Undo' label on an undoable success toast in useConsoleActionRuntime. setTranslator is the seam for them.",
    "carrier: 承接者:无 · noted, not filed — the eight non-zh packs translate 'manifest ID' literally in marketplace.searchPlaceholder, and the en source says 'manifest ID' too. The card flagged zh only.",
    "carrier: 承接者:无 · noted, not filed — LoginForm keeps a hasSocialProviders state that nothing reads (an existing lint warning, count unchanged)."
    ]
    }


    Generated by Claude Code

  6. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    Contributor

    Claim amended: Clause-② reads yes · domain:ui seat #1 · 2026-09-28T10:53Z

    session_01DuWo5bdP9SdVebamn99GGk (os-steve). This amends claim 5866735286, after the dev report on PR objectui#10953.

    Clause-②: yes

    Why yes. The claim read no on the premise of strings only. Measured on the PR head f6582636f, the repair widens published surface additively, by four optional members:

    • ActionRunner.setTranslator in @object-ui/core. @object-ui/core cannot import the translator, because @object-ui/i18n depends on core; so the runner's fallback toast takes an injected translator, which ActionProvider and useActionRunner install.
    • SocialSignInButtonsProps.buttonText, LoginFormLabels.socialButton and RegisterFormLabels.socialButton in @object-ui/auth. That package's string channel is the forms' labels prop.

    Nothing narrows. The seat takes the dev's recommendations on both of its open questions:

    • A: the body keeps Clause-②: yes.
    • A: the changeset keeps minor for @object-ui/core and @object-ui/auth, and patch for the four other packages touched, following the repository's precedent for an additive widening.

    Surface. The claim's file list also widens by packages/react (the two runner owners that install the translator) and packages/app-shell/src/layout/AppHeader.tsx. The marketplace breadcrumb is rendered there, not under console/marketplace/**, as the claim had assumed.

    Consequence. needs:contract-review hangs on this card and on the PR in this stroke. An at-tier Clause-② review PASS is owed before the PR is readied or queued.

    domain:ui seat #1 · claim amendment · 2026-09-28T10:53Z


    Generated by Claude Code

  7. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    Contributor

    ACCEPT — PR objectui#10953 (Fixes) · domain:ui seat #1 · 2026-09-28T11:37Z

    session_01DuWo5bdP9SdVebamn99GGk (os-steve), the dispatching seat. Checked against GitHub and origin/main, ⛔ not against the reports.

    Checklist

    • Shape. Draft → main. The body opens Fixes #10900. Clause-②: yes sits at line start (claim amendment 5868466841). PR assignee os-steve.

    • Scope. 35 files, +1289 / −19. All four surfaces on the card now read the session's language under zh-CN, and English stays the default:

      • the runner's fallback success toast, through ActionRunner.setTranslator, which ActionProvider and useActionRunner install;
      • the login and register provider buttons and divider, through new labels members;
      • the Build Doctor button and drawer title;
      • the system/marketplace breadcrumb and the zh search placeholder.

      Nine keys are added to all ten packs, and no existing en value changed. minor for @object-ui/core and @object-ui/auth, which widen by four optional members; patch for react, i18n, app-shell and console.

    • Governed-surface predicate. 35 paths: NOT governed (AGENTS.md lit control: exit 3). Tier S: queue landing.

    • Checks on head 7c740d369. 43 check-runs: 40 success, 3 skipped, 0 failure, Spec Main Shape Gate and Bundle Analysis included. The eager closure is 3103.3 KB against a 3104.5 KB budget; most of the recent growth is main's own.

    • Commits. Four commits, every trailer model-free, checked by the reviewer with objectstack's trailer checker.

    • Clause-② review, at tier.

      • Record 5868740252: PASS at f6582636f, with three wording defects D1 to D3.
      • D1 was closed by commit 7c740d369, a changeset sentence only. The seat patched the PR body for D1 to D3.
      • Delta record 5869064475: Served-tier: CONTRACT_REVIEW_TIER, head 7c740d3698edbf7eccce9a45c4a8f529419d73ad (the current head), independence pair present, PASS. It confirmed all three closed, and re-read the seven pending changesets that name a touched file: none is made false.
    • Carriers. With the PASS on the current head, the seat strips needs:contract-review from this card and from PR objectui#10953 in this stroke. Provenance: record 5869064475 at 7c740d369.

    Follow-ups noted, not in this PR (the dev's out-of-scope findings, confirmed true by the review):

    • other system/* breadcrumb segments;
    • the Build Doctor drawer body;
    • the runner's other English fallbacks (Action failed, One or more parallel actions failed, and the Undo default in app-shell's toast helpers);
    • the literal manifest ID in en and the eight non-zh packs.

    The seat files one follow-up card for these at the merge.

    Landing: not governed, green, at-tier Clause-② PASS on the current head ⇒ pr_ready then automerge_enable through the relay, in this act. The card closes via Fixes.

    domain:ui seat #1 · ACCEPT · 2026-09-28T11:37Z


    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

domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seati18npriority:p1

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions