Every resource an agent or a kernel can consume has a stated limit in my systems, and crossing it produces a typed refusal with a reason attached. Dollars per day, device pages per context, key-value memory per request, concurrent sequences per engine, tokens per step. The alternative, letting the system find its own limit by thrashing, stalling or running out of memory mid-step, hides the failure where it is most expensive to find.
The shape
The limit is explicit and set by a human: a whole number of gibibytes, a dollar figure, a count. Admission checks the limit before load is taken on. Budgets sit in paths an agent cannot reach from inside the work; an agent that wants more asks a human. Reclamation, when it happens, is ordered and counted so a wait can be explained afterwards.
fails after the cost is paid
Where it appears
In FAFO Core and Function Forge, the daily budget gates GPU provisioning on local, LAN and cloud hardware, with per-second spend accounting, and it is set by a human on a path agents do not have.
In ActiveKV, a host-pool geometry that does not fit stops at startup and names the setting to change: Staging without a stall.
In the Capabilities model, a sequence never runs out of cache mid-answer, even in a burst of clients: A router beside a production model.
In AgentOS, cost is a field on every task: What the work cost, to the penny.
Fail closed: no budget set means no spend.
Set by hand, never automatic. Each context has a floor, a target and a burst; the least recently active is reclaimed first, then the pool refuses.
Pages for the whole answer are reserved at admission, or the request is refused with a typed reason.
The ceiling is part of the contract; exhausting it stops the work.
What it buys and what it costs
It buys predictability: a system that refuses at the door never surprises you at the bottom of a run. It buys explainable waits and auditable spend. It buys the confidence to let agents provision real hardware.
It costs capacity left on the table at the margin, because a budget set by a human is conservative, and it costs the occasional refusal of work that would have fit. I take that trade every time the silent alternative is spend, data loss or a corrupted answer.
The judgment in it
Fail closed where the silent alternative is money, loss or a false result; degrade gracefully where the alternative is merely lower quality.
A reranker that saturates under load is fine. A GPU that runs out of memory halfway through a token is not.