Local by construction.
Events and checkpoints live in .turnal, outside your Git history.
Turnal pairs agent activity with byte-exact workspace checkpoints. Search what happened, trace a line to its prompt, verify an earlier state, and roll back with a safety net, all on your machine.
aadijo@MacBook-Pro Project % turnal log --all-worktrees --no-pager
checkpoint graph: 5 sessions, 13 turns, 2 rollbacks
sessions: [claude 14:20] [claude 14:46] [claude 14:16] [codex 14:28] [codex 14:12]
* 59a91d6d715f - 14:58 [claude 14:20] turn 4 Read +2 complete 2 files +18 -6 24 events; claude-code; tools: Read, Edit, Bash
| Prompt: "Return success for an event another worker already completed."
|
| * 583cb027b9f3 - 14:56 [claude 14:46] turn 2 Read +2 complete 3 files +31 -14 22 events; claude-code; tools: Read, Edit, Bash
| | Prompt: "Attach order and event ids to every checkout error."
| |
| | * e853a4e34acc - 14:54 [codex 14:28] turn 2 Read +2 complete 2 files +24 -3 19 events; codex; tools: Read, Edit, Bash
| | | Prompt: "Validate provider timeout values during startup."
| | |
! ! ! ! ! ------------ reverted to [codex 14:12] turn 2 68459d51926d
| | | | |
* | | 5027e8e66e1f - 14:49 [claude 14:20] turn 3 Read +2 complete 2 files +42 -19 28 events; claude-code; tools: Read, Edit, Bash
| | | Prompt: "Move the idempotency claim into the fulfillment transaction."
| | |
| * | 7d073c54cb16 - 14:46 [claude 14:46] turn 1 Read +3 complete 3 files +57 -8 26 events; claude-code; tools: Read, Write, Edit, Bash
| | | Prompt: "Add payment lifecycle correlation ids."
| | |
| | * 3251ca08a1b4 - 14:43 [codex 14:12] turn 3 Read +2 complete 2 files +29 -12 21 events; codex; tools: Read, Edit, Bash
| | | Prompt: "Separate duplicate delivery metrics from provider retries."
| | |
| * | | 7f68c3762e1a - 14:40 [claude 14:16] turn 2 Read +2 complete 2 files +16 -10 18 events; claude-code; tools: Read, Edit, Bash
| | | | Prompt: "Scope raw-body parsing to the Stripe route."
| | | |
! ! ! ! ! ------------ reverted to [claude 14:20] turn 1 pre 614611d0aa9f
| | | | |
* | | | eadff0409763 - 14:32 [claude 14:20] turn 2 Read +2 complete 2 files +23 -9 20 events; claude-code; tools: Read, Edit, Bash
| | | | Prompt: "Release the claim only for retryable failures."
| | | |
| | * | 993f79127546 - 14:28 [codex 14:28] turn 1 Read +3 complete 3 files +46 -2 23 events; codex; tools: Read, Write, Edit, Bash
| | | | Prompt: "Define provider timeout configuration."
| | | |
| | * 68459d51926d - 14:24 [codex 14:12] turn 2 Read +2 complete 1 file +63 -7 25 events; codex; tools: Read, Edit, Bash
| | | Prompt: "Synchronize eight delivery workers in the integration test."
| | |
* | | ad8a917cf3bd - 14:20 [claude 14:20] turn 1 Read +2 complete no file changes 17 events; claude-code; tools: Read, VectorSearch, Bash
| | | Prompt: "Map the existing fulfillment boundary."
| | |
* | deef09f4d71a - 14:16 [claude 14:16] turn 1 Read +2 complete no file changes 15 events; claude-code; tools: Read, VectorSearch, Bash
| | Prompt: "Trace the parsed request-body path."
| |
* b31b0e743646 - 14:12 [codex 14:12] turn 1 Read +2 complete 1 file +71 -0 20 events; codex; tools: Read, Write, Bash
| Prompt: "Add the first concurrent delivery test."
An append-only event trail explains what happened. Hidden Git checkpoints preserve what the captured workspace looked like. Turnal keeps the two together.
Events and checkpoints live in .turnal, outside your Git history.
Completed turns from every agent land in one traceable timeline.
Prompts, responses, tools, and file changes stay together for every turn.
Preview the rollback. Turnal saves a safety checkpoint first.
Claude Code and Codex can work in sequence or in parallel. Turnal keeps each completed turn, including its prompt, tools, and checkpoints, in one interleaved timeline.
Fable 5 with high effort · Claude API
? for shortcuts
>_ OpenAI Codex (v0.144.0)
model: gpt-5.6-sol high fast
directory: ~/Dev/relay-api
checkpoint graph: 2 sessions, 0 turns, 0 lanes
A Git commit preserves what the code looked like. An agent turn adds what happened, why, what changed, and how to get back safely.
Search, diff, blame, verification, and rollback all derive from events and checkpoints already on disk.
Turnal captures each turn in the background. Use the CLI when you need to inspect, trace, test, or restore what happened.
Trace a line, test an earlier state, name a rollback point, inspect rerun readiness, or preserve a turn as an immutable case.
aadijo@MacBook-Pro Project % turnal blame src/webhooks/stripe.ts:24 --verbose
14:48 [claude 14:42] turn 4 24 | if (!claimed) return res.sendStatus(200)
Prompt: "Make the webhook idempotency claim transactional and release it only on retryable failures."
session: claude-a13f
adapter: claude-code
tools: Read, Edit, Bash
checkpoint: refs/agent-vcs/checkpoints/claude-a13f/turn/000004/post
id: 9df3a1e9c54b aadijo@MacBook-Pro Project % turnal verify claude-a13f:4:post
target: claude-a13f:4:post
state: 59a91d6d715f3b86d32824e589a9fe30d73b2f1a
checks: 3 passed, 0 failed, 0 timed out, 0 could not start, 0 infrastructure errors
PASS unit-tests 2.84s
PASS typecheck 1.19s
PASS lint 684ms
limitations:
- Checks ran in the current toolchain against an isolated checkpoint worktree. aadijo@MacBook-Pro Project % turnal save "tests passing before webhook refactor"
Saved checkpoint e8924b927c11
hash: e8924b927c11e987d304372ff3bb8e57b93a5d42
message: "tests passing before webhook refactor"
rollback: turnal rollback --to e8924b927c11e987d304372ff3bb8e57b93a5d42 aadijo@MacBook-Pro Project % turnal fork claude-a13f:4 --dry-run
fork readiness: needs_context
target: claude-a13f:turn:4:pre
fidelity: L1
source turn: claude-a13f:4 (complete)
model: claude-opus-4-8
base: refs/agent-vcs/checkpoints/claude-a13f/turn/000004/pre
captured files: 184
instruction: available
Return success for an event another worker already completed.
conditions:
workspace files exact 184 captured files
conversation not_recorded prior context must be supplied
toolchain not_recorded use the current environment
secrets reauthorization_required secret values are never replayed
network live external services may differ
evaluators configured 3 repository checks aadijo@MacBook-Pro Project % turnal case create claude-a13f:4
created task task_0123456789abcdef0123456789abcdef
created case case_fedcba9876543210fedcba9876543210
task: task_0123456789abcdef0123456789abcdef revision 1
source turn: claude-a13f:4
base commit: e4b611c27fa0
instruction: available
readiness: needs_context
fidelity: L1
verifiers: unit-tests, typecheck, lint
attempts: none linked aadijo@MacBook-Pro Project % turnal replay checkout claude-a13f:3:post
replay worktree: /Users/aadijo/.turnal/replays/claude-a13f-turn-000003-post
state: claude-a13f turn 3 post
commands:
turnal replay next
turnal replay prev
turnal replay goto claude-a13f:turn:3:post
turnal replay diff
turnal replay show
turnal replay keep
turnal replay stop When a result deserves another pass, preserve its starting point as a case. Fork preflight shows what you need to retry the task with a different agent, instruction, or approach.
Source turn
claude-a13f:4
Make webhook delivery safe to retry.
Case
retry-webhook / rev 3
Fork preflight
readiness only
aadijo@MacBook-Pro Project % turnal fork claude-a13f:4 --dry-run
Install Turnal, initialize the workspace, then let Claude Code and Codex work normally.
npm install -g @aadijo/turnal