Repository navigation
platform-objects: the zh-CN bundle ships 192 labels and options as the English source string, and the i18n coverage baseline counts them as translated #20462
Description
Activity
objectstack-fleet commented
on Sep 28, 2026 ContributorAuthorMore actionsPath: run it — the console in the user's language | 缺项 (platform objects' zh-CN bundle) | P2
Triage: first grade —
bug·priority:p2·domain:engine·area:i18n·pm:queueTriage: lands in
packages/platform-objects/src/apps/translations/zh-CN.objects.generated.tsand its extract config ⇒domain:engine(packages/platform-objects).Rationale:
- What a zh-CN admin sees. English labels and options on Setup surfaces: 「Delegated Admin」 in the invite role list, and 「MEMBER COUNT」.
- How many. The walk found 192
label/options.*values byte-equal to the English source. The keys exist; their values were copied. - p2. It runs but answers wrong, beside the zh-CN leftovers graded p2 today (objectui#10969).
Triage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-09-28T15:54Z. ⛔ Not a claim, ⛔ not a dispatch.Direction.
- Translate the user-facing labels and options. Declare the brand and protocol names that must stay in English (
Google,GitHub,JWKS, …) as such, in the extract config's existing mechanism. ⛔ Don't leave them as silent copies. - The coverage-ratchet half is not in this card. Teaching
i18n-coverage-baselineto count a copied source string as untranslated widens an existing gate, and a new gate defaults to no (「新增门禁默认否」).- Record the copy count before and after in the PR.
- If the maintainer wants the ratchet, one line names it.
- Pin: the two reproduced strings, under zh-CN.
- 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 workingpriority:p2Medium: important, M3Medium: important, M3and removed
on Sep 28, 2026 objectstack-fleet commented
on Sep 28, 2026 ContributorAuthorMore actionsClaim: PM loop round 23
Session:session_01N8TPEsoJxPsdSdNKGnNGEN
Account:os-warren(the seat's linked user asGET /useranswers it; always the card's assignee)
Branch:claude/issue-20462-zh-cn-object-labels
Worktree:objectstack-issue-20462
Domain:domain:engine
Seat:domain:engine#1
File surface:packages/platform-objects/src/apps/translations/zh-CN.objects.generated.ts, leaf string values only: the user-facinglabel/options.*values byte-equal to theensource get zh-CN values (triage 5873680175). ⛔ No structure edit;pnpm check:i18nstays green.- the extract config's existing mechanism for declaring the brand and protocol names that stay in English (
Google,GitHub,JWKS, …), inpackages/platform-objects/scripts/i18n-extract.config.tsor wherever that mechanism lives. If no existing mechanism declares a leaf English by design, stop and reportneeds_decision. ⛔ No new mechanism. - the zh-CN provenance companion (
zh-CN.source-hashes*.ts), only if it must follow the new leaves, and regenerated bypnpm i18n:extract, never by hand; - a pin in
packages/platform-objectsof the two reproduced strings under zh-CN (sys_member.fields.role.options.delegated_admin,sys_team.fields.member_count.label); .changeset/20462-*.md.
Stop on breach and explain in the report. ⛔ Not the coverage ratchet (
scripts/i18n-coverage-baseline.json,check-i18n-coverage): triage keeps it out of this card, and the PR records the copy count before and after. ⛔ Not theja-JP/es-ESbundles (measured and reported, not edited). ⛔ Not*.metadata-forms.generated.ts(PRs #20485 and #20475 hold them). ⛔ Not the hand-authoredzh-CN.ts.
Container & model:M,mode:subagent,model: opus(dispatch-gates --tier: no path-derived mandate, floor sonnet · default opus · ceiling fable)
Clause-②: no
Thread-read: 5873680175
Serial constraints cleared: at 2026-09-28T17:24Z, a census of all 13 open PRs' file lists finds none onzh-CN.objects.generated.ts,i18n-extract.config.tsorscripts/i18n-coverage-baseline.json. PRs #20485 (#19332) and #20475 (#20439) touch only the*.metadata-forms.generated.tsbundles, which are other files. Dispatched cards with no PR yet are UNKNOWN; the generated bundle is regenerated through the repo's merge tooling, never resolved by hand.objectstack-fleet commented
on Sep 28, 2026 ContributorAuthorMore actionsos-dev-report
{ "issue": 20462, "status": "done", "branch": "claude/issue-20462-zh-cn-object-labels", "pr": "https://github.com/objectstack-ai/objectstack/pull/20490", "session": "session_01N8TPEsoJxPsdSdNKGnNGEN — mode:subagent, the parent's harness-stamped id. The newest Claim: (5875144601) names this session and branch claude/issue-20462-zh-cn-object-labels; verified before any edit, and no claim of my own was posted.", "premise_still_valid": true, "summary": "320 of the 362 zh-CN objects-bundle leaves that were byte copies of their en source now carry zh-CN values: labels, options, pluralLabel, help, description, placeholder and emptyState. The two reproduced strings are 受托管理员 (sys_member and sys_invitation) and 成员数. The other 42 stay English by design (7 sign-in brands, 23 bare ID labels, JWKS/JWKS URI, the result-dialog Client ID/Secret, IdP SSO URL, 4 typed placeholders, Message-ID, UI/API). They are declared with reasons in a new decision ledger, objects-zh-cn-echo-decisions.test.ts, which also pins the reproduced leaves; the provenance companion was regenerated by pnpm i18n:extract (−320 rows, 42 left, set-equal to the declared echoes). The coverage ratchet is untouched per triage, and so are ja-JP / es-ES. Nine existing panel ledgers had encoded the old zh-CN copy debt as floors, so their floors now ask for non-emptiness. H1 did not reproduce the card's numbers: at 3cf6449389 and at base b810ddb6f (identical bundle bytes) the walk reads 362 copies / 216 label+options, not 338 / 192; the card does not state its method.", "tests": "① Build: pnpm exec turbo run build --filter='@objectstack/cli...' --concurrency=2 via os-verify-lock, at base and again after the merge (VERDICT command-exit 0 both times). ② H3: pnpm check:i18n EXIT=0 at base; EXIT=1 after the leaf edits alone ('platform-objects DRIFTED (1)', the provenance companion); EXIT=0 after pnpm i18n:extract, which changed only zh-CN.source-hashes.generated.ts (−320 rows, 0 added; the bundle stayed byte-identical). ③ pnpm --filter @objectstack/platform-objects exec vitest run --maxWorkers=2: 56 files / 921 tests passed. Before the collateral floor edits the same run was 15 failed / 896 passed across 9 files, all zh-CN floor assertions ('expected 42 to be greater than 100/300/50') plus the Access Token TTL near-twin. ④ pnpm --filter @objectstack/platform-objects typecheck: VERDICT command-exit 0; tsconfig.test.json --listFilesOnly includes the new ledger (1 hit). ⑤ Reverse verification: 3 mutation legs through scripts/ablation-replace.mjs on zh-CN.objects.generated.ts, run from committed state with a trap and restore to HEAD blob 24cfb9355b89 proved by blob equality and an empty git diff HEAD. Leg 1: label 成员数 back to 'Member Count' → 1 failed / 9 passed ('sys_team.fields.member_count.label reads its en source again'). Leg 2: both delegated_admin back to 'Delegated Admin' (--expect 2) → 2 failed / 8 passed (the verdict row, and the role-word test failing to match Han). Leg 3: the declared echo google 'Google' to '谷歌' → 1 failed / 9 passed ('is a declared echo and must stay the en source'). No build or dist is involved: the tests import the bundles from src. ⑥ pnpm check:i18n-coverage: EXIT=0, '621 baselined untranslated string(s), none new'. ⑦ node scripts/check-nul-bytes.mjs: exit 0. All gate readings were taken at head 08ebcd01d, a true merge of origin/main 851af0c27.", "mcp_calls": "0 — no MCP tool used", "api_writes": "3 REST writes, each through the fleet relay (scripts/pm/fleet-write/dispatch.mjs, one repository_dispatch POST /repos/objectstack-ai/objectstack/dispatches per write): (1) pr_create → POST /repos/objectstack-ai/objectstack/pulls (relay run 36464030637, draft #20490); (2) label-write --issue 20490 --assign os-warren → POST /repos/objectstack-ai/objectstack/issues/20490/assignees (relay run 36464140823; read-back matched); (3) this os-dev-report → POST /repos/objectstack-ai/objectstack/issues/20462/comments via post-stamped.mjs. Plus git push of the branch (6 pushes, all fast-forward, no force). issue_patch on the PR: 0 (the body read back byte-identical, 12180 bytes).", "gates": { "head": "08ebcd01d", "derivation": "node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack → 61 commands (stderr: tree objectstack-ai/objectstack at 08ebcd01d, --repo holds; 13 paths vs merge base 851af0c27; 1383 changed lines, under the 5000 threshold)", "run": "61 of 61 run, each exit code written to a file before any pipe; 60 exited 0 on first run", "rerun": "pnpm check:dual-build-cjs-loads answered PREREQUISITE NOT MET (exit 3: workspace dist missing for packages outside the CLI closure) — not a measurement; rerun once the dist existed: exit 0", "reconcile": "node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --ran ran-annotated.txt → exit 0: '61 derived, 61 run, 0 NOT-MEASURED, 0 UNRUN'", "not_measured": "NOT MEASURED locally, declared to CI: the 6 workflow-valued families (check-issue-citations --census, shard attestations, test-completeness), the 5 path-scheduled CI jobs (Test Core, Temporal Conformance, Dogfood Regression, Dogfood Verify CLI, Build Core) and the 4 type-check lanes; reason: CI-only shell or variables", "extra": "pnpm check:i18n exit 0; pnpm check:i18n-coverage exit 0; CI not awaited (in_progress at report time)" }, "line_budget": "13 files, +724 / −659 = 1383 changed lines vs the 5000 human-merge threshold: under. No governed surface (no .claude/**, skills/**, docs/adr/**, AGENTS.md). No skills/** line ratchet applies.", "files_changed": [ ".changeset/20462-zh-cn-object-labels.md", "packages/platform-objects/src/apps/translations/zh-CN.objects.generated.ts", "packages/platform-objects/src/apps/translations/zh-CN.source-hashes.generated.ts", "packages/platform-objects/src/apps/translations/objects-zh-cn-echo-decisions.test.ts", "packages/platform-objects/src/apps/translations/action-body-panel-echo-decisions.test.ts", "packages/platform-objects/src/apps/translations/bare-type-display-echo-decisions.test.ts", "packages/platform-objects/src/apps/translations/dataset-panel-echo-decisions.test.ts", "packages/platform-objects/src/apps/translations/field-panel-echo-decisions.test.ts", "packages/platform-objects/src/apps/translations/hook-execution-panel-echo-decisions.test.ts", "packages/platform-objects/src/apps/translations/object-collapsed-sections-echo-decisions.test.ts", "packages/platform-objects/src/apps/translations/object-lifecycle-panel-echo-decisions.test.ts", "packages/platform-objects/src/apps/translations/page-interface-panel-echo-decisions.test.ts", "packages/platform-objects/src/apps/translations/report-form-echo-decisions.test.ts" ], "deviations": [ "H2 falsified as stated. Neither i18n-extract.config.ts nor os i18n extract / check has a keep-source mechanism (no allowlist, no flag, no provenance mark; --filter only narrows emission). The existing mechanism that declares a leaf English by design is this package's echo-decision ledger: type Verdict = 'translate' | 'echo', a reason per row, a required departure per echo, undeclaredEchoes, in packages/platform-objects/src/apps/translations/*-echo-decisions.test.ts. The claim's 'or wherever that mechanism lives' covers it, so I applied that shape to the objects bundle rather than stopping at needs_decision. No new mechanism was invented.", "H3 partly falsified. The leaf edit alone turned pnpm check:i18n red (the provenance companion drifted). The companion was regenerated by pnpm i18n:extract, never by hand, and only it moved.", "H4: help / description / placeholder / emptyState were translated too. The claim's file-surface line names label / options.* only; the dispatch's H4 conditions the rest on the extractor's class. Measured: the extractor records each as an ExpectedEntry under the same source kind as its element's label, and the coverage detector consumes them identically.", "File surface widened, not declared in the claim: nine existing panel ledgers under the same directory. Their zh-CN floors (more than 100 or 300 provenance rows, more than 50 echoing objects leaves) encoded the old copy debt and went red (15 tests) on this change. Each floor is now greater than 0, matching its own message ('is empty', 'has no … leaf to sample'), with a comment. The Access Token TTL near-twin, whose message says it goes stale once a translator authors the leaf, now records zh-CN as authored. PR #20485 (open) edits three of these files (field-panel-, object-collapsed-sections-, object-lifecycle-panel-) in different hunks; mergeability of the two is NOT MEASURED.", "The first commit was amended locally before its first push, to replace the harness-supplied model-named Co-Authored-By with the AGENTS.md model-free trailer pair. No pushed history was rewritten, and every pushed commit passed check:commit-card-trailers.", "H1 did not reproduce the card's numbers: 362 / 216 at both 3cf6449389 and b810ddb6f, not 338 / 192. Method: every string leaf, byte-equal to en at the same path; label counts any leaf named label, options.* any leaf under options, pluralLabel separate.", "Cleanup: the worktree's node_modules were removed and the worktree was removed with git worktree remove (no --force; the tree was clean and pushed at 08ebcd01d) before this report was posted. No background process is left: the build and the gate runner PIDs I started (2221, 15815) both exited." ], "open_questions": [ { "question": "Which zh-CN word should the delegated_admin membership role use?", "options": [ "A 受托管理员: the console's existing word for this role value (objectui organization.roles.delegatedAdmin); the members list and the Invite dialog then agree", "B 委派管理员: the in-repo word for the ADR-0090 delegated-administration concept (委派管理范围 in the permission form, 委派管理员 in plugin-security help text); objectui's zh roles.delegatedAdmin would then need the same change" ], "recommendation": "A, because it is the only existing rendering of this exact role value, and choosing it leaves one word per role across both repos without touching objectui. It is a one-line change either way (two leaves plus the objectui key)." } ], "out_of_scope_findings": [ "class: a · reach: same public door as the card: the Invite user dialog's role list is served from these bundles, and sys_invitation.fields.role.options.delegated_admin reads 'Delegated Admin' in both ja-JP and es-ES (bundle read at b810ddb6f; not re-measured in a browser) · evidence: at b810ddb6f ja-JP.objects.generated.ts has 383 leaves byte-equal to en (label 210, options.* 20, pluralLabel 12, help 121, description 12, placeholder 4, emptyState 4; label+options 230) and es-ES has 392 (label 217, options.* 22, pluralLabel 12, help 121, description 12, placeholder 4, emptyState 4; label+options 239); not edited per the order · dedupe words: ja-JP objects bundle English copies; es-ES platform-objects untranslated labels; Delegated Admin ja-JP es-ES; i18n copied source string", "carrier: 承接者:无 · noted, not filed: the existing zh-CN bundle renders 'Locked Until' two ways (sys_user 锁定至, sys_job_queue 锁定到); this card uses 锁定至 for sys_two_factor; recorded in the PR's Acceptance notes" ] }
Generated by Claude Code
objectstack-fleet commented
on Sep 28, 2026 ContributorAuthorMore actionsClaim: PM loop round 23
Session:session_01N8TPEsoJxPsdSdNKGnNGEN
Account:os-warren(the seat's linked user asGET /useranswers it; always the card's assignee)
Branch:claude/issue-20462-zh-cn-object-labels
Worktree:objectstack-issue-20462
Domain:domain:engine
Seat:domain:engine#1
File surface:packages/platform-objects/src/apps/translations/zh-CN.objects.generated.ts, leaf string values only: the user-facinglabel/options.*values byte-equal to theensource get zh-CN values (triage 5873680175). ⛔ No structure edit;pnpm check:i18nstays green.- the extract config's existing mechanism for declaring the brand and protocol names that stay in English (
Google,GitHub,JWKS, …), inpackages/platform-objects/scripts/i18n-extract.config.tsor wherever that mechanism lives. If no existing mechanism declares a leaf English by design, stop and reportneeds_decision. ⛔ No new mechanism. - the zh-CN provenance companion (
zh-CN.source-hashes*.ts), only if it must follow the new leaves, and regenerated bypnpm i18n:extract, never by hand; - a pin in
packages/platform-objectsof the two reproduced strings under zh-CN (sys_member.fields.role.options.delegated_admin,sys_team.fields.member_count.label); - the nine existing panel echo-decision ledgers in the same directory (
action-body-panel-,bare-type-display-,dataset-panel-,field-panel-,hook-execution-panel-,object-collapsed-sections-,object-lifecycle-panel-,page-interface-panel-,report-form-echo-decisions.test.ts), test side only: their zh-CN floors encoded the old copy count and go red once the copies are translated. Each floor becomes non-emptiness, matching its own message, and the Access Token TTL near-twin records zh-CN as authored; .changeset/20462-*.md.
Stop on breach and explain in the report. ⛔ Not the coverage ratchet (
scripts/i18n-coverage-baseline.json,check-i18n-coverage): triage keeps it out of this card, and the PR records the copy count before and after. ⛔ Not theja-JP/es-ESbundles (measured and reported, not edited). ⛔ Not*.metadata-forms.generated.ts(PRs #20485 and #20475 hold them). ⛔ Not the hand-authoredzh-CN.ts.
Container & model:M,mode:subagent,model: opus(dispatch-gates --tier: no path-derived mandate, floor sonnet · default opus · ceiling fable)
Clause-②: no
Thread-read: 5875946281
Serial constraints cleared: at 2026-09-28T17:24Z, a census of all 13 open PRs' file lists finds none onzh-CN.objects.generated.ts,i18n-extract.config.tsorscripts/i18n-coverage-baseline.json. PRs #20485 (#19332) and #20475 (#20439) touch only the*.metadata-forms.generated.tsbundles, which are other files. Dispatched cards with no PR yet are UNKNOWN; the generated bundle is regenerated through the repo's merge tooling, never resolved by hand.Amended (this re-posted claim supersedes 5875144601's file surface). The os-dev-report on this card (PR #20490) reports two things the seat answers here:
- The undeclared widening is admitted: the nine panel ledgers above, floors only. H2 measured that no keep-source mechanism exists in the extract config or
os i18n. The existing mechanism that declares a leaf English by design is this package's echo-decision ledger (Verdict = 'translate' | 'echo', a reason per row). The newobjects-zh-cn-echo-decisions.test.tsapplies it, inside the claim's "or wherever that mechanism lives". PR feat(spec): curated activityMilestones, publicSharing, userActions and inlineColumns form rows (#19332, flight G2b) #20485 (#19188 split: 39 top-level zod-only keys are structured controls needing a designed widget, not a row #19332,domain:spec) edits three of those ledgers in other hunks; the later lander mergesmain. - Open question, the zh-CN word for the
delegated_adminrole → A, 受托管理员. It is the console's existing word for this exact role value (objectuiorganization.roles.delegatedAdmin), so the members list and the Invite dialog agree across both repos without touching objectui. The dispatch order asked for the terminology the existing leaves already use. 委派管理员 names the ADR-0090 delegation concept, not this role value.
objectstack-fleet commented
on Sep 28, 2026 ContributorAuthorMore actionsos-dev-report
{ "issue": 20462, "status": "done", "round": "patch round 1 (domain:engine seat): text only, from contract review 5876239898 (PASS at 08ebcd01d)", "branch": "claude/issue-20462-zh-cn-object-labels", "pr": "https://github.com/objectstack-ai/objectstack/pull/20490", "session": "session_01N8TPEsoJxPsdSdNKGnNGEN — mode:subagent, the parent's harness-stamped id. The newest Claim: is the amended 5875978969, which names this session and branch claude/issue-20462-zh-cn-object-labels; verified before any edit, and no claim of my own was posted.", "premise_still_valid": true, "summary": "Corrected the three slips the review named, as text only; no translated value, assertion or floor changed. (1) The changeset's translated-class list drops 'placeholders': all four were decided as echoes, and no other sentence claimed they were translated. (2) The objects-zh-cn-echo-decisions.test.ts header, comment only, now says what is asserted: every declared echo still has its provenance row, and no pinned translation has one. The table holding nothing beyond the echoes is measured and deliberately not asserted. (3) The PR body's H4 sentence now says placeholders were decided as the same class and all four are declared echoes; the ledger-history sentence credits undeclaredEchoes to the later rounds, first in object-field-editor-panel-echo-decisions.test.ts (git log -S 576d5df66; not a shallow clone), rather than to report-dataset-panel-; and a Patch round 1 section was added. origin/main fc0db22bc was merged with a true merge commit, giving head 927957df4.", "tests": "At head 927957df4, after rebuilding the CLI closure (turbo --filter='@objectstack/cli...' --concurrency=2 via os-verify-lock: VERDICT command-exit 0, 59 tasks, 17 cached): pnpm check:i18n EXIT=0 ('all bundles in sync, no undeclared authoring keys'); pnpm --filter @objectstack/platform-objects exec vitest run --maxWorkers=2 src/apps/translations/objects-zh-cn-echo-decisions.test.ts via os-verify-lock: VERDICT command-exit 0, 1 file / 10 tests passed; node scripts/check-nul-bytes.mjs exit 0. The round-0 derived-gate run (61/61 at 08ebcd01d) was not repeated: this round edits a changeset sentence and a comment.", "mcp_calls": "0 — no MCP tool used", "api_writes": "2 REST writes this round, each through the fleet relay (one repository_dispatch POST /repos/objectstack-ai/objectstack/dispatches per write): (1) issue_patch → PATCH /repos/objectstack-ai/objectstack/issues/20490 (relay run 36467640910); the body read back byte-identical (13906 chars) with one session-URL footer, and the PR is still draft. (2) this os-dev-report → POST /repos/objectstack-ai/objectstack/issues/20462/comments via post-stamped.mjs. Plus 1 git push (fast-forward, no force), to 927957df4.", "gates": { "head": "927957df4", "run": "pnpm check:i18n exit 0; the ledger vitest file exit 0 (10/10); check:nul-bytes exit 0", "not_measured": "the full derived-gate set was not re-run this round (reason: a text-only diff of a changeset sentence and a test comment, on top of a main merge; CI runs the set on 927957df4); CI not awaited (in_progress at report time)" }, "line_budget": "This round's own commit 4265c40ca: 2 files, +7 / −3. PR total vs main: 13 files, +728 / −659, under the 5000 threshold. No governed surface.", "files_changed": [ ".changeset/20462-zh-cn-object-labels.md", "packages/platform-objects/src/apps/translations/objects-zh-cn-echo-decisions.test.ts" ], "deviations": [ "None against the round's scope. The worktree was recreated from the pushed branch (08ebcd01d, equal on local and remote), then removed again with git worktree remove (no --force) after the push at 927957df4; the tree was clean. The build PID I started (30936) has exited." ], "open_questions": [], "out_of_scope_findings": [] }
Generated by Claude Code
objectstack-fleet commented
on Sep 28, 2026 ContributorAuthorMore actionsACCEPT — PR #20490 at
927957df4e375e0d7c338d7e63e859335b643d3cdomain:engine#1·session_01N8TPEsoJxPsdSdNKGnNGEN(os-warren) · written 2026-09-28T18:58Z. Contract review of record: the delta 5876450868 on PR #20490, at-tier, read-only, PASS on this head. It follows the PASS 5876239898 on08ebcd01dand a text-only patch round that corrected one FALSE word in the changeset and two comment slips.Checklist, verified against GitHub rather than the reports:
- Form: draft, base
main, first lineFixes #20462. That is the only closing keyword in the body. This card's newest claim, the amended 5875978969, names the branch and readsClause-②: no, the same line as the changeset and the PR body. - Scope: 13 files, +728 / −659:
zh-CN.objects.generated.ts: 320 leaf values, 0 keys. The review read every changed leaf and found no mistranslation, and no English term newly rendered two ways;- its provenance companion, regenerated by
pnpm i18n:extract(−320 rows, 42 left, set-equal to the declared echoes); - a new echo-decision ledger declaring the 42 leaves that stay English, each with its reason;
- nine panel ledgers' zh-CN floors brought from the old copy count to non-emptiness, as the amended claim admits;
- one changeset.
Every file is inside the amended claim.
- Changeset:
@objectstack/platform-objectspatch,Clause-②: no. It changes translated values only: no export, key or schema moves. - Governed surface: none (
check-governed-merges --pr 20490: not governed). 1387 changed lines, under the human-merge threshold. - CI: 41 check-runs on the head, all completed: 36
success(Lint & Repo Gates, which runscheck:i18n, among them), 5 path- or event-skipped, none red.mergeable_state: clean. - Behaviour: on a zh-CN console, Setup's platform-object labels, options, plural labels, help, descriptions and empty states read in Chinese. The Invite dialog's role list reads 所有者 / 管理员 / 受托管理员 / 成员 (the seat's answer A in 5875978969), and a team's
member_countreads 成员数. Brand, protocol and typed-literal strings stay English, declared.
Carried out of this card:
- platform-objects: the ja-JP and es-ES object bundles ship 383 / 392 leaves as the English source string (Delegated Admin in the Invite dialog role list among them), the class #20462 fixed for zh-CN #20493 (filed bare for triage): the same copy class in the
ja-JP(383) andes-ES(392) bundles,Delegated Adminamong them. - The coverage-ratchet half stays out of scope, per triage 5873680175. The copy count is recorded in the PR (362 → 42).
- Acceptance notes, carrier none:
Locked Untilis rendered two ways in the bundle (one of 33 pre-existing pairs, none added here); the result dialog'sClient IDstays English by a declared row the maintainer can flip. - PR feat(spec): curated activityMilestones, publicSharing, userActions and inlineColumns form rows (#19332, flight G2b) #20485 (#19188 split: 39 top-level zod-only keys are structured controls needing a designed widget, not a row #19332,
domain:spec) edits three of the same ledgers in other hunks. The review's three-way merge shows no conflict, and the later lander mergesmain.
Landing:
readyplus auto-merge through the queue. The merge closes this card (Fixes), and the seat verifies it onmainand removespm:dispatchedin the same act.- Form: draft, base
objectstack-fleet commented
on Sep 28, 2026 ContributorAuthorMore actionsLanding record: PR #20490 merged. This card is closed
completedby itsFixeslinedomain:engine#1·session_01N8TPEsoJxPsdSdNKGnNGEN(os-warren) · written 2026-09-28T19:25Z.Verified on
main:- The squash is
9bf5e67affab69ce740037f33b003f5faf45d205, a queue merge with one parent. It is an ancestor oforigin/main, and theorigin/maintip is the squash itself. - It carries 13 files, +728 / −659, the accepted head's list.
- The squash's changed lines are identical to the accepted head
927957df4's changes against its merge basefc0db22bc(the same md5 over every added and removed line). - The zh-CN leaf
成员数is present inzh-CN.objects.generated.tsat the squash and absent at its parent. The20462-*changeset is present at the squash and absent at its parent. - The PR body's one closing keyword is
Fixes #20462, so no other card was closed.
Delivered: on a zh-CN console, 320 platform-object leaves that shipped as English copies now read in Chinese: labels, plural labels, options, help, descriptions and empty states. The Invite dialog's role list reads 所有者 / 管理员 / 受托管理员 / 成员, and a team's
member_countreads 成员数. The 42 strings that stay English (brands, protocol names, bareID, typed literals) are declared with reasons inobjects-zh-cn-echo-decisions.test.ts.@objectstack/platform-objectsshipspatch,Clause-②: no.- ACCEPT is 5876518504. The contract review of record is the delta 5876450868 (PASS), after the PASS 5876239898 and a text-only patch round.
Carried out of this card:
- platform-objects: the ja-JP and es-ES object bundles ship 383 / 392 leaves as the English source string (Delegated Admin in the Invite dialog role list among them), the class #20462 fixed for zh-CN #20493 (bare, for triage): the
ja-JP/es-ESbundles' copies. - The coverage-ratchet half stays out, per triage 5873680175. The copy count is recorded in the PR (362 → 42).
pm:dispatchedis removed in the same act as this record. The domain, area and type labels stay.- The squash is
- added 2 commits that reference this issue
on Sep 29, 2026
Symptom
On a zh-CN console, several Setup surfaces show English:
Mechanism
These are not missing keys.
packages/platform-objects/src/apps/translations/zh-CN.objects.generated.tscarries the key with the English source string as its value. For example:sys_member.fields.role.options.delegated_admin="Delegated Admin", and the same value onsys_invitation.fields.role.options.delegated_admin.sys_team.fields.member_count.label="Member Count".A walk of the
enandzh-CNobject bundles at objectstack3cf6449389finds 338 zh-CN strings byte-equal to the English source, and 192 of them arelabeloroptions.*values. Some are legitimately untranslated, such as brand and protocol names (Google,GitHub,JWKS). Most are ordinary field labels an admin reads. For example:sys_session.fields.last_activity_at.label="Last Activity At"sys_organization.fields.parent_organization_id.label="Parent Organization"sys_invitation.fields.positions.label="Placement Positions"sys_two_factor.fields.locked_until.label="Locked Until"sys_member._views.mine.label="My Memberships"scripts/i18n-coverage-baseline.jsonrecords0forpackages/platform-objects/scripts/i18n-extract.config.ts. So a translated-locale value that is a copy of the source string reads to the coverage ratchet as translated, and nothing flags it.Reproduction
objectstack dev --no-seed-adminon a fresh DB, then create the owner through/_console/setup.zh, open Setup → 组织 → the org record → 邀请用户, and open the 角色 select.Delegated Adminis listed in English.POST /api/v1/auth/organization/create-team) and open its record. Themember_countlabel readsMEMBER COUNT.Expected