chore: sync upstream → personal fork (20260616)#117
Conversation
High priority: - NEEDS_APPROVAL dot: change from amber (same as STOPPED) to primary blue with a faster pulse (1.2s) so at-a-glance scanning distinguishes "needs your action" from "manually stopped" - Actions toolbar: reveal on :focus-within in addition to :hover so keyboard users can reach the ··· button (WCAG 2.4.7) - Elapsed column: prefix with ⏱ icon (aria-hidden) so the column is self-labeling without a visible header; show — when no timestamp Medium priority: - Differentiate three amber warning chips: Tests Failing gets a softer style (bg-only border, normal weight); Rate Limited becomes neutral blue-gray — urgency tiers are now visually distinct - Fix SubStatusChip JSDoc: accurately documents that SessionRow filters out IDLE/READY (they're not dead code — just suppressed in list view) - Left-border collision: rowMemoryPressure switches from borderInlineStart to a warningBg background tint so it no longer competes with the active/paused left accents; rowActive and rowPaused switch to borderInlineStart for RTL safety - Memory empty state: show — instead of blank gap, consistent with diff column Low / polish: - Spinner reduced-motion fallback: solid filled dot instead of static arc fragment for prefers-reduced-motion: reduce users - Elapsed gridWidth: "32px" → "auto" so longer values (14d) never clip - Add nameRow and elapsedIcon to SessionRow.css.ts (elapsedIcon extracted; nameRow available for any caller needing the flex name row layout) - Approval chip icon: ● → ⚠ (semantically signals attention needed) - RTL: border-left → border-inline-start on active/paused row accents Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- BulkActions: show "Click sessions to select them" hint when nothing is selected instead of hiding the bar entirely; remove Stop Selected button; fix aria-live feedback div - SessionRow: li→div[role=listitem], human-readable STATUS_DOT_LABELS for aria-label/tooltip, diff badge aria-label with +/- counts, actions group gets role="group" - SessionCard.css.ts: edit-tags button visible on touch + focus-visible; add creation spinner keyframe animation - SessionCard.tsx: import creationSpinner - SessionListEmptyState: consolidate hint into single sentence Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
✅ Registry ValidationTest Coverage: 97/143 features have
|
UX Analysis
|
Go Benchmarks (Tier 1) |
📊 Feature E2E CoverageFeature coverage report unavailable
|
E2E RPC Latency |
Frontend Terminal Throughput |
div[role="listitem"] inside a virtualizer div[role="presentation"] fails Axe's aria-required-parent check because presentation doesn't fully suppress the wrapper from the accessibility tree. Native <li> inside div[role="list"] is validated correctly by browsers without the ARIA parent constraint. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
🎬 E2E Feature Demos2 shard(s) recorded feature flows for this PR. recordings shard 1 Demo preview opens directly in browser (single-file HTML). Raw WebM recordings in ZIP. Expires after 30 days. |
✅ Registry ValidationTest Coverage: 97/143 features have
|
…virtualizer wrapper Both div[role=listitem] (critical: aria-required-parent) and native <li> (serious: listitem rule) fail Axe Core 4.11 when wrapped in a div[role=presentation] virtualizer row, because Axe's required-parent traversal stops at presentation boundaries. Fix: remove role=presentation from the virtualizer wrapper div in SessionList (it becomes a plain generic div, transparent to AT) so Axe can walk up from div[role=listitem] through the plain wrapper to div[role=list] — satisfying aria-required-parent without violating the listitem native-element rule. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- BulkActions: remove onStopAll (button removed), add role/aria attributes, hint text when nothing selected, fix aria-live feedback - SessionCard.css.ts: touch/focus visibility for edit tags button, creation spinner animation respecting prefers-reduced-motion - SessionCard.tsx: creation spinner, various a11y fixes - SessionList.tsx: remove role=presentation from virtualizer wrapper (resolves Axe aria-required-parent on listitem) - SessionRow.tsx: div[role=listitem] + HTMLTextAreaElement keyboard guard - Modal.tsx: minor accessibility fix Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
✅ Registry ValidationTest Coverage: 97/143 features have
|
… conflict div[role=list] with mixed role=heading and role=listitem children in a flat virtualizer fails Axe aria-required-children (list can only contain listitem). This conflict is inherent to flat virtualization of grouped lists and cannot be resolved with ARIA list roles. Remove role=list from the virtualizer container and role=listitem from session rows. The container keeps its aria-label="Sessions, N items" and each row keeps its descriptive aria-label="Session X, status: Y", giving screen readers full context without invalid list semantics. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
✅ Registry ValidationTest Coverage: 97/143 features have
|
What's new from upstream (TylerStaplerAtFanatics/stapler-squad)
This is the paired sync PR bringing upstream changes into the personal fork. The merge branch was built from the fork HEAD, so the fork's own commits are already included.
Upstream changes reconciled:
Conflict resolutions
None — upstream/main was a strict ancestor of the fork at the time of branching; auto-merge was clean.
Pair PR
Fork → upstream: TylerStaplerAtFanatics/stapler-squad#127