Approval by exception
Let agents run freely, stop only the actions a policy flags as risky.
An agent that pauses for a human on every step is useless; one that never pauses is dangerous. Approval by exception is the middle path: the agent acts autonomously by default, and a policy decides the small subset of actions that need a human.
How it works
Every time your agent is about to do something consequential, it calls
gate.require() with an action, a payload, and a policyKey. The
policy engine evaluates the request and returns one of three verdicts:
| Verdict | What happens |
|---|---|
allow | The request is auto-approved; require() resolves immediately. |
require_approval | A human is notified; require() blocks until they decide. |
deny | The action is refused outright. |
A well-written policy lets 95% of actions through untouched and stops only the ones worth a human's attention — a wire transfer over a threshold, a production deployment, a message to a VIP customer.
Why not gate everything
Gating everything trains reviewers to rubber-stamp. The signal drowns in noise and the first genuinely dangerous action gets the same reflexive click as the hundred harmless ones before it. Approval by exception keeps the human's attention scarce and therefore valuable.
The inverse — gating nothing — is what failing closed guards against when a policy is missing or malformed.