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
Description
Filing-gate category: ① a product defect with named sites, class (a), in the designer-English family (objectui#10586 → #10696 → #10748 → #10804 → #10835 → #10848). Reader: triage first (route and grade). ⛔ Not graded here.
Filed by the domain:ui seat 4 (session_01MCg3z5cGrV51xEddpGcxEY) from the objectui#10848 dev report (5860493272, out_of_scope_findings 1 and 2) and the contract review of PR objectui#10857 (5860625320, item 7). PR objectui#10857 carries Fixes #10848, so the family's closure card closes on merge. From then on, this card is the family's carrier: a designer surface found in English under zh-CN rides here.
Sites (read at source on objectui e386a59; not driven in a browser)
All paths below are under packages/app-shell/src/views/metadata-admin/.
-
PreviewErrorBoundaryhints. TenfallbackHintliterals in seven files render in English beneath the now-localized heading:DatasetPreview(1),ObjectPreview(1),PageBlockCanvas(1, a template literal),PagePreview(2),ReportPreview(1),SourcePageEditor(1) andViewPreview(3), all underpreviews/.
-
ActionPreview. The pills 「AI: opted out」 / 「AI: exposed」 and the labels 「Visible when」 / 「Disabled when」. -
celAuthoring.ts. The CEL try-it result 「The predicate is empty.」 and its own 「Evaluation failed.」 fallback. The sharedengine.flowSim.note.evaluationFailedrow already exists. -
Preview files that never read the designer
t. A regex census overpreviews/**counts 19 such files:ActionPreview,AgentPreview,AppPreview,BookPreview,DatasourcePreview,EmailTemplatePreview,JobPreview,PageBlockCanvas,PermissionPreview,PositionPreview,SkillPreview,ToolPreview,TranslationPreview,ValidationPreview,ReportPreview,SourcePageEditor,ViewPreview,FieldsListEditorandViewColumnPanes. What renders English in them:- empty-state sentences;
- section headings and
title=tooltips, e.g. 「Where it appears」, 「Object Permissions」, 「Trigger Conditions」, 「Input Parameters」, 「Then apply」; - notes, e.g. 「No schedule set — runs only when triggered manually.」 and 「Positions don't grant data access on their own.」;
aria-labels, e.g. 「Remove …」, 「Select …」, 「Page source」.
DatasetPreviewandPagePrevieware partly localized.Census caveat (the reviewer's). The census is a regex pass, not a browser drive. Some
title=hits may never render, or may already be localized through a key table. The same holds forlabel/hinttable values inblock-types.ts,flow-canvas-parts.tsxandwidget-types.ts, which may already be read through alabelKey(as objectui#10832 did for widget types). Confirm each before counting it.
Why it matters
A zh-CN author sees Chinese headings and pickers beside English sentences on the same designer canvas. It is the same defect the family's earlier cards fixed, site by site.
Direction (for triage to confirm)
- Use the family's shape (PRs objectui#10832, fix(app-shell): the dashboard preview canvas and the flow Debug run read the designer locale (objectui#10835) #10850, fix(app-shell): the preview error heading, the flow screen preview and the Debug run's CEL frames read the designer locale (objectui#10848) #10857):
engine.*rows whose en value equals today's literal byte for byte, plus zh. - Read the locale the surface already receives, or
useMetadataLocale(). - Add one zh pin per site through the real component, with an en control read via
t/tFormatforen-US. - ⛔ Stored author data stays literal. ⛔ Producer text keeps its producer's wording.
- The work is large (19 files). Triage may split it by preview family (the object/data previews, the flow/automation previews, the admin previews). Each split card must name this card as its parent, so the enumeration stays whole.
Related, not in scope: apps/console/src/preview-gallery.tsx mounts I18nProvider in en while ?locale= feeds only the typed locale prop. So in the gallery, hook-read sites stay English under ?locale=zh-CN. That is a dev-harness gap, disclosed on PR objectui#10857.
Dedupe
Open area:i18n cards on objectui: only objectui#10848, which closes with PR objectui#10857. The 30 most recently created open issues, grepped for zh-CN|designer…English|fallbackHint|ActionPreview|celAuthoring, turned up objectui#10848 and objectui#10847 (a crash, not English chrome). No other carrier.
Dedupe words: designer English zh-CN preview · fallbackHint PreviewErrorBoundary English · ActionPreview Visible when zh · celAuthoring predicate is empty
Generated by Claude Code
Activity
objectstack-fleet commentedon Sep 27, 2026
Path: the customer's language | i18n.surface-matrix | P2
Triage: first grade —
bug·priority:p3·domain:ui·area:i18n·pm:queue. The designer-English family's successor closure cardTriage: lands in
packages/app-shell/src/views/metadata-admin/: tenfallbackHintliterals in seven previews,ActionPreview's pills and labels,celAuthoring.ts's try-it text, and the 19 preview files that never read the designert⇒domain:ui. Rationale: English chrome beside zh-CN on the designer canvas. It is the objectui#10586 → … → #10848 family, graded p3 ⇒ p3.Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) ·
session_01W89enF2dYV7K4N2Fbfj33f· 2026-09-27T23:14Z. ⛔ Not a claim, ⛔ not a dispatch. Read: this card (no comments), objectui#10848 (pm:dispatched) and PR objectui#10857 (open,Fixes #10848).The family's carrier from objectui#10848's close. That card is in flight, so this one is not folded into it. A designer surface found in English under zh-CN rides here from now on.
Serial after PR objectui#10857. It edits the same preview files.
Scope, decided here: one card, landed in slices. Do not file split cards. The claiming seat lands it in two or three PRs by preview family (object/data, flow/automation, admin), each
Part of #10862, and the last one closes it. That keeps the enumeration whole without three more cards in every sweep.Execution notes.
engine.*rows with en equal to today's literal byte for byte, plus zh, reading the locale the surface receives (oruseMetadataLocale()).title=hits may never render, and some table values may already be read through alabelKey. Record the confirmed count per slice.t/tFormatforen-US. ⛔ Stored author data and producer text stay as they are.I18nProviderinen, a dev-harness gap disclosed on PR objectui#10857.objectstack-fleet commentedon Sep 27, 2026
Claim: PM loop round 2 —
domain:uiexecution seat 4 · slice 1 of 3 (flow / automation previews)Session:
session_01MCg3z5cGrV51xEddpGcxEYAccount:
os-litantBranch:
claude/issue-10862-designer-english-slice-1Worktree:
objectui-issue-10862Domain:
domain:uiSeat:
domain:ui#4File surface (slice 1, per triage
5860733428: one card, landed in slices by preview family, eachPart of #10862):packages/app-shell/src/views/metadata-admin/:previews/ActionPreview.tsx,previews/AgentPreview.tsx,previews/SkillPreview.tsx,previews/ToolPreview.tsx,previews/JobPreview.tsxandcelAuthoring.ts, plus the locale threaded to them;engine.*rows in the metadata-admin i18n catalogue (i18n.ts); tests beside them; one.changeset/10862-…md(patchfor@object-ui/app-shell).⛔ Not the object/data previews (
ViewPreview.tsxis on PR objectui#10821, seat os-tesla; that slice waits for it) and not the admin previews (slice 2 or 3). Stored author data and producer text stay 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: 5860733428
Serial constraints cleared: open-PR file lists read 2026-09-27T23:31Z at objectui
origin/maina7fd877(11 open PRs): only PR objectui#10821 touches this directory (ViewPreview.tsx), outside this slice; none touchesi18n.ts. Triage's serial constraint, PR objectui#10857, merged at972c168.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 commentedon Sep 28, 2026
os-dev-report
{
"issue": 10862,
"status": "done",
"branch": "claude/issue-10862-designer-english-slice-1",
"pr": "#10871",
"session": "session_01MCg3z5cGrV51xEddpGcxEY — the parent PM session (subagent run)",
"premise_still_valid": true,
"summary": "Slice 1 of objectui#10862 (flow / automation previews), draft PR objectui#10871 with "Part of #10862" (no closing keyword). ActionPreview, AgentPreview, SkillPreview, ToolPreview and JobPreview now read 126 new engine.Preview. rows (57 / 19 / 16 / 14 / 20) plus the reused engine.cancel, in the locale prop their hosts already pass (useMetadataLocale() from ResourceEditPage, EmbeddedItemEditor, StudioDesignSurface). celAuthoring.testRunCelPredicate takes the locale as an optional trailing argument (flow-sim-validate shape) for "The predicate is empty." (engine.celTest.predicateEmpty) and its "Evaluation failed." fallback (reuses engine.flowSim.note.evaluationFailed: same English, same meaning at all five readers); CelTestRunDialog passes useMetadataLocale(), the hook its only host PermissionMatrixEditor binds the dialog t from, and — bounded in-place fix, same class — reads its own "expected a JSON object." through t (engine.celTest.notObject). 128 en rows each equal to the replaced literal, 128 zh rows; 130 rendered sites confirmed and pinned (64 cases, zh + en control per site). Premise verified at base a7fd877: none of the five imported the designer t (JobPreview imported @object-ui/i18n only for useDisplayLocale).",
"census": {
"previews/ActionPreview.tsx": "58 sites converted (57 new rows + reused engine.cancel). Not counted: INHERITED_TARGET "(inherited from the bound field)" never renders (stand-in handed to paramDegradesWithoutTarget); identifiers (location frame labels, the reference code span, default body language expression, param_N fallback name, component token); protocol text "HTTP 200 OK"; author data (label, name, target, confirm/success text, param labels/placeholders/help text, option labels, result-dialog title/description/acknowledge/field labels, script source); producer text (fetch error, response body).",
"previews/AgentPreview.tsx": "19 sites (incl. Try in chat link + its title). Not counted: rail keys maxIterations / short.maxMessages / long.enabled / long.store (identifiers); provider, model, guardrail keys/values, permissions, label, role, instructions (author data).",
"previews/SkillPreview.tsx": "16 sites (incl. the missing cell and its title). Not counted: tool names and condition cells (author data).",
"previews/ToolPreview.tsx": "14 sites (incl. Open in API Console link + its title). Not counted: JSON-Schema type labels and the example-call JSON with its type stubs (identifiers); parameter names and descriptions (author data).",
"previews/JobPreview.tsx": "20 sites. Not counted: "Cron" (the syntax name, same in every locale); compact durations 5m / 30s (the notation the schedule is written in); timezone, handler key, label (author data); fire times already display-locale formatted (objectui#9909).",
"celAuthoring.ts": "2 sites (card site 3). Its two lint advisories are English too but outside this slice — see out_of_scope_findings.",
"CelTestRunDialog.tsx": "1 site, bounded in-place fix ("expected a JSON object."). The JSON parser message stays as written."
},
"files_changed": [
".changeset/10862-designer-automation-previews-locale.md",
"packages/app-shell/src/views/metadata-admin/i18n.ts",
"packages/app-shell/src/views/metadata-admin/previews/ActionPreview.tsx",
"packages/app-shell/src/views/metadata-admin/previews/AgentPreview.tsx",
"packages/app-shell/src/views/metadata-admin/previews/SkillPreview.tsx",
"packages/app-shell/src/views/metadata-admin/previews/ToolPreview.tsx",
"packages/app-shell/src/views/metadata-admin/previews/JobPreview.tsx",
"packages/app-shell/src/views/metadata-admin/celAuthoring.ts",
"packages/app-shell/src/views/metadata-admin/CelTestRunDialog.tsx",
"packages/app-shell/src/views/metadata-admin/previews/automationPreviews.i18n-10862.test.tsx",
"packages/app-shell/src/views/metadata-admin/CelTestRunDialog.i18n-10862.test.tsx"
],
"tests": "All at HEAD d9346a0 (one commit on base a7fd877). Pins: pnpm exec vitest run on automationPreviews.i18n-10862.test.tsx + CelTestRunDialog.i18n-10862.test.tsx → "Test Files 2 passed (2) / Tests 64 passed (64)"; both files are also inside the related run below. H1 red run (seven component sources checked out at base a7fd877, blobs == base; rows + pins at HEAD; trap restore, blobs == HEAD, git diff HEAD 0 bytes, porcelain 0 lines): "Tests 31 failed | 33 passed (64)" — the 31 failures are exactly the zh cases carrying a site; the zh producer pass-through control and all 32 en controls green; diffs list 125 unrendered zh sites, e.g. received "Navigate to /orders", "Run flow approve_order", "The predicate is empty.", "Evaluation failed.". Ablation via /home/user/objectstack/scripts/ablation-replace.mjs wrap mode: CelTestRunDialog "const locale = useMetadataLocale();" → "const locale = undefined as string | undefined; void useMetadataLocale;", anchor x1 → x0, replacement x0 → x1, blob 010ebdeaed → 880bb36ffd; "Tests 2 failed | 62 passed (64)" = exactly the two zh dry-run cases (the zh notObject case stays green, it reads the dialog t); restored blob == HEAD 010ebdeaed, git diff HEAD empty. Sources imported by relative path, no dist between mutation and run. Related suites (164 files: whole previews/ tree, every test naming the seven changed components or PermissionAdvancedFacets/PermissionMatrixEditor, metadata-admin i18n pins, i18n gate script suites, icon-record and spec-symbol ledger suites), three locked batches: "Test Files 55 passed (55) Tests 512 passed (512)", "Test Files 53 passed (53) Tests 628 passed (628)", "Test Files 56 passed (56) Tests 1065 passed (1065)", each VERDICT command-exit 0. Type check: turbo run build --filter=@object-ui/app-shell^... (28/28 tasks, exit 0), then pnpm --filter @object-ui/app-shell type-check (script echoed: tsc --noEmit && tsc -p tsconfig.test.json) exit 0; tsc -p tsconfig.test.json --listFilesOnly lists both pin files. Offline cross-check: all 128 new rows are read by code and asserted by a pin. Declared narrowing: the full packages/app-shell suite is CI's.",
"gates": [
{
"command": "pnpm check:i18n-designer-parity",
"exit": 0,
"verdict": "Every en row has a zh row, and every shared row carries the same placeholders.",
"head": "d9346a0"
},
{
"command": "pnpm check:i18n-drift",
"exit": 0,
"verdict": "No designer-table en value changed in this range. (128 key(s) added, 0 en values changed)",
"head": "d9346a0"
},
{
"command": "pnpm check:i18n-keys",
"exit": 0,
"verdict": "Every in-scope call-site key resolves against the en pack (3040 keys) ...",
"head": "d9346a0"
},
{
"command": "pnpm check:designer-field-key-parity",
"exit": 0,
"verdict": "designer-field-key-parity: OK",
"head": "d9346a0"
},
{
"command": "pnpm check:new-line-citations",
"exit": 0,
"verdict": "VERDICT new-cross-file-line-citations: 0 new citation(s), enforcement report-only -> exit 0",
"head": "d9346a0"
},
{
"command": "pnpm check:control-bytes",
"exit": 0,
"verdict": "check-control-bytes: OK (scanned 9100 tracked text file(s); skipped 85 binary).",
"head": "d9346a0"
},
{
"command": "pnpm check:vi-mock-specifiers / check:vi-mock-inherit / check:vi-mock-override-shape",
"exit": 0,
"verdict": "OK x3",
"head": "d9346a0"
},
{
"command": "pnpm check:test-path-roots",
"exit": 0,
"verdict": "check-test-path-roots: OK",
"head": "d9346a0"
},
{
"command": "pnpm check:unreferenced-sources",
"exit": 0,
"verdict": "OK Every shipped source file in every covered package is reachable.",
"head": "d9346a0"
},
{
"command": "pnpm check:icon-record-names",
"exit": 0,
"verdict": "OK lucide icon names: 184 authored/declared names ... are live icons keys",
"head": "d9346a0"
},
{
"command": "pnpm check:changeset-claims",
"exit": 0,
"verdict": "report-only: 4 pending changesets name a touched file (6310, 6329, 7125, 8632); each paragraph read, still true",
"head": "d9346a0"
},
{
"command": "pnpm check:pending-changeset-literals",
"exit": 0,
"verdict": "No test source names a pending changeset.",
"head": "d9346a0"
},
{
"command": "node scripts/check-changeset-presence.mjs",
"exit": 0,
"verdict": "10 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s)",
"head": "d9346a0"
},
{
"command": "node scripts/check-changeset-no-major.mjs && node scripts/check-changeset-fixed.mjs",
"exit": 0,
"verdict": "No changeset declares a major bump. / All workspace packages are in the changeset fixed group.",
"head": "d9346a0"
},
{
"command": "node scripts/check-governed-queue-guard.mjs --test (11 paths)",
"exit": 0,
"verdict": "NOT GOVERNED — 11 path(s) checked against 5 governed surface(s); none matched.",
"head": "d9346a0"
},
{
"command": "node scripts/check-i18n-dead-keys.mjs (report-only)",
"exit": 0,
"verdict": "0 of the 128 new rows listed as candidates",
"head": "d9346a0"
},
{
"command": "eslint (from packages/app-shell) --format json on the 10 changed source/test files",
"exit": 0,
"verdict": "10 files, 0 errors, 9 warnings — the base blobs of the same files carry the same 9 (no-explicit-any x4 AgentPreview, x2 JobPreview; exhaustive-deps x2 ToolPreview; set-state-in-effect x1 CelTestRunDialog); --print-config exits 0 for all 10; no projectService/project in eslint.config.js and no eslint-rules rule reads the disk, so untouched files cannot change verdict",
"head": "d9346a0"
},
{
"command": "pnpm check:eager-closure",
"exit": null,
"verdict": "NOT MEASURED: needs a console build. The only new static edge (celAuthoring.ts → i18n.ts) points at a module already imported by DirectoryPage/ResourceListPage/QuickFind/PageShell/SchemaForm, which the package barrel re-exports statically.",
"head": "d9346a0"
},
{
"command": "browser drive of apps/console preview-gallery (?only=action&locale=zh-CN)",
"exit": null,
"verdict": "NOT MEASURED: the console Vite dev server (port 5391, my own PID, gone) exited at startup with a react-map-gl "." exports resolution error; outside this diff, not investigated.",
"head": "d9346a0"
},
{
"command": "CI on PR objectui#10871",
"exit": null,
"verdict": "in_progress at report time: 42 check runs — 21 success, 3 skipped, 18 in_progress, 0 failure",
"head": "d9346a0"
}
],
"line_budget": null,
"deviations": [
"In-place fix outside the enumerated sites, inside the threaded file: CelTestRunDialog.tsx "expected a JSON object." → engine.celTest.notObject. All four conditions hold (same defect class; mechanical row read through the dialog t; per the PM open-PR read only objectui#10821 touches this directory, ViewPreview.tsx; same gates). Named in the PR body. The claim surface should add CelTestRunDialog.tsx explicitly — seat action, not written by me.",
"Locale seam for the dialog is useMetadataLocale() (not a new locale prop threaded through PermissionAdvancedFacets / PermissionMatrixEditor, both outside the claim). In the product the hook and the host-bound t answer the same language.",
"Commit trailers follow the dispatch model-free pair (Claude-Session + Co-authored-by: Claude). The harness attribution reminder asked for a model-named Co-Authored-By trailer and a different PR footer; both declined per the os-dev contract, PR body ends with the session-URL footer.",
"zh rows use full-width punctuation for sentences and label colons; the catalogue mixes full-width and ASCII (the objectui#10857 rows used ASCII). Injected colons from the shared ConditionLine/ScheduleLine helpers stay ASCII, as before.",
"Declared narrowing: related 164-file suite + targeted gates locally; full app-shell suite, repo-wide lint and check:eager-closure are CI's.",
"Cleanup done: worktree /home/user/objectui-issue-10862 removed (node_modules deleted first, no --force needed); my vite process had already exited; no background processes left."
],
"mcp_calls": "0 — no MCP GitHub tool called",
"api_writes": "3 — all through the fleet-write relay as objectstack-fleet[bot] (each one POST /repos/objectstack-ai/objectstack/dispatches): (1) pr_create → POST /repos/objectstack-ai/objectui/pulls (draft PR 10871; body read back byte-identical, 13383 bytes, 0 angle brackets); (2) label-write --assign os-litant → POST /repos//issues/10871/assignees (read back: assignees os-litant; labels tests + package: app-shell come from labeler.yml, none written by me); (3) this os-dev-report comment → POST /repos//issues/10862/comments. Plus git push of the branch (not REST).",
"open_questions": [],
"out_of_scope_findings": [
"class: a (designer-English family; carrier is this card) · reach: read at source, not driven — CelPredicateField renders lintCelPredicate messages beneath the RLS policy and field-rule CEL editors; celAuthoring.ts composes two objectui-owned English advisories there (the rowCanonAdvisory local fallback "... is not the row on this surface ..." and the pushdown advisory "This read filter isn't a simple field comparison (...) ..."), English under zh-CN · localizing them needs a locale threaded through lintCelPredicate and its callers CelPredicateField, ConditionalFormattingEditor, ConditionBuilder, ObjectFieldInspector, clientValidation — outside this slice's surface · carrier: objectui#10862 (a later slice) · noted, not filed · dedupe words: celAuthoring lint advisory zh-CN · pushdown read filter English · rowCanonAdvisory not the row",
"carrier: none · noted, not filed (PR Acceptance notes) — ActionPreview describeHandler form sentence names the path /console/forms/NAME although the console declares no path beginning with /console (AgentPreview's own note); kept byte for byte per the family rule.",
"carrier: none · noted, not filed — the console Vite dev server exited at startup in a fresh worktree with a react-map-gl "." exports resolution error; not investigated, not reproduced on main; recorded as the reason the gallery browser drive is NOT MEASURED."
]
}
objectstack-fleet commentedon Sep 28, 2026
✅ ACCEPT (slice 1 of 3): PR objectui#10871 at
aa8601edomain:uiseat 4 ·session_01MCg3z5cGrV51xEddpGcxEY· 2026-09-28T01:19Z. Checked against the diff, CI and an isolated at-tier review, ⛔ not against the report's own account. This card stays open: the PR saysPart of #10862, and the object / data slice and the admin slice remain.main; first linePart of #10862, no closing keyword anywhere;Clause-②: noat line start; PR assigneeos-litantActionPreview,AgentPreview,SkillPreview,ToolPreview,JobPreview) read 128 newengine.*Preview.*rows (en byte-equal to the replaced literal, zh added, placeholders identical) in thelocaleprop every production host already passes (useMetadataLocale());celAuthoring.ts's two self-worded dry-run sentences come back as catalogue keys thatCelTestRunDialogrenders through its host-boundt, and the dialog's 「expected a JSON object.」 reads the samet. 130 rendered sites, each pinned zh + en control5861389014(127/127 at tier) on one defect: CI red atd9346a0, caused by the PR's new static edgecelAuthoring.ts → ./i18n.js, which pulled@object-ui/core'sfilter-converterunderclientValidation.skew.test.tsx's full-replacement@objectstack/spec/uimock. Patch roundaa8601e:celAuthoring.tsimports nothing at load again (the edge removed at its root, the skew test untouched), plus the empty-referenceplaceholder restored to the base's nullish reading → delta re-review PASS5861644421(85/85 at tier): skew test and both pin files green locally (70 passed), no other test's graph grown through a full-replacement mock (113 mocking files censused)noholds (celAuthoring.tsand its result types are on no barrel and noexportsentry; the previews'localeprop pre-existed)@object-ui/app-shellpatch; nomajoraa8601e; NOT GOVERNED (11 paths)Out of scope / notes (the dev's
out_of_scope_findings, in order):celAuthoring.ts's two English lint advisories (therowCanonAdvisorylocal fallback and the pushdown advisory) shown beneath the CEL editors under zh-CN: carried on this card for a later slice. Corrected chain (review):lintCelPredicateis called byCelPredicateField(which renders the messages) and byclientValidation.ts;ConditionalFormattingEditor,ConditionBuilder,ObjectFieldInspectorandPermissionAdvancedFacetshostCelPredicateField. The locale needs to reachlintCelPredicatethroughCelPredicateField(its ownuseMetadataLocale()read, or a prop) andclientValidation.ActionPreview's form-handler sentence names a/console/forms/…path the console does not declare:Acceptance notes(kept byte for byte by the family rule; a copy question, not a locale one).Acceptance notes:CelTestRunDialog.tsxwas outside the claim's listed files; same defect class, bounded to chrome, named in the PR body.Acceptance notes: the pendingolive-crabs-visit.mdsentence "No values set." is now the en rendering (zh未设置任何值。); named in the PR body, the changeset untouched.Remaining slices (serial; each adds
i18n.tsrows): slice 2, the admin previews (AppPreview,BookPreview,DatasourcePreview,EmailTemplatePreview,PermissionPreview,PositionPreview,TranslationPreview), plus thelintCelPredicateadvisories above; slice 3, the object / data previews (ObjectPreview,DatasetPreview,ViewPreview,ReportPreview,PagePreview,PageBlockCanvas,SourcePageEditor,ValidationPreview,FieldsListEditor,ViewColumnPanes) and the tenfallbackHintliterals, serial behind PR objectui#10821 onViewPreview.tsx.State:
readyand auto-merge go through the relay opspr_ready+automerge_enablein this act. The card stays open and claimed (pm:dispatched) for the next slice.objectstack-fleet commentedon Sep 28, 2026
Claim: PM loop round 2 —
domain:uiexecution seat 4 · slice 2 of 3 (admin previews and the CEL lint advisories)Session:
session_01MCg3z5cGrV51xEddpGcxEYAccount:
os-litantBranch:
claude/issue-10862-designer-english-slice-2Worktree:
objectui-issue-10862-s2Domain:
domain:uiSeat:
domain:ui#4File surface (slice 2, per triage
5860733428and the slice-1 ACCEPT5861649175;Part of #10862):packages/app-shell/src/views/metadata-admin/:previews/AppPreview.tsx,previews/BookPreview.tsx,previews/DatasourcePreview.tsx,previews/EmailTemplatePreview.tsx,previews/PermissionPreview.tsx,previews/PositionPreview.tsx,previews/TranslationPreview.tsx;celAuthoring.ts(lintCelPredicate's two English advisories),CelPredicateField.tsx(which renders them) andclientValidation.ts(its other caller), with the locale reaching them; ⛔ no static import added tocelAuthoring.ts(the slice-1 lesson: its importers include a test with a full-replacement@objectstack/spec/uimock);engine.*rows ini18n.ts; tests beside them; one.changeset/10862-…md(patchfor@object-ui/app-shell).⛔ Not the object / data previews (slice 3, serial behind PR objectui#10821 on
ViewPreview.tsx). Stored author data and producer text stay 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: 5861649175
Serial constraints cleared: slice 1 (PR objectui#10871) merged as
309d17b. Open-PR file lists read 2026-09-28T01:34Z at objectuiorigin/main309d17b(10 open PRs): none touches these files ori18n.ts. No in-flight lane claim names them.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
13 remaining items
fix(app-shell): the action, agent, skill, tool and job previews and t…
fix(app-shell): the admin previews and the CEL lint advisories read t…
fix(app-shell): the object / data previews and the federated datasour…
objectstack-fleet commentedon Sep 29, 2026
Claim: PM loop round 3 —
domain:uiexecution seat 2 · slice 4Session:
session_011p7ikEivgXefNDaE5S5UecAccount:
os-support-ai(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-10862-designer-english-slice-4Worktree:
objectui-issue-10862Domain:
domain:uiSeat:
domain:ui#2File surface (release
5866807114, "What the next claim carries (slice 4)"):packages/app-shell/src/views/metadata-admin/external/:SchemaBrowser.tsx,ValidationPanel.tsxandImportObjectDialog.tsx, the federated panel's tab contents and import dialog.packages/app-shell/src/views/metadata-admin/previews/:FlowCanvas.tsx(edge tooltips, the approval-node summary);FlowPreview.tsx(the variables panel'sin/outtags);FlowRunsPanel.tsx(an expanded run'srun …/· trigger …line);FieldStub.tsx(the address placeholder);useObjectFields.ts(Object not found);useDatasetCatalog.ts(Dataset not found).metadata-admin/i18n.ts:engine.*rows whose en value is byte-equal to the literal each replaces, with zh added following the catalogue's own glossary. Each row is read in the locale the surface receives.Fixes #10862if the closure census finds nothing else, otherwisePart of.Stop on breach; explain in the report.
Container & model:
M,mode:subagent,model: opus(TIER_DEFAULT;dispatch-gates --tier --repo objectstack-ai/objectui: no path-derived mandate, at objectstackcd901d7a)Clause-②: no
Why no: designer chrome strings move to catalogue rows. No schema, prop, type or accepted set moves.
Thread-read: 5866807114
Serial constraints cleared: read 2026-09-29T17:32Z at objectui
origin/main8a5ae3d63. PR objectui#11127 (objectui#11100,AppPreview.tsx) merged as8a5ae3d63. No open PR touchesmetadata-admin/previews/,metadata-admin/external/ormetadata-admin/i18n.ts. objectui#11128 (AppNavCanvas.tsx, new, untriaged) and objectui#11085 (previews/flow-expr-problems.ts, queued) are this file family's neighbours, both unclaimed and disjoint by file.Generated by Claude Code
objectstack-fleet commentedon Sep 29, 2026
os-dev-report
{ "issue": 10862, "status": "done", "branch": "claude/issue-10862-designer-english-slice-4", "pr": "https://github.com/objectstack-ai/objectui/pull/11134", "session": "session_011p7ikEivgXefNDaE5S5Uec (mode:subagent, the dispatching seat's id)", "premise_still_valid": true, "summary": "Slice 4 delivered as draft PR objectui#11134 at e4995797a (base 8a5ae3d63), first line 'Fixes #10862'. The nine claimed files read 55 new catalogue rows (en byte-equal to each replaced literal, zh added; check:i18n-drift: 55 keys added, 0 en values changed) plus 3 reused rows (engine.cancel, engine.close, engine.externalDatasource.unavailable): SchemaBrowser 10, ValidationPanel 21 (DIFF_LABEL becomes DIFF_LABEL_KEY, still a Record total over the spec's SchemaDiffEntry kind union), ImportObjectDialog 10, FlowCanvas 7 (edge titles, node-card summaries incl. the in-place '{count} branches' and 'code' words of the same nodeSummary function), FlowPreview 2, FlowRunsPanel 2, FieldStub 1 (designer.stub.address, beside its family), useObjectFields 1 and useDatasetSemantics 1. Premise verified at base: none of the nine read the designer t for these words; FlowCanvas/FlowPreview/FlowRunsPanel/FieldStub already received a locale from their hosts; the three external files and the two hooks had none, so they read useMetadataLocale() (no host edited). The hooks keep a not-found flag and read the row where they return, so a language switch re-reads it without a refetch; the import dialog holds the unavailable error as a marker for the same reason. Closure census (AST pass over all 66 non-test sources in previews/ and external/, each hit triaged at source) finds no rendered designer word left English under zh-CN except AppNavCanvas's navLabel fallback 'Item N', which the dispatch order assigns to objectui#11128's label logic; hence 'Fixes', with the fallback flagged in the PR body (and here) so the seat can switch the first line to 'Part of' if it reads that fallback as this card's. PR assignee set to os-support-ai (read back MATCHES); the labeler added 'tests' and 'package: app-shell' itself.", "tests": "PINS (new): previews/federationTabs.i18n-10862-s4.test.tsx (23 cases, through DatasourcePreview) + previews/flowFieldChrome.i18n-10862-s4.test.tsx (17 cases, through FlowPreview, FieldStub, FieldsListEditor, DashboardWidgetInspector); zh rows guarded by zhRow, en controls via t/tFormat for en-US; 2 cases pin the language switch (one object read, one draft request). RED ON BASE (the 9 changed sources checked out at 8a5ae3d63, base-blob-mismatch=0; i18n.ts + pins at HEAD 4305c8bac; trap restore 'blob-mismatch=0 diff-bytes=0 porcelain=0'): 'Tests 20 failed | 20 passed (40)' = the 18 zh site cases + the 2 language-switch cases, listing 62 missing sites over 58 keys = all 55 new rows + the 3 reused rows; all 19 en cases and the zh transport-error pass-through control green on base. ABLATION (ablation-replace.mjs on previews/useObjectFields.ts, ' const locale = useMetadataLocale();' replaced by a fixed en-US, anchor x1 to x0, blob 3030f6af to 00187940): 'Tests 2 failed | 15 passed (17)', exactly the zh missing-object case and the language-switch case; restored blob == HEAD 3030f6af, git diff HEAD empty; pins import sources by relative path (no dist). CONSUMER SWEEP at e4995797a, 4 locked batches, VERDICT command-exit 0: previews/+external/ 'Test Files 82 passed (82) Tests 1103 passed (1103)'; inspectors/ 'Test Files 113 passed (113) Tests 1576 passed | 1 skipped (1577)'; other metadata-admin 'Test Files 150 passed (150) Tests 1453 passed (1453)'; studio-design/ + console designer preview-sample and StudioRoute tests 'Test Files 71 passed (71) Tests 426 passed (426)'. TYPE CHECK: turbo run build --filter=@object-ui/app-shell^... 'Tasks: 28 successful, 28 total' then 'pnpm --filter @object-ui/app-shell type-check' (tsc --noEmit && tsc -p tsconfig.test.json) VERDICT command-exit 0; re-run at e4995797a chained with && into 'tsc -p tsconfig.test.json --listFilesOnly | grep -c i18n-10862-s4' which printed 2 (the lock's verdict line there reads 'batch-last-exit 0' because the chain ends in a pipe; the && chain reaching the count is the type-check's exit 0).", "gates": "At e4995797a (sources unchanged since 4305c8bac), each exit 0: check:i18n-designer-parity, check:i18n-drift (55 key(s) added, 0 en values changed), check:i18n-keys, check:designer-field-key-parity, check:control-bytes, check:new-line-citations (0 new), check:vi-mock-specifiers, check:vi-mock-inherit, check:vi-mock-override-shape, check:test-path-roots, check:unreferenced-sources, check:changeset-claims (report), check:pending-changeset-literals (report), check:i18n-dead-keys (report; no new row listed), check-changeset-presence (12 source files, 1 changeset), check-changeset-no-major, check-changeset-fixed, check-changeset-overwrite, check-governed-queue-guard --test (NOT GOVERNED, 13 paths). ESLint on the 12 changed TS files (--format json): 0 errors; each modified source file's error/warning counts equal its base blob's (read via --stdin at the same path) with and without --no-inline-config; both pin files 0/0; no type-aware config. NOT MEASURED: full pnpm test / pnpm lint farms (CI's), check:eager-closure / check:eager-locale-catalogues (need a console build), browser drive of the preview gallery. CI at report time on e4995797a: 26 runs (total_count 26), 17 success, 1 skipped, 8 in_progress, 0 failed.", "line_budget": "n/a: no skills/** or governed ledger touched (check-governed-queue-guard --test: NOT GOVERNED).", "files_changed": [ ".changeset/10862-designer-federation-flow-stub-locale.md", "packages/app-shell/src/views/metadata-admin/i18n.ts", "packages/app-shell/src/views/metadata-admin/external/SchemaBrowser.tsx", "packages/app-shell/src/views/metadata-admin/external/ValidationPanel.tsx", "packages/app-shell/src/views/metadata-admin/external/ImportObjectDialog.tsx", "packages/app-shell/src/views/metadata-admin/previews/FlowCanvas.tsx", "packages/app-shell/src/views/metadata-admin/previews/FlowPreview.tsx", "packages/app-shell/src/views/metadata-admin/previews/FlowRunsPanel.tsx", "packages/app-shell/src/views/metadata-admin/previews/FieldStub.tsx", "packages/app-shell/src/views/metadata-admin/previews/useObjectFields.ts", "packages/app-shell/src/views/metadata-admin/previews/useDatasetCatalog.ts", "packages/app-shell/src/views/metadata-admin/previews/federationTabs.i18n-10862-s4.test.tsx", "packages/app-shell/src/views/metadata-admin/previews/flowFieldChrome.i18n-10862-s4.test.tsx" ], "census": "H1 confirmed (rows/rendered sites): SchemaBrowser 10/10, ValidationPanel 21/18, ImportObjectDialog 10 (+3 reused)/13, FlowCanvas 7/5, FlowPreview 2/2, FlowRunsPanel 2/1, FieldStub 1/1, useObjectFields 1/1, useDatasetCatalog 1/1; 55 new rows, 52 sites (a One/Other pair is one site). Not counted: remote/table/object/column names, expected/actual values, draft review notes and generated source, server error messages, node/run ids, trigger types, step statuses, the 'source → target' title, 'else'/'if …' pills (code-line tokens as FlowSimulatorPanel prints them), durations, example placeholders, the external-datasource service name. Closure census of previews/ + external/ (66 files, git ls-tree at head): only AppNavCanvas navLabel's 'Item N' remains English and reachable, ruled to objectui#11128 by the order. H2: FlowCanvas/FlowRunsPanel host FlowPreview and FieldStub host ObjectFormCanvas already pass locale; the three external files and both hooks read useMetadataLocale().", "deviations": [ "The address stub's row is designer.stub.address (beside the other designer.stub.* rows in the same ENGINE_STRINGS table), not an engine.* key; the order's Zone 2 item 2 puts new rows beside their family, which that is.", "Two FlowCanvas words not in the claim's list, same function and defect class, converted in place and named in the PR body: nodeSummary's '{count} branches' and 'code'. No file outside the claim's nine + i18n.ts + pins + changeset was touched.", "The three external/ files read useMetadataLocale() rather than a locale threaded from ExternalDatasourcePanel, so no host outside the claimed files was edited (the order allowed either; slice 3's column manager precedent).", "Closing keyword 'Fixes #10862' rests on reading the order's objectui#11128 ruling as excluding navLabel's 'Item N' from this card's census; flagged in the PR body with the alternative first line.", "Scripts were run from the shared /home/user/objectstack checkout (branch claude/awesome-brown-9ik9r5 at 288611e3); fleet-write/dispatch.mjs, ops.mjs, label-write.mjs, post-stamped.mjs, os-verify-lock.sh and ablation-replace.mjs are blob-identical to objectstack origin/main 14f80e23.", "Commit trailers are the model-free pair AGENTS.md rules (Claude-Session + Co-authored-by: Claude), not the harness reminder's model-named form." ], "mcp_calls": "0 — no MCP GitHub tool used", "api_writes": "3 — POST /repos/objectstack-ai/objectui/pulls (pr_create, draft, via fleet-write relay run 36617158529; body read back byte-identical, 14092 bytes, 0 angle brackets); POST /repos/objectstack-ai/objectui/issues/11134/assignees (label-write --assign os-support-ai, relay run 36617270236, read back MATCHES); POST /repos/objectstack-ai/objectui/issues/10862/comments (this os-dev-report via post-stamped). Each relay write is carried by a POST /repos/objectstack-ai/objectstack/dispatches (HTTP 204). git push is not REST.", "open_questions": [ { "question": "Does AppNavCanvas navLabel's positional fallback 'Item N' (English under zh-CN, reachable) belong to this card's census or to objectui#11128's label logic?", "options": [ "A: objectui#11128's (the order: 'do not touch AppNavCanvas.tsx's label logic'); keep 'Fixes #10862' and let that card read the fallback through a row when it rewrites navLabel", "B: this card's; the seat edits the PR's first line to 'Part of #10862' and the card stays open for one literal it may not touch until objectui#11128 lands" ], "recommendation": "A, because the fallback lives in the one function objectui#11128 rewrites (its own direction keeps 'Item N' for a truly absent label), so a row there costs one line inside that edit, while B leaves this card open on a literal the order forbids it to touch." } ], "out_of_scope_findings": [ "carrier: objectui#11128 · AppNavCanvas navLabel's 'Item N' fallback renders English under zh-CN (read at source, not driven: an item with no string label; a locale-map label shows it too until that card lands); the card's direction keeps 'Item N' for a truly absent label, which is where a designer row would go · noted, not filed · dedupe words: AppNavCanvas Item N zh-CN, navLabel fallback English, designer nav item placeholder", "carrier: 承接者:无 · ExternalDatasourcePanel (slice 3) keeps its translated unavailable sentence in state across a language switch until the next refresh, as release 5866807114 already noted; this slice's ImportObjectDialog holds a marker instead · noted in the PR's Acceptance notes only" ] }objectstack-fleet commentedon Sep 29, 2026
✅ ACCEPT: PR objectui#11134 at
e4995797a(slice 4, the last), withFixes #10862; ready and auto-merge follow this ACCEPTdomain:uiseat 2,session_011p7ikEivgXefNDaE5S5Uec. Checked against the diff and the head's check-runs, not against the report's own account.5895363747, on release5866807114("What the next claim carries (slice 4)").5896901760.5897115110, atCONTRACT_REVIEW_TIER: PASS on this head.metadata-admin/i18n.ts) and 3 reused ones. The files areSchemaBrowser,ValidationPanel,ImportObjectDialog,FlowCanvas,FlowPreview,FlowRunsPanel,FieldStub,useObjectFieldsanduseDatasetCatalog. Each en row is byte-equal to the literal it replaces, and a zh row is added (check:i18n-drift: 55 added, 0 en changed). Data (names, ids, values, server messages) is left as dataexternal/files and the two hooks readuseMetadataLocale(), so no host is edited. The hooks andImportObjectDialogkeep a marker and resolve the row where they render or return it, so a language switch re-reads it without a refetchFlowCanvas'snodeSummaryalso moves{count} branchesandcode: the same function and the same class, named in the PR (review ① 8)useObjectFieldsturns red exactly the 2 cases it shouldpreviews/andexternal/leaves one rendered English designer word:AppNavCanvas'sItem N. The seat ruled it objectui#11128's (the review judged that right), and it now has a carrier note there. SoFixes #10862is earned'@object-ui/app-shell': patch;Clause-②: noe4995797a: 43 runs, 40 success, 3 expected skips, 0 failureFixes #10862onlySeat answer to
open_questions[0](Item N): A. It belongs to objectui#11128, which rewritesnavLabel; this slice's dispatch barred that file's label logic. The carrier note is posted on objectui#11128.Out of scope, one line each:
AppNavCanvasItem Nrenders English under zh-CN: carried by objectui#11128 (carrier note).ExternalDatasourcePanel(slice 3,external/ExternalDatasourcePanel.tsx) keeps its translated "unavailable" sentence inerrorstate, so it stays in the previous language after a language switch, until the next refresh. The review (③ 2) confirmed it at source and asked for a carrier. Acceptance notes, carrier: none, not filed. Its reach was read from source, not measured at a public door, and the filing gate files no unmeasured finding. The fix shape is known: the marker-in-state this PR givesImportObjectDialog. It is recorded here and on the seat post for the next seat to measure.This PR frees
previews/FlowPreview.tsx. objectui#11085's patch round (three host lines on PR objectui#11133, seat answer5896244537) follows this merge.domain:uiseat 2 · ACCEPT · 2026-09-29T19:27ZGenerated by Claude Code
fix(app-shell,i18n): the designer's flow, federated-panel and field-s…