Skip to content

Put backlog behind a feature flag by default#175

Merged
tstapler merged 16 commits into
mainfrom
backlog/stapler-squad-gate-backlog-mcp-tools
Jul 19, 2026
Merged

Put backlog behind a feature flag by default#175
tstapler merged 16 commits into
mainfrom
backlog/stapler-squad-gate-backlog-mcp-tools

Conversation

@tstapler

Copy link
Copy Markdown
Owner

This diff doesn't match the branch. backlog/stapler-squad-gate-backlog-mcp-tools implies gating the MCP backlog/goal tools behind backlogCtrl.IsEnabled (per the deleted .backlog-context.md's acceptance criteria: server/mcp/tools_backlog.go, useFeatureFlags() in backlog-sources/page.tsx, server/features/backlog.go badge reconciliation) — none of that appears here.What's actually in the diff:- Deletion of the stale .backlog-context.md / .claude/commands/backlog/* triage-session artifacts (same cleanup pattern as the earlier branches)- A rewrite of .claude/commands/perf/make-it-faster.md to use go tool pprof -top instead of raw curl captures, plus updated "known hotspots" tables- A codesigning.md doc addition explaining why Info.plist must live in macos/ not the repo root- Two new rules: prefer-go-git-over-subshells.md and sdd-planning-artifacts-commit.md- A new skill backlog-feature-improvement/SKILL.mdIt's also cut off mid-sentence at the end ("...deserv"), so there may be more, but none of what's visible touches tools_backlog.go, the feature-flags page, or features/backlog.go.Before I write a PR description, want me to pull the full/actual diff for this branch (git diff main...backlog/stapler-squad-gate-backlog-mcp-tools or similar) so I'm describing what's really there instead of the branch's stated intent?

tstapler and others added 16 commits July 11, 2026 09:54
…klog flag

The "backlog" feature flag already defaulted off and gated ConnectRPC calls
and nav visibility (66b1d83), but two surfaces still bypassed it:

- server/mcp/server.go registered backlog/goal MCP tools via a dead
  `storage != nil` check, so an agent session could read/mutate backlog
  data over MCP even with the flag off. Added a live `enabledCheck func()
  bool` to backlogHandlers/goalHandlers (checked on every call, so a
  runtime toggle takes effect without restarting the MCP server) and gated
  registration itself at startup. Threaded backlogCtrl.IsEnabled through
  the HTTP transport and cfg.GetFeatureFlag through the stdio transport.
- web-app/src/app/settings/backlog-sources had no feature-flag guard and
  was reachable by direct URL when disabled. Added a layout.tsx redirect
  guard matching backlog/layout.tsx, and hid its settings-page nav link
  when the flag is off.

Also reconciled three stale StatusStable badges in server/features/backlog.go
to StatusExperimental to match the hidden-by-default framing.

Backlog item: df0d5872-9da4-4498-8a31-da355fb6ee07

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Backlog item: df0d5872-9da4-4498-8a31-da355fb6ee07

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

A rework/reopen cycle can leave a session's stored worktree path pointing at
a directory that no longer exists (recreated elsewhere, or removed by a
concurrent cleanup). IsDirty() had no error-caching path, so a broken
worktree got re-checked (and re-spawned a git subprocess) on every poller
tick indefinitely — 439 failed spawns in 20 minutes observed live on one
session. Cache the failure with a 60s backoff, same mechanism already used
for dirty/clean results.
Added to the generated unit:
- MemoryHigh/MemoryMax (60%/80% of detected system RAM) so a runaway burst
  of concurrent agent sessions is contained to this service's cgroup instead
  of taking down the whole box, the way the 2026-07-12 OOM incident did.
- A mild OOMScoreAdjust=-500 nudging survival odds toward the coordinator.
- StartLimitIntervalSec/Burst raised so systemd doesn't permanently disable
  the unit after a burst of OOM-kill/restart cycles during sustained
  pressure (default 5-restarts/10s can trip in one bad episode).
