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 converted once into
Session Data and written to a .sd file. Its content becomes
parts, and its identifiers take role names. It does not always keep the source record whole. It
keeps its line number counting from 1, byte offset, size, and the first 12 hexadecimal characters
of the SHA-256 of its bytes. Where a part carries the source’s own JSON, such as a call’s input,
it keeps those bytes apart from whitespace between tokens (see
What data holds). Content the dialect cannot describe
keeps every one of its bytes in an unknown part, so nothing is guessed or dropped. When those
bytes are not valid UTF-8, all of them are kept as base64 (see
Parts). A reader is handed parts, so it never meets a
runtime’s shape. The digest still ties each record to its source.
Write-once and read-only: temporary file, fsync, chmod 0444, rename. Never appended to.
Not: a copy of the source record.
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.