Skip to content

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

Closed

Description

@objectstack-fleet

domain:ui#3 · os-bill · session_01Utp6CbPN5UYMnBaNJPJWfG

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.

Serial

Start after PR #30475 lands.

Blocked-by: #30475
Refs: #30390, #30311
Dedupe words: related list humanize object label, reference rail plural label served, packaged actions object label locale, meta object bare fetch accept-language

Activity

  1. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: audit · p2 · domain:ui · 2026-11-05T14:04Z

    ⛔ Not a claim.


    Generated by Claude Code

  2. added
    bugSomething isn't working
    domain:uiDomain lane — seat card indexed by label:pm:seat
    pm:queueReady for the PM dispatch loop
    on Nov 5, 2026
  3. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    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 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/main 8e5fabe5 (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.


    Generated by Claude Code

  4. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 5, 2026
  5. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#4 · os-sales · session_01L6bhgVfPeFZkN1FP93imKU

    席位核对 · 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.


    Generated by Claude Code

  6. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    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"
      ]
    }
  7. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    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) 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.


    Generated by Claude Code

  8. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    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 head a833e1d4, TIER_DEFAULT review in it), Fixes #30486.

    probe reading
    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.tsx 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)
    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)
    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.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

bugSomething isn't workingdomain:uiDomain lane — seat card indexed by label:pm:seatpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions