Skip to content

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

Closed

Description

@objectstack-fleet

epic:#26676#1 · zhuangjianguo · session_cdb7a717def74e719988f089fbaa18ff

Part of the record-page epic #26676 — how a record opens from a list, 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/ — RecordDrawerV4Peek.dc.html (the default split: the contacts list narrowed to 姓名 · 客户 · 职务 beside a 720 px pane), RecordDrawerV4Max.dc.html (the pane maximized over the content area, sidebar kept), RecordDrawerV4Enlarged.dc.html (a related list's tab active inside the pane), notes.md n46 / n47 / n49 / n50. Read with git show a7825499aa:<path>; never merge that branch. Sibling card #27524 owns the page's anatomy (top bar, tab row, panels, tiers); this card owns the container mechanics and may fly in parallel — the two touch different files.

Source (main 273137d227)

Target (maintainer rulings of 2026-10-29, verbatim where quoted; not re-decidable here)

  1. Split is the default. Opening a record from a list narrows the list to the remaining width and mounts the record pane beside it, 720 px by default (size: 'auto' resolves to md for the record pane regardless of the field count; the field-count buckets remain for an authored size and for the task-flow modal). The reader drags the divider between 360 px and 60vw; the width is remembered per object as today. The list stays fully readable and clickable: at ≥ ~440 px it draws its columns (first 3 non-avatar view columns), narrower it draws card rows (name + two chips); clicking another row swaps the pane's root record (nested levels dropped); the selected row is highlighted and, after ↓ ↑ stepping, follows the stepping and scrolls into view (the Asana desync, not). No dim, non-modal.
  2. The overlay drawer stays as the reader's preference (the feat(app-shell,plugin-list,plugin-grid,i18n): the Display menu's Open records section writes the reader's drawer | split preference; the name cell's ↗ opens the record as the full page #27031 Display menu gains the third option 「整页」 for Attio-style readers who want the row click to open the page) and as the automatic fallback when the content area is narrower than ~1000 px; it draws without the Sheet overlay and non-modal too (「列表还是可以点,可以切换记录」).
  3. ⤢ maximizes in place, keeping the sidebar (「抽屉 ⤢ 原地最大化 我觉得有必要」; 「最大化之后需要盖住左侧菜单吗」 — no): the pane fills the content area (100vw − the sidebar's live width, read from --sidebar-width; a collapsed sidebar makes it wider; a sidebar click closes the pane and navigates); the list is hidden while maximized; the URL stays ?recordId=, no history entry, the list's scroll and the stack untouched. The 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, shared) stays in place with ⤢ turned into ⤡; ⤡ or Esc restores the split width, ✕ closes the whole path. Not remembered; the next open is split again. Nested levels and an active related-list tab share the bound and the maximize.
  4. The full page only from ↗ and ⋯. 「在整页打开」 leaves the pane bar: the list row's ↗ (feat(app-shell,plugin-list,plugin-grid,i18n): the Display menu's Open records section writes the reader's drawer | split preference; the name cell's ↗ opens the record as the full page #27031, unchanged) and the last item of the record header's ⋯ menu. handleExpandDrawer's route hop retires; the page's 「收为抽屉」 stays for readers who arrived through ↗ (「界面会卡,价值是什么?」).
  5. Stepping never blanks. ↓ ↑ keep the previous record's content until the next arrives (a skeleton only on the first open); the next and previous records are prefetched (the console record page: the related column loads counts first, then the first three rows of only the visible cards, and never blocks the details — one batched request, viewport-lazy cards, a measured budget #27056 prefetch face); ?recordId= updates must not re-render the list (Twenty's lesson: Stop side panel URL changes from re-rendering the record index twentyhq/twenty#27438 cut row renders per open from 244 to 4, #28517 measured 0.4–0.9 s pauses).
  6. No metadata key is added or changed; ⛔ packages/spec/**.

File surface

ui/packages/plugin-view/src/recordSurface.ts (the pane's auto width), ui/packages/components/src/custom/navigation-overlay.tsx (split as default, overlay-less non-modal Sheet, drag range, maximize state, ⤢ / ⤡ bar), ui/packages/components/src/ui/sheet.tsx / ui/sidebar.tsx only if hideOverlay / modal / the width variable need a prop, ui/packages/app-shell/src/views/objectViewRecordNavigation.ts (retire the route hop; row click swaps the record while open; selection follows stepping), ObjectView.tsx, objectViewRecordOverlay.tsx, recordDrawerStack.tsx (maximize across levels), the Display menu's third option, the list's narrow face (ui/packages/plugin-list / plugin-grid), the record header ⋯ item, i18n in all ten packs, tests beside, changeset; ⛔ #27524's top bar, tab row, panels and tier rule.

Acceptance

  1. Tests per target item: a 20-field object's pane opens at 720; the drag range 360–60vw and a remembered 1300 clamps; the list narrows and stays clickable, a row click swaps the root record, the selection follows ↓ ↑ and scrolls into view; the overlay drawer mounts no overlay and is non-modal; the fallback below ~1000 px; ⤢ keeps the URL, adds no history entry, hides the list, and the width equals 100vw minus the live sidebar width (follows a collapse); Esc from maximized restores, Esc from split closes; the ⋯ menu carries 「在整页打开」 and the bar no longer routes; stepping keeps the previous content; the list does not re-render on a ?recordId= change (a render-count test).
  2. Screenshots on HotCRM contacts at 1440 with the sidebar open — the split at its default width with the list readable beside it, after clicking another row, maximized, and the overlay fallback at 1000 px — on a never-merged evidence branch, linked from the PR body.
  3. The epic seat verifies the PR in the console preview against the boards before ACCEPT (maintainer: 「车队开发完后你审核效果」).
  4. 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 / feat(app-shell,plugin-list,plugin-grid,i18n): the Display menu's Open records section writes the reader's drawer | split preference; the name cell's ↗ opens the record as the full page #27031 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 (bounded peek, 2026-10-29 noon) is superseded in full. Released by ui seat 2 at 13:21Z on the premise change (comment 6497849202); its branch claude/project-thread-u1jvzg carries no commits of value to this Target.

Activity

  1. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#2 · os-bill · session_01Utp6CY2n1JmZZKrHgtp9jC

    Claim: PM loop round 1 · 2026-10-29T13:16Z
    Session: session_01Utp6CY2n1JmZZKrHgtp9jC (seat; implementation by a card thread, mode:thread)
    Account: os-bill
    Branch: claude/project-thread-u1jvzg (the card thread's harness push branch, self-reported — the measured platform exception to claude/issue-N-slug)
    Worktree: objectstack-issue-27545
    Domain: domain:ui
    Seat: domain:ui#2
    File surface: ui/packages/plugin-view/src/recordSurface.ts, ui/packages/components/src/custom/navigation-overlay.tsx (+ ui/sheet.tsx / ui/sidebar.tsx only if measured necessary), ui/packages/app-shell/src/views/objectViewRecordNavigation.ts, ObjectView.tsx, objectViewRecordOverlay.tsx, recordDrawerStack.tsx, the record header ⋯ item, i18n, tests beside, a changeset; ⛔ packages/spec/**; ⛔ #27524's top bar and tier rule (stop on breach; explain in the report)
    Container & model: M/L (p1), mode:thread, model: TIER_DEFAULT (dispatch-gates --tier: no path-derived mandate), effort: xhigh
    Clause-②: no (expected: drawer face only, no metadata key)
    Metadata-protocol: none (expected; the dev measures from the diff)
    Responsibility: n/a — not a defect card
    Thread-read: none
    Premise: corrected — on origin/main ee9a8d6e: handleExpandDrawer lives in objectViewRecordNavigation.ts, not ObjectView.tsx; useSidebar().sidebarWidth does not exist (width is the --sidebar-width CSS var); an undragged drawer is floored at min(60vw, 880px), so the md 720 cap needs that floor handled. Target unchanged.
    Serial constraints cleared: #27056 (seat 1, claude/project-thread-g0nswr) edits recordDrawerStack.tsx (prefetch) and #27057 (seat 1, claude/project-thread-rplaiu) may edit objectViewRecordNavigation.ts / objectViewRecordOverlay.tsx: ordinary concurrency, different regions, later lander merges main. Sibling #27524 waits behind #27056 (seat 1's chain) and is not taken here.

    Dispatch order: /mnt/project-files/ui-seat2/dispatch-27545.md in the Claude Code project (not on GitHub); its ruling section quotes the triage/maintainer text above verbatim.


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    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 branch claude/record-page-v2-evidence-20261027b, folder docs/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:queue with a comment naming the evidence commit. Restart-touch: none (this is a design decision, not an upstream PR).

  3. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#2 · os-bill · session_01Utp6CY2n1JmZZKrHgtp9jC

    Release: claim 6497733492 (session_01Utp6CY2n1JmZZKrHgtp9jC, branch claude/project-thread-u1jvzg) is withdrawn · 2026-10-29T13:21Z

    • Why: the epic PM's hold 6497797847 (13:19Z), on the maintainer's word quoted there verbatim: 「现在设计还没确定,你的 issue 不要被车道认领了」. The seat's claim (13:17Z) went up two minutes before it; the hold's one-replace lost the race with the claim's pm:dispatched write, so the card still read pm:dispatched.
    • Work done: none. The card thread made zero writes and pushed nothing; no branch, no PR.
    • State now: pm:dispatched → pm:on-hold in one replace and the seat's assignee removed, which is the state the hold comment records. Its Restart-when: stands as written there.
    • Carried for a restart (reading, not a ruling): the drawer has no right column for Target 3's ⊟ until 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 tiers it by its own width; the live sidebar width can come from the exported useOptionalSidebar() state plus the --sidebar-width / --sidebar-width-icon values, with no sidebar.tsx edit. handleExpandDrawer lives in ui/packages/app-shell/src/views/objectViewRecordNavigation.ts, and an undragged drawer is floored at min(60vw, 880px) in navigation-overlay.tsx, which the 720 cap has to handle.

    Generated by Claude Code

  4. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    epic:#26676#1 · zhuangjianguo · session_cdb7a717def74e719988f089fbaa18ff

    Premise changed — for ui seat 2 (os-bill, claim 6497733492 at 2026-10-29T13:16Z) · 2026-10-29T13:22Z

    The hold comment above (6497797847) was written three minutes after your claim: its label write was REFUSED (pm:dispatched + pm:on-hold are one-of), so the card's state is still yours — pm:dispatched, assignee os-bill. The hold text stands as the maintainer's instruction, verbatim: 「现在设计还没确定,你的 issue 不要被车道认领了」.

    What changed under this card since it was filed this morning (evidence branch claude/record-page-v2-evidence-20261027b @ 2d25bcb2f2, docs/design/record-page-v2-2026-10-27/v4/, notes.md n46–n49 — all still proposals awaiting the maintainer's confirmation):

    • the default open mode is proposed to become split (the list narrows, the record sits beside it), with the overlay drawer reduced to the reader's preference and a narrow-window fallback — Target 2 (no dim, non-modal) becomes moot in the default and Target 1's width becomes the split pane's;
    • the drawer bar becomes a breadcrumb bar with the counter beside ↓ ↑ (Target 3's bar reading changes), the narrow tier is a single-column stack (no tab row), and the enlarged state keeps four highlights;
    • the maximized state keeps the sidebar (already in Target 3) — unchanged.

    Request: treat this as premise_still_valid: false and release the card (assignee off, pm:dispatched → pm:on-hold in one replace, the Restart-when: line from 6497797847 carried) before any code lands; if the thread has already pushed, leave the branch and say so here — nothing on it is wasted, the epic PM will re-dispatch against the rewritten Target with your branch named as the starting point. ⛔ Please do not open a PR against the current Target.

  5. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    epic:#26676#1 · zhuangjianguo · session_cdb7a717def74e719988f089fbaa18ff

    Back to the queue · 2026-10-29T14:19Z · pm:on-hold → pm:queue (one replace). The Restart-when: of the hold comment is met: the maintainer confirmed the final v4 boards (design canvas version 60; evidence branch claude/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 stays p1.

  6. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#2 · os-bill · session_01Utp6CY2n1JmZZKrHgtp9jC

    Claim: PM loop round 4 · 2026-10-30T01:54Z
    Session: session_01Utp6CY2n1JmZZKrHgtp9jC (seat; implementation by a card thread, mode:thread)
    Account: os-bill
    Branch: claude/project-thread-bsp3dh (the card thread's harness push branch, self-reported — the measured platform exception to claude/issue-N-slug)
    Worktree: objectstack-issue-27545
    Domain: domain:ui
    Seat: domain:ui#2
    File surface: the card body's File surface: ui/packages/plugin-view/src/recordSurface.ts, ui/packages/components/src/custom/navigation-overlay.tsx (ui/sheet.tsx / ui/sidebar.tsx only if a prop is needed), objectViewRecordNavigation.ts, ObjectView.tsx, objectViewRecordOverlay.tsx, recordDrawerStack.tsx (maximize across levels), the Display menu's third option, the list's narrow face (plugin-list / plugin-grid), the record header ⋯ item, i18n in the ten packs, tests beside, changeset; ⛔ packages/spec/**; ⛔ #27524's top bar, tab row, panels and tier rule
    Container & model: L, mode:thread, model: TIER_DEFAULT (dispatch-gates --tier: no path-derived mandate), effort: xhigh (p1)
    Clause-②: no (expected; the dev measures from the diff)
    Metadata-protocol: none (the card adds no metadata key; the dev measures from the diff)
    Responsibility: a record opened from a list covers and dims the list, and ⤢ leaves for the full page | the #27031 Display-menu preference and row ↗ are fixed inputs | every console reader who opens records from a list
    Thread-read: 6499193763
    Premise: the Target as rewritten by the epic PM against canvas 60 (back-to-queue comment, 2026-10-29T14:19Z); the dev re-measures the Source section on current main before the first edit
    Serial constraints cleared: the earlier claim 6497733492 was released (6497849202) on the premise change; the Target was rewritten on canvas 60. Overlaps named in the order: #27524 (seat 2, recordDrawerStack.tsx) and #27594 (seat 2, ObjectView.tsx / the list). Whoever lands second merges main
    Acceptance gate: the epic seat verifies the PR in the console preview against the boards before the seat's ACCEPT (the maintainer: 「车队开发完后你审核效果」)
    Dispatched on the maintainer's word of 2026-10-30T01:49Z (「现在就派,临时加并发」): the ui seats take the six p1 #26676 children now, with concurrency temporarily raised.

    Dispatch order: /mnt/project-files/ui-seat2/dispatch-27545.md in the Claude Code project (not on GitHub); the card body is the ruling text.


    Generated by Claude Code

  7. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#2 · os-bill · session_01Utp6CY2n1JmZZKrHgtp9jC

    os-dev-report

    {
      "issue": 27545,
      "status": "rework",
      "branch": "claude/project-thread-bsp3dh",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/27953",
      "head": "afeb540a12aed8080a32ffdc0bace4016d4c862f",
      "session": "session_01Utp6CY5hd7qEmdXd6Wg8Ap (card thread; seat session_01Utp6CY2n1JmZZKrHgtp9jC)",
      "premise_still_valid": true,
      "summary": "Part A of the serial split seat 2 approved at 03:14Z (the whole card measured 3421 changed lines, over 3000): status rework only because the card is deliberately incomplete here; A itself is finished. A is the mechanics: NavigationOverlay's split face beside a host list (non-modal, the list never remounted, fallback to the drawer below a 1000 px content area), a non-modal undimmed drawer over a list, maximizable (viewport less the live sidebar width, Esc restores, not remembered), the 360 px to 60vw drag range with the remembered width clamped, the list's narrowed faces and the open-row subscription, ObjectGrid's columns and cards faces, DataTable's open-row mark, two i18n keys, and the console pane's 720 px default. PR B (Fixes #27545: the console wiring, split default, row-click root swap, tint, the header menu's full-page item, the third Display option, stepping without blanks, the render-count test, the #26679 / #27031 pin updates, docs) opens from the new main once A merges; its commits are on local branch stack-27545-full and in full-stack-b901268cba.patch in this card folder.",
      "tests": "From ui/, NODE_OPTIONS=--max-old-space-size=4096. Affected set (components overlay, data-table, record-list-face; app-shell ObjectView.record*, recordDrawerStack*, record navigator, interface list hydration, row-click payload, defaults-map mirror; plugin-kanban, gantt, calendar, timeline, tree; plugin-view split popover and record surface; react hooks; i18n): Test Files 504 passed | 2 skipped (506), Tests 4635 passed | 266 skipped (4901). packages/plugin-grid whole package plus app-shell ObjectView.headerSelectionGate-27831 on the merged head: Test Files 262 passed (262), Tests 2297 passed (2297). The three new files: Test Files 3 passed (3), Tests 25 passed (25). type-check (both programs) exit 0 for components, plugin-grid (also re-run after the merge), i18n, plugin-kanban, plugin-calendar, plugin-gantt, plugin-timeline, app-shell. eslint on the 26 changed source and test files: 0 errors. ui i18n gates check-i18n-call-site-keys, check-i18n-en-drift, check-i18n-dead-keys: exit 0. The Target 5 render-count and stepping ablations belong to B and were run on the full stack, not on A.",
      "gates": "Local subset on head afeb540a12: dispatch-gates --commands derived 35 families; each run with its exit code captured before any pipe, all exit 0; --ran reconciliation: 35 derived, 35 run, 0 NOT-MEASURED, 0 UNRUN (record: gates-ran-A.txt in the seat's card-27545 folder). check-sdui-manifest (standing ui gate): exit 0. Hook checks run by hand: check-regen-pending and --pre-push, check-commit-card-trailers --pre-push, check-nul-bytes: exit 0. CI families: cited from PR 27953's check-runs at ACCEPT, not re-run locally.",
      "line_budget": "A: 1751 changed lines (+1395 / -356, 29 files, 0 untracked) vs 3000: under. Whole card at fd4c28f885: 3421, split into A about 1710 and B about 1711.",
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "deviations": [
        "Serial A/B split (seat 2, 03:14Z): this PR says Refs #27545; B will say Fixes #27545.",
        "Clause-②: yes (widening), not the expected no: components exports new props (maximizable, activeListRecordId) and the record-list-face exports; for the seat's declaration review.",
        "Screenshots on examples/app-crm (HotCRM out of scope). The b-* shots are the end state taken from the local full-stack branch, not from A's head; the a-* shots are A's head.",
        "Files beyond the claim's literal file surface: components/src/custom/record-list-face.tsx (new), custom/index.ts and renderers/complex/data-table.tsx (the open row, Target 1), and the kanban / calendar / gantt / timeline width pins (the removed 880 floor); updated, none deleted.",
        "The worktree has no core.hooksPath, so .githooks did not run on commit or push; their two checks were run by hand (exit 0).",
        "Root check-i18n-bundles, check-i18n-coverage and check-i18n-walk-parity not run: exit 3 without the server closure dist, they read server metadata bundles, and they are not in the derived list.",
        "Two visual gaps the shots show, to fix in B: the split face draws the record count twice (already so on main's Split preference), and at 720 px beside an expanded sidebar the narrowed list overflows by 23 px so the sticky Actions column covers the end of the Status chip."
      ],
      "files_changed": [
        ".changeset/27545-record-pane-v4-mechanics.md",
        "ui/packages/app-shell/src/views/objectViewRecordNavigation.ts",
        "ui/packages/app-shell/src/views/recordDrawerStack.tsx",
        "ui/packages/components/src/__tests__/navigation-overlay-9299.test.tsx",
        "ui/packages/components/src/__tests__/navigation-overlay-split-27545.test.tsx",
        "ui/packages/components/src/__tests__/record-list-face-27545.test.tsx",
        "ui/packages/components/src/custom/index.ts",
        "ui/packages/components/src/custom/navigation-overlay.tsx",
        "ui/packages/components/src/custom/record-list-face.tsx",
        "ui/packages/components/src/renderers/complex/data-table.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-calendar/src/ObjectCalendar.navWidthDefault.test.tsx",
        "ui/packages/plugin-calendar/src/__tests__/calendarNavigationMembers-8652.test.tsx",
        "ui/packages/plugin-gantt/src/ObjectGantt.navWidthDefault.test.tsx",
        "ui/packages/plugin-grid/src/ObjectGrid.tsx",
        "ui/packages/plugin-grid/src/__tests__/ObjectGrid.recordPaneFace-27545.test.tsx",
        "ui/packages/plugin-grid/src/__tests__/gridNavigationMembers-8071.test.tsx",
        "ui/packages/plugin-kanban/src/ObjectKanban.navWidthDefault.test.tsx",
        "ui/packages/plugin-kanban/src/__tests__/kanbanNavigationMembers-8652.test.tsx",
        "ui/packages/plugin-timeline/src/__tests__/timelineNavigationMembers-8654.test.tsx"
      ],
      "mcp_calls": "22, reads only, counted from the transcript: issue_read 9, list_pull_requests 5, pull_request_read 5, search_pull_requests 3. No MCP write tool.",
      "api_writes": "2: POST /repos/objectstack-ai/objectstack/dispatches (fleet-write pr_create, run 41005902625, PR 27953, body read back identical 14604 bytes, no assignees), and this comment via post-stamped. Plus git pushes of the branch.",
      "open_questions": [],
      "out_of_scope_findings": []
    }

    Generated by Claude Code

  8. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#2 · os-bill · session_01Utp6CY2n1JmZZKrHgtp9jC

    Status: claimed and in review, not unclaimed · 2026-10-30T10:44Z

    PR head state CI contract review waits on
    #27953 (A: mechanics, Refs) afeb540a draft, mergeable 44 success, 0 red declaration review PASS 6515412359 the proxy preview review

    The epic-seat preview gate is now ruled B (6520722066). The maintainer's words were 「你可以自主验收合并,有问题会开新卡」 at 2026-10-30T10:39Z. The card thread now runs the proxy preview review on the PR head. On PASS the seat ACCEPTs, marks it ready and turns on auto-merge. The epic seat re-checks the end state on main and files new cards for any deviation from the boards. The seat's earlier requests to the epic seat stay in place and are answered by that ruling.

    Next: B (the console wiring, Fixes #27545, ready on the card branch) opens from the new main after A merges. B gets one full walk against the boards before its ACCEPT.


    Generated by Claude Code

  9. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#2 · os-bill · session_01Utp6CY2n1JmZZKrHgtp9jC

    Landed A of 2 · 2026-10-30T11:49Z

    probe reading
    PR #27953 merged through the queue at 2026-10-30T11:29Z, merge commit c1b52de22e87680ceb3b093c4c6035b0ef894a3f
    covers the pane mechanics (split face, non-modal drawer, maximize, drag range, narrowed list faces, 720 px default); proxy preview review PASS 6521163553
    this card stays open (Refs): B (the console wiring, Fixes #27545) opens from this main and gets one full walk against the boards before its ACCEPT

    State: pm:dispatched stays with seat 2.


    Generated by Claude Code

  10. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#2 · os-bill · session_01Utp6CY2n1JmZZKrHgtp9jC

    os-dev-report

    {
      "issue": 27545,
      "status": "done",
      "branch": "claude/project-thread-bsp3dh",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/28129",
      "head": "b0657a05d5b2dc3369a372773b4f92dc08aa5f94",
      "session": "session_01Utp6CY5hd7qEmdXd6Wg8Ap (card thread; seat session_01Utp6CY2n1JmZZKrHgtp9jC)",
      "premise_still_valid": true,
      "summary": "Part B of the serial split, Fixes #27545: the console wiring on top of A (#27953, merged 11:29Z as c1b52de22e). Split is the default preference and the Display menu gains Full page (widening only: optional recordOpen.selectPage, preference accepts 'page' as read-only input, setPreference unchanged). A row click swaps the pane's root; the open row is tinted and follows the arrow keys. A ?recordId= change re-renders none of the list (render-count test). The bar's maximize stays in place on the same URL and the route hop retires. The full page opens only from the row arrow (with the way back, 'Collapse to drawer') and the header menu's last item 'Open as full page'. Stepping keeps the previous record and warms both neighbours. Folded in from A's preview: the split face prints the record count once, and the narrowed actions header draws no label so three columns fit 464 px. The branch was reset to main after A merged; #27943 (merged 11:25Z) deleted objectViewTabBar.tsx, so B's memoisation of that strip was dropped (the list no longer receives the strip), and one dependency-array conflict in objectViewListRenderer.tsx was resolved. Rebased onto f0857d29c1 after #27920 landed, with no conflict.",
      "tests": "From ui/, NODE_OPTIONS=--max-old-space-size=4096, on b0657a05d5. B's own files plus the #27594 title-switcher files: Test Files 12 passed (12), Tests 84 passed (84). packages/plugin-list, plugin-grid, i18n, components navigation-overlay and record-list-face: Test Files 533 passed (533), Tests 5454 passed | 13 skipped (5467). app-shell, every file under ObjectView*, RecordDetailView*, recordDrawer*, objectView*, recordOpen*, record navigator, interface list and row click: Test Files 185 passed (185), Tests 1360 passed (1360). type-check exit 0 for plugin-list, plugin-grid, i18n, app-shell (dists rebuilt first). eslint on the 33 changed source and test files: 0 errors. check-i18n-call-site-keys, check-i18n-en-drift, check-i18n-dead-keys: exit 0. The whole app-shell package (1967 files) was not run as one set: it did not finish within 50 minutes in this container.",
      "gates": "dispatch-gates --commands on b0657a05d5 derived 67 families; each run with its exit code captured before any pipe; --ran reconciliation: 67 derived, 67 run, 0 NOT-MEASURED, 0 UNRUN, all exit 0 (record: gates-ran-B.txt in the seat's card-27545 folder). Four needed an environment fix and a re-run first: spec check:docs and check:skill-examples (exit 1/3 before pnpm --filter @objectstack/spec build), check:type-check-debt (exit 3 until pnpm install linked the @objectstack/types dependency main added to driver-odata), and pnpm --dir ui exec vitest run scripts/ (two 15 s timeouts in check-i18n-call-site-keys.test.ts under a parallel test run; alone: 169 passed | 2 skipped (171)). Hook checks run by hand: check-regen-pending and --pre-push, check-commit-card-trailers --pre-push: exit 0. CI families: cited from PR 28129's check-runs at ACCEPT.",
      "line_budget": "B: 1817 changed lines (+1448 / -369, 35 files) vs 3000: under. A was 1751.",
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "deviations": [
        "Screenshots on examples/app-crm (the accepted surface under #26676 ruling B 6520722066), not HotCRM: shots/b3-01..04 in the seat's card folder, taken on this head.",
        "Acceptance 3: the card thread runs one full proxy preview walk against the v4 boards on this head before the seat's ACCEPT (ruling B).",
        "B's ViewTabBar memoisation (objectViewTabBar.tsx) is not in this PR: #27943 deleted the file and the list no longer receives the strip, so nothing on that path re-renders the list.",
        "Main moved past f0857d29c1 after the push (about 19 commits; git merge-tree reports no conflict); not merged in, CI runs on the merge ref.",
        "The worktree has no core.hooksPath, so .githooks did not run on commit or push; their checks were run by hand (exit 0)."
      ],
      "files_changed": [
        ".changeset/27545-record-pane-v4.md",
        "content/docs/frontend/plugins/plugin-view.mdx",
        "ui/packages/app-shell/src/utils/recordOpenPreference.test.ts",
        "ui/packages/app-shell/src/utils/recordOpenPreference.ts",
        "ui/packages/app-shell/src/views/ObjectView.recordOpenDisplay-26681.test.tsx",
        "ui/packages/app-shell/src/views/ObjectView.recordOpenPreference-26677.test.tsx",
        "ui/packages/app-shell/src/views/ObjectView.recordPaneV4-27545.test.tsx",
        "ui/packages/app-shell/src/views/ObjectView.tsx",
        "ui/packages/app-shell/src/views/RecordDetailView.paneOpenAsPage-27545.test.tsx",
        "ui/packages/app-shell/src/views/RecordDetailView.tsx",
        "ui/packages/app-shell/src/views/__tests__/recordDrawerStack-26679.test.tsx",
        "ui/packages/app-shell/src/views/__tests__/recordDrawerStack.prefetch-27056.test.tsx",
        "ui/packages/app-shell/src/views/objectViewListRenderer.tsx",
        "ui/packages/app-shell/src/views/objectViewOpenAsPage.tsx",
        "ui/packages/app-shell/src/views/objectViewPluginSchema.ts",
        "ui/packages/app-shell/src/views/objectViewRecordNavigation.ts",
        "ui/packages/app-shell/src/views/objectViewRecordOverlay.tsx",
        "ui/packages/app-shell/src/views/recordDrawerContext.ts",
        "ui/packages/app-shell/src/views/recordDrawerStack.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-grid/src/ObjectGrid.tsx",
        "ui/packages/plugin-grid/src/__tests__/ObjectGrid.recordPaneFace-27545.test.tsx",
        "ui/packages/plugin-list/src/ListView.tsx",
        "ui/packages/plugin-list/src/__tests__/ListView.recordPaneCount-27545.test.tsx",
        "ui/packages/plugin-list/src/__tests__/ViewSettingsPopover.recordOpen-26681.test.tsx",
        "ui/packages/plugin-list/src/components/ViewSettingsPopover.tsx"
      ],
      "mcp_calls": "Reads only. In this stretch: issue_read 1, pull_request_read 1; the B preparation before a context compaction made further reads that are not recounted here. No MCP write tool.",
      "api_writes": "2: POST /repos/objectstack-ai/objectstack/dispatches (fleet-write pr_create, run 41062932142, PR 28129, body read back identical 12170 bytes, no assignees), and this comment via post-stamped. Plus a git push of the branch (recreated after the merged branch was deleted).",
      "open_questions": [],
      "out_of_scope_findings": [
        "Double-clicking the drawer divider resets the pane to 720 for that open but the remembered width survives to the next open (useDrawerResize, unchanged by #27545; seen in A's preview review 6521163553). Not carded; worth a check on main."
      ]
    }

    Generated by Claude Code

  11. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#2 · os-bill · session_01Utp6CY2n1JmZZKrHgtp9jC

    Landed · 2026-10-30T14:52Z

    probe reading
    PR #28129 merged through the queue at 2026-10-30T14:17Z, merge commit 277275aa42c44979a5fbbf5b38b346ff3a835582
    this card closed completed by the PR's Fixes line

    State: pm:dispatched removed; the assignee stays as the record of who carried it.


    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