Skip to content

chore: sync upstream → personal fork (20260616)#117

Merged
tstapler merged 7 commits into
mainfrom
merge/upstream-20260616
Jun 16, 2026
Merged

chore: sync upstream → personal fork (20260616)#117
tstapler merged 7 commits into
mainfrom
merge/upstream-20260616

Conversation

@tstapler

Copy link
Copy Markdown
Owner

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:

  • CI baseline updates (benchmarks, E2E GIFs) generated by upstream's CI pipeline

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

tstapler and others added 3 commits June 16, 2026 09:38
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>
@github-actions

Copy link
Copy Markdown
Contributor

✅ Registry Validation

Registry Validation
===================

Building backend scanner...
Scanning backend features...
Wrote 108 feature files to /tmp/tmp.QnNwcqUa1a/backend
Wrote 14 feature files to /tmp/tmp.QnNwcqUa1a/backend
Wrote 22 feature files to /tmp/tmp.QnNwcqUa1a/backend
Wrote 6 feature files to /tmp/tmp.QnNwcqUa1a/backend

=== Backend Registry Diff ===
Committed: 143  Generated: 141  Divergence: 1.4%
⚠️  Removed RPCs:
  - backlog:spawn-session-autonomous
  - upload:image
⚠️  101 feature(s) missing // +api: marker (markerFound: false)

⚠️  Divergence 1.4% above warning threshold.

Test Coverage: 97/143 features have testIds (67.8%)

Divergence > 2% blocks merges. Coverage reporting is advisory only.

@github-actions

github-actions Bot commented Jun 16, 2026

Copy link
Copy Markdown
Contributor

UX Analysis

Check Status Details
❌ Axe Core (WCAG 2.1 AA) failure Critical/serious violations block merge
⚠️ Lighthouse Performance Score: unknown Warning if < 70 (non-blocking)
🤖 Claude UX Analysis Advisory See docs/qa/ for findings

Axe Core excludes terminal rendering areas (intentional design).
Lighthouse runs in desktop preset for this developer tool.

@github-actions

github-actions Bot commented Jun 16, 2026

Copy link
Copy Markdown
Contributor

Go Benchmarks (Tier 1)

