AI Agent Approval Workflows: Put Humans at the Right Control Points
Human approval can make an agent safer—or merely slower. Design checkpoints around irreversible actions, changing risk, and evidence people can actually review.
Your agent does not need approval before every tool call. It needs approval before the calls that can ruin your afternoon.
That distinction is the foundation of useful AI agent approval workflows. A popup on every step produces alert fatigue. Zero checkpoints turns a model mistake into an external incident. The right design lets software explore, calculate, draft, and validate freely while reserving human authority for actions that are costly, public, security-sensitive, or hard to reverse.
Define the Boundary Before Writing Code
Start with an action inventory. List every tool the agent can call and classify its effects.
| Risk class | Examples | Default control |
|---|---|---|
| Read-only | Search docs, inspect logs, query inventory | Automatic |
| Reversible write | Create draft, open branch, add label | Automatic with audit log |
| External communication | Send email, publish post, message customer | Approval |
| Financial or security | Refund, purchase, rotate credential, change access | Strong approval |
| Destructive | Delete data, terminate service, overwrite production | Strong approval plus narrow scope |
Do not classify by tool name alone. database.query can be read-only or destructive depending on the statement. email.createDraft is not the same as email.send. Split broad tools into narrow capabilities so policy can reason about the actual effect.
Build an Approval Envelope
An approval request should contain enough evidence for a fast decision:
{
"action": "send_email",
"target": "customer-1842",
"summary": "Confirm the replacement shipment",
"preview": "Rendered email body",
"reason": "Customer accepted replacement in ticket #7712",
"risk": "external_communication",
"expires_at": "2026-08-10T06:00:00Z",
"idempotency_key": "ticket-7712-replacement-confirmation"
}
The human should see the destination, exact payload, source evidence, expected effect, and rollback path. “Agent wants to use Gmail” is useless. “Send this exact message to this exact recipient” is reviewable.
Bind approval to the payload hash. If the message, amount, recipient, command, or target changes after approval, the authorization must become invalid. Otherwise the agent can receive approval for a harmless plan and execute a materially different one.
Separate Planning From Execution
Use a state machine instead of a loose chat loop:
type State =
| { kind: "planning" }
| { kind: "awaiting_approval"; requestId: string; payloadHash: string }
| { kind: "executing"; approvalId: string }
| { kind: "verifying" }
| { kind: "complete" }
| { kind: "failed"; reason: string };
The model proposes. A deterministic policy service evaluates. The approval store records a decision. A separate executor verifies the signed or server-side approval token before calling the tool.
Never let the model declare that approval occurred. The statement “the user approved this earlier” is untrusted text. Approval must come from an authenticated interface and durable record.
Add Risk That Changes With Context
A $5 refund and a $5,000 refund should not share a policy. Neither should sending an internal note and emailing a regulator.
Use factors such as:
- Financial amount and cumulative daily amount
- Number of affected records
- Internal versus external destination
- Data sensitivity
- Reversibility
- Confidence in target resolution
- Whether the action was explicitly requested in the current task
Encode thresholds in policy, not prompts. Prompts can explain policy to a model; they should not be the enforcement layer.
Prevent Stale and Replayed Approvals
Approvals need expiration, single-use semantics, and idempotency. If a human approves a refund and the network times out, the retry must not create a second refund. If the underlying ticket changes, the old approval may no longer be valid.
Record:
- Request ID and payload hash
- Approver identity and authentication level
- Decision, timestamp, and expiry
- Tool result and verification evidence
- Whether the authorization was consumed
For high-risk actions, use step-up authentication. A logged-in dashboard session may be enough to publish a draft; changing bank details should require stronger confirmation.
Design the Human Experience
Approval queues fail when they become inboxes of mystery. Group related low-risk actions, highlight anomalies, and make the default safe. Provide approve, reject, and edit paths. A rejection should return structured feedback so the agent can revise rather than repeatedly proposing the same bad action.
Avoid dark patterns. The approve button should not be huge while reject is hidden. Show uncertainty and conflicts clearly. If the agent could not verify the recipient, say so.
Test the Failure Paths
Your happy-path demo proves almost nothing. Test:
- Payload changes after approval.
- Approval expires during execution.
- Executor retries after a timeout.
- Two approvers act on the same request.
- A prompt-injection message claims prior authorization.
- The target resolves to a symlink, alias, or different account.
- Verification shows the external action partly succeeded.
The expected result is boring: no execution without valid authority, no duplicate side effect, and enough evidence to recover.
The Takeaway
Good AI agent approval workflows do not ask humans to supervise every thought. They put authenticated, payload-bound checkpoints in front of the few actions where authority matters.
Inventory effects, split tools into narrow capabilities, enforce policy outside the model, bind approval to an exact payload, and verify the result. That gives the agent room to be useful without pretending probabilistic software should hold unlimited authority.
Sources
> Want more like this?
Get the best AI insights delivered weekly.
> Related Articles
LLM Trace Redaction in Production: Debug Without Logging Private Data
LLM traces are debugging gold and privacy dynamite. Capture structure, decisions, and timing while removing secrets and personal data before storage.
Secret Management for AI Agents: Stop Leaking Credentials Into Prompts
An agent needs tools, not a backpack full of API keys. Keep secrets outside model context, issue short-lived capability tokens, and audit every use.
Adaptive Concurrency for LLM APIs: Control Backpressure, Latency, and Rate Limits
Fixed worker counts collapse when model latency and rate limits move. Build an adaptive controller that protects throughput without melting your queue.
Tags
> Stay in the loop
Weekly AI tools & insights.