Repository navigation
Description
epic:#28130#1 · hotlong · session_040dfd80c4c9411b895c698e785a6848
Filing gate: ② filed on the maintainer's word in direct chat with the epic PM seat, 2026-11-03: 「第二批也立卡」. Priority on 「相关卡 p1, 让车道处理」. ⛔ Not a claim.
Reader: domain:ui; the clone notice's string is in packages/runtime, so the claim states how it is translated.
Dedupe: zh-CN English notice, Human-readable package name. #29675 is a separate read fault. New.
type: enhancement
Business reason. These are among the first things a Chinese-speaking builder sees. A mixed screen reads as unfinished, and it makes it unclear which words are safe to ignore.
What happens
| where | what | status |
|---|---|---|
| New similar on a flow | the banner's second sentence, "The copy is switched off and does not run until you switch it on…", renders in English in zh-CN. The source is a server string, packages/runtime/src/flow-clone.ts:191 |
measured by screenshot at 3482f3d8d2 |
| New package form | labels such as Display name and Human-readable package name under a zh title. packages/spec/src/kernel/manifest.zod.ts:674 has that text as a describe |
reported by an independent review; re-measure |
| Automations rail | a draft object's flow group reads REPAIRS_REPAIR_TICKET, its machine name uppercased |
reported by the review; re-measure |
| Column picker | system fields listed before the builder's own | reported by the review; re-measure |
The #29650 refusal sentence is also English, but it goes away with that fix.
Direction
- A sentence the server sends for a person to read has a translation path, or is sent as a code the console translates. Pick the existing pattern; state it in the PR.
- The form's labels come from the i18n catalog, not from spec
describetext. - A group is labelled with the object's label.
- The builder's own fields sort first.
Drop any row that does not reproduce, and say so on the card.
Activity
objectstack-fleet commentedon Nov 3, 2026
domain:ui#5 · zhuangjianguo · session_01QsR2jQjvWkZ7is6GXbC6DB
Claim: PM loop round 7 · 2026-11-03T02:39Z
Session:
session_01QsR2jRdVLGVEbfCX4asHX1(card thread, os-dev); dispatched by seat sessionsession_01QsR2jQjvWkZ7is6GXbC6DBAccount:
zhuangjianguoBranch:
claude/project-thread-ldzdax(platform-assigned to the card thread; it can push only this branch)Worktree:
objectstack-issue-29706Domain:
domain:uiSeat:
domain:ui#5Scope: zh-CN Studio first screens stop mixing English: the flow clone notice reaches the console through a translation path, the new package form reads its labels from the i18n catalog and not spec
describe, a draft object's flow group is labelled with the object's label, and the column picker lists the builder's own fields first. A row that does not reproduce is dropped and named.Fixes #29706.File surface: the console components that draw these four surfaces, the i18n packs, their tests, and a changeset. ⛔
packages/runtime/**andpackages/spec/**are out (a server code for the clone notice is a stop and report). The dev names the exact files after measuring the premise, and the seat amends this line before any edit outside it (stop on breach).Container & model: M,
mode:thread,model: default tier (no Fable per the maintainer's standing rule),effort: highClause-②: yes (widening) — provisional: new i18n keys are expected. The dev runs on the diff, and the seat amends this line if its output differs (for example, a retired key).
Metadata-protocol: none
Responsibility:
a builder using Studio in zh-CN | first screens mix English sentences, describe text and machine names into a zh screen | Chinese-speaking builders, who cannot tell which words are safe to ignoreThread-read: none
Premise: to prove first on current main, per the brief (/mnt/project-files/issue-29706/brief.md). The dev reproduces each symptom before editing and drops or reports any that does not reproduce.
Serial constraints cleared: seat 4's #29693 and #29692 (StudioItemHeader row) and seat 1's #29691 (saved-to sentence on the pending-changes sheet) are named in the brief. Seat 5's #29704, #29705 and #29706 share the studio i18n packs on different keys. The dev merges main right before pr_create.
objectstack-fleet commentedon Nov 3, 2026
epic:#28130#1 · hotlong · session_040dfd80c4c9411b895c698e785a6848
2026-11-03T02:52Z
Re-measured live by the epic PM seat on
mainatc9636f1e50, on the maintainer's word in direct chat, 2026-11-03: 「需要复测的内容,你直接处理」. This updates the card body where it differs. ⛔ Not a claim.Row by row:
REPAIRS_REPAIR_TICKETonly while the object is an unpublished draft. After publish it reads 维修工单. The object picker in the same dialog shows 维修工单 (草稿), so the label is available.showcase_task:organization_id,created_by,updated_at,updated_by,owner_id,owning_business_unit_id,queue, thentitle. The system columns come first. Two rows read 负责人 (owner_idandassignee).New in the same family: the view inspector's card reads "Basics / Identity and primary surface" and "View description for", in English.
objectstack-fleet commentedon Nov 3, 2026
domain:ui#5 · zhuangjianguo · session_01QsR2jQjvWkZ7is6GXbC6DB
Claim amended · 2026-11-03T02:55Z · #29706 file surface named after the premise was measured
The dev measured all four rows at
7b55ea95in zh-CN; all four reproduce (premise.md in issue-29706).{flow, packageId, notice}with no code, and the console printsnoticeverbatim. The repo's pattern for a server sentence a person reads is code-keyed: the console maps a known code to an i18n key and keeps the wire text otherwise (translateFailureCode,BATCH_ABORTED_CODE). So row 1 needs a runtime code first, underpackages/runtimeand the client'sCloneFlowResponse. That is server-lane surface. It leaves this card: the seat files it as its own card, covering the permission-set clone notice, which has the same gap, and the console's mapping that follows the code.PackageFormDialog's form memo keys on[locale, mode]only. It is mounted closed before the lazy zh catalogue lands, so it keeps the English labels.readObjectLabelsreads only published objects, so a draft object's flow group shows its name, uppercased by CSS.created_*,updated_*andowner_idfirst, and the picker keeps the served order.File surface (replaces the claim's provisional line; rows 2 to 4; stop on breach), under
ui/packages/app-shell/src/views/:metadata-admin/PackageFormDialog.tsx, with new testmetadata-admin/PackageFormDialog.lazyCatalogue-29706.test.tsxstudio-design/StudioDesignSurface.tsx(thereadObjectLabelspath only), with new teststudio-design/StudioDesignSurface.draftObjectFlowGroup-29706.test.tsxmetadata-admin/previews/ViewColumnPanes.tsx, with new testmetadata-admin/previews/FieldsListEditor.addFieldOrder-29706.test.tsx.changeset/29706-zh-studio-first-screens.mdClause-②: no — no new key, no export change. The dev runs
scripts/pm/clause2-line.mjson the diff, and the seat amends again if its output differs.Metadata-protocol: none
Serial: open PRs #29718 and #29723 touch
StudioDesignSurface.tsxbut notreadObjectLabels. The dev merges main right before pr_create. The PR keepsFixes #29706and names the filed card for row 1 in its body.objectstack-fleet commentedon Nov 3, 2026
domain:ui#5 · zhuangjianguo · session_01QsR2jRdVLGVEbfCX4asHX1
os-dev-report
{ "issue": 29706, "status": "done", "branch": "claude/project-thread-ldzdax", "pr": "https://github.com/objectstack-ai/objectstack/pull/29773", "session": "session_01QsR2jRdVLGVEbfCX4asHX1", "premise_still_valid": true, "rows": { "row1_clone_notice": "reproduces; leaves this card for #29727 (needs a server code under packages/runtime, out of surface)", "row2_new_package_form": "reproduces through the lazy zh studio catalogue (landing mounts the dialog closed; form memo keyed on locale, mode); fixed", "row3_automations_rail": "reproduces (readObjectLabels read published objects only); fixed", "row4_column_picker": "reproduces (served order puts created/updated at and by, owner_id first); fixed" }, "summary": "Rows 2 to 4 fixed in app-shell with no i18n key, spec or runtime change. PackageFormDialog rebuilds its form once the studio catalogue is resident; the Automations rail's object index merges the package's object drafts with their labels; AddFieldPopover lists the builder's fields before system fields. Row 1 measured and handed to the server lane as #29727.", "tests": "3 new files (one per row, each with CONTROL): 3 files 6 tests pass on f9fd4b39. Ablations via scripts/ablation-replace.mjs, fix committed first, each restored to the HEAD blob with git diff HEAD empty: row2 memo deps -> [locale, mode] reds 1/2 (control green); row3 draft read -> empty reds 1/2; row4 order -> [...fields] reds 1/2. Related sweep 125 files 1080 tests pass on a346e17d; post-merge 38 files 304 tests pass on f9fd4b39. app-shell type-check 65/65 on f9fd4b39. eslint 6 files 0 errors. ui vitest scripts/ 170 files pass.", "gates": "dispatch-gates --commands: 35 families (unchanged by the merge). 34 ran in one loop on a346e17d, 34 exit 0 (check:type-check-debt under the lock); the 35th, pnpm --dir ui exec vitest run scripts/, exit 0. Body gates on the final body: closing-keyword-parity --body binds only 29706; adr-0087-registration, changeset-no-major, empty-changeset, partof-closing-keyword exit 0. check-sdui-manifest exit 0 (manifest intact, no registry change). clause2-line reads Clause-② no, Metadata-protocol none. check:new-line-citations 0 new. CI: in_progress at report time.", "line_budget": "7 files, about 360 lines added, 5 removed: 3 source files (+43/-5), 3 new tests, 1 changeset", "files_changed": [ "ui/packages/app-shell/src/views/metadata-admin/PackageFormDialog.tsx", "ui/packages/app-shell/src/views/metadata-admin/PackageFormDialog.lazyCatalogue-29706.test.tsx", "ui/packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx", "ui/packages/app-shell/src/views/studio-design/StudioDesignSurface.draftObjectFlowGroup-29706.test.tsx", "ui/packages/app-shell/src/views/metadata-admin/previews/ViewColumnPanes.tsx", "ui/packages/app-shell/src/views/metadata-admin/previews/FieldsListEditor.addFieldOrder-29706.test.tsx", ".changeset/29706-zh-studio-first-screens.md" ], "deviations": [ "Row 1 dropped from this PR by seat ruling (moved to 29727); PR keeps Fixes 29706 as the seat ordered.", "First commit dab5c788 carried a stray cast removal in usePackageNavTargets (outside the readObjectLabels path) from a replace-all; reverted in a346e17d before any gate ran, net diff against main has no hunk there.", "Screenshots came from a temporary live harness (app-crm --fresh backend plus the Vite console on source, before = origin/main source files swapped in and restored to HEAD); nothing committed.", "Derived gates ran on code head a346e17d; the merge of main (f9fd4b39) touched none of the diff's lines, and the touched suites plus type-check were re-run on the merged head." ], "screenshots": "/mnt/project-files/issue-29706/ before-row2/3/4 and after-row2/3/4 png", "dogfood_battery": "n/a: no ! in the PR title and no (narrowing) arm", "mcp_calls": "0", "api_writes": "2: pr_create via fleet-write relay (PR 29773), this os-dev-report comment via post-stamped", "open_questions": [], "security_findings": "none", "out_of_scope_findings": [ "class: a · reach: Studio Interfaces list-view panel in zh-CN shows the filter builder's '+ Add filter…' in English (measured live 2026-11-03) · evidence: live zh-CN run on f9fd4b39 · dedupe words: Add filter zh-CN, filter builder English", "carrier: none · noted, not filed: package form Type select shows raw value app; dialog sr-only Close label in English" ] }objectstack-fleet commentedon Nov 3, 2026
domain:ui#5 · zhuangjianguo · session_01QsR2jQjvWkZ7is6GXbC6DB
Landed · 2026-11-03T04:42Z
8c289725,Fixes #29706). The seat's ACCEPT is 6595358743. No contract review was owed: Clause-② isno, with no spec, governed or narrowing face.