Skip to content

fix(tmux): decouple pane-exit detection from reconnect backoff, close test-race - #378

Merged
tstapler merged 1 commit into
mainfrom
backlog/stapler-squad-tmux-paneexit-reconnect-flake
Aug 7, 2026
Merged

fix(tmux): decouple pane-exit detection from reconnect backoff, close test-race#378
tstapler merged 1 commit into
mainfrom
backlog/stapler-squad-tmux-paneexit-reconnect-flake

Conversation

@tstapler

@tstapler tstapler commented Aug 7, 2026

Copy link
Copy Markdown
Owner

Summary

TestTmuxServerRegistry_PaneExitChannel intermittently failed with SubscribePaneExit channel not closed within 3s after kill-session, reproducing on unmodified main (per .claude/rules/fix-flaky-tests-dont-defer.md — filed and fixed rather than re-excused as a known flake).

Two independent root causes, found and fixed in sequence:

  1. Detection latency bound by reconnect backoff (server_registry.go): while reconnectLoop sleeps out exponential backoff (100ms..30s), no syncSessions() runs at all until the next reconnect completes, so pane-exit detection latency was effectively bound by backoff instead of anything caller-facing. Fixed with a syncMu-guarded fast-recheck path that makes a small, bounded number of independent resync attempts during a long backoff wait, without blocking or interfering with the normal blocking syncSessions() callers. The latency ceiling (fastRecheckAttempts × (fastRecheckSyncTimeout + fastRecheckInterval) = 700ms) is documented inline with a ponytail:-style comment.

  2. Test-scaffolding race (server_registry_integration_test.go), found after fix ci: fix forbidigo pattern field for golangci-lint 1.60.1 #1 still left a residual ~10-15% failure rate. Root-caused with tmux's own -v/-vv server-side protocol log — not the tmux server dying, but two gaps in the test harness:

    • Isolated test servers were spawned without -f, silently inheriting the developer's real ~/.tmux.conf (a TPM run hook forks extra tmux subcommands against the fresh server). Fixed with -f /dev/null.
    • startIsolatedRegistry returned before the control-mode client had finished attaching, letting a test's own session-create race ahead of the registry's attach-session. When it won, the session predated the control client's subscription, so tmux never emitted %session-created/%sessions-changed for it (no event replay), and since the connection then stayed healthy with no further drops, nothing ever re-synced before the test's timeout. Fixed by blocking on registry.IsHealthy() before startIsolatedRegistry returns.

Also fixed a margin-calculation bug in TestTmuxServerRegistry_PaneExitDetectedDespiteElevatedBackoff caught by sdd:6-verify's idiom review: minElevatedBackoffCycles=5 only guaranteed a 1600ms backoff wait at assertion time, not the documented 3200ms — bumped to 6 and corrected the comment.

Full root-cause narrative: project_plans/tmux-paneexit-reconnect-flake/requirements.md.

