Skip to content

feat(app-shell): one top bar above the record header on every face, the enlarged related list draws a toolbar, and Activity counts on a deep link - #28458

Merged
objectstack-fleet[bot] merged 10 commits into
mainfrom
claude/project-thread-orbrul
Oct 31, 2026
Merged

objectstack-fleet[bot] merged 10 commits into
mainfrom
claude/project-thread-orbrul

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

domain:ui#5 · os-sales · session_01L6bhgVP3twvBvDTwoLPU6J

Requested by Sales · project thread

Fixes #27524

Clause-②: yes (widening: @object-ui/components gains RecordTopBar, RecordTopBarButton, useRecordStepKeys and the types RecordTopBarProps / RecordTopBarStepper; NavigationOverlay gains an optional toggles prop and its stepper an optional position and scope; @object-ui/i18n gains eight detail.* keys in all ten locales; no entry export retires and no accept set moves. The claim's provisional no is corrected here, measured on the diff.)
Metadata-protocol: none

维护者速读

  • 改了什么:记录在每一种呈现方式里(整页、分屏面板、覆盖抽屉、最大化、手机)都在记录头上方画一条 40 px 顶栏。左边是面包屑「对象 › 记录名」(点对象回列表;面板下一层仍是「← 路径」);右边按固定顺序只画适用的控件:计数「3 / 21」和 ↓ ↑、⊟、⤢ / ⤡、✕。原来记录头上方的面包屑行(‹ 来源、收为抽屉)删掉,⊟ 从记录头操作行移进顶栏。另带两项(③ 预览闸门裁定):放大的相关列表画看板工具栏(筛选、全部 / 我的 / 逾期、新建、导出)而不是卡片头尾;深链到别的标签时「动态」标签也显示条数。
  • 为什么改: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 Target 7 和 Target 4 的 ⊟ 部分(画布 60 定稿),四个串行 PR 的最后一个,带 Fixes #27524。
  • 风险与回滚:只动 ui 包(components、app-shell、plugin-detail、十个语言包),不碰 spec、不碰服务端。没有退役任何入口导出(PanelToggles、PageHeaderTrailingContext 都保留,宿主自己的普通覆盖层仍把 ⊟ 放在记录头末尾),所以是 widening。整页上的计数和 ↓ ↑ 只在从列表打开时出现(行的 ↗,或行本身就开整页的列表,比如 HotCRM 线索),用 replace 换页,不增历史;⤡ 只给 ↗ 打开的整页。回滚即 revert 本 PR。
  • 先看:ui/packages/components/src/custom/record-top-bar.tsx(顶栏和 j / k 归属);ui/packages/app-shell/src/views/RecordDetailView.tsx 的 pageLeading / pageBar;recordDrawerStack.tsx 的 useRecordPageReturn 和 RecordPaneBarToggles;ui/packages/plugin-detail/src/RelatedList.tsx 的 enlargedFace。
  • 两分钟验证:pnpm --dir ui exec vitest run packages/components/src/__tests__/record-top-bar-27524.test.tsx packages/app-shell/src/views/RecordDetailView.topBar-27524.test.tsx packages/plugin-detail/src/__tests__/RelatedList.enlargedToolbar-27524.test.tsx packages/plugin-detail/src/__tests__/RecordPageColumns.tabRow-27524.test.tsx packages/app-shell/src/views/objectViewRecordNavigation.listRows-27524.test.tsx,预期 5 个文件 34 个测试全绿。
  • 需要你做的:无,席位做预览闸门(HotCRM 截图对照 v4 画板)后落地。

What changes

Record page v4, Target 7 and the ⊟ half of Target 4, plus the two ride-alongs ruled at ③'s preview gate. PR ④ of the four serial PRs for #27524, cut from main after ③ (#28394, bf74607954).

The top bar (Target 7)

RecordTopBar (@object-ui/components, new custom/record-top-bar.tsx) is one 40 px row above the record header. The page, the split pane, the overlay drawer, the maximized pane and a phone all draw this one component.

⊟ in the top bar (Target 4)

The right-column switch (「右栏」, ⌘⇧,) leaves the header's action row.

  • On the page it is drawn in the page's top bar.
  • In the pane, the record portals it into the pane's own bar (RecordPaneBarToggles into the bar's data-record-pane-toggles slot).
  • It is drawn only where the face's tier has a right column, the rule ② already applied to PanelToggles.
  • A host's plain overlay without the console's pane (InterfaceListPage, ObjectDataPage) has no bar slot. It keeps ⊟ at the end of the header's action row through PageHeaderTrailingContext, so that export stays.

Ride-along (a): the enlarged related list draws the board toolbar

When a related list is the active tab, RecordPageColumns provides RelatedListEnlargedContext. RelatedList then draws:

  • A toolbar (role="toolbar") over the table, in place of the card header and the card foot. The toolbar holds:
    • the filter input;
    • the chips 全部 N / 我的 / 逾期;
    • the child object's toolbar actions;
    • 新建;
    • 导出.
  • A status line 「N 条 · 第 x / y 页」 between the toolbar and the table.
  • The table at the face's full height.

Each chip is drawn only where the child object declares what it says:

  • 我的 where the object has an owner_id column. It filters with { owner_id: '{current_user_id}' }.
  • 逾期 where a date / datetime field declares dueLike: true with no settledWhen. It filters with { field: { $lt: '{today}' } }. A settledWhen is CEL that no query can ask, so such a field gets no chip.
  • 全部 alone is no choice, so then no chip group is drawn.

A chip narrows the list's own read: it is merged beside the parent scope with mergeFilterNodes.

导出 downloads a CSV through dataSource.exportDownload. It sends the same parent, chip and list filter, the filter text as search, the shown columns and the order.

Ride-along (b): 动态's count on a deep link

RecordTimelineCountProbe (in record-activity.tsx) reads the feed the page already holds and reports its size to the tab row. The feed is the discussion context, the field-change context, and the node's types and showCompleted. The probe starts no read of its own. It is mounted only when the 动态 tab is not active and the stream is not drawn elsewhere: a deep link to another tab, or ⊟ off. Before ④, 动态 had no count there until the stream was drawn once (③'s noted gap).

i18n

Eight keys arrive in all ten packs, with each pack's plural forms: detail.recordOfScope, detail.relatedFilter, detail.relatedChips, detail.relatedChipAll, detail.relatedChipMine, detail.relatedChipOverdue, detail.relatedExport and detail.relatedRows.

File surface beyond the claim

  • app-shell:
    • ObjectView.tsx, objectViewRecordNavigation.ts and objectViewRecordOverlay.tsx: the view's label as the counter's scope, and the shown rows handed to every page the list opens.
    • recordDrawerContext.ts: the pane bar context.
    • urlParams.ts: one state-key constant.
  • components: custom/record-top-bar.tsx and its line in custom/index.ts, in place of renderers/layout/containers.tsx. The bar is a frame component, not a page-layout slot, so containers.tsx is untouched. panel-toggles.tsx is untouched too: ⊟ is still PanelToggles, drawn in a new place.
  • plugin-detail: RelatedList.tsx, relatedListCompact.ts, renderers/record-activity.tsx and useDetailTranslation.ts, for the two ride-alongs.

#27545's split / overlay / maximize mechanics are not changed. NavigationOverlay only draws its existing ⤢ / ⤡ / ✕ into the shared bar.

Tests

