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:
Our team would really like to be part of this spec creation! Happy to help in any way possible