Analytics
Token + cost savings with charts, persistent across restarts. Compression breakdown by source (filter / indexer / intercept). Compliance rate meter.
Routing — TaskTier distribution (U.1c)
Above the cost-projection chart sits the Routing distribution card. A 24h/7d picker scopes the window; a Stacked/Grouped picker chooses between tier totals (default) and a per-rung split (Primary / Fallback 1 / Fallback 2) so operators can spot fallback churn at a glance. Tap on a bar to open a drill-down sheet listing the underlying agent_trace_event rows — feature, model, tokens in/out, latency, and result. The sheet is the inspection surface; the chart is the at-a-glance gauge.
If the chart is empty, the empty-state copy says so explicitly: "No routing data yet — TaskTier was introduced in u1a; charts populate as new traces land." A fresh database has no router output until a TaskTier-aware caller writes its first trace row.
Plan variance — actual vs. planned cost (U.6c)
Between the routing card and the cost-projection chart sits the Plan Variance card. It plots Karpathy's residual — actual cost minus planned cost, in cents — for every split / filter / reduce combinator call that paired a context_plans row with a matching agent_trace_event. A 24h/7d picker scopes the window. The header surfaces four stat cells (N paired, unpaired, signed median Δ, percent paired) so the operator reads the central tendency before reading the bars. Bars are colour-coded under-budget / exact / over-budget; bin edges are fixed at [-100, -50, -10, 0, 10, 50, 100]¢ with open-ended < and ≥ end bins so an outlier never silently drops a row.
Below three paired plans the chart waits — empty-state copy explains both the no-plans case (no combinator calls in the window) and the under-N-threshold case (need ≥ 3 paired plans for a stable histogram), so the operator never thinks the analytics broke. Rejected plans (BudgetGate denied) and closure-thrown plans persist their context_plans row but no agent_trace_event; they show up in the unpaired count, not the bars — rejection and execution are pivot-distinct.
Keyboard
Open via ⌘K → type the pane name. Close with ⌘W. Focus with ⌘+digit (the pane's position on the canvas).