Skip to content

feat(shell): card aligns to the message column + durable pending-approvals index (card UX round 2) - #931

Merged
lilyshen0722 merged 1 commit into
mainfrom
feat/approval-card-ux2
Aug 13, 2026
Merged

feat(shell): card aligns to the message column + durable pending-approvals index (card UX round 2)#931
lilyshen0722 merged 1 commit into
mainfrom
feat/approval-card-ux2

Conversation

@lilyshen0722

Copy link
Copy Markdown
Contributor

Sam's two flags on the live card, both structural:

Alignment — the card rendered flush with the row edge, 50px left of every bubble's text (measured: card at x=372, message text at x=422 — the .v2-msg grid's 38px avatar column + 12px gap that system rows skip). v2-msg--card gives it the content-column inset in lockstep with the grid; the card fills the column, so its box matches the bubbles' box exactly.

Findability — "can it be counted as a message so old unapproved ones are scrollable?" It IS a message (persists, scrolls) — but that's not durable enough: chat messages retire under the 30-day PG retention window while ApprovalAction rows never expire, so scroll-hunting is unreliable by construction. New GET /api/approvals/pending (pod-visibility read gate; deciding stays owner-only in /resolve) + an inspector Overview section listing flagged approvals with inline Approve/Decline for the owner, refreshing on the same messageCardUpdated socket event that patches chat. An approval stays findable and actionable forever, regardless of where its card scrolled — this is also the first brick of ADR-017's attention feed.

Tests: 3 route cases green locally; typecheck clean both tiers; browser check post-deploy.

🤖 Generated with Claude Code

https://claude.ai/code/session_01XeUH4HVDsDHYPsHJthXjB8

…ding-approvals index (card UX round 2)

Sam's two flags on the live card:

1. Alignment — the card rendered flush with the row edge, 50px left of every
   bubble's text (measured 372 vs 422: the .v2-msg grid's 38px avatar column
   + 12px gap that system rows skip). v2-msg--card gives it the content-column
   inset, in lockstep with the grid, and the card fills the column.

2. Findability — the card IS a message and scrolls with history, but chat
   messages retire under the 30-day PG retention window while ApprovalAction
   rows never expire, so scroll-hunting for old pending cards is unreliable
   BY CONSTRUCTION. New GET /api/approvals/pending (pod-visibility read gate;
   deciding stays owner-only in /resolve) + an inspector Overview section
   listing flagged approvals with inline Approve/Decline for the owner,
   live-refreshing on the same messageCardUpdated event that patches chat.

Tests: 3 route cases (member 200 + payload shape, non-viewer 403, bad podId
400) green locally; typecheck clean both tiers; frontend jest in CI.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XeUH4HVDsDHYPsHJthXjB8
@lilyshen0722
lilyshen0722 merged commit b149a43 into main Aug 13, 2026
11 checks passed
@lilyshen0722
lilyshen0722 deleted the feat/approval-card-ux2 branch August 13, 2026 08:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant