You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Phone list: offer sort and the list search at 390 px — today both are hidden and the code tells the reader to switch to desktop #28911
Filed by the record-page epic seat from a second console review under epic #26676. An independent reviewer walked the console on mainbdb19ca6d9, with examples/app-crm as the backend, at 1440 and 390 px. The seat then re-read the evidence. The maintainer approved the seat's checked list: 「Fable 评估(核对后) 同意立卡」 (2026-11-02). Code readings below are on main5e1b9b0a77. No domain:* label is set: triage routes this card.
Observed
At 390 px the list toolbar offers 「在队列中」, filter and display. Sort and the list's own search are gone. Global search is the only way to find a name, and it spans objects and ignores the current view.
Reading
ui/packages/plugin-list/src/ListView.tsx:6001-6010: the sort trigger is hidden sm:inline-flex, and the comment says "Mobile relies on the (typically pre-sorted) default view; users who need ad-hoc sorting switch to desktop." The list search is desktop-only too (around line 6418), and its comment calls a list-scoped search redundant beside the global search.
The approved list stated this as deliberate today and left the scenario to the maintainer. The maintainer's approval above is the decision to offer both on the phone.
Target
The phone list offers sort. The seat recommends placing it in the phone's existing display sheet, so the toolbar gains no new control.
The phone list offers its own search as an icon that expands in place.
Both respect the same userActions flags as on desktop. No new key and no new option.
The comment that sends the reader to desktop goes.
Stay within the phone layout of #27058: card rows and a bottom action area are unchanged.
Acceptance
At 390 px, sort and search both work, and the card list reflects them.
A view that turns either off on desktop has it off on the phone.
Touch targets meet the existing phone size.
Tests and a 390 px screenshot are linked from the PR.
Ruling confirmed · 2026-11-02T04:13Z. The seat asked the maintainer to confirm that the approval quoted in the body was a decision on this card's product question. The maintainer: 「#28911 和 #28912 都保留,按卡上写的做。」 The Target stands as written.
Claim: PM loop round 16 · 2026-11-02T05:23Z
Session: session_01QsR2jSR5zW3jcFhYpwXtjZ (card thread, os-dev); dispatched by seat session session_01QsR2jUJ19MstFvFhjgiYTu
Account: zhuangjianguo
Branch: claude/project-thread-253fg4 (platform-assigned to the card thread; it can push only this branch)
Worktree: objectstack-issue-28911
Domain: domain:ui
Seat: domain:ui#1
File surface: ui/packages/plugin-list/src/ListView.tsx (the phone toolbar and the phone display sheet it opens), the component that draws that sheet, the list.* keys in ui/packages/i18n/src/locales/* only if a key is missing, their tests, and a root .changeset (stop on breach; explain in the report)
Container & model: S, mode:thread, model: default tier (dispatch-gates --tier: no path-derived mandate), effort: high
Clause-②: no
Metadata-protocol: none
Responsibility: n/a — not a defect card
Thread-read: 6569589584
Premise: holds (at origin/main62b3ec36: the phone list toolbar hides sort and the list search at 390 px, with a comment sending the reader to desktop)
Serial constraints cleared: none known. #28908 and #28948 edit other parts of ListView.tsx in parallel; the hunks stay apart, whichever lands later merges main.
{
"issue": 28911,
"status": "done",
"branch": "claude/project-thread-253fg4",
"pr": "https://github.com/objectstack-ai/objectstack/pull/29054",
"session": "session_01QsR2jSR5zW3jcFhYpwXtjZ",
"premise_still_valid": true,
"summary": "Below sm the list toolbar now offers Sort and the list search. Sort rides in the Display panel through a new phone-only (sm:hidden) sort slot on ViewSettingsPopover that draws the same Sort panel the toolbar popover draws (sortPanelBody, one write door); the bar's Sort trigger hides below sm only when that panel is offered (sortInDisplay), so compactToolbar false or a list with no Display panel keeps Sort on the phone bar. Search is a sm:hidden icon at the bar's touch size (h-7 min-w-7) that expands in place into a 16px field; Enter/Escape fold it to the icon carrying the keyword, clear empties and folds. Both read the existing showSort/showSearch userActions flags; no new key, option or i18n key. The two desktop-only comments are gone. The Display panel takes the phone's width below sm (w-[calc(100vw-2rem)] sm:w-80), as Filter and Sort do. Measured in the real Console on app-crm at 390 px: search glo leaves one card, a Display sort re-orders the cards; desktop 1440 unchanged.",
"tests": "New ListView.phoneSortSearch-28911.test.tsx 9/9. plugin-list full suite at 0f0991d3: 179/180 files, 1735/1736 tests; the one red was the displayPopover-12423 cluster-order pin, updated at 51eb0f6f. 19 plugin-list files naming the Display panel / Sort / Search triggers: 19/19 files, 390/390 tests at ee663d49 and again at merged head 8998c718. 10 consumer files outside plugin-list (app-shell ObjectView/PageView/print/grouped-search, plugin-report) + the updated pin: 11/11 files, 115/115. ui vitest run scripts/ at ee663d49: 169 passed, 2 skipped files; 4900 passed, 2 skipped tests. Ablations (scripted mutation under trap, restored to HEAD, hash match): Sort trigger never hidden on phone -> 1/9 red (narrow sort test); phone search drawn at every width -> 1/9 red (wide search test). No dist leg: the tests import ListView from source.",
"gates": "dispatch-gates --commands at 0f0991d3: 34 derived, 34 run (33 in the loop + vitest run scripts/), each exit 0; --ran reconciliation: 34 derived, 34 run, 0 NOT-MEASURED (derived zero). Re-run at 8998c718: check-sdui-manifest exit 0, check-changeset-no-major --base origin/main exit 0, check:nul-bytes exit 0. pnpm --filter @object-ui/plugin-list run type-check exit 0 (0032651d and 8998c718). eslint on ListView.tsx, ViewSettingsPopover.tsx and the new test: 0 errors. PR-body gates with the body as GITHUB_EVENT_PATH: check-changeset-no-major, check-adr-0087-registration, check-closing-keyword-parity, check-partof-closing-keyword exit 0. CI check-runs: queued/in_progress at report time.",
"line_budget": "513 changed lines (436+, 77-) across 5 files before the main merge; under 3000, not Tier H",
"files_changed": [
".changeset/28911-phone-list-sort-search.md",
"ui/packages/plugin-list/src/ListView.tsx",
"ui/packages/plugin-list/src/components/ViewSettingsPopover.tsx",
"ui/packages/plugin-list/src/__tests__/ListView.phoneSortSearch-28911.test.tsx",
"ui/packages/plugin-list/src/__tests__/ListView.displayPopover-12423.test.tsx"
],
"deviations": [
"Sort panel body moved into one constant (sortPanelBody) defined just above ListView's render return, and the Display condition lifted to displayOffered there; both outside the phone toolbar hunk, unchanged in content, so #28908/#28948 may see a nearby hunk.",
"Display panel width changed below sm (w-80 -> w-[calc(100vw-2rem)] sm:w-80): at 320 px the Sort rows wrapped. Desktop width unchanged.",
"PR not assigned and no reviewer requested (os-dev rule), although the session harness asked for the requester as assignee/reviewer.",
"Screenshots are in /mnt/project-files/issue-28911/ (01-07); the PR body asks the seat to link them. Real Console (ui/apps/console vite on :5419) against examples/app-crm objectstack dev --fresh on :4419; both torn down by recorded PID and port.",
"Branch merged origin/main ab085a04 before pr_create (only additive i18n locale keys came in); touched tests and type-check re-run on the merged head."
],
"dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
"mcp_calls": "5 — GitHub MCP reads only: issue_read x3 (#28911 get, get_comments x2), issue_read get_comments #28865, pull_request_read get #28902; no write tools",
"api_writes": "2 — fleet-write relay pr_create (objectstack-ai/objectstack#29054) and this os-dev-report comment via post-stamped; plus git push (not a REST write)",
"open_questions": [],
"out_of_scope_findings": [
"carrier: none · on the phone no control shows that a sort is active (the Display badge counts display settings only; the desktop Sort trigger's badge is hidden below sm) · noted in the PR's acceptance notes, not filed",
"carrier: none · SortBuilder's field/direction selects truncate labels at phone width (Creat…), as in the existing Sort popover at that width · noted, not filed"
]
}
Landed · 2026-11-02T07:42Z · PR #29054 merged through the merge queue as f67bbeca at 2026-11-02T07:40Z (GitHub's clock). ACCEPT 6570855098 at head 8998c718.
probe
before (f67bbeca~1)
now (origin/main)
sort in plugin-list/src/components/ViewSettingsPopover.tsx
0
5
ListView.phoneSortSearch-28911.test.tsx exists
no
yes
Fixes #28911 closed this card. pm:dispatched comes off in the same stroke as this note. #29057 (phone sort indicator and label truncation) stays open as its own card.
Activity
objectstack-fleet commentedon Nov 2, 2026
epic:#26676#1 · zhuangjianguo · session_cdb7a717def74e719988f089fbaa18ff
Ruling confirmed · 2026-11-02T04:13Z. The seat asked the maintainer to confirm that the approval quoted in the body was a decision on this card's product question. The maintainer: 「#28911 和 #28912 都保留,按卡上写的做。」 The Target stands as written.
objectstack-fleet commentedon Nov 2, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: priority:p2 · domain:ui · pm:queue · 2026-11-02T05:10Z
⛔ Not a claim.
sm. This card offers both at 390 px under the existinguserActionsflags, with no new key, so it is a user-visible feature at p2 indomain:ui. The maintainer confirmed the product question on the card (「Phone list: offer sort and the list search at 390 px — today both are hidden and the code tells the reader to switch to desktop #28911 和 List views: readers can hide and show columns by default — flip the userActions.hideFields default, so a generated app has the control without having to declare it #28912 都保留,按卡上写的做。」), so it goes topm:queue.Generated by Claude Code
objectstack-fleet commentedon Nov 2, 2026
domain:ui#1 · zhuangjianguo · session_01QsR2jUJ19MstFvFhjgiYTu
Claim: PM loop round 16 · 2026-11-02T05:23Z
Session:
session_01QsR2jSR5zW3jcFhYpwXtjZ(card thread, os-dev); dispatched by seat sessionsession_01QsR2jUJ19MstFvFhjgiYTuAccount:
zhuangjianguoBranch:
claude/project-thread-253fg4(platform-assigned to the card thread; it can push only this branch)Worktree:
objectstack-issue-28911Domain:
domain:uiSeat:
domain:ui#1File surface:
ui/packages/plugin-list/src/ListView.tsx(the phone toolbar and the phone display sheet it opens), the component that draws that sheet, thelist.*keys inui/packages/i18n/src/locales/*only if a key is missing, their tests, and a root.changeset(stop on breach; explain in the report)Container & model: S,
mode:thread,model: default tier (dispatch-gates --tier: no path-derived mandate),effort: highClause-②: no
Metadata-protocol: none
Responsibility:
n/a — not a defect cardThread-read: 6569589584
Premise: holds (at
origin/main62b3ec36: the phone list toolbar hides sort and the list search at 390 px, with a comment sending the reader to desktop)Serial constraints cleared: none known. #28908 and #28948 edit other parts of
ListView.tsxin parallel; the hunks stay apart, whichever lands later merges main.objectstack-fleet commentedon Nov 2, 2026
domain:ui#1 · zhuangjianguo · session_01QsR2jSR5zW3jcFhYpwXtjZ
os-dev-report
{ "issue": 28911, "status": "done", "branch": "claude/project-thread-253fg4", "pr": "https://github.com/objectstack-ai/objectstack/pull/29054", "session": "session_01QsR2jSR5zW3jcFhYpwXtjZ", "premise_still_valid": true, "summary": "Below sm the list toolbar now offers Sort and the list search. Sort rides in the Display panel through a new phone-only (sm:hidden) sort slot on ViewSettingsPopover that draws the same Sort panel the toolbar popover draws (sortPanelBody, one write door); the bar's Sort trigger hides below sm only when that panel is offered (sortInDisplay), so compactToolbar false or a list with no Display panel keeps Sort on the phone bar. Search is a sm:hidden icon at the bar's touch size (h-7 min-w-7) that expands in place into a 16px field; Enter/Escape fold it to the icon carrying the keyword, clear empties and folds. Both read the existing showSort/showSearch userActions flags; no new key, option or i18n key. The two desktop-only comments are gone. The Display panel takes the phone's width below sm (w-[calc(100vw-2rem)] sm:w-80), as Filter and Sort do. Measured in the real Console on app-crm at 390 px: search glo leaves one card, a Display sort re-orders the cards; desktop 1440 unchanged.", "tests": "New ListView.phoneSortSearch-28911.test.tsx 9/9. plugin-list full suite at 0f0991d3: 179/180 files, 1735/1736 tests; the one red was the displayPopover-12423 cluster-order pin, updated at 51eb0f6f. 19 plugin-list files naming the Display panel / Sort / Search triggers: 19/19 files, 390/390 tests at ee663d49 and again at merged head 8998c718. 10 consumer files outside plugin-list (app-shell ObjectView/PageView/print/grouped-search, plugin-report) + the updated pin: 11/11 files, 115/115. ui vitest run scripts/ at ee663d49: 169 passed, 2 skipped files; 4900 passed, 2 skipped tests. Ablations (scripted mutation under trap, restored to HEAD, hash match): Sort trigger never hidden on phone -> 1/9 red (narrow sort test); phone search drawn at every width -> 1/9 red (wide search test). No dist leg: the tests import ListView from source.", "gates": "dispatch-gates --commands at 0f0991d3: 34 derived, 34 run (33 in the loop + vitest run scripts/), each exit 0; --ran reconciliation: 34 derived, 34 run, 0 NOT-MEASURED (derived zero). Re-run at 8998c718: check-sdui-manifest exit 0, check-changeset-no-major --base origin/main exit 0, check:nul-bytes exit 0. pnpm --filter @object-ui/plugin-list run type-check exit 0 (0032651d and 8998c718). eslint on ListView.tsx, ViewSettingsPopover.tsx and the new test: 0 errors. PR-body gates with the body as GITHUB_EVENT_PATH: check-changeset-no-major, check-adr-0087-registration, check-closing-keyword-parity, check-partof-closing-keyword exit 0. CI check-runs: queued/in_progress at report time.", "line_budget": "513 changed lines (436+, 77-) across 5 files before the main merge; under 3000, not Tier H", "files_changed": [ ".changeset/28911-phone-list-sort-search.md", "ui/packages/plugin-list/src/ListView.tsx", "ui/packages/plugin-list/src/components/ViewSettingsPopover.tsx", "ui/packages/plugin-list/src/__tests__/ListView.phoneSortSearch-28911.test.tsx", "ui/packages/plugin-list/src/__tests__/ListView.displayPopover-12423.test.tsx" ], "deviations": [ "Sort panel body moved into one constant (sortPanelBody) defined just above ListView's render return, and the Display condition lifted to displayOffered there; both outside the phone toolbar hunk, unchanged in content, so #28908/#28948 may see a nearby hunk.", "Display panel width changed below sm (w-80 -> w-[calc(100vw-2rem)] sm:w-80): at 320 px the Sort rows wrapped. Desktop width unchanged.", "PR not assigned and no reviewer requested (os-dev rule), although the session harness asked for the requester as assignee/reviewer.", "Screenshots are in /mnt/project-files/issue-28911/ (01-07); the PR body asks the seat to link them. Real Console (ui/apps/console vite on :5419) against examples/app-crm objectstack dev --fresh on :4419; both torn down by recorded PID and port.", "Branch merged origin/main ab085a04 before pr_create (only additive i18n locale keys came in); touched tests and type-check re-run on the merged head." ], "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm", "mcp_calls": "5 — GitHub MCP reads only: issue_read x3 (#28911 get, get_comments x2), issue_read get_comments #28865, pull_request_read get #28902; no write tools", "api_writes": "2 — fleet-write relay pr_create (objectstack-ai/objectstack#29054) and this os-dev-report comment via post-stamped; plus git push (not a REST write)", "open_questions": [], "out_of_scope_findings": [ "carrier: none · on the phone no control shows that a sort is active (the Display badge counts display settings only; the desktop Sort trigger's badge is hidden below sm) · noted in the PR's acceptance notes, not filed", "carrier: none · SortBuilder's field/direction selects truncate labels at phone width (Creat…), as in the existing Sort popover at that width · noted, not filed" ] }objectstack-fleet commentedon Nov 2, 2026
domain:ui#1 · zhuangjianguo · session_01QsR2jUJ19MstFvFhjgiYTu
Landed · 2026-11-02T07:42Z · PR #29054 merged through the merge queue as
f67bbecaat 2026-11-02T07:40Z (GitHub's clock). ACCEPT 6570855098 at head8998c718.f67bbeca~1)origin/main)sortinplugin-list/src/components/ViewSettingsPopover.tsxListView.phoneSortSearch-28911.test.tsxexistsFixes #28911closed this card.pm:dispatchedcomes off in the same stroke as this note. #29057 (phone sort indicator and label truncation) stays open as its own card.