INTERACTIVE DEMO — SYNTHETIC DATA
Agent Session Observability
A local dashboard for every Claude Code session on one machine. Scrub a fabricated session and watch the state machine, the estimator and the cost attribution decide what to say about it.
Every record on this page is fabricated. No production system, customer, employee or credential is involved.
The production code behind this demo is my own work — design, implementation.
ONE SESSION, ELEVEN MOMENTS
01:02 · working
The ordinary case. Something was written a second ago, so rule 6 fires and the activity line names the tool call the session is inside.
THE ROW THE DASHBOARD WOULD DRAW
Working
running npx vitest run src/ledger
- Bash · npx vitest run src/ledger
- ~27–82 min · medium confidence
- no todo list yet
- 196k of 1.0M
- none
- $0.90 · 15 records
THE RULE STACK, IN THE ORDER IT IS WALKED
The first rule that matches decides the state, so every rule below it is never evaluated. The registry writes its own status field; it is consulted eleventh, because only sessions launched from the CLI write it at all.
- the process is not alive
- an unresolved API error inside the last 2 min
- a pending AskUserQuestion or ExitPlanMode
- a pending tool call WITH live child processes
- a pending tool call older than 10s, no children
- ▸ 6the transcript was written to under 120s agolast write 1s ago, inside the 120s window
THREE SIGNALS, AND WHAT EACH ONE ALONE WOULD SAY
Every row below is the same estimator, run with only that one signal available. The last row is what the dashboard actually shows.
| SIGNAL | ESTIMATE | CONFIDENCE | BASIS |
|---|---|---|---|
| Todo burn-down | unknown | none | none |
| Background agents | unknown | none | none |
| Project history | ~27–82 min | medium | historical |
| All three | ~27–82 min | medium | historical |
Point estimate 45m 18s, shown as a band because it is a guess. It is never rendered as a single number.
EQUIVALENT API COST, BY MODEL AND BY RATE CLASS
Nobody was charged this. The machine it runs on is on a flat subscription, so the figure is what the same tokens would have cost on API pricing — and the label says so, everywhere it appears.
- cache reads 855k
- cache writes (1h) 42k
- input 6.4k
- output 3.5k
| MODEL ID ON THE WIRE | PRICED AS | IN / OUT | USD |
|---|---|---|---|
| claude-opus-5[1m] | claude-opus-5 · $5/$25 per 1M | 5.0k / 2.8k | $0.86 |
| claude-sonnet-5 | claude-sonnet-5 · $2/$10 per 1M · intro rate | 1.4k / 740 | $0.04 |
One blended rate across those rows would be a different number, and it would look just as authoritative. The model id also arrives with a suffix — a variant tag or a date — so it is resolved by the longest matching table key rather than by an exact lookup, and an id the table has never seen is priced on the fallback and flagged, not dropped.
NAMING A BACKGROUND AGENT
A fan-out spawns agents from one template, so the first line of every prompt is the same shared preamble. Reading line one gives a panel of identical rows at exactly the moment it matters most. The heuristic scans the whole head for what actually distinguishes this agent: a role declaration, then a lane or phase marker, then a markdown heading, and only then line one.
No agent is running at the moment selected above. These three are shown anyway, because the heuristic is the point rather than the timing.
AGENT 1 — POSTING RULE AUDITOR
LANE 2 — PERIOD BOUNDARY REGRESSION SWEEP
Currency rounding on multi-leg reversals