Session Bench v5

E2E: 0ms for 42 sessions (2 alive, 2 panes) | Correctness: 6/6 | 5 trials/op

E2E List
0ms
Sessions
42
Alive
2
JSONL
353 / 630MB
Correct
6/6

Correctness

CheckExpectedActualDetail
Total sessions matches sessions.yaml4242
Alive count matches it2api cross-ref2 (yaml entries with live panes)2it2api: 2 panes total
No alive session has state=no_pane00
All dead sessions are no_pane0 exceptions0 exceptions
--alive-only returns only alive sessions22
No unregistered Claude panes00

E2E Operations

OperationWhatMedianMin–Max±NDistribution
session_tool list (42 sessions, 2 alive) Full E2E: load yaml, query 2 panes, read JSONL versions, detect quiescence + wait states — parallel enrichment 839ms 827–859 ±14 5 839ms
session_tool list --alive-only (2 alive) Same as list but filters to 2 alive sessions after enrichment 838ms 819–842 ±9 5 838ms
session_tool cleanup --dry-run Load yaml + it2api list → find stale entries. No buffer reads 411ms 404–442 ±15 5 411ms
find --state idle Metadata-only: yaml + it2api list + title-based state. No rg, no buffer reads 412ms 406–420 ±6 5 412ms — 2 results
find 'model' 3-phase: metadata match → rg across all JSONL → parallel buffer reads for state 881ms 873–1280 ±176 5 881ms — 2 results
find 'benchmark' --all Same 3-phase but includes dead sessions (no pane). More JSONL matches to process 847ms 837–860 ±9 5 847ms — 21 results

Component Costs

ComponentWhatMedianMin–MaxNBar
it2api list-sessions List all iTerm2 panes — one subprocess spawn 303ms 292–312 5 303ms
it2api get-buffer (1 pane) Read terminal buffer for one pane — ~300ms is Python process startup 302ms 297–314 5 302ms
get-buffer x2 sequential Read 2 pane buffers one at a time 603ms 589–617 5 603ms
get-buffer x2 ThreadPool(12) Read 2 pane buffers via ThreadPoolExecutor(12) — current production path 384ms 369–418 5 384ms
rg content search (630MB) ripgrep 'model' across 353 JSONL files 59ms 53–74 5 59ms
JSONL version (1 session) Direct path lookup from cwd + seek last 8KB for version field 0ms 0–0 5 0ms
JSONL version (42 sessions) Direct path + seek tail for all 42 sessions 5ms 4–5 3 5ms — Found version in 23/42
tab color cycle (1 pane) set_tab_color → use_tab_color=true → use_tab_color=false. 3 it2api calls 982ms 949–1051 5 982ms
Hub DB badge load SQLite query for session badges 1ms 0–1 5 1ms — 0 badges
claude --version Get installed CC version — cached for 5min in production 52ms 52–55 3 52ms
YAML + it2api cross-ref Load sessions.yaml + it2api list → match entries to panes. Minimum cost for liveness check 306ms 300–342 5 306ms — 2 alive of 42

Scaling: How session_tool list Scales with N Alive Sessions

Fixed costs: yaml+it2api list (306ms) + JSONL version reads (5ms) + hub DB (~5ms).
Variable cost: buffer reads for alive sessions — 302ms per call via it2api subprocess.

N aliveSequentialThreadPool(12)MCPretentious (projected)
1 618ms 618ms 317ms
2 921ms 618ms 318ms
5 1827ms 618ms 322ms
10 3339ms 618ms 328ms
15 4850ms 921ms 334ms
25 7873ms 1223ms 346ms

ThreadPool(12): Currently implemented. Parallelizes buffer reads — effective when N > 12 (batches of 12).
MCPretentious: NOT implemented. Persistent WebSocket → 255x faster per buffer read (302ms → 1.2ms). The remaining optimization.

Optimization Status

OptimizationImpact
ThreadPoolExecutor(12) for buffer readsN×302ms → ceil(N/12)×302ms
Direct JSONL path from cwd (no rglob)~1000ms → 5ms for 42 sessions
seek(-8KB) tail read (no readlines)Avoids loading 45MB JSONL files
Cached claude --version (5min TTL)~50ms saved per call after first
MCPretentious for buffer reads302ms → 1.2ms per read (255x)

Generated: 2026-02-06 12:00:32 | v5