New:

  • components/src/__tests__/record-top-bar-27524.test.tsx (6):
    • the right end's fixed order;
    • the counter's text and its tooltip naming the list;
    • only what is handed is drawn;
    • the pair without a counter;
    • the step-key owner stack: a page steps with j / k but not the arrows, a pane over it takes the keys until it closes, and a pane with no set holds them without stepping the page;
    • NavigationOverlay drawing the shared bar.
  • app-shell/src/views/RecordDetailView.topBar-27524.test.tsx (7), a real RecordDetailView:
    • a direct page: the crumb, only ⊟, no crumb row;
    • a page from ↗: the counter 「2 / 3」 with its scope, ↓ to the sibling by replace, k back, ArrowUp ignored, ⤡ back to ?recordId= with the restore state;
    • a page a list opened as a page: 「1 / 3」 with its scope, no ⤡, j and ↑ step, and the next page keeps the same from state;
    • control: an origin without its rows draws no counter;
    • the object crumb back to the origin list;
    • a ?from= trail with ← and the ancestors;
    • the pane: ⊟ portalled into the pane's bar, the record's title reported to the crumb, one bar only, the scope tooltip.
  • app-shell/src/views/objectViewRecordNavigation.listRows-27524.test.tsx (3), the list's navigation hook:
    • a row that opens as a page hands the origin, the view's name and the shown rows;
    • control: a record the list does not show gets the origin alone;
    • the row's ↗ hands the rows both in the way back to the pane and in the origin.
  • plugin-detail/src/__tests__/RelatedList.enlargedToolbar-27524.test.tsx (5):
    • the toolbar with no card;
    • 我的 and 逾期 narrowing the read beside the parent;
    • a chip drawn only where the object declares it;
    • 导出 with the parent and the chip;
    • control: outside the active tab the card face stays.
  • plugin-detail/src/__tests__/RecordPageColumns.tabRow-27524.test.tsx (+3):
    • 动态's count on a deep link to another tab;
    • control: no count while the feed is loading or absent;
    • the count with ⊟ off.

Pins updated to the new anatomy, not deleted:

Eleven ablations (each through node scripts/ablation-replace.mjs, restore proven blob == HEAD)
  • The page's bar not drawn: RecordDetailView.topBar-27524, 4 failed.
  • The pane toggles not portalled: 1 failed.
  • The page stepper withheld: 1 failed.
  • The page's from rows not read (readFromSiblings): RecordDetailView.topBar-27524, 1 failed | 6 passed.
  • The list's navigation not handing its rows in from: objectViewRecordNavigation.listRows-27524, 2 failed | 1 passed.
  • The root crumb reverted to the bare path: 1 failed.
  • The step-key owner stack disabled (every host steps): record-top-bar-27524, 2 failed.
  • The count probe not mounted: RecordPageColumns.tabRow-27524, 2 failed.
  • The enlarged face off: RelatedList.enlargedToolbar-27524, 4 failed | 1 passed.
  • The chip left out of the read: RelatedList.enlargedToolbar-27524, 2 failed | 3 passed.
  • The enlarged context not provided by RecordPageColumns: RelatedCardStack-27055, 1 failed | 12 passed.

Acceptance notes

Screenshots on HotCRM against the v4 boards at a7825499aa, zh-CN. They are committed on this branch in b0a817c91d and removed again in the next commit, so they never reach main. The folder's README says how they were made, and facts.json records each shot's top bar as read from the DOM.

HotCRM runs on this branch's own server. The published 18.2.0 server has no POST /data/:object/:id/page, which the console's record page now reads, so it shows 「未找到记录」. Three of HotCRM's lead form views declare the form types that spec 18.3.0 retired; in the rig's clone only, they were set to simple.

Shot What the top bar shows Board
01-lead-1440-from-list.png Lead at 1440, opened from the lead list. HotCRM's lead list opens its rows as pages, so there is no ↗ there. The bar reads 「线索 › Mira Costa」 with 1 / 21, the tooltip 「全部线索 中第 1 条,共 21 条」, and ↓ ↑. There is no ⊟: the lead declares its own page layout, which has no right column. RecordPageV4Panels
02-lead-1440-after-step-down.png After ↓: 2 / 21, Kai Watanabe, the page replaced. RecordPageV4Panels
03-lead-1200-direct.png Lead at 1200, opened directly: the crumb only. RecordPageV4TwoCol
04-contact-split-720.png Contact in the split pane at 720: 「联系人 › John Smith」, ⤢, ✕. There is no counter because the contact list is grouped by account (see the first note below). There is no ⊟ because the 720 tier has no right column. RecordDrawerV4Peek
05-contact-maximized.png The pane maximized: ⊟, ⤡, ✕. RecordDrawerV4Max
06-contact-split-task-tab.png The pane with 任务 active, chosen from 「+5 ▾」. The toolbar holds the filter, 全部 1 / 我的, 新建 and 导出, with 「1 条」 under it. RecordDrawerV4Enlarged
07-contact-page-task-tab-deep-link.png, 07b-contact-page-task-tab-mine.png The contact page deep-linked to 任务: the same toolbar, and 动态 counts 2 although its stream is not drawn. RecordPageV4Enlarged
08-product-1440.png Product at 1440, opened directly: the crumb and ⊟. RecordPageV4Product
09-lead-phone-390.png, 09b-contact-phone-390.png A 390 phone: the crumb only. RecordMobile
10-crm_account-split-pane-counter.png, 11-crm_account-split-pane-after-step.png An account in the pane over the ungrouped account list: 3 / 9, then 4 / 9 after ↓, with ⤢ and ✕. RecordDrawerV4Peek
12-crm_account-page-from-arrow.png An account page opened by the row's ↗: 1 / 9, ↓ ↑, ⊟, ⤡ 「收为抽屉」. RecordPageV4Panels

No shot has the crumb row (crumbRow: false in every facts.json entry). Every top bar measures 40 px.

Not built here, reported:

Human Minimum

