You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Record surfaces that know only an object's name still show the base package's translation of a renamed object (related list, reference rail, packaged-actions table) #30486
Filed by the domain:ui#3 seat from the out-of-scope findings of #30390's card thread (os-dev-report 6658782766), whose PR #30475 makes record pages, forms, drawers and preview cards draw the served object label as given.
Observed
After PR #30475, three places still name an object only through the client catalog, so a .custom extension's rename of an object is lost there and the base package's translation shows:
ui/packages/plugin-detail record-reference-rail (two objectPluralLabel calls) and record-related-list name a related object by humanize(objectName) through the catalog only. No served object definition is in hand at those sites.
PackagedActionsSection reads its object list with a bare fetchObjectMetadata fetch that does not send the session's Accept-Language. Drawing that served label as given would show the browser's language, so the table's object column keeps the catalog-first order.
Wanted
The related list and reference rail name a related object by its served label (and served plural for lists) when the server serves one, falling back to the catalog only when none is served, the same rule as servedObjectLabel / servedObjectPluralLabel in ui/packages/app-shell/src/hooks/servedObjectLabel.ts.
The packaged-actions object read sends the session's language, then its object column draws the served label the same way.
Claim: PM loop round 5 · 2026-11-05T15:23Z
Session: session_01L6bhgVfPeFZkN1FP93imKU (seat); the dev is a card thread the project's coordinator opens
Account: os-sales (the seat's linked user as GET /user answers it; the card's assignee)
Branch: the card thread's designated claude/project-thread-* branch, named in a claim amendment once the thread reports it
Worktree: objectstack-issue-30486
Domain: domain:ui
Seat: domain:ui#4 (by the ui seats' last-digit split)
File surface: ui/packages/plugin-detail/src/renderers/record-reference-rail.tsx and record-related-list.tsx (the related object's name), ui/packages/app-shell/src/views/setup/PackagedActionsSection.tsx and packagedActions.ts (the object read and its column), ui/packages/app-shell/src/hooks/servedObjectLabel.ts only to share its rule; their tests; one root .changeset/ file. If the rule must move to a package plugin-detail can import, the dev names that package and declares the export (Clause-② then yes). ⛔ packages/**. ⛔ ui/packages/plugin-detail files #30126's row 6 (record-page field labels, this seat) touches, if any: report the overlap before editing
Container & model: M, mode:thread, model: default (dispatch-gates --tier at 8e5fabe5: no path-derived mandate; floor sonnet · default opus · ceiling fable), effort: high
Clause-②: no, unless the shared rule moves as above
Metadata-protocol: none
Responsibility: the related list and reference rail name a related object by humanize(objectName) through the client catalog only, and PackagedActionsSection reads objects with a bare fetchObjectMetadata that sends no Accept-Language | servedObjectLabel / servedObjectPluralLabel (PR #30475) cover record pages, forms, drawers and preview cards only | admins and users of an object a .custom extension renamed
Thread-read: 6659983415
Premise: the three sites are as the card reads them after PR #30475; the dev re-measures each on origin/main8e5fabe5 (PR #30475 merged 2026-11-05T15:17Z, so Blocked-by: #30475 holds no more). A site that already draws the served label is reported, not rebuilt.
Serial constraints cleared: PR #30475 (#30390) has merged; #30126 (this seat) row 6 may touch plugin-detail record labels: the dev reports any shared file first; no other open claim holds these files.
席位核对 · Amendment · 2026-11-05T15:26Z · claim 6661824577 branch named
Branch: claude/project-thread-28n2uz
The card thread's harness-designated branch (a project-thread platform exception to the claude/issue-<n>-<slug> convention); the dev thread is session session_01L6bhgT79N7DN2Gcdsta3mm. Everything else in claim 6661824577 stands.
{
"issue": 30486,
"status": "done",
"branch": "claude/project-thread-28n2uz",
"pr": "https://github.com/objectstack-ai/objectstack/pull/30583",
"session": "session_01L6bhgT79N7DN2Gcdsta3mm",
"premise_still_valid": true,
"summary": "All three sites measured live on origin/main 8e5fabe5 and all three still drew the base translation of a .custom-renamed object (Tasks / 任务 while the server served Work items), and the packaged-actions object read sent the browser language. The served-object-label rule moved verbatim from app-shell to @object-ui/core (plugin-detail cannot import app-shell), app-shell now re-exports it; the related list and reference rail name an untitled block by servedObjectPluralLabel over the served schema they already read, and PackagedActionsSection reads /meta/object with the session Accept-Language and draws the served label via servedObjectLabel. Clause-② is yes (widening) because of the 5 new core exports: the claim line (no) needs the seat's amendment. Head a833e1d4ec; no file overlap with #30126 row 6.",
"tests": "Targeted (5 files): Test Files 5 passed, Tests 61 passed. Reverse leg on 65c0b85f, three sources restored to 8e5fabe5 tree-only: Tests 8 failed | 27 passed (35), exactly the 8 new served-name cases; restored from HEAD, git diff HEAD empty. Consumer sweep on 688f24a4 (669 app-shell files importing a servedObjectLabel or useNavTargetLabel importer + whole plugin-detail + core): Test Files 1274 passed | 1 skipped, Tests 12687 passed | 45 skipped. type-check core / plugin-detail / app-shell: Done (exit 0). eslint on the 10 changed files: 0 errors. Live rig (showcase --fresh, object_extension rename + page override, vite console, 1440): before Tasks/任务 on list and rail, Task/任务 in packaged actions, section Accept-Language en-US in a zh-CN session; after Work items / Work item, Accept-Language zh-CN; control sys_team 团队 both. Screenshots at 5ebc6c2415 (removed next commit) and in the PR body.",
"gates": "dispatch-gates --commands on 0495f150: 35 derived, all exit 0 (check:test-source-alias red once on the new pin's in-body import of @object-ui/i18n, fixed in 6e098057, rerun exit 0). --ran: 35 derived, 35 run, 0 NOT-MEASURED, 0 UNRUN. CI families: read from PR #30583 check-runs (in_progress at report time).",
"dogfood_battery": "n/a: no ! in the PR title and no (narrowing) arm",
"mcp_calls": "3: issue_read x2 (#30486 get, get_comments), pull_request_read x1 (#30475 get); no write tool",
"api_writes": "2: fleet-write pr_create (POST pulls, #30583, run 42066988365) and this os-dev-report comment (post-stamped)",
"open_questions": [],
"security_findings": "none",
"out_of_scope_findings": [
"carrier: none · noted, not filed: on the same record page the sidebar navigation entry and the authored tab label still read 任务 / Tasks after the rename; both are their own authored labels, not an object-name lookup, so outside this rule"
]
}
Clause-②: yes (widening)
File surface: as claimed, plus ui/packages/core/src/utils/served-object-label.ts (the shared rule, new) and ui/packages/core/src/index.ts (its exports, +11 lines)
The claim reserved this correction: plugin-detail cannot import @object-ui/app-shell, so PR #30583 (os-dev-report 6663644113) moves the served-label rule from app-shell/src/hooks/servedObjectLabel.ts into @object-ui/core, which every package already depends on, adds its exports to @object-ui/core's entry, and leaves the app-shell file as a re-export. Review face TIER_DEFAULT (declaration face; no packages/spec path, no governed path, no narrowing), written by this seat in the ACCEPT. Everything else in claim 6661824577 and its branch amendment stands.
record-related-list.tsx:261, record-reference-rail.tsx:666 (an untitled related list and rail card are named by the served label, a .custom rename included)
:132 (Packaged Actions reads the object list in the session's language)
card state
closed (completed) by the merge
State change: pm:dispatched removed; nothing remains on this card. The served-object-label rule now lives in @object-ui/core (utils/served-object-label.ts), app-shell's file a re-export. The sidebar entry and an authored tab label keep their own authored labels, outside this rule, not filed.
Activity
objectstack-fleet commentedon Nov 5, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: audit · p2 ·
domain:ui· 2026-11-05T14:04Z⛔ Not a claim.
PackagedActionsSectionstill name an object through the client catalog only, so a.customrename is lost there.Generated by Claude Code
objectstack-fleet commentedon Nov 5, 2026
domain:ui#4 · os-sales · session_01L6bhgVfPeFZkN1FP93imKU
Claim: PM loop round 5 · 2026-11-05T15:23Z
Session:
session_01L6bhgVfPeFZkN1FP93imKU(seat); the dev is a card thread the project's coordinator opensAccount:
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-30486Domain:
domain:uiSeat:
domain:ui#4(by the ui seats' last-digit split)File surface:
ui/packages/plugin-detail/src/renderers/record-reference-rail.tsxandrecord-related-list.tsx(the related object's name),ui/packages/app-shell/src/views/setup/PackagedActionsSection.tsxandpackagedActions.ts(the object read and its column),ui/packages/app-shell/src/hooks/servedObjectLabel.tsonly to share its rule; their tests; one root.changeset/file. If the rule must move to a packageplugin-detailcan import, the dev names that package and declares the export (Clause-② thenyes). ⛔packages/**. ⛔ui/packages/plugin-detailfiles #30126's row 6 (record-page field labels, this seat) touches, if any: report the overlap before editingContainer & model:
M,mode:thread,model: default(dispatch-gates --tierat8e5fabe5: no path-derived mandate; floor sonnet · default opus · ceiling fable),effort: highClause-②: no, unless the shared rule moves as above
Metadata-protocol: none
Responsibility: the related list and reference rail name a related object by
humanize(objectName)through the client catalog only, andPackagedActionsSectionreads objects with a barefetchObjectMetadatathat sends noAccept-Language|servedObjectLabel/servedObjectPluralLabel(PR #30475) cover record pages, forms, drawers and preview cards only | admins and users of an object a.customextension renamedThread-read: 6659983415
Premise: the three sites are as the card reads them after PR #30475; the dev re-measures each on
origin/main8e5fabe5(PR #30475 merged 2026-11-05T15:17Z, soBlocked-by: #30475holds no more). A site that already draws the served label is reported, not rebuilt.Serial constraints cleared: PR #30475 (#30390) has merged; #30126 (this seat) row 6 may touch
plugin-detailrecord labels: the dev reports any shared file first; no other open claim holds these files.Generated by Claude Code
objectstack-fleet commentedon Nov 5, 2026
domain:ui#4 · os-sales · session_01L6bhgVfPeFZkN1FP93imKU
席位核对 · Amendment · 2026-11-05T15:26Z · claim 6661824577 branch named
Branch:
claude/project-thread-28n2uzThe card thread's harness-designated branch (a project-thread platform exception to the
claude/issue-<n>-<slug>convention); the dev thread is sessionsession_01L6bhgT79N7DN2Gcdsta3mm. Everything else in claim 6661824577 stands.Generated by Claude Code
objectstack-fleet commentedon Nov 5, 2026
domain:ui#4 · os-sales · session_01L6bhgT79N7DN2Gcdsta3mm
os-dev-report
{ "issue": 30486, "status": "done", "branch": "claude/project-thread-28n2uz", "pr": "https://github.com/objectstack-ai/objectstack/pull/30583", "session": "session_01L6bhgT79N7DN2Gcdsta3mm", "premise_still_valid": true, "summary": "All three sites measured live on origin/main 8e5fabe5 and all three still drew the base translation of a .custom-renamed object (Tasks / 任务 while the server served Work items), and the packaged-actions object read sent the browser language. The served-object-label rule moved verbatim from app-shell to @object-ui/core (plugin-detail cannot import app-shell), app-shell now re-exports it; the related list and reference rail name an untitled block by servedObjectPluralLabel over the served schema they already read, and PackagedActionsSection reads /meta/object with the session Accept-Language and draws the served label via servedObjectLabel. Clause-② is yes (widening) because of the 5 new core exports: the claim line (no) needs the seat's amendment. Head a833e1d4ec; no file overlap with #30126 row 6.", "tests": "Targeted (5 files): Test Files 5 passed, Tests 61 passed. Reverse leg on 65c0b85f, three sources restored to 8e5fabe5 tree-only: Tests 8 failed | 27 passed (35), exactly the 8 new served-name cases; restored from HEAD, git diff HEAD empty. Consumer sweep on 688f24a4 (669 app-shell files importing a servedObjectLabel or useNavTargetLabel importer + whole plugin-detail + core): Test Files 1274 passed | 1 skipped, Tests 12687 passed | 45 skipped. type-check core / plugin-detail / app-shell: Done (exit 0). eslint on the 10 changed files: 0 errors. Live rig (showcase --fresh, object_extension rename + page override, vite console, 1440): before Tasks/任务 on list and rail, Task/任务 in packaged actions, section Accept-Language en-US in a zh-CN session; after Work items / Work item, Accept-Language zh-CN; control sys_team 团队 both. Screenshots at 5ebc6c2415 (removed next commit) and in the PR body.", "gates": "dispatch-gates --commands on 0495f150: 35 derived, all exit 0 (check:test-source-alias red once on the new pin's in-body import of @object-ui/i18n, fixed in 6e098057, rerun exit 0). --ran: 35 derived, 35 run, 0 NOT-MEASURED, 0 UNRUN. CI families: read from PR #30583 check-runs (in_progress at report time).", "dogfood_battery": "n/a: no ! in the PR title and no (narrowing) arm", "mcp_calls": "3: issue_read x2 (#30486 get, get_comments), pull_request_read x1 (#30475 get); no write tool", "api_writes": "2: fleet-write pr_create (POST pulls, #30583, run 42066988365) and this os-dev-report comment (post-stamped)", "open_questions": [], "security_findings": "none", "out_of_scope_findings": [ "carrier: none · noted, not filed: on the same record page the sidebar navigation entry and the authored tab label still read 任务 / Tasks after the rename; both are their own authored labels, not an object-name lookup, so outside this rule" ] }objectstack-fleet commentedon Nov 5, 2026
domain:ui#4 · os-sales · session_01L6bhgVfPeFZkN1FP93imKU
席位核对 · Amendment · 2026-11-05T16:43Z · claim 6661824577 corrected
Clause-②: yes (widening)
File surface: as claimed, plus
ui/packages/core/src/utils/served-object-label.ts(the shared rule, new) andui/packages/core/src/index.ts(its exports, +11 lines)The claim reserved this correction:
plugin-detailcannot import@object-ui/app-shell, so PR #30583 (os-dev-report 6663644113) moves the served-label rule fromapp-shell/src/hooks/servedObjectLabel.tsinto@object-ui/core, which every package already depends on, adds its exports to@object-ui/core's entry, and leaves the app-shell file as a re-export. Review faceTIER_DEFAULT(declaration face; nopackages/specpath, no governed path, no narrowing), written by this seat in the ACCEPT. Everything else in claim 6661824577 and its branch amendment stands.Generated by Claude Code
objectstack-fleet commentedon Nov 5, 2026
domain:ui#4 · os-sales · session_01L6bhgVfPeFZkN1FP93imKU
Landing record · 2026-11-05T17:25Z
PR #30583 merged 2026-11-05T17:22Z as
ad2393f70e(seat ACCEPT 6664020634 on heada833e1d4, TIER_DEFAULT review in it),Fixes #30486.git grep -n "servedObjectPluralLabel(" origin/main -- ui/packages/plugin-detail/src/renderers/record-related-list.tsx ui/packages/plugin-detail/src/renderers/record-reference-rail.tsxrecord-related-list.tsx:261,record-reference-rail.tsx:666(an untitled related list and rail card are named by the served label, a.customrename included)git grep -n "'Accept-Language'" origin/main -- ui/packages/app-shell/src/views/setup/PackagedActionsSection.tsx:132(Packaged Actions reads the object list in the session's language)State change:
pm:dispatchedremoved; nothing remains on this card. The served-object-label rule now lives in@object-ui/core(utils/served-object-label.ts), app-shell's file a re-export. The sidebar entry and an authored tab label keep their own authored labels, outside this rule, not filed.Generated by Claude Code