A retry budget is a promise made at the edge of a system: "we will allow some extra attempts, but only a fixed share of traffic." The Gateway API proposal that standardizes retry budgets describes the mechanism as a cap on the percentage of active load made up of retries, so a struggling service does not get buried by its own clients (GEP-3388). That cap is arithmetic about concurrency. It says nothing about whether an individual attempt has enough time left to produce an answer.
That is the gap. If an agent has 900 ms left in a run and its tool usually takes 1,400 ms, admitting the call is not persistence, it is a guaranteed timeout that also occupies a connection, a thread, and a slot in someone else's rate limit. Microsoft's retry storm guidance makes the same point from the client side: retries within a short period are unlikely to succeed because the service has not recovered, and a request typically stops being valid after a bounded time (Azure Architecture Center). When the request's own validity window is explicit, retrying and refusing become decisions you can compute rather than hope about.
The second reason is more concrete. A timeout tells the caller "I stopped waiting." It does not tell anyone that the remote operation stopped (System Design Academy). Without a shared budget, the retry starts a second piece of work while the first is still running. With a propagated budget, the second attempt inherits a number that is already smaller, and the tool can decline before it begins.



