Technical Guides · 2026-08-31
AIAgentsApprovalAutomation

Technical guide: AI agent budget and approval workflow

This guide supports [Give an AI agent a budget, not a blank check](./2026-08-31-ai-agent-budget-not-blank-check.md). It describes a small implementation pattern for limiting what an assistant can do, what needs approval, and how to record the result.

The goal is not to make an agent autonomous. The goal is to make its authority explicit and reviewable.

Architecture and responsibility boundaries

Use four separable stages:

1. **Define the budget** — list what the assistant may read, draft, propose, and never do on its own.

2. **Prepare a proposal** — let the assistant draft the change without executing it.

3. **Review and approve** — let a person accept, edit, reject, or request more detail.

4. **Execute and log** — perform the approved action, record what happened, and keep rollback information when possible.

Keep the main article reader-facing. Keep this guide implementation-focused. Do not let the implementation details change the tone of the mainstream piece.

Minimal permission budget

Store the budget as a small, explicit record:


{
"task": "Email draft and review",
"allowed": {
"read": ["inbox labels", "draft folder"],
"draft": true,
"send": false,
"publish": false,
"delete": false,
"spend": false
},
"requires_approval": ["send", "publish", "delete", "spend"],
"dry_run": true,
"log": true
}

The budget should be specific to the task. A general "be helpful" budget is not enough.

Proposal contract

When the assistant prepares a proposal, require this behavior:


Use only the approved budget for the task.
Do not send, publish, delete, or spend without approval.
Show the exact action before executing it.
Distinguish draft, proposal, and confirmed action.
Do not hide side effects.
Do not invent permissions.

A proposal should make the consequence visible. If the assistant cannot describe what it is about to do, it should not do it.

Approval payload

An approval request should answer a few concrete questions:


Action: send draft reply
To: recipient
What changes: proposed reply text
Risk: medium
Approval: APPROVE / EDIT / REJECT
Notes: waiting on client confirmation

This is not paperwork for its own sake. It is how you keep the human decision tied to the specific action.

Dry run

For anything consequential, prefer a dry run first:

A dry run is useful because it separates "this looks okay in principle" from "this is the exact thing I am about to allow."

Logging

Keep a short log for each approved action:


{
"task_id": "task-001",
"budget": "email draft and review",
"proposal": "Draft reply to client question",
"approval": "approved with edits",
"action": "send draft",
"result": "sent",
"reviewer": "human owner",
"notes": "Checked recipient and tone before sending"
}

The log is not for surveillance alone. It is for reviewability. If something goes wrong, the record helps you tell whether the issue was the budget, the proposal, the approval, or the execution.

Rollback and failure handling

Design the workflow so a bad action is not the end of the world:

If an action cannot be reversed, it should usually require a higher approval threshold than an action that can be.

Trust progression

Start narrow and expand only after proof:

Trust should be earned task by task. If a task proves risky, narrow the budget again rather than pretending the assistant is "good enough."

What the assistant should not do

Without explicit owner approval, an assistant should not:

This list is not a joke. It is the line between assistance and delegation.

Verification checklist

Before the workflow is used with real actions:

Sources

[1] https://www.nist.gov/itl/ai-risk-management-framework — NIST AI Risk Management Framework

[2] https://nvlpubs.nist.gov/nistpubs/ai/NIST.AI.600-1.pdf — NIST Generative AI Profile