benchmarks/go/tier1-baseline.txt:6: parsing iteration count: invalid syntax
benchmarks/go/tier1-baseline.txt:2380: parsing iteration count: invalid syntax
benchmarks/go/tier1-baseline.txt:4776: parsing iteration count: invalid syntax
benchmarks/go/tier1-baseline.txt:7158: parsing iteration count: invalid syntax
benchmarks/go/tier1-baseline.txt:9557: parsing iteration count: invalid syntax
benchmarks/go/tier1-baseline.txt:11966: parsing iteration count: invalid syntax
benchmarks/go/tier1-baseline.txt:14319: parsing iteration count: invalid syntax
benchmarks/go/tier1-baseline.txt:16422: parsing iteration count: invalid syntax
benchmarks/go/tier1-baseline.txt:18752: parsing iteration count: invalid syntax
benchmarks/go/tier1-baseline.txt:27076: parsing iteration count: invalid syntax
benchmarks/go/tier1-baseline.txt:34810: parsing iteration count: invalid syntax
benchmarks/go/tier1-baseline.txt:43065: parsing iteration count: invalid syntax
benchmarks/go/tier1-baseline.txt:51058: parsing iteration count: invalid syntax
benchmarks/go/tier1-baseline.txt:59440: parsing iteration count: invalid syntax
benchmarks/go/tier1-baseline.txt:68376: parsing iteration count: invalid syntax
benchmarks/go/tier1-baseline.txt:77244: parsing iteration count: invalid syntax
benchmarks/go/tier1-baseline.txt:85595: parsing iteration count: invalid syntax
benchmarks/go/tier1-baseline.txt:92566: parsing iteration count: invalid syntax
benchmarks/go/tier1-baseline.txt:99002: parsing iteration count: invalid syntax
benchmarks/go/tier1-baseline.txt:105802: parsing iteration count: invalid syntax
benchmarks/go/tier1-baseline.txt:112989: parsing iteration count: invalid syntax
benchmarks/go/tier1-baseline.txt:119640: parsing iteration count: invalid syntax
benchmarks/go/tier1-baseline.txt:125990: parsing iteration count: invalid syntax
benchmarks/go/tier1-baseline.txt:132316: parsing iteration count: invalid syntax
benchmarks/go/tier1-baseline.txt:139214: parsing iteration count: invalid syntax
benchmarks/go/tier1-baseline.txt:147629: parsing iteration count: invalid syntax
benchmarks/go/tier1-baseline.txt:156509: parsing iteration count: invalid syntax
benchmarks/go/tier1-baseline.txt:165467: parsing iteration count: invalid syntax
benchmarks/go/tier1-baseline.txt:174159: parsing iteration count: invalid syntax
benchmarks/go/tier1-baseline.txt:182724: parsing iteration count: invalid syntax
benchmarks/go/tier1-baseline.txt:191943: parsing iteration count: invalid syntax
benchmarks/go/tier1-baseline.txt:201089: parsing iteration count: invalid syntax
benchmarks/go/tier1-baseline.txt:210077: parsing iteration count: invalid syntax
benchmarks/go/tier1-baseline.txt:218924: parsing iteration count: invalid syntax
benchmarks/go/tier1-baseline.txt:227695: parsing iteration count: invalid syntax
benchmarks/go/tier1-baseline.txt:236263: parsing iteration count: invalid syntax
benchmarks/go/tier1-baseline.txt:245251: parsing iteration count: invalid syntax
benchmarks/go/tier1-baseline.txt:253750: parsing iteration count: invalid syntax
benchmarks/go/tier1-baseline.txt:263072: parsing iteration count: invalid syntax
benchmarks/go/tier1-baseline.txt:271871: parsing iteration count: invalid syntax
tier1-bench.txt:6: parsing iteration count: invalid syntax
tier1-bench.txt:2006: parsing iteration count: invalid syntax
tier1-bench.txt:4019: parsing iteration count: invalid syntax
tier1-bench.txt:6002: parsing iteration count: invalid syntax
tier1-bench.txt:8024: parsing iteration count: invalid syntax
tier1-bench.txt:10017: parsing iteration count: invalid syntax
tier1-bench.txt:12038: parsing iteration count: invalid syntax
tier1-bench.txt:14031: parsing iteration count: invalid syntax
tier1-bench.txt:16060: parsing iteration count: invalid syntax
tier1-bench.txt:22485: parsing iteration count: invalid syntax
tier1-bench.txt:28393: parsing iteration count: invalid syntax
tier1-bench.txt:35170: parsing iteration count: invalid syntax
tier1-bench.txt:41845: parsing iteration count: invalid syntax
tier1-bench.txt:48377: parsing iteration count: invalid syntax
tier1-bench.txt:54894: parsing iteration count: invalid syntax
tier1-bench.txt:61699: parsing iteration count: invalid syntax
tier1-bench.txt:68728: parsing iteration count: invalid syntax
tier1-bench.txt:74096: parsing iteration count: invalid syntax
tier1-bench.txt:79192: parsing iteration count: invalid syntax
tier1-bench.txt:84067: parsing iteration count: invalid syntax
tier1-bench.txt:89628: parsing iteration count: invalid syntax
tier1-bench.txt:95056: parsing iteration count: invalid syntax
tier1-bench.txt:100415: parsing iteration count: invalid syntax
tier1-bench.txt:105970: parsing iteration count: invalid syntax
tier1-bench.txt:111751: parsing iteration count: invalid syntax
tier1-bench.txt:118363: parsing iteration count: invalid syntax
tier1-bench.txt:125313: parsing iteration count: invalid syntax
tier1-bench.txt:132699: parsing iteration count: invalid syntax
tier1-bench.txt:139488: parsing iteration count: invalid syntax
tier1-bench.txt:146528: parsing iteration count: invalid syntax
tier1-bench.txt:153157: parsing iteration count: invalid syntax
tier1-bench.txt:159708: parsing iteration count: invalid syntax
tier1-bench.txt:166523: parsing iteration count: invalid syntax
tier1-bench.txt:174601: parsing iteration count: invalid syntax
tier1-bench.txt:182643: parsing iteration count: invalid syntax
tier1-bench.txt:189887: parsing iteration count: invalid syntax
tier1-bench.txt:197074: parsing iteration count: invalid syntax
tier1-bench.txt:204165: parsing iteration count: invalid syntax
tier1-bench.txt:211547: parsing iteration count: invalid syntax
tier1-bench.txt:219974: parsing iteration count: invalid syntax
goos: linux
goarch: amd64
pkg: github.com/tstapler/stapler-squad/session
cpu: AMD EPYC 9V74 80-Core Processor                
                                            │ benchmarks/go/tier1-baseline.txt │          tier1-bench.txt           │
                                            │              sec/op              │   sec/op     vs base               │
