Skip to content

Clarify sidebar live state and reply indicators - #692

Open
pratikbuilds wants to merge 6 commits into
corbitsdev:mainfrom
pratikbuilds:cl-543-sidebar-avatar-activity
Open

Clarify sidebar live state and reply indicators#692
pratikbuilds wants to merge 6 commits into
corbitsdev:mainfrom
pratikbuilds:cl-543-sidebar-avatar-activity

Conversation

@pratikbuilds

@pratikbuilds pratikbuilds commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

Conversation rows now keep the avatar, title, timestamp, and latest-message preview in a compact layout, with a neutral selected background and the actions menu inside the row.

  • Show an orange avatar orbit while an agent turn is running, and a green “Reply ready” check for a completed unread agent reply. Opening the conversation clears the check; reduced motion uses a static arc.
  • Derive the row’s live state from real turns, matching replies, and read cursors instead of message recency. Bulk queries and a two-second list refresh keep background conversations current.

Validation: bun run check passed, including database suites after provisioning their isolated test database. Focused PostgreSQL live-state tests and Greybeard/Critique reviews passed. Browser checks covered live replies, unread clearing, light/dark states, stable row dimensions, and mouse/keyboard menu access.

Related to #543. Screenshot evidence below shows the production sidebar component with deterministic test conversations.

@pratikbuilds

Copy link
Copy Markdown
Contributor Author

Current sidebar design: selected working row with an orange orbit and in-row menu, idle row, and unread completed reply with a green check. Captured from the production component using test conversations.

Sidebar showing working, idle, and reply-ready conversation states

@pratikbuilds
pratikbuilds force-pushed the cl-543-sidebar-avatar-activity branch from c636642 to 88c619e Compare September 8, 2026 08:38
@pratikbuilds
pratikbuilds force-pushed the cl-543-sidebar-avatar-activity branch from 88c619e to e57d7d7 Compare September 8, 2026 08:41
@pratikbuilds pratikbuilds changed the title Clarify sidebar conversation activity and reply states Clarify sidebar live state and reply indicators Sep 8, 2026
@TheGreatAxios

TheGreatAxios commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

Recommendation: correct the freshness description and address the test/accessibility follow-ups. The original polling blocker is withdrawn.

Updated after a factual second pass. The activity computation lives in the domain package and uses tenant-scoped bulk reads. It is asynchronous and performs store reads, not a pure function. The indicators have accessible labels and a reduced-motion path.

Corrections and actionable findings

  1. The PR body promises a refresh mechanism that is absent, but this is not a base-to-head regression. apps/web/src/shell/bench-activity.ts:73 is identical at base and head. Commit 90cbe50 removes polling introduced earlier in this PR; the final implementation retains the existing refresh policy. Correct the two-second-refresh claim in the PR body. If background freshness is an acceptance criterion, explicitly agree and test that behavior rather than treating restoration of polling as automatically required. The new DESIGN.md:15 paragraph does not promise polling.

  2. Distinguish accessible labels from live announcements. The indicators at apps/web/src/shell/workbench-list.tsx:334 have role="img" and accessible labels. This component adds no live announcement for state transitions; that is not equivalent to screen readers receiving nothing. Removing the former avatar aria-hidden wrapper at apps/web/src/shell/workbench-list.tsx:326 also exposes a redundant name. Check the accessibility tree and intended announcement behavior before claiming exact spoken output or a conformance failure.

  3. The menu hit area is reduced. apps/web/src/app.css:1679 removes the previous 8px pseudo-element expansion from the 1.6rem trigger defined at apps/web/src/app.css:642. At a 16px root, this is approximately 41.6px to 25.6px. Consider preserving the larger hit area while keeping the visual control inside the row. This reduction alone does not establish a WCAG minimum-target violation.

  4. Add assertions for unread-badge suppression. apps/web/test/workbench-list.test.tsx:213 does not pin the badge being present for idle/unread and absent for reply-ready. Those cases would protect the new suppression branch. Also review apps/web/src/app.css:1683: focus-within visibility: hidden hides the unread count as well as the timestamp, including from the accessibility tree.

Validation limits / withdrawn claims

  • Cross-window state can remain stale until the next refetch, but indefinite staleness was overstated. Successful read-state writes invalidate local lists at packages/chat-ui/src/workbench-timeline-view.ts:95; this PR does not remove existing cross-window synchronization.
  • The original numerical contrast verdicts, near-invisible-fill claim, and stable-rendered-dimensions claim were not browser-verified by this audit. Treat contrast and selected-state consistency as visual checks still needed, not established failures.
  • Requiring a separate design PR is process advice, not a correctness finding.

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.

2 participants