Skip to content

fix(backlog): recover items wedged in review by an idle-but-alive reviewer (recovers #342) - #347

Merged
tstapler merged 7 commits into
mainfrom
recover/pr-342-idle-reviewer-wedge
Aug 5, 2026
Merged

fix(backlog): recover items wedged in review by an idle-but-alive reviewer (recovers #342)#347
tstapler merged 7 commits into
mainfrom
recover/pr-342-idle-reviewer-wedge

Conversation

@tstapler

@tstapler tstapler commented Aug 5, 2026

Copy link
Copy Markdown
Owner

Recovers the work from #342, which was closed unmerged by a bug — not on its own merits.

Why this PR exists

#342 was reviewed, CI-green, and ready. The closeIfSupersededByMain reconciler then read its work session's LastCommitSha — which held the session's spawn-time base SHA 1a751723b, an unrelated commit from ~24h before the work began — concluded the item had "already shipped through another path", closed the PR without merging, and marked backlog item d6ddbef3-238e-43dc-8a69-c3700cc440bf done. The fix never shipped. That reconciler bug is fixed in #346; this PR restores the stranded work.

The original commits are preserved as-is (541fc846e, 342c49b6e, plus the gofmt collateral bb3061a75) — cherry-picked cleanly with no conflicts. The content of #342 was never in question.

Stacking / merge order

Based on fix/item-session-last-commit-live-tracking (#346), not main, because both touch session/backlog_lifecycle.go. GitHub will retarget this to main automatically once #346 merges. Merge #346 first.

Verified locally that both fixes coexist: go vet clean, and the two changes' test suites pass together in one run.


Original description (from #342)

A reviewer session that submits a verdict via submit_review_verdict and then never exits (process alive, no further output) was invisible to both handleReviewSessionExited (session-exit only) and reconcileUnprocessedReviewVerdicts's crash-recovery sweep (requires the session confirmed dead via SessionLivenessChecker) — wedging the item in review forever.

What changed

  • submitReviewVerdict (server/mcp/tools_backlog.go) now drives the review -> in_progress transition eagerly for FAIL/PARTIAL/UNVERIFIABLE verdicts, routed through the existing AutoReopenSpawner interface rather than reimplemented — CAS-guarded (ExpectedStatus: review), reusing rework-cap/circuit-breaker checks and work-session respawn logic as-is. PASS stays deferred to handleReviewSessionExited, unchanged.
  • reconcileUnprocessedReviewVerdicts (session/backlog_lifecycle.go) gets an idle-timeout OR condition: a verdict older than reviewVerdictIdleThreshold (2h, matching maxWorkSessionStaleness) is now actionable even when SessionLivenessChecker reports the session alive.
  • The review-role prompt now instructs the reviewer to end its session immediately after calling submit_review_verdict, symmetric to the work-role prompt's existing "Do NOT end your session" instruction.
  • NewCore/NewHTTPHandler/RunServer take a new optional autoReopener session.AutoReopenSpawner param, wired from deps.BacklogService in the HTTP server path; the stdio --mcp fallback path has no BacklogService available and passes nil, documented in-code.

Test plan

  • make ci green on the original branch before it was wrongly closed.
  • Unit tests: eager-call on FAIL/PARTIAL/UNVERIFIABLE, no-call on PASS, nil-autoReopener safety, CAS-harmless double-call, no-active-work-session spawn path, idle-timeout sweep (under and over threshold), review-prompt content assertions.
  • Re-verified after cherry-picking onto fix(backlog): stop auto-closing live PRs as "superseded" against the session's own base commit #346: no conflicts, go vet clean, both suites green together.

Two live items (3065ecfb, 4c71d3a3) were waiting on this fix to self-heal and are still wedged because it never shipped.

🤖 Generated with Claude Code

tstapler and others added 7 commits August 5, 2026 12:21
…session's own base commit

ItemSession.LastCommitSha was written exactly once — at session spawn, with the
worktree's pre-work HEAD — and never refreshed as the agent committed. A
session's base commit is by construction already an ancestor of main, so
git.IsCommitOnMain on it is unconditionally true. Two consumers trusted the
field as "the session's latest commit":

- closeIfSupersededByMain (session/backlog_lifecycle.go) closed the item's open
  PR unmerged and marked the item done.
- GetBacklogItemShipStatus, which backs the item detail page's Ship PR status.

Live blast radius, from backlog_status_events in the deployed instance: 15 PRs
were auto-closed as "superseded". Four distinct items cite the identical SHA
654c601, three cite 4eca0ed — a 2026-06-01 benchmark-baseline chore
commit used to close three PRs on 2026-07-29 — and one cites cc66c0b, a
2026-04-09 test commit. Unrelated items cannot all ship in one such commit;
these are spawn-time base SHAs. The most recent, PR #342 (BUG-047's own fix,
reviewed and CI-green), was closed against base SHA 1a75172 from ~24h before
that work started.

Fix, in three parts:

1. Split the concept. New ItemSession.base_commit_sha holds the spawn-time
   baseline for the review gate's base..HEAD diff; the three spawn write sites
   now call SetItemSessionBaseCommit instead of overloading the git-activity
   fields.
2. Make LastCommitSha true to its name. refreshWorkSessionGitActivity re-reads
   each live work session's real HEAD (go-git via the new git.CommitInfo, per
   .claude/rules/prefer-go-git-over-subshells.md) and recomputes
   commit_count_since_spawn. It is wired into the existing reconciliation
   sweep's detector list rather than adding a poller, and is registered first
   so same-tick consumers read fresh values.
3. Fix both consumers to resolve the session's real tip via
   resolveLatestWorkCommit — the remedy already applied to this file's
   reconcileBouncingItems and to isCodeShippedToMain, which
   closeIfSupersededByMain was never migrated to — plus an explicit
   BaseCommitSha guard so the fallback path can never re-enter the bug for
   rows already in production databases.

Also fixes a consistency bug this exposed: ship status resolved the SHA live
but captioned it with the stored (stale) commit message and timestamp.

ent schema regenerated with --feature sql/upsert per
.claude/rules/ent-schema-generation.md.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01W3683CH7Fs9zYR2yP3Dpba
Found while running make ci for the idle-reviewer-wedge fix — unrelated to
that change (confirmed already unformatted on origin/main), fixed as
collateral debt per repo convention rather than left blocking CI.

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

A reviewer session that submits a verdict via submit_review_verdict and then
never exits (process alive, no further output) was invisible to both
handleReviewSessionExited (session-exit only) and
reconcileUnprocessedReviewVerdicts' crash-recovery sweep (requires the
session confirmed dead via SessionLivenessChecker) — wedging the item in
"review" forever.

- submitReviewVerdict now drives the review->in_progress transition eagerly
  for FAIL/PARTIAL/UNVERIFIABLE verdicts via the existing AutoReopenSpawner
  (server/mcp/tools_backlog.go), reusing AutoReopenAfterFailedReview's
  CAS-guarded (ExpectedStatus: review) transition, rework-cap/circuit-breaker
  checks, and work-session respawn logic rather than reimplementing them.
  PASS stays deferred to handleReviewSessionExited, unchanged.
- reconcileUnprocessedReviewVerdicts gets an idle-timeout OR condition:
  a verdict older than reviewVerdictIdleThreshold (2h, matching
  maxWorkSessionStaleness) is now actionable even when SessionLivenessChecker
  reports the session alive — covers PASS verdicts and any case the eager
  path doesn't reach (e.g. no AutoReopenSpawner wired).
- The review-role prompt (BuildReviewPrompt, get_backlog_item's review-role
  guidance, and the sdd pipeline mode's review template) now instructs the
  reviewer to end its session immediately after calling
  submit_review_verdict, symmetric to the work-role prompt's existing
  "Do NOT end your session" instruction — closing the root behavioral cause.
- BUG-051 (session/tmux flaking under make ci's parallel load) is fixed on
  main and verified green here; docs/bugs marked fixed and moved accordingly.

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

Four-agent parallel review (testing, code quality, architecture, security)
on PR #342 surfaced two real MAJOR correctness gaps and three MAJOR test
coverage gaps; security review found nothing. Addressing all five here:

- server/server.go: nil-guard deps.BacklogService before boxing it into the
  session.AutoReopenSpawner interface param passed to NewHTTPHandler,
  mirroring the other three nil-checks already on this same field in this
  function. A nil *services.BacklogService boxed directly into the interface
  produces a non-nil interface value around a nil pointer (the classic Go
  typed-nil trap) — submitReviewVerdict's own `h.autoReopener != nil` guard
  would read true and the call would panic on the nil receiver instead of
  being skipped.
- server/mcp/tools_backlog.go: the eager AutoReopenAfterFailedReview call now
  runs on a context.WithoutCancel + 30s-bounded context instead of the live
  request ctx. AutoReopenAfterFailedReview's only other callers run on
  long-lived background contexts; its own rollback-on-spawn-failure path
  reuses whatever ctx it's given, so inheriting the request ctx meant a
  client-side disconnect could cancel both the transition attempt and its
  own safety-net rollback together.
- Added 3 test cases: nil-autoReopener now asserts the item stays in review
  (not just "no crash"), a just-under-threshold idle-timeout subtest guards
  the strict `>` comparison's boundary, and a PASS-outcome idle-timeout
  subtest covers the idle-timeout branch's stated primary remaining purpose
  (PASS stays deferred to session-exit by design, so this sweep is the only
  path back out of review for a PASS verdict whose reviewer went idle).

make ci green (build, full suite incl. -race/integration, lint, registry
regen, no drift).

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

Self-review of the LastCommitSha split found three places that read the field
for its *base* meaning, which the live refresh would have silently broken:

- review_gate.go's directory-mode branch passed LastCommitSha as GetGitDiff's
  base. Once that field tracks the tip, this diffs the tip against itself and
  every directory-mode review gets an EMPTY diff — a silent review bypass.
- GetBaseCommitSHAsForSessions (despite its name) selected last_commit_sha to
  restore dirBaseSHA at startup, giving those sessions a moving diff base.
- UpdateItemSessionGitActivity set last_progress_at from the commit's author
  timestamp. Author dates survive rebases, and this repo rebases session
  worktrees onto main routinely, so a rebase would push the staleness clock
  backwards and hand a healthy, actively-committing session to stale_work
  remediation. Progress is recorded when observed; last_commit_at keeps the
  true author time for display.

The first two read base_commit_sha with a fallback to last_commit_sha for rows
written before the split. That fallback is only safe because the original bug
meant both fields held the same value on every legacy row — it is explicitly
not extended to rows that have a base_commit_sha.

Adds TestUpdateItemSessionGitActivity_should_RecordProgressAtObservationTime_When_CommitIsBackdated,
verified to fail against the author-timestamp version.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01W3683CH7Fs9zYR2yP3Dpba
Picks up the three base-vs-latest consumer corrections found in self-review
(review_gate.go's directory-mode diff base, GetBaseCommitSHAsForSessions, and
the last_progress_at clock) so this branch is tested against the final form of
the reconciler fix it stacks on.
@tstapler
tstapler changed the base branch from fix/item-session-last-commit-live-tracking to main August 5, 2026 20:02
@tstapler
tstapler marked this pull request as ready for review August 5, 2026 20:02
Copilot AI lite review requested due to automatic review settings August 5, 2026 20:02

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.

Restores and completes the fix for BUG-047 where backlog items could remain wedged in review if a reviewer submits a verdict but the session stays alive/idle, and wires the auto-reopen capability into the MCP server path.

Changes:

  • Adds an eager review -> in_progress transition on reject verdicts (FAIL/PARTIAL/UNVERIFIABLE) via AutoReopenSpawner, plus nil-safe wiring in the HTTP MCP server.
  • Extends the crash-recovery sweep to treat old review verdicts as actionable even if the reviewer session is still “alive”.
  • Updates review prompts/guidance and adds regression tests for the prompt text and the new lifecycle behaviors.

Reviewed changes

Copilot reviewed 15 out of 15 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
session/pipeline_mode_seed.go Updates the reviewer prompt template to instruct immediate session exit after verdict submission.
session/backlog_review.go Injects the “end session after verdict” instruction into the generated review prompt.
session/backlog_review_test.go Adds regression test asserting the review prompt includes the new instruction.
session/backlog_lifecycle.go Adds idle-verdict timeout condition and new threshold constant for sweep actionability.
session/backlog_lifecycle_test.go Adds test helper to create backdated verdicts for sweep tests.
session/backlog_lifecycle_stuck_test.go Expands reconcile tests to cover idle-timeout behavior (including PASS-case shipping).
server/server.go Wires AutoReopenSpawner into MCP HTTP handler with correct nil-interface guarding.
server/mcp/server.go Extends MCP constructors/runner to accept an optional AutoReopenSpawner.
server/mcp/server_integration_test.go Updates integration test to match NewCore signature.
server/mcp/feature_flag_test.go Updates feature-flag tests to match NewCore signature.
server/mcp/tools_backlog.go Implements eager auto-reopen call on reject verdicts with timeout and cancellation semantics.
server/mcp/tools_backlog_test.go Adds tests for reviewer guidance and eager auto-reopen behavior (including nil-safety and error swallow).
server/services/backlog_service_triage_test.go Adds regression tests asserting CAS-harmless behavior and work-session spawn on auto-reopen.
main.go Updates stdio MCP run path to pass nil AutoReopenSpawner and documents behavior.
docs/bugs/fixed/BUG-051-session-tmux-package-flaky-under-parallel-quick-check.md Marks BUG-051 as fixed and appends recurrence/resolution notes.

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

Comment on lines +1822 to +1823
if !dead && latest.Edges.ReviewVerdict != nil && time.Since(latest.Edges.ReviewVerdict.CreatedAt) > reviewVerdictIdleThreshold {
// A reviewer that submitted a verdict and then simply never exited
Comment on lines +702 to +706
reopenCtx, reopenCancel := context.WithTimeout(context.WithoutCancel(ctx), 30*time.Second)
if reopenErr := h.autoReopener.AutoReopenAfterFailedReview(reopenCtx, itemID); reopenErr != nil {
log.WarningLog.Printf("[submitReviewVerdict] AutoReopenAfterFailedReview item=%s: %v", itemID, reopenErr)
}
reopenCancel()
Comment on lines +318 to +319
you read. End your session immediately after calling submit_review_verdict - do not
wait, poll, or do further work.
@tstapler tstapler closed this Aug 5, 2026
@tstapler tstapler reopened this Aug 5, 2026
@github-actions

github-actions Bot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

✅ Registry Validation

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

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

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

✅ Registry validation passed. Divergence: 0.0%

Test Coverage: 31/184 features have testIds (16.8%)

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

@github-actions

github-actions Bot commented Aug 5, 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:96: missing iteration count
tier1-bench.txt:195: 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.03n ± 0%
CircularBufferWrite_4KB_Allocs-4                                   79.21n ± 1%
CircularBufferGetRecent_4KB-4                                      554.6n ± 7%
CircularBufferGetAll-4                                             3.789µ ± 2%
GetTimeSinceLastMeaningfulOutput_HotPath-4                         70.16n ± 1%
GetTimeSinceLastMeaningfulOutput_ColdPath-4                        34.51n ± 1%
geomean                                                            178.4n

                                            │ 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.67Gi ± 1%
CircularBufferGetRecent_4KB-4                       6.879Gi ± 8%
geomean                                             18.11Gi

cpu: Intel(R) Xeon(R) Platinum 8370C CPU @ 2.80GHz
                                            │ tier1-bench.txt │
                                            │     sec/op      │
CircularBufferWrite_4KB-4                        200.5n ±  7%
CircularBufferWrite_4KB_Allocs-4                 201.7n ±  9%
CircularBufferGetRecent_4KB-4                    648.6n ±  3%
CircularBufferGetAll-4                           5.308µ ± 10%
GetTimeSinceLastMeaningfulOutput_HotPath-4       50.20n ±  0%
GetTimeSinceLastMeaningfulOutput_ColdPath-4      25.56n ±  0%
geomean                                          237.3n

                                            │ 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          19.03Gi ± 6%
CircularBufferGetRecent_4KB-4      5.882Gi ± 3%
geomean                            10.58Gi

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.057n ± 2%
StripANSI_WithEscapes-4                              653.0n ± 0%
ProcessOutput_InactiveState-4                        6.613n ± 1%
geomean                                              31.24n

                              │ 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) Platinum 8370C CPU @ 2.80GHz
                              │ tier1-bench.txt │
                              │     sec/op      │
StripANSI_PlainText-4               6.793n ± 2%
StripANSI_WithEscapes-4             697.8n ± 0%
ProcessOutput_InactiveState-4       17.05n ± 1%
geomean                             43.24n

                              │ 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                       93.06n ± 12%
ReviewQueue_Add-4                                   506.4n ±  1%
geomean                                             217.1n

                              │ 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) Platinum 8370C CPU @ 2.80GHz
                              │ tier1-bench.txt │
                              │     sec/op      │
ReviewQueue_ConcurrentReads-4       85.56n ± 3%
ReviewQueue_Add-4                   490.4n ± 0%
geomean                             204.8n

                              │ 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.468µ ± 2%
CircularBuffer_BurstAppend-4                                 107.1µ ± 1%
CircularBuffer_GetLastN_LargeBuffer-4                        20.29µ ± 1%
CircularBuffer_GetRange_Sequential-4                         14.62µ ± 7%
CircularBufferAppend-4                                       107.8n ± 0%
CircularBufferGetLastN-4                                     2.564µ ± 2%
CircularBufferConcurrentAppend-4                             137.7n ± 1%
geomean                                                      3.292µ

                                      │ 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                       570.0Mi ± 5%

cpu: Intel(R) Xeon(R) Platinum 8370C CPU @ 2.80GHz
                                      │ tier1-bench.txt │
                                      │     sec/op      │
CircularBuffer_ConcurrentReadWrite-4        3.361µ ± 2%
CircularBuffer_BurstAppend-4                111.0µ ± 0%
CircularBuffer_GetLastN_LargeBuffer-4       21.42µ ± 2%
CircularBuffer_GetRange_Sequential-4        13.26µ ± 6%
CircularBufferAppend-4                      106.8n ± 0%
CircularBufferGetLastN-4                    2.415µ ± 2%
CircularBufferConcurrentAppend-4            151.5n ± 1%
geomean                                     3.286µ

                                      │ 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      549.7Mi ± 0%

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.093n ± 4%
StripANSICodes_WithEscapes-4                        617.1n ± 1%
IsBanner_PlainText-4                                468.0n ± 1%
geomean                                             127.0n

                             │ 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) Platinum 8370C CPU @ 2.80GHz
                             │ tier1-bench.txt │
                             │     sec/op      │
StripANSICodes_PlainText-4         6.756n ± 1%
StripANSICodes_WithEscapes-4       667.3n ± 0%
IsBanner_PlainText-4               457.8n ± 0%
geomean                            127.3n

                             │ 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                            5.550m ± 2%
DetectCommandsInText/NoSlash-4                            6.434n ± 4%
DetectCommandsInText/WithCommand-4                        1.492µ ± 1%
geomean                                                   3.763µ

                                   │ 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

cpu: Intel(R) Xeon(R) Platinum 8370C CPU @ 2.80GHz
                                   │ tier1-bench.txt │
                                   │     sec/op      │
TokenParser_ProcessUserEntry-4           4.557m ± 2%
DetectCommandsInText/NoSlash-4           6.615n ± 1%
DetectCommandsInText/WithCommand-4       1.600µ ± 1%
geomean                                  3.640µ

                                   │ 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

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.336m ± 1%
DiffShortstat/GoGitVCSReader-4                        81.17n ± 0%
DiffShortstatCached-4                                 80.52n ± 0%
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) Platinum 8370C CPU @ 2.80GHz
                               │ tier1-bench.txt │
                               │     sec/op      │
DiffShortstat/GitVCSReader-4         2.334m ± 1%
DiffShortstat/GoGitVCSReader-4       59.95n ± 0%
DiffShortstatCached-4                60.15n ± 0%
geomean                              2.034µ

                               │ 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 5, 2026

Copy link
Copy Markdown
Contributor

E2E RPC Latency

list-sessions-ttfb-mean: 4ms (▼ faster -58.8%; baseline: 9ms)
list-sessions-total-mean: 5ms (▼ faster -64.7%; baseline: 14ms)

@github-actions

github-actions Bot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

Frontend Terminal Throughput

terminal-throughput-mean: 12 KB/s ▼ -14.0% (baseline: 14 KB/s)
terminal-throughput-p50: 15 KB/s ▼ -3.8% (baseline: 16 KB/s)

@github-actions

github-actions Bot commented Aug 5, 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 86b41f5 into main Aug 5, 2026
23 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