What Changed

  • session/tmux/server_registry.gosyncMu + syncSessionsFastRecheck (non-blocking TryLock) + waitBackoffWithFastRecheck, decoupling pane-exit detection latency from reconnect backoff.
  • session/tmux/server_registry_integration_test.go-f /dev/null isolation for test tmux servers, a health-wait in startIsolatedRegistry before returning, and a corrected backoff-margin constant in the elevated-backoff regression test.
  • project_plans/tmux-paneexit-reconnect-flake/** — SDD planning artifacts (requirements, research, plan, pre-mortem, validation, reviews).

Test plan

  • go test -race -tags integration ./session/tmux -run TestTmuxServerRegistry_PaneExitChannel -count=40 — 40/40
  • go test -race -tags integration ./session/tmux -run TestTmuxServerRegistry_PaneExitChannel -count=20 × 3 consecutive runs — 20/20, 20/20, 20/20 (60/60)
  • go test -race -tags integration ./session/tmux -run TestTmuxServerRegistry_PaneExitChannel -count=100 — 100/100
  • go test -race -tags integration ./session/tmux/... (full package, including TestEnsureServerRunning_NoOp, TestKillOrphanedControlModeClients, and the new TestTmuxServerRegistry_PaneExitDetectedDespiteElevatedBackoff regression test) — passes cleanly across repeated runs
  • make ci — run to completion twice (original worktree + the clean-branch worktree matching what's pushed here), both exit 0 with zero FAIL/Error lines
  • sdd:6-verify Layer 1 (idioms) + Layer 2 (architecture) review agents — no BLOCKERs, no MUST FIX findings; one SUGGEST finding fixed and reverified
  • git diff --name-only origin/main HEAD — exactly 13 files (2 source files + 11 of this item's own planning docs)

🤖 Generated with Claude Code

https://claude.ai/code/session_01Y3suSzoDYXnvbg2KQyD2qG

… test-race

TestTmuxServerRegistry_PaneExitChannel intermittently failed with
"SubscribePaneExit channel not closed within 3s after kill-session".

Root cause #1 (server_registry.go): while reconnectLoop is sleeping out
exponential backoff (100ms..30s), no syncSessions() runs at all until the
next reconnect completes, so pane-exit detection latency was effectively
bound by backoff instead of by anything caller-facing. Fixed with a
syncMu-guarded fast-recheck path (waitBackoffWithFastRecheck +
syncSessionsFastRecheck) that makes a small, bounded number of independent
resync attempts during a long backoff wait without blocking on or
interfering with the normal blocking syncSessions() callers. Ceiling is
documented inline: fastRecheckAttempts * (fastRecheckSyncTimeout +
fastRecheckInterval) = 700ms, gated behind fastRecheckMinBackoff=1600ms
(below that, the plain wait alone already leaves ample margin, and
unconditional fast-rechecking measurably worsened flakiness under load by
adding avoidable list-sessions forks with zero benefit).
TestTmuxServerRegistry_PaneExitDetectedDespiteElevatedBackoff exercises this
structurally, by elevating backoff to 3200ms via a clean control-mode outage
and asserting detection within 1.5s.

Root cause #2 (server_registry_integration_test.go), found after the above
fix still left a residual ~10-15% failure rate: two independent gaps in the
test scaffolding, not the tmux server itself dying, root-caused with tmux's
own -v/-vv server-side protocol log.

- Isolated test servers were spawned without -f, so they silently loaded
  this developer's real ~/.tmux.conf (including a `run
  '~/.tmux/plugins/tpm/tpm'` that forks extra tmux subcommands against the
  fresh server as part of config load). Fixed with -f /dev/null on the
  command that starts each isolated server.
- startIsolatedRegistry returned before the control-mode client had
  actually finished attaching, letting a test's own session-create race
  ahead of the registry's own attach-session. When it won, the session was
  created before the control client subscribed, so tmux never emitted
  %session-created/%sessions-changed for it (no event replay), and -- since
  the connection then stayed healthy with no further drops -- nothing ever
  triggered a resync before the test's poll timeout. Confirmed directly via
  a captured failure with zero reconnect/backoff log lines in between.
  Fixed by blocking on registry.IsHealthy() (set only after a live
  post-connect sync, which requires the server to have already processed
  the earlier-submitted attach-session) before startIsolatedRegistry
  returns.

Verified: go test -race -tags integration ./session/tmux -run
TestTmuxServerRegistry_PaneExitChannel at -count=40, three consecutive
-count=20 runs, and -count=100 -- 260/260, zero failures, across two
independent worktrees. Full session/tmux suite (including
TestEnsureServerRunning_NoOp, TestKillOrphanedControlModeClients, and the
new regression test) and make ci both pass cleanly.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y3suSzoDYXnvbg2KQyD2qG
Copilot AI lite review requested due to automatic review settings August 7, 2026 05:49

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Note

Copilot was unable to run its full agentic suite in this review.

Fixes a flaky tmux integration test by making pane-exit detection independent of reconnect backoff, and hardening the test harness to avoid config pollution and control-mode attach races.

Changes:

  • Add a non-blocking “fast recheck” resync path during reconnect backoff to bound pane-exit detection latency.
  • Fix integration test harness races by isolating tmux config (-f /dev/null) and waiting for registry health before proceeding.
  • Add planning/validation artifacts documenting root cause, design decisions, and verification.

Reviewed changes

Copilot reviewed 13 out of 13 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
session/tmux/server_registry.go Serializes session syncs and adds bounded fast-recheck during backoff to decouple pane-exit detection from reconnect timing.
session/tmux/server_registry_integration_test.go Improves isolated socket naming, isolates tmux config, waits for registry readiness, and adds an elevated-backoff regression test.
project_plans/tmux-paneexit-reconnect-flake/requirements.md Captures the problem statement, constraints, and acceptance criteria for the flake fix.
project_plans/tmux-paneexit-reconnect-flake/research/architecture.md Documents the intended integration point and timing/locking approach for fast recheck.
project_plans/tmux-paneexit-reconnect-flake/research/build-vs-buy.md Justifies hand-rolling vs. adopting a retry/backoff dependency.
project_plans/tmux-paneexit-reconnect-flake/research/features.md Enumerates edge cases and failure modes for a fast-recheck mechanism.
project_plans/tmux-paneexit-reconnect-flake/research/pitfalls.md Analyzes concurrency pitfalls (lost updates, goroutine leaks) and mitigation strategy.
project_plans/tmux-paneexit-reconnect-flake/research/stack.md Notes assumed Go/dependency environment for the implementation.
project_plans/tmux-paneexit-reconnect-flake/implementation/plan.md Full implementation plan including patterns, risks, and verification steps.
project_plans/tmux-paneexit-reconnect-flake/implementation/pre-mortem.md Pre-mortem describing plausible failure modes and mitigations.
project_plans/tmux-paneexit-reconnect-flake/implementation/validation.md Maps requirements to tests and describes validation/coverage expectations.
project_plans/tmux-paneexit-reconnect-flake/implementation/architecture-review.md Review notes on the plan (blockers/concerns).
project_plans/tmux-paneexit-reconnect-flake/implementation/adversarial-review.md Adversarial review notes on margins/coverage gaps and recommended tweaks.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread session/tmux/server_registry_integration_test.go
Comment thread session/tmux/server_registry.go
@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

✅ Registry Validation

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

Building backend scanner...
Scanning backend features...
Wrote 117 feature files to /tmp/tmp.oCCm9RGvqP/backend
Wrote 15 feature files to /tmp/tmp.oCCm9RGvqP/backend
Wrote 46 feature files to /tmp/tmp.oCCm9RGvqP/backend
Wrote 8 feature files to /tmp/tmp.oCCm9RGvqP/backend
Wrote 14 feature files to /tmp/tmp.oCCm9RGvqP/backend
Wrote 6 feature files to /tmp/tmp.oCCm9RGvqP/backend

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

✅ Registry validation passed. Divergence: 0.0%

Test Coverage: 34/186 features have testIds (18.3%)

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

@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

E2E RPC Latency

list-sessions-ttfb-mean: 3ms (▼ faster -58.2%; baseline: 8ms)
list-sessions-total-mean: 7ms (▼ faster -27.9%; baseline: 9ms)

@github-actions

github-actions Bot commented Aug 7, 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:97: missing iteration count
tier1-bench.txt:197: missing iteration count
goos: linux
goarch: amd64
pkg: github.com/tstapler/stapler-squad/session
cpu: AMD EPYC 9V74 80-Core Processor                
                                            │ benchmarks/go/tier1-baseline.txt │
                                            │              sec/op              │
CircularBufferWrite_4KB-4                                          80.34n ± 1%
CircularBufferWrite_4KB_Allocs-4                                   79.55n ± 1%
CircularBufferGetRecent_4KB-4                                      492.1n ± 2%
CircularBufferGetAll-4                                             3.744µ ± 2%
GetTimeSinceLastMeaningfulOutput_HotPath-4                         70.21n ± 1%
GetTimeSinceLastMeaningfulOutput_ColdPath-4                        34.51n ± 0%
geomean                                                            174.8n

                                            │ 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                           47.48Gi ± 2%
CircularBufferGetRecent_4KB-4                       7.752Gi ± 2%
geomean                                             19.19Gi

cpu: Intel(R) Xeon(R) 6973P-C
                                            │ tier1-bench.txt │
                                            │     sec/op      │
CircularBufferWrite_4KB-4                         169.5n ± 7%
CircularBufferWrite_4KB_Allocs-4                  158.2n ± 9%
CircularBufferGetRecent_4KB-4                     478.9n ± 3%
CircularBufferGetAll-4                            3.776µ ± 4%
GetTimeSinceLastMeaningfulOutput_HotPath-4        44.89n ± 4%
GetTimeSinceLastMeaningfulOutput_ColdPath-4       23.18n ± 3%
geomean                                           192.2n

                                            │ 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          22.50Gi ± 5%
CircularBufferGetRecent_4KB-4      7.966Gi ± 3%
geomean                            13.39Gi

pkg: github.com/tstapler/stapler-squad/session/detection/ratelimit
cpu: AMD EPYC 9V74 80-Core Processor                
                              │ benchmarks/go/tier1-baseline.txt │
                              │              sec/op              │
StripANSI_PlainText-4                                7.061n ± 2%
StripANSI_WithEscapes-4                              654.1n ± 1%
ProcessOutput_InactiveState-4                        6.644n ± 1%
geomean                                              31.31n

                              │ 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

cpu: Intel(R) Xeon(R) 6973P-C
                              │ tier1-bench.txt │
                              │     sec/op      │
StripANSI_PlainText-4               3.745n ± 1%
StripANSI_WithEscapes-4             480.3n ± 1%
ProcessOutput_InactiveState-4       13.11n ± 3%
geomean                             28.67n

                              │ 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

pkg: github.com/tstapler/stapler-squad/session/queue
cpu: AMD EPYC 9V74 80-Core Processor                
                              │ benchmarks/go/tier1-baseline.txt │
                              │              sec/op              │
ReviewQueue_ConcurrentReads-4                       88.80n ± 12%
ReviewQueue_Add-4                                   507.1n ±  1%
geomean                                             212.2n

                              │ 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

cpu: Intel(R) Xeon(R) 6973P-C
                              │ tier1-bench.txt │
                              │     sec/op      │
ReviewQueue_ConcurrentReads-4       143.0n ± 3%
ReviewQueue_Add-4                   361.9n ± 1%
geomean                             227.5n

                              │ 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

pkg: github.com/tstapler/stapler-squad/session/scrollback
cpu: AMD EPYC 9V74 80-Core Processor                
                                      │ benchmarks/go/tier1-baseline.txt │
                                      │              sec/op              │
CircularBuffer_ConcurrentReadWrite-4                         3.395µ ± 3%
CircularBuffer_BurstAppend-4                                 106.1µ ± 2%
CircularBuffer_GetLastN_LargeBuffer-4                        19.33µ ± 1%
CircularBuffer_GetRange_Sequential-4                         10.70µ ± 3%
CircularBufferAppend-4                                       103.1n ± 0%
CircularBufferGetLastN-4                                     2.302µ ± 3%
CircularBufferConcurrentAppend-4                             137.4n ± 1%
geomean                                                      3.045µ

                                      │ 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                       575.2Mi ± 2%

cpu: Intel(R) Xeon(R) 6973P-C
                                      │ tier1-bench.txt │
                                      │     sec/op      │
CircularBuffer_ConcurrentReadWrite-4        2.824µ ± 2%
CircularBuffer_BurstAppend-4                92.00µ ± 3%
CircularBuffer_GetLastN_LargeBuffer-4       14.89µ ± 2%
CircularBuffer_GetRange_Sequential-4        9.578µ ± 3%
CircularBufferAppend-4                      89.44n ± 3%
CircularBufferGetLastN-4                    1.898µ ± 3%
CircularBufferConcurrentAppend-4            119.0n ± 2%
geomean                                     2.574µ

                                      │ 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      663.5Mi ± 3%

pkg: github.com/tstapler/stapler-squad/session/tmux
cpu: AMD EPYC 9V74 80-Core Processor                
                             │ benchmarks/go/tier1-baseline.txt │
                             │              sec/op              │
StripANSICodes_PlainText-4                          7.454n ± 5%
StripANSICodes_WithEscapes-4                        625.0n ± 2%
IsBanner_PlainText-4                                465.3n ± 1%
geomean                                             129.4n

                             │ 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

cpu: Intel(R) Xeon(R) 6973P-C
                             │ tier1-bench.txt │
                             │     sec/op      │
StripANSICodes_PlainText-4         3.709n ± 0%
StripANSICodes_WithEscapes-4       436.0n ± 1%
IsBanner_PlainText-4               308.2n ± 2%
geomean                            79.29n

                             │ 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

pkg: github.com/tstapler/stapler-squad/session/tokens
cpu: AMD EPYC 9V74 80-Core Processor                
                                   │ benchmarks/go/tier1-baseline.txt │
                                   │              sec/op              │
TokenParser_ProcessUserEntry-4                            4.812m ± 2%
DetectCommandsInText/NoSlash-4                            6.680n ± 1%
DetectCommandsInText/WithCommand-4                        1.500µ ± 0%
geomean                                                   3.640µ

                                   │ benchmarks/go/tier1-baseline.txt │
                                   │               B/op               │
TokenParser_ProcessUserEntry-4                         1.057Mi ± 4%
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                           33.00 ± 0%
DetectCommandsInText/NoSlash-4                           0.000 ± 0%
DetectCommandsInText/WithCommand-4                       6.000 ± 0%
geomean                                                             ¹
¹ summaries must be >0 to compute geomean

cpu: Intel(R) Xeon(R) 6973P-C
                                   │ tier1-bench.txt │
                                   │     sec/op      │
TokenParser_ProcessUserEntry-4           3.045m ± 2%
DetectCommandsInText/NoSlash-4           3.579n ± 1%
DetectCommandsInText/WithCommand-4       1.193µ ± 3%
geomean                                  2.351µ

                                   │ tier1-bench.txt │
                                   │      B/op       │
TokenParser_ProcessUserEntry-4        1.042Mi ± 2%
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          33.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 9V74 80-Core Processor                
                               │ benchmarks/go/tier1-baseline.txt │
                               │              sec/op              │
DiffShortstat/GitVCSReader-4                          3.359m ± 1%
DiffShortstat/GoGitVCSReader-4                        80.88n ± 0%
DiffShortstatCached-4                                 80.30n ± 1%
geomean                                               2.794µ

                               │ benchmarks/go/tier1-baseline.txt │
                               │               B/op               │
DiffShortstat/GitVCSReader-4                       62.58Ki ± 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

cpu: Intel(R) Xeon(R) 6973P-C
                               │ tier1-bench.txt │
                               │     sec/op      │
DiffShortstat/GitVCSReader-4         1.802m ± 1%
DiffShortstat/GoGitVCSReader-4       53.50n ± 0%
DiffShortstatCached-4                53.63n ± 0%
geomean                              1.729µ

                               │ tier1-bench.txt │
                               │      B/op       │
DiffShortstat/GitVCSReader-4      62.56Ki ± 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

@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Frontend Terminal Throughput

terminal-throughput-mean: 16 KB/s ▲ +15.1% (baseline: 14 KB/s)
terminal-throughput-p50: 16 KB/s ▲ +1.4% (baseline: 16 KB/s)

@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

📊 Feature E2E Coverage

Feature coverage report unavailable

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

@tstapler
tstapler merged commit a2b8b8d into main Aug 7, 2026
22 checks passed
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