Claude Code Glossary
What Claude Code calls the things the project glossary names, and where each one appears in its data.
The dialect is claude-code/1. That names the vocabulary, not the adapter: claude-code-local
says how records were acquired, the dialect says how they are read. A push receiver for the same
runtime would be a different adapter and the same dialect.
This table is generated from the code — asz glossary prints it — so it cannot drift from the
mapping it describes. A test fails if the project’s vocabulary grows a name with no entry here.
asz glossary this table
asz conversation ID talk · run · llm.call · tool
asz conversation -terms native ID talk · promptId · message.id · tool_use + tool_result
asz conversation -terms both ID run (promptId)
59 terms: 36 that Claude Code names, 23 this project derives. That ratio is worth watching. If everything had a native name the model would be a rename of one product rather than a model of any; if nothing did, it would have no evidence under it.
Named by Claude Code
Each row is a field the adapter actually reads. A rename in Claude Code changes this table and the extraction together, because they sit in the same file.
| model | Claude Code | where | note |
|---|---|---|---|
agent.call |
Agent, Skill or Workflow tool_use |
an assistant record | |
agent.launch_ack |
toolUseResult.status == "async_launched" |
a tool result | an acknowledgement, not a result |
batch |
toolUseResult.runId |
a workflow launch result | also the name of the directory the batch’s records are filed under |
call |
message.id |
record | not requestId, which a client-fabricated record can reuse |
cancels |
toolUseResult.interrupted |
a tool result | |
child |
toolUseResult.agentId |
a launch result, a journal record | |
context.injection |
attachment |
an attachment record | |
continues |
logicalParentUuid |
a compact_boundary record | the only link back; a boundary’s own parentUuid is null |
control.command |
system/local_command |
a system record | |
control.interrupt |
toolUseResult.interrupted |
a tool result | |
control.permission |
permission-mode |
a record type | |
epoch.boundary |
system/compact_boundary |
a system record | |
epoch.summary |
isCompactSummary |
a user record | |
error.api |
system/api_error |
a system record | |
external |
origin.kind == "human" |
record | also a run whose records state no origin at all - a locally typed command |
follows |
logicalParentUuid |
a compact_boundary record | |
id |
uuid |
record | |
llm.call |
message.id |
assistant records sharing one | one call is several records; 2.09 on average |
message.assistant |
text block |
an assistant record | |
message.external |
origin.kind == "human" |
a user record | also a queued_command attachment whose commandMode is “prompt” |
message.synthetic |
message.model == "<synthetic>" |
an assistant record | the client wrote it; no model produced it |
notification |
origin.kind == "task-notification" |
record | |
parent |
parentUuid |
record | |
redacted |
redacted_thinking |
a content block | |
reports |
<task-notification> |
a user record’s content | |
result_of |
tool_use_id |
a tool_result block | also stated redundantly as sourceToolAssistantUUID |
run |
promptId |
record | one loop per distinct promptId |
runtime.notification |
<task-notification> |
a user record’s content | |
session |
sessionId |
record, and the transcript filename | |
starts |
toolUseResult.agentId, or a run journal |
a launch result | |
stream |
agentId |
a child record | the parent lineage is the session transcript itself |
summarizes |
parentUuid |
an isCompactSummary record | |
thinking |
thinking block |
an assistant record | |
time |
timestamp |
record | |
tool |
tool_use + tool_result |
two records | one step here, two blocks there |
trigger |
origin.kind |
record, and attachment.origin.kind |
Derived by this project
Claude Code has no word for any of these. That is an answer, not a gap: saying so is more useful than a plausible word that would send a reader looking for a field that does not exist.
| model | what it is |
|---|---|
agent.output |
the last model response in a child stream |
available |
the bytes are in a landed record |
conflict |
sources disagree |
conversation |
supplied, never inferred; defaults to the session id |
ends_with |
the last model response in a child stream |
epoch |
the span between two compact_boundary records |
exact_ambiguous |
an identifier matched several; nothing chose one |
exact_unique |
an identifier matched exactly one candidate |
hash_only |
only a digest of the bytes was kept |
in_segment |
an activity window chosen for commit |
input_of |
unavailable; the serialized provider request is not written locally |
omitted |
deliberately not carried |
retries |
unavailable; retry identity is not recorded |
segment |
an activity window chosen for commit |
size_only |
only the length was kept |
strong_inference |
no identifier, but a well-founded structural argument |
talk |
one readable interaction; derived from where a run was triggered |
truncated |
part of the bytes, with the full length reported |
turn.duration |
unavailable on the claude-vscode entrypoint |
unavailable |
the runtime never wrote it, or the source was pruned |
unknown |
no record of the run states a trigger |
unresolved |
no usable evidence |
weak_inference |
plausible only |
What Claude Code records and the model does not carry
The mapping runs both ways, and this direction matters for anyone going back to the source.
| field | why it is not carried |
|---|---|
requestId |
identifies a provider attempt, which nothing resolves against. A client-fabricated record can reuse a real one, so grouping by it would put invented content inside a real call. It is the join key to captured provider bodies and will return when those do. |
agentId |
equals the stream name for a child stream; carrying it would store the same value twice. |
sessionId |
the landed file already says which session it belongs to. |
isSidechain |
absent on 28.7% of parent-lineage records, so it cannot say which stream a record belongs to. The file can. |
cwd, gitBranch, slug, version, userType |
environment, not conversation. Still in the landed record for anyone who wants it. |
thinking.signature |
13.3% of the corpus, wrapping 0.1 MB of reasoning text. A provider verifies it; a reader cannot read it. |
What Claude Code does not supply at all
Reported unavailable rather than approximated. A second adapter might do better on any of these.
| tool execution timing | only WebFetch.durationMs, WebSearch.durationSeconds and Agent.totalDurationMs. Everything else has none, and a timestamp gap includes model and harness latency. |
| turn duration | absent on the claude-vscode entrypoint — 13 of 15 sessions sampled. |
| a title or summary | for a session, a talk, or anything else. |
| retry identity | a retried attempt is not linked to the one it replaced. |
| the serialized provider request | never written locally, so model-context membership is a cross-check on the reconstruction rather than a statement about the wire. |
| its own record schema | not published, and it changed during this project. |