Skip to content

feat(session): track and surface subagent count in WAITING_FOR_AGENT status - #312

Draft
tstapler wants to merge 35 commits into
mainfrom
backlog/stapler-squad-subagent-spawn-tracking
Draft

feat(session): track and surface subagent count in WAITING_FOR_AGENT status#312
tstapler wants to merge 35 commits into
mainfrom
backlog/stapler-squad-subagent-spawn-tracking

Conversation

@tstapler

@tstapler tstapler commented Aug 3, 2026

Copy link
Copy Markdown
Owner

Summary

When Claude Code spawns background agents, shells, or monitors, the parent session's WAITING_FOR_AGENT chip shows generic unnumbered text ("Waiting for Agents") even though the terminal already contains the count (e.g. "✻ Waiting for 2 background agents to finish"). This PR captures that count and surfaces it end-to-end: detection → proto → UI.

Closes the underlying backlog item (migrated from issue #183).

What Changed

  • Detection (session/detection/detector.go, pattern_set.go): added a capturing group to the three WaitingForAgent regex patterns (background agents, shells still running, monitors still running). PatternSet.MatchLines now extracts the count at the exact match via FindStringSubmatch + guarded strconv.Atoi — never a separate/decoupled pass.
  • New method StatusDetector.DetectWithContextAndCountFromLines threads the count through the existing multi-line reverse-scan chain. The pre-existing DetectWithContextFromLines is left untouched (it's pinned by the TerminalDetector interface and consumed by review_queue_determiner.go plus several test files).
  • Controller plumbing (session/claude_controller.go): statusCacheEntry gains a subagentCount field; both GetCurrentStatus and GetStatusAndIdleInfo write it consistently to the shared atomic.Pointer[statusCacheEntry] cache so the two methods never disagree for the same tail hash (see project_plans/subagent-spawn-tracking/decisions/ADR-001-subagent-count-cache-coherence.md).
  • Proto: new int32 subagent_count = 72; field on Session (proto/session/v1/types.proto), regenerated via make proto-gen.
  • Server mapping (server/adapters/instance_adapter.go): copies the count onto the wire Session message unconditionally.
  • Frontend (SubStatusChip.tsx, SessionRow.tsx): the WAITING_FOR_AGENT chip's text and title now include the count with correct singular/plural (e.g. "Waiting for 2 Agents"), falling back to the original plain text for 0/undefined/negative/NaN.
  • Filed docs/bugs/open/BUG-053-...md for two pre-existing, unrelated jest failures discovered during full-suite validation (confirmed unrelated via git stash + isolated re-run).

Full planning trail (requirements → research → plan with adversarial review → validation/pre-mortem → this implementation) is in project_plans/subagent-spawn-tracking/.

Test plan

  • go build $(go list ./... | grep -v '/server/web$') — clean
  • go test ./session/detection/... ./session ./server/adapters/... — all pass, including new unit/integration tests covering 0/1/N/no-match, multi-pattern-collision ("winning line wins", not summed), CR-segment threading, and cache coherence between GetCurrentStatus/GetStatusAndIdleInfo
  • make build — Next.js + Go binary build succeeds
  • make test — passes except one pre-existing, already-documented flake (BUG-051, session/tmux under full-suite parallel load), confirmed unrelated to this diff
  • make lint — 0 issues
  • cd web-app && npx jest --testPathPatterns="SubStatusChip" — 22/22 pass
  • npx tsc --noEmit — clean
  • git diff --stat go.mod go.sum web-app/package.json — empty (no new dependency)
  • sdd:6-verify — 4 parallel review agents (Go idioms, React/TS idioms, architecture, refactor-candidates), 0 BLOCKER/MUST FIX findings, one small pluralization-dedupe applied

Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com

https://claude.ai/code/session_0148xoQRvZTN64YLzYKwgByY

tstapler and others added 30 commits August 1, 2026 11:24
No end-user-facing UX applies (pure CI/infra change) — lightweight DX
pass instead, comparing failure surfacing to golangci-lint annotations
vs plain-log precedent (ESLint/gofmt) and flagging --ci flag as a
zero-cost quick win.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Documents the BacklogStatus enum pattern, mark3labs/mcp-go tool
registration/handler shape, and confirms the ent status column needs no
migration for a new terminal value.
Evaluates TOML parsing (go-toml v2), regex engine (stdlib RE2), and
hot-reload (fsnotify) choices, plus config-aggregation frameworks
(Viper/koanf) and existing plugin-system prior art (Caddy/Vector/Grafana),
for the user-extensible agent detector plugin loader.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Covers RE2/ReDoS guarantees and limits, fsnotify hot-reload gotchas
(temp-file-rename, debounce, inotify limits, macOS/Linux differences),
TOML/config pitfalls, the atomic-swap concurrency pattern to reuse from
worktree_git.go, and fail2ban/ESLint/VS Code prior art.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Documents existing table/sort patterns to mirror (SessionDetailDrawer's
Tools Breakdown, backlog page's aria-sort), the proto gaps blocking AC-1
(per-turn) and AC-6 (cache split), and concrete labeling/empty-state/
sort-order decisions for AC-1 through AC-3.
Research pass on what commonly breaks when adding to an already-live
analytics feature: the #280 silent-$0.00 precedent, TokenStore RWMutex
contention, jumping-list risk for async-sorted cost data, stale
registry schema.json vs real frontend entry shape, and the
backlogItemEventSender pattern needed before WatchInsights is testable.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Documents edge cases and unstated scope for the 6 gap-closing ACs: AC-1
requires a proto change (TurnTimeline isn't exposed over the wire, not just
unwired in the frontend); AC-2's SessionList.tsx has zero token data wired in
today (TokenBadge is unused dead code, contradicting requirements.md); AC-3
needs no backend change (ListSessionTokens sort_by already implemented,
SessionsTable.tsx's sort is just hardcoded); AC-4 needs the same
narrow-interface refactor WatchBacklogItems already established for testing
connect-go streaming RPCs; AC-5's 5 target files share one +feature marker
with an existing aggregated registry entry, creating a collision risk; AC-6
is free (client-side formula, data already on the wire).
Phase 3 planning artifacts: creative pass, domain glossary, pattern
decisions, task breakdown (3 epics / 4 stories / 9 tasks), and ADR-001
justifying -p 1 over an isolated second -race invocation for the CI
contention mitigation. Also commits the earlier requirements.md and
research/*.md that were still uncommitted from phases 1-2.
Phase 3 architecture/task-breakdown plan (7 verified pipeline hops from
regex capture through proto to the SubStatusChip badge) plus ADR-001
documenting the statusCacheEntry cache-coherence requirement between
GetCurrentStatus and GetStatusAndIdleInfo. Also commits the requirements
and research docs from earlier phases that were still untracked.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Phase 3 planning artifacts: plan.md (3 phases, 6 epics, 14 stories,
41 tasks, 30-term glossary) plus four ADRs covering the go-toml/v2
dependency, the registry-level copy-on-write snapshot (vs. the existing
unused StatusDetector YAML loader), TOML schema v1, and the RE2 trust
boundary. Also picks up the architecture/features research files that
were still untracked.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Phase 3 planning artifact for the token-cost-tracking gap-closure project:
domain glossary, pattern decisions (new-RPC vs bolt-on for AC-1, interface
extraction for AC-4's WatchInsights test, client-side derivation for AC-6),
risk control, and a 5-phase task breakdown sequenced by risk (AC-4/AC-5
low-risk first, AC-2's new SessionList data join last). Also commits the
requirements.md and research/{build-vs-buy,stack}.md artifacts from earlier
phases that were left uncommitted.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Maps each requirements.md scope item and plan.md task to concrete
verification: regression checks for the two affected integration
tests, a stress/flake-verification repro (-count=10 under artificial
CPU contention), the Task 1.2.4 non-fatal-teardown check, the Task
2.1.1 coverage-artifact/-race-scope check, and the Task 2.1.2
averaged (>=3-run) wall-clock measurement. No user-facing surface, so
UX Acceptance Tests section is N/A; no schema change, so Migration
Test is N/A.
Wireframes, interaction flows, error/empty states, and UX acceptance
criteria for the 4 user-facing surfaces in Phases 2-4 of the
implementation plan (SessionsTable click-to-sort, ModelBreakdownChart
cache-hit-rate label, SessionDetailDrawer per-turn table, SessionList
Sort: Cost option). Flags a concrete contrast/layout risk in reusing
TokenBadge.css.ts's badgeVariant.warning for outlier-turn highlighting
in a table-cell context.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Adversarial/architecture review, UX design, validation plan, and
pre-mortem for the subagent-spawn-tracking feature; plan.md patched to
resolve 2 architecture-review CONCERNS, 1 adversarial-review safety
concern, 2 cross-artifact-consistency BLOCKERs (title-attribute
contradiction with ux.md, missing NaN/negative test coverage), and the
pre-mortem's P1 (corrected a false "no debounce precedent" claim).
Triad review (Product/UX/Engineering) verdict: READY TO BUILD.
…-url-tests

Adds architecture review, adversarial review, and pre-mortem docs from SDD
Phase 3/4, and patches plan.md to resolve the cross-artifact consistency
blocker (missing runner-concurrency check task) and the pre-mortem P1 item
(testSocketOnce misdiagnosis prevention).
Maps all 6 requirements.md acceptance criteria plus plan.md's
Phase 1-2 story-level Given/When/Then scenarios to concrete Go
test names, organized as unit vs. integration, so implementation
starts test-first.
Research and planning surfaced that this backlog item duplicates the
already-planned, already-reviewed project_plans/flaky-hook-url-tests/
(same root cause, same two tests, ADR-001 + full task breakdown never
implemented). implementation/plan.md consolidates rather than
re-derives: it adopts that plan/ADR wholesale, reproduces the full
Epic/Story/Task breakdown here for self-containment, and re-verifies
every file:line reference against the current tree (all accurate, no
drift found).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…or detector-plugins

Phase 4 (sdd:4-validate): validation.md test suite, pre-mortem.md failure
analysis, and cross-artifact consistency check. The pre-mortem's P1 finding
(DetectForProgram/the plugin registry has zero production call sites, so a
loaded plugin would never change what a user's session actually shows) was
independently confirmed by adversarial-review.md's own Blocker and by direct
repo verification (idle.go's live detection path uses getDefaultPatterns(),
not the registry this plan builds). Resolved by adding Epic 2.4 to plan.md,
wiring ClaudeController.Start to resolve its detector via the new registry
snapshot instead of the always-generic default.

Also folds in a Hardening Addendum (compile-time budget, total-file-count
cap, rebuildSnapshot context cancellation, InitPlugins re-entrancy guard,
non-fatal seed-file-write) closing 5 previously-open adversarial-review
Concerns, and requirements.md amendments (Target User, Success Metric,
Risky Assumption sections; corrected plugin-directory and version-field
wording) from a 3-round product/engineering triad review.
project_plans/backlog-status-transitions/research/architecture.md belongs
to an unrelated, concurrently in-progress backlog item and was swept into
the previous commit because it was already staged in the shared index at
commit time. Untracking (not deleting) it here so it returns to the
working tree for its own session to commit under its own message.
…rl-race-flake

Phase 4 (validate) for the flaky hook-URL/MCP-URL CI test backlog item:
validation.md, pre-mortem.md, architecture-review.md, adversarial-review.md.
Cross-artifact consistency review surfaced 3 blockers (AC #1's N/method never
decided, a citation to a "Success Metrics" section that didn't exist in this
project's own requirements.md, and a stale file path) — fixed by adding this
project's own Success Metrics section (N=20, distinct decision from the sibling
project) and correcting the path. Pre-mortem's 3 P1 items (unfolded review
concerns, un-rebutted build-vs-buy divergence, unenforced AC#4 evidence gate)
are folded directly into plan.md and research/build-vs-buy.md rather than left
as unread siblings for Phase 5.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Phase 3 plan grounded in the actual DeleteSession/EventExited lifecycle code
(not just research assumptions) — records ADR-001 for the storage-independence
decision the grounding surfaced: DeleteSession deletes the Session row
synchronously before Destroy() teardown, so the CompletionSummary entity must
have no FK edge to Session.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Phase 3 plan.md resolves all requirements.md Open Questions explicitly:
timestamp-watermark dedup (ADR-001, resolving the build-vs-buy/pitfalls
ID-based vs. architecture.md watermark contradiction), a concrete
"substantive feedback" length filter, always-attempted one-shot Copilot
review requests, an unconditional legacy-login gh CLI version workaround,
and brings the pre-existing STUCK_REASON_PR_NEEDS_FIX proto-enum gap
in scope since the reuse-first design depends on it. Also commits the
earlier phase 1/2 requirements.md and research/*.md artifacts, which
were sitting uncommitted per .claude/rules/sdd-planning-artifacts-commit.md.
project_plans/context-health-monitoring/research/stack.md belongs to an
unrelated, concurrently in-progress backlog item and was swept into the
previous commit because it was already staged in the shared index at
commit time (same failure mode as 3c2f0b3). Untracking (not deleting)
it here so it returns to the other item's own uncommitted working state.
Requirements, research, plan, ADRs, and validation docs for per-session
context-health signal detection (backlog item 2b435aa4).
…owup

Completes sdd:4-validate: validation.md (test coverage mapping) and
pre-mortem.md (5 failure modes, 1 P1) written; cross-artifact consistency
check found 2 BLOCKER contradictions (dedup mechanism, migration claim)
and 2 CONCERNs, all patched into requirements.md. Also resolves the sole
adversarial-review.md BLOCKER (zero-value timestamp dedup blind spot) by
switching Task 1.1.2d's parse-failure fallback to time.Now(), and folds
in pre-mortem's P1 finding (multi-item batch coverage logging) as new
plan.md tasks 3.1.2e/f. Readiness gate: PASS.
Phase 4 validation/pre-mortem/triad-review pass on top of existing
requirements/research/plan (Phases 1-3, from an earlier uncommitted
session): fixes a P1 filterByProject worktree-path bug, closes a
BLOCKER gap where Story 2.2.3 (click-through navigation) was referenced
but never written, resolves adversarial/architecture review blockers,
and switches SessionHitCard to a real <a> element per triad UX review.
Confirms pkg/classifier.RuleBasedClassifier is the live auto-approve rule
engine (session/approval_policy.go is dead code), and that CI status
caching/transport/badge rendering already exist end-to-end for the
session list/detail views — the diff viewer just needs to be wired into
existing infra, not build new fetch/cache logic.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Also picks up requirements.md and research/*.md left uncommitted from
earlier phases, per .claude/rules/sdd-planning-artifacts-commit.md.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
tstapler and others added 3 commits August 2, 2026 14:07
…ewer

Closes the AC5 override-affordance, storage-lookup error-path, and AC6
stale-CI-race blockers flagged by adversarial review; adds architecture
review and UX design artifacts. Adversarial review verdict: BLOCKED -> CONCERNS.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…tus-diff-viewer

Completes the sdd:4-validate phase (validation.md requirement->test mapping,
pre-mortem.md failure modes with P1 resolved), and closes the "no scoped
override" gap design/ux.md's Exit-Path Analysis flagged as failing by adding
the "Approve anyway" wireframe/interaction spec and threading the resulting
Task 1.1.2b interval-injection decision and Task 1.1.3d verification task
into implementation/plan.md.
…ING_FOR_AGENT status

Captures the numeric count from the three WaitingForAgent regex patterns
(background agents, shells still running, monitors still running) at the
exact match, threads it through the detection call chain via a new
DetectWithContextAndCountFromLines method (leaving the interface-pinned
DetectWithContextFromLines untouched), plumbs it through the shared
statusCacheEntry cache for coherence between GetCurrentStatus and
GetStatusAndIdleInfo, exposes it as Session.subagent_count (proto field 72),
and renders it in SubStatusChip's WAITING_FOR_AGENT chip text/title with
correct singular/plural, falling back to the original plain text for
0/undefined/negative/NaN.

Also files BUG-053 for two pre-existing, unrelated jest failures
(SessionDetail.embedded.test.tsx, BacklogEmptyState.test.tsx) discovered
while running the full frontend suite during Phase 6 validation.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0148xoQRvZTN64YLzYKwgByY
@tstapler

tstapler commented Aug 3, 2026

Copy link
Copy Markdown
Owner Author

Closing as superseded: this branch's last known commit (654c601) is already present on main, so this item's work has already shipped through another path. No further fix is needed here.

@tstapler tstapler closed this Aug 3, 2026
@tstapler tstapler reopened this Aug 3, 2026
@tstapler

tstapler commented Aug 3, 2026

Copy link
Copy Markdown
Owner Author

Reopening — the auto-close comment compared against commit 654c601, which predates this PR's actual feature commit (c03abf2). Verified main has neither subagent_count (proto/session/v1/types.proto) nor DetectWithContextAndCountFromLines (session/detection/detector.go), so this work has not shipped through another path. Proceeding with the normal PR ship gates.

tstapler and others added 2 commits August 2, 2026 22:18
Code review on PR #312 found that SubStatusChip hardcoded "background
agent(s)" for the subagent_count badge even though the count is sourced
from three distinct WaitingForAgent regex patterns (background agents,
shells still running, monitors still running) — a "2 shells still
running" match rendered as "Waiting for 2 Agents", which is wrong. Switch
to source-neutral "task(s)" wording, matching the requirements doc's
"⊕ 3 tasks" badge language. Also adds a cheap default-zero regression
test for InstanceToProto's SubagentCount passthrough.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The 5 conflicting files are add/add: this branch created independent stale
drafts of planning docs for ci-status-diff-viewer, flaky-hook-url-tests, and
token-cost-tracking (other backlog items) before they were shipped and
merged to main via separate PRs (#304 et al). Taking main's version for all
5 — this branch's copies are superseded drafts, not this PR's actual work.

# Conflicts:
#	project_plans/ci-status-diff-viewer/design/ux.md
#	project_plans/ci-status-diff-viewer/implementation/plan.md
#	project_plans/flaky-hook-url-tests/research/features.md
#	project_plans/token-cost-tracking/implementation/plan.md
#	project_plans/token-cost-tracking/requirements.md
@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

✅ Registry Validation

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

Building backend scanner...
Scanning backend features...
Wrote 117 feature files to /tmp/tmp.REKPus862k/backend
Wrote 15 feature files to /tmp/tmp.REKPus862k/backend
Wrote 45 feature files to /tmp/tmp.REKPus862k/backend
Wrote 8 feature files to /tmp/tmp.REKPus862k/backend
Wrote 12 feature files to /tmp/tmp.REKPus862k/backend

=== Backend Registry Diff ===
Committed: 181  Generated: 181  Divergence: 0.0%
⚠️  109 feature(s) missing // +api: marker (markerFound: false)

✅ Registry validation passed. Divergence: 0.0%

Test Coverage: 24/181 features have testIds (13.3%)

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

@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Go Benchmarks (Tier 1)

benchmarks/go/tier1-baseline.txt:98: missing iteration count
benchmarks/go/tier1-baseline.txt:198: missing iteration count
tier1-bench.txt:98: missing iteration count
tier1-bench.txt:198: missing iteration count
goos: linux
goarch: amd64
pkg: github.com/tstapler/stapler-squad/session
cpu: AMD EPYC 7763 64-Core Processor                
                                            │ tier1-bench.txt │
                                            │     sec/op      │
CircularBufferWrite_4KB-4                         80.98n ± 3%
CircularBufferWrite_4KB_Allocs-4                  82.11n ± 2%
CircularBufferGetRecent_4KB-4                     499.5n ± 2%
CircularBufferGetAll-4                            3.872µ ± 1%
GetTimeSinceLastMeaningfulOutput_HotPath-4        65.87n ± 0%
GetTimeSinceLastMeaningfulOutput_ColdPath-4       32.76n ± 1%
geomean                                           174.0n

                                            │ tier1-bench.txt │
                                            │      B/op       │
CircularBufferWrite_4KB-4                        0.000 ± 0%
CircularBufferWrite_4KB_Allocs-4                 0.000 ± 0%
CircularBufferGetRecent_4KB-4                  4.000Ki ± 0%
CircularBufferGetAll-4                         40.00Ki ± 0%
GetTimeSinceLastMeaningfulOutput_HotPath-4       0.000 ± 0%
GetTimeSinceLastMeaningfulOutput_ColdPath-4      0.000 ± 0%
geomean                                                     ¹
¹ summaries must be >0 to compute geomean

                                            │ tier1-bench.txt │
                                            │    allocs/op    │
CircularBufferWrite_4KB-4                        0.000 ± 0%
CircularBufferWrite_4KB_Allocs-4                 0.000 ± 0%
CircularBufferGetRecent_4KB-4                    1.000 ± 0%
CircularBufferGetAll-4                           1.000 ± 0%
GetTimeSinceLastMeaningfulOutput_HotPath-4       0.000 ± 0%
GetTimeSinceLastMeaningfulOutput_ColdPath-4      0.000 ± 0%
geomean                                                     ¹
¹ summaries must be >0 to compute geomean

                              │ tier1-bench.txt │
                              │       B/s       │
CircularBufferWrite_4KB-4          47.11Gi ± 3%
CircularBufferGetRecent_4KB-4      7.637Gi ± 2%
geomean                            18.97Gi

cpu: AMD EPYC 9V74 80-Core Processor                
                                            │ benchmarks/go/tier1-baseline.txt │
                                            │              sec/op              │
CircularBufferWrite_4KB-4                                          81.36n ± 1%
CircularBufferWrite_4KB_Allocs-4                                   80.41n ± 1%
CircularBufferGetRecent_4KB-4                                      567.1n ± 3%
CircularBufferGetAll-4                                             3.990µ ± 1%
GetTimeSinceLastMeaningfulOutput_HotPath-4                         70.16n ± 0%
GetTimeSinceLastMeaningfulOutput_ColdPath-4                        34.51n ± 1%
geomean                                                            181.6n

                                            │ benchmarks/go/tier1-baseline.txt │
                                            │               B/op               │
CircularBufferWrite_4KB-4                                         0.000 ± 0%
CircularBufferWrite_4KB_Allocs-4                                  0.000 ± 0%
CircularBufferGetRecent_4KB-4                                   4.000Ki ± 0%
CircularBufferGetAll-4                                          40.00Ki ± 0%
GetTimeSinceLastMeaningfulOutput_HotPath-4                        0.000 ± 0%
GetTimeSinceLastMeaningfulOutput_ColdPath-4                       0.000 ± 0%
geomean                                                                      ¹
¹ summaries must be >0 to compute geomean

                                            │ benchmarks/go/tier1-baseline.txt │
                                            │            allocs/op             │
CircularBufferWrite_4KB-4                                         0.000 ± 0%
CircularBufferWrite_4KB_Allocs-4                                  0.000 ± 0%
CircularBufferGetRecent_4KB-4                                     1.000 ± 0%
CircularBufferGetAll-4                                            1.000 ± 0%
GetTimeSinceLastMeaningfulOutput_HotPath-4                        0.000 ± 0%
GetTimeSinceLastMeaningfulOutput_ColdPath-4                       0.000 ± 0%
geomean                                                                      ¹
¹ summaries must be >0 to compute geomean

                              │ benchmarks/go/tier1-baseline.txt │
                              │               B/s                │
CircularBufferWrite_4KB-4                           46.89Gi ± 2%
CircularBufferGetRecent_4KB-4                       6.727Gi ± 3%
geomean                                             17.76Gi

pkg: github.com/tstapler/stapler-squad/session/detection/ratelimit
cpu: AMD EPYC 7763 64-Core Processor                
                              │ tier1-bench.txt │
                              │     sec/op      │
StripANSI_PlainText-4               6.913n ± 1%
StripANSI_WithEscapes-4             745.6n ± 1%
ProcessOutput_InactiveState-4       6.304n ± 1%
geomean                             31.91n

                              │ tier1-bench.txt │
                              │      B/op       │
StripANSI_PlainText-4              0.000 ± 0%
StripANSI_WithEscapes-4            136.0 ± 0%
ProcessOutput_InactiveState-4      0.000 ± 0%
geomean                                       ¹
¹ summaries must be >0 to compute geomean

                              │ tier1-bench.txt │
                              │    allocs/op    │
StripANSI_PlainText-4              0.000 ± 0%
StripANSI_WithEscapes-4            5.000 ± 0%
ProcessOutput_InactiveState-4      0.000 ± 0%
geomean                                       ¹
¹ summaries must be >0 to compute geomean

cpu: AMD EPYC 9V74 80-Core Processor                
                              │ benchmarks/go/tier1-baseline.txt │
                              │              sec/op              │
StripANSI_PlainText-4                                7.047n ± 1%
StripANSI_WithEscapes-4                              657.0n ± 1%
ProcessOutput_InactiveState-4                        6.663n ± 2%
geomean                                              31.36n

                              │ benchmarks/go/tier1-baseline.txt │
                              │               B/op               │
StripANSI_PlainText-4                               0.000 ± 0%
StripANSI_WithEscapes-4                             136.0 ± 0%
ProcessOutput_InactiveState-4                       0.000 ± 0%
geomean                                                        ¹
¹ summaries must be >0 to compute geomean

                              │ benchmarks/go/tier1-baseline.txt │
                              │            allocs/op             │
StripANSI_PlainText-4                               0.000 ± 0%
StripANSI_WithEscapes-4                             5.000 ± 0%
ProcessOutput_InactiveState-4                       0.000 ± 0%
geomean                                                        ¹
¹ summaries must be >0 to compute geomean

pkg: github.com/tstapler/stapler-squad/session/queue
cpu: AMD EPYC 7763 64-Core Processor                
                              │ tier1-bench.txt │
                              │     sec/op      │
ReviewQueue_ConcurrentReads-4       87.05n ± 4%
ReviewQueue_Add-4                   499.8n ± 1%
geomean                             208.6n

                              │ tier1-bench.txt │
                              │      B/op       │
ReviewQueue_ConcurrentReads-4      0.000 ± 0%
ReviewQueue_Add-4                  640.0 ± 0%
geomean                                       ¹
¹ summaries must be >0 to compute geomean

                              │ tier1-bench.txt │
                              │    allocs/op    │
ReviewQueue_ConcurrentReads-4      0.000 ± 0%
ReviewQueue_Add-4                  4.000 ± 0%
geomean                                       ¹
¹ summaries must be >0 to compute geomean

cpu: AMD EPYC 9V74 80-Core Processor                
                              │ benchmarks/go/tier1-baseline.txt │
                              │              sec/op              │
ReviewQueue_ConcurrentReads-4                        93.54n ± 0%
ReviewQueue_Add-4                                    496.9n ± 1%
geomean                                              215.6n

                              │ benchmarks/go/tier1-baseline.txt │
                              │               B/op               │
ReviewQueue_ConcurrentReads-4                       0.000 ± 0%
ReviewQueue_Add-4                                   640.0 ± 0%
geomean                                                        ¹
¹ summaries must be >0 to compute geomean

                              │ benchmarks/go/tier1-baseline.txt │
                              │            allocs/op             │
ReviewQueue_ConcurrentReads-4                       0.000 ± 0%
ReviewQueue_Add-4                                   4.000 ± 0%
geomean                                                        ¹
¹ summaries must be >0 to compute geomean

pkg: github.com/tstapler/stapler-squad/session/scrollback
cpu: AMD EPYC 7763 64-Core Processor                
                                      │ tier1-bench.txt │
                                      │     sec/op      │
CircularBuffer_ConcurrentReadWrite-4        4.003µ ± 2%
CircularBuffer_BurstAppend-4                102.6µ ± 1%
CircularBuffer_GetLastN_LargeBuffer-4       20.17µ ± 3%
CircularBuffer_GetRange_Sequential-4        13.80µ ± 8%
CircularBufferAppend-4                      101.9n ± 0%
CircularBufferGetLastN-4                    2.631µ ± 2%
CircularBufferConcurrentAppend-4            128.7n ± 0%
geomean                                     3.263µ

                                      │ tier1-bench.txt │
                                      │      B/op       │
CircularBuffer_ConcurrentReadWrite-4       6.062Ki ± 0%
CircularBuffer_BurstAppend-4               62.50Ki ± 0%
CircularBuffer_GetLastN_LargeBuffer-4      56.00Ki ± 0%
CircularBuffer_GetRange_Sequential-4       28.00Ki ± 0%
CircularBufferAppend-4                       24.00 ± 0%
CircularBufferGetLastN-4                   6.000Ki ± 0%
CircularBufferConcurrentAppend-4             32.00 ± 0%
geomean                                    3.077Ki

                                      │ tier1-bench.txt │
                                      │    allocs/op    │
CircularBuffer_ConcurrentReadWrite-4         2.000 ± 0%
CircularBuffer_BurstAppend-4                1.000k ± 0%
CircularBuffer_GetLastN_LargeBuffer-4        1.000 ± 0%
CircularBuffer_GetRange_Sequential-4         1.000 ± 0%
CircularBufferAppend-4                       1.000 ± 0%
CircularBufferGetLastN-4                     1.000 ± 0%
CircularBufferConcurrentAppend-4             1.000 ± 0%
geomean                                      2.962

                             │ tier1-bench.txt │
                             │       B/s       │
CircularBuffer_BurstAppend-4      594.7Mi ± 1%

cpu: AMD EPYC 9V74 80-Core Processor                
                                      │ benchmarks/go/tier1-baseline.txt │
                                      │              sec/op              │
CircularBuffer_ConcurrentReadWrite-4                         3.401µ ± 3%
CircularBuffer_BurstAppend-4                                 106.3µ ± 0%
CircularBuffer_GetLastN_LargeBuffer-4                        20.79µ ± 6%
CircularBuffer_GetRange_Sequential-4                         14.12µ ± 6%
CircularBufferAppend-4                                       110.2n ± 1%
CircularBufferGetLastN-4                                     2.567µ ± 3%
CircularBufferConcurrentAppend-4                             139.9n ± 1%
geomean                                                      3.293µ

                                      │ benchmarks/go/tier1-baseline.txt │
                                      │               B/op               │
CircularBuffer_ConcurrentReadWrite-4                        6.062Ki ± 0%
CircularBuffer_BurstAppend-4                                62.50Ki ± 0%
CircularBuffer_GetLastN_LargeBuffer-4                       56.00Ki ± 0%
CircularBuffer_GetRange_Sequential-4                        28.00Ki ± 0%
CircularBufferAppend-4                                        24.00 ± 0%
CircularBufferGetLastN-4                                    6.000Ki ± 0%
CircularBufferConcurrentAppend-4                              32.00 ± 0%
geomean                                                     3.077Ki

                                      │ benchmarks/go/tier1-baseline.txt │
                                      │            allocs/op             │
CircularBuffer_ConcurrentReadWrite-4                          2.000 ± 0%
CircularBuffer_BurstAppend-4                                 1.000k ± 0%
CircularBuffer_GetLastN_LargeBuffer-4                         1.000 ± 0%
CircularBuffer_GetRange_Sequential-4                          1.000 ± 0%
CircularBufferAppend-4                                        1.000 ± 0%
CircularBufferGetLastN-4                                      1.000 ± 0%
CircularBufferConcurrentAppend-4                              1.000 ± 0%
geomean                                                       2.962

                             │ benchmarks/go/tier1-baseline.txt │
                             │               B/s                │
CircularBuffer_BurstAppend-4                       573.9Mi ± 0%

pkg: github.com/tstapler/stapler-squad/session/tmux
cpu: AMD EPYC 7763 64-Core Processor                
                             │ tier1-bench.txt │
                             │     sec/op      │
StripANSICodes_PlainText-4         6.880n ± 4%
StripANSICodes_WithEscapes-4       688.7n ± 0%
IsBanner_PlainText-4               478.6n ± 0%
geomean                            131.4n

                             │ tier1-bench.txt │
                             │      B/op       │
StripANSICodes_PlainText-4        0.000 ± 0%
StripANSICodes_WithEscapes-4      56.00 ± 0%
IsBanner_PlainText-4              0.000 ± 0%
geomean                                      ¹
¹ summaries must be >0 to compute geomean

                             │ tier1-bench.txt │
                             │    allocs/op    │
StripANSICodes_PlainText-4        0.000 ± 0%
StripANSICodes_WithEscapes-4      4.000 ± 0%
IsBanner_PlainText-4              0.000 ± 0%
geomean                                      ¹
¹ summaries must be >0 to compute geomean

cpu: AMD EPYC 9V74 80-Core Processor                
                             │ benchmarks/go/tier1-baseline.txt │
                             │              sec/op              │
StripANSICodes_PlainText-4                          7.061n ± 7%
StripANSICodes_WithEscapes-4                        616.3n ± 1%
IsBanner_PlainText-4                                467.3n ± 1%
geomean                                             126.7n

                             │ benchmarks/go/tier1-baseline.txt │
                             │               B/op               │
StripANSICodes_PlainText-4                         0.000 ± 0%
StripANSICodes_WithEscapes-4                       56.00 ± 0%
IsBanner_PlainText-4                               0.000 ± 0%
geomean                                                       ¹
¹ summaries must be >0 to compute geomean

                             │ benchmarks/go/tier1-baseline.txt │
                             │            allocs/op             │
StripANSICodes_PlainText-4                         0.000 ± 0%
StripANSICodes_WithEscapes-4                       4.000 ± 0%
IsBanner_PlainText-4                               0.000 ± 0%
geomean                                                       ¹
¹ summaries must be >0 to compute geomean

pkg: github.com/tstapler/stapler-squad/session/tokens
cpu: AMD EPYC 7763 64-Core Processor                
                                   │ tier1-bench.txt │
                                   │     sec/op      │
TokenParser_ProcessUserEntry-4           5.226m ± 0%
DetectCommandsInText/NoSlash-4           7.495n ± 0%
DetectCommandsInText/WithCommand-4       1.647µ ± 1%
geomean                                  4.010µ

                                   │ tier1-bench.txt │
                                   │      B/op       │
TokenParser_ProcessUserEntry-4        11.02Mi ± 0%
DetectCommandsInText/NoSlash-4          0.000 ± 0%
DetectCommandsInText/WithCommand-4      433.0 ± 0%
geomean                                            ¹
¹ summaries must be >0 to compute geomean

                                   │ tier1-bench.txt │
                                   │    allocs/op    │
TokenParser_ProcessUserEntry-4          34.00 ± 0%
DetectCommandsInText/NoSlash-4          0.000 ± 0%
DetectCommandsInText/WithCommand-4      6.000 ± 0%
geomean                                            ¹
¹ summaries must be >0 to compute geomean

cpu: AMD EPYC 9V74 80-Core Processor                
                                   │ benchmarks/go/tier1-baseline.txt │
                                   │              sec/op              │
TokenParser_ProcessUserEntry-4                            5.624m ± 1%
DetectCommandsInText/NoSlash-4                            6.353n ± 1%
DetectCommandsInText/WithCommand-4                        1.525µ ± 1%
geomean                                                   3.791µ

                                   │ benchmarks/go/tier1-baseline.txt │
                                   │               B/op               │
TokenParser_ProcessUserEntry-4                         11.02Mi ± 0%
DetectCommandsInText/NoSlash-4                           0.000 ± 0%
DetectCommandsInText/WithCommand-4                       433.0 ± 0%
geomean                                                             ¹
¹ summaries must be >0 to compute geomean

                                   │ benchmarks/go/tier1-baseline.txt │
                                   │            allocs/op             │
TokenParser_ProcessUserEntry-4                           34.00 ± 0%
DetectCommandsInText/NoSlash-4                           0.000 ± 0%
DetectCommandsInText/WithCommand-4                       6.000 ± 0%
geomean                                                             ¹
¹ summaries must be >0 to compute geomean

pkg: github.com/tstapler/stapler-squad/session/unfinished
cpu: AMD EPYC 7763 64-Core Processor                
                               │ tier1-bench.txt │
                               │     sec/op      │
DiffShortstat/GitVCSReader-4         3.168m ± 1%
DiffShortstat/GoGitVCSReader-4       76.87n ± 0%
DiffShortstatCached-4                75.51n ± 2%
geomean                              2.639µ

                               │ tier1-bench.txt │
                               │      B/op       │
DiffShortstat/GitVCSReader-4      62.57Ki ± 0%
DiffShortstat/GoGitVCSReader-4      0.000 ± 0%
DiffShortstatCached-4               0.000 ± 0%
geomean                                        ¹
¹ summaries must be >0 to compute geomean

                               │ tier1-bench.txt │
                               │    allocs/op    │
DiffShortstat/GitVCSReader-4        360.0 ± 0%
DiffShortstat/GoGitVCSReader-4      0.000 ± 0%
DiffShortstatCached-4               0.000 ± 0%
geomean                                        ¹
¹ summaries must be >0 to compute geomean

cpu: AMD EPYC 9V74 80-Core Processor                
                               │ benchmarks/go/tier1-baseline.txt │
                               │              sec/op              │
DiffShortstat/GitVCSReader-4                          3.390m ± 1%
DiffShortstat/GoGitVCSReader-4                        80.89n ± 0%
DiffShortstatCached-4                                 80.44n ± 0%
geomean                                               2.804µ

                               │ benchmarks/go/tier1-baseline.txt │
                               │               B/op               │
DiffShortstat/GitVCSReader-4                       62.57Ki ± 0%
DiffShortstat/GoGitVCSReader-4                       0.000 ± 0%
DiffShortstatCached-4                                0.000 ± 0%
geomean                                                         ¹
¹ summaries must be >0 to compute geomean

                               │ benchmarks/go/tier1-baseline.txt │
                               │            allocs/op             │
DiffShortstat/GitVCSReader-4                         360.0 ± 0%
DiffShortstat/GoGitVCSReader-4                       0.000 ± 0%
DiffShortstatCached-4                                0.000 ± 0%
geomean                                                         ¹
¹ summaries must be >0 to compute geomean

@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

E2E RPC Latency

list-sessions-ttfb-mean: 9ms (▲ slower +25.4%; baseline: 7ms)
list-sessions-total-mean: 11ms (▲ slower +3.9%; baseline: 11ms)

@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

UX Analysis

Check Status Details
✅ Axe Core (WCAG 2.1 AA) success 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 Aug 3, 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 Aug 3, 2026

Copy link
Copy Markdown
Contributor

Frontend Terminal Throughput

terminal-throughput-mean: 14 KB/s ▼ -9.9% (baseline: 16 KB/s)
terminal-throughput-p50: 16 KB/s ▲ +1.0% (baseline: 16 KB/s)

@github-actions

github-actions Bot commented Aug 3, 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.

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