backcheck reads Claude Code transcripts today. Nothing about the idea is Claude-specific —
every coding agent writes a session log containing what it said and what it ran, which is all
the analysis needs.
Widening this is the single highest-leverage change to the project: the verification engine,
the runner parsers, and the tamper detection are all agent-agnostic already.
The shape of the work
Only src/transcript.rs is Claude-specific. It normalises a
session file into three things the rest of the code consumes:
ToolCall { seq, name, input, result } — what ran, and what it printed
AssistantText { seq, text, is_last } — what the agent said
- ordering, so a claim can be compared against evidence that preceded it
Everything downstream (claims, evidence, verify, tamper, report) already works purely
against those types. Adding an agent means writing a parser that produces them, plus discovery
of where that agent stores its sessions.
Agents worth supporting
Suggested approach
- Introduce a
Source trait (or an enum) with parse(path) -> Transcript and a
discover() for the agent's default session location.
- Move the current Claude Code logic behind it, unchanged.
- Auto-detect by path and file shape, with
--agent <name> to force it.
- Add a small fixture per agent under
tests/fixtures/ — hand-written, never a real
transcript, since those contain real code and sometimes secrets.
Starting with one agent end-to-end is much more useful than a framework for all of them.
Comment here with which you're taking so two people don't write the same parser.
Worth knowing
Claude Code does not record exit codes, which is why outcomes are recovered from printed
output. If another agent does record them, that is strictly better evidence — the design
should let a source say "I know the exit code" rather than forcing everything through text
parsing.
backcheckreads Claude Code transcripts today. Nothing about the idea is Claude-specific —every coding agent writes a session log containing what it said and what it ran, which is all
the analysis needs.
Widening this is the single highest-leverage change to the project: the verification engine,
the runner parsers, and the tamper detection are all agent-agnostic already.
The shape of the work
Only
src/transcript.rsis Claude-specific. It normalises asession file into three things the rest of the code consumes:
ToolCall { seq, name, input, result }— what ran, and what it printedAssistantText { seq, text, is_last }— what the agent saidEverything downstream (
claims,evidence,verify,tamper,report) already works purelyagainst those types. Adding an agent means writing a parser that produces them, plus discovery
of where that agent stores its sessions.
Agents worth supporting
~/.codex/sessions/~/.gemini/.aider.chat.history.md(a different shape: prose plus diffs)Suggested approach
Sourcetrait (or an enum) withparse(path) -> Transcriptand adiscover()for the agent's default session location.--agent <name>to force it.tests/fixtures/— hand-written, never a realtranscript, since those contain real code and sometimes secrets.
Starting with one agent end-to-end is much more useful than a framework for all of them.
Comment here with which you're taking so two people don't write the same parser.
Worth knowing
Claude Code does not record exit codes, which is why outcomes are recovered from printed
output. If another agent does record them, that is strictly better evidence — the design
should let a source say "I know the exit code" rather than forcing everything through text
parsing.