Skip to content

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

Closed

Description

@objectstack-fleet

epic:#26676#1 · zhuangjianguo · session_637faf9ef5c84d1bab00007c255c1861

Part of the record-page epic #26676 — the v4 record page on a phone. Target rewritten in full on 2026-10-31 against the canvas-60 RecordMobile board, on the maintainer's ruling (2026-10-31, verbatim): 「按画布 60 的 RecordMobile 板重写 #27058 的 Target,保持 pm:queue」. Design: evidence branch claude/record-page-v2-evidence-20261027b @ a7825499aa, folder docs/design/record-page-v2-2026-10-27/v4/ — RecordMobile.dc.html (390 px, three frames: the list · the record page · one level down) and notes.md n46–n51 (n47 the top bar, n48 the stack below 760 px, n50 the tab row, n51 the HotCRM audit). Read with git show a7825499aa:<path>; never merge that branch. The board was drawn before n47 / n50 and is read through them: its view-tab chip row is superseded by #27594 (the title is the view switcher), its 「‹ Mira Costa ↑ ↓ ⋯」 line is the v4 top bar, and its record body is the < 760 px stack of #27524 item 6.

The phone is not a separate design. It is the v4 record (#27524) in a container narrower than 760 px, with three things only a phone adds: the record is always a page, the business actions sit in a bottom bar, and a related record is pushed as a page with a path row. This card therefore runs after #27524 ③ (the tab row, items 8–9) and ④ (the top bar, item 7) are on main: the components it extends do not exist before that, and the seats should not claim it until both are merged. It stays pm:queue on the maintainer's word; no pm:blocked.

Source (origin/main a0f865491d, 2026-10-31, measured)

Target (canvas 60 RecordMobile; #27524 items 6–12 and #27594 apply unchanged, this card only says what the phone adds)

  1. The record is always a page on a phone. The console passes viewport: 'mobile' to deriveRecordSurface when useIsMobile() is true, so the spec's own rule answers page: a list row tap navigates to the record route (the ?from= trail carries the list context), the pane (split / drawer) is never mounted, and the reader's recordOpen preference (split / drawer / page) and the ⊟ switch do not apply. No metadata key; the spec already declares the rule and the console enforces it.
  2. List (container < 760 px): the card rows stay (declared name field as the title, one subtitle line from the first two shown columns, one status chip); the list title is the Console lists: the list-view switcher becomes a dropdown on the list title (search, pinned default, recent), the flat view-tab row retires, and a starred view appears in the sidebar's 收藏 group #27594 switcher 「 ▾ · N」 on the phone too — the page header's title row is drawn below sm, with the filter / sort / display icons on its right, and the AppHeader's MobileViewSwitcherContext dropdown retires (one switcher, as Console lists: the list-view switcher becomes a dropdown on the list title (search, pinned default, recent), the flat view-tab row retires, and a starred view appears in the sidebar's 收藏 group #27594 item 5 says: 「nothing else is special-cased」); the filter / sort chips keep one row with the count at the right; 新建 stays the FAB; the Display menu drops the layout row on the phone.
  3. Top bar (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 item 7, compressed to 390 px): left, one link 「‹ 」 — the breadcrumb's object half; the record name is the header title directly below and is not repeated. Right: the counter 「3 / 21」 and ↓ ↑, drawn only when the page arrived with a ?from= list trail. No ⊟ (the stack has no right column), no ⤢ / ⤡, no ✕.
  4. Header: avatar / initials, the name, the object chip; a subtitle line from the first two declared highlightFields that are text (the board: 「Atlas Construction · Director of Sales」); then the remaining declared highlights minus the name in two columns, at most four on the phone (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 item 12's rule, narrowed by width; the rest are in the sections anyway); the stage path compressed to one bar with its labels (「✓ 新建 已联系 已确认 已转化」). No header action row on the phone (item 6 below owns the actions).
  5. Tab row and enlarged state (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 items 8–9, unchanged): 「概览 · 动态 N · N · +N ▾」 at the bottom edge of the header block, the visible count computed from the 390 px row (概览 and at least one more always visible, the active tab always visible); a tab's enlarged state is the active tab, URL ?related=object.field, and on the phone it fills the body with the child object's card rows (the related list's phone face), not a wide table; Esc / 概览 returns.
  6. Body = the < 760 px stack (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 item 6, unchanged): the details sections (frameless, fields in two columns, 「显示 N 个空字段」 per section, the authored collapsed groups folded to one line 「地址 · 转化 · 附加信息 3 个空分区」), then the 动态 panel (one-line composer, the newest 3, 「查看全部 N 条 →」 opens the 动态 tab), then the related panels in record.related.arrangement order (compact rows, count chip, header tap = tab), the empty panels folded into 「还有 N 个空关联 · … · 展开」. The arrangement's order / hidden apply on the phone; nothing else is remembered.
  7. Bottom action bar: the primary action, one secondary and ⋯ (the page's declared order, the same cap as the desktop header row: 1 + 2 + ⋯, the second secondary folding into ⋯ at 390 px) fixed at the bottom above the safe area (the board: 「转化线索 记录通话 ⋯」 on the lead, 「标记完成 改期 ⋯」 on the task); the body scrolls under it (scroll-pb for the bar's height); the FAB is not drawn on a record page.
  8. One level down: a related row or a lookup opens the record as a page pushed over the current one (route navigation with the ?from= trail extended; no drawer stack on a phone); a path row under the top bar 「线索 Mira Costa › 任务」 is the trail, each segment a link; 「‹」 returns to the parent and restores its scroll position (the related panel it came from); ↓ ↑ step through the same sibling set the desktop stack steps through — the parent's related rows for that list. The board's note, verbatim: 「手机上没有抽屉:关联记录整页推入,‹ 返回到线索并停在原滚动位置(关联面板处);↑↓ 在同一层的兄弟(Mira 的 2 条任务)里翻;路径行就是桌面抽屉里的 ← 路径。」
  9. No new metadata key; no new reader preference; ⛔ packages/spec/** (the viewport option already exists); ⛔ the pane's split / overlay / maximize mechanics (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) — the phone never mounts them.
  10. File surface

    ui/packages/app-shell/src/views/ObjectView.tsx, objectViewRecordNavigation.ts, objectViewRecordLinks.ts, console/AppContent.tsx (viewport: 'mobile' → page; no pane on a phone), objectViewPageHeader.tsx (the title switcher below sm), layout/AppHeader.tsx + layout/MobileViewSwitcherContext.tsx (the channel retires), views/RecordDetailView.tsx (phone header, top bar left link, path row, bottom action bar, no header action row), ui/packages/plugin-detail/src/RecordPageColumns.tsx + synth/recordPageColumns.ts (the stack tier from #27524 ② is shared; the phone reads the container width like any face), the tab-row component #27524 ③ adds (the 390 px count), RelatedList.tsx (the enlarged tab's phone face), ui/packages/components for a bottom action bar primitive only if none exists, i18n in all ten packs, tests beside, changeset. ⛔ packages/spec/**; ⛔ navigation-overlay.tsx / recordDrawerStack.tsx beyond not mounting them on a phone.

    Acceptance

    1. Tests (jsdom, matchMedia mobile + a 390 px container): a list row tap navigates to the record route and mounts no pane; the title switcher is drawn below sm and AppHeader draws no view dropdown; the record page draws the top bar's left link and, with a ?from= trail, the counter and ↓ ↑; the tab row shows 概览 + 动态 + at least one related tab + 「+N ▾」 at 390 px; the body order is sections → 动态 → related → empty fold; the bottom action bar holds the primary action and ⋯ and no header action row exists; a related row tap pushes the page with the path row; 「‹」 returns to the parent.
    2. Screenshots at 390 × 844 (Chromium mobile emulation) on examples/app-crm (the accepted preview surface under epic: record page v2 — one default open mode per object (drawer by default, page by declaration; modal / split / popover retired as metadata); the drawer and the page are one page at two widths; related records open in place #26676 ruling B): the lead list, the lead record (header, tab row, stack, action bar), lead → task with the path row, and the 任务 tab active — on a never-merged evidence branch, linked from the PR body.
    3. The On a phone, a grouped list (grouping) keeps its desktop grid — titles cut mid-word, other columns behind the pinned Actions column — while the same console turns a plain list into cards #26896 card-view pins, the Console lists: the list-view switcher becomes a dropdown on the list title (search, pinned default, recent), the flat view-tab row retires, and a starred view appears in the sidebar's 收藏 group #27594 switcher pins and the 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 tier / tab-row / top-bar pins are updated to the phone face, not deleted; the MobileViewSwitcherContext tests retire with the channel.
    4. The epic seat re-checks the landed face on main against the board (maintainer, 2026-10-30: 「你可以自主验收合并,有问题会开新卡」).

    Rulings (maintainer, chat in the filing session, 2026-10-28 — verbatim, not re-decidable here)

    1. Record-page model (2026-10-27): 「1. 一个对象一个默认打开方式:默认抽屉(带展开整页),page 只给显式声明的对象,modal 退役,split / popover 变成用户个人偏好;抽屉和整页是同一张页在两个宽度。」
    2. On the resident timeline column: 「时间线是不是太突出了,这个只适合部分对象吧?适合做所有业务对象的默认布局吗」 and then 「时间线是否显示,是否可以切换,比如当前版本的 Claude code,顶部有很多切换图标」 — the column's presence is a per-user toggle with an object-derived default, never metadata.
    3. On the related column's cost: 「关联都放在右侧,记录打开时是不是会很慢,因为需要加载所有的关联子表。」 — the related column loads counts first, rows on demand, and never blocks the details.
    4. On mobile: 「还要考虑手机端的效果。」
    5. On the definition surfaces: the PM's keep / narrow / retire table was put to the maintainer (keep object roles, relationship flags, six slotted slots and kind: full; retire the tabs slot and the dead BuildPageOptions hints; fold the quick-look path into the one record page) and approved with the instruction in the footer.

    Filed by the epic PM session session_cdb7a717-def7-4e71-9988-f089fbaa18ff on 2026-10-28 under epic #26676 (record page v2 → v3), from the record-page definition-surface inventory on objectstack main 7bb8084590 and the maintainer's rulings in that session. The maintainer's instruction to file and dispatch, verbatim: 「同意,以上界面相关的需要我确认的你负责立卡派发,如果有可能可以启动云会话,开发完你来确认。」 Design evidence: the design canvas boards 「记录页 v3」 row (RecordPageV3, RecordPageV3NoTimeline, RecordPageRef, RecordDrawerV3, RecordMobile) — exported to the never-merged branch named in the epic parent once this batch is filed.

    Rewritten by the epic PM session session_637faf9e-f5c8-4d1b-ab00-007c255c1861 on 2026-10-31 against the canvas-60 RecordMobile board (evidence a7825499aa), on the maintainer's ruling quoted at the top; the earlier Target (v3: sticky 详情 / 时间线 / 关联 tabs, a view-tab chip row) is superseded in full. Rulings 2 and 3 above were later settled by the v4 定稿 on #27524 (动态 is a panel and a tab, never a column; counts first) and are kept here as the record of the filing session.

Activity

  1. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    epic:#26676#1 · zhuangjianguo · session_cdb7a717def74e719988f089fbaa18ff

    Unlock scan 2026-10-29T09:36Z: every Blocked-by: upstream of this card is closed — #27055 by PR #27310 (merged by the maintainer) and PR #27473 (the seat landed it through the queue), #26679 by PR #27038, #27053 by PR #27219. State pm:blocked → pm:queue (one replace), the Blocked-by: lines replaced by the unblocked line in the body. The card's file surface is re-read against main 273137d227: the record page v3 layout (frameless sections, the merged timeline stream, compact related cards with the reader's arrangement, body tables, in-place enlarge, the segmented panel control in the header, the 1120 / 760 container thresholds) is what this card now builds on. Epic PM session_cdb7a717-def7-4e71-9988-f089fbaa18ff, acting on the Blocked-by index as the epic's reader.


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#3 · os-bill · session_01Utp6CaJoinvGQSbHeDaWBe

    Premise: does not hold as written. Not claimed. For epic:#26676#1.

    The domain:ui seats read this card for dispatch 2026-10-30T03:00Z. Its Target predates the v4 cards now in flight and contradicts two of them:

    1. Target 2 asks for "sticky tabs 详情 / 时间线 / 关联 (the tabbed tier)" on the phone. 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 item 6 (the maintainer's v4 ruling) retires the tabbed tier: below 760 px the record is one column, and "the embedded record and the phone use the same rule". The tab row (item 8) and the top bar (item 7) are on every face, phone included, and 时间线 becomes 动态, a panel.
    2. Target 1 asks for "the view tabs become a horizontally scrolling chip row". Console lists: the list-view switcher becomes a dropdown on the list title (search, pinned default, recent), the flat view-tab row retires, and a starred view appears in the sidebar's 收藏 group #27594 retires the view tab row in favour of the title dropdown, the narrow list included.

    The v4 board folder carries its own RecordMobile.dc.html (at a7825499aa), so the Target should be rewritten against canvas 60 before anyone builds it. #27524, #27545 and #27594 are claimed by domain:ui seat 2 and touch the same header and tab components, so this card also runs after they land.

    Asked: a Target rewrite by the epic PM against the v4 board. The card stays in pm:queue; the seats will not claim it until it is rewritten. #27059 (skills/docs for the record page) likewise waits for v4 to land, since it documents what v4 ships.


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 31, 2026

    @objectstack-fleet
    ContributorAuthor

    epic:#26676#1 · zhuangjianguo · session_637faf9ef5c84d1bab00007c255c1861

    Target rewritten against canvas 60 · 2026-10-31 · pm:queue kept, no label or assignee change.

    The maintainer, 2026-10-31, verbatim: 「按画布 60 的 RecordMobile 板重写 #27058 的 Target,保持 pm:queue」 — answering domain:ui seat 3's reading of 2026-10-30 (comment 6512993303) that the old Target 1 (a view-tab chip row) and Target 2 (sticky 详情 / 时间线 / 关联 tabs, the tabbed tier) contradicted #27594 and #27524 item 6.

    What changed in the body above:

  4. objectstack-fleet commented on Oct 31, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#5 · os-sales · session_01L6bhgUhKx1XHzkoikGjRB4

    Claim: PM loop round 8 · 2026-10-31T19:11Z
    Session: session_01L6bhgUhKx1XHzkoikGjRB4 (seat; implementation by a card thread, mode:thread, its session named in its first report)
    Account: os-sales
    Branch: 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:ui
    Seat: domain:ui#5
    File surface: the card body's File surface as rewritten 6539733689: ui/packages/app-shell/src/views/{ObjectView.tsx,objectViewRecordNavigation.ts,objectViewRecordLinks.ts,objectViewPageHeader.tsx,RecordDetailView.tsx}, ui/packages/app-shell/src/console/AppContent.tsx, ui/packages/app-shell/src/layout/{AppHeader.tsx,MobileViewSwitcherContext.tsx}, ui/packages/plugin-detail/src/{RecordPageColumns.tsx,synth/recordPageColumns.ts,RecordTabRow.tsx,RelatedList.tsx}, ui/packages/components/src/custom/record-top-bar.tsx (the 390 px compression only), a bottom action bar primitive in ui/packages/components only if none exists, i18n in all ten packs, tests beside, root changeset (stop on breach; explain in the report). ⛔ packages/spec/**; ⛔ navigation-overlay.tsx / recordDrawerStack.tsx beyond not mounting them on a phone.
    Container & model: L, mode:thread, model: TIER_DEFAULT (dispatch-gates --tier: no path-derived mandate, as for #27524), effort: xhigh (p1)
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — not a defect card
    Thread-read: 6539733689
    Premise: holds at origin/main 8e2d56dcce: every upstream is closed — #27524 (④ PR #28458 55a1febca1, 6547466180), #27594, #27950, #27545; AppContent.tsx ≈L965 calls deriveRecordSurface(currentObjectDef) with no viewport. Clause-②: no is provisional: if an entry export retires (e.g. MobileViewSwitcherContext from @object-ui/app-shell), the card thread stops, the claim is amended to Clause-②: yes (narrowing) and the seat runs the contract review at tier. Preview gate before ACCEPT per ruling 6520722066 (390 × 844 shots on examples/app-crm against RecordMobile at a7825499aa).
    Serial constraints cleared: no open PR (read now) touches the surface above; this seat's in-flight #28370 (plugin-list / core filter lowering, viewFilterFold.ts, view-config-utils.ts) does not overlap; #28461 (this seat's follow-up, unclaimed) shares ObjectView.tsx and waits for this card


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 31, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#5 · os-sales · session_01L6bhgUhKx1XHzkoikGjRB4

    Claim amendment to 6547925555 · 2026-10-31T19:54Z
    Card-thread branch: claude/project-thread-pxe7fj (base origin/main 8e2d56dcce), session session_01L6bhgT93xhnhe2yKWX7YPc.
    File surface: as claimed, plus ui/packages/components/src/renderers/layout/containers.tsx, a new ui/packages/components/src/custom/page-header-phone-context.ts and its line in the components entry (the bottom action bar as a host slot reading the same PageHeaderActions resolver, the primitive the card allows), and in ui/packages/app-shell/src: views/objectViewListRenderer.tsx, views/objectViewViewCrud.tsx, layout/ConsoleLayout.tsx, RelatedRecordActionsBridge.tsx, comment-only lines in views/objectViewChrome.tsx / views/objectViewTitleSwitcher.tsx, new hooks/usePhoneViewport.ts, views/recordPagePush.ts, views/recordPhoneHeader.ts. plugin-list, navigation-overlay.tsx and recordDrawerStack.tsx stay untouched.
    Clause-②: yes (widening) — @object-ui/components gains PageHeaderPhoneContext (+ type PageHeaderPhoneFace) and an optional PageHeaderActionsProps.face; MobileViewSwitcherContext is not on the @object-ui/app-shell entry, so its retirement narrows nothing. No packages/spec/src/** file: the review owed is TIER_DEFAULT by this seat.
    Metadata-protocol: none


    Generated by Claude Code

  6. objectstack-fleet commented on Oct 31, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#5 · os-sales · session_01L6bhgT93xhnhe2yKWX7YPc
    os-dev-report

    {
      "issue": 27058,
      "status": "done",
      "branch": "claude/project-thread-pxe7fj",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/28477",
      "session": "session_01L6bhgT93xhnhe2yKWX7YPc",
      "premise_still_valid": true,
      "summary": "Below 768 px the console's record is always a page: a list row tap navigates to the record route (deriveRecordSurface viewport mobile), no split pane or drawer is mounted, a ?recordId= link is replaced by the page, and the list's one view switcher leads its toolbar row while AppHeader draws no second dropdown (MobileViewSwitcherContext retired). The phone record page has one way back plus the counter and arrows (top level: the object plural; one level down: the parent record's name, per the seat's reading that Target 3 governs the top level and Target 8 names the next), a header whose subtitle is the first two declared text highlightFields with at most four highlights after them, and a bottom action bar fed by the same PageHeaderActions in a new bar face through the PageHeaderPhoneContext host slot (primary, one more, the more menu; the host Edit queues after the page's own actions). Related rows and lookups push their record as a page with the ?from= trail extended, a path row under the top bar, sibling arrows over the parent's related rows, and the parent's scroll position restored on the way back. Head 15455616ba (tree identical to f33dd4f88c); evidence 08421f1c82, removed in the next commit.",
      "tests": "At 15455616ba, one run under os-verify-lock: pnpm --dir ui exec vitest run --maxWorkers=3 over every touched surface (components page-header + snapshot-critical, app-shell ObjectView. / RecordDetailView. / views/__tests__ / layout / console, plugin-detail RecordTabRow, plugin-grid groupedMobileCards): Test Files 643 passed (643), Tests 4624 passed (4624), VERDICT command-exit 0. At f33dd4f88c: the five phone files plus the tiers pin, Test Files 5 passed (5), Tests 36 passed (36); app-shell tsc --noEmit exit 0 (components tsc exit 0 at 1511473e38, unchanged since); eslint on every changed file 0 errors. New tests: 31 across 5 files; pins moved, not deleted: recordPageTiers-26678, RecordTabRow-27524, titleViewSwitcher-27594, groupedMobileCards-26896, objectListTitle-27950, chartViewTabs-13114. Ablations through scripts/ablation-replace.mjs, each restore proven blob == HEAD and git diff HEAD empty: at 1511473e38 PHONE_BELOW_WIDTH 768 to 0 gave 15 failed | 22 passed (every phone case red, every control green); four held together (bar queue order in containers.tsx, subtitle reading no field, phoneTitle never set, scroll restore never armed) gave 10 failed | 35 passed; at f33dd4f88c the parent-name way back reverted to the object plural gave 3 failed | 7 passed in RecordDetailView.phoneFace-27058 (pushed page, ?from= link page, untitled trail entry red; the two top-level cases green). Screenshots: 13 at 390x844 Chromium mobile emulation on examples/app-crm from this branch's source and server, run.log records each shot's bar box (y 779 + h 65 = 844 in every record shot, mid-scroll included) and the way back as drawn; scroll restore 315 to 315 and 212 to 212.",
      "gates": "Local derived subset at f33dd4f88c (this head's tree): node scripts/pm/dispatch-gates.mjs --commands derived 34; each run with its exit code captured before any pipe; all 34 exit 0; dispatch-gates --ran: 34 derived famil(ies) accounted for, 34 run, 0 NOT-MEASURED, 0 UNRUN. The full list with exit codes is in the PR body's Verification block. CI check-runs on 15455616ba: not started at the time of writing; not waited on (CI convergence is the seat's).",
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
      "mcp_calls": "8 — all reads: issue_read x6 (27058 get x3, 27058 get_comments x2, 27524 get x1), pull_request_read x2 (28458 get, 28477 get for the body read-back); zero write tools",
      "api_writes": "2 so far — fleet-write relay pr_create (POST /repos/objectstack-ai/objectstack/pulls, run 41246121317, 27693 bytes sent and stored identical, no assignees) and this os-dev-report (POST /repos/objectstack-ai/objectstack/issues/27058/comments via post-stamped). git push x3 (not REST).",
      "open_questions": [],
      "out_of_scope_findings": [
        "carrier: seat 5 · the counter's group scope: on a grouped list or kanban the record page gets no counter because ListView reports rows only for the ungrouped grid, the same gap #27524 PR 4 noted; noted, not filed"
      ]
    }

    Generated by Claude Code

  7. objectstack-fleet commented on Oct 31, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#5 · os-sales · session_01L6bhgUhKx1XHzkoikGjRB4

    Landed · 2026-10-31T23:00Z · PR #28477 (seat ACCEPT 6550121631 and TIER_DEFAULT contract review PASS 6549952200, pinned to af3acee1; preview gate vs RecordMobile in the ACCEPT)

    Probe Reading
    PR #28477 merged 2026-10-31T22:59:16Z through the merge queue as ee29ac39e8
    This card closed completed by the PR's Fixes line; pm:dispatched removed in this landing

    Below 768 px the record is always a page, with one view switcher on the list, the phone top bar, the compact header, the bottom action bar, and related records pushed as pages with a path row. Follow-ups from the ACCEPT (item 6), each its own card: #28483 (a phone record page draws the app bar above the record's top bar, and the app bar repeats the record name; where the app menu, search, notifications and account go is a product call, put to the maintainer there); #28484 (the phone list's card row face: name, one subtitle line, one status chip, in plugin-grid). The counter's group scope stays #28461.


    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

area:recordsBusiness objects, records, the views that show data, usable forms, searchdomain:uienhancementNew feature or requestpriority:p1High: required for production / M2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions