gap and tombstone records say where history is missing or was deleted; and producer.lossy lists the categories of loss. Revisions are explicit records, so changes in the source do not appear as unexplained contradictions in the stream.
Absence
ASR-500 An absent member means unknown. Readers MUST NOT interpret an absent member asfalse, zero, empty, none, success or failure.
This holds for every field, including those whose common value is easy to guess: an absent tool_call.requestedBy does not mean the model asked, an absent memory_change.status does not mean the write happened, and an absent delivery does not mean a reply was or was not received.
ASR-501 Producers MUST preserve false, 0, "", [] and {} when the source gives them, and MUST NOT omit those values or replace absent members with them.
ASR-502 Producers MUST NOT fabricate identifiers, timestamps, models, outcomes, durations, costs or token counts. A value that the source does not provide is absent (or derived and marked as such, where this specification allows derivation).
ASR-503 Text MUST be kept exactly as the source stored it (ASR-211 gives the detailed rule).
Capture states
Content-bearing fields can carry a capture state in the record’scapture object, keyed by field name. Each record type lists its capture state keys.
Completeness is relative to what the source captured.
complete does not claim that the source captured everything that happened.
ASR-504 Every key of capture MUST be one of the capture state keys listed for the record’s type, and every value MUST be an object with state.
ASR-505 A producer that stores less of a field than the source captured MUST give that field a capture state other than complete. A partial copy MUST NOT be labeled complete.
ASR-506 When a field’s state is external, omitted or absent, the field MUST be absent, or empty when the field is required (an empty content array). When it is redacted, the field holds what the redaction left, with placeholders where values were removed (ASR-555), or is absent or empty.
ASR-507 When the producer knows that the source itself kept only part of the content (for example, because stored tool output contains a documented truncation marker), it SHOULD use truncated with reason: "source_truncated".
A capture state’s originalBytes, originalDigest and blob describe the content as the source had it. For masked, blob holds the original that the model saw, when it was retained.
Revisions
Records are immutable (ASR-005). When the source changes a fact that was already recorded, the change is a new record that supersedes the earlier one: a full replacement, never a patch.supersedes MUST name a record with a lower seq in the same stream and of the same type. A record MUST be superseded by at most one record. Records of type session, declaration, rewind and tombstone MUST NOT carry supersedes and MUST NOT be superseded.
ASR-509 A superseding record is a full replacement. Readers MUST NOT merge fields from a superseded record into its replacement, and MUST use the latest revision of a chain (the record no other record supersedes) unless they are showing history.
A reference to an entity means its latest revision; a reference to a record ID means exactly that revision (see Identity).
Assembly
Many sources store one logical item as several native records (records in the source’s own format): a response split into one line per content block, streaming chunks,partial rows replaced in place, or a record appended again each time its status changes. The assembly member says how a record was built.
ASR-510
assembly MUST contain mode.
ASR-522 A record with assembly.mode: "rewrite" MUST carry supersedes, and its assembly.sourceIds SHOULD hold the new native ID. A producer MUST use rewrite only when the source marks the record as replacing an earlier one, under a rule in the agent’s registry entry.
ASR-511 Producers MUST fold the streaming growth they have in hand when they write a record, joining text only by concatenation (ASR-211), and SHOULD set assembly. Growth observed after writing MAY be appended as a full replacement with supersedes and assembly.mode: "folded". Its sourceIds MUST include every source ID or source position from the replaced record, together with those of the newly observed sources. Source positions are used when distinct native record IDs are unavailable. This does not permit replacing an existing line.
ASR-523 When the folded sourceIds of a replacement chain only ever grow, readers MUST classify the chain as enrichment by the producer (the producer adding more of the same item) rather than as revision history from the source. An unchanged or shrinking set alone does not establish enrichment. Each enrichment step adds at least one source identity or position; source changes under an existing identity follow ASR-512 and ASR-513.
ASR-512 When the source retains a revision that changes a fact that was already final (a tool status that flipped after completion, masking applied to a completed result, text replaced after a message was marked complete), the producer SHOULD keep it as a supersedes chain. A producer that folds such revisions into the final state instead MUST declare the loss revision_history.
ASR-513 A producer for a source that retains only current state MUST record only what it observed and MUST NOT manufacture past transitions or revision chains. ASR-034 determines position and snapshot assembly.
Design note. Keeping every streaming chunk would make records grow with the number of tokens and bury the actual history. If the source changes a previously final fact, keeping only the latest state would discard evidence the source retained. The rule folds growth and keeps revisions of final facts.
Declared losses
producer.lossy (and declaration.lossy) lists categories of known loss. Values are dotted identifiers from this table, or vendor identifiers beginning with _.
ASR-514 Every value in
lossy MUST be an identifier from this table or begin with _.
gap
A gap records that history is missing at a point in the stream.
ASR-515 A
gap MUST contain reason.
ASR-524 A gap’s missingRefs, when present, MUST contain only references whose targets the source establishes were lost in that gap. A generic gap or loss flag does not cover every missing target. A listed target that is present contradicts the gap claim. An optional reference to a target covered by the gap produces a notice; a required reference to one still fails.
ASR-516 Missing history is not evidence that something did not happen. Readers MUST NOT conclude from a gap, or from the absence of a record, that an event did not occur.
ASR-517 A discontinuity in native IDs or counters alone is not evidence of deletion. A producer MUST NOT emit deleted_by_retention or a tombstone on that basis alone; without other evidence the reason is unknown.
tombstone
A tombstone records that the source deleted or withdrew records after they were captured.
ASR-518 A
tombstone MUST contain a non-empty targets array and reason.
ASR-519 A tombstone means upstream deletion or withdrawal only. It MUST NOT be used to correct a record; a correction is a superseding record.
ASR-520 Tombstoned records remain in the stream. Readers MAY keep and show them as audit evidence, marked as deleted upstream. Erasing them requires producing a new stream (see Privacy).
No trust labels
ASR has no field for a producer to declare its own trustworthiness or fidelity. Instead, a consumer judges a record by what it can check against the record itself:producer.method, the capture state of each field, the evidence for each lineage facet, vcs.evidence and declared losses.
Some fields hold the source’s own words about what it knew: a participant identity’s basis (OpenClaw’s profile or observation), a reviewer’s verdict on an approval. They are facts the source recorded, kept verbatim. They are not labels that ASR or the producer attaches.
ASR-521 Readers MUST NOT treat a producer-declared trust, fidelity, quality or verification label (in _meta or anywhere else) as evidence about the stream.