Every coding session you have run, as runs. No SDK, no exporter, no proxy.
Claude Code and the Codex CLI already write down everything they do, one transcript per session, on your own
disk. traza-server import turns those transcripts into runs — every model response a
step, every tool call a step, every sub-agent an agent span — and --watch follows the
sessions you are running now.
Point it at the default locations. That is the setup.
It reads ~/.claude/projects (each session’s transcript and its sub-agents’) and
~/.codex/sessions (rollouts, compressed ones included). The formats are undocumented and change with
their tools, so they are read leniently: a record of a type the importer does not know is counted and skipped,
never an error.
Ids are derived from the transcripts themselves, so importing twice leaves one copy of each span, and a restart
of --watch sends nothing twice. The token is never written down.
From the engine’s recorders guide
traza-server --data-dir ./data &# a server (or use one you have)
traza-server import claude-code # every Claude Code session here
traza-server import codex # every Codex session here
traza-server import claude-code --watch&# and keep following live ones
traza-server blame src/cart.rs:42 # who wrote line 42?
What the importer counted on the engine’s synthetic transcripts
Claude Code
Codex
Sessions
2
2
Spans sent
21
21
Prompts (turns)
3
4
Model calls
11
11
Tool calls
6
5
Failed tool calls
1
1
Sub-agents
1
1
Input tokens
240
5,300
Cache-read tokens
8,400
3,900
Records of a type not yet understood (counted, skipped)
1
1
Lines that were not JSON (counted)
1
0
Demo corpus
Real output of traza-server 0.28.0 over the engine’s synthetic Claude Code and Codex transcripts (4 sessions), imported with traza-server import, recorded 2026-10-18 by
scripts/demo-numbers.mjs. Synthetic runs with known outcomes, not customer data.
What the recorded sessions answer
Everything Traza reads from runs, on your coding sessions.
With nothing else set up. These are the engine’s answers over its two synthetic Claude Code sessions — a toy cohort, here to show the shape of each answer, not a finding about Claude Code.
Which first moves ended well
The sessions of one tool are one cohort, so GET /v1/fate/map?agent=claude-code shows how past sessions
branched. Asked with min_support=1 (two sessions are below the default of three):
llm:claude-sonnet-4-5-20250929 → tool:Read: 1 of 1 succeeded
llm:claude-sonnet-4-5-20250929 → tool:Write: 0 of 1 succeeded
A hotspot of 1.0 bit after the first call: the sessions split there.
Who wrote this line
Agent Blame finds the tool step whose edit introduced an exact line, and the prompt and model behind it.
src/cart.rs: self.items.iter().map(|item| item.price).sum() Edit at step 3 on claude-sonnet-4-5-20250929, prompt “Add a total to the cart summary”
src/item.rs: pub price: u64, MultiEdit at step 10, by sub-agent general-purpose on claude-haiku-4-5-20251001, prompt “Add a price field to Item in src/item.rs”
Behaviours worth knowing about
Nine named detectors run over every
session — test tampering, give-up loops, edit thrash, blind retries and more — each an ordinary TQL query.
unverified_finish (low): finished without testing the last edit — two of four sessions
test[error] ..> edit: Bash at step 5, then MultiEdit at step 10
What the model saw, and what changed
Each call’s context is rebuilt from the conversation’s recorded deltas, so the X-Ray and
the Cache Autopsy work on any session. The change radar reads the tool’s version, so an upgrade is a change point.
On the demo: claude-code: no configuration or behaviour change across 2 runs.
Demo corpus
Real output of traza-server 0.28.0 over the engine’s synthetic Claude Code and Codex transcripts (4 sessions), imported with traza-server import, recorded 2026-10-18 by
scripts/demo-numbers.mjs. Synthetic runs with known outcomes, not customer data.
On Traza Cloud
Every developer’s sessions, in one view.
Each developer gets their own ingest key, labelled with their name, and imports with it. The organization’s
Coding agents page then shows:
Spend by developer, by repository (the session’s working directory), by model and by sub-agent.
Cache efficiency and the dollars lost to cache breaks, from a Cache Autopsy of the window’s ten most expensive sessions, summed into one figure.
Detector findings: test tampering, edit thrash and the rest, with the sessions that tripped them.
AI share of the codebase, estimated by sampling lines through Agent Blame — labelled as the estimate it is.
Sending to Traza Cloud. The importer speaks plain HTTP and refuses an https://
URL, so it cannot reach api.trazadb.com directly. The engine’s traza forward runs beside it,
listening on loopback and passing each request to https://api.trazadb.com over TLS. The Claude Code hook pack speaks
HTTPS itself.
The formats are undocumented. A change the importer does not understand shows up in its counts, not as an error, and the shapes it understands are written down in the engine.
A transcript leaves out the system prompt and tool definitions, so an X-Ray of an imported call shows the conversation only, and the Cache Autopsy judges the recorded part of the prefix.
No cost is invented. Tokens are recorded and priced by your pricing table; without cache rates, a cache-heavy Claude Code session’s cost is understated and a cache-heavy Codex session’s overstated.
Blame cannot see lines written by shell commands (sed -i, heredocs, generators), or edits whose arguments were not recorded.
Codex sub-agents join their root thread’s run but are not nested under the call that spawned them: the rollout does not record which call spawned which thread.