The trap is usually not "agents are too autonomous" in the abstract. It's that they can keep looking busy after the state stopped changing. A few runtime guardrails have mattered a lot for us: stop after the same blocker or same tool/result pattern repeats a few times make every retry prove what changed before it spends again keep a hard budget for browser steps, not just the whole task end with a receipt that says completed, blocked, or budget_exhausted so humans can trust the stop That turns the system from "hope the agent knows when to quit" into something you can actually operate. We've been building MartinLoop around that exact control layer, but the core idea is independent of the product: no silent retries, no invisible spending, no stop condition that disappears when the terminal does.