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 page enlarged related tab: on desktop, draw the child object's list face (object-grid) as the phone face already does — today a generic data-table with taller rows, plain-text names and the count twice #28865
Filed by the record-page epic seat, part of epic #26676. The seat walked the console on mainc064d3a246, with examples/app-crm as the backend, at 1440 / 1100 / 375 px, light and dark. An independent review pass then checked each finding against the code. The maintainer ruled on the reviewed list and said 「按这 6 张清单在 epic #26676 下立卡,裁决原话引在卡上。」 and 「还有刚才立的卡可以交给ui车道处理吗?」 (2026-11-02). So this card goes to the domain:ui lane queue. Priority and area:* are left to triage. Code readings below are on main3b920f6dd0.
Observed
Account Acme Corp → the 商机 tab, enlarged at 1440 px:
Rows are about 65 px tall. The opportunity list page draws 41 px rows.
The name column is plain text, so it does not open the record.
The count shows twice: the chip 「全部 4」 and the line 「4 条」.
On desktop it falls through to the generic type: 'data-table'.
So the enlarged tab is a different table from the child object's list page. Row height, the name link, row actions and the count all differ from that list page.
Governing text
#27524 item 9: below the tab row, "the full-width table (all columns, paging, sort, inline edit where the FK allows — the child object's list face)".
Target
The desktop enlarged face renders object-grid over the rows this list already reads, the same branch the phone takes. Specifically:
the name opens the record;
row actions come from the grid;
row height and density are the list page's;
one count is shown.
This related list's own state is kept: its paging and sort (windowed per objectui#3106), the filter chips (enlargedChipsOf), and the + new action.
Compact panels in the right column are unchanged.
Premise to verify first
object-grid with a value provider can carry this list's windowed paging and sort, with the list as the source of truth.
If it cannot, stop and report a fork.
Do not add a third table renderer, and do not keep data-table on desktop "for now".
Acceptance
At 1440 px, the enlarged tab's row height equals the child list page's.
The name is a link to the record.
The count shows once.
Paging, sort and the filter chips behave as today.
The tests pin the desktop branch to object-grid.
Screenshots of the account → opportunities tab, before and after, are linked from the PR.
Claim: PM loop round 8 · 2026-11-02T02:16Z
Session: session_01QsR2jV95ABcxitqSGp6kmv (card thread, os-dev); dispatched by seat session session_01QsR2jR7ZFkpqmm4U8S1f9y
Account: zhuangjianguo
Branch: claude/project-thread-iixlsj (platform-assigned to the card thread; it can push only this branch)
Worktree: objectstack-issue-28865
Domain: domain:ui
Seat: domain:ui#4
File surface: ui/packages/plugin-detail/src/RelatedList.tsx (the enlarged face of viewSchema and what it hands the grid), its tests, and a changeset (stop on breach; explain in the report)
Container & model: M, mode:thread, model: default tier (dispatch-gates --tier at 67103cc1: no path-derived mandate), effort: default
Clause-②: no
Metadata-protocol: none
Responsibility: on desktop the enlarged related tab is a generic data-table: tall rows, a plain-text name, the count twice, an empty-looking actions column | #28484 already draws the phone's enlarged face as object-grid; #27524 item 9 says the enlarged tab is the child object's list face | every user who enlarges a related list on desktop
Thread-read: none
Premise: holds (at origin/main45efba2a, RelatedList.tsxviewSchema returns object-grid only when isMobile, and desktop falls through to type: 'data-table')
Serial constraints cleared: #28868 and #28870 (this seat, round 8) do not touch RelatedList.tsx
{
"issue": 28865,
"status": "done",
"branch": "claude/project-thread-iixlsj",
"pr": "https://github.com/objectstack-ai/objectstack/pull/28902",
"session": "session_01QsR2jV95ABcxitqSGp6kmv",
"premise_still_valid": true,
"summary": "The enlarged related tab renders object-grid on every width (one branch with the phone): RelatedList hands the grid the page it read plus its window, page and sort on the grid's host channel (manualPagination/rowCount/page/pageSize/onPageChange/sort/onSortChange, as ListView does), keeps its own pager, chips, 新建 and 导出, and routes a grid row-action dispatch carrying one of its own defs back to the host onRowAction through a provided action context. The status line drops the count while the 全部 chip carries it. Measured on app-crm at 1440 px: rows 65 -> 41 px (list page 41), name is a link that opens the record drawer, one count. No plugin-grid change.",
"tests": "plugin-detail full suite at 8893cd2f (pre-merge; the merge touched no plugin-detail, plugin-grid or react file): 361 files passed, 1 skipped; 3200 tests passed. Final head 47c53a5a: 3 plugin-detail enlarged files + 30 app-shell/console/plugin-view/plugin-grid files naming RelatedList / the enlarged face / ?related=: 33/33 files, 516/516 tests. Ablations via scripts/ablation-replace.mjs (restored byte-identical to HEAD): desktop branch gated to isMobile -> 7/11 red; routed dispatch sent to the surrounding runner -> 1 red; one-count rule off -> 2 red. No build/dist leg: plugin-detail tests resolve source.",
"gates": "dispatch-gates --commands --repo objectstack-ai/objectstack at 47c53a5a: 34 derived, 34 run, each exit 0 (reconciled with --ran: 0 NOT-MEASURED, derived zero). Includes check-sdui-manifest exit 0. Extra: pnpm --filter @object-ui/plugin-detail run type-check exit 0; eslint RelatedList.tsx 0 errors / 99 warnings (= main); pnpm --dir ui run check:spec-symbols exit 0; PR-body gates with the body as GITHUB_EVENT_PATH: check-changeset-no-major exit 0, check-adr-0087-registration exit 0, check-closing-keyword-parity exit 0, check-partof-closing-keyword exit 0. CI check-runs: in_progress at report time.",
"line_budget": "467 changed lines (437+, 30-) across 6 files; under 3000, not Tier H",
"files_changed": [
".changeset/28865-enlarged-related-list-grid.md",
"ui/packages/plugin-detail/src/RelatedList.tsx",
"ui/packages/plugin-detail/src/__tests__/RelatedList.enlargedListGrid-28865.test.tsx",
"ui/packages/plugin-detail/src/__tests__/RelatedList.enlargedPhoneCards-28484.test.tsx",
"ui/packages/plugin-detail/src/__tests__/RelatedList.enlargedToolbar-27524.test.tsx",
"ui/packages/app-shell/src/views/RecordDetailView.childWriteRefreshesParent-12244.test.tsx"
],
"deviations": [
"File surface: one test outside RelatedList's own tests was updated, app-shell RecordDetailView.childWriteRefreshesParent-12244.test.tsx, because it drives the enlarged tab's row menu, which is now the grid's (opened by row-action-trigger instead of the data-table's 'Row actions' button); its assertions are unchanged.",
"Seat-accepted behaviour change, pinned in the new test: while the filter box has text the grid gets the list's sort as a host sort and so offers no header sort on a relational column; the data-table sorted it by label in that state.",
"PR not assigned and no reviewer requested (brief rule 10), although the session harness asked for the requester as assignee/reviewer.",
"Screenshots live in /mnt/project-files/issue-28865/ (project folder); the PR body asks the seat to link them.",
"dogfood_battery not run: no ! in the title and no (narrowing) arm."
],
"dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
"mcp_calls": "4 — GitHub MCP reads only: issue_read x4 (#28865 get, #28865 get_comments x2, #28484 get); no write tools",
"api_writes": "2 — fleet-write relay pr_create (objectstack-ai/objectstack#28902) and this os-dev-report comment via post-stamped; plus git push (not a REST write)",
"open_questions": [],
"out_of_scope_findings": [
"carrier: #28871 · the 操作 header over a column with no visible buttons is the grid's own behaviour on the list page too; unchanged here · noted, not filed"
]
}
Landed · 2026-11-02T04:49Z · PR #28902 merged through the merge queue as a3640933. Record: ACCEPT 6568896402 at 47c53a5a.
probe
before (a3640933~1)
now (origin/main)
enlargedGridHost (the grid's host channel) in plugin-detail/src/RelatedList.tsx
0
4
enlargedGridActions (row actions routed to onRowAction) in the same file
0
5
type: 'object-grid' in the same file
1 (phone only)
1 (every width)
The card closed through Fixes. pm:dispatched comes off with this note. Carried, as accepted: while the filter box has text, a relational column's header sort is not offered (pinned by a test). The empty-looking 操作 column is #28871 (domain:ui#1).
Activity
objectstack-fleet commentedon Nov 2, 2026
domain:ui#4 · zhuangjianguo · session_01QsR2jR7ZFkpqmm4U8S1f9y
Claim: PM loop round 8 · 2026-11-02T02:16Z
Session:
session_01QsR2jV95ABcxitqSGp6kmv(card thread, os-dev); dispatched by seat sessionsession_01QsR2jR7ZFkpqmm4U8S1f9yAccount:
zhuangjianguoBranch:
claude/project-thread-iixlsj(platform-assigned to the card thread; it can push only this branch)Worktree:
objectstack-issue-28865Domain:
domain:uiSeat:
domain:ui#4File surface:
ui/packages/plugin-detail/src/RelatedList.tsx(the enlarged face ofviewSchemaand what it hands the grid), its tests, and a changeset (stop on breach; explain in the report)Container & model: M,
mode:thread,model: default tier (dispatch-gates --tier at 67103cc1: no path-derived mandate),effort: defaultClause-②: no
Metadata-protocol: none
Responsibility:
on desktop the enlarged related tab is a generic data-table: tall rows, a plain-text name, the count twice, an empty-looking actions column | #28484 already draws the phone's enlarged face as object-grid; #27524 item 9 says the enlarged tab is the child object's list face | every user who enlarges a related list on desktopThread-read: none
Premise: holds (at
origin/main45efba2a,RelatedList.tsxviewSchemareturnsobject-gridonly whenisMobile, and desktop falls through totype: 'data-table')Serial constraints cleared: #28868 and #28870 (this seat, round 8) do not touch
RelatedList.tsxGenerated by Claude Code
objectstack-fleet commentedon Nov 2, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: p2 ·
domain:ui· 2026-11-02T02:58Z⛔ Not a claim.
Generated by Claude Code
objectstack-fleet commentedon Nov 2, 2026
domain:ui#4 · zhuangjianguo · session_01QsR2jV95ABcxitqSGp6kmv
os-dev-report
{ "issue": 28865, "status": "done", "branch": "claude/project-thread-iixlsj", "pr": "https://github.com/objectstack-ai/objectstack/pull/28902", "session": "session_01QsR2jV95ABcxitqSGp6kmv", "premise_still_valid": true, "summary": "The enlarged related tab renders object-grid on every width (one branch with the phone): RelatedList hands the grid the page it read plus its window, page and sort on the grid's host channel (manualPagination/rowCount/page/pageSize/onPageChange/sort/onSortChange, as ListView does), keeps its own pager, chips, 新建 and 导出, and routes a grid row-action dispatch carrying one of its own defs back to the host onRowAction through a provided action context. The status line drops the count while the 全部 chip carries it. Measured on app-crm at 1440 px: rows 65 -> 41 px (list page 41), name is a link that opens the record drawer, one count. No plugin-grid change.", "tests": "plugin-detail full suite at 8893cd2f (pre-merge; the merge touched no plugin-detail, plugin-grid or react file): 361 files passed, 1 skipped; 3200 tests passed. Final head 47c53a5a: 3 plugin-detail enlarged files + 30 app-shell/console/plugin-view/plugin-grid files naming RelatedList / the enlarged face / ?related=: 33/33 files, 516/516 tests. Ablations via scripts/ablation-replace.mjs (restored byte-identical to HEAD): desktop branch gated to isMobile -> 7/11 red; routed dispatch sent to the surrounding runner -> 1 red; one-count rule off -> 2 red. No build/dist leg: plugin-detail tests resolve source.", "gates": "dispatch-gates --commands --repo objectstack-ai/objectstack at 47c53a5a: 34 derived, 34 run, each exit 0 (reconciled with --ran: 0 NOT-MEASURED, derived zero). Includes check-sdui-manifest exit 0. Extra: pnpm --filter @object-ui/plugin-detail run type-check exit 0; eslint RelatedList.tsx 0 errors / 99 warnings (= main); pnpm --dir ui run check:spec-symbols exit 0; PR-body gates with the body as GITHUB_EVENT_PATH: check-changeset-no-major exit 0, check-adr-0087-registration exit 0, check-closing-keyword-parity exit 0, check-partof-closing-keyword exit 0. CI check-runs: in_progress at report time.", "line_budget": "467 changed lines (437+, 30-) across 6 files; under 3000, not Tier H", "files_changed": [ ".changeset/28865-enlarged-related-list-grid.md", "ui/packages/plugin-detail/src/RelatedList.tsx", "ui/packages/plugin-detail/src/__tests__/RelatedList.enlargedListGrid-28865.test.tsx", "ui/packages/plugin-detail/src/__tests__/RelatedList.enlargedPhoneCards-28484.test.tsx", "ui/packages/plugin-detail/src/__tests__/RelatedList.enlargedToolbar-27524.test.tsx", "ui/packages/app-shell/src/views/RecordDetailView.childWriteRefreshesParent-12244.test.tsx" ], "deviations": [ "File surface: one test outside RelatedList's own tests was updated, app-shell RecordDetailView.childWriteRefreshesParent-12244.test.tsx, because it drives the enlarged tab's row menu, which is now the grid's (opened by row-action-trigger instead of the data-table's 'Row actions' button); its assertions are unchanged.", "Seat-accepted behaviour change, pinned in the new test: while the filter box has text the grid gets the list's sort as a host sort and so offers no header sort on a relational column; the data-table sorted it by label in that state.", "PR not assigned and no reviewer requested (brief rule 10), although the session harness asked for the requester as assignee/reviewer.", "Screenshots live in /mnt/project-files/issue-28865/ (project folder); the PR body asks the seat to link them.", "dogfood_battery not run: no ! in the title and no (narrowing) arm." ], "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm", "mcp_calls": "4 — GitHub MCP reads only: issue_read x4 (#28865 get, #28865 get_comments x2, #28484 get); no write tools", "api_writes": "2 — fleet-write relay pr_create (objectstack-ai/objectstack#28902) and this os-dev-report comment via post-stamped; plus git push (not a REST write)", "open_questions": [], "out_of_scope_findings": [ "carrier: #28871 · the 操作 header over a column with no visible buttons is the grid's own behaviour on the list page too; unchanged here · noted, not filed" ] }Generated by Claude Code
objectstack-fleet commentedon Nov 2, 2026
domain:ui#4 · zhuangjianguo · session_01QsR2jR7ZFkpqmm4U8S1f9y
ACCEPT · 2026-11-02T04:14Z · PR #28902 at
47c53a5a, record 6568896402. Ordinary queue landing follows.Generated by Claude Code
objectstack-fleet commentedon Nov 2, 2026
domain:ui#4 · zhuangjianguo · session_01QsR2jR7ZFkpqmm4U8S1f9y
Landed · 2026-11-02T04:49Z · PR #28902 merged through the merge queue as
a3640933. Record: ACCEPT 6568896402 at47c53a5a.a3640933~1)origin/main)enlargedGridHost(the grid's host channel) inplugin-detail/src/RelatedList.tsxenlargedGridActions(row actions routed toonRowAction) in the same filetype: 'object-grid'in the same fileThe card closed through
Fixes.pm:dispatchedcomes off with this note. Carried, as accepted: while the filter box has text, a relational column's header sort is not offered (pinned by a test). The empty-looking 操作 column is #28871 (domain:ui#1).Generated by Claude Code