GetTimeSinceLastMeaningfulOutput_HotPath-4                         54.36n ± 1%   70.18n ± 1%  +29.11% (p=0.000 n=8)
GetTimeSinceLastMeaningfulOutput_ColdPath-4                        32.57n ± 1%   42.12n ± 0%  +29.31% (p=0.000 n=8)
geomean                                                            42.08n        54.37n       +29.21%

                                            │ benchmarks/go/tier1-baseline.txt │          tier1-bench.txt           │
                                            │               B/op               │    B/op     vs base                │
GetTimeSinceLastMeaningfulOutput_HotPath-4                        0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=8) ¹
GetTimeSinceLastMeaningfulOutput_ColdPath-4                       0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=8) ¹
geomean                                                                      ²               +0.00%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

                                            │ benchmarks/go/tier1-baseline.txt │          tier1-bench.txt           │
                                            │            allocs/op             │ allocs/op   vs base                │
GetTimeSinceLastMeaningfulOutput_HotPath-4                        0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=8) ¹
GetTimeSinceLastMeaningfulOutput_ColdPath-4                       0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=8) ¹
geomean                                                                      ²               +0.00%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

pkg: github.com/tstapler/stapler-squad/session/detection/ratelimit
                              │ benchmarks/go/tier1-baseline.txt │          tier1-bench.txt           │
                              │              sec/op              │   sec/op     vs base               │
StripANSI_PlainText-4                                5.329n ± 5%   6.918n ± 3%  +29.82% (p=0.000 n=8)
StripANSI_WithEscapes-4                              520.2n ± 1%   657.2n ± 1%  +26.33% (p=0.000 n=8)
ProcessOutput_InactiveState-4                        5.133n ± 0%   6.615n ± 1%  +28.86% (p=0.000 n=8)
geomean                                              24.23n        31.10n       +28.33%

                              │ benchmarks/go/tier1-baseline.txt │          tier1-bench.txt           │
                              │               B/op               │    B/op     vs base                │
StripANSI_PlainText-4                               0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=8) ¹
StripANSI_WithEscapes-4                             136.0 ± 0%     136.0 ± 0%       ~ (p=1.000 n=8) ¹
ProcessOutput_InactiveState-4                       0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=8) ¹
geomean                                                        ²               +0.00%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

                              │ benchmarks/go/tier1-baseline.txt │          tier1-bench.txt           │
                              │            allocs/op             │ allocs/op   vs base                │
StripANSI_PlainText-4                               0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=8) ¹
StripANSI_WithEscapes-4                             5.000 ± 0%     5.000 ± 0%       ~ (p=1.000 n=8) ¹
ProcessOutput_InactiveState-4                       0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=8) ¹
geomean                                                        ²               +0.00%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

pkg: github.com/tstapler/stapler-squad/session/queue
                              │ benchmarks/go/tier1-baseline.txt │           tier1-bench.txt           │
                              │              sec/op              │    sec/op     vs base               │
ReviewQueue_ConcurrentReads-4                       63.57n ± 12%   93.41n ± 13%  +46.93% (p=0.000 n=8)
ReviewQueue_Add-4                                   370.8n ±  1%   466.9n ±  1%  +25.92% (p=0.000 n=8)
geomean                                             153.5n         208.8n        +36.02%

                              │ benchmarks/go/tier1-baseline.txt │          tier1-bench.txt           │
                              │               B/op               │    B/op     vs base                │
ReviewQueue_ConcurrentReads-4                       0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=8) ¹
ReviewQueue_Add-4                                   640.0 ± 0%     640.0 ± 0%       ~ (p=1.000 n=8) ¹
geomean                                                        ²               +0.00%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

                              │ benchmarks/go/tier1-baseline.txt │          tier1-bench.txt           │
                              │            allocs/op             │ allocs/op   vs base                │
ReviewQueue_ConcurrentReads-4                       0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=8) ¹
ReviewQueue_Add-4                                   4.000 ± 0%     4.000 ± 0%       ~ (p=1.000 n=8) ¹
geomean                                                        ²               +0.00%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

pkg: github.com/tstapler/stapler-squad/session/scrollback
                                      │ benchmarks/go/tier1-baseline.txt │           tier1-bench.txt           │
                                      │              sec/op              │    sec/op     vs base               │
