E2E: 0ms for 42 sessions (2 alive, 2 panes) | Correctness: 6/6 | 5 trials/op
| Check | Expected | Actual | Detail | |
|---|---|---|---|---|
| ✓ | Total sessions matches sessions.yaml | 42 | 42 | |
| ✓ | Alive count matches it2api cross-ref | 2 (yaml entries with live panes) | 2 | it2api: 2 panes total |
| ✓ | No alive session has state=no_pane | 0 | 0 | |
| ✓ | All dead sessions are no_pane | 0 exceptions | 0 exceptions | |
| ✓ | --alive-only returns only alive sessions | 2 | 2 | |
| ✓ | No unregistered Claude panes | 0 | 0 |
| Operation | What | Median | Min–Max | ± | N | Distribution |
|---|---|---|---|---|---|---|
| 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 | What | Median | Min–Max | N | Bar |
|---|---|---|---|---|---|
| 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 |
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 alive | Sequential | ThreadPool(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 | Impact | |
|---|---|---|
| ✓ | ThreadPoolExecutor(12) for buffer reads | N×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 reads | 302ms → 1.2ms per read (255x) |
Generated: 2026-02-06 12:00:32 | v5