Skip to content

fix(tmux): guard PTY triple with ptmxMu to eliminate ptmx data race - #377

Draft
tstapler wants to merge 2 commits into
mainfrom
backlog/stapler-squad-tmux-ptmx-race-fix-clean
Draft

fix(tmux): guard PTY triple with ptmxMu to eliminate ptmx data race#377
tstapler wants to merge 2 commits into
mainfrom
backlog/stapler-squad-tmux-ptmx-race-fix-clean

Conversation

@tstapler

@tstapler tstapler commented Aug 7, 2026

Copy link
Copy Markdown
Owner

Replaces #375, which unintentionally included 6 unrelated commits from other backlog sessions sharing the same local workspace (branched from a point ahead of origin/main that hadn't been pushed there yet). This branch is cherry-picked cleanly onto current origin/main with only the 2 commits relevant to this item.

Summary

go test -race intermittently failed TestServer_should_WriteUnchangedHookURL_When_StartedOnExplicitPort with a real data race on TmuxSession.ptmx — read from GetPTY() (via CreateSession's async controller-start goroutine) while concurrently written/nilled by closePTYAndAttachCmd() (via DeleteSession's cleanup goroutine). ptmx, attachCmd, and attachCmdWaitOnce (the "PTY triple") were read/written from 10+ call sites in session/tmux/tmux.go with no synchronization.

Fixes backlog item c42de545-ee23-420f-950b-d7635ab6ae27.

What Changed

  • Added ptmxMu deadlock.Mutex + three helper methods (lockedPTMX, setPTYTriple, clearPTYTriple) to TmuxSession, and converted every read/write site (AttachToExisting, RestoreWithWorkDir, closePTYAndAttachCmd, GetPTY, TapEnter/TapDAndEnter/SendKeys, updateWindowSize, both Attach() goroutines) to go through them.
  • closePTYAndAttachCmd snapshots the triple under the lock, then runs blocking cleanup (Close/Kill/Wait) outside it — ptmxMu is never held across I/O. Accepted side effect: concurrent closePTYAndAttachCmd callers now serialize instead of each racing Close()/Kill() independently (covered by a dedicated test, documented as intentional).
  • Added a grep-based make ptmx-field-guard CI target (wired into ci:) that fails the build if a future change reads/writes the PTY triple outside the three helpers.
  • Added TestSessionService_CreateThenImmediateDelete_NoDataRace (server/server_integration_test.go), which reproduces the original CreateSession/DeleteSession interleave directly instead of relying on the original test's incidental timing.
  • Added 11 new unit tests in session/tmux/tmux_test.go covering the helper methods, lock ordering (detachMutex outer → ptmxMu inner, never reversed), and regression coverage confirming every converted call site's pre-fix error strings/behavior are unchanged.

Two real, unrelated issues surfaced by broad -race -count=10 verification sweeps were filed separately rather than folded into this diff:

  • A genuine data race in session/instance_state.go's hibernation code — backlog item c23a9b30-62f3-4739-850f-6c1ae7025bd3.
  • A recurrence of the known load-triggered flakiness pattern already documented in docs/bugs/fixed/BUG-051-session-tmux-package-flaky-under-parallel-quick-check.md (logged there, not re-filed).

A known, deliberately out-of-scope check-then-act (TOCTOU) race in AttachToExisting/RestoreWithWorkDir (distinct from the data race this PR fixes — it's a logic race go test -race can't detect, requiring a larger behavioral change to close) is documented inline and tracked separately as backlog item 0f4b1300-d667-437b-b51f-89d81a668693.

Test plan

  • make ptmx-field-guard — passes on the fixed tree; verified it catches a planted violation (both t.-receiver and non-t-receiver forms) before reverting
  • go test -race ./session/tmux/... — passes (no failures, no races), re-verified on this rebased branch
  • go test -race ./session/... ./server/... -count=10 — no data race reported on ptmx/attachCmd/attachCmdWaitOnce
  • go test -race ./server/... -run TestServer_should_WriteUnchangedHookURL_When_StartedOnExplicitPort -count=20 — 20/20 pass
  • go test -race ./server/... -run TestSessionService_CreateThenImmediateDelete_NoDataRace -count=20 — 20/20 pass
  • make quick-check — build + test + lint all pass
  • Full sdd:6-verify pass (idiom, architecture, refactor-candidates review) — all findings resolved, zero BLOCKERs

