Skip to content

Deleting a file does not remove it from the review queue#171

Merged
tstapler merged 14 commits into
mainfrom
backlog/stapler-squad-fix-review-queue-stale-entries-r5
Jul 18, 2026
Merged

Deleting a file does not remove it from the review queue#171
tstapler merged 14 commits into
mainfrom
backlog/stapler-squad-fix-review-queue-stale-entries-r5

Conversation

@tstapler

Copy link
Copy Markdown
Owner

Summary

Fixes a bug where deleting a file that was the sole uncommitted change in a worktree left a stale entry in the Unfinished Work review queue instead of clearing it.

Changes

  • fix(unfinished): remove stale scan results when a worktree transitions from dirty to clean during scanRepo, mirroring the existing CleanWorktree removal pattern used by the review queue poller/determiner
  • feat(unfinished): add removeStaleResult to delete the stored result and publish EventUnfinishedWorkRemoved so subscribers drop the entry immediately rather than waiting for it to age out
  • test(unfinished): add TestScanRepo_RemovesStaleResultWhenWorktreeBecomesClean covering the dirty→clean transition and the removal event
  • chore: sync backlog tracking metadata (.backlog-context.md, .claude/commands/backlog/*) to the current item ID

Test plan

  • go test ./session/unfinished/... covering the new TestScanRepo_RemovesStaleResultWhenWorktreeBecomesClean test
  • Manual: create a worktree with an uncommitted file, confirm it appears in the Unfinished Work queue, delete the file, confirm the entry disappears without waiting for the normal scan aging-out period

tstapler and others added 13 commits July 17, 2026 16:52
…us-desync bug

Second, compounding root cause for "nothing merges": GitHub repo-level
allow_auto_merge is disabled, so EnablePRAutoMerge's gh pr merge --auto
call has been silently failing on every PR. Also notes the pr_pending
status-desync bug blocking ReconcilePRPending for PR #157, and a
fabricated subagent report incident from this audit pass.
…icy scope

Confirmed via direct code read: GetPRStatus never distinguishes a
still-running check from a passed one, so ReconcilePRPending's healthy-PR
branch can fire the ready-to-merge notification before CI finishes. Also
records the backlog-pr-mergeability-policy SDD scoping outcome and an
open design tension between repo-level auto-merge (enabled this session)
and the plan's per-item-gated auto-merge design.
…ng don't self-heal

Systematic pass over all 7 StuckReasons: only pr_pending auto-recovers.
orphaned_triage's code comment falsely claims self-healing it doesn't
actually do. bouncing has no escalation path. Also confirms the MCP
controller-startup issue from the earlier audit doesn't affect
backlog-spawned sessions, which are fully wired synchronously.
…stuck rows

Live-verified via the deployed reconciliation sweep: the abandoned-review
auto-respawn correctly fires exactly once for newly-notified rows, but
rows already marked notified before the fix deployed never trigger a
respawn since it shares the same notify-once gate. Correct going forward,
just doesn't retroactively catch pre-existing stuck items.
…session/tmux

session/integration_test.go's TestMain reaper only recognized
"test_coldrestore_" socket names, silently missing "test-isolated-" (the name
testSocketOnce in session/tmux generates and every package's tests share).
session/mux had no reaper at all. A SIGKILLed test binary in either package
left its tmux server running indefinitely — confirmed live in production as
4 multi-day-old orphaned "tmux: server" processes eating memory and holding
stale worktree paths.

Consolidate into testutil/tmuxreap, a dependency-free leaf package (unlike
testutil itself, which already imports session/session-mux/session-tmux and
so can't be imported by their internal-package test files without a cycle).
All three packages' TestMain now call the same ReapLeakedTestServers /
StartTestServerWatchdog, covering the full set of test socket prefixes.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XXewUpVzfJEKJoKMg99JNN
Ad-hoc merges into ~40 backlog/agent worktrees (done manually this session
to land the tmux-reaper fix) showed the gap plainly: worktrees silently
drift behind main until someone remembers to merge by hand, so fixes on
main (test hygiene, lint rules, bugfixes) don't reach in-progress or idle
backlog worktrees on their own.

`make sync-worktrees` merges main into every worktree, skips any with
uncommitted changes, and aborts + reports (without forcing a resolution)
any real conflict for manual follow-up. Safe to re-run — a no-op once
everything's current.

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

Considered a Go-side periodic reconciler (session/git.MergeMainIntoWorktree
already exists and is used by AutoReopenForPRFix's syncPRBranchWithMain) but
that only helps a narrow case — SpawnSessionFromItem always branches a fresh
worktree off current main on every real reopen, so external auto-merge would
mostly be a no-op and would need its own "is this worktree actively in use"
safety check to avoid yanking the tree out from under a running agent.

Simpler and safer: WriteBacklogContextFile already regenerates
.backlog-context.md on every spawn AND every re-attach (see
AttachSessionToItem in backlog_service_sync.go) — the harness's existing
state-management touchpoint the agent reads as its briefing. Telling the
agent to merge main as its own first step is inherently safe (it's the one
about to use the worktree) and it can actually resolve a trivial conflict,
where a background script could only abort and flag it.

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

An item could reach "done" once PrURL existed at all — an open, unmerged, or
later-reverted PR still has PrURL set, so it always satisfied the old guard.
"Approval" (a PASS review verdict) and "shipped" (code actually on main) were
being conflated: a PASS verdict says the code is good, not that it landed.

Three separate call sites could drive a review→done transition, and only one
(the TransitionBacklogItemStatus RPC) had any shipped-code guard at all —
TriggerReReview's and SubmitManualReview's auto-transition-on-PASS bypassed
it entirely by calling storage.TransitionBacklogItemStatus directly. All
three now route through the same isCodeShippedToMain check.

"Shipped" means the most recent work session's commit is an ancestor of
main — checked locally AND via origin (a PR merged remotely on GitHub
doesn't require a local pull to count; a commit merged directly to main
locally never went through a PR at all). Implemented as git.IsCommitOnMain
using go-git (no subshell — see the new prefer-go-git-over-subshells rule),
with an origin fetch that's best-effort so an offline/unreachable remote
doesn't block the local-merge case.

Verification failure fails closed: if the commit can't be confirmed shipped
(or the check errors), the transition is blocked rather than silently
trusting a stale PrURL. The RPC path keeps its override_reason escape
hatch; the two internal auto-transition paths have none by design — they
leave the item in review for a human to decide via the RPC path instead.

ErrPRRequired renamed to ErrCodeNotOnMain to match what it actually checks
now; no external callers referenced the old name (verified via repo-wide
grep, zero test references either).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XXewUpVzfJEKJoKMg99JNN
Documents the isCodeShippedToMain fix (PrURL alone no longer proves shipped;
all 3 done-transition call sites now gated) and the resulting audit of all
11 current status=done items: 4 confirmed MERGED via gh, 7 confirmed on
main via git ancestry, zero improperly closed. Also re-notes the live DB
path trap (workspaces/d685c4b1a423cca3/sessions.db, not the top-level
~/.stapler-squad/sessions.db) that the existing "Skill Fix Needed" entry
already flagged.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XXewUpVzfJEKJoKMg99JNN
The Version Control section in BacklogItemDetail only ever showed live
VCSStatus, fetched via a live in-memory session Instance (findInstanceFast).
Once a done item's work session is stopped and its worktree cleaned up —
the normal end state — there's no Instance left to query, so the widget
silently rendered nothing. Not a bug exactly (there's no live "now" left to
show for a deleted directory), but a real gap: no way to see how an item
shipped after the fact.

Adds GetBacklogItemShipStatus, a new read-only RPC answering "did this
actually ship" from durable evidence instead: repo_path + the most recent
work session's commit. Reuses this session's IsCommitOnMain (shipped
locally or via a merged PR) and adds git.BranchAheadBehind (go-git, no
subshell) to show the branch's position relative to main when it still
exists, or "(deleted — already merged)" once it's been cleaned up post-ship.

Frontend: useBacklogItemShipStatus + ShipStatusDisplay render as the
fallback exactly when the live vcsStatus comes back empty, so active
sessions keep seeing live git status and done items get the historical
"shipped via PR #N" / "shipped directly to main" badge instead.

Also fixes the backend feature-registry scanner: GetBacklogItemShipStatus
wasn't in proto_scanner.go's methodToID table, so it fell back to the raw
method name as its feature ID and never matched its own +api: marker.

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

Two real gaps in "what happened to this item's code," both closed with
durable-git-history evidence rather than a live session:

1. GetBacklogItemDiff fell back to diffing whatever's currently checked out
   in item.RepoPath once a work session's worktree directory was gone (the
   normal state for a done item) — silently wrong or empty, not what the
   branch actually shipped. GetGitDiffRef already existed for exactly this
   ("worktrees share the same object store, so any ref reachable from any
   worktree resolves correctly regardless of dir") but wasn't being used
   here. Now always diffs from item.RepoPath with an explicit headRef, so it
   works identically whether the worktree still exists or not.

2. Tyler: "are we able to identify which commits were shipped to main from
   the branch so I can see that diff, kind of like we link to the PR" — adds
   git.ListShippedCommits (base..head ancestry walk, same pattern as
   BranchAheadBehind) and wires it into GetBacklogItemShipStatus as
   ShipStatusDisplay's commit list (newest first, like a PR's Commits tab),
   plus a "View Diff" button that opens the same ReviewChangesModal already
   used by the review flow — now unconditionally, not gated to review status,
   since the diff fix above makes it work for any item regardless of status.

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

Deleting the only uncommitted file in a worktree left a stale entry in
the Unfinished Work scanner's resultStore since nothing ever cleared
it once the worktree scanned clean again. Mirrors the existing
CleanWorktree removal pattern from review_queue_poller.go/
review_queue_determiner.go instead of inventing a new mechanism.

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

Copy link
Copy Markdown
Contributor

✅ Registry Validation

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

Building backend scanner...
Scanning backend features...
Wrote 116 feature files to /tmp/tmp.Yu4yxEJyHU/backend
Wrote 14 feature files to /tmp/tmp.Yu4yxEJyHU/backend
Wrote 39 feature files to /tmp/tmp.Yu4yxEJyHU/backend
Wrote 6 feature files to /tmp/tmp.Yu4yxEJyHU/backend
Wrote 10 feature files to /tmp/tmp.Yu4yxEJyHU/backend

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

✅ Registry validation passed. Divergence: 0.0%

Test Coverage: 11/173 features have testIds (6.4%)

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

github-actions Bot commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

Go Benchmarks (Tier 1)

benchmarks/go/tier1-baseline.txt:98: missing iteration count
benchmarks/go/tier1-baseline.txt:198: missing iteration count
tier1-bench.txt:98: missing iteration count
tier1-bench.txt:198: missing iteration count
goos: linux
goarch: amd64
pkg: github.com/tstapler/stapler-squad/session
cpu: AMD EPYC 7763 64-Core Processor                
                                            │ benchmarks/go/tier1-baseline.txt │          tier1-bench.txt          │
                                            │              sec/op              │   sec/op     vs base              │
CircularBufferWrite_4KB-4                                          80.34n ± 2%   80.71n ± 1%       ~ (p=0.279 n=8)
CircularBufferWrite_4KB_Allocs-4                                   81.50n ± 1%   82.37n ± 1%       ~ (p=0.137 n=8)
CircularBufferGetRecent_4KB-4                                      489.8n ± 1%   497.6n ± 2%  +1.59% (p=0.012 n=7)
CircularBufferGetAll-4                                             3.909µ ± 8%   4.170µ ± 8%       ~ (p=0.314 n=8)
GetTimeSinceLastMeaningfulOutput_HotPath-4                         65.54n ± 0%   65.83n ± 0%  +0.44% (p=0.001 n=8)
GetTimeSinceLastMeaningfulOutput_ColdPath-4                        33.09n ± 0%   33.07n ± 0%  -0.06% (p=0.014 n=7)
geomean                                                            173.4n        176.3n       +1.67%

                                            │ 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                           47.48Gi ± 2%   47.26Gi ± 1%       ~ (p=0.279 n=8)
CircularBufferGetRecent_4KB-4                       7.788Gi ± 1%   7.667Gi ± 2%  -1.56% (p=0.017 n=7)
geomean                                             19.23Gi        19.04Gi       -1.01%

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.873n ± 0%   6.868n ± 0%       ~ (p=0.202 n=8)
StripANSI_WithEscapes-4                              746.7n ± 0%   745.9n ± 0%       ~ (p=0.665 n=8)
ProcessOutput_InactiveState-4                        6.314n ± 1%   6.343n ± 0%       ~ (p=0.314 n=8)
geomean                                              31.88n        31.91n       +0.10%

                              │ 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                        83.19n ± 6%   95.90n ± 5%  +15.28% (p=0.000 n=8)
ReviewQueue_Add-4                                    506.0n ± 1%   505.9n ± 1%        ~ (p=0.940 n=8)
geomean                                              205.2n        220.3n        +7.36%

                              │ 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.974µ ± 2%   3.899µ ± 1%  -1.87% (p=0.015 n=8)
CircularBuffer_BurstAppend-4                                 102.4µ ± 1%   101.7µ ± 1%  -0.65% (p=0.007 n=8)
CircularBuffer_GetLastN_LargeBuffer-4                        19.93µ ± 0%   20.26µ ± 5%       ~ (p=0.099 n=8)
CircularBuffer_GetRange_Sequential-4                         10.92µ ± 1%   10.91µ ± 1%       ~ (p=0.820 n=8)
CircularBufferAppend-4                                       97.99n ± 0%   97.56n ± 0%  -0.44% (p=0.001 n=8)
CircularBufferGetLastN-4                                     2.260µ ± 2%   2.242µ ± 1%       ~ (p=0.291 n=8)
CircularBufferConcurrentAppend-4                             127.1n ± 1%   125.7n ± 0%  -1.10% (p=0.003 n=8)
geomean                                                      3.057µ        3.042µ       -0.48%

                                      │ 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.2Mi ± 1%   600.1Mi ± 0%  +0.66% (p=0.007 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.877n ± 5%   6.869n ± 1%       ~ (p=0.137 n=8)
StripANSICodes_WithEscapes-4                        694.1n ± 0%   690.9n ± 0%  -0.48% (p=0.002 n=8)
IsBanner_PlainText-4                                484.9n ± 0%   481.2n ± 0%  -0.78% (p=0.000 n=8)
geomean                                             132.3n        131.7n       -0.46%

                             │ 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.352m ± 1%   5.422m ± 3%  +1.31% (p=0.038 n=8)
DetectCommandsInText/NoSlash-4                            7.497n ± 0%   7.495n ± 0%       ~ (p=0.740 n=8)
DetectCommandsInText/WithCommand-4                        1.659µ ± 1%   1.730µ ± 1%  +4.25% (p=0.000 n=8)
geomean                                                   4.053µ        4.127µ       +1.83%

                                   │ 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.297 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.467 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.176m ± 1%   3.116m ± 0%  -1.88% (p=0.000 n=8)
DiffShortstat/GoGitVCSReader-4                        76.92n ± 0%   76.61n ± 0%  -0.40% (p=0.011 n=8)
DiffShortstatCached-4                                 75.55n ± 1%   75.70n ± 0%       ~ (p=0.078 n=8)
geomean                                               2.643µ        2.624µ       -0.69%

                               │ benchmarks/go/tier1-baseline.txt │           tier1-bench.txt            │
                               │               B/op               │     B/op      vs base                │
DiffShortstat/GitVCSReader-4                       56.57Ki ± 0%     56.58Ki ± 0%       ~ (p=0.798 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

📊 Feature E2E Coverage

Feature coverage report unavailable

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

@github-actions

github-actions Bot commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

Frontend Terminal Throughput

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

@github-actions

github-actions Bot commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

E2E RPC Latency

list-sessions-ttfb-mean: 9ms (▲ slower +30.9%; baseline: 7ms)
list-sessions-total-mean: 13ms (▼ faster -5.2%; baseline: 13ms)

@github-actions

github-actions Bot commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

🎬 E2E Feature Demos

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

recordings shard 1
recordings shard 2

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

These match .gitignore rules already but were tracked from before the
rule was added, so gitignore had no effect and automation kept
committing per-worktree state to them. git rm --cached only; local
copies are untouched.

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

Copy link
Copy Markdown
Contributor

✅ Registry Validation

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

Building backend scanner...
Scanning backend features...
Wrote 116 feature files to /tmp/tmp.oaxxKbbVMz/backend
Wrote 14 feature files to /tmp/tmp.oaxxKbbVMz/backend
Wrote 39 feature files to /tmp/tmp.oaxxKbbVMz/backend
Wrote 6 feature files to /tmp/tmp.oaxxKbbVMz/backend
Wrote 10 feature files to /tmp/tmp.oaxxKbbVMz/backend

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

✅ Registry validation passed. Divergence: 0.0%

Test Coverage: 11/173 features have testIds (6.4%)

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

@tstapler
tstapler merged commit 6df61c8 into main Jul 18, 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.

1 participant