Repository navigation
Description
domain:ui#6 · os-sales · session_01L6bhgUR8Nu4M7tbtgES7q2
Filing gate: ① a user-visible defect with a named landing and a reproduction. Filed by the domain:ui#6 seat from the out-of-scope finding of #30208's card thread (os-dev-report 6659032953), class a.
Business reason. A Chinese-speaking administrator opens Setup and finds the two sections they use most for people and access (人员与组织, 访问控制) labelled in English, beside Chinese headings. It reads as unfinished, and it is the first screen of every permission task.
Reach. Measured live by #30208's card thread on the showcase stack at the PR's base, console in zh-CN, 1440 wide: the entries contributed by plugin-security render in English: Users, Organization, Business Units, Teams, Invitations, Position Holders, Permission Set Assignment, Sharing Rules, Record Shares, Queues, Queue Members, API Keys. Visible in the evidence screenshots linked from PR #30488's body (never-merged branch claude/issue-30208-evidence, commit c30ec3b2).
Reading, not yet settled. packages/platform-objects/src/apps/translations/zh-CN.ts:60 carries 「权限集分配」 for apps.setup.navigation.nav_permission_set_assignment.label, yet the sidebar shows "Permission Set Assignment". So a translation exists for at least one entry and is dropped somewhere. Which side drops it is not established: the nav items plugin-security contributes to the Setup app (their names or the bundle they are merged into), or the console's navigation label lookup.
Reader who acts. The domain:ui dev measures first: the served Setup app's navigation (/api/v1/meta/app/... for the Setup app under zh-CN) and the console's nav label lookup. If the served answer already carries the Chinese labels, the fix is the console lookup in ui/. If it does not, the card moves to domain:server with that reading (plugin-security's contributed nav items and the platform-objects translation bundle).
Expected
On a zh-CN console every Setup sidebar entry reads in Chinese wherever a translation exists, the same as the section headings.
Duplicates. Searched nav_permission_set_assignment (3 hits: #30208 open, #28316 and #28578 closed), setup sidebar english (29 hits), setup navigation translation (54 hits) and sidebar zh-CN English labels (32 hits). The near ones are #30208 (Setup wording, rows on page help texts, not the sidebar), #30126 (sidebar icons and tooltips, not labels), #26884 (closed, permission-set detail header) and QA run anchors; none has this subject.
Refs: #30208
Activity
objectstack-fleet commentedon Nov 5, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: audit · p2 ·
domain:ui· measure first · 2026-11-05T14:03Z⛔ Not a claim.
platform-objectscarries at least one Chinese label (nav_permission_set_assignment).domain:uimeasures the served Setup app navigation first. If the served answer is English, the card moves todomain:serverwith that reading.Generated by Claude Code
objectstack-fleet commentedon Nov 5, 2026
domain:ui#6 · os-sales · session_01L6bhgUR8Nu4M7tbtgES7q2
Claim: PM loop round 6 · 2026-11-05T14:23Z
Session:
session_01L6bhgUR8Nu4M7tbtgES7q2Account:
os-sales(the seat's linked user asGET /useranswers it; the card's assignee)Branch: the card thread's designated
claude/project-thread-*branch, named in a claim amendment once the thread reports itWorktree:
objectstack-issue-30504Domain:
domain:uiSeat:
domain:ui#6File surface: measurement first on a live stack (zh-CN console): the served Setup app navigation under zh-CN, and the console's navigation label lookup for contributed nav items. A fix only if the served answer already carries the Chinese labels and the console drops them: the nav label lookup in
ui/**(app-shell navigation / i18n resolution), with a pin and one root.changeset/file. ⛔packages/**: if the served answer is English, the dev stops and reports that reading, and the card moves todomain:server(stop on breach; explain in the report)Container & model:
M,mode:thread,model: default(dispatch-gates --tier: no path-derived mandate; floor sonnet · default opus · ceiling fable),effort: highClause-②: no
Metadata-protocol: none
Responsibility: unknown until measured: the console's nav label lookup in
ui/, or plugin-security's contributed Setup nav items and the platform-objects translation bundle | none known | every zh-CN administrator opening Setup; reached on the showcase stack by #30208's card thread (screenshots onclaude/issue-30208-evidencec30ec3b2)Thread-read: 6659963754
Premise: holds per the filing reading (
packages/platform-objects/src/apps/translations/zh-CN.ts:60carries 权限集分配 fornav_permission_set_assignment, the sidebar shows English); the dev re-measures onorigin/mainfa9c0aa2a0firstSerial constraints cleared: no open PR on this card; #30208's remaining rows (server lane) touch page help texts and object translations, not the Setup navigation labels.
objectstack-fleet commentedon Nov 5, 2026
domain:ui#6 · os-sales · session_01L6bhgUR8Nu4M7tbtgES7q2
席位核对 · Amendment · 2026-11-05T14:24Z · claim 6660406597 branch named
Branch:
claude/project-thread-kls008The card thread's harness-designated branch (a project-thread platform exception to the
claude/issue-<n>-<slug>convention); the dev thread is sessionsession_01L6bhgUk8NjZqaixvx6cAt6. Everything else in claim 6660406597 stands.objectstack-fleet commentedon Nov 5, 2026
domain:ui#6 · os-sales · session_01L6bhgUk8NjZqaixvx6cAt6
os-dev-report
{ "issue": 30504, "status": "reading", "branch": "claude/project-thread-kls008", "pr": null, "session": "session_01L6bhgUk8NjZqaixvx6cAt6", "premise_still_valid": true, "summary": "Measured on origin/main fa9c0aa2 (showcase stack, objectstack dev --seed-admin, file sqlite, signed in as the seeded admin). The SERVER serves the English: GET /api/v1/meta/app/setup with Accept-Language zh-CN answers all 9 group headings in Chinese (人员与组织, 访问控制, ...) and all 45 leaf entries in English (Users, Permission Set Assignment, Sharing Rules, API Keys, ... and every entry of 配置 / 诊断 / 审批 / 集成 / 高级 too, so the defect is the whole Setup sidebar, not only the two sections). The same deployment's catalog GET /api/v1/i18n/translations/zh-CN carries apps.setup.navigation.nav_users.label = 用户 and nav_permission_set_assignment.label = 权限集分配 (56 setup navigation keys). The console does not drop anything: ui/packages/layout/src/NavigationRenderer.tsx resolveNavItemLabel draws a present served label verbatim, and its docblock plus useObjectLabel navGroupLabel name the server-side translateApp as the sole owner of nav localization. So per the order no ui/** fix, no PR; the card moves to domain:server. Mechanism (confirmed by probe on the built packages/spec dist): every Setup leaf entry is a NavigationContribution (platform-objects setup-nav.contributions.ts, plugin-security, plugin-sharing, plugin-approvals, plugin-audit, plugin-webhooks, plugin-auth) merged by registry.applyNavContributions in metadata-protocol protocol-meta-item-reads.ts, while the packaged base the read gate passes to translateApp (getPackagedAppBase, the #30062 wiring, rest meta-item-read-gate.ts) is the setup.app.ts shell of empty group anchors. packagedNavNodes answers {} for an id the base lacks, valueOverridesPackagedBase({}, label, Users) answers changed, and with no pairBundle the changed catalog is empty, so the label keeps its English. Groups survive because the shell carries them with the same label. Probe: translateApp(served, bundle, {locale zh-CN}) gives 用户; the same call with packagedBase = the shell gives Users.", "tests": "Live readings: served nav tables nav-zh-CN.txt / nav-en.txt (45/45 leaf labels ASCII in zh-CN, 9/9 groups Chinese); catalog read as above. Probe probe.cjs against packages/spec/dist/system/index.js: no packagedBase -> [人员与组织,[用户]]; packagedBase = shell -> [人员与组织,[Users]]. Build: turbo build --filter=@objectstack/example-showcase... --filter=@objectstack/cli under os-verify-lock, VERDICT command-exit 0, 67/67 tasks. Console half read in code, not live (console dist not built): the renderer has no rung that could drop a served Chinese label.", "gates": "none: no diff, no PR. dispatch-gates --commands not run (empty change set).", "dogfood_battery": "n/a — no PR", "mcp_calls": "0", "api_writes": "1 — this os-dev-report comment (issues/30504/comments via relay)", "open_questions": [], "security_findings": "none", "out_of_scope_findings": [ "carrier: seat (re-route) · domain:server landing for this card: packages/spec/src/system/i18n-resolver.ts translateApp / packagedNavNodes, or the base it is handed (metadata-protocol getPackagedAppBase and the rest meta-item-read-gate packagedBase for type app). Two shapes for the server dev to weigh: A) the packaged app base includes code-layer nav contributions (fold applyNavContributions over the packaged declaration before it becomes packagedBase), so a contributed node is judged against its own packaged label; B) packagedNavNodes answers undefined (no base knowledge, catalog applies) for an id the base lacks. A keeps the ADR-0146 D2 rule that a node authored in a .custom override reads only the pair's translations; B would let the base catalog relabel an override-authored node that reuses a packaged id. Recommendation A. Any app with contributed nav (studio, others) is likely hit the same way; not measured. Regression timing vs #30062 not measured (shallow checkout).", "carrier: seat · reach widens the card: all 45 Setup leaf entries read English on zh-CN, not only 人员与组织 / 访问控制 (served nav table attached to the thread, project file issue-30504/nav-zh-CN.txt). Dedupe words: translateApp packagedBase navigation contribution, setup nav english zh-CN, packagedNavNodes" ], "deviations": "No live console screenshot: the server answer already decides the branch of the order, and the console read is code-level (named above)." }objectstack-fleet commentedon Nov 5, 2026
domain:ui#6 · os-sales · session_01L6bhgUR8Nu4M7tbtgES7q2
Release: 2026-11-05T14:35Z — the
domain:ui#6claim 6660406597 ends with no PR (os-dev-report 6660644606, status reading). Re-routed todomain:server.GET /api/v1/meta/app/setupserves the 9 group titles in Chinese and all 45 leaf entries in English. The whole Setup sidebar is affected, not only 人员与组织 / 访问控制. The same deployment's zh-CN catalog holdsnav_users= 用户 andnav_permission_set_assignment= 权限集分配. The console draws the served labels as given and drops nothing, so there is no ui change.NavigationContributions.translateAppis handed the packaged base fromgetPackagedAppBase(wired by Declared overrides: a mapping override publishes but is never served, doc and mapping overrides cannot be restored, and an override's label can be hidden by translation #30062), which is onlysetup.app.ts's empty group shell.packagedNavNodesanswers{}for an id the shell does not carry, so the entry is read as overridden, looks up an empty catalog, and keeps its English label. Confirmed with a probe against the built spec dist.issue-30504/. The card thread's branch carries no commit.objectstack-fleet commentedon Nov 5, 2026
domain:server#4 · os-bill · session_01Utp6CZMkHvuDeVYgTD73qF
Claim: PM loop round 1
Session:
session_01Utp6CZMkHvuDeVYgTD73qF(seat) · dev card threadsession_01Utp6CayrDmiTYnJJzkKhecAccount:
os-billBranch:
claude/project-thread-m01xpo(the card thread's designated push branch, the recorded platform exception toclaude/issue-<n>-<slug>)Worktree:
objectstack-issue-30504Domain:
domain:serverSeat:
domain:server#4File surface: the packaged app base handed to
translateApp(packages/metadata-protocol/src/protocol-discovery-and-bases.tsgetPackagedAppBase, andpackages/rest/src/meta-item-read-gate.tsonly if unavoidable, away frompairTranslationBundleOf), reusingSchemaRegistry.applyNavContributions; tests; changesets. ⛔packages/spec/**,docs/adr/**,.claude/**, repo-rootAGENTS.md,ui/**,skills/**(stop on breach; explain in the report)Container & model:
M,mode:thread,model: default judgment tier (opus) — dispatch-gates --tier: no path-derived mandate,effort: defaultClause-②: no — served navigation labels become translated where the catalog has them; nothing a caller sends is refused
Metadata-protocol: none
Responsibility:
Setup's contributed navigation entries are served untranslated | none: GET /api/v1/meta/app/setup under zh-CN serves 45/45 leaf labels in English while the catalog has them (os-dev-report 6660644606) | every non-English administrator, the first screen of every permission taskThread-read: 6660688296
Premise: holds (the dev reproduces on main first; stop if leaf labels already read translated)
Serial constraints cleared: seats 2, 5 and 6 confirmed no overlap on
protocol-discovery-and-bases.ts; seat 5's PR #30459 also editsmeta-item-read-gate.ts(second to merge mergesmain).Dispatch order:
/mnt/project-files/server-seat4/dispatch-30504.md(project shared folder). Ruling section: triage 6659963754 (p2, measure first); ui seat release 6660688296 re-routing todomain:serverwith the measured mechanism; the seat picks shape A (fold code-layer contributions into the packaged app base, keeping ADR-0146 D2), not shape B. Dispatched on the maintainer's 「任务很多,车道尽量跑满并发」.Fixes #30504.Posted 2026-11-05T14:49Z.
fix(metadata-protocol): fold contributed navigation into the packaged…
chore: changeset for #30504
objectstack-fleet commentedon Nov 5, 2026
domain:server#4 · os-bill · session_01Utp6CZMkHvuDeVYgTD73qF
os-dev-report
Dev card thread
session_01Utp6CayrDmiTYnJJzkKhec, branchclaude/project-thread-m01xpo, Claim 6661019686. Draft PR #30553, head5eef4217.{ "issue": 30504, "status": "done", "branch": "claude/project-thread-m01xpo", "pr": "https://github.com/objectstack-ai/objectstack/pull/30553", "session": "session_01Utp6CayrDmiTYnJJzkKhec", "premise_still_valid": true, "summary": "Shape A, as the seat picked. getPackagedAppBase (body in packages/metadata-protocol/src/protocol-discovery-and-bases.ts) now answers the app's packaged declaration with the code layer's navigation contributions folded in by the registry's one fold, SchemaRegistry.applyNavContributions, the fold the served app read already applies; no second copy, protocol.ts and meta-item-read-gate.ts untouched. A contributed node is now judged against its own packaged label and the catalog applies; a node a .custom override authors is in no contribution, so it still reads only the pair's translations (ADR-0146 D2). Live on the showcase stack: GET /api/v1/meta/app/setup in zh-CN serves 45/45 leaf entries in the catalog's text (0/45 on main per 6660644606), en unchanged; the account app's contributed nav_connect_agent reads 连接智能体 too (same path). Studio has no code-level contributions.", "tests": "Repro first: the new [#30504] describe in packages/objectql/src/protocol-custom-override-bare-slot-envelope.test.ts committed alone (97886306), metadata-protocol built without the fix: 4 failed / 87 skipped (expected {} to deeply equal { nav_users: 'Users' }). With the fix and a rebuild: file 91/91 passed. After merging origin/main and rebuilding the objectql closure: that file + registry-nav-contribution-group-semantics + registry-nav-contribution-disabled-package 112/112 passed (lock VERDICT command-exit 0). pnpm --filter @objectstack/metadata-protocol exec vitest run: 316 files passed / 4 skipped, 22425 passed / 26 skipped (pre-merge; the merge brought two metadata-protocol test files only). typecheck metadata-protocol + objectql: VERDICT command-exit 0. Live showcase measurement as in the summary. The red-then-green pair is the reverse verification; no extra ablation.", "gates": "dispatch-gates --commands on this diff: 58 families, each recorded 'cmd :: exit N' before any pipe; all exit 0. Two first recorded exit 3 (PREREQUISITE NOT MET): check-plugin-teardown-shape.mjs --self-test (shallow clone; fixture commit 621a4876 fetched, then exit 0) and check:dual-build-cjs-loads (seven packages had no dist; built, then exit 0, 116 entry points / 71 packages load). --ran: 58 run, 0 NOT-MEASURED. pnpm lint: no findings. eslint on the two changed source files: exit 0. Head 5eef4217. CI check-runs: in_progress at report time. Record: project files server-seat4/30504/ (gate-cmds.txt, gates-ran-first.txt, gates-ran.txt).", "line_budget": "+124 / -4 over 3 files", "files_changed": [".changeset/30504-contributed-nav-packaged-app-base.md", "packages/metadata-protocol/src/protocol-discovery-and-bases.ts", "packages/objectql/src/protocol-custom-override-bare-slot-envelope.test.ts"], "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm", "mcp_calls": "4 — issue_read x2 (card, comments), pull_request_read x1 (read-back of #30553), plus this count excludes ToolSearch; no MCP write", "api_writes": "2 — pr_create through the fleet-write relay (#30553, read-back 7228 bytes sent = stored), and this os-dev-report comment through post-stamped; git pushes are not REST writes", "deviations": "none on scope. The protocol.ts public docblock of getPackagedAppBase still says the app base is answered the same way as the page base; left untouched to stay off seat 5's facade series (named in the PR's acceptance notes).", "open_questions": [], "security_findings": "none", "out_of_scope_findings": ["carrier: none · noted, not filed: protocol.ts getPackagedAppBase docblock wording now understates the body (it folds contributions); a one-line edit can ride the next protocol.ts PR"] }Generated by Claude Code
objectstack-fleet commentedon Nov 5, 2026
domain:server#4 · os-bill · session_01Utp6CZMkHvuDeVYgTD73qF
Landed · PR #30553 · card closed by the seat
4bf6e8fa0; the PR saysFixes #30504, but GitHub did not close the card on merge (still open minutes later), so the seat closes it as completed with this comment. Seat record 6662689832 on head5eef4217(not BREAKING, not governed).mainsourcepackages/metadata-protocol/src/protocol-discovery-and-bases.ts:297return registry.applyNavContributions(declared);.custom-authored nodes still read only the pair's translations (ADR-0146 D2).The card's label
pm:dispatchedand theos-billassignee come off with this comment.Posted 2026-11-05T16:33Z.