CircularBuffer_ConcurrentReadWrite-4                         2.517µ ± 1%    3.109µ ± 1%  +23.52% (p=0.000 n=8)
CircularBuffer_BurstAppend-4                                 82.28µ ± 0%   105.01µ ± 0%  +27.61% (p=0.000 n=8)
CircularBuffer_GetLastN_LargeBuffer-4                        13.27µ ± 5%    16.09µ ± 3%  +21.20% (p=0.000 n=8)
CircularBuffer_GetRange_Sequential-4                         7.895µ ± 5%    9.149µ ± 2%  +15.88% (p=0.000 n=8)
CircularBufferAppend-4                                       82.25n ± 0%   103.20n ± 0%  +25.47% (p=0.000 n=8)
CircularBufferGetLastN-4                                     1.476µ ± 2%    1.755µ ± 1%  +18.91% (p=0.000 n=8)
CircularBufferConcurrentAppend-4                             104.6n ± 2%    137.8n ± 2%  +31.69% (p=0.000 n=8)
geomean                                                      2.231µ         2.753µ       +23.37%

                                      │ benchmarks/go/tier1-baseline.txt │           tier1-bench.txt            │
                                      │               B/op               │     B/op      vs base                │
CircularBuffer_ConcurrentReadWrite-4                        6.062Ki ± 0%   6.062Ki ± 0%       ~ (p=1.000 n=8) ¹
CircularBuffer_BurstAppend-4                                62.50Ki ± 0%   62.50Ki ± 0%       ~ (p=1.000 n=8) ¹
CircularBuffer_GetLastN_LargeBuffer-4                       56.00Ki ± 0%   56.00Ki ± 0%       ~ (p=1.000 n=8) ¹
CircularBuffer_GetRange_Sequential-4                        28.00Ki ± 0%   28.00Ki ± 0%       ~ (p=1.000 n=8) ¹
CircularBufferAppend-4                                        24.00 ± 0%     24.00 ± 0%       ~ (p=1.000 n=8) ¹
CircularBufferGetLastN-4                                    6.000Ki ± 0%   6.000Ki ± 0%       ~ (p=1.000 n=8) ¹
CircularBufferConcurrentAppend-4                              32.00 ± 0%     32.00 ± 0%       ~ (p=1.000 n=8) ¹
geomean                                                     3.077Ki        3.077Ki       +0.00%
¹ all samples are equal

                                      │ benchmarks/go/tier1-baseline.txt │           tier1-bench.txt           │
                                      │            allocs/op             │  allocs/op   vs base                │
CircularBuffer_ConcurrentReadWrite-4                          2.000 ± 0%    2.000 ± 0%       ~ (p=1.000 n=8) ¹
CircularBuffer_BurstAppend-4                                 1.000k ± 0%   1.000k ± 0%       ~ (p=1.000 n=8) ¹
CircularBuffer_GetLastN_LargeBuffer-4                         1.000 ± 0%    1.000 ± 0%       ~ (p=1.000 n=8) ¹
CircularBuffer_GetRange_Sequential-4                          1.000 ± 0%    1.000 ± 0%       ~ (p=1.000 n=8) ¹
CircularBufferAppend-4                                        1.000 ± 0%    1.000 ± 0%       ~ (p=1.000 n=8) ¹
CircularBufferGetLastN-4                                      1.000 ± 0%    1.000 ± 0%       ~ (p=1.000 n=8) ¹
CircularBufferConcurrentAppend-4                              1.000 ± 0%    1.000 ± 0%       ~ (p=1.000 n=8) ¹
geomean                                                       2.962         2.962       +0.00%
¹ all samples are equal

                             │ benchmarks/go/tier1-baseline.txt │           tier1-bench.txt           │
                             │               B/s                │     B/s       vs base               │
CircularBuffer_BurstAppend-4                       741.8Mi ± 1%   581.3Mi ± 5%  -21.64% (p=0.000 n=8)

pkg: github.com/tstapler/stapler-squad/session/tmux
                             │ benchmarks/go/tier1-baseline.txt │          tier1-bench.txt           │
                             │              sec/op              │   sec/op     vs base               │
StripANSICodes_PlainText-4                          4.923n ± 6%   6.399n ± 7%  +29.98% (p=0.000 n=8)
StripANSICodes_WithEscapes-4                        464.7n ± 1%   597.6n ± 0%  +28.61% (p=0.000 n=8)
IsBanner_PlainText-4                                351.8n ± 1%   452.0n ± 1%  +28.48% (p=0.000 n=8)
geomean                                             93.01n        120.0n       +29.02%

                             │ benchmarks/go/tier1-baseline.txt │          tier1-bench.txt           │
                             │               B/op               │    B/op     vs base                │
