Your Agent Doesn't Fail Because It's Autonomous. It Fails Because the Approval Gate Is in the Wrong Place.
The wrong question is "how much autonomy"
Most conversations about putting an AI agent into production start with a dial: how autonomous should it be? Full autonomy, human-in-the-loop, human-on-the-loop — pick a level and move on. It's a tidy framing, and it's the wrong one. The level of autonomy isn't what determines whether an agent causes damage. The placement of the approval gate is.
An agent that can read your inventory database with zero supervision is "fully autonomous" by any definition, and it's also completely safe, because reading data has no side effect to undo. An agent that needs a human to click "approve" before every single action, including ones that just log a note, isn't safer — it's just slower, and eventually someone rubber-stamps approvals without reading them, which is worse than no gate at all. Autonomy is the wrong axis. Reversibility of the action is the right one.
Where agents actually fail
It helps to know what actually breaks when a tool-calling agent goes wrong in production, because it's rarely the thing people picture. The common mental model is "the agent picked the wrong tool." Recent benchmark work on multi-step tool use (FuncBenchGen, a 2026 evaluation framework for function-calling agents) found the opposite: models are good at picking which function to call and almost never make syntactic mistakes like calling a function that doesn't exist. The dominant failure — accounting for the large majority of errors across models in that benchmark — was models acting on a value they didn't actually have yet: carrying forward a stale number, guessing at a field that depended on an earlier step's real output, or filling in a plausible-looking argument instead of admitting it didn't know.
A separate taxonomy from the ToolScan/SpecTool line of research splits this further: schema mismatch (wrong type, missing required field — easy to catch, a validator rejects it instantly) versus semantic mismatch (the right shape, the wrong value — a validator sees nothing wrong, because nothing is syntactically wrong). Schema errors get caught at the door. Semantic errors walk right through, because they look exactly like a correct tool call. The Berkeley Function-Calling Leaderboard remains the standard public reference for this kind of evaluation, and it specifically scores whether a model knows when not to call a tool — because refusing to act on an unknown value is itself a measurable skill, and most models are worse at it than at the calling itself.
This matters for where you put your gate: a well-formed, schema-valid tool call can still be the wrong action taken on a wrong assumption. If your only safeguard is "validate the function signature," you've caught none of the failures that actually happen.
Gate the side effect, not the source
The practical implication is to stop asking "did an AI produce this instruction" and start asking "what happens if this specific action is wrong, and can we undo it." A refund of $12 to a customer who was overcharged is low-stakes and reversible — let the agent execute it and log it. A refund of $12,000, a changed shipping address on an order that ships tonight, a deleted record, an email sent to a parent list at a school — these are either expensive to reverse or impossible to reverse, and that's the property that should trigger a human sign-off, not the fact that a model generated the request instead of a person clicking a button.
In practice this means classifying your agent's available tools into three buckets before you ever ship:
- Read-only or fully reversible actions (lookups, draft generation, internal notes): no gate. Gating these just adds latency and trains your team to approve things without reading them.
- Reversible-but-costly actions (most writes — status changes, non-financial record updates): no gate, but full audit logging and a fast undo path. The cost of a mistake is cleanup time, not a human review on every call.
- Irreversible or high-blast-radius actions (payments above a threshold, anything that leaves your system — an email, an SMS, a filed form, a production deploy, anything touching student or financial records): a hard gate, every time, no exceptions carved out for "but this one's probably fine."
That third bucket is usually a short list. Most of what an agent does in a real SMB or school workflow is bucket one or two. The mistake teams make is either gating everything (so the agent is useless and the gate becomes theater) or gating nothing (so the first bad semantic argument becomes a real-world mistake with nobody positioned to catch it before it lands).
The gate has a cost too
A human approval gate is not free, and pretending otherwise is how gates get bypassed in practice. If a reviewer takes twenty minutes to look at a queued action, the agent's useful throughput drops to whatever the slowest reviewer can sustain, and people start approving in bulk without reading — which defeats the point. Three things make a gate survive contact with a busy team: batch similar approvals instead of interrupting per action, give the reviewer the context to decide in seconds rather than make them reconstruct it, and set a timeout with a safe default (deny, not approve) rather than letting a queue silently stall a workflow for hours.
The takeaway
Don't scope an agent's autonomy by vibes or by a generic "level 2 vs level 4" label. Walk the list of actions it can take, sort each one by whether a mistake there is cheap to undo or not, and put your one hard approval gate only on the actions where it isn't — then make sure that gate is fast enough that someone actually reads it before clicking approve.
Have a system like this in mind?
Get a scoped plan ↗