Each item is one rule from
CONTRIBUTING.md › Human Minimum,
which links the AGENTS.md text that states it.

  • 1. Schemas start as Zod; packages/spec holds no runtime logic. (packages/spec is not touched.)
  • 2. Every name I added uses the casing for its kind.
  • 3. No formatter ran; eslint on the changed files: 0 errors.
  • 4. One issue, one branch off an up-to-date main, one pull request.
  • 5. A change that publishes carries a changeset, and both declaration lines are filled in here and in the changeset.
  • 6. packages/spec touched: its generated artifacts are regenerated and committed. (Not touched.)
  • 7. No hand edits to content/docs/references/, packages/*/CHANGELOG.md or content/docs/releases/.
  • 8. Title, body and comments are in English (the 维护者速读 block is the project's Chinese summary).
  • The Before Submitting list in CONTRIBUTING.md is done.

Verification

All local readings are at head d94e010b0a, which includes the merge of origin/main 5517005d3a. Against that merge base the change is 37 paths, +2,125 / −303. The evidence folder is added and removed inside the range, so it is not among them.

Tests, type-check, lint
  • Broad suite. Under the verify lock: pnpm exec vitest run --maxWorkers=3 packages/plugin-detail packages/components packages/i18n plus the 619 other test files under ui/ that name a module, test id or key this PR changes, derived by git grep.
    • The run was on 6c535caa83: Test Files 4 failed | 1529 passed | 2 skipped (1535), Tests 10 failed | 17140 passed | 67 skipped (17217).
    • All ten reds came from this change, in four files:
      • all-locales-key-parity and plural-categories-11432: fr / es / pt lacked detail.relatedRows_many, and ar's _one / _two lacked {{count}};
      • residue-namespaces-3546: RelatedList's detail.add count, now 4 with the toolbar's Add;
      • RecordDetailView.pageHeaderTitleFls-10499: the record's name now also appears in the top bar's crumb. The pin now checks that the crumb names the same gated title and never the denied email.
    • All four were fixed in d94e010b0a, and the four files rerun green: Tests 107 passed (107).
  • Type-check. type-check (tsc --noEmit + tsc -p tsconfig.test.json) of @object-ui/app-shell, @object-ui/components and @object-ui/plugin-detail under the lock, and @object-ui/i18n at d94e010b0a: each exit 0.
  • eslint on the 36 added or modified ts / tsx files under ui/ at d94e010b0a: 0 errors. The warnings left on added lines are react-refresh/only-export-components on the hook exports beside components, a pattern these files already follow.
  • pnpm --dir ui run check:i18n-drift: exit 0.
Derived gate families: 34 derived, 34 run, 0 NOT-MEASURED

node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derives the same 34 commands at 857d25f771 and at d94e010b0a. Each was run at d94e010b0a with stdin from /dev/null, and its exit code was captured before any pipe.

An earlier pass at 857d25f771 had one red: pnpm --dir ui exec vitest run scripts/, in check-doc-snippet-types' root-bound case on plugin-grid / plugin-report READMEs that this branch does not touch. It came while a turbo build was rewriting @objectstack/spec's dist (the HotCRM rig), and it is green on every run since: 169 passed | 2 skipped, 4901 passed.

--ran on this record: "34 derived, 34 run, 0 NOT-MEASURED, 0 UNRUN … a DERIVED zero — all 34 recorded an exit code and none of them is 3".

node scripts/check-adr-0087-registration.mjs --base origin/main :: exit 0
node scripts/check-adr-0087-registration.mjs --self-test :: exit 0
node scripts/check-changeset-no-major.mjs --base origin/main :: exit 0
node scripts/check-closing-keyword-parity.mjs :: exit 0
node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0
node scripts/check-comment-mask-corpus.mjs :: exit 0
node scripts/check-empty-changeset.mjs --base origin/main :: exit 0
node scripts/check-empty-changeset.mjs --self-test :: exit 0
node scripts/check-sdui-manifest.mjs :: exit 0
node scripts/check-sdui-manifest.mjs --self-test :: exit 0
node scripts/pm/release-rehearsal-clone.mjs --self-test :: exit 0
node scripts/release-pending-publish.mjs --self-test :: exit 0
pnpm --dir ui exec vitest run scripts/ :: exit 0
pnpm --filter @objectstack/spec run check:duration-unit-keys :: exit 0
pnpm check:changeset-gate-self-tests :: exit 0
pnpm check:closed-ceremony-text :: exit 0
pnpm check:cross-package-test-inputs :: exit 0
pnpm check:dispatcher-error-vocabulary :: exit 0
pnpm check:driver-memory-census :: exit 0
pnpm check:engine-double-contract :: exit 0
pnpm check:gitlink-declared :: exit 0
pnpm check:nul-bytes :: exit 0
pnpm check:pm-changeset-deadline-census :: exit 0
pnpm check:published-files :: exit 0
pnpm check:query-options-erasure :: exit 0
pnpm check:refd-timer-probe :: exit 0
pnpm check:skill-identifier-liveness :: exit 0
pnpm check:test-source-alias :: exit 0
pnpm check:tier-file-adoption :: exit 0
pnpm check:type-check-coverage :: exit 0
pnpm check:type-check-debt :: exit 0
pnpm check:undeclared-dep-imports :: exit 0
pnpm check:watch-hint-literal :: exit 0
pnpm check:where-matcher :: exit 0
Merge-tree and what was not run

CI check-runs: not started at the time of writing.


Generated by Claude Code

🤖 Generated with Claude Code

https://claude.ai/code/session_01L6bhgVP3twvBvDTwoLPU6J

claude added 10 commits October 31, 2026 15:52
The page, the split pane, the drawer and the maximized pane draw one 40 px
bar of frame controls: the breadcrumb on the left (object › record, or the
path one level down), and on the right the counter with ↓ ↑, the right
column's switch, ⤢ / ⤡ and ✕, each only where it applies. The crumb row
above the page header goes; a page the list row's ↗ opened steps that
list's rows. The enlarged related list draws a toolbar over its table, and
the Activity tab names its count on a link that opens another tab.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L6bhgVP3twvBvDTwoLPU6J
… and the Activity count

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L6bhgVP3twvBvDTwoLPU6J
… Activity count on a deep link

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L6bhgVP3twvBvDTwoLPU6J
…rough that list's rows

A list whose rows open as pages now hands the rows it shows in the page's
`from` state, as the row's ↗ already did in its way back to the pane. The
page's top bar draws the counter and ↓ ↑ for it and steps with `replace`,
keeping the same list; ⤡ stays the ↗ arrival's alone.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L6bhgVP3twvBvDTwoLPU6J
…new tests' casts without any

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L6bhgVP3twvBvDTwoLPU6J
… the next commit)

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L6bhgVP3twvBvDTwoLPU6J
…ge selects

fr, es and pt gain the `many` slot, and ar's `one` and `two` slots carry
`{{count}}` as en's do. The residue pin counts the enlarged toolbar's Add as
RelatedList's fourth `detail.add` site, and the FLS pin reads the top bar's
crumb as the second place the record's gated name appears.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L6bhgVP3twvBvDTwoLPU6J
@github-actions github-actions Bot added size/xl documentation Improvements or additions to documentation tooling labels Oct 31, 2026
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:ui#5 · os-sales · session_01L6bhgUhKx1XHzkoikGjRB4

Contract review

Served-tier: TIER_DEFAULT
Head-sha: d94e010b0aabf5eec4dade70ce7fd30649ab6686
Local-runs: none
Scope: ui/packages/components/src/custom/record-top-bar.tsx, ui/packages/components/src/custom/index.ts, ui/packages/components/src/custom/navigation-overlay.tsx, ui/packages/i18n/src/locales/en.ts + ui/packages/app-shell/src/views/RecordDetailView.tsx, ui/packages/app-shell/src/views/recordDrawerStack.tsx

① Derived judgments

The face is the Clause-②: yes (widening) declaration alone: no packages/spec/src/** file and no governed path in the diff. What widens: @object-ui/components exports RecordTopBar, RecordTopBarButton, useRecordStepKeys and the types RecordTopBarProps / RecordTopBarStepper (one line in custom/index.ts); NavigationOverlay gains an optional toggles prop and its stepper an optional position and scope; @object-ui/i18n gains eight detail.* keys in all ten packs. No entry export retires: PanelToggles and PageHeaderTrailingContext stay, the latter still used by a host's plain overlay. No authored metadata key or stored shape moves.

② Semver level

patch for every package, as the changeset declares: additions only, every new prop optional; a caller of NavigationOverlay that passes neither toggles nor the new stepper fields draws as before apart from the shared bar.

③ Boundary flags

useRecordStepKeys keeps an owner stack, so a pane over a page owns j / k until it closes, and the page keeps the arrow keys for scrolling. ↓ ↑ on the page replace history (no new entries) and drop ?related=. The split / overlay / maximize mechanics of #27545 are unchanged; NavigationOverlay only draws its existing ⤢ / ⤡ / ✕ into the bar (−147 lines are the old header controls moving into the shared component).

Implemented-by: session_01L6bhgVP3twvBvDTwoLPU6J
Reviewed-by: session_01L6bhgUhKx1XHzkoikGjRB4

VERDICT: PASS


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:ui#5 · os-sales · session_01L6bhgUhKx1XHzkoikGjRB4

ACCEPT · 2026-10-31T18:10Z
Head-sha: d94e010

席位核对

  1. Shape: 37 files (+2125 / −303), the last of 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's four serial PRs, Fixes #27524: RecordTopBar (new components/src/custom/record-top-bar.tsx) on page, split pane, overlay drawer, maximized pane and phone; the crumb row and its ‹ line removed; ⊟ moved into the bar (portalled into the pane's bar slot; a host's plain overlay keeps it via PageHeaderTrailingContext); ride-along (a) the enlarged related list's toolbar and status line; ride-along (b) RecordTimelineCountProbe for 动态's count on a deep link; eight detail.* keys in ten packs; pins of 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 / 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 / [finding] Two scaffold paths render the same pnpm-workspace.yaml rule independently, and the drift between them is only ever noticed one incident at a time #10499 updated, not deleted. Inside claim 6545222939; the extra files (ObjectView.tsx, objectViewRecordNavigation.ts, objectViewRecordOverlay.tsx, recordDrawerContext.ts, urlParams.ts, relatedListCompact.ts, record-activity.tsx, useDetailTranslation.ts) serve the counter's rows and the two ride-alongs, and containers.tsx / panel-toggles.tsx were left untouched; accepted. packages/spec untouched. Not governed, 2428 lines ≤ 3000 (check-governed-merges --pr 28458).
  2. Contract: Clause-②: yes (widening) (new @object-ui/components exports, optional NavigationOverlay props, i18n keys; nothing retires), correcting the claim's provisional no as the claim asked; TIER_DEFAULT review record by this seat, PASS on this head (6547237425).
  3. Preview gate (ruling 6520722066): the seat read the HotCRM shots at b0a817c91d against the v4 boards at a7825499aa, rendered at 1440: account page from ↗ (12) against RecordPageV4Panels — crumb 「客户 › …」 left, 1 / 9 ↓ ↑, ⊟, ⤡ right, no crumb row, business actions only in the header row; contact pane with 任务 active (06) against RecordDrawerV4Enlarged — 「联系人 › John Smith」, ⤢ ✕, the toolbar (筛选, 全部 1 / 我的, 新建, 导出) and 「1 条」 over the table, tab row unchanged. Matches Targets 4 and 7 and both ride-alongs. Differences, all named in the PR body: no counter on a grouped list or kanban (the pane gets no sibling set there); no 逾期 chip on HotCRM's 任务 (no dueLike declared); the phone keeps the same bar (the board's phone header and bottom bar belong to console mobile (≤ 640 px): list as card rows with view chips and a FAB, the record page with a compact header, sticky tabs and a bottom action bar, related records pushed as full pages with a path row and back — the record is always a page on a phone #27058).
  4. Gates (check-runs on this head): 55 runs, 44 success, 11 skipped by path, 0 other; Test UI 16/16, Type Check UI, Lint UI, Build & E2E UI, Live E2E UI, Check Changeset success. The dev's battery: 34 new tests, eleven ablations each red then restored, dispatch-gates --commands 34/34, 0 NOT MEASURED.
  5. Deviations accepted: a page opened by a list whose rows open as pages (HotCRM leads) also draws the counter and ↓ ↑, and ⤡ stays only for the ↗; the object crumb returns to the list without re-selecting the record (⤡ is the path that returns with it open).
  6. Follow-ups owed by this seat (filed after this lands): the counter's group scope on grouped lists and kanban lanes (needs ListView in plugin-list to report grouped / lane rows with their group); the @object-ui/types record-components.ts related-list filter mirror widening released from Console list query and filter builder do not read a stored view filter's any-of group #28370 (amendment 6546690468), which needs two type lines in RelatedList.tsx. Observed, to be verified on main before filing: an account page's 动态 panel and tab show no count in shot 12.
  7. Changeset, read sentence by sentence: patch for every touched package; each paragraph (the bar per face, ⊟'s move, the crumb row gone, the enlarged toolbar and its chips, 动态's count, the new keys) is true against the diff.
  8. Landing: pr_ready + automerge_enable through the relay (Sales: seats land what they ACCEPT under pm-dispatch), MERGED confirmed; 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 then closes by Fixes.

Generated by Claude Code

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 31, 2026 18:12
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 31, 2026 18:12
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 31, 2026
Merged via the queue into main with commit 55a1feb Oct 31, 2026
56 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/project-thread-orbrul branch October 31, 2026 18:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/xl tooling

Projects

None yet

1 participant