🤖 Generated with Claude Code

tstapler and others added 2 commits August 6, 2026 18:28
Requirements, research, implementation plan, and ADR for fixing the
confirmed -race data race on TmuxSession.ptmx/attachCmd/attachCmdWaitOnce
(backlog item c42de545-ee23-420f-950b-d7635ab6ae27).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
TmuxSession.ptmx/attachCmd/attachCmdWaitOnce were read/written from 10+
call sites with no synchronization, causing a confirmed -race failure
when CreateSession's async controller-start goroutine (GetPTY) raced
DeleteSession's cleanup goroutine (closePTYAndAttachCmd).

Adds a ptmxMu deadlock.Mutex plus three helper methods (lockedPTMX,
setPTYTriple, clearPTYTriple) and converts every read/write site to use
them. closePTYAndAttachCmd snapshots the triple under the lock then runs
blocking cleanup (Close/Kill/Wait) outside it, so ptmxMu is never held
across I/O -- the accepted side effect is that concurrent
closePTYAndAttachCmd callers now serialize instead of each racing
Close()/Kill() independently, covered by a dedicated test.

Adds a grep-based `make ptmx-field-guard` CI target (wired into `ci:`)
so a future direct field access outside the three helpers fails the
build, plus a new TestSessionService_CreateThenImmediateDelete_NoDataRace
integration test that reproduces the original interleave directly
instead of relying on TestServer_should_WriteUnchangedHookURL_...'s
incidental timing.

Two real, unrelated issues surfaced by the -count=10 verification sweep
were filed separately rather than folded in here: a genuine data race
in session/instance_state.go's hibernation code (item c23a9b30), and a
recurrence of the known load-triggered flakiness pattern documented in
BUG-051. A known, deliberately out-of-scope check-then-act (TOCTOU) in
AttachToExisting/RestoreWithWorkDir is documented inline and tracked
separately (item 0f4b1300).

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

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

✅ Registry Validation

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

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

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

✅ Registry validation passed. Divergence: 0.0%

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

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

@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

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                                          82.47n ± 1%   81.28n ±  2%   -1.45% (p=0.007 n=8)
CircularBufferWrite_4KB_Allocs-4                                   83.54n ± 2%   82.55n ±  1%   -1.20% (p=0.000 n=8)
CircularBufferGetRecent_4KB-4                                      496.7n ± 3%   482.2n ±  1%   -2.92% (p=0.001 n=7)
CircularBufferGetAll-4                                             3.867µ ± 1%   4.576µ ± 17%  +18.34% (p=0.010 n=8)
GetTimeSinceLastMeaningfulOutput_HotPath-4                         65.84n ± 1%   65.73n ±  0%   -0.17% (p=0.002 n=8)
GetTimeSinceLastMeaningfulOutput_ColdPath-4                        32.78n ± 2%   32.78n ±  9%        ~ (p=0.793 n=7)
geomean                                                            174.8n        178.1n         +1.86%

                                            │ 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                           46.25Gi ± 2%   46.94Gi ± 2%  +1.47% (p=0.007 n=8)
CircularBufferGetRecent_4KB-4                       7.680Gi ± 3%   7.912Gi ± 1%  +3.02% (p=0.001 n=7)
geomean                                             18.85Gi        19.27Gi       +2.24%

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.864n ± 0%       ~ (p=0.124 n=8)
StripANSI_WithEscapes-4                              747.8n ± 1%   743.4n ± 0%  -0.59% (p=0.000 n=8)
ProcessOutput_InactiveState-4                        6.294n ± 1%   6.340n ± 0%  +0.73% (p=0.004 n=8)
geomean                                              31.86n        31.86n       +0.00%

                              │ 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                        87.04n ± 6%   95.52n ± 3%  +9.74% (p=0.000 n=8)
