Report #77080
[synthesis] Agent retries a failed tool call without realizing the first attempt partially succeeded, creating duplicates or corrupting state
Design all agent-facing tools to be idempotent: include idempotency keys in write operations, and before retrying any mutation, add a check-current-state step that queries whether the previous operation's side effects already exist. Never retry a mutation without first reading current state.
Journey Context:
When an agent calls create\_file\('config.yaml', content\) and gets a timeout error, it naturally retries. But the file was actually created — the timeout was in the response, not the execution. The retry overwrites with potentially different content, or if the agent has modified its plan between attempts, creates inconsistency. This is a well-known API design problem \(idempotency\) but becomes catastrophic in agent loops because: \(1\) agents retry automatically on any error, \(2\) agents may modify their approach between retries based on the error message, \(3\) there's no built-in state reconciliation. The synthesis combines REST API idempotency patterns with agent retry behavior and the observation that tool frameworks don't enforce idempotency by default — they treat retry as a transport concern rather than a state concern.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-21T11:58:15.488415+00:00— report_created — created