Repository navigation
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
Description
Activity
objectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actionsPath: i18n — an org's edit to a packaged view is what its readers see | 缺项 (a published org overlay on a packaged view label is served to a zh-CN reader as the catalog translation, not the edit) | P2
Triage: first grade —
bug·priority:p2·domain:engine·area:reports·pm:queue. Direction: the view twin of PR #20728. The view translator takes a packaged base, and the protocol answers it; the/metathreading is its per-layer childTriage: the translator and the protocol halves ⇒
domain:engine. That is the lane that landed the dashboard halves (PR #20728,fix(spec,metadata-protocol), on #20680), and this is the same comparison on the same two packages. The/metaread-gate half ispackages/rest's, and per #20680's precedent that half is a per-layer child.Triage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-09-30T00:02Z. ⛔ Not a claim, ⛔ not a dispatch.Why p2. It takes #20680's grade (p2). A
zh-CNorg never sees its own edit of a packaged view, which ADR-0126 Regime O makes "yours to edit directly". It is measured by the #20680 dev as an admin and as a member.Direction.
- The translator. It applies ADR-0029 D9.2a's comparison when handed the packaged view: an explicit override beats the packaged catalog. It uses the same comparison PR fix(spec,metadata-protocol): a dashboard's packaged translation catalog yields to a published org overlay (#20680) #20728 gave
translateDashboard. ⛔ No second comparison. - The protocol. It answers the packaged view base the way
getPackagedDashboardBaseanswers a dashboard's. - The key. Views translate by composer-derived keys under
_views. The dev states which key the base is matched by, and pins it. - The
/metahalf. It 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. It is filed as the per-layer child at this card's landing, or added to 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 PR if that is still open, whichever the seats agree. - Pins (at the translator and protocol layer):
- an overlaid view label beats the catalog in
zh-CNwhen the base is handed; - an unedited view stays translated;
- a reset restores the shipped label.
- an overlaid view label beats the catalog in
- Docs.
content/docs/ui/translations.mdxstates the view rule once it is observable, next to 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 dashboard sentence.
- The translator. It applies ADR-0029 D9.2a's comparison when handed the packaged view: an explicit override beats the packaged catalog. It uses the same comparison PR fix(spec,metadata-protocol): a dashboard's packaged translation catalog yields to a published org overlay (#20680) #20728 gave
- 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 actionsClaim: PM loop round 24
Session:session_01DEvba2nBuD4tWzfq8r8NFY
Account:os-support-ai(the seat's linked user asGET /useranswers it; always the card's assignee)
Branch:claude/issue-20731-view-catalog-override
Worktree:objectstack-issue-20731
Domain:domain:engine
Seat:domain:engine#1
File surface (triage 5901376430; the cross-domain path triage designated to this lane, as for #20680):packages/spec/src/system/i18n-resolver.ts:translateViewtakes the packaged view base and applies ADR-0029 D9.2a's comparison through the one comparison PR fix(spec,metadata-protocol): a dashboard's packaged translation catalog yields to a published org overlay (#20680) #20728 gavetranslateDashboard. ⛔ No second comparison.packages/metadata-protocol/src/protocol.ts: the packaged view base, answered the waygetPackagedDashboardBaseanswers a dashboard's.- the pins (translator and protocol layer):
packages/spec/src/system/i18n-resolver.test.tsand a protocol test beside PR fix(spec,metadata-protocol): a dashboard's packaged translation catalog yields to a published org overlay (#20680) #20728'spackages/objectql/src/protocol-packaged-dashboard-base.test.ts;scripts/engine-double-contract.pinned.jsononly if the protocol surface pin asks. .changeset/20731-*.md:@objectstack/specand@objectstack/metadata-protocolminor(a widened published function type and a new protocol member).
Stop on breach and explain in the report. ⛔ Not the
/metaread gate (packages/rest, #20730's per-type resolver,domain:cli). ⛔ Notcontent/docs/ui/translations.mdx(its sentence follows once the rule is observable, with #20730).
Container & model:M,mode:subagent,model: opus(dispatch-gates --tier: no path-derived mandate, floor sonnet · default opus · ceiling fable)
Clause-②: yes
Thread-read: 5901376430
Serial constraints cleared: read at 2026-09-30T02:46Z againstorigin/main.- No open PR edits
i18n-resolver.tsorprotocol.ts(9 open PRs, file lists read this act). - The spec lane's in-flight packages/spec/src: 1,277 comment lines still cite 170 deleted tracker numbers (1,295 sites) — the staged remainder of ruling C+D on #19123, measured by PR #20226 #20234 (comment citations across
packages/spec/src) may reachi18n-resolver.tscomments. There is no PR open for it now; whichever lands second mergesmain. A notice goes to spec seat 2 on [PM seat] domain:spec · seat 2 — 🟢 marchtian · session_016njDy8ozy9B9Ns5Y8kAWEK #18549 in this act. - 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 (the
/metadashboard child,domain:cli) is not touched; this card's/metaarm is filed or folded at its landing, as triage directs.
objectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actionsos-dev-report
{
"issue": 20731,
"status": "done",
"branch": "claude/issue-20731-view-catalog-override",
"pr": "#20770",
"session": "session_01DEvba2nBuD4tWzfq8r8NFY",
"premise_still_valid": true,
"summary": "Reproduced on origin/main 33e4a56 at the translator and protocol layer: a published org overlay on showcase_task.in_progress is served by protocol.getMetaItem and getMetaItems with the edited label, and translateView answers the catalog's zh-CN label (进行中) over it even when it is handed the packaged view, because it took ResolveOptions and never read packagedBase. The fix is in two parts. First, translateView now takes TranslateDocumentOptions and applies ADR-0029 D9.2a through the one existing comparison (valueOverridesPackagedBase, shared with translateDashboard and translateObject; no second comparison). It covers the view label and description, and each bulk-action def's label, confirmText and confirmLabel and its params' label, help and placeholder, matched by name. Second, ObjectStackProtocolImplementation gains getPackagedViewBase(name), which is keyed by the qualified OBJECT.VIEW_KEY registry name, never by the bare catalog key; it and getPackagedDashboardBase now share one private packagedArtifactBase. Nothing served changes until the /meta view arm lands: H4 was measured at the REST route handlers, where zh-CN still gets 进行中 and getPackagedViewBase is called 0 times. So the PR says 'Part of #20731' and the card stays open for that arm.",
"tests": "Code and pins at a3f753c (the fix plus a merge of origin/main a51920f); the only later commit, 64f4797, adds a ledger row. (1) spec: src/system/i18n-resolver.test.ts, 299 passed, including a new block of 12 (-t 20731: 12 passed). The whole spec local project: 576 files, 17003 passed, 1 todo. (2) objectql: new src/protocol-packaged-view-base.test.ts, 10 passed against a real SchemaRegistry and the real protocol. The whole objectql local project: 339 files, 6714 passed. (3) metadata-protocol vitest run: 190 files passed (3 skipped), 2792 tests passed (19 skipped). (4) typecheck green for spec (tsc, check:scripts-typecheck, test layer), metadata-protocol (tsc) and objectql (tsc, tsconfig.scripts.json, test layer). (5) cli unit test/i18n-bulk-action-coverage.test.ts, which drives translateView: 17 passed at 64f4797. Reverse verification, each with the fix committed: (A) spec, source-resolved, scripts/ablation-replace.mjs: translateView was fed no base, the anchor went 1 to 0, the blob went 1e7995c1148d to 2f0943d33e2a, and 5 of 12 new pins went red (edited label, every string kind, tenant-added def or param, reset, dispatcher); restored with blob == HEAD and git diff HEAD empty. (B) the same mutation through spec dist: rebuilt, ablation-dist-preflight found the marker in 4 built files, and 2 of 10 objectql pins went red (translation with base on item and list in zh-CN and en; reset). Restore leg: rebuild, --absent over 230 files, tree clean, 10 of 10 green. (C) getPackagedViewBase made to answer the plain registry read (the shadow trap), through metadata-protocol dist: marker in 2 built files, 2 of 10 red (plain-key overlay immunity, no-code-package case); restore leg: rebuild, --absent over 24 files, tree clean, 10 of 10 green.",
"mcp_calls": "0 — no MCP tool was called. GitHub reads went through curl GET against the REST API (issue 20731 and its comments, issue 20730, PR 20728, comment 5900307018, the pulls list, PR 20770 and its check runs and labels).",
"api_writes": "3 REST writes, each through one fleet-write relay repository_dispatch (POST /repos/objectstack-ai/objectstack/dispatches): (1) pr_create -> POST /repos/objectstack-ai/objectstack/pulls (draft #20770, run 36665779437 success; the body read back byte-identical, 14851 chars); (2) label-write --assign os-support-ai -> POST /repos//issues/20770/assignees (run 36665837084 success, read back MATCHES); (3) this os-dev-report comment -> POST /repos//issues/20731/comments via scripts/pm/post-stamped.mjs. There were also 5 git pushes to the branch, which are not REST. No labels were written by this run; the PR carries documentation, size/l, tests, tooling and protocol:system, set by other actors.",
"gates": "node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack (no paths) derived 96 families at 64f4797, and all 96 were run with an exit code recorded. Three first exited 3 (PREREQUISITE NOT MET, no built output): check:dual-build-cjs-loads, check:lean-entry-closure and check:type-check-debt. They exited 0 after turbo run build over ./packages/* and ./packages// (71 tasks). dispatch-gates --ran: '96 derived, 96 run, 0 NOT-MEASURED, 0 UNRUN' (exit 0). All 96 exited 0, including check:api-surface ('public API surface + factory signatures unchanged'), check:engine-double-contract (after its --write added one findOne row), check:objectql-double-limit, check:issue-citations (7 citations, all resolve), check:nul-bytes, check:changeset-no-major, check:adr-0087-registration, check:empty-changeset, check:type-check-coverage and check:type-check-debt, and check:test-source-alias. Narrowed lint: eslint --no-inline-config --format json over the 4 changed .ts files reported 4 files, 0 errors, 0 warnings. The population is the config's own files glob; the config enables no type-aware linting, so this diff cannot move an untouched file's verdict. CI at report time (one read, not polled): 12 success, 3 skipped, 17 in_progress.",
"line_budget": "+658 / -27 = 685 changed lines over 7 files (dispatch-gates reading at 64f4797), against the 5000-line human-merge threshold: under. No skills/** or governed surface is touched.",
"files_changed": [
".changeset/20731-metadata-protocol-packaged-view-base.md (+13, new)",
".changeset/20731-spec-view-catalog-override.md (+19, new)",
"packages/metadata-protocol/src/protocol.ts (+52 / -2)",
"packages/objectql/src/protocol-packaged-view-base.test.ts (+257, new)",
"packages/spec/src/system/i18n-resolver.test.ts (+226)",
"packages/spec/src/system/i18n-resolver.ts (+86 / -25)",
"scripts/engine-double-contract.pinned.json (+5, written by the gate's --write)"
],
"deviations": [
"Scope, declared in the PR: translateView's rule also covers the bulk-action copy (the def's label, confirmText and confirmLabel; the param's label, help and placeholder) as well as the view label and description, because the rule belongs to the translator and the dashboard twin covered every string it translates. The measured reading is the label only; the bulk-action cases are pinned but were not measured on a running app.",
"Refactor inside the file surface: the dashboard part finder packagedDashboardPart is renamed packagedPart and its key union widened, so both translators share it. getPackagedDashboardBase's body moved into a private packagedArtifactBase that both accessors call. The dashboard behaviour is unchanged (its pins and the full suites are green). H1's premise differed: the comparison was already one function (valueOverridesPackagedBase), so there was nothing to extract.",
"'Part of #20731', not 'Fixes': the /meta view arm is still open after this merge (H4, measured), and triage routes it onto #20730's per-type resolver. Whether this card closes with a filed per-layer child, or stays open until that arm lands, is the seats' call.",
"Reproduced at the translator plus protocol layer (a scratch objectql test), not in a real /meta boot. H4 was measured at RestServer's real route handlers with a protocol double, not in a boot.",
"The branch merged origin/main once, at a51920f, before the PR opened. Main has since taken 3 commits (cba417a, 0d9349f, 7053333) that touch none of these packages, so I did not merge again, to keep the gate union valid at 64f4797. The merge queue rebuilds.",
"One run used 'pnpm --filter @objectstack/spec test -- --maxWorkers=2'. The flag after the bare -- may have been dropped; the intent was the whole local project, and all 576 files ran.",
"Commits carry the model-free trailer pair that AGENTS.md prescribes, not the harness reminder's model-named Co-Authored-By. The merge commit a3f753c has git's default message and no trailer pair."
],
"open_questions": [],
"out_of_scope_findings": [
"carrier: the /meta view arm (packages/rest meta-item-read-gate.ts packagedObjectBaseOf answers undefined for view; measured: the item and list reads in zh-CN serve 进行中 and getPackagedViewBase is called 0 times). Triage routes it onto #20730's per-type base resolver as one more arm; the seats file it as the per-layer child or fold it into #20730's PR. Seam: spec:TranslateDocumentOptions.packagedBase -> runtime:packages/rest/src/meta-item-read-gate.ts packagedObjectBaseOf. Noted, not filed. Dedupe words: packagedObjectBaseOf view, getPackagedViewBase rest, view overlay translation catalog, _views label overlay zh-CN",
"carrier: the /meta view arm, next to #20730's dashboard sentence · noted, not filed. content/docs/ui/translations.mdx should state the view catalog-versus-override rule once it is observable.",
"carrier: the /meta view arm's browser verification · noted, not filed. Not measured: whether the console re-resolves objects.OBJECT._views.VIEW_KEY.label client-side over the served label. The dashboard twin flagged that shape for widget titles; objectui was not read in this run."
]
}
Generated by Claude Code
objectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actionsACCEPT — PR #20770 @
64f479766domain:engine#1·session_01DEvba2nBuD4tWzfq8r8NFY· 2026-09-30T04:44Z. The seat is the reviewer of record. Everything below was read on GitHub and onorigin/main, not taken from the report.- Shape: the first line is
Part of #20731, thenClause-②: yes. Two changesets:@objectstack/specminorand@objectstack/metadata-protocolminor. The PR assignee isos-support-ai. Declared to spec seat 2 on [PM seat] domain:spec · seat 2 — 🟢 marchtian · session_016njDy8ozy9B9Ns5Y8kAWEK #18549 (5903088512) before the PR opened. - Scope: 7 files, +658/-27; not governed.
translateViewtakesTranslateDocumentOptionsand, when handed the packaged view, applies ADR-0029 D9.2a through the one existing comparison (valueOverridesPackagedBase, shared withtranslateDashboardandtranslateObject). It covers the view label and description and each bulk-action def's and param's copy, matched byname. Without a base, the output is unchanged.ObjectStackProtocolImplementation.getPackagedViewBase(name)answers the code-package view by its qualified<object>.<viewKey>registry name, never the bare catalog key, through one private body it now shares withgetPackagedDashboardBase. An overlay hydrated under the plain registry key can never be returned as the base.
- Measured: reproduced on
origin/mainat the translator and protocol layer (zh-CNserved进行中over the edit even with the base in hand); after the fix, an overlaid view label beats the catalog when the base is handed, an unedited view stays translated, and a reset restores the shipped label. The dev also measured that/metastill hands no view base (getPackagedViewBasecalled 0 times at the REST handlers), so nothing served changes until the/metaview arm lands. - Contract review: at-tier record 5904170324 on this head, PASS (read-only,
Local-runs: none). - Checks on this head: 32
success, 3skipped, all rostered. - The card after landing (triage 5901376430: the
/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 … added to 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 PR if that is still open, whichever the seats agree"): 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 is open indomain:cliwith no PR yet, so the view arm is folded into it by a pointer on 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 at landing. This card then goespm: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 did. - Carried, not filed: the
content/docs/ui/translations.mdxview sentence (triage defers it until the rule is observable, next to 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 dashboard sentence), and the console's client-side re-resolution of_viewslabels (unmeasured; its carrier is the/metaarm's browser check).
Landing: ready and auto-merge in this act.
Generated by Claude Code
- Shape: the first line is
objectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actionsLanded — PR #20770 as
9ad654487(the translator and protocol halves; the card waits on #20730)domain:engine#1·session_01DEvba2nBuD4tWzfq8r8NFY· 2026-09-30T05:21Z.Blocked-by: #20730
- Verified on
main:9ad654487is a squash with one parent (a3d7588b5) and an ancestor oforigin/main.getPackagedViewBase(name: string)is inpackages/metadata-protocol/src/protocol.tsat the squash (1) and not at its parent (0). 7 files, +658/-27, as reviewed. - Route: ready and auto-merge through the relay at the reviewed head
64f479766(PASS 5904170324 on that head), with all 3 skipped checks rostered.added_to_merge_queueat 04:46Z, then merged by the queue at 05:20Z. - What landed:
translateViewlets an explicit override beat the packaged catalog when it is handed the packaged view, through the one existing comparison;getPackagedViewBaseanswers the view a code package ships, keyed by<object>.<viewKey>. No served answer changes yet. - What remains: the
/metaview arm, which handsgetPackagedViewBase's answer totranslateViewon the item and list reads. Per triage 5901376430, it 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; 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 has no PR yet, so it is folded in by a pointer on 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 in this act. Thecontent/docs/ui/translations.mdxview sentence and the console's client-side re-resolution check go with it. - Labels: this card moves from
pm:dispatchedtopm:blockedin this act, withBlocked-by: #20730above, 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 did.
Generated by Claude Code
- Verified on
objectstack-fleet commented
on Oct 1, 2026 ContributorAuthorMore actionsTriage: blocked-card audit. The blocker #20730 has been closed
completed. Resume or releaseTriage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-01T03:40Z. ⛔ Not a claim, ⛔ not a dispatch.@os-support-ai: this card is
pm:blockedon #20730 and assigned to you (domain:engine#1,session_01DEvba2nBuD4tWzfq8r8NFY). #20730 landed as PR #20832 →7afdc5c59f(the packaged-base resolver for the/metareads), so this card's remaining half can proceed.- Resume under your claim (
pm:dispatched), or release with a line-startRelease:line so the card returns topm:queue. - The same holder has 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 and [Decision] v18:查询能否直接按关联记录的字段筛选(例:「客户行业 = 科技」的商机) #20802 in the same state. Triage asked on both (
5921936803,5923885559) with no answer yet. ⛔ Triage changes no assignee.
Generated by Claude Code
- Resume under your claim (
objectstack-fleet commented
on Oct 1, 2026 ContributorAuthorMore actionsRelease: session
session_01DEvba2nBuD4tWzfq8r8NFY(domain:engine#1,os-support-ai) · reason: the maintainer's order relayed by seat 2 on #6367 (5922029579: 「seat 1 只处理在手任务,你接管 engine 车道。」, in seat 2's chat), and the maintainer's stand-down order in this seat's own chat (「当前任务处理完,合并后就下班」) · to:domain:engine#2(seat post #20966), viapm:queuedomain:engine#1· 2026-10-01T04:34Z. The assignee is cleared in this act, andpm:blocked→pm:queue.- Landed on this card: PR fix(spec,metadata-protocol): a view's packaged translation catalog yields to a published org overlay (#20731) #20770 →
9ad654487: the translator and protocol halves (ACCEPT 5904213081, landing record 5904652950). The/metaview arm was folded into 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 (pointer 5904663679). - The blocker has closed: 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 (the
/metaREST half,domain:cli) closed ascompletedon 09-30 at 10:59Z. This seat did not run the unlock until now. That is a seat miss, recorded in its stand-down brief. - For the next claimer: check on
mainwhether anything remains beyond the landed halves and 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. If nothing does, the card closes ascompletedwith that reading; otherwise claim the remainder.
Generated by Claude Code
- Landed on this card: PR fix(spec,metadata-protocol): a view's packaged translation catalog yields to a published org overlay (#20731) #20770 →
objectstack-fleet commented
on Oct 1, 2026 ContributorAuthorMore actionsUnlock, verified, and closed
completed— the blocker #20730 answered this card's last half; the server answer holds onmain6f578888a8domain:engine#1·session_01DEvba2nBuD4tWzfq8r8NFY· 2026-10-01T05:29Z.Provenance: the maintainer, in this seat's own chat: 「#20680 和 #20731 的阻塞卡关闭,你负责解锁」. This seat released the card 5924813396 before it ran the unlock. This act runs the unlock it owed and supersedes that release's "for the next claimer" line.
The three unlock duties:
- The blocker is satisfied. 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 closed
completedon 09-30 at 10:59Z, through PR fix(rest): the /meta dashboard and view reads hand the translator the packaged base, so a published org overlay beats the packaged catalog #20832 →7afdc5c59f. - What the blocker answered: the
/metaview arm this card's pointer 5904663679 folded into 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.packagedObjectBaseOfinpackages/rest/src/meta-item-read-gate.tsbecame one per-type resolver (PACKAGED_BASE_ACCESSORS), and itsviewrow isgetPackagedViewBase(name)(this card's PR fix(spec,metadata-protocol): a view's packaged translation catalog yields to a published org overlay (#20731) #20770 →9ad654487). Both the item read and the list read resolve it.- Its pin file
meta-dashboard-view-i18n-explicit-override.test.ts§3 holds this card's own pins forshowcase_task.in_progress: item and list, admin and member,enandzh-CN. After an overlay and a publish the edit is served; the uneditedshowcase_task.urgentstays translated; a reset restores the shipped label, translated. - The ablation (the resolver answers
objectonly) turned every edit cell red. - The real boot measured
labelgoing from进行中to the edit on item and list, admin and member,zh-CN, with 0 diffs in the pristine and reset phases.
- Re-verified on
main(6f578888a8, read in this act):- The pin file and
meta-item-read-gate.tsare unchanged since7afdc5c59f(git logover both: empty). PACKAGED_BASE_ACCESSORSstill carries theviewrow, andgetPackagedViewBaseandvalueOverridesPackagedBaseare onmain.Test Core(all shards,@objectstack/restamong them) issuccessondff98c1f51,11d28c17dfanda9d36d51b7.- No local re-run: the green CI on unchanged files is the measurement.
- The pin file and
This card's scope ("the view translator applies the same comparison when handed the packaged view, and the
/metaview item and list reads hand it that base", with the pins above) is met onmain.Not this card's, carried: the console still re-resolves the view's tab and breadcrumb against the bundle in the browser. PR #20832 measured it at objectui pin
db11afd4967c:zh-CNdraws进行中. That half is objectui's. Triage filed the console half from that measurement as objectstack-ai/objectui#11295 (5921936803). This session cannot read objectui's issues, so whether #11295 names the view tab and breadcrumb beside the dashboard board is for thedomain:uilane to confirm.Closing as
completed.pm:queueis removed in this act.
Generated by Claude Code
- The blocker is satisfied. 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 closed
- added 4 commits that reference this issue
on Oct 7, 2026
Filing gate: ① a product defect with a measured
reach:. Finding class (a).reach:isGET /api/v1/meta/view/showcase_task.in_progressandGET /api/v1/meta/viewwithAccept-Language: zh-CN, after a published org overlay. The #20680 dev measured them in a real showcase boot, as an admin and as a member of the same org, on PR #20728's branch build (os-dev-report5900307018 on #20680,out_of_scope_findings[1], probe3). The readings are the dev's; the seat did not re-run them.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 spec translator (packages/speci18n-resolver.ts) and the/metadoors.What happens
showcase_task.in_progress's label toIn Progress (edited-20680)and is published.enreader is served the edit.zh-CNreader, admin or member, on the item read and the list read, is served进行中: the catalog's translation of the shipped label, not the edit.In Progress.ADR-0126 Regime O makes packaged views and dashboards "yours to edit directly". A
zh-CNorg never sees its own edit.Why
It is the same family as #20680: the i18n catalog (
objects.<object>._views.<view_key>.label) is applied over the served document with no packaged base to compare against. So the catalog wins over an authored label, which is the opposite of what ADR-0029 D9.2a records for objects ("an explicit override beats a packaged default", the #8284 comparison). PR #20728 teachestranslateDashboardthat comparison, and the dashboard/metathreading is #20730. Neither covers views.Scope for whoever takes it
/metaview item and list reads hand it that base.enandzh-CN. An unedited view stays translated, and a reset restores the shipped label._views, so check the key the base is matched by (the dev's note).Dedupe
search_issuesinobjectstack-ai/objectstack, open and closed:resolveViewLabelreads two fields the served view document does not have #4854 (view labels never resolved a translation, closed) is the nearest, and none is an overlay losing to the catalog.Dedupe words:
view overlay translation catalog·translateView packagedBase·_views label overlay zh-CN·Regime O overlay i18nGenerated by Claude Code