Glossary
Every word this project uses with a fixed meaning, and what each one is not. It is runtime-agnostic throughout: no agent product’s vocabulary appears here. For what one runtime calls these things, see the Claude Code glossary.
Where a word is easy to confuse with a neighbour, the entry says so — those pairs are where most misreadings start.
The two boundaries
Everything else is defined relative to these.
Conversation — the durable ownership boundary, and the unit of storage, analysis and export. Its identity is supplied, never inferred: an adapter reports it or an application provides it. Grouping by person, account, timestamp proximity or session id is not permitted. Not: a person, an account, a session, a trace, or a time range.
ExecutionStream (usually just stream) — the ordered continuity boundary. Model-message continuity is evaluated inside one and never across two. A child agent always creates or continues a distinct stream. Not: timestamp order, and not a sequence of prompts.
Structure
Segment — an activity window that can be committed on its own. It sits above Session and cuts across every stream beneath it, so it is a time window rather than a branch of the tree. Not: a turn, a Talk, or a new conversation.
Session — the source-runtime context a record came from, carried as provenance. One conversation may contain several; a session belongs to exactly one conversation. Not: an agent, a stream, or a conversation. It is not a grouping key.
Context epoch (usually epoch) — the lifetime of one model context within a stream. A stream that never resets has exactly one. A reset is taken only from an explicit boundary record. Not: a token-count threshold, and never inferred from a message-list mismatch.
Talk — one readable interaction: an input from outside the agent, the work that followed, and the output. A Talk starts on external input, or on a run whose records state no trigger at all. Everything a Talk delegated stays inside it. Not: an exact provider request, and not one per prompt.
Run — one loop the agent performed in response to one trigger. A Run averages thirteen provider calls, so it is emphatically not a single model call. The agent does not start its own: every Run is triggered from outside the loop, by input or by the runtime reporting a child has finished.
Step — one observed occurrence inside a Run. The leaves of the tree. Not: an inferred event. A step that cannot be observed is reported unavailable.
Step kinds
| kind | is |
|---|---|
message.external |
input originating outside the agent, typically a person |
message.assistant |
agent output visible to the requester |
message.synthetic |
an assistant-role record the client fabricated — a connection loss, a provider error — surfaced inline so the requester sees it. Never counted as agent output. |
context.injection |
material the harness put into model context: instructions, memory, catalogues, reminders |
llm.call |
one provider attempt: its ordered input and its response |
thinking |
reasoning content attached to a response |
tool |
one tool use — the request, what ran, and what came back, as one step |
agent.call |
a request to start or continue a child agent |
agent.launch_ack |
acknowledgement that a child started. Not its result. |
agent.output |
the child’s final output, owned by the child stream |
runtime.notification |
the runtime telling the parent a child completed |
epoch.boundary |
an explicit model-context reset |
epoch.summary |
the carried-forward summary that reset produced |
error.api |
a provider error |
control.interrupt |
an externally initiated interruption |
control.permission |
a permission decision or mode change |
control.command |
a runtime command invoked in-line |
turn.duration |
a runtime-reported duration for a completed turn |
A tool use is one step, not three. The request and the result are separate records, often far
apart, but they pair one to one and a reader thinks of them as a single event. A tool whose result
never arrived carries result: unavailable — it is not dropped and not given an empty result.
Relations
The tree carries containment only: every node has at most one parent. Everything else is a typed relation carrying its own correlation quality. Cross-stream flow is never containment.
| relation | reads as |
|---|---|
starts |
an agent call → the child stream it created |
reports |
a notification → the child that finished |
ends_with |
a child stream → the step carrying its final output |
result_of |
a record → the tool use whose result it carried |
follows |
an epoch → the epoch it continues after a reset |
summarizes |
a summary → the reset that produced it |
in_segment |
a Talk → the window that will commit it |
retries |
an attempt → the attempt it replaced |
cancels |
an interruption → the operation it ended |
input_of |
a record → the provider call whose input it was part of |
Each name is a verb, so an edge reads as a sentence from its start to its end.
What a record carries
The role names a record’s identifiers play. A runtime’s own field names stop at its adapter; these are what everything above it sees.
| role | is |
|---|---|
id |
this record’s own identity |
parent |
its containment parent |
call |
the provider call it is a fragment of |
run |
the agent loop it belongs to |
batch |
the group of children it was started with. A join key; nothing in the model corresponds to it. |
stream |
the lineage it was written in |
continues |
the record a new model context resumes from, across a reset |
tool |
the tool use this record is about, where the runtime says so outside the content |
child |
the child agent stream this record names |
time |
when the runtime says it happened |
trigger |
what started the run: external, notification, or unknown |
Qualification
Nothing is presented as observed unless it was observed.
Correlation quality — on every join between two records:
exact_unique · exact_ambiguous · strong_inference · weak_inference · unresolved ·
conflict
An exact identifier does not guarantee a unique match. Where several candidates share a key the
relation stays exact_ambiguous and nothing chooses one. A conflict is never overwritten by a
later agreeing observation.
Claim state — how a claim was arrived at: observed_replayable · observed_report_only ·
proposed · unavailable.
Content state — for any referenced payload: available · redacted · omitted · hash_only ·
size_only · truncated · unavailable.
Storage
Landed record — a source record copied into the storage zone, byte-for-byte. Write-once and
read-only: temp file, fsync, rename, chmod 0444. Never appended to.
Delta — one file of landed records, covering a contiguous run of a source. A source becomes many deltas over time.
Cursor — how far collection got in one source, committed after the data lands. That order makes a crash repeat data rather than lose it.
Sequence — a landed file’s number, monotonic across every stream in a session. It is what lets progress be tracked with a single watermark.
Watermark — how far a stage has got, as a sequence. They trail each other:
assembled ≤ indexed ≤ landed.
Index — a derived lookup structure over landed records. Holds identifiers, never content. Disposable: delete it and it rebuilds; a schema change discards rather than migrates. Nothing downstream may treat it as authoritative.
Round — one immutable, digest-chained delta of conversation structure. Round N names round N−1’s digest. A round carries no wall-clock time, so the same evidence reproduces the same bytes.
Chain — a conversation’s rounds in order.
Fold — applying every round in order. fold(rounds 1..N) is the conversation as of round N;
there is no other state. Last writer wins per entity; absence means unchanged; removal is an
explicit tombstone; order is chain order and never timestamp order.
Revision — the round number that produced a version of an entity. Derived from chain position, not counted per entity, so a round can be re-derived without replaying the chain.
Adapters
Adapter — what turns one runtime’s data into landed records. Named for the runtime and the collection posture, because the posture changes what can be promised about completeness.
Transport — how records arrive: reading local files, or receiving a push.
Dialect — how records are interpreted: one runtime’s schema. A push receiver and a local reader for the same runtime share a dialect and nothing else.
Glossary — what one dialect calls each thing named here, so a reader can see either vocabulary. An empty entry means the runtime has no word for it, which is an answer rather than a gap.