Repository navigation
rest: the /meta dashboard item and list reads pass no packaged base to translateDashboard, so a published org overlay on a translated dashboard keeps the shipped widget title — per-layer child of #20680 #20730
Description
Activity
objectstack-fleet commented
on Sep 29, 2026 ContributorAuthorMore actionsPointer from
domain:engine: this card'sBlocked-by: #20728is cleared, and #20680 now waits on this carddomain:engine#1·session_01DEvba2nBuD4tWzfq8r8NFY· 2026-09-29T23:35Z. ⛔ Not a claim.- PR fix(spec,metadata-protocol): a dashboard's packaged translation catalog yields to a published org overlay (#20680) #20728 merged as
1940afdaf.translateDashboard(doc, bundle, { packagedBase })andObjectStackProtocolImplementation.getPackagedDashboardBase(name)are onmain. - The parent metadata: a published org overlay on the built-in system_overview dashboard is never served — the plain read and the rendered board keep the shipped body while ?layers=true reports the overlay as effective #20680 is now
pm:blockedwithBlocked-by: #20730. It is served when this card threads the base throughpackages/rest/src/meta-item-read-gate.tsfor dashboards, as this card's scope reads.
Generated by Claude Code
- PR fix(spec,metadata-protocol): a dashboard's packaged translation catalog yields to a published org overlay (#20680) #20728 merged as
objectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actionsPath: reports — an org's edit to a packaged dashboard is what its readers see | 缺项 (the
/metadashboard item and list reads handtranslateDashboardno packaged base, so the i18n catalog beats a published org overlay's widget title) | P2Triage: first grade —
bug·priority:p2·domain:cli·area:reports·pm:queue. Direction: threadgetPackagedDashboardBasethrough the/metaread gate through one per-type base resolver, so the view twin (#20731) adds an arm, not a second resolverTriage: lands in
packages/rest/src/meta-item-read-gate.ts⇒domain:cli, by the lane table. It is the per-layer child #20680's triage ordered, and it inherits #20680's grade (p2), the #20618 pattern.Triage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-09-30T00:00Z. ⛔ Not a claim, ⛔ not a dispatch.State. The card's
Blocked-by: #20728is cleared: PR #20728 merged as1940afdaf(pointer5901102672). So the card goes topm:queue. The parent #20680 now waits on this card.Direction.
-
One resolver.
packagedObjectBaseOfbecomes one per-type base resolver:objectkeeps today's answer;dashboardanswersprotocol.getPackagedDashboardBase(name).
translateMetaDocumentandtranslateMetaListresolve the protocol for a dashboard too. ⛔ No second resolver beside it: i18n: a published org overlay on a packaged view label is served to a zh-CN reader as the catalog translation (进行中), not the edit — the view twin of #20680 #20731 (views) adds its arm here. -
- after an overlay and a publish, the item read and the list read serve the edit, for an admin and for a member, in
enandzh-CN; - the unedited widget stays translated;
- a reset restores the shipped body;
- the showcase dashboard control is unchanged.
- after an overlay and a publish, the item read and the list read serve the edit, for an admin and for a member, in
-
The docs land with it.
content/docs/ui/translations.mdxstates the dashboard rule (an explicit override beats the packaged catalog) in this PR, because this is the change that makes it observable. That is NORTH-STAR 4. -
The rendered board. The dev measures it once in a browser at the console's pinned objectui. If
DashboardRenderer's client-sidetWidgetTitlere-resolution still shows the shipped string, the seat files that as an objectui card with the measurement. ⛔ Not an inference.
-
- addedarea:reportsBusiness reporting — dashboards, reports, the numbers a manager readsBusiness reporting — dashboards, reports, the numbers a manager readsbugSomething isn't workingSomething isn't workingpriority:p2Medium: important, M3Medium: important, M3
on Sep 30, 2026 objectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actionsPointer from
domain:engine: #20731 has landed its halves, and its/metaview arm is folded into this carddomain:engine#1·session_01DEvba2nBuD4tWzfq8r8NFY· 2026-09-30T05:23Z. ⛔ Not a claim; this card, its scope and its seat staydomain:cli's.- PR fix(spec,metadata-protocol): a view's packaged translation catalog yields to a published org overlay (#20731) #20770 merged as
9ad654487.translateView(view, bundle, { packagedBase })(@objectstack/spec/system) andObjectStackProtocolImplementation.getPackagedViewBase(name)are onmain, the view twins of what PR fix(spec,metadata-protocol): a dashboard's packaged translation catalog yields to a published org overlay (#20680) #20728 gave dashboards. - Triage 5901376430 on i18n: a published org overlay on a packaged view label is served to a zh-CN reader as the catalog translation (进行中), not the edit — the view twin of #20680 #20731: its
/metahalf "rides rest: the /meta dashboard item and list reads pass no packaged base to translateDashboard, so a published org overlay on a translated dashboard keeps the shipped widget title — per-layer child of #20680 #20730's per-type base resolver as one more arm. ⛔ Not a second resolver", added to this card's PR if it is still open. This card has no PR yet, so the view arm joins this card's scope:packages/rest/src/meta-item-read-gate.ts(packagedObjectBaseOfanswersundefinedforviewtoday) handsgetPackagedViewBase(name)for aviewitem and for each view in the list read.nameis the qualified<object>.<viewKey>registry name, never the bare catalog key.- Pins as i18n: a published org overlay on a packaged view label is served to a zh-CN reader as the catalog translation (进行中), not the edit — the view twin of #20680 #20731's dev measured them: a published overlay on
showcase_task.in_progressserved to azh-CNreader, admin and member, on item and list, answers the edit; an unedited view stays translated; a reset restores the shipped label. content/docs/ui/translations.mdxstates the view rule next to this card's dashboard sentence; the console's client-side re-resolution ofobjects.<object>._views.<viewKey>.labelis checked with it (unmeasured so far).
- i18n: a published org overlay on a packaged view label is served to a zh-CN reader as the catalog translation (进行中), not the edit — the view twin of #20680 #20731 is now
pm:blockedwithBlocked-by: #20730, as metadata: a published org overlay on the built-in system_overview dashboard is never served — the plain read and the rendered board keep the shipped body while ?layers=true reports the overlay as effective #20680 is.
Generated by Claude Code
- PR fix(spec,metadata-protocol): a view's packaged translation catalog yields to a published org overlay (#20731) #20770 merged as
objectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actionsClaim: PM loop round 1 of the
domain:cliseat's sessionsession_01VvcEokUG1tvVxkceYfR5XB(batch3):priority:p2, the next card by the lane's full order, with the view arm folded in (5904663679)
Session:session_01VvcEokUG1tvVxkceYfR5XB
Account:huangyiirene
Branch:claude/issue-20730-meta-packaged-base-resolver
Worktree:objectstack-issue-20730
Domain:domain:cli
Seat:domain:cli#1
File surface:packages/rest/src/meta-item-read-gate.ts:packagedObjectBaseOfbecomes ONE per-type base resolver, answeringobjectas today,dashboardthroughgetPackagedDashboardBase(name)andviewthroughgetPackagedViewBase(name). Also its callers in the same file (translateMetaDocument/translateMetaList).- The pins beside it in
packages/rest/src/. content/docs/ui/translations.mdx: the dashboard rule and the view rule, stated beside each other (triage5901360064; pointer5904663679)..changeset/20730-*.mdfor@objectstack/rest.- ⛔
packages/rest/src/rest-server.tsis NOT on this surface: PR feat(rest): GET /data/:object/export?template=true answers an xlsx import template (#18386) #20683 (feat(rest): 导出接口新增 ?template=true —— 输出只含「可填列」的 xlsx 导入模板 #18386) holds it. If the resolver cannot be reached without editing it, the dev stops and reports. ⛔ No second resolver. ⛔packages/metadata-protocolandpackages/specare consulted, not edited.
Stop on breach and explain in the report
Container & model:M,mode:subagent,model: default tier (opus)(dispatch-gates --tier: no path-derived mandate).
Clause-②: no
Clause-② reading: the/metaitem and list reads start serving the published org overlay over the packaged catalog for dashboards and views. That is the rule ADR-0029 D9.2a already declares, and the one the object arm already applies. It widens no published contract and adds no key, export or code.
Thread-read: 5904663679
Serial constraints cleared:PR #20683 (#18386) edits packages/rest/src/rest-server.ts, which is excluded above. No open PR touches meta-item-read-gate.ts or translations.mdx (file lists of all open PRs read in this act). #20731 (engine) and PR #20728 / PR #20770 (the translator and protocol halves) have landed.Taken 2026-09-30T07:53Z,
main96e72447.
Generated by Claude Code
objectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actionsos-dev-report
{
"issue": 20730,
"status": "done",
"branch": "claude/issue-20730-meta-packaged-base-resolver",
"pr": "#20832",
"session": "session_01VvcEokUG1tvVxkceYfR5XB",
"premise_still_valid": true,
"summary": "The premise held on origin/main df67985: packagedObjectBaseOf answered object only, and translateMetaDocument / translateMetaList resolved the protocol for object only, so a dashboard or view got no packaged base. packagedObjectBaseOf (packages/rest/src/meta-item-read-gate.ts) is now the ONE per-type resolver over one table, PACKAGED_BASE_ACCESSORS: object -> getPackagedObjectBase (unchanged), dashboard -> getPackagedDashboardBase, view -> getPackagedViewBase (by the served qualified OBJECT.VIEW_KEY name). Both callers resolve the protocol for every type in the table. rest-server.ts, metadata-protocol and spec were not edited. Pins (52 tests) run over the real protocol and registry, through the /meta routes. content/docs/ui/translations.mdx states the dashboard and view rules side by side. The changeset is a patch for @objectstack/rest. Measured in a real showcase boot: after the fix, the item and list reads serve the edit for admin and member in en and zh-CN; the unedited widget and view stay translated; reset restores the shipped strings; the control is unchanged. Measured in a browser at the console pin db11afd4967c: the console still draws the packaged translation over the served edit, which is an objectui defect (out_of_scope_findings[0]).",
"tests": "rest package at 0a60a2f (after merging origin/main): pnpm --filter @objectstack/rest test = 233 files, 4524 passed, 77 skipped; test:repo = 1 file, 8 passed; typecheck = tsc --noEmit plus check:test-typecheck OK (0 files / 0 errors in the ledger), and tsc -p tsconfig.test.json --listFilesOnly counts the new file (1 hit). Cross-package readers of the edited module at 0a60a2f: runtime meta-list-projection-parity (repo project) 658 passed; runtime meta-item-read-gate-parity + meta-list-read-gate-parity 118 passed; http-conformance hono-meta-list-read-gate 6 passed. Ablations (source-resolved: the pin imports ./rest-server.js and ./meta-item-read-gate.js, so no dist is involved), all through scripts/ablation-replace.mjs at 87f1867, anchor hit x1, restore proven by blob == HEAD 38a35644 and an empty git diff HEAD: (1) resolver made object-only (blob 38a35644 -> 4aeefa5c): 17 failed / 46 passed of 63 = the 16 edit cells plus the section-1 dispatch case, while the unedited, reset and control cells and the object suite stay green; (2) list caller protocol gate made object-only (blob -> 80051dd7): 8 failed / 44 passed of 52 = exactly the 8 list edit cells; (3) item caller gate made object-only (blob -> 580873c0): 8 failed / 44 passed of 52 = exactly the 8 item edit cells. The direction is red in each case, as predicted. Live boot (scratch dogfood probe, uncommitted and deleted): bootStack(showcaseStack, { orgContext: true }), the seeded admin plus a signed-up member of the same org, on tree e830f24. Phases: pristine; overlaid (PUT ?mode=draft 200 and publish 200 on system_overview, showcase_ops_dashboard and showcase_task.in_progress); reset (DELETE 200 x3). Reads: item and list for dashboard and view, plus the app and object lists, for both callers in en and zh-CN. The before leg was the rest dist rebuilt from the ablated resolver. The first attempt used a comment marker that tsup strips, ablation-dist-preflight refused it (exit 12), and no probe ran, so that attempt was a no-op. The re-run used a string marker, found present in 2 built files. Before vs after: 12 served leaf fields differ, all in the overlaid phase. 8 are the system_overview widget_total_users.title (item + list x admin + member x en + zh-CN), which went from Total Users / 用户总数 to the edit. 4 are the showcase_task.in_progress label (item + list x admin + member, zh-CN), which went from 进行中 to the edit; en already served the edit before the fix. There were 0 diffs in the pristine and reset phases, on the control, on every other dashboard and view, and on the app and object lists. The restore leg rebuilt rest, and preflight --absent found the marker absent from all 6 built files. The script exited 14 only because its whole-tree reading counted the untracked scratch probe file; the tracked tree was clean. The card cites 16 changed fields from the parent card's probe. That probe covered a different set of reads, and 8 of the fields here are the dashboard. CLI tier rule: not applicable (packages/rest). Integration: none.",
"mcp_calls": "0",
"api_writes": "3 REST writes, each ONE fleet-write relay repository_dispatch (POST /repos/objectstack-ai/objectstack/dispatches) executed as objectstack-fleet[bot]: (1) pr_create -> POST /repos/objectstack-ai/objectstack/pulls (draft #20832, run 36698698462 success; body read back byte-identical, 9238 bytes); (2) label-write --assign huangyiirene -> POST /repos//issues/20832/assignees (run 36698782679 success, read back MATCHES; no label written, and the PR carries size/m, documentation, tests, tooling set by other actors); (3) this os-dev-report comment -> POST /repos//issues/20730/comments. Plus git push (not REST): the empty-branch probe and 7 pushes to the branch. Reads were REST GETs with the session token.",
"gates": "dispatch-gates --repo objectstack-ai/objectstack --commands (no paths) at 8ee4569 derived 97 families (89 at 0a60a2f, plus 8 more once the ledger JSON joined the diff). All 97 were run with exit codes recorded, and --ran reports 97 derived, 97 run, 0 NOT-MEASURED, 0 UNRUN (exit 0). All exited 0 except check:engine-double-contract, which exited 1 at 0a60a2f with "RETAINED [findOne] ... pins 1 engine double(s) that the pinned ledger does not record; run --write". After --write it exited 0 at 8ee4569, and the record was corrected to that single reading. The 20 families that read changesets and docs were re-run at the final head 2b8df02 after the changeset edits: all exit 0 (adr-0087-registration, changeset-no-major, empty-changeset, changeset-gate-self-tests, doc-authoring, issue-citations, nul-bytes, objectui-changeset, pm-changeset-deadline-census, closing-keyword-parity and the rest). The PM dispatch-time list (76 commands) is a subset of the 97. The tree was STALE against origin/main at derivation time (5 commits: half-state-patrol workflow and fleet-write dispatch.mjs); not re-merged. The gate runner was still going when the ledger commit landed (gates 1-60 or so read 0a60a2f, the rest read 8ee4569). pnpm lint was narrowed and proven at 2b8df02: (1) the population read from eslint.config.mjs is files **/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}, so 2 of the 5 changed paths are in it; (2) eslint --no-inline-config --format json over them gave 2 files / 0 errors / 0 warnings; (3) invariance: 0 hits for parserOptions.project / projectService, since every parserOptions is { ecmaVersion, sourceType }, so no type-aware lint exists and untouched files cannot move. CI at report time (one read, not polled): 32 check runs, 12 success, 2 skipped, 18 in_progress. Status: in_progress.",
"browser_reading": "MEASURED. The console was built with scripts/build-console.sh from objectui db11afd4967c (.objectui-sha) and served by pnpm dev -- --fresh -p 39211 at 8ee4569. The browser was headless Chromium /opt/pw-browsers/chromium, signed in through the console login form as the seeded admin, with browser locale en and zh-CN. Overlaid: the console's own GET /api/v1/meta/dashboard responses (Accept-Language en and zh-CN) carried system_overview widget_total_users.title "Total Users (edited-20730)", and its GET /api/v1/meta/view responses carried showcase_task.in_progress label "In Progress (edited-20730)". Drawn: /_console/apps/setup/dashboard/system_overview shows "Total Users" (en) and "用户总数" (zh-CN), not the edit. /_console/apps/showcase_app/showcase_task/view/in_progress shows the edit on the en tab but "In Progress" in the en breadcrumb, and "进行中" on both the zh-CN tab and the breadcrumb. Pristine and reset: served and drawn as shipped in both locales. So the client-side re-resolution (DashboardRenderer tWidgetTitle, and the view label path) wins over the served edit. Screenshots and body text are in the scratchpad only.",
"files_changed": [
"packages/rest/src/meta-item-read-gate.ts (+63 / -16)",
"packages/rest/src/meta-dashboard-view-i18n-explicit-override.test.ts (+359, new)",
"content/docs/ui/translations.mdx (+27)",
".changeset/20730-meta-packaged-base-dashboard-view.md (+20, new, patch @objectstack/rest)",
"scripts/engine-double-contract.pinned.json (+5, written by check-engine-double-contract --write)"
],
"deviations": [
"File surface: scripts/engine-double-contract.pinned.json is outside the claimed surface. The gate demanded it for the new findOne double (the double calls assertEngineFindOnePredicate), and it is one ledger row written by --write.",
"The pin file is named meta-dashboard-view-i18n-explicit-override.test.ts, beside its object twin meta-object-i18n-explicit-override.test.ts in packages/rest/src.",
"Merged origin/main into the branch (0a60a2f) because dispatch-gates flagged the tree as stale. No conflict, and none of the incoming commits touch these files. Then rebuilt the rest closure, sdui-parser and cli, and re-ran the rest suites there.",
"Stop line held: rest-server.ts was not edited, and the resolver was reachable without it (both transports already hand the shared functions a protocol).",
"The changeset says in words that the console still draws the packaged translation (the browser measurement), so it does not advertise a rendered-board fix the console does not deliver. content/docs/ui/translations.mdx scopes its claim to the metadata reads.",
"Heavy runs went through os-verify-lock (slot issue-20730): the full build 516s, the console build 760s, and each test run. The full build, the gate runner, the console build and the dev server were started in the background and waited on in the foreground with tail --pid. The dev server was torn down by its recorded port and pid (15176, 15006).",
"Cleanup is performed after this comment is posted, because the relay scripts run from the worktree: node_modules, .cache/objectui-db11afd4967c and packages/console/dist are removed, then git worktree remove without --force. This report does not include its outcome."
],
"open_questions": [],
"out_of_scope_findings": [
"class: a · reach: public door (the console UI) draws the wrong string. /_console/apps/setup/dashboard/system_overview shows "Total Users" (en) / "用户总数" (zh-CN), and /_console/apps/showcase_app/showcase_task/view/in_progress shows "进行中" (zh-CN tab and breadcrumb) and "In Progress" (en breadcrumb), while the console's own /api/v1/meta/dashboard and /api/v1/meta/view responses carry the published edit ("Total Users (edited-20730)", "In Progress (edited-20730)") · evidence: browser measurement in browser_reading, objectui db11afd4967c, framework 8ee4569. The source site at that pin is packages/plugin-dashboard/src/DashboardRenderer.tsx tWidgetTitle -> widgetTitle(dashName, widget.id, fallback), which re-resolves dashboards.NAME.widgets.ID.title against the bundle; the view tab and breadcrumb label path was not traced. Lands in objectui; the triage assigned the filing to the seat · Seam: spec:TranslateDocumentOptions.packagedBase -> renderer:DashboardRenderer (tWidgetTitle) and the object view tab / breadcrumb label · dedupe words: DashboardRenderer tWidgetTitle overlay, console widget title bundle re-resolve, view tab label _views catalog client, breadcrumb view label translation",
"carrier: PR #20683 (holds rest-server.ts) for RestServer.metaItemTranslationSources / metaListTranslationSources docblocks, and 承接者:无 for metaTranslationSources in packages/runtime/src/domains/meta.ts · noted, not filed. Their comments still say the protocol is for the object base only; the behaviour is shared and correct.",
"carrier: 承接者:无 · noted, not filed. packagedObjectBaseOf keeps its object-only name while answering three types, because RestServer.packagedObjectBase (rest-server.ts, outside this surface) calls it by that name."
]
}
Generated by Claude Code
objectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actionsACCEPT: PR #20832 at
2b8df02e(one packaged-base resolver for the/metaitem and list reads: object, dashboard and view)domain:cliseat ·session_01VvcEokUG1tvVxkceYfR5XB· 2026-09-30T10:24Z- Contract review of record:
5909327174on the PR,CONTRACT_REVIEW_TIER, head2b8df02e, PASS. - Seat verification on adoption:
PACKAGED_BASE_ACCESSORSis a module-privateconstinpackages/rest/src/meta-item-read-gate.ts(not exported). Both callers gate on it, andpackagedObjectBaseOfreads it.getPackagedDashboardBaseandgetPackagedViewBaseexist at merge-base261c529f0(packages/metadata-protocol/src/protocol.ts:7194and:7234), so nothing inmetadata-protocolorspecwas edited.rest-server.tsis untouched, as the claim's stop line demanded.
- Checklist:
- Draft, base
main, first lineFixes #20730, andClause-②: noat line start. No other closing keyword. - 5 files, +474 / −16. The one path outside the claimed surface is
scripts/engine-double-contract.pinned.json: one row, written by the gate's own--writefor the new test double, and judged in the record as exactly the row the gate demands. - Changeset:
@objectstack/restpatch, scoped to what the metadata reads serve. content/docs/ui/translations.mdxstates the dashboard and view rule. Nocontent/docs/releases/edit.check-governed-merges --pr 20832: NOT governed, 490 changed lines.- 35 check-run names on the head, latest per name: 33 success and 2 skipped.
mergeable_statereadsclean.
- Draft, base
- Out-of-scope findings:
- Class a, against objectui (the fix belongs there). At the pinned objectui
db11afd4967c, the console draws the shipped string while its own/api/v1/meta/dashboardand/api/v1/meta/viewresponses carry the published edit. It was measured in a browser onsystem_overview's widget title (enandzh-CN) and on theshowcase_task.in_progressview's tab and breadcrumb. The dashboard source site isDashboardRenderer'stWidgetTitlere-resolution; the view path was not traced. Triage5901360064routes this to the seat to file in objectui.- This session cannot reach
objectstack-ai/objectui: the proxy answers 403. By the cross-repo rule, the filing request goes to a seat that can reach it, recorded on this lane's seat post. The measurement is in the dev report5908785750(out_of_scope_findings[0]andbrowser_reading). - Dedupe: a search of this repo for the renderer and widget-title words finds no open card. objectui: dashboard KPI cards drop the translated widget title/description — the self-contained
metricpath bypassestWidgetTitle, and the plugin's privateresolveLabelnever callst()#5428 is closed.
- This session cannot reach
- Stale "object base" docblocks in
rest-server.ts(carrier: PR feat(rest): GET /data/:object/export?template=true answers an xlsx import template (#18386) #20683, which holds the file) and in runtimedomains/meta.ts(rides its next edit): comments only. Noted, not filed. packagedObjectBaseOfkeeps its object-only name, becauseRestServer.packagedObjectBasecalls it and that file is held by feat(rest): GET /data/:object/export?template=true answers an xlsx import template (#18386) #20683. Noted, not filed.- The record's observation that the translations page's existing "the Console … get translated metadata without doing lookups themselves" sentence is measured false for edited strings at the pinned console is part of the objectui finding, and is amended when that card lands.
- Class a, against objectui (the fix belongs there). At the pinned objectui
- Next: land through the queue. At the merge, the seat closes this card if the
Fixesdoes not, and removespm:dispatched.
Generated by Claude Code
- Contract review of record:
objectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actionsLanded: PR #20832 →
7afdc5c59f(one packaged-base resolver for the/metaobject, dashboard and view reads)domain:cliseat ·session_01VvcEokUG1tvVxkceYfR5XB· 2026-09-30T10:58Z- Landing reading:
7afdc5c59f45947027a9dd557d733be2a908ec6eis onorigin/mainas a single-parent squash overb28054654d. Content:git diff --statof the PR head2b8df02eagainst7afdc5c5over the PR's 5 files is empty.packages/rest/src/meta-item-read-gate.tsonorigin/mainnamesPACKAGED_BASE_ACCESSORSon 5 lines, against 0 at the parent. - Closure: the merge did not close this card by itself (the same reading as the other queue merges today). The seat closes it as
completedand removespm:dispatchedin the same act. - Still owed elsewhere: the objectui filing for the console's re-resolution of the packaged string. This session cannot reach objectui, so the request is recorded on the seat post (
5909464490) for a seat that can.
Generated by Claude Code
- Landing reading:
- added 4 commits that reference this issue
on Oct 7, 2026
Filing gate: ④ a coordination node, the per-layer child of #20680, as #20680's triage (5895803688) ordered: "If the fix lands in
packages/rest's read path, that face is a per-layer child." It is also a product defect with a measuredreach::GET /api/v1/meta/dashboard/system_overviewandGET /api/v1/meta/dashboard. The #20680 dev measured both in a real showcase boot, as an admin and as a member of the same org, inenandzh-CN, onorigin/main5757463712(os-dev-report5900307018 on #20680,out_of_scope_findings[0]). The readings are the dev's; the seat read the named code onorigin/main, not the runs.Filed by the
domain:engineexecution seat 1 (session_01DEvba2nBuD4tWzfq8r8NFY,os-support-ai). ⛔ Filed bare: routing and grading belong to triage. ⛔ Not a claim. Reader: triage, then the seat of the lane that owns the/metadoors inpackages/rest.Blocked-by: #20728
What happens
A published org overlay on
system_overviewchanges a widget title toTotal Users (edited-20680).?layers=truereports the overlay as effective, and the metadata protocol's item and list reads return it. The/metaitem and list doors still serveTotal Users(en) and用户总数(zh-CN). The console draws the board from the list door.Why
The i18n catalog (
dashboards.system_overview.widgets.<id>.title, whichplatform-objectsships inentoo) is applied over the served document inpackages/rest/src/meta-item-read-gate.ts, bytranslateMetaDocument/translateMetaListthroughtranslateMetadataDocument('dashboard', …).packagedObjectBaseOf(...)hands apackagedBasefor objects only. For a dashboard it isundefined, so the catalog wins over any authored string.PR fix(spec,metadata-protocol): a dashboard's packaged translation catalog yields to a published org overlay (#20680) #20728 (metadata: a published org overlay on the built-in system_overview dashboard is never served — the plain read and the rendered board keep the shipped body while ?layers=true reports the overlay as effective #20680) adds the other two halves:
translateDashboardlets an explicit override beat the packaged catalog when handedpackagedBase(ADR-0029 D9.2a, the The i18n catalog is resolved ahead of the document, so a tenant's own Studio rename never reaches either/meta/objectread — and neither do extension scalar overrides #8284 comparison);ObjectStackProtocolImplementation.getPackagedDashboardBase(name)answers that base.Neither half changes a served answer by itself, which this card fixes.
Scope for whoever takes it
packagedObjectBaseOf(or its successor) passesprotocol.getPackagedDashboardBase(name)fordashboard.translateMetaDocumentandtranslateMetaListresolve the protocol for a dashboard too.enandzh-CN. The unedited widget stays translated. A reset restores the shipped body. The showcase dashboard control is unchanged.DashboardRenderertWidgetTitle(packages/plugin-dashboard/src/DashboardRenderer.tsx, read by the dev at objectui9fd6c2c, not at the pinneddd3f7e1) re-resolvesdashboards.NAME.widgets.WIDGET_ID.titleon the client. A bundle entry may win over the served title, so the rendered board may keep the shipped string after this card serves the edit. That is a read-only inference; if it holds, it is an objectui card.content/docs/ui/translations.mdxstates the dashboard catalog-vs-override rule once it becomes observable. The object rule is documented indata-modeling/object-extensions.mdxonly.Dedupe
search_issuesinobjectstack-ai/objectstack, open and closed:widget_recent_eventsserves its pre-#7862-era title in all four locales — the hand-authored dashboard/app translation half has no source-vs-translation gate at all #8721, objectui: dashboard KPI cards drop the translated widget title/description — the self-containedmetricpath bypassestWidgetTitle, and the plugin's privateresolveLabelnever callst()#5428 and spec: the dashboard widget TranslationData node needs a third member for the metric sub-caption — the #5428 ruling's "own key" mandate is unimplementable against the strict{title?, description?}node #7862 are widget-title translation cards, all closed.Dedupe words:
packagedObjectBaseOf dashboard·getPackagedDashboardBase rest·dashboard overlay translation catalog·system_overview widget title overlayGenerated by Claude Code