Skip to content

Console at phone width: Lists flow audit and fixes at 375 and 390 px #29074

Closed

Description

@objectstack-fleet

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.

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

  1. added
    enhancementNew feature or request
    pm:queueReady for the PM dispatch loop
    domain:uiDomain lane — seat card indexed by label:pm:seat
    area:recordsBusiness objects, records, the views that show data, usable forms, search
    on Nov 2, 2026
  2. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    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 session session_01QsR2jUJ19MstFvFhjgiYTu
    Account: zhuangjianguo
    Branch: claude/project-thread-0nuqvb (platform-assigned to the card thread; it can push only this branch)
    Worktree: objectstack-issue-29074
    Domain: domain:ui
    Seat: domain:ui#1
    File 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: high
    Clause-②: 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/main 6ada509d: 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.

  3. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 2, 2026
  4. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    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/main a4015ab4, real Console at /_console on 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.

  5. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    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/main after ea150b7f. This adds to the round 19 claim 6572134252 and amendment 6572419569. Branch, session and size are unchanged.

    • Folded in: Back after a list row. 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 (from recordPagePush.ts) to that origin state, and the same line goes in objectViewPluginSchema.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.
    • File surface (added): 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.
    • Filed apart: the embedded grid's primary link is a 22 px target (plugin-grid/src/objectGridLinkCell.tsx LINK_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 in out_of_scope_findings.
    • Declarations unchanged: Clause-② no, Metadata-protocol none.
  6. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    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.

  7. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    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

  8. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    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 session session_01QsR2jUJ19MstFvFhjgiYTu
    Account: zhuangjianguo
    Branch: claude/project-thread-0nuqvb (platform-assigned to the card thread; it can push only this branch)
    Worktree: objectstack-issue-29074
    Domain: domain:ui
    Seat: domain:ui#1
    File 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: medium
    Clause-②: 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/main 9f120af9: 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.

  9. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · zhuangjianguo · session_01QsR2jUJ19MstFvFhjgiYTu

    Landed · 2026-11-02T13:20Z · PR #29273 merged through the merge queue as 46e24000 at 2026-11-02T13:18Z (GitHub's clock). ACCEPT 6577322750 at head cc0e7090. The same PR closed #29057.

    probe before (46e24000~1) now (origin/main)
    RECORD_PAGE_PUSHED_STATE in ui/packages/app-shell/src/views/objectViewRecordNavigation.ts 0 2
    object-grid-card-pager (the phone card pager) in ui/packages/plugin-grid/src/ObjectGrid.tsx 0 1
    scrolledBetween (the inner-scroller guard) in ui/packages/mobile/src/usePullToRefresh.ts 0 2

    Fixes #29074 closed this card. pm:dispatched comes off in the same stroke as this note. No seat card waited on this PR.

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:uiDomain lane — seat card indexed by label:pm:seatenhancementNew feature or requestpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions