Session dashboard

An at-a-glance history of every Claude Code session in this project.

Stream: session-dashboard · BORG ITERATE of vibe-replay · closed 2026-07-03

What it answers

  • A chat window got pushed offscreen — an agent ran unwatched for hours.
  • The need: see how sessions went, what they cost, what progressed.
  • Three wants, all aggregate: retro, cost/efficiency, a progress record.
  • Scope held tight: this project's sessions only, one view.

What it built

  • session_dashboard.py plus a session-dashboard skill and 10 green tests.
  • One self-contained, offline HTML dashboard — generated on demand.
  • First real render: 109 sessions, 941 prompts, ~$3860 estimated.
  • Reads this project's ~/.claude/projects/.../*.jsonl logs.

Terminology

No new terms coined or pinned this stream.

vibe-replay, retro, and BORG ITERATE are borrowed labels, not entries in notes/terminology.md — so none earns a slide.

(Precedent: the facade-retirement deck.)

How — the decision

  • vibe-replay is an npm CLI our harness cannot install.
  • Its team / PR-sharing value does not fit a solo researcher.
  • BORG verdict was BLOCK → user overrode to ITERATE.
  • Steal the pattern (logs to at-a-glance report), keep zero npm.

How — the build

  • Pure Python on new-pin-env: stdlib plus Plotly 6.3.1, already importable.
  • Pipeline: glob → parse_sessionbuild_html → write → print path.
  • estimate_cost prices each assistant record by its own model.
  • No real session found → STOP (the log-driver rule).

What we learned — the logs

  • type lives at BOTH record and content-block level — walk the JSON, never grep it.
  • A real prompt is a user record minus meta, sidechain, and tool-result.
  • Thin / interrupted sessions exist — tolerate zeros, still list them.
  • Cost is never stored in the logs — it has to be estimated from tokens.

What we learned — cost is an estimate

  • Tokens are logged, dollars are not — a price table is the only source.
  • Base prices pulled from the claude-api skill, never fabricated.
  • Cache rates are fixed multipliers of input: 0.1x read, 1.25x / 2x write.
  • Unknown model → cost 0 plus a visible note, never a guessed price.

Side effects

  • .gitignore gained generated_reports/ — output carries session text, not for publishing.
  • A BORG ledger line landed in notes/borg/CHANGELOG-borg.md.
  • estimate_cost was promoted to public — load-bearing, past the underscore-helper bar.
  • Found while wiring output: neither generated_reports/ nor logs/ existed at the repo root.

What comes next

  • Four items deferred, retired from the board 2026-07-03 (re-board on demand):
  • per-session drill-down · board progress block · cross-project · git-commit correlation.
  • Open question: do /resume multi-file sessions merge? (v1: one file = one session.)
  • No blockers — state: done, v1 done-condition met.