StripANSICodes_PlainText-4                         0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=8) ¹
StripANSICodes_WithEscapes-4                       56.00 ± 0%     56.00 ± 0%       ~ (p=1.000 n=8) ¹
IsBanner_PlainText-4                               0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=8) ¹
geomean                                                       ²               +0.00%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

                             │ benchmarks/go/tier1-baseline.txt │          tier1-bench.txt           │
                             │            allocs/op             │ allocs/op   vs base                │
StripANSICodes_PlainText-4                         0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=8) ¹
StripANSICodes_WithEscapes-4                       4.000 ± 0%     4.000 ± 0%       ~ (p=1.000 n=8) ¹
IsBanner_PlainText-4                               0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=8) ¹
geomean                                                       ²               +0.00%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

pkg: github.com/tstapler/stapler-squad/session/tokens
                                   │ benchmarks/go/tier1-baseline.txt │          tier1-bench.txt           │
                                   │              sec/op              │   sec/op     vs base               │
TokenParser_ProcessUserEntry-4                            4.563m ± 3%   5.520m ± 1%  +20.96% (p=0.000 n=8)
DetectCommandsInText/NoSlash-4                            5.195n ± 2%   6.691n ± 2%  +28.79% (p=0.000 n=8)
DetectCommandsInText/WithCommand-4                        1.167µ ± 1%   1.444µ ± 0%  +23.69% (p=0.000 n=8)
geomean                                                   3.024µ        3.764µ       +24.44%

                                   │ benchmarks/go/tier1-baseline.txt │           tier1-bench.txt            │
                                   │               B/op               │     B/op      vs base                │
TokenParser_ProcessUserEntry-4                         11.02Mi ± 0%     11.02Mi ± 0%       ~ (p=0.060 n=8)
DetectCommandsInText/NoSlash-4                           0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=8) ¹
DetectCommandsInText/WithCommand-4                       434.0 ± 0%       433.0 ± 0%       ~ (p=0.132 n=8)
geomean                                                             ²                 -0.08%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

                                   │ benchmarks/go/tier1-baseline.txt │          tier1-bench.txt           │
                                   │            allocs/op             │ allocs/op   vs base                │
TokenParser_ProcessUserEntry-4                           34.00 ± 0%     34.00 ± 0%       ~ (p=1.000 n=8) ¹
DetectCommandsInText/NoSlash-4                           0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=8) ¹
DetectCommandsInText/WithCommand-4                       6.000 ± 0%     6.000 ± 0%       ~ (p=1.000 n=8) ¹
geomean                                                             ²               +0.00%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

pkg: github.com/tstapler/stapler-squad/session/unfinished
                               │ benchmarks/go/tier1-baseline.txt │          tier1-bench.txt           │
                               │              sec/op              │   sec/op     vs base               │
DiffShortstat/GitVCSReader-4                          2.710m ± 2%   3.360m ± 1%  +23.99% (p=0.000 n=8)
DiffShortstat/GoGitVCSReader-4                        63.41n ± 0%   81.88n ± 1%  +29.12% (p=0.000 n=8)
DiffShortstatCached-4                                 64.11n ± 2%   81.75n ± 4%  +27.51% (p=0.000 n=8)
geomean                                               2.225µ        2.823µ       +26.86%

                               │ benchmarks/go/tier1-baseline.txt │           tier1-bench.txt            │
                               │               B/op               │     B/op      vs base                │
DiffShortstat/GitVCSReader-4                       56.58Ki ± 0%     56.59Ki ± 0%       ~ (p=0.063 n=8)
DiffShortstat/GoGitVCSReader-4                       0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=8) ¹
DiffShortstatCached-4                                0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=8) ¹
geomean                                                         ²                 +0.01%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

                               │ benchmarks/go/tier1-baseline.txt │          tier1-bench.txt           │
                               │            allocs/op             │ allocs/op   vs base                │
DiffShortstat/GitVCSReader-4                         368.0 ± 0%     368.0 ± 0%       ~ (p=1.000 n=8)
DiffShortstat/GoGitVCSReader-4                       0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=8) ¹
DiffShortstatCached-4                                0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=8) ¹
geomean                                                         ²               +0.00%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

@github-actions

github-actions Bot commented Jun 16, 2026

Copy link
Copy Markdown
Contributor

📊 Feature E2E Coverage

Feature coverage report unavailable

Run make e2e-report locally to view the full Allure report.

@github-actions

github-actions Bot commented Jun 16, 2026

Copy link
Copy Markdown
Contributor

E2E RPC Latency

list-sessions-ttfb-mean: 3ms (▼ faster -41.1%; baseline: 6ms)
list-sessions-total-mean: 5ms (▼ faster -24.2%; baseline: 7ms)

@github-actions

github-actions Bot commented Jun 16, 2026

Copy link
Copy Markdown
Contributor

Frontend Terminal Throughput

terminal-throughput-mean: 16 KB/s ▲ +3.3% (baseline: 15 KB/s)
terminal-throughput-p50: 16 KB/s ▲ +0.6% (baseline: 16 KB/s)

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>
@github-actions

github-actions Bot commented Jun 16, 2026

Copy link
Copy Markdown
Contributor

🎬 E2E Feature Demos

2 shard(s) recorded feature flows for this PR.

recordings shard 1
recordings shard 2

Demo preview opens directly in browser (single-file HTML). Raw WebM recordings in ZIP. Expires after 30 days.

@github-actions

Copy link
Copy Markdown
Contributor

✅ Registry Validation

Registry Validation
===================

Building backend scanner...
Scanning backend features...
Wrote 108 feature files to /tmp/tmp.A0I3jkV6Ca/backend
Wrote 14 feature files to /tmp/tmp.A0I3jkV6Ca/backend
Wrote 22 feature files to /tmp/tmp.A0I3jkV6Ca/backend
Wrote 6 feature files to /tmp/tmp.A0I3jkV6Ca/backend

=== Backend Registry Diff ===
Committed: 143  Generated: 141  Divergence: 1.4%
⚠️  Removed RPCs:
  - backlog:spawn-session-autonomous
  - upload:image
⚠️  101 feature(s) missing // +api: marker (markerFound: false)

⚠️  Divergence 1.4% above warning threshold.

Test Coverage: 97/143 features have testIds (67.8%)

Divergence > 2% blocks merges. Coverage reporting is advisory only.

tstapler and others added 2 commits June 16, 2026 16:06
…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>
@github-actions

Copy link
Copy Markdown
Contributor

✅ Registry Validation

Registry Validation
===================

Building backend scanner...
Scanning backend features...
Wrote 108 feature files to /tmp/tmp.80eaXd8UV5/backend
Wrote 14 feature files to /tmp/tmp.80eaXd8UV5/backend
Wrote 22 feature files to /tmp/tmp.80eaXd8UV5/backend
Wrote 6 feature files to /tmp/tmp.80eaXd8UV5/backend

=== Backend Registry Diff ===
Committed: 143  Generated: 141  Divergence: 1.4%
⚠️  Removed RPCs:
  - backlog:spawn-session-autonomous
  - upload:image
⚠️  101 feature(s) missing // +api: marker (markerFound: false)

⚠️  Divergence 1.4% above warning threshold.

Test Coverage: 97/143 features have testIds (67.8%)

Divergence > 2% blocks merges. Coverage reporting is advisory only.

… 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>
@github-actions

Copy link
Copy Markdown
Contributor

✅ Registry Validation

Registry Validation
===================

Building backend scanner...
Scanning backend features...
Wrote 108 feature files to /tmp/tmp.kHDVvHc1Pd/backend
Wrote 14 feature files to /tmp/tmp.kHDVvHc1Pd/backend
Wrote 22 feature files to /tmp/tmp.kHDVvHc1Pd/backend
Wrote 6 feature files to /tmp/tmp.kHDVvHc1Pd/backend

=== Backend Registry Diff ===
Committed: 143  Generated: 141  Divergence: 1.4%
⚠️  Removed RPCs:
  - backlog:spawn-session-autonomous
  - upload:image
⚠️  101 feature(s) missing // +api: marker (markerFound: false)

⚠️  Divergence 1.4% above warning threshold.

Test Coverage: 97/143 features have testIds (67.8%)

Divergence > 2% blocks merges. Coverage reporting is advisory only.

@tstapler tstapler merged commit 6df2559 into main Jun 16, 2026
21 of 22 checks passed
@tstapler tstapler deleted the merge/upstream-20260616 branch June 16, 2026 23:38
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