…ion audit trail

Resilience fixes (2026-07-12 OOM follow-up):
- WIP cap now counts live work sessions across both in_progress and review
  status. AutoReopenAfterFailedReview intentionally leaves a work session
  alive polling for a verdict once an item flips back to "review" — the old
  in_progress-only count made those sessions invisible to the concurrent
  agent limit.
- Cold-restore now re-detects the Claude conversation UUID immediately via
  the live process's open files instead of leaving it blank until some
  unrelated caller triggers detection later. A second crash/restart in that
  window previously lost conversation resumability entirely.
- Headless triage sessions get a 30-minute staleness threshold instead of
  the general 2h one — an open headless-triage row reliably means dead, not
  slow, so operators were waiting up to 2h for a notification.
- New reconcileUnprocessedReviewVerdicts detector: a review session can die
  (crash/OOM/restart) after recording its verdict but before its exit event
  reaches the code that acts on it (push+PR on PASS, auto-reopen otherwise).
  The existing zombie detector only fires when EVERY session on the item is
  confirmed dead, but AutoReopenAfterFailedReview's live-session-reuse keeps
  a work session open polling for the verdict — so the item never looked
  like a zombie even though the review side was the one that died. Found
  live: a work session correctly determined its item's PASS verdict was
  already recorded with nothing left to build, but had no way to force the
  review->done transition itself, and looped forever re-requesting a review
  the backlog system correctly rejected.

Audit trail (the data behind the above was already being recorded but never
reached the UI):
- BacklogStatusEvent.note (the human-readable reason for a transition, e.g.
  "auto-reopened after FAIL verdict") is now exposed over the wire and shown
  in the item's Workflow timeline.
- New BacklogProgressNote proto message + GetBacklogItem eager-load surfaces
  the implementer's full report_progress call history as a "Progress
  History" section.
- Review verdicts (already wired to the frontend, never rendered) now show
  per-criterion outcome + evidence + summary under each session.
- The triggeredBy actor is now always shown, not just when it's "user".
Two test fixture builders were missed when the progressNotes field was
added to the BacklogItem domain type in the audit-log work — left them
failing tsc's structural check.
…isibility

Rework-cap override:
- New nilable BacklogItem.rework_cap_override column (nil = global default,
  0 = unlimited for this item, >0 = this item's own cap), threaded through
  the repository DTOs, proto, and UpdateBacklogItem RPC.
- The three automatic-retry call sites (AutoReopenAfterFailedReview,
  AutoReopenForPRFix, AutoRespawnReview) now read effectiveReworkCap(item)
  instead of only the global default.
- The Unfinished tab's rework_cap card gets a real inline control — set a
  new cap or remove it entirely, which immediately reopens the item —
  replacing static guidance text that only pointed at buttons elsewhere.

Autonomous turn-cap visibility ("conversions limit"):
- New StuckReasonAutonomousStuck / STUCK_REASON_AUTONOMOUS_STUCK. When an
  autonomous driver run stops without a DONE signal, onAutonomousDriverComplete
  now writes a durable BacklogStuckState row (additive to the existing
  ephemeral notification), so a turn-cap stop shows up in the Unfinished tab
  like every other stuck reason instead of only reaching the Alerts feed.
- Treated as event-shaped (resolved only via an explicit action, not a
  status anchor) because a stuck work-role run still transitions
  in_progress->review regardless of outcome — anchoring on in_progress would
  false-resolve the row before an operator ever saw it. That existing
  transition behavior is unchanged; flagged in comments as a separate,
  not-yet-made decision.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FnJx6jAdjfXRVV1uJtkaeZ
TransitionGuard only matched from==review, so a pr_pending item could reach
done via a bare TransitionBacklogItemStatus call with no verdict or
shipped-code check at all. Found live: a real backlog item reached done
while its GitHub PR was still open with merge conflicts, permanently
orphaning that PR from ReconcilePRPending's monitoring (which only polls
pr_pending-status items) — most likely a manual "Approve" click that didn't
notice a fresh conflict had just been surfaced.

