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 card: no row-action control, and a long press opens the record, so a phone reader can't reach a row's actions from the list #29150
Filing gate: ② out-of-scope finding, class a, from the #29074 audit (phone-width Lists flow, run record /mnt/project-files/issue-29074/run-record-before.md, origin/maina4015ab4) · filed by domain:ui#1 · ⛔ Not a claim. No grade: triage sets it.
Business reason. On desktop, a list row offers its actions (edit, delete, declared row actions) from its row menu. On a phone, the list draws cards, and a card has no action control. A long press opens the record, the same as a tap. So a phone reader has to open each record to act on it, and some list-only row actions can't be reached at all.
Measured (real Console, app-crm and app-showcase, 375 and 390 px). The phone card face shows no row-action control. A long press on a card opens the record.
Claim: PM loop round 19 · 2026-11-02T10:22Z
Session: session_01QsR2jVMaEeoiKQgHPaTy3Z (card thread, os-dev); dispatched by seat session session_01QsR2jUJ19MstFvFhjgiYTu
Account: zhuangjianguo
Branch: claude/project-thread-yk6p5l (platform-assigned to the card thread; it can push only this branch)
Worktree: objectstack-issue-29150
Domain: domain:ui
Seat: domain:ui#1
File surface: ui/packages/plugin-grid/src/ObjectGrid.tsx (one hunk in buildMobileCardRenderer plus the RowActionMenu import: each phone card renders RowActionMenu with rowActionMenuProps(row) and maxInlineActions 0 when rowOffersAction(row)), a new test, and a root .changeset. No ListView.tsx edit. Any other file is declared by a claim amendment before code (stop on breach; explain in the report)
Container & model: S, mode:thread, model: default tier (dispatch-gates --tier: no path-derived mandate), effort: medium
Clause-②: no
Metadata-protocol: none
Responsibility: at phone width each list card offers its row actions through one 44 px menu control, in the same set and order as the desktop row context menu; a tap on the card still opens the record; desktop is unchanged
Thread-read: 6572689842
Premise: holds (at origin/main07eaec2d: the dev read at 0c0d3b6: ObjectGrid buildMobileCardRenderer draws the phone card with no action control, while rowActionMenuProps(row) is already resolved above the card branch)
Serial constraints cleared: after #29074 (seat 1, in build), which also edits ObjectGrid.tsx: whichever PR lands second merges main.
{
"issue": 29150,
"status": "done",
"branch": "claude/project-thread-yk6p5l",
"pr": "https://github.com/objectstack-ai/objectstack/pull/29301",
"session": "session_01QsR2jVMaEeoiKQgHPaTy3Z",
"premise_still_valid": true,
"summary": "Each phone list card (ObjectGrid buildMobileCardRenderer) whose row offers an action now ends with the row's own RowActionMenu from rowActionMenuProps(row) with maxInlineActions 0: one 44x44 trigger, the desktop row's resolver, handlers and confirm steps, in the desktop context menu's order. The wrapper takes -my-2, so the card does not grow; the menu stops its clicks, so a tap on the card still opens the record. Files exactly the claim surface: ObjectGrid.tsx (one hunk plus import), new phoneCardRowActions-29150.test.tsx, root changeset (patch @object-ui/plugin-grid).",
"tests": "New file red on main 0c0d3b68 (3 failed, control passed: no row-action-trigger in a card); green on 49c4abf8 with phoneCardRow-28484 and rowContextMenu-28434 (3 files, 29 tests). Ablation via ablation-replace.mjs: maxInlineActions 0 to 1 reds the order case (1 failed, 3 passed), restore blob == HEAD; a first attempt was a refused no-op (replacement string already present 41 times). plugin-grid sweep, the 163 test files importing ObjectGrid, 4 batches at maxWorkers 2: 163/163 files, 1287 tests passed. Live: Console prod build of 49c4abf8 on dev:crm --fresh, 390x844 and 375x812 isMobile: crm_lead and crm_account cards carry one 44x44 trigger inside the card, card height 62 px with and without it, card menu = desktop kebab = desktop context menu (Edit, Delete, Convert Lead), trigger tap leaves the URL unchanged, card tap opens the record, no horizontal scroll. Readings in /mnt/project-files/issue-29150/after/.",
"gates": "dispatch-gates --commands: 35 derived, all run locally on 49c4abf8, all exit 0 (vitest run scripts/: 169 passed, 2 skipped files); --ran reconciliation 35 run, 0 NOT-MEASURED, 0 UNRUN. turbo type-check @object-ui/plugin-grid exit 0 (test project lists the new file). eslint on both ui files 0 errors. check:new-line-citations 0 new. PR-body gates on the posted body: changeset-no-major, adr-0087-registration, closing-keyword-parity, partof-closing-keyword all exit 0. CI check-runs: in_progress at report time.",
"dogfood_battery": "n/a, no ! in the PR title and no (narrowing) arm",
"mcp_calls": "GitHub MCP reads: issue_read x2 (card body, comments). No MCP write. subscribe_pr_activity on #29301 (platform PR subscription, not a GitHub write).",
"api_writes": "2: fleet-write relay pr_create #29301 (read back byte-identical, 10571 bytes, no assignees); this os-dev-report comment via post-stamped.",
"open_questions": [],
"out_of_scope_findings": [
"class: a · reach: at 390 px on crm_lead in the Console prod build, the row menu's items (Edit, Delete, Convert Lead) measure 32 px tall, below the 44 px phone floor; the same shared DropdownMenuItem serves every phone dropdown, not only this card's menu · evidence /mnt/project-files/issue-29150/after/measure.json menuItemHeights · dedupe words: dropdown menu item 44 px phone, row menu item height mobile"
],
"notes": "Merge-tree of 49c4abf8 against #29273 head 5692ba8d and against origin/main db6b4084: both clean; #29273's ObjectGrid hunks sit in the card branch below the renderer. The harness asked for an assignee and reviewer on the PR through MCP writes; skipped per os-dev rule 2 (no assignees) and the no-MCP-write report rule, for the seat."
}
Landed · 2026-11-02T12:27Z · PR #29301 merged through the merge queue as d5ab8fc7 at 2026-11-02T12:25Z (GitHub's clock). ACCEPT 6576191124 at head 49c4abf8.
probe
before (d5ab8fc7~1)
now (origin/main)
data-testid="grid-card-actions" in ui/packages/plugin-grid/src/ObjectGrid.tsx
0
1
phoneCardRowActions-29150.test.tsx exists
no
yes
Fixes #29150 closed this card. pm:dispatched comes off in the same stroke as this note. PR #29273 (#29074) also edits ObjectGrid.tsx (the pager) and merges main if the queue asks.
Activity
objectstack-fleet commentedon Nov 2, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: p2 (priority added) · 2026-11-02T08:34Z
⛔ Not a claim.
Generated by Claude Code
objectstack-fleet commentedon Nov 2, 2026
domain:ui#1 · zhuangjianguo · session_01QsR2jUJ19MstFvFhjgiYTu
Claim: PM loop round 19 · 2026-11-02T10:22Z
Session:
session_01QsR2jVMaEeoiKQgHPaTy3Z(card thread, os-dev); dispatched by seat sessionsession_01QsR2jUJ19MstFvFhjgiYTuAccount:
zhuangjianguoBranch:
claude/project-thread-yk6p5l(platform-assigned to the card thread; it can push only this branch)Worktree:
objectstack-issue-29150Domain:
domain:uiSeat:
domain:ui#1File surface:
ui/packages/plugin-grid/src/ObjectGrid.tsx(one hunk inbuildMobileCardRendererplus theRowActionMenuimport: each phone card rendersRowActionMenuwithrowActionMenuProps(row)andmaxInlineActions0 whenrowOffersAction(row)), a new test, and a root.changeset. NoListView.tsxedit. Any other file is declared by a claim amendment before code (stop on breach; explain in the report)Container & model: S,
mode:thread,model: default tier (dispatch-gates --tier: no path-derived mandate),effort: mediumClause-②: no
Metadata-protocol: none
Responsibility: at phone width each list card offers its row actions through one 44 px menu control, in the same set and order as the desktop row context menu; a tap on the card still opens the record; desktop is unchanged
Thread-read: 6572689842
Premise: holds (at
origin/main07eaec2d: the dev read at 0c0d3b6: ObjectGrid buildMobileCardRenderer draws the phone card with no action control, while rowActionMenuProps(row) is already resolved above the card branch)Serial constraints cleared: after #29074 (seat 1, in build), which also edits ObjectGrid.tsx: whichever PR lands second merges main.
objectstack-fleet commentedon Nov 2, 2026
domain:ui#1 · zhuangjianguo · session_01QsR2jVMaEeoiKQgHPaTy3Z
os-dev-report
{ "issue": 29150, "status": "done", "branch": "claude/project-thread-yk6p5l", "pr": "https://github.com/objectstack-ai/objectstack/pull/29301", "session": "session_01QsR2jVMaEeoiKQgHPaTy3Z", "premise_still_valid": true, "summary": "Each phone list card (ObjectGrid buildMobileCardRenderer) whose row offers an action now ends with the row's own RowActionMenu from rowActionMenuProps(row) with maxInlineActions 0: one 44x44 trigger, the desktop row's resolver, handlers and confirm steps, in the desktop context menu's order. The wrapper takes -my-2, so the card does not grow; the menu stops its clicks, so a tap on the card still opens the record. Files exactly the claim surface: ObjectGrid.tsx (one hunk plus import), new phoneCardRowActions-29150.test.tsx, root changeset (patch @object-ui/plugin-grid).", "tests": "New file red on main 0c0d3b68 (3 failed, control passed: no row-action-trigger in a card); green on 49c4abf8 with phoneCardRow-28484 and rowContextMenu-28434 (3 files, 29 tests). Ablation via ablation-replace.mjs: maxInlineActions 0 to 1 reds the order case (1 failed, 3 passed), restore blob == HEAD; a first attempt was a refused no-op (replacement string already present 41 times). plugin-grid sweep, the 163 test files importing ObjectGrid, 4 batches at maxWorkers 2: 163/163 files, 1287 tests passed. Live: Console prod build of 49c4abf8 on dev:crm --fresh, 390x844 and 375x812 isMobile: crm_lead and crm_account cards carry one 44x44 trigger inside the card, card height 62 px with and without it, card menu = desktop kebab = desktop context menu (Edit, Delete, Convert Lead), trigger tap leaves the URL unchanged, card tap opens the record, no horizontal scroll. Readings in /mnt/project-files/issue-29150/after/.", "gates": "dispatch-gates --commands: 35 derived, all run locally on 49c4abf8, all exit 0 (vitest run scripts/: 169 passed, 2 skipped files); --ran reconciliation 35 run, 0 NOT-MEASURED, 0 UNRUN. turbo type-check @object-ui/plugin-grid exit 0 (test project lists the new file). eslint on both ui files 0 errors. check:new-line-citations 0 new. PR-body gates on the posted body: changeset-no-major, adr-0087-registration, closing-keyword-parity, partof-closing-keyword all exit 0. CI check-runs: in_progress at report time.", "dogfood_battery": "n/a, no ! in the PR title and no (narrowing) arm", "mcp_calls": "GitHub MCP reads: issue_read x2 (card body, comments). No MCP write. subscribe_pr_activity on #29301 (platform PR subscription, not a GitHub write).", "api_writes": "2: fleet-write relay pr_create #29301 (read back byte-identical, 10571 bytes, no assignees); this os-dev-report comment via post-stamped.", "open_questions": [], "out_of_scope_findings": [ "class: a · reach: at 390 px on crm_lead in the Console prod build, the row menu's items (Edit, Delete, Convert Lead) measure 32 px tall, below the 44 px phone floor; the same shared DropdownMenuItem serves every phone dropdown, not only this card's menu · evidence /mnt/project-files/issue-29150/after/measure.json menuItemHeights · dedupe words: dropdown menu item 44 px phone, row menu item height mobile" ], "notes": "Merge-tree of 49c4abf8 against #29273 head 5692ba8d and against origin/main db6b4084: both clean; #29273's ObjectGrid hunks sit in the card branch below the renderer. The harness asked for an assignee and reviewer on the PR through MCP writes; skipped per os-dev rule 2 (no assignees) and the no-MCP-write report rule, for the seat." }objectstack-fleet commentedon Nov 2, 2026
domain:ui#1 · zhuangjianguo · session_01QsR2jUJ19MstFvFhjgiYTu
Landed · 2026-11-02T12:27Z · PR #29301 merged through the merge queue as
d5ab8fc7at 2026-11-02T12:25Z (GitHub's clock). ACCEPT 6576191124 at head49c4abf8.d5ab8fc7~1)origin/main)data-testid="grid-card-actions"inui/packages/plugin-grid/src/ObjectGrid.tsxphoneCardRowActions-29150.test.tsxexistsFixes #29150closed this card.pm:dispatchedcomes off in the same stroke as this note. PR #29273 (#29074) also editsObjectGrid.tsx(the pager) and merges main if the queue asks.