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:
completed, blocked, or budget_exhausted so humans can trust the stopThat 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.