Widens the guard to `to == done`, the only two edges (review->done and
pr_pending->done) that reach it in validTransitions. The automated
ReconcilePRPending path that legitimately drives pr_pending->done already
verifies IsPRMerged() itself first, so its behavior is unchanged — this only
closes the gap for every other caller.
… call

CreatePR reused an existing PR's URL correctly but derived its number from a
separate `gh pr view --head` subprocess call whose failure was silently
swallowed, leaving prNumber at 0. That 0 then flowed into
EnablePRAutoMerge(0), which predictably failed with "no pull requests
found" — so auto-merge silently never got enabled for a PR that otherwise
pushed and tracked correctly.

Parses the number directly from the URL (a plain string op that can't fail
the way a subprocess can) first, falling back to the gh-view lookup only if
the URL doesn't parse.
3 was tripping routinely on real, ultimately-fixable items (a flaky
diff/review harness needing a few extra passes, a straightforward merge
conflict) well before the work was actually stuck, forcing manual "Reopen
for Revision" clicks for otherwise-recoverable items. Genuinely stuck items
still get caught, just later. Per-item overrides (BacklogItemData.
ReworkCapOverride, added earlier) remain available for items that need to
go further still.
…ces page.tsx

Previous review flagged AC1 as PARTIAL: the guard existed only in a sibling
layout.tsx, not on page.tsx as the acceptance criterion specifies. Wraps the
page's own render output in RequireFeatureFlag so it can never render gated
content even outside the layout tree.
…ee bootstrap context

RequireFeatureFlag wraps page render output behind a feature flag check via
useFeatureFlags(), for Server Component pages that need a client-side gate
without losing their static metadata export. Also refreshes the backlog
worktree bootstrap files (.backlog-context.md, backlog/review command) for
this item's rerun.
…Unknown Session" placeholder

tmux session creation was failing with a bare "exit status 1" across
multiple backlog items with no way to diagnose why. Route stderr to a
scratch file (not a buffer/pipe — a detached tmux server inherits and
holds the fd open, so a buffer-based read blocks forever) so the real
tmux error surfaces in the returned error.

Separately, sessionless notification events (e.g. notifyReworkCapHit)
were defaulting sessionName to "Unknown Session", which won the
NotificationPanel/Toast fallback chain over the notification's own
real title. Default to empty string instead so the real title shows.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FnJx6jAdjfXRVV1uJtkaeZ
…x stderr test

The stderr capture landed in the prior commit surfaced the real tmux
failure across every backlog auto-fix/review spawn: "command too
long". install-service.sh embeds "$PATH:<fallbacks>" verbatim into the
systemd unit / LaunchAgent on every install, with no dedup — repeated
installs from a shell whose own PATH already carries duplicates (e.g.
nested tool/plugin PATH prepends) compound further each time, since
the next install's shell inherits the bloated unit-derived PATH. Here
that reached 360 entries / ~11.8KB, and re-embedding it via `-e
PATH=...` in every spawned tmux session pushed the total `new-session`
command past tmux's message-size limit, breaking session creation
project-wide.

dedup_path collapses it back to first-occurrence order (360 entries /
11.8KB -> 46 / 1.4KB here); also removes a duplicated copy-pasted PATH
block in install_linux.

Also add TestStartTmuxSession_IncludesTmuxStderrOnFailure covering the
stderr-capture change from the prior commit.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FnJx6jAdjfXRVV1uJtkaeZ
Resolves conflicts by keeping this branch's backlogEnabled gating
(MCP tool registration + settings page RequireFeatureFlag guard)
alongside main's independent changes (thin-client MCP proxy fast
path, review-trigger wiring, Pipeline Modes settings link, and the
generalized zero-criteria golden test fixture).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YLti8cQKbKqAh7GsnDocaf
@tstapler
tstapler merged commit 0c768d7 into main Jul 19, 2026
9 of 10 checks passed
@github-actions

Copy link
Copy Markdown
Contributor

✅ Registry Validation

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

Building backend scanner...
Scanning backend features...
Wrote 116 feature files to /tmp/tmp.3ImBghE3wL/backend
Wrote 14 feature files to /tmp/tmp.3ImBghE3wL/backend
Wrote 40 feature files to /tmp/tmp.3ImBghE3wL/backend
Wrote 6 feature files to /tmp/tmp.3ImBghE3wL/backend
Wrote 10 feature files to /tmp/tmp.3ImBghE3wL/backend

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

✅ Registry validation passed. Divergence: 0.0%

Test Coverage: 13/174 features have testIds (7.5%)

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

@github-actions

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

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                
                                            │ benchmarks/go/tier1-baseline.txt │          tier1-bench.txt          │
                                            │              sec/op              │   sec/op     vs base              │
CircularBufferWrite_4KB-4                                          83.11n ± 1%   81.76n ± 3%       ~ (p=0.442 n=8)
CircularBufferWrite_4KB_Allocs-4                                   84.20n ± 1%   84.64n ± 2%       ~ (p=0.574 n=8)
CircularBufferGetRecent_4KB-4                                      482.0n ± 1%   517.2n ± 2%  +7.30% (p=0.001 n=7)
CircularBufferGetAll-4                                             3.702µ ± 3%   3.989µ ± 1%  +7.77% (p=0.000 n=8)
GetTimeSinceLastMeaningfulOutput_HotPath-4                         65.81n ± 0%   65.73n ± 1%       ~ (p=0.098 n=8)
GetTimeSinceLastMeaningfulOutput_ColdPath-4                        33.06n ± 0%   33.08n ± 0%       ~ (p=0.634 n=7)
geomean                                                            173.4n        177.3n       +2.25%

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

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

                              │ benchmarks/go/tier1-baseline.txt │          tier1-bench.txt           │
                              │               B/s                │     B/s       vs base              │
CircularBufferWrite_4KB-4                           45.90Gi ± 0%   46.66Gi ± 3%       ~ (p=0.442 n=8)
CircularBufferGetRecent_4KB-4                       7.914Gi ± 1%   7.376Gi ± 2%  -6.80% (p=0.001 n=7)
geomean                                             19.06Gi        18.55Gi       -2.66%

pkg: github.com/tstapler/stapler-squad/session/detection/ratelimit
                              │ benchmarks/go/tier1-baseline.txt │          tier1-bench.txt          │
                              │              sec/op              │   sec/op     vs base              │
StripANSI_PlainText-4                                6.865n ± 0%   6.866n ± 0%       ~ (p=0.898 n=8)
StripANSI_WithEscapes-4                              749.6n ± 0%   752.0n ± 2%       ~ (p=0.959 n=8)
ProcessOutput_InactiveState-4                        6.339n ± 0%   6.340n ± 1%       ~ (p=0.818 n=8)
geomean                                              31.95n        31.99n       +0.12%

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

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

pkg: github.com/tstapler/stapler-squad/session/queue
                              │ benchmarks/go/tier1-baseline.txt │          tier1-bench.txt          │
                              │              sec/op              │   sec/op     vs base              │
ReviewQueue_ConcurrentReads-4                        91.79n ± 3%   85.29n ± 6%  -7.09% (p=0.000 n=8)
ReviewQueue_Add-4                                    496.0n ± 0%   506.8n ± 1%  +2.18% (p=0.000 n=8)
geomean                                              213.4n        207.9n       -2.56%

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

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

pkg: github.com/tstapler/stapler-squad/session/scrollback
                                      │ benchmarks/go/tier1-baseline.txt │          tier1-bench.txt           │
                                      │              sec/op              │    sec/op     vs base              │
CircularBuffer_ConcurrentReadWrite-4                        3.951µ ±  3%   3.818µ ±  2%  -3.38% (p=0.000 n=8)
CircularBuffer_BurstAppend-4                                102.4µ ±  1%   101.9µ ±  0%       ~ (p=0.130 n=8)
CircularBuffer_GetLastN_LargeBuffer-4                       20.72µ ±  3%   20.47µ ±  2%       ~ (p=0.083 n=8)
CircularBuffer_GetRange_Sequential-4                        14.57µ ± 12%   13.32µ ±  3%       ~ (p=0.065 n=8)
CircularBufferAppend-4                                      102.8n ± 15%   101.0n ± 15%  -1.70% (p=0.035 n=8)
CircularBufferGetLastN-4                                    2.620µ ±  3%   2.486µ ±  4%  -5.13% (p=0.015 n=8)
CircularBufferConcurrentAppend-4                            127.8n ±  1%   128.1n ±  1%       ~ (p=0.491 n=8)
geomean                                                     3.293µ         3.197µ        -2.94%

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

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

                             │ benchmarks/go/tier1-baseline.txt │        tier1-bench.txt        │
                             │               B/s                │     B/s       vs base         │
CircularBuffer_BurstAppend-4                       596.0Mi ± 1%   598.8Mi ± 1%  ~ (p=0.130 n=8)

pkg: github.com/tstapler/stapler-squad/session/tmux
                             │ benchmarks/go/tier1-baseline.txt │          tier1-bench.txt          │
                             │              sec/op              │   sec/op     vs base              │
StripANSICodes_PlainText-4                          6.880n ± 0%   6.873n ± 0%       ~ (p=0.555 n=8)
StripANSICodes_WithEscapes-4                        692.4n ± 0%   687.1n ± 0%  -0.77% (p=0.010 n=8)
IsBanner_PlainText-4                                480.6n ± 0%   476.6n ± 1%  -0.83% (p=0.010 n=8)
geomean                                             131.8n        131.0n       -0.57%

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

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

pkg: github.com/tstapler/stapler-squad/session/tokens
                                   │ benchmarks/go/tier1-baseline.txt │          tier1-bench.txt          │
                                   │              sec/op              │   sec/op     vs base              │
TokenParser_ProcessUserEntry-4                            5.262m ± 1%   5.329m ± 2%       ~ (p=0.130 n=8)
DetectCommandsInText/NoSlash-4                            7.490n ± 0%   7.486n ± 2%       ~ (p=0.523 n=8)
DetectCommandsInText/WithCommand-4                        1.668µ ± 0%   1.647µ ± 1%  -1.23% (p=0.000 n=8)
geomean                                                   4.036µ        4.035µ       -0.01%

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

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

pkg: github.com/tstapler/stapler-squad/session/unfinished
                               │ benchmarks/go/tier1-baseline.txt │          tier1-bench.txt          │
                               │              sec/op              │   sec/op     vs base              │
DiffShortstat/GitVCSReader-4                          3.112m ± 0%   3.086m ± 1%  -0.86% (p=0.001 n=8)
DiffShortstat/GoGitVCSReader-4                        76.76n ± 0%   76.64n ± 0%       ~ (p=0.111 n=8)
DiffShortstatCached-4                                 75.58n ± 0%   75.51n ± 1%       ~ (p=0.645 n=8)
geomean                                               2.623µ        2.614µ       -0.37%

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

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

@github-actions

Copy link
Copy Markdown
Contributor

🎬 E2E Feature Demos

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

recordings shard 1
recordings shard 2

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

@github-actions

Copy link
Copy Markdown
Contributor

E2E RPC Latency

list-sessions-ttfb-mean: 8ms (▲ slower +133.5%; baseline: 4ms)
list-sessions-total-mean: 15ms (▲ slower +132.2%; baseline: 6ms)

@github-actions

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

Copy link
Copy Markdown
Contributor

Frontend Terminal Throughput

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

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