An agent framework retries at the model layer. The model sees that a tool call failed, reasons that it got no result, and calls the tool again. Nothing in that loop knows whether the first call already wrote to the database, charged a card or sent an email. This is the core failure described in an analysis of idempotency in agentic tool calling: the model is behaving correctly given what it knows, and the missing piece is external state that would let the tool report "I already did this."
Prose makes it worse. If the error body says Something went wrong, please try again, the agent has three bad options. It can retry a permanent failure (a validation error, an expired credential) and burn the attempt budget. It can give up on a transient failure that would have succeeded on the second call. Or it can retry immediately, hammering a service that is already rate limiting it. None of those outcomes is a model reasoning problem; they are all consequences of an error body that carries no machine readable decision.
The HTTP standard already draws this line for human written clients. RFC 9110 says a client can repeat an idempotent request after a connection failure, should not retry a non-idempotent request on its own, and that a proxy must not retry a non-idempotent request at all, as summarized in this guide to idempotent REST APIs. Agents need the same rule, but they need it per response rather than per method, because a single tool endpoint often mixes safe reads with side effecting writes.
The insight that first search results tend to miss: the agent is not the right place to decide retry safety. The tool is. The tool knows whether the failure was a lock timeout or a malformed argument. Put that knowledge in the response and the agent becomes a simple state machine.



