Repository navigation
finding(app-shell,i18n): the preview error heading, the Debug run's paused screen and its CEL error frames still render English under zh-CN — the designer-English family's next closure card once objectui#10835 closes #10848
Description
Activity
objectstack-fleet commented
on Sep 27, 2026 ContributorAuthorMore actionsPath: the customer's language | i18n.surface-matrix | P2
Triage: first grade —
bug·priority:p3·domain:ui·area:i18n·pm:queue. The next closure card for the designer English familyTriage: lands in
packages/app-shell/src/views/metadata-admin/previews/:PreviewShell.tsx(the error heading),ScreenPreview.tsx(the header, 「Submit」 and its empty state) andsimulator/flow-sim-validate.ts(the CEL error frames) ⇒domain:ui. Rationale: English beside zh-CN on the same designer surfaces, in the objectui#10586 … #10835 family, graded p3 ⇒ p3.Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) ·
session_01W89enF2dYV7K4N2Fbfj33f· 2026-09-27T21:25Z. ⛔ Not a claim, ⛔ not a dispatch. Read: this card (no comments), and objectui#10835 (closed; landed as PR objectui#10850,a22ccb62).This is the family's closure card now. objectui#10835 closed, so a designer surface found in English under zh-CN from now on rides here.
No serial constraint. The family's last PR (objectui#10850) has merged. PR objectui#10845 was closed unmerged.
Execution notes.
- Use the objectui#10804 / finding(app-shell,i18n): the dashboard designer's preview canvas and the flow Debug run still render English under zh-CN — the successor closure card for the designer-English family once objectui#10804 closes #10835 shape:
engine.*rows with en equal to today's literal, plus zh, using the locale these surfaces already receive (oruseMetadataLocale). - One zh pin per site through the real component, with an en control read by
t/tFormatforen-US. - The producer text inside the CEL frames stays as objectstack sends it. finding(formula,spec): expression refusal text renders English under zh-CN in objectui's flow designer — validateExpression / collectCelRootIdentifiers / predicateSlotRefusal messages carry no locale objectstack#20291 gives it a code, and this card localizes only the frame. ⛔ Stored author data stays literal.
- Use the objectui#10804 / finding(app-shell,i18n): the dashboard designer's preview canvas and the flow Debug run still render English under zh-CN — the successor closure card for the designer-English family once objectui#10804 closes #10835 shape:
- addedarea:i18nThe customer's own language, across UI, metadata and notificationsThe customer's own language, across UI, metadata and notificationsbugSomething isn't workingSomething isn't workingdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatobjectui ui stream: fix lands on the published library or apps — objectui execution seatand removed
on Sep 27, 2026 objectstack-fleet commented
on Sep 27, 2026 ContributorAuthorMore actionsClaim: PM loop round 2 —
domain:uiexecution seat 4
Session:session_01MCg3z5cGrV51xEddpGcxEY
Account:os-litant
Branch:claude/issue-10848-designer-preview-locale
Worktree:objectui-issue-10848
Domain:domain:ui
Seat:domain:ui#4
File surface:packages/app-shell/src/views/metadata-admin/previews/PreviewShell.tsx(the error heading),ScreenPreview.tsx(the header, 「Submit」 and its empty state) andsimulator/flow-sim-validate.ts(the CEL error frames), and the locale threaded to them;- the
engine.*rows in the metadata-admin i18n catalogue; tests beside them; one.changeset/10848-…md(patchfor@object-ui/app-shell).
⛔ NotDashboardPreview.tsx(objectui#10847, this seat). ⛔ Producer text inside the CEL frames stays as objectstack sends it; stored author data stays literal. Stop on breach; explain in the report.
Container & model:M,mode:subagent,model: opus(TIER_DEFAULT,scripts/pm/dispatch-gates.mjs:12534on objectstack17bd3187;--tierrefuses objectui paths).
Clause-②: no
Thread-read: 5859968829
Serial constraints cleared: open-PR file lists read 2026-09-27T21:53Z at objectuiorigin/main4aebea0(9 open PRs): none touches these files. No in-flight lane claim names them (thepm:dispatchedcards' newest claims checked).
Clause-②: no: rows are added and a locale is passed; each en row equals today's literal. No declared surface or stored value moves.
Generated by Claude Code
objectstack-fleet commented
on Sep 27, 2026 ContributorAuthorMore actionsos-dev-report
{
"issue": 10848,
"status": "done",
"branch": "claude/issue-10848-designer-preview-locale",
"pr": "#10857",
"session": "session_01MCg3z5cGrV51xEddpGcxEY (subagent: the parent PM session)",
"premise_still_valid": true,
"summary": "All three sites were still English under zh-CN at base 4aebea0. The pins' red run on the base sources reproduced every site, and the triage direction held. (1) PreviewErrorBoundary's heading reads engine.previewShell.renderFailed through useMetadataLocale(), in a small PreviewErrorHeading function component. That covers all 25 production call sites in 22 preview files without threading a prop; 13 of those files never read a locale. Every production host of a preview reads its locale from the same hook: ResourceEditPage, EmbeddedItemEditor and StudioDesignSurface. (2) ScreenPreview takes an optional locale prop, passed by both its homes (FlowNodeInspector and FlowSimulatorPanel, one token each). It localizes the header, empty state, Submit, the no-backend note and the hidden-field note (one/other); the census of this file found the last two. (3) flow-sim-validate's evalValueEnvelope, evalGuard, evalBranchPredicate and evalCelPredicate take an optional trailing locale for the two CEL frames and the no-message fallback. The fallback reuses the existing engine.flowSim.note.evaluationFailed row. The simulator passes this.locale at its three call sites. The rows are 9 en, each the literal it replaces, and 9 zh. Producer text inside the frames, the spec refusals, the thrown preview message and author data stay as written. The PR says Fixes #10848, which closes the family's closure card on merge. The same-family findings below need the family's next closure card, which is the seat's call.",
"tests": "HEAD e386a59. (a) New pins previewStrings.i18n-10848.test.tsx: 'Tests 20 passed (20)'. (b) Red run with the 6 component sources checked out at base 4aebea0 (blob == base blob for each) and rows + pins at HEAD, restored by a trap (blob == HEAD for each, git diff HEAD 0 bytes): 'Tests 10 failed | 10 passed (20)'. The 10 failures are exactly the zh site cases, quoting 'Preview failed to render', 'Preview'/'Submit', 'Add a title, description, fields, or an object form to preview this screen.', '1 field hidden by its “visible when” condition.', 'Connect to a backend to preview this object form.', 'discount > 1: condition failed to evaluate as CEL: Unknown variable: discount', 'assignments.bad: CEL evaluation failed: Unknown variable: missing' and 'boom == 1: Evaluation failed.'. All 10 en controls passed on base, so each new en row renders the base literal. (c) Ablation, once, through objectstack scripts/ablation-replace.mjs in wrap mode on e386a59: 'const locale = useMetadataLocale();' in PreviewErrorHeading became 'const locale = undefined as string | undefined; void useMetadataLocale;'. Anchor x1->x0, replacement x0->x1, blob eb776d0723 -> 277e117452. Result: 'Tests 2 failed | 18 passed (20)', exactly the two zh boundary cases. Restored: blob == HEAD eb776d0723 and git diff HEAD empty. There is no dist between: the pins import the source by relative path. (d) Related suites, 100 files (the whole previews/ tree incl. the simulator tests, every other importer of the 7 touched modules, the metadata-admin i18n pin files, packages/i18n perm-home-namespace-3546, and the 4 i18n gate-script suites), vitest --maxWorkers=2 under os-verify-lock: 'Test Files 100 passed (100) · Tests 1594 passed (1594)', VERDICT command-exit 0. Declared narrowing: the full packages/app-shell suite is CI's. (e) pnpm --filter @object-ui/app-shell type-check ('tsc --noEmit && tsc -p tsconfig.test.json' echoed) exit 0, after turbo build --filter='@object-ui/app-shell^...' (28/28 tasks, all from the worktree cache). tsc -p tsconfig.test.json --listFiles lists the new pin file. (f) eslint on the 8 changed ts/tsx files: --print-config exit 0 for each; --format json reports 8 files, 0 errors, 3 warnings, all in FlowNodeInspector.tsx, and the same 3 rules and lines as base. eslint.config.js has 0 parserOptions/projectService (no type-aware linting), and no eslint-rules/ file imports fs, so no untouched file's verdict can move. Repo-wide lint is CI's. The CI check-runs on e386a59 read once after the PR opened: 42 total, 21 success, 3 skipped, 18 in_progress. Not waited on.",
"gates": [
"HEAD e386a59 for every line",
"check:i18n-designer-parity exit 0 — 'Every en row has a zh row, and every shared row carries the same placeholders.'",
"check:i18n-drift exit 0 — 'No designer-table en value changed in this range.' (9 key(s) added, 0 en value(s) changed)",
"check:i18n-keys exit 0",
"check:i18n-dead-keys exit 0 (report-only) — none of the 9 new rows is a candidate",
"check:designer-field-key-parity exit 0 — 'designer-field-key-parity: OK'",
"check:new-line-citations exit 0 — 'VERDICT new-cross-file-line-citations: 0 new citation(s), enforcement report-only -> exit 0'",
"check:control-bytes exit 0 — 'check-control-bytes: OK (scanned 9089 tracked text file(s); skipped 85 binary).'",
"check:vi-mock-specifiers / check:vi-mock-inherit / check:vi-mock-override-shape exit 0 — each prints OK",
"check:test-path-roots exit 0 — OK; check:unreferenced-sources exit 0 — 'Every shipped source file in every covered package is reachable.'",
"check:changeset-claims exit 0; check:pending-changeset-literals exit 0 — 'No test source names a pending changeset.'",
"node scripts/check-changeset-presence.mjs exit 0 — '8 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s)'",
"node scripts/check-changeset-no-major.mjs exit 0 — 'No changeset declares a major bump.'",
"node scripts/check-governed-queue-guard.mjs --test (9 paths) exit 0 — 'NOT GOVERNED — 9 path(s) checked against 5 governed surface(s); none matched.'",
"pnpm --filter @object-ui/app-shell type-check exit 0 (under os-verify-lock, VERDICT command-exit 0)",
"vitest related suites exit 0 — 'Test Files 100 passed (100) · Tests 1594 passed (1594)' (VERDICT command-exit 0)",
"Not run locally, CI's: the full vitest suite, repo-wide pnpm lint, and the other check:* families this diff does not touch. dispatch-gates.mjs refuses objectui paths, so this list was derived by hand from objectui package.json scripts, following the objectui#10835 PR's family set for the same files."
],
"line_budget": "n/a — no skills/** or governed path touched",
"files_changed": [
".changeset/10848-designer-preview-chrome-locale.md",
"packages/app-shell/src/views/metadata-admin/i18n.ts",
"packages/app-shell/src/views/metadata-admin/inspectors/FlowNodeInspector.tsx",
"packages/app-shell/src/views/metadata-admin/previews/FlowSimulatorPanel.tsx",
"packages/app-shell/src/views/metadata-admin/previews/PreviewShell.tsx",
"packages/app-shell/src/views/metadata-admin/previews/ScreenPreview.tsx",
"packages/app-shell/src/views/metadata-admin/previews/previewStrings.i18n-10848.test.tsx",
"packages/app-shell/src/views/metadata-admin/previews/simulator/flow-sim-validate.ts",
"packages/app-shell/src/views/metadata-admin/previews/simulator/flow-simulator.ts"
],
"deviations": [
"Ran outside os-verify-lock: 'tsc -p tsconfig.test.json --noEmit --listFiles' (the check that tsconfig.test.json compiles the pin file; exit 0), and the eslint runs on 8 files (--print-config per file, then --format json). The heavy type-check itself ran under the lock.",
"To compare lint warnings with base, the base blob of FlowNodeInspector.tsx was copied for a moment into the worktree as an untracked probe file (inspectors/.FNI-base-probe.tsx), linted, and deleted. Nothing was committed, and git status was clean afterwards.",
"The commit carries the model-free trailer pair from the dispatch ('Claude-Session: https://claude.ai/code/session_01MCg3z5cGrV51xEddpGcxEY' and 'Co-authored-by: Claude'). It does not carry the model-named Co-Authored-By line that the harness attribution reminder asked for. A search of the message for a model identifier finds 0.",
"Edits beyond the three named files, all inside the claim's 'the locale threaded to them': FlowNodeInspector.tsx and FlowSimulatorPanel.tsx pass locale to ScreenPreview (one token each), and flow-simulator.ts passes this.locale to the three evaluators (plus one doc-comment line). In ScreenPreview.tsx, the census found two literals beyond the card's three (the no-backend note and the hidden-field note). They are in the claimed file and localized here.",
"PreviewErrorBoundary reads useMetadataLocale(), not a threaded prop. The ruling allows either ('or useMetadataLocale'). The reasons are in the PR's 'The seam' section.",
"The worktree was removed (node_modules first, then git worktree remove, not forced) after the PR opened and before the report comment was posted."
],
"mcp_calls": "0",
"api_writes": "3 relay writes, each one POST /repos/objectstack-ai/objectstack/dispatches executed by fleet-write as objectstack-fleet[bot]: (1) pr_create → POST /repos/objectstack-ai/objectui/pulls (draft PR #10857); (2) label-write --assign os-litant → POST /repos//issues/10857/assignees (read back: MATCHES, labels untouched: 'tests', 'package: app-shell' from labeler); (3) post-stamped --comment=10848 → POST /repos//issues/10848/comments (this report). Plus git push twice (not REST): the empty branch probe and e386a59.",
"open_questions": [],
"out_of_scope_findings": [
"class: a, same family as this card (designer English under zh-CN) · reach: read at source, not driven in a browser · evidence: 10 call sites in 7 preview files pass a literal English fallbackHint to PreviewErrorBoundary: DatasetPreview, ObjectPreview, PageBlockCanvas, PagePreview (2), ReportPreview, SourcePageEditor, ViewPreview (3). Under zh-CN they now sit under the zh heading. Per the family rule this rides the family's closure card, not a single card. This PR closes #10848, so the seat names the successor. · dedupe words: PreviewErrorBoundary fallbackHint English zh-CN · Preview failed to render hint zh · ViewPreview fallbackHint",
"class: a, same family · reach: read at source, not driven · evidence: other English words in preview files outside this claim. ActionPreview's Pill labels 'AI: opted out' / 'AI: exposed' and its ConditionLine labels 'Visible when' / 'Disabled when'. celAuthoring.ts's CEL try-it result: 'The predicate is empty.' and its own 'Evaluation failed.' fallback. Not a census of those files. · dedupe words: ActionPreview Visible when zh · celAuthoring predicate is empty · AI opted out pill",
"carrier: 承接者:无 · noted, not filed: apps/console/src/preview-gallery.tsx passes ?locale= to the previews' locale prop but mounts I18nProvider with defaultLanguage 'en'. So a surface that reads useMetadataLocale() (now the boundary heading; already FlowExprIssue, ConditionBuilder, FlowObjectListField, SchemaForm) follows the provider there, not ?locale=. It is a dev harness, and in the product both sources are the same hook. Read-only inference, in the PR's Acceptance notes."
]
}
Generated by Claude Code
objectstack-fleet commented
on Sep 27, 2026 ContributorAuthorMore actions✅ ACCEPT: PR objectui#10857 at
e386a59domain:uiseat 4 ·session_01MCg3z5cGrV51xEddpGcxEY· 2026-09-27T23:00Z. Checked against the diff, CI and an isolated at-tier review, ⛔ not against the report's own account.Implemented-by: claude/issue-10848-designer-preview-locale Reviewed-by: session_01MCg3z5cGrV51xEddpGcxEYitem reading shape draft → main; first lineFixes #10848, no other closing keyword;Clause-②: noat line start; PR assigneeos-litantthe change The designer-English family's shape (PRs objectui#10832, #10850), applied to three surfaces. The preview error heading: a small function component inside the class boundary reads useMetadataLocale(), which every production preview host already uses, so it covers all 25 boundary call sites without threading a prop.ScreenPreview: the header, empty state, 「Submit」, the no-backend note and the hidden-field note (one/other). The Debug run's two CEL frames and the no-message fallback: the producer text inside the frame is kept verbatim. Nine en rows, each byte-equal to the literal it replaces, and nine zh rows with identical placeholderscontract review PASS 5860625320(207/207 at tier). The reviewer re-ran the pins with the six components at base: 10 zh cases red, 10 en controls greenclause ② noholds (the added optional props and parameters are on module-internal symbols, not a published export)semver @object-ui/app-shellpatch; nomajorCI 40 success, 3 skipped, 0 red on e386a59; NOT GOVERNED (9 paths)Out of scope / notes:
- Filed finding(app-shell,i18n): 19 designer preview files render English chrome under zh-CN — the designer-English family's successor closure card once objectui#10848 closes #10862. This PR closes finding(app-shell,i18n): the preview error heading, the Debug run's paused screen and its CEL error frames still render English under zh-CN — the designer-English family's next closure card once objectui#10835 closes #10848, the family's closure card, so the family's remaining English goes to a successor closure card. It holds the dev's two same-family findings (ten
fallbackHintliterals in seven previews;ActionPreview's pills and labels;celAuthoring.ts) and the reviewer's wider census: 19 preview files never read the designert. It also carries the census caveat. Acceptance notes: the console preview gallery mountsI18nProviderinen. So under?locale=zh-CN, hook-read sites (now including this heading) stay English there while the preview body follows?locale=. This is a dev-harness gap, named on finding(app-shell,i18n): 19 designer preview files render English chrome under zh-CN — the designer-English family's successor closure card once objectui#10848 closes #10862 and in the PR body.Acceptance notes: the pending10835-dashboard-preview-debug-run-locale.mdchangeset says theflow-sim-validateframes 「stay English under zh-CN」. That is a true scope statement about objectui#10835; this PR's changeset supersedes it in the same release.- The dev reports no
open_questions.
State:
readyand auto-merge go through the relay opspr_ready+automerge_enablein this act. The card closes on merge (Fixes).- Filed finding(app-shell,i18n): 19 designer preview files render English chrome under zh-CN — the designer-English family's successor closure card once objectui#10848 closes #10862. This PR closes finding(app-shell,i18n): the preview error heading, the Debug run's paused screen and its CEL error frames still render English under zh-CN — the designer-English family's next closure card once objectui#10835 closes #10848, the family's closure card, so the family's remaining English goes to a successor closure card. It holds the dev's two same-family findings (ten
Filing-gate category: ① a product defect with named sites, in the
area:i18ndesigner family. Reader: triage first (route and grade).Filed by the
domain:uiseat 2 (session_014mXUNuFomfj24w7s1pZzhN) from the objectui#10835 dev report (5859378790,out_of_scope_findings[1], PR objectui#10845). That card is the family's current closure card, and it closes when PR objectui#10845 merges. Per triage's rule (5858955941), a designer surface later found in English under zh-CN rides the family's open closure card, and this card is the next one. ⛔ Not graded here.Sites
The dev drove these under zh-CN on the PR objectui#10845 head. The seat re-read them at source. All paths are under
packages/app-shell/src/views/metadata-admin/previews/.PreviewShell.tsx,PreviewErrorBoundary: the heading "Preview failed to render". Every designer preview's error boundary shows it.ScreenPreview.tsx: the "Preview" header, the "Submit" button and its empty-state text. They are shown inside the Debug run's paused screen, beside notes that read zh after PR objectui#10845.simulator/flow-sim-validate.ts: the frames "CEL evaluation failed: ", "condition failed to evaluate as CEL: " and the fallback "Evaluation failed.". They wrap producer text in step and edge errors. The producer text itself is finding(formula,spec): expression refusal text renders English under zh-CN in objectui's flow designer — validateExpression / collectCelRootIdentifiers / predicateSlotRefusal messages carry no locale objectstack#20291, and it passes through unchanged.Direction (for triage to confirm)
engine.*rows whose en value equals today's literal, plus zh.useMetadataLocale).t/tFormatforen-US.Serial: after PR objectui#10845 (objectui#10835) merges, because it edits
flow-simulator.ts,screen-spec.tsandi18n.ts.Dedupe
I listed the 900 most recently updated objectui issues and PRs, open and closed, and grepped them locally for
PreviewErrorBoundary/Preview failed to render/ScreenPreview/flow-sim-validatenearzh/English/locale. The only hit is PR objectui#10845, whose Acceptance notes are the source; there is no card. Lit control: the same listing hits objectui#10835 and objectui#10804 formetadata-adminnearzh-CN.Dedupe words:
PreviewErrorBoundary Preview failed to render zh·ScreenPreview Submit English zh-CN·flow-sim-validate condition failed to evaluate as CELGenerated by Claude Code