Repository navigation
Record page v4: same-shaped related panels with no collapse, a persistent tab row under the header (the enlarged state is the active tab), Activity as the first panel and a tab, one top bar on every face, tiers by container width #27524
Description
epic:#26676#1 · zhuangjianguo · session_cdb7a717def74e719988f089fbaa18ff
Part of the record-page epic #26676 — the v4 record page, final design (the maintainer, 2026-10-29: 「设计定稿:按画布 60 重写 #27524 / #27545 的 Target 并回队列」). Design boards: evidence branch claude/record-page-v2-evidence-20261027b @ a7825499aa, folder docs/design/record-page-v2-2026-10-27/v4/ — RecordPageV4Panels.dc.html (lead, 1440 page, arrived from the list ↗), RecordPageV4TwoCol.dc.html (lead, 1200), RecordPageV4Product.dc.html (product, no list trail), RecordPageV4Enlarged.dc.html (the 任务 tab active on the page), RecordDrawerV4Peek.dc.html (contact in the default split pane, 720), RecordDrawerV4Max.dc.html (the pane maximized), RecordDrawerV4Enlarged.dc.html (the 任务 tab active inside the pane), RecordMobile.dc.html (390), notes.md n41–n51 (n50 = the tab row, n51 = the HotCRM audit). Read with git show a7825499aa:<path>; never merge that branch. Sibling card #27545 owns the split / overlay / maximize mechanics; this card owns the page's anatomy. The boards were audited against HotCRM's declared metadata (highlightFields, inbound lookups, fieldGroups, page actions, view columns) — build to the metadata, the boards only illustrate it.
Source (main 273137d227, after PR #27310 / #27473)
- Related cards carry a title, count, and three always-visible icon buttons (+ ⤢ ⋯); collapse, hide and keyboard move live in the ⋯ menu; drag has no hover affordance. Ten cards on a HotCRM contact, four of them with 0 rows, each taking a full card.
- The header action row ends with a segmented 「时间线 | 关联」 text control; a crumb row above the header carries ‹ back and ↑ ↓.
- Three tiers: three columns (details | resident timeline | related) above 1120, two columns with a 「相关 N」 rail toggle above 760, a tabbed tier (详情 / 时间线 / 关联) below; the embedded record is always the tabbed tier.
- Enlarging a related list (
?related=) replaces the page body; the timeline is a resident column for worked objects (recordTimelineDefaultReason, console: one workspace-preference module (record open mode, drawer width, timeline / related column toggles) read per user × object, with a shared panel-toggle toolbar on the record page — defaults derived from the object, never metadata #27052).
Target (maintainer rulings of 2026-10-29, verbatim where quoted; not re-decidable here)
- Panel header. Title, then the count chip. Clicking the header row (or the chip) switches to that panel's tab (item 8); on hover the title end shows ›, the tooltip reads 「查看全部 N 条」. On hover the RIGHT end shows ⠿ (drag to reorder with a drop line; focused, ⌥↑ / ⌥↓), + (new) and ⋯ holding 隐藏 only. No collapse chevron, no collapse, no ⤢ (「右侧关联区域的折叠也不需要了吧」— ruled yes; the tab is the enlarged face). Nothing is reserved on the left when not hovered.
- Empty panels (0 rows) fold into one line 「还有 N 个空关联 · 名字 · … · 展开」; non-empty panels keep their order.
- Column foot 「已隐藏 N 张 · 显示 · 恢复默认顺序」 (restores order and hidden).
- The right-column switch ⊟ (「右栏」,
⌘⇧,) lives in the top bar (item 7), drawn only when the face's tier has a right column; the segmented text control goes. - 动态 (was 时间线): a panel and a tab, never a column. The merged stream (comments, activity, history — console record page v3: frameless detail sections, one merged timeline (discussion + activity + field changes), compact related cards, header 1 primary + 2 secondary + ⋯ — the synthesized default page, drawn from the object's roles; the dead BuildPageOptions hints go #27055's merger) is the FIRST panel of the right column: a one-line composer, the newest 3 entries (5 at ≥ 1120), 「查看全部 N 条 →」 which opens the 动态 tab. The 动态 tab is the full stream with the filter chips 全部 · 活动 · 讨论 · 变更 and paging, URL
?related=timeline. The resident timeline column, the ⊞ / ⊟ promotion andrecordTimelineDefaultReasonretire (「宽屏时间线放中间不需要了吧」— ruled yes). Naming: 「动态」 in zh, 「Activity」 in en, across the ten i18n packs;record.timeline.*keys keep their ids, their values change. - Tiers — one rule by the container's own width. ≥ 760 px: details | right column (320 px); ≥ 1120 px: the same, with the details field grid at 3 columns, the right column 380 px and the 动态 panel showing 5. < 760 px (split pane at 720, phone): ONE column — details sections, then the right column's panels in their order; no tab tier (「同意」 to the stack). The three-column tier, the tabbed tier and the 「相关 N」 rail retire. The embedded record (split pane, overlay drawer, maximized) and the phone use the same rule.
- One top bar on every face (40 px, above the record header; frame controls only). Left: breadcrumb 「对象 › 记录名」 — clicking the object name returns to the list (in the drawer one level down: 「← 路径」 as console record drawer v2: the bar is ↑ ↓ · ⤢ · ✕ (no object name, no counter); a related row or a lookup opens its record in place with a trail, ← / Esc go back one level; ⤢ carries the trail into the page; on the record page a related row opens a drawer over the page #26679 drew). Right, fixed order, each drawn only when it applies: the counter 「3 / 21」 + ↓ ↑ (only with a list context — the pane always, the page only when it arrived with a
?from=list trail; the counter's tooltip names the scope: the view's name, or the group when the list was grouped / a kanban column); ⊟ (item 4); ⤢ / ⤡ (the pane's maximize / restore, Record drawer v4: a bounded peek over the list — md cap instead of the field-count bucket, no dim overlay, the list stays readable and clickable, ⤢ maximizes in place at the same URL; the full page is reached only from the row ↗ and the header ⋯ #27545; on the page ⤡ 「收为抽屉」 only for readers who arrived through the row ↗); ✕ (pane faces only; always closes the whole path; never on the page). The header action row holds business actions only (1 primary + 2 secondary + ⋯, in the page's declared order). The crumb row and the small ‹ line above the title go. - A persistent tab row at the bottom edge of the header block, on every face: 「概览」 then one tab per panel — 动态 first, then the related panels in the arrangement's order — each with its count. The visible count is COMPUTED from the row's container width (ResizeObserver; recomputed on resize, sidebar collapse, pane drag): as many as fit, the rest in a 「+N ▾」 dropdown that lists them with counts; the active tab is always visible (it swaps into the last visible slot); 概览 always visible plus at least one more. Hidden panels' tabs sit at the end of the dropdown. Order and visibility follow
record.related.arrangement. (「关联多他不是也折叠到下拉了吗」; 「显示几个相关表 tab 应该根据实际的屏幕宽度计算吧」.) - The enlarged state is the active tab. Top bar and record header unchanged; below the tab row the full-width table (all columns, paging, sort, inline edit where the FK allows — the child object's list face) fills the remaining height; URL
?related=object.field; Esc or 概览 returns. Not a modal, not a drill-down level, no path in the top bar, no compacted header. Inside the pane it fills the pane body the same way; maximizing the pane widens it in place. - Stored arrangement
record.related.arrangement={ v, order, hidden, basedOn, seen }—collapsedis removed with no compatibility read (startup posture: no staged retirement). No metadata key is added. - Compact row's first column skips the FK that points back at this record (a product's line items name the opportunity, not the product). Unchanged from the earlier ruling.
- Highlights are the object's declared
highlightFieldsminus the name field (the title), max 6 — the boards show HotCRM's declared sets (lead: 公司 · 邮箱 · 线索状态 · 线索负责人; contact: 邮箱 · 客户 · 电话; product: 产品编号 · 产品名称 · 类别 · 启用). The contact object has no status field; nothing invents one.
File surface
ui/packages/plugin-detail/src/RelatedCardStack.tsx, RecordPageColumns.tsx, synth/recordPageColumns.ts, synth/relatedArrangement.ts, useRelatedArrangement.ts, RelatedListEmptyFold.tsx, synth/recordTimelineStream.ts (the promotion retires), ArrangedRelatedTab.tsx (retires), a new tab-row component beside them, ui/packages/components/src/custom/panel-toggles.tsx (retires or reduces to the one ⊟ icon) + renderers/layout/containers.tsx (the top-bar slot), ui/packages/app-shell/src/views/RecordDetailView.tsx, ui/packages/app-shell/src/views/recordDrawerStack.tsx (tier by container width), i18n in all ten packs, tests beside, changeset; ⛔ packages/spec/**; ⛔ the split / overlay / maximize mechanics (#27545). Serial-after #27056 (ui seat 1, branch claude/project-thread-g0nswr): its file surface overlaps this one (RelatedCardStack, RecordPageColumns, synth/recordPageColumns, useRelatedArrangement, RelatedListEmptyFold, recordDrawerStack) — claim after its PR is merged, or branch from it and say so.
Acceptance
- Tests per target item: header anatomy (no chevron, header click = tab, hover ⠿ + ⋯); keyboard reorder on the handle; empty fold line; foot; ⊟ only when a right column exists; 动态 as panel + tab, no promotion; the tier rule at 1440 / 1200 / 720 / 390 (the stack has no tab tier); the top bar's left and right ends per face; the tab row's visible count at three widths with the active tab always visible; the enlarged state keeps the header; the arrangement shape without
collapsed; the compact row's first column; highlights = declared fields minus the name. - Screenshots on HotCRM against the boards — lead at 1440 (from the list ↗, with the trail) and 1200; contact in the split pane at 720, maximized, and with the 任务 tab active in the pane and on the page; product at 1440; a 390 phone — on a never-merged evidence branch, linked from the PR body.
- The epic seat verifies the PR in the console preview against the boards before ACCEPT (maintainer: 「车队开发完后你审核效果」).
- console record page: one page at two widths — three resident columns (details | timeline | related) at 1280 px and up, two columns with a collapsible related rail from 1024 px, today's tabs below that and in the drawer #26678 / console: one workspace-preference module (record open mode, drawer width, timeline / related column toggles) read per user × object, with a shared panel-toggle toolbar on the record page — defaults derived from the object, never metadata #27052 / console record page v3: frameless detail sections, one merged timeline (discussion + activity + field changes), compact related cards, header 1 primary + 2 secondary + ⋯ — the synthesized default page, drawn from the object's roles; the dead BuildPageOptions hints go #27055 / fix(plugin-detail,app-shell,components): record page round 2 — related OFF draws no column or rail, one segmented panel control in the header row, three columns in a 1440 window with the sidebar #27473 / console record drawer v2: the bar is ↑ ↓ · ⤢ · ✕ (no object name, no counter); a related row or a lookup opens its record in place with a trail, ← / Esc go back one level; ⤢ carries the trail into the page; on the record page a related row opens a drawer over the page #26679 pins updated to the new anatomy, not deleted.
Rewritten by the epic PM session session_cdb7a717-def7-4e71-9988-f089fbaa18ff on 2026-10-29 after the maintainer's 定稿 on canvas version 60; the earlier Target of this card (v4 panels, 2026-10-29 morning) is superseded in full.
Activity
[-]Record page v4: the related column becomes a stack of same-shaped panels — chevron beside the title, hover-only handle and actions on the right, no ⋯ menu, empty panels folded, the timeline as a panel that can be promoted to a column, one right-panel icon in the header, no crumb row, the drawer sized by its own width[/-][+]Record page v4: the related column becomes a stack of same-shaped panels — chevron beside the title, hover-only handle and actions on the right (⋯ holds hide only), empty panels folded, the timeline as a panel that can be promoted to a column, one right-panel icon in the header, no crumb row, the drawer sized by its own width[/+]objectstack-fleet commentedon Oct 29, 2026
epic:#26676#1 · zhuangjianguo · session_cdb7a717def74e719988f089fbaa18ff
Held by the epic PM · 2026-10-29T13:19Z ·
pm:queue→pm:on-hold(one replace). The maintainer, 2026-10-29, verbatim: 「现在设计还没确定,你的 issue 不要被车道认领了」 — the v4 record-page design is still being revised on the design boards (evidence branchclaude/record-page-v2-evidence-20261027b, folderdocs/design/record-page-v2-2026-10-27/v4/), and the Target items on this card will be rewritten once it settles. ⛔ Not claimable while held.Restart-when: the maintainer confirms the final v4 boards in the epic PM session and the seat rewrites this card's Target to match; the seat then flips
pm:on-hold→pm:queuewith a comment naming the evidence commit. Restart-touch: none (this is a design decision, not an upstream PR).objectstack-fleet commentedon Oct 29, 2026
epic:#26676#1 · zhuangjianguo · session_cdb7a717def74e719988f089fbaa18ff
Back to the queue · 2026-10-29T14:19Z ·
pm:on-hold→pm:queue(one replace). TheRestart-when:of the hold comment is met: the maintainer confirmed the final v4 boards (design canvas version 60; evidence branchclaude/record-page-v2-evidence-20261027b@a7825499aa) and ruled, verbatim: 「设计定稿:按画布 60 重写 #27524 / #27545 的 Target 并回队列」 and 「这几张界面调整卡设置为 p1,车队开发完后你审核效果」. The body above is rewritten in full against canvas 60 (the superseded Target is gone, not struck through); the epic seat verifies the PR in the console preview before ACCEPT. Priority staysp1.[-]Record page v4: the related column becomes a stack of same-shaped panels — chevron beside the title, hover-only handle and actions on the right (⋯ holds hide only), empty panels folded, the timeline as a panel that can be promoted to a column, one right-panel icon in the header, no crumb row, the drawer sized by its own width[/-][+]Record page v4: same-shaped related panels with no collapse, a persistent tab row under the header (the enlarged state is the active tab), Activity as the first panel and a tab, one top bar on every face, tiers by container width[/+]objectstack-fleet commentedon Oct 30, 2026
epic:#26676#1 · zhuangjianguo · session_cdb7a717def74e719988f089fbaa18ff
Retitled (the maintainer, 2026-10-30: 「把 #27524 的标题改成与画布 60 正文一致」). The old title still named the pre-定稿 anatomy — a collapse chevron, the timeline promotable to a column, no crumb row, the drawer sized by its own width — all four superseded by the Target below (canvas 60, evidence
a7825499aa). The body is unchanged; the title now says what the Target says. Previous title kept here for the record:16 remaining items
objectstack-fleet commentedon Oct 31, 2026
domain:ui#2 · os-tesla · session_01L9qibzGCEznLfiQm2T5icF
os-dev-report
Report of 2026-10-31 for PR #28394 (Part of #27524), head 572d6b1.
{ "issue": 27524, "status": "done", "branch": "claude/project-thread-hh88jx", "pr": "https://github.com/objectstack-ai/objectstack/pull/28394", "session": "session_01L9qibzGCEznLfiQm2T5icF (card thread, mode:thread)", "premise_still_valid": true, "summary": "PR ③ of four: Target 8 and 9. A persistent tab row closes the record header on every face (概览, 动态, then the related panels in record.related.arrangement order, each with its count); how many show is computed from the row's own width with a ResizeObserver (pure rule layoutRecordTabRow), the rest fold into 「+N ▾」 with counts and the hidden panels' tabs at its end, and the active tab is always on the row, in the last slot when it would fold. The enlarged face is the active tab: a role=tabpanel under the row with no back line or title, the header untouched, ?related=object.field / ?related=timeline, Esc or 概览 returns; leaving 概览 pushes one history entry and tab-to-tab replaces it. ArrangedRelatedTab and detail.relatedEnlargedBack retire (Clause-② measured yes (narrowing), so the title carries !).", "tests": "New: synth/__tests__/recordTabRow-27524 (6), __tests__/RecordTabRow-27524 (7), __tests__/RecordPageColumns.tabRow-27524 (10), app-shell RecordDetailView.recordTabRowUrl-27524 (3, real browser history). Rewritten: recordPageTiers-26678 (tablist = the tab row), RelatedCardStack-27055, enlargedEscapeInPane-27524, RelatedPanel.header-27524 (retired full-face case removed with the face). Under the lock: vitest run packages/plugin-detail packages/i18n + 226 git-grep-derived ui test files -> Test Files 672 passed | 1 skipped (673), Tests 6395 passed | 31 skipped (6426), VERDICT command-exit 0 (on 7a0555e2; 572d6b18fb only adds objectName to one pin, that file Tests 10 passed (10)). type-check of @object-ui/i18n, plugin-detail, app-shell: exit 0 each on 572d6b18fb. Ablations via scripts/ablation-replace.mjs, restore blob == HEAD each: A1 active-tab reservation removed -> 2 failed | 11 passed (13); A2 hidden panels dropped from count targets -> 1 failed | 9 passed (10); A3 openEnlargedRelated replace branch removed -> 2 failed | 1 passed (3).", "gates": "dispatch-gates --commands on 572d6b18fb: 66 commands (same list as on c1734bc8), each run with exit captured before any pipe, the three heavy ones under the lock: 66 x ':: exit 0' incl. node scripts/check-sdui-manifest.mjs; --ran reconcile '66 derived, 66 run, 0 NOT-MEASURED, 0 UNRUN'. Extra: pnpm --dir ui run check:i18n-drift exit 0; eslint on 31 ui ts/tsx files 0 errors. CI on 572d6b18fb: 59 check-runs, all success or skipped by path filter/opt-in (Test UI 16/16, Type Check UI, Lint UI, Live E2E UI, Build & E2E UI, Dogfood Regression Gate, Lint & Repo Gates, TypeScript Type Check, Check Changeset, PR-body guards).", "line_budget": "36 files, 1,816 changed lines (+1,478 / -338) vs merge base a878ff6c26; under the 3,000 human-merge line", "files_changed": [ ".changeset/27524-record-page-tab-row-i18n.md", ".changeset/27524-record-page-tab-row.md", "content/docs/ui/pages.mdx", "ui/packages/app-shell/src/views/RecordDetailView.recordPageTiers-26678.test.tsx", "ui/packages/app-shell/src/views/RecordDetailView.recordTabRowUrl-27524.test.tsx", "ui/packages/app-shell/src/views/RecordDetailView.tsx", "ui/packages/i18n/src/locales/ar.ts", "ui/packages/i18n/src/locales/de.ts", "ui/packages/i18n/src/locales/en.ts", "ui/packages/i18n/src/locales/es.ts", "ui/packages/i18n/src/locales/fr.ts", "ui/packages/i18n/src/locales/ja.ts", "ui/packages/i18n/src/locales/ko.ts", "ui/packages/i18n/src/locales/pt.ts", "ui/packages/i18n/src/locales/ru.ts", "ui/packages/i18n/src/locales/zh.ts", "ui/packages/plugin-detail/README.md", "ui/packages/plugin-detail/src/ArrangedRelatedTab.tsx", "ui/packages/plugin-detail/src/RecordPageColumns.tsx", "ui/packages/plugin-detail/src/RecordTabRow.tsx", "ui/packages/plugin-detail/src/RecordTimelinePanel.tsx", "ui/packages/plugin-detail/src/RelatedCardStack.tsx", "ui/packages/plugin-detail/src/RelatedList.tsx", "ui/packages/plugin-detail/src/__tests__/RecordPageColumns.enlargedEscapeInPane-27524.test.tsx", "ui/packages/plugin-detail/src/__tests__/RecordPageColumns.tabRow-27524.test.tsx", "ui/packages/plugin-detail/src/__tests__/RecordTabRow-27524.test.tsx", "ui/packages/plugin-detail/src/__tests__/RelatedCardStack-27055.test.tsx", "ui/packages/plugin-detail/src/__tests__/RelatedPanel.header-27524.test.tsx", "ui/packages/plugin-detail/src/index.tsx", "ui/packages/plugin-detail/src/recordTimelineStream.ts", "ui/packages/plugin-detail/src/renderers/record-activity.tsx", "ui/packages/plugin-detail/src/renderers/record-related-list.tsx", "ui/packages/plugin-detail/src/synth/__tests__/recordTabRow-27524.test.ts", "ui/packages/plugin-detail/src/synth/recordTabRow.ts", "ui/packages/plugin-detail/src/synth/relatedArrangement.ts", "ui/packages/plugin-detail/src/useRelatedArrangement.ts" ], "deviations": [ "Clause-② measured yes (narrowing) against the claim's 'no': ArrangedRelatedTab leaves the plugin-detail entry and detail.relatedEnlargedBack leaves TranslationKeys; title carries !, two changesets carry the adr-0087 not-required markers, full dogfood run.", "File surface beyond the order: RelatedList.tsx (dead arrangedFull path), renderers/record-related-list.tsx (retired scope branch), index.tsx (export), recordTimelineStream.ts + renderers/record-activity.tsx (动态 count for its tab), RelatedCardStack.tsx + RecordTimelinePanel.tsx (shared counts), plugin-detail README, content/docs/ui/pages.mdx. navigation-overlay.tsx, the top bar, recordDrawerStack.tsx and #27545 mechanics untouched.", "Record-open reads change: counts are now requested for every related panel, hidden ones and those behind ⊟ off included (same RelatedCountStore requests, deduplicated). No data-adapter change (does not overlap #28321).", "Tests of the retired ArrangedRelatedTab / arranged full face deleted with the component (RelatedCardStack-27055 describe block, one RelatedPanel.header-27524 case).", "Whole ui/ suite not run locally (app-shell alone is 1,379 files; a full run outlived an hour without output and was stopped); a git-grep-derived set ran instead and CI Test UI 16/16 is green.", "Screenshots on examples/app-crm, not HotCRM (as ① and ②); ten shots in /mnt/project-files/ui-seat-2/r2026-10-31/out/27524-pr3-shots/.", "Board differences left as found: the enlarged list keeps RelatedList's card header and 查看全部 foot where the v4 board draws a filter/新建/导出 toolbar over a full-height table; on a deep link to another tab the 动态 tab has no count until the stream is drawn." ], "dogfood_battery": "572d6b18fb · os-verify-lock: VERDICT command-exit 0 · Test Files 361 passed | 3 skipped (364) · Tests 2917 passed | 28 skipped (2945) · no failures", "mcp_calls": "reads only, 0 writes: mcp__github__issue_read (card read before the work), mcp__github__pull_request_read x3 (#28116 get, #28394 get, #28394 get_check_runs). No write tool.", "api_writes": "3 relay writes through scripts/pm/fleet-write/dispatch.mjs and post-stamped: pr_create #28394 (read-back identical, assignees none), issue_patch #28394 body (dogfood + CI lines, read-back identical), this os-dev-report comment on #27524", "open_questions": [], "out_of_scope_findings": [ "class: c · reach: named producer (v4 board RecordPageV4Enlarged) · the enlarged related face draws a toolbar (filter, 全部/我的/逾期, 新建, 导出) the related list does not have today · carrier: this PR's Acceptance notes · noted, not filed" ] }Generated by Claude Code
objectstack-fleet commentedon Oct 31, 2026
domain:ui#2 · os-tesla · session_01L9qibxgfM8p8t3fo6y9eFK
Claim amendment (same PR ③ claim 6540954535, same branch
claude/project-thread-hh88jx, PR #28394) · 2026-10-31T10:44Zno: theArrangedRelatedTabexport of@object-ui/plugin-detailand the i18n keydetail.relatedEnlargedBackare retired (the console was their only reader). The narrowing owes a contract review atCONTRACT_REVIEW_TIERover the diff outside the prose face; the PR carriesneeds:contract-review, and the title carries!.content/docs/ui/pages.mdx(4 lines) andui/packages/plugin-detail/README.md(prose). No live claim of seats 1, 3, 4 or 5 names either file.Skills-docs:line for the narrowing arm.objectstack-fleet commentedon Oct 31, 2026
domain:ui#2 · os-tesla · session_01L9qibxgfM8p8t3fo6y9eFK
Landed ③ of 4 · 2026-10-31T14:46Z
572d6b18(PASS 6542695839, preview gate + ACCEPT 6542710867), merge commitbf74607954origin/mainbf74607954(git merge-base --is-ancestor)Delivered: Target 8 (persistent tab row with counts, width-computed 「+N ▾」 overflow, active tab always on the row) and Target 9 (enlarged = the active tab,
?related=kept). Retired:ArrangedRelatedTabexport,detail.relatedEnlargedBackkey (Clause-②: yes (narrowing)).objectstack-fleet commentedon Oct 31, 2026
domain:ui#2 · os-tesla · session_01L9qibxgfM8p8t3fo6y9eFK
Release: ui seat 2 hands #27524 back to
pm:queue· 2026-10-31T14:48ZReason: the maintainer took the ui lane off shift (2026-10-31T09:43Z, 「UI 车道下班,开 server 车道」): no new dispatch; PRs ①–③ have landed (③ #28394 →
bf74607954, landing note 6544907712), ④ was never dispatched.Resume-from: none — ④ starts from
main; no branch carries ④ work.Remaining (④, carries
Fixes #27524): Target 7, the top bar, and ⊟ moving into it. Ride along with ④ (ruled at the ③ preview gate, ACCEPT 6542710867): (a) the enlarged related list still drawsRelatedList's card header/foot where the v4 board (a7825499aa) draws a toolbar — filter, 全部 / 我的 / 逾期, 新建, 导出 — over a full-height table; (b) 动态's tab count is absent on a deep link to another tab until the stream is drawn once.Neighbours: #27950 (object label in the list page header, ruled B) is in flight on
claude/project-thread-xn9w1tand stays clear of the record route's crumb.objectstack-fleet commentedon Oct 31, 2026
domain:ui#5 · os-sales · session_01L6bhgUhKx1XHzkoikGjRB4
Claim: PM loop round 5 · 2026-10-31T15:12Z — PR ④ (Target 7 and the ⊟ move of Target 4, plus the two ride-alongs ruled at the ③ preview gate)
Session:
session_01L6bhgUhKx1XHzkoikGjRB4(seat; implementation by a card thread,mode:thread, its session named in its first report)Account:
os-salesBranch: the card thread's harness-pinned branch (named in its first report; this claim is the identity record)
Worktree: the card thread's own container checkout
Domain:
domain:uiSeat:
domain:ui#5File surface: the top bar on every face:
ui/packages/components/src/custom/panel-toggles.tsx(reduces to the one ⊟ or retires),ui/packages/components/src/renderers/layout/containers.tsx(the top-bar slot),ui/packages/app-shell/src/views/RecordDetailView.tsx,ui/packages/app-shell/src/views/recordDrawerStack.tsx, the record header inui/packages/plugin-detail/**(crumb row and the small ‹ line go; header action row holds business actions only),ui/packages/components/src/custom/navigation-overlay.tsxonly where the pane face draws its ⤢ / ⤡ / ✕ into the bar (the split / overlay / maximize mechanics of #27545 stay as landed); ride-along (a) the enlarged related list draws the board's toolbar (filter, 全部 / 我的 / 逾期, 新建, 导出) over a full-height table instead ofRelatedList's card header/foot; ride-along (b) the 动态 tab count on a deep link to another tab; i18n in all ten packs; tests beside; root changeset; pins of #26678 / #27052 / #27055 / #27473 / #26679 updated, not deleted (stop on breach; explain in the report). ⛔packages/spec/**.Container & model: L,
mode:thread,model: TIER_DEFAULT(dispatch-gates --tier: no path-derived mandate, as for ① – ③),effort: xhigh(p1)Clause-②: no
Metadata-protocol: none
Responsibility: n/a — not a defect card
Thread-read: 6544927032
Premise: holds at
origin/main5da3a8ce: ③ PR #28394 landed asbf74607954(6544907712); release 6544927032 names ④ as never dispatched, Resume-from none.Clause-②: nois provisional: if an entry export of@object-ui/componentsor@object-ui/plugin-detailretires (e.g.panel-toggles), the card thread stops, the claim is amended toClause-②: yes (narrowing)and the seat runs the contract review at tier. Preview gate before ACCEPT per ruling 6520722066 (HotCRM shots against the v4 boards ata7825499aa, on a never-merged evidence branch). This PR carriesFixes #27524.Serial constraints cleared: no open PR (20 read) touches
plugin-detail/**,RecordDetailView.tsx,recordDrawerStack.tsx,panel-toggles.tsx,layout/containers.tsxornavigation-overlay.tsx; #27950 (in flight,claude/project-thread-xn9w1t) stays clear of the record route's crumb per the release; surface notice to seat 4 (#28286) sentGenerated by Claude Code
objectstack-fleet commentedon Oct 31, 2026
domain:ui#5 · os-sales · session_01L6bhgVP3twvBvDTwoLPU6J
os-dev-report
{ "issue": 27524, "status": "done", "branch": "claude/project-thread-orbrul", "pr": "https://github.com/objectstack-ai/objectstack/pull/28458", "head": "d94e010b0aabf5eec4dade70ce7fd30649ab6686", "session": "session_01L6bhgVP3twvBvDTwoLPU6J", "premise_still_valid": true, "summary": "PR 4 of 4 for #27524, cut from main after #28394. Target 7: one 40 px RecordTopBar (@object-ui/components) above the record header on the page, the split pane, the overlay drawer, the maximized pane and the phone; left is the crumb 'object > record name', right in fixed order the counter n / N with down/up, then the right-column switch, then maximize / collapse-to-drawer, then close, each drawn only where it applies; the crumb row above the header is gone. Target 4: the right-column switch leaves the header's action row for the bar (portalled into the pane's bar slot; a host's plain overlay keeps it at the header's end through PageHeaderTrailingContext). Ride-alongs ruled at PR 3's preview gate: (a) the enlarged related list draws the board toolbar (filter, All / Mine / Overdue chips where the child declares them, actions, New, Export CSV) plus a status line in place of the card head and foot; (b) Activity counts on a deep link to another tab through RecordTimelineCountProbe, which reads the feed the page already holds. Eight detail.* keys in all ten locale packs. PR body carries Fixes #27524.", "clause_2": "yes (widening) — corrects the claim's provisional 'no'. @object-ui/components gains RecordTopBar, RecordTopBarButton, useRecordStepKeys, RecordTopBarProps, RecordTopBarStepper; NavigationOverlay gains optional toggles and its stepper optional position / scope; @object-ui/i18n gains eight detail.* keys. No entry export of @object-ui/components or @object-ui/plugin-detail retires (PanelToggles and PageHeaderTrailingContext kept), so the brief's STOP condition did not fire.", "metadata_protocol": "none", "deviations": [ "The page counter is drawn for any page a list opened, not only the row's arrow: a list whose rows open as pages (HotCRM's lead list) now hands its shown rows in the page's from state (objectViewRecordNavigation.ts handleNavOverlayNavigate, recordDrawerStack.tsx readFromSiblings). The collapse-to-drawer control stays the row arrow's only, since such a list opens no pane.", "File surface beyond the claim: app-shell ObjectView.tsx, objectViewRecordNavigation.ts, objectViewRecordOverlay.tsx, recordDrawerContext.ts, urlParams.ts; components custom/record-top-bar.tsx + custom/index.ts in place of renderers/layout/containers.tsx (untouched; the bar is a frame component, not a layout slot); plugin-detail relatedListCompact.ts, renderers/record-activity.tsx, useDetailTranslation.ts. #27545's split / overlay / maximize mechanics are unchanged." ], "tests": "New: record-top-bar-27524 (6), RecordDetailView.topBar-27524 (7), objectViewRecordNavigation.listRows-27524 (3), RelatedList.enlargedToolbar-27524 (5), RecordPageColumns.tabRow-27524 (+3): 'Test Files 5 passed (5) / Tests 34 passed (34)'. Pins updated, not deleted: RecordDetailView.panelToggles-27052, recordDrawerStack-26679, recordDrawerStack.rootStepper-26679, RelatedCardStack-27055, RecordDetailView.pageHeaderTitleFls-10499, residue-namespaces-3546. Broad suite under the verify lock at 6c535caa83 (plugin-detail, components, i18n + 619 ui test files naming a changed module / test id / key): 'Test Files 4 failed | 1529 passed | 2 skipped (1535)', 'Tests 10 failed | 17140 passed | 67 skipped (17217)'; all ten reds were this change's (ar/fr/es/pt plural slots of detail.relatedRows, residue detail.add count 3 -> 4, FLS pin seeing the gated title in the crumb), fixed in d94e010b0a, the four files rerun 'Tests 107 passed (107)'. Type-check exit 0 for app-shell, components, plugin-detail (both tsconfigs, under the lock) and i18n at d94e010b0a. eslint on the 36 changed ts/tsx files: 0 errors. check:i18n-drift exit 0. Eleven ablations through scripts/ablation-replace.mjs, restore proven blob == HEAD, each red: bar not drawn (4 failed), pane toggles not portalled (1), page stepper withheld (1), from rows not read (1 failed | 6 passed), list not handing rows (2 failed | 1 passed), root crumb reverted (1), owner stack disabled (2), count probe not mounted (2), enlarged face off (4 failed | 1 passed), chip left out of the read (2 failed | 3 passed), enlarged context not provided (1 failed | 12 passed). HotCRM screenshots (14, zh-CN, against the v4 boards at a7825499aa) at evidence commit b0a817c91dcac099c993f1a9246198079159f5a6, removed in f06019ab23; facts.json records crumbRow false and a 40 px bar on every shot.", "gates": "dispatch-gates --commands derives 34 at 857d25f771 and at d94e010b0a; all 34 run at d94e010b0a with stdin from /dev/null, exit captured before any pipe, every one exit 0; --ran: '34 derived, 34 run, 0 NOT-MEASURED, 0 UNRUN'. One earlier red at 857d25f771 (pnpm --dir ui exec vitest run scripts/, check-doc-snippet-types on untouched READMEs) coincided with a turbo rebuild of @objectstack/spec dist; green on every run since ('4901 passed'). CI check-runs at report time: Auto Label success, Test Core success, Dogfood Regression Gate success; Test UI 1-16/16, Type Check UI, Lint UI, Build & E2E UI in_progress; core-only jobs skipped by path. merge-tree HEAD vs origin/main 776c1d875b clean.", "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm", "mcp_calls": "10 — mcp__github__issue_read x5, mcp__github__pull_request_read x4 (incl. get_check_runs), mcp__github__list_pull_requests x1; reads only, no write tool", "api_writes": "6 — git push of claude/project-thread-orbrul x4; pr_create via scripts/pm/fleet-write relay (request fw-20261031T175131Z-582622, run 41226553891, read-back 26744 bytes sent = stored, assignees none, reviewers none); this os-dev-report comment via post-stamped (POST /repos/objectstack-ai/objectstack/issues/27524/comments)", "open_questions": [], "out_of_scope_findings": [ "class: a · reach: named producer — plugin-list ListView reports its row sequence only for the paged, ungrouped grid (rowSequenceShown), so a grouped list or a kanban board hands the pane no sibling set: no counter, and Target 7's group-named tooltip cannot be drawn (HotCRM contact list grouped by account). Needs ListView to report grouped / lane rows with their group; outside this claim · follow-up for the seat to file", "class: c · reach: named producer — HotCRM pinned at published 18.2.0 has no POST /data/:object/:id/page, so the console's record page shows 'record not found' against it; HotCRM lead.view.ts declares form types split / drawer / modal that spec 18.3.0 retired (patched to simple in the rig clone only) · carrier: HotCRM repo, noted, not filed", "class: c · reach: named producer — HotCRM crm_task.due_date declares no dueLike, so its task tab shows no Overdue chip · noted, not filed", "class: c · observation, unverified on main — on the HotCRM account page and pane the Activity tab showed no count in the shots; not this PR's probe path (deep link / switch off), not reproduced on main · noted, not filed", "carrier: PR — pr_create sent no labels (os-dev.md asks for labels); the auto-labeler applied documentation, size/xl, tooling. The seat may relabel if the card wants others · noted" ] }Generated by Claude Code
objectstack-fleet commentedon Oct 31, 2026
domain:ui#5 · os-sales · session_01L6bhgUhKx1XHzkoikGjRB4
Landed ④ of 4 · 2026-10-31T18:30Z · PR #28458 (seat ACCEPT 6547248636 and TIER_DEFAULT contract review PASS 6547237425, pinned to
d94e010b; preview gate in the ACCEPT)55a1febca1completedby the PR'sFixesline;pm:dispatchedremoved in this landingAll four PRs of the v4 record page have landed (① – ③ by seat 2, ④ here). Follow-ups this seat owes from ④ (ACCEPT item 6), filed as their own cards: the record counter's group scope on grouped lists and kanban lanes; the
@object-ui/typesrelated-list filter mirror for the{ or }group (released from #28370). The account page's 动态 count seen missing in shot12is checked onmainbefore anything is filed.Generated by Claude Code