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
List grid Actions column: a visible low-emphasis ⋯ on every row at rest, instead of a header over a column that looks empty until the pointer hovers a row #28871
Filed by the record-page epic seat, part of epic #26676. The seat walked the console on mainc064d3a246, with examples/app-crm as the backend, at 1440 / 1100 / 375 px, light and dark. An independent review pass then checked each finding against the code. The maintainer ruled on the reviewed list and said 「按这 6 张清单在 epic #26676 下立卡,裁决原话引在卡上。」 and 「还有刚才立的卡可以交给ui车道处理吗?」 (2026-11-02). So this card goes to the domain:ui lane queue. Priority and area:* are left to triage. Code readings below are on main3b920f6dd0.
Observed
On the lead and opportunity lists at 1440 px, the last column is headed 操作, and the cells under it are empty until the pointer is over a row. A reader takes the column for "no actions available".
Reading
The header is always drawn: ui/packages/plugin-grid/src/objectGridActionsColumn.tsx:181, t('grid.actions').
The trigger is hidden at rest on a fine pointer: ui/packages/plugin-grid/src/components/RowActionMenu.tsx:731, opacity-0 … group-hover/row:opacity-100.
On touch (pointer-coarse:opacity-100) it is already visible. This card is about desktop.
Target
The row's ⋯ trigger is visible at rest in a muted tone, and full strength on row hover, focus, selection or an open menu.
One state for every pointer type: the header and the buttons are present together.
Claim: PM loop round 12 · 2026-11-02T03:34Z
Session: session_01QsR2jSUCWFfGqhaRR97caT (card thread, os-dev); dispatched by seat session session_01QsR2jUJ19MstFvFhjgiYTu
Account: zhuangjianguo
Branch: claude/project-thread-i24ri9 (platform-assigned to the card thread; it can push only this branch)
Worktree: objectstack-issue-28871
Domain: domain:ui
Seat: domain:ui#1
File surface: ui/packages/plugin-grid/src/components/RowActionMenu.tsx (the at-rest opacity of the row trigger), ui/packages/plugin-grid/src/objectGridActionsColumn.tsx only if the header needs to change, their tests, and a root .changeset; server and packages/spec read only (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: 6567976964
Premise: holds (at origin/mainb15b634c: RowActionMenu.tsx:731 draws the trigger opacity-0 at rest on a fine pointer; objectGridActionsColumn.tsx:181 always draws the grid.actions header)
Serial constraints cleared: none known (#28865, seat 4, inherits this later and is not touched here).
{
"issue": 28871,
"status": "done",
"branch": "claude/project-thread-i24ri9",
"pr": "https://github.com/objectstack-ai/objectstack/pull/28922",
"session": "session_01QsR2jSUCWFfGqhaRR97caT",
"premise_still_valid": true,
"summary": "RowActionMenu's row trigger (data-testid row-action-trigger, drawn per row by the list grid's _actions column) is now drawn at rest on every row and every pointer type in text-muted-foreground, and turns text-foreground on group-hover/row, group-focus-within/row, group-data-[state=selected]/row, data-[state=open], focus-visible and pointer-coarse (seat order: coarse pointer keeps full strength). opacity-0 / transition-opacity are gone; the tone is a text colour so the resting glyph keeps muted-foreground contrast. Menu set, gates and order (useRowActionPlan, #28434), inline primaries, empty-menu guard, 44 px target and accessible name unchanged; objectGridActionsColumn.tsx not touched. New pin RowActionMenu.atRest-28871.test.tsx (4 cases). Premise held at origin/main b15b634c. File surface: RowActionMenu.tsx, its new test, .changeset/28871-row-action-trigger-at-rest.md (patch, Clause-②: no, Metadata-protocol: none) -- no breach.",
"tests": "At 7d467519 under os-verify-lock after turbo build plugin-grid^... + formula/sdui-parser/lint/client (49 tasks, exit 0): ui vitest packages/plugin-grid/ --maxWorkers=2 -> Test Files 271 passed (271), Tests 2353 passed (2353); RowActionMenu* 5 files 81 passed. pnpm --filter @object-ui/plugin-grid run type-check (tsc + tsconfig.test.json) exit 0. ESLint on 2 changed tsx exit 0. Ablation via scripts/ablation-replace.mjs (source-resolved, no dist): opacity-0 back at rest -> 1 failed / 3 passed ('is drawn at rest: nothing hides it before the pointer reaches the row'); pointer-coarse:text-foreground -> pointer-coarse:opacity-100 -> 1 failed / 3 passed; both restored, blob adea0869 == HEAD, git diff HEAD empty. Not run locally: plugin-view / plugin-designer / app-shell tests that click row-action-trigger by test id (they read no classes); CI Test UI.",
"gates": "dispatch-gates --commands at 7d467519: 34 derived, 34 run, each exit 0 (check:type-check-debt and pnpm --dir ui exec vitest run scripts/ under the lock, the latter 169 passed / 2 skipped); PR-body gates re-run on the final body as GITHUB_EVENT_PATH (changeset-no-major, adr-0087-registration, closing-keyword-parity, empty-changeset) exit 0; check-partof-closing-keyword with PR_BODY exit 0; ui check:new-line-citations 0 new. --ran: 34 derived, 34 run, 0 NOT-MEASURED, 0 UNRUN. CI at pr_create: 17 in_progress, 3 skipped, 0 failed.",
"dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
"mcp_calls": "5 — issue_read x2 (get, get_comments), pull_request_read x1 (get_check_runs), ToolSearch loads x2; no write tool",
"api_writes": "3 — git push (branch), fleet-write pr_create (POST /repos/objectstack-ai/objectstack/dispatches -> relay run 41387897655, PR #28922, body read back 6263/6263 identical, no assignees), this os-dev-report comment via post-stamped",
"open_questions": [],
"out_of_scope_findings": [
"class: none (consistency note, not filed) · carrier: seat · ui/packages/components data-table.tsx draws its own row-actions trigger (data-testid data-table-row-actions, generic data-table schema rowActions) with the old opacity-0 hover-reveal set, pinned by data-table-leadingCell-12423.test.tsx; app-shell objectViewOpenAsPage.tsx has a hover-revealed control in the same style. Outside this card's file surface; noted in the PR's Acceptance notes. dedupe words: data-table-row-actions, opacity-0 hover reveal, row actions at rest"
]
}
Landed · 2026-11-02T04:52Z · PR #28922 merged through the merge queue as ff881050 at 2026-11-02T04:52Z (GitHub's clock). ACCEPT 6569159443 at head 7d467519.
probe
before (ff881050~1)
now (origin/main)
row trigger class starting sm:min-w-0 opacity-0 in plugin-grid/src/components/RowActionMenu.tsx
1
0
row trigger class starting sm:min-w-0 text-muted-foreground in the same file
0
1
RowActionMenu.atRest-28871.test.tsx exists
no
yes
Fixes #28871 closed this card. pm:dispatched comes off in the same stroke as this note. The data-table renderer's twin is #28923.
Activity
objectstack-fleet commentedon Nov 2, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: p2 ·
domain:ui· 2026-11-02T02:59Z⛔ Not a claim.
Generated by Claude Code
objectstack-fleet commentedon Nov 2, 2026
domain:ui#1 · zhuangjianguo · session_01QsR2jUJ19MstFvFhjgiYTu
Claim: PM loop round 12 · 2026-11-02T03:34Z
Session:
session_01QsR2jSUCWFfGqhaRR97caT(card thread, os-dev); dispatched by seat sessionsession_01QsR2jUJ19MstFvFhjgiYTuAccount:
zhuangjianguoBranch:
claude/project-thread-i24ri9(platform-assigned to the card thread; it can push only this branch)Worktree:
objectstack-issue-28871Domain:
domain:uiSeat:
domain:ui#1File surface:
ui/packages/plugin-grid/src/components/RowActionMenu.tsx(the at-rest opacity of the row trigger),ui/packages/plugin-grid/src/objectGridActionsColumn.tsxonly if the header needs to change, their tests, and a root.changeset; server andpackages/specread only (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: 6567976964
Premise: holds (at
origin/mainb15b634c:RowActionMenu.tsx:731draws the triggeropacity-0at rest on a fine pointer;objectGridActionsColumn.tsx:181always draws thegrid.actionsheader)Serial constraints cleared: none known (#28865, seat 4, inherits this later and is not touched here).
objectstack-fleet commentedon Nov 2, 2026
domain:ui#1 · zhuangjianguo · session_01QsR2jSUCWFfGqhaRR97caT
os-dev-report
{ "issue": 28871, "status": "done", "branch": "claude/project-thread-i24ri9", "pr": "https://github.com/objectstack-ai/objectstack/pull/28922", "session": "session_01QsR2jSUCWFfGqhaRR97caT", "premise_still_valid": true, "summary": "RowActionMenu's row trigger (data-testid row-action-trigger, drawn per row by the list grid's _actions column) is now drawn at rest on every row and every pointer type in text-muted-foreground, and turns text-foreground on group-hover/row, group-focus-within/row, group-data-[state=selected]/row, data-[state=open], focus-visible and pointer-coarse (seat order: coarse pointer keeps full strength). opacity-0 / transition-opacity are gone; the tone is a text colour so the resting glyph keeps muted-foreground contrast. Menu set, gates and order (useRowActionPlan, #28434), inline primaries, empty-menu guard, 44 px target and accessible name unchanged; objectGridActionsColumn.tsx not touched. New pin RowActionMenu.atRest-28871.test.tsx (4 cases). Premise held at origin/main b15b634c. File surface: RowActionMenu.tsx, its new test, .changeset/28871-row-action-trigger-at-rest.md (patch, Clause-②: no, Metadata-protocol: none) -- no breach.", "tests": "At 7d467519 under os-verify-lock after turbo build plugin-grid^... + formula/sdui-parser/lint/client (49 tasks, exit 0): ui vitest packages/plugin-grid/ --maxWorkers=2 -> Test Files 271 passed (271), Tests 2353 passed (2353); RowActionMenu* 5 files 81 passed. pnpm --filter @object-ui/plugin-grid run type-check (tsc + tsconfig.test.json) exit 0. ESLint on 2 changed tsx exit 0. Ablation via scripts/ablation-replace.mjs (source-resolved, no dist): opacity-0 back at rest -> 1 failed / 3 passed ('is drawn at rest: nothing hides it before the pointer reaches the row'); pointer-coarse:text-foreground -> pointer-coarse:opacity-100 -> 1 failed / 3 passed; both restored, blob adea0869 == HEAD, git diff HEAD empty. Not run locally: plugin-view / plugin-designer / app-shell tests that click row-action-trigger by test id (they read no classes); CI Test UI.", "gates": "dispatch-gates --commands at 7d467519: 34 derived, 34 run, each exit 0 (check:type-check-debt and pnpm --dir ui exec vitest run scripts/ under the lock, the latter 169 passed / 2 skipped); PR-body gates re-run on the final body as GITHUB_EVENT_PATH (changeset-no-major, adr-0087-registration, closing-keyword-parity, empty-changeset) exit 0; check-partof-closing-keyword with PR_BODY exit 0; ui check:new-line-citations 0 new. --ran: 34 derived, 34 run, 0 NOT-MEASURED, 0 UNRUN. CI at pr_create: 17 in_progress, 3 skipped, 0 failed.", "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm", "mcp_calls": "5 — issue_read x2 (get, get_comments), pull_request_read x1 (get_check_runs), ToolSearch loads x2; no write tool", "api_writes": "3 — git push (branch), fleet-write pr_create (POST /repos/objectstack-ai/objectstack/dispatches -> relay run 41387897655, PR #28922, body read back 6263/6263 identical, no assignees), this os-dev-report comment via post-stamped", "open_questions": [], "out_of_scope_findings": [ "class: none (consistency note, not filed) · carrier: seat · ui/packages/components data-table.tsx draws its own row-actions trigger (data-testid data-table-row-actions, generic data-table schema rowActions) with the old opacity-0 hover-reveal set, pinned by data-table-leadingCell-12423.test.tsx; app-shell objectViewOpenAsPage.tsx has a hover-revealed control in the same style. Outside this card's file surface; noted in the PR's Acceptance notes. dedupe words: data-table-row-actions, opacity-0 hover reveal, row actions at rest" ] }objectstack-fleet commentedon Nov 2, 2026
domain:ui#1 · zhuangjianguo · session_01QsR2jUJ19MstFvFhjgiYTu
Landed · 2026-11-02T04:52Z · PR #28922 merged through the merge queue as
ff881050at 2026-11-02T04:52Z (GitHub's clock). ACCEPT 6569159443 at head7d467519.ff881050~1)origin/main)sm:min-w-0 opacity-0inplugin-grid/src/components/RowActionMenu.tsxsm:min-w-0 text-muted-foregroundin the same fileRowActionMenu.atRest-28871.test.tsxexistsFixes #28871closed this card.pm:dispatchedcomes off in the same stroke as this note. Thedata-tablerenderer's twin is #28923.