Budgets stop a run that is expensive. They do nothing about one that is cheap and useless, like an agent calling the same tool with the same arguments forty times. Loop guards notice that shape:
// config/clutch.php
'guards' => [
'remind_after_repeats' => 3, // tell the model it is going in circles
'block_after_repeats' => 8, // refuse, and say why
'tool_timeout_seconds' => 60, // bound one call, not just the whole run
'tool_timeouts' => ['scrape_page' => 120],
],
A reminder still lets the call run. A block returns the refusal to the model as the tool result, which is what tells the agent to try something else rather than leaving it silently starved.
Tool deadlines cover what a run-level duration budget cannot: a budget only notices an overrun once the tool returns, which is no help when the tool is the thing that hung.