Skip to content

Current Replay in Atomic versus Agent Trace #28

@leefaus

Description

@leefaus

At https://atomic.dev, we are seeing a huge discrepancy across tooling. Our enterprise users are wanting much richer information and the best output right now is coming from OpenCode.

The challenge we are seeing is where to track session versus where to track turns. Is a session a branch? What happens when there are multiple sessions on a branch?

Here is where we are at capturing and presenting data using our own https://github.com/atomicdotdev/atomic version control system that doesn't have issues with things like rebases, squash merge, cherry pick, amends when it comes to attribution and provenance. This is our current spec:

Data Sources (from plugin-debug.log)

Source 1: chat.message hook (fires per user prompt)

Field Path Example Currently Captured
Session ID input.sessionID "ses_36f721831ffe..."
User prompt output.parts[].text "let's build a simple typescript hello world app" ✅ (fixed)
Agent mode input.agent "build", "code", "ask" ✅ (new)
Model ID input.model.modelID "claude-opus-4-5", "claude-sonnet-4-5"
Provider ID input.model.providerID "anthropic"
Message ID input.messageID "msg_c908de7d4001..." ✅ (new, for threading)
Variant input.variant string or undefined

Source 2: message.updated event — AssistantMessage

Field Path Example Currently Captured
Model ID info.modelID "claude-sonnet-4-5"
Provider ID info.providerID "anthropic"
Agent mode info.mode "build"
Total cost info.cost 0.07602125 ❌ (only via step-finish)
Tokens (total) info.tokens.total 11639
Tokens (input) info.tokens.input 3 ✅ (via step-finish)
Tokens (output) info.tokens.output 175 ✅ (via step-finish)
Tokens (reasoning) info.tokens.reasoning 0 ✅ (new)
Tokens (cache read) info.tokens.cache.read 0 ✅ (via step-finish)
Tokens (cache write) info.tokens.cache.write 11461 ✅ (via step-finish)
Finish reason info.finish "tool-calls", "stop"
Working directory info.path.cwd "/Users/.../hello-world"
Parent message ID info.parentID "msg_c908de7d4001..."
Time created info.time.created 1771951744991
Time completed info.time.completed 1771951748933
Error info.error { name, data } or undefined
Summary flag info.summary boolean

Source 3: step-finish part (fires per LLM step within a turn)

Field Path Example Currently Captured
Reason part.reason "tool-calls", "stop"
Cost part.cost 0.07602125
Tokens (total) part.tokens.total 11639
Tokens (input) part.tokens.input 3
Tokens (output) part.tokens.output 175
Tokens (reasoning) part.tokens.reasoning 0 ✅ (new)
Tokens (cache read) part.tokens.cache.read 0
Tokens (cache write) part.tokens.cache.write 11461
Snapshot hash part.snapshot string or undefined
Message ID part.messageID "msg_c908de7df001..."
Step count (derived: count of step-finish per turn) 14 (turn 1), 6 (turn 2)

Source 4: reasoning part (fires per thinking block)

Field Path Example Currently Captured
Reasoning text part.text "The user wants to build..." (full chain-of-thought) ✅ (debug only)
Text length part.text.length 578 ✅ (debug only)
Time start part.time.start 1771953799126 (epoch ms) ✅ (debug only)
Time end part.time.end 1771953801944 (epoch ms) ✅ (debug only)
Duration (derived: end - start) 2818 ms
Anthropic signature part.metadata.anthropic.signature base64 string (~500-1500 chars) ✅ (debug only)
Provider metadata part.metadata { anthropic: { signature } } ✅ (debug only)
Message ID part.messageID "msg_c90ad3a0b001..." ✅ (debug only)

Source 5: tool.execute.before hook

Field Path Example Currently Captured
Tool name input.tool "write", "edit", "bash", "todowrite"
Session ID input.sessionID "ses_36f721831ffe..."
Call ID input.callID "toolu_015PXxuVtx7F..."
Args output.args { filePath, content } or { command, description } ✅ (debug only)

Source 6: tool.execute.after hook (RICHEST DATA)

Field Path Example Currently Captured
Tool name input.tool "edit"
Session ID input.sessionID "ses_36f721831ffe..."
Call ID input.callID "toolu_01EFoT6mPt..."
Args (input) input.args { filePath, oldString, newString } ✅ (new)
Title output.title "Users/.../package.json" ✅ (new)
Output text output.output "Edit applied successfully."
File diff output.metadata.filediff { file, before, after, additions, deletions } ✅ (new)
Unified diff output.metadata.diff unified diff string ✅ (new)
Diagnostics output.metadata.diagnostics { "/path/file.ts": [{ range, message, severity }] } ✅ (new)
File path output.metadata.filepath "/Users/.../tsconfig.json" ✅ (new)
File existed output.metadata.exists false (new file) or true (edit)
Truncated output.metadata.truncated false
Exit code (bash) output.metadata.exit 0 ✅ (new)
Command (bash) input.args.command "npm init -y" ✅ (via args)
Description (bash) input.args.description "Initialize npm project" ✅ (via args)

Source 7: todo.updated event (agent task plan)

Field Path Example Currently Captured
Session ID properties.sessionID "ses_36f721831ffe..."
Todos properties.todos[] [{ content, status, priority }]
Todo content todos[].content "Initialize npm project"
Todo status todos[].status "in_progress", "completed", "pending"
Todo priority todos[].priority "high", "medium", "low"

Source 8: file.edited and file.watcher.updated events

Field Path Example Currently Captured
File path properties.file "/Users/.../tsconfig.json"
Watcher event properties.event "add", "change", "unlink"

Source 9: session.created / session.updated events

Field Path Example Currently Captured
Session ID info.id "ses_36f721831ffe..."
Session slug info.slug "mighty-rocket"
Project ID info.projectID "global"
Directory info.directory "/Users/.../hello-world" ✅ (via cwd)
Title info.title "Building hello world TypeScript app"
Version info.version "0.0.0-dev-202602192030"
Summary additions info.summary.additions 42
Summary deletions info.summary.deletions 3
Summary files info.summary.files 4
Time created info.time.created 1771951744974
Time updated info.time.updated 1771951745845

Here is what it looks in our Command Center:

Image

Our team would really like to be part of this spec creation! Happy to help in any way possible

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions