← blog

Human-in-the-loop is not a checkbox

Approval gates that people rubber-stamp are worse than no gates at all. Designing HITL that survives contact with busy humans.

· 3 min read#agents#safety

Every enterprise AI deck has the slide: a tidy diagram with a little human icon between “agent decides” and “action happens.” Human in the loop. Governance achieved. Next slide.

Here’s what actually happens three weeks after launch: the approver gets forty requests a day, each one has been fine so far, and they develop the muscle memory of clicking approve the way you click “I have read the terms and conditions.” Congratulations — you’ve built an autonomous system with extra latency and a scapegoat.

I’ve built approval flows into both the enterprise platform I run and into promptev, and the difference between theater and control comes down to a few design choices.

Gate by consequence, not by step

The lazy design gates everything, which guarantees rubber-stamping. The useful design asks one question per tool: what’s the blast radius if this call is wrong?

Reading a record? No gate. Drafting an email that a human will send themselves? No gate. Sending money, deleting data, messaging a customer, changing permissions? Gate — and no volume of good behavior ever earns those actions out of the gate.

In promptev this is per-tool configuration: each tool an agent can call is marked auto-execute or approval-required, and approvals can happen inline or over email for people who live in their inbox. The granularity matters. “Approve this agent” is meaningless; “approve this specific irreversible action” is a real decision.

Show the decision, not the transcript

Early versions of our approval UI showed the full agent reasoning trace. Approvers read none of it. Can’t blame them — nobody’s reviewing 3,000 tokens of chain-of-thought forty times a day.

What works is a summary built for the decision: what will happen, to whom, why the agent thinks so, and what it was uncertain about — with the full trace one click away for the rare case that needs it. Uncertainty display turned out to be the sleeper feature. “Confidence: low, two conflicting records found” wakes an approver up far more reliably than any amount of red styling.

Make “no” cheap and informative

If rejecting requires filling in a form, people approve instead. One-click reject, with an optional reason. And the reasons — those are gold. They feed straight back into the evals: every rejection is a labeled example of the agent being about to do the wrong thing. Some of our best regression cases came from a finance approver’s terse rejection notes.

Measure the gate itself

Approval rate, time-to-decision, and overrides-caught-per-month, per gate. A gate at 99.8% approval that has caught nothing in a quarter is either guarding a solved problem — remove it — or being rubber-stamped — redesign it. A gate that catches something monthly is earning its friction. Without these numbers you’re just guessing which.

The point of human-in-the-loop was never that a human is technically present. It’s that a human decision happens where a human decision is warranted. If the human isn’t actually deciding, you don’t have a loop. You have a rubber stamp with a salary.