Repository navigation
Description
domain:ui#4 · zhuangjianguo · session_01QsR2jR7ZFkpqmm4U8S1f9y
Filing gate: ④ coordination node, a per-flow child of maintainer card #29040, split as its triage comment orders ("the ui lane splits it when it claims, one child card per flow, each with Part of #29040") · filed by domain:ui#4 · ⛔ Not a claim.
Part of #29040.
Business reason (from #29040). objectstack-ai/mobile 2.0 hosts the Console in a WebView (objectstack-ai/mobile#144), so phone users get the Console's responsive layout and nothing else. This child covers the Lists flow: the list view, filters, search, row actions, and pull-to-refresh.
Ask. Drive the flow in a real browser at 375×812 and 390×844 against the showcase and CRM examples. Record what breaks and fix it. Check each of these:
- no horizontal page scroll;
- touch targets of at least 44 px;
- dialogs and drawers fit the viewport;
- the virtual keyboard does not cover the focused field;
- long lists stay responsive on a mid-range Android device profile (CPU throttling 4×).
Acceptance.
- A run record for this flow in the PR body: each check, pass or fail, at both widths, with the page and example it ran on.
- A fix for every failure, or a filed card for each failure this PR does not fix.
- Playwright coverage at a phone viewport is welcome where a fix lands, not required (Console at phone width: audit and fix the key flows at 375px (the mobile app now hosts the Console) #29040 requires it for Approvals and Record only).
- Screenshots before and after each fix stay in the project folder, not on GitHub.
Reader. domain:ui#1 (the ui lane split #29040 per flow: domain:ui#4 takes Approvals, Record and Forms; domain:ui#1 takes Lists, Navigation, Notifications, Dashboards and Auth). Size M. It runs after #28911 (phone list sort and search, in the merge queue) lands, and reads #29057 (the phone sort indicator) so the two do not fix the same toolbar twice.
Dedupe. Searched 375 in:title (0), phone in:title is:open (3: #29040, #28911, #29057), mobile width in:title (1: #29040), Part of #29040 (1: #29040). No per-flow child existed.
Links back: #29040, objectstack-ai/mobile#144.
Generated by Claude Code
Activity
objectstack-fleet commentedon Nov 2, 2026
domain:ui#1 · zhuangjianguo · session_01QsR2jUJ19MstFvFhjgiYTu
Claim: PM loop round 19 · 2026-11-02T08:03Z
Session:
session_01QsR2jUwDX3ZR6eBujakKoT(card thread, os-dev); dispatched by seat sessionsession_01QsR2jUJ19MstFvFhjgiYTuAccount:
zhuangjianguoBranch:
claude/project-thread-0nuqvb(platform-assigned to the card thread; it can push only this branch)Worktree:
objectstack-issue-29074Domain:
domain:uiSeat:
domain:ui#1File surface: Console files read only for the phone-width audit, plus a root
.changeset. The fix surface is declared by a claim amendment after the audit, before any code (stop on breach; explain in the report)Container & model: M,
mode:thread,model: default tier (dispatch-gates --tier: no path-derived mandate),effort: highClause-②: no
Metadata-protocol: none
Responsibility: the list flow at 375 and 390 px, audited then fixed; header chrome is #29075s and close targets are #29078s and #29107s
Thread-read: none
Premise: holds (at
origin/main6ada509d: the card names the phone list flow; the dev re-measures every finding on main before the fix list)Serial constraints cleared: #28911 landed as
f67bbeca(PR #29054). ListView.tsx and ViewSettingsPopover.tsx are also in open PR #29108 (#28915) and queued PR #29047 (#28908): build on main and merge main after each lands.objectstack-fleet commentedon Nov 2, 2026
domain:ui#1 · zhuangjianguo · session_01QsR2jUJ19MstFvFhjgiYTu
Claim amended · 2026-11-02T08:19Z · after the dev's audit (run record
/mnt/project-files/issue-29074/run-record-before.md,origin/maina4015ab4, real Console at/_consoleon app-crm and app-showcase with 400 seeded rows each, 375 and 390 px). This sets the fix surface and adds to the round 19 claim 6572134252 on this card. Branch, session and size are unchanged.ui/packages/plugin-list/src/ListView.tsx,ui/packages/plugin-list/src/components/ViewSettingsPopover.tsx,ui/packages/app-shell/src/views/objectViewTitleSwitcher.tsx,ui/packages/components/src/custom/filter-builder.tsx,ui/packages/components/src/custom/grouping-editor.tsx,ui/packages/components/src/custom/sort-builder.tsx(Phone list: an active sort shows nowhere on the toolbar once Sort moves into the Display panel, and the sort builder truncates field labels at phone width #29057),ui/packages/plugin-grid/src/ObjectGrid.tsx,ui/packages/mobile/src/usePullToRefresh.ts, their tests, and a root.changeset(patch). Every change applies belowsmonly, so desktop is unchanged. The L5 pager reuses the existingtable.*strings, with no new key. L6 arms only when every scroll box between the touch target and the bound element is at its top.ListView.tsx,ViewSettingsPopover.tsxandobjectViewTitleSwitcher.tsxare also in open PR feat(ui)!: a record opened from a list opens in the drawer by default, and the split pane retires #29108 (Record open: the drawer is the default and the split pane retires — the list keeps its full width, and a record opens only as the drawer or the page #28915), andListView.tsxis in List personalization: one visible 「已个性化」 marker and one reset that restores the whole list — today two reset entries cover different parts and neither says what changed #28950's build. Merge main after each lands. feat(plugin-list): an empty list offers "Clear filters" when the reader's own filter emptied it #29047 (List empty state: when the reader's own filter or search leaves no rows, offer 「清除筛选」 — today the copy says to clear them and the only button is 「添加记录」 #28908) has landed (b889c40a).sys_inbox_message) reached from Console at phone width: Notifications flow audit and fixes at 375 and 390 px #29076 is this generic list view, and L1 covers its toolbar.objectstack-fleet commentedon Nov 2, 2026
domain:ui#1 · zhuangjianguo · session_01QsR2jUJ19MstFvFhjgiYTu
Claim amended (2) · 2026-11-02T09:41Z · after seat 4's phone run for #29071 (PR #29210, report comment 6573777431) and the #29074 dev's read on
origin/mainafterea150b7f. This adds to the round 19 claim 6572134252 and amendment 6572419569. Branch, session and size are unchanged.objectViewRecordNavigation.ts(L233-246) pushes the record page with{from}but no pushed marker. On a phone,RecordDetailView's 「<」 therefore navigates forward to the list instead of popping. The fix adds[RECORD_PAGE_PUSHED_STATE]: true(fromrecordPagePush.ts) to that origin state, and the same line goes inobjectViewPluginSchema.ts(L99-111) for plugin views. The marker is read on the phone page only, so desktop is unchanged. This is the list's half of Console at phone width: Record flow audit and fixes at 375 and 390 px #29071's Back fix.ui/packages/app-shell/src/views/objectViewRecordNavigation.ts,ui/packages/app-shell/src/views/objectViewPluginSchema.ts, and one new unit test. List personalization: one visible 「已个性化」 marker and one reset that restores the whole list — today two reset entries cover different parts and neither says what changed #28950's build does not touch either file.plugin-grid/src/objectGridLinkCell.tsxLINK_CELL_CLASS). Fixing it makes every phone table row at least 44 px, a visible change to every embedded grid, so it is its own card. Opening a 151-row related tab takes 176-392 ms at CPU 4x, the same on main. That is render cost, not phone layout, and the dev lists it inout_of_scope_findings.objectstack-fleet commentedon Nov 2, 2026
domain:ui#1 · zhuangjianguo · session_01QsR2jUJ19MstFvFhjgiYTu
Claim amended (3) · 2026-11-02T09:45Z · adds to the round 19 claim 6572134252 and amendments 6572419569 and 6573926280. Branch, session and size are unchanged.
RecordDetailView's phone 「<」 label rule (phonePushed || (origin && !originIsObjectList), L4075) shows the view's name (「< All leads」) instead of the object plural that 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's Target 3 specifies (「< Leads」, pinned inphoneFace-27058). The Back behaviour is right either way.ui/packages/app-shell/src/views/RecordDetailView.tsx, for one condition only: the label keeps the object plural when the origin is the object's own list route. No other change to that file.objectstack-fleet commentedon Nov 2, 2026
domain:ui#1 · zhuangjianguo · session_01QsR2jUwDX3ZR6eBujakKoT
os-dev-report
{ "issue": 29074, "also_fixes": 29057, "status": "done", "branch": "claude/project-thread-0nuqvb", "pr": "https://github.com/objectstack-ai/objectstack/pull/29273", "head": "5692ba8d44c5c9d886c913186fa32b31100fbacc", "session": "session_01QsR2jUwDX3ZR6eBujakKoT", "premise_still_valid": true, "summary": "Audit first (main a4015ab4, production /_console, CRM and showcase, 375x812 and 390x844, isMobile + touch), fix list L1-L6 accepted, #29057 folded in, then the list-row Back fix from #29210's findings (amendments 6573926280, 6573994363). Fixed: 44 px targets on the list bar, view switcher menu, Filter/Sort/Display panels, Sort/Filter/Group builders and phone search; Filter, Sort and Display panels inset 16 px; sort and filter field selects take the whole row so labels show whole; a card pager under server pagination (50 of 403 before); pull-to-refresh only when every scroll box between touch and host is at top; the active sort keeps the Sort trigger with its count on the phone bar; a phone list-row push carries RECORD_PAGE_PUSHED_STATE so the record's back link pops the history, and its label keeps the object plural. After: every check passes at both widths on both examples except row actions on a phone card (L7, filed by the seat). Inbox page at 4x: the 279-341 ms frame is the list's first mount after network idle on a first visit; settled scroll frames 18-36 ms with no long task. Run records: /mnt/project-files/issue-29074/run-record-before.md, run-record-after.md, before/, after/.", "tests": "New: ListView.phoneWidth-29074, phoneCardPager-29074, usePullToRefresh.innerScroller-29074, list-builders-phone-width-29074, objectViewTitleSwitcher.phoneWidth-29074, objectViewRecordNavigation.phonePush-29074 (real RecordDetailView at 390). At 6641c3be: plugin-list, plugin-grid, mobile whole + 29 components builder files + 3 app-shell switcher files: 496 files / 4664 tests passed (narrowing for components and app-shell). Back commit: 6 files / 45 tests. At 5692ba8d after the second main merge: plugin-list, mobile whole + new files + record-page Back suites: 204 files / 1931 tests passed. Ablations: main's 8 source files -> first five new files 15 failed / 5 controls passed; each of the 3 Back edits ablated alone fails its cases (2, 1, 1). Live Back check on rebuilt prod at 375 and 390: pass.", "gates": "dispatch-gates --ran at ea6d9657: 35 derived, 35 run, 0 NOT-MEASURED, all exit 0 (check-sdui-manifest + self-test, ui vitest scripts/ 169 files, check:type-check-debt under lock); check-sdui-manifest re-run at 5692ba8d exit 0. turbo type-check of the 5 touched packages at 5692ba8d: 69/69. eslint on the 17 changed files: 0 errors. PR-body gates on the posted body: changeset-no-major, adr-0087, closing-keyword-parity, empty-changeset, partof-closing-keyword all 0. PR check-runs: starting at report time (mergeable_state blocked, not dirty).", "dogfood_battery": "n/a: no ! in the title and Clause-② is no", "line_budget": "1043 insertions, 57 deletions, 18 files; under 3000 lines, six-line 速读 in the body", "files_changed": [ "ui/packages/plugin-list/src/ListView.tsx", "ui/packages/plugin-list/src/components/ViewSettingsPopover.tsx", "ui/packages/app-shell/src/views/objectViewTitleSwitcher.tsx", "ui/packages/app-shell/src/views/objectViewRecordNavigation.ts", "ui/packages/app-shell/src/views/objectViewPluginSchema.ts", "ui/packages/app-shell/src/views/RecordDetailView.tsx (one condition)", "ui/packages/components/src/custom/sort-builder.tsx", "ui/packages/components/src/custom/filter-builder.tsx", "ui/packages/components/src/custom/grouping-editor.tsx", "ui/packages/mobile/src/usePullToRefresh.ts", "ui/packages/plugin-grid/src/ObjectGrid.tsx", "6 new test files", ".changeset/29074-phone-list-flow.md (new, patch x5, Clause-②: no, Metadata-protocol: none)" ], "deviations": [ "Two main merges: 6641c3be (#29108, clean) and 5692ba8d (#29189 edited ListView's imports; one import line resolved). Package suites and type-check re-run after each; the derived sweep re-ran at ea6d9657 (the second merge only brought main's own files).", "The CRM and showcase runs of one width ran at the same time, so 4x CPU figures are shared-box.", "objectViewPluginSchema has no phone flag, so its row push carries the marker at every width; the record page reads it on a phone only." ], "mcp_calls": "reads: pull_request_read get 29273", "api_writes": "git push x6 (not REST); relay x1 pr_create (#29273, read back identical, no assignees); this report comment x1 via post-stamped", "open_questions": [], "out_of_scope_findings": [ "class: performance; reach: #29210's phone run, opening a record's 151-row related tab takes 176-392 ms at 4x CPU on main and head alike; ui/packages/plugin-detail/src/RelatedList.tsx tab activation then ui/packages/plugin-grid/src/ObjectGrid.tsx render; needs a profile", "class: (a) touch target; reach: embedded grid primary-field link 22 px, ui/packages/plugin-grid/src/objectGridLinkCell.tsx:18-19 LINK_CELL_CLASS; carrier: #29219 (filed by seat 1)", "class: (b) layout; reach: phone card has no row-action control and long press opens the record (L7); carrier: the seat's separate card", "class: observation; reach: full inbox page at 4x, first visit's first frame 279-341 ms is the list mounting after network idle, not scroll; no carrier proposed" ] }Generated by Claude Code
objectstack-fleet commentedon Nov 2, 2026
domain:ui#1 · zhuangjianguo · session_01QsR2jUJ19MstFvFhjgiYTu
Claim: PM loop round 19 · 2026-11-02T11:03Z
Session:
session_01QsR2jUwDX3ZR6eBujakKoT(card thread, os-dev); dispatched by seat sessionsession_01QsR2jUJ19MstFvFhjgiYTuAccount:
zhuangjianguoBranch:
claude/project-thread-0nuqvb(platform-assigned to the card thread; it can push only this branch)Worktree:
objectstack-issue-29074Domain:
domain:uiSeat:
domain:ui#1File surface: the surface set by amendments 6572419569, 6573926280 and 6573994363 and carried by PR #29273:
ui/packages/plugin-list/src/ListView.tsx,ui/packages/plugin-list/src/components/ViewSettingsPopover.tsx,ui/packages/app-shell/src/views/objectViewTitleSwitcher.tsx,ui/packages/components/src/custom/filter-builder.tsx,ui/packages/components/src/custom/grouping-editor.tsx,ui/packages/components/src/custom/sort-builder.tsx(#29057),ui/packages/plugin-grid/src/ObjectGrid.tsx,ui/packages/mobile/src/usePullToRefresh.ts,ui/packages/app-shell/src/views/objectViewRecordNavigation.ts,ui/packages/app-shell/src/views/objectViewPluginSchema.ts,ui/packages/app-shell/src/views/RecordDetailView.tsx(the phone 「<」 label condition only), the icon-only Button census test for the new pager, their tests, and a root.changeset(stop on breach; explain in the report)Container & model: M,
mode:thread,model: default tier (dispatch-gates --tier: no path-derived mandate),effort: mediumClause-②: no
Metadata-protocol: none
Responsibility: restated so the newest Claim on this card names the branch for the PR guard (PR #29273); scope unchanged from the round 19 claim 6572134252 and its three amendments: the Lists flow passes the phone-width audit at 375 and 390 px
Thread-read: none
Premise: holds (at
origin/main9f120af9: the dev audit at a4015ab (run record /mnt/project-files/issue-29074/run-record-before.md), as amended)Serial constraints cleared: after #29108 (landed ea150b7); beside #28950 (PR #29266, ListView.tsx) and #29150 (ObjectGrid.tsx): whichever lands second merges main.
objectstack-fleet commentedon Nov 2, 2026
domain:ui#1 · zhuangjianguo · session_01QsR2jUJ19MstFvFhjgiYTu
Landed · 2026-11-02T13:20Z · PR #29273 merged through the merge queue as
46e24000at 2026-11-02T13:18Z (GitHub's clock). ACCEPT 6577322750 at headcc0e7090. The same PR closed #29057.46e24000~1)origin/main)RECORD_PAGE_PUSHED_STATEinui/packages/app-shell/src/views/objectViewRecordNavigation.tsobject-grid-card-pager(the phone card pager) inui/packages/plugin-grid/src/ObjectGrid.tsxscrolledBetween(the inner-scroller guard) inui/packages/mobile/src/usePullToRefresh.tsFixes #29074closed this card.pm:dispatchedcomes off in the same stroke as this note. No seat card waited on this PR.