ReviewQueue_Add-4                                    506.0n ± 1%   502.8n ± 1%       ~ (p=0.130 n=8)
geomean                                              209.9n        219.2n       +4.43%

                              │ 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.795µ ± 2%   3.856µ ± 1%   +1.62% (p=0.007 n=8)
CircularBuffer_BurstAppend-4                                 101.1µ ± 0%   101.9µ ± 0%   +0.80% (p=0.000 n=8)
CircularBuffer_GetLastN_LargeBuffer-4                        20.16µ ± 4%   19.70µ ± 1%   -2.25% (p=0.000 n=8)
CircularBuffer_GetRange_Sequential-4                         12.42µ ± 8%   10.64µ ± 1%  -14.31% (p=0.000 n=8)
CircularBufferAppend-4                                       99.16n ± 1%   98.25n ± 0%   -0.92% (p=0.000 n=8)
CircularBufferGetLastN-4                                     2.540µ ± 2%   2.254µ ± 2%  -11.24% (p=0.000 n=8)
CircularBufferConcurrentAppend-4                             126.5n ± 1%   124.1n ± 1%   -1.90% (p=0.000 n=8)
geomean                                                      3.147µ        3.015µ        -4.21%

                                      │ 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                       604.0Mi ± 0%   599.2Mi ± 22%  -0.79% (p=0.000 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.871n ± 0%   6.869n ± 0%       ~ (p=0.778 n=8)
StripANSICodes_WithEscapes-4                        688.2n ± 0%   683.7n ± 0%  -0.65% (p=0.001 n=8)
IsBanner_PlainText-4                                477.2n ± 0%   479.0n ± 0%  +0.37% (p=0.019 n=8)
geomean                                             131.2n        131.0n       -0.11%

                             │ 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.099m ± 1%   5.007m ± 2%  -1.80% (p=0.038 n=8)
DetectCommandsInText/NoSlash-4                            7.490n ± 0%   7.488n ± 0%       ~ (p=0.975 n=8)
DetectCommandsInText/WithCommand-4                        1.664µ ± 1%   1.652µ ± 0%  -0.69% (p=0.005 n=8)
geomean                                                   3.990µ        3.957µ       -0.84%

                                   │ benchmarks/go/tier1-baseline.txt │           tier1-bench.txt            │
                                   │               B/op               │     B/op      vs base                │
TokenParser_ProcessUserEntry-4                         1.059Mi ± 4%     1.038Mi ± 2%       ~ (p=0.339 n=8)
DetectCommandsInText/NoSlash-4                           0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=8) ¹
DetectCommandsInText/WithCommand-4                       432.5 ± 0%       433.0 ± 0%       ~ (p=0.608 n=8)
geomean                                                             ²                 -0.64%               ²
¹ 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                           33.00 ± 0%     33.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.097m ± 1%   3.086m ± 1%  -0.36% (p=0.028 n=8)
DiffShortstat/GoGitVCSReader-4                        76.67n ± 0%   76.81n ± 1%       ~ (p=0.061 n=8)
DiffShortstatCached-4                                 75.71n ± 1%   75.43n ± 0%       ~ (p=0.088 n=8)
geomean                                               2.620µ        2.615µ       -0.18%

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

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

E2E RPC Latency

list-sessions-ttfb-mean: 4ms (▼ faster -18.4%; baseline: 4ms)
list-sessions-total-mean: 9ms (▲ slower +63.1%; baseline: 6ms)

@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Frontend Terminal Throughput

terminal-throughput-mean: 16 KB/s ▼ -0.5% (baseline: 16 KB/s)
terminal-throughput-p50: 16 KB/s ▼ -0.7% (baseline: 16 KB/s)

@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

📊 Feature E2E Coverage

Feature coverage report unavailable

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

@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

🎬 E2E Feature Demos

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

recordings shard 1
recordings shard 2

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant