Approval nodes pause a running Archon workflow and wait for a human to approve or reject before continuing. They are the primary mechanism for inserting human review steps into otherwise automated pipelines—for example, reviewing a generated plan before committing to expensive implementation work, or reviewing proposed code changes before merging. This page covers the YAML schema, how to approve and reject from every platform, theDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/coleam00/Archon/llms.txt
Use this file to discover all available pages before exploring further.
capture_response option, and AI rework with on_reject.
Web UI users: Add
interactive: true at the workflow level. Without it, the workflow runs in a background worker and approval gate messages won’t appear in your chat window.Quick start
.archon/workflows/plan-approve-implement.yaml
review-gate, the workflow pauses and sends a message to the user. On the Web UI, interactive: true is required for the message to appear in your chat.
How it works
Pause
The executor sets the workflow run status to
paused and stores the approval context (node ID and message) in the run’s metadata.Notify
A message is sent to the user on whatever platform they’re using (CLI, Slack, Telegram, GitHub, Web). The message includes the approval prompt and instructions for approving or rejecting.
Wait
The workflow stays paused until the user takes action. Paused runs block the worktree path guard—no other workflow can start on the same path while a run is paused.
Approve
The user approves. This writes a
node_completed event and auto-resumes the workflow from the next node. Natural-language messages, the CLI, Web UI approve button, and /workflow approve all auto-resume.YAML schema
Fields
| Field | Type | Required | Description |
|---|---|---|---|
approval.message | string | Yes | Message shown to the user when the workflow pauses |
approval.capture_response | boolean | No | When true, the user’s approval comment is stored as $<node-id>.output for downstream nodes. Default: false |
approval.on_reject.prompt | string | No | Prompt run via AI when the user rejects. $REJECTION_REASON is substituted with the reject reason. After running, the workflow re-pauses at the same gate |
approval.on_reject.max_attempts | integer | No | Max rejection-and-rework cycles before the workflow is cancelled. Range: 1–10. Default: 3 |
Approval nodes do not support AI-specific fields (
model, provider, context, output_format, allowed_tools, denied_tools, hooks, mcp, skills, idle_timeout) — they don’t invoke an AI agent. Standard DAG fields (id, depends_on, when, trigger_rule, retry) work as expected. The on_reject.prompt runs as a separate AI node using the workflow’s default provider.Approving and rejecting
Natural language (recommended)
Type your response in the same conversation. The system detects the paused workflow and treats your message as the approval response:/workflow reject <run-id> command.
CLI
Slash commands (all platforms)
Web UI
Paused workflows show an amber pulsing badge on the dashboard. Click Approve or Reject on the workflow card. Both actions auto-resume from the paused gate. The Reject dialog includes an optional free-text reason field. The trimmed value is passed to the workflow as$REJECTION_REASON, available in the on_reject.prompt.
REST API
Capturing reviewer comments (capture_response)
By default, the user’s approval comment is not available downstream—$gate.output will be an empty string. Set capture_response: true to capture the comment:
capture_response: true, downstream nodes should not reference $gate.output—it will be an empty string.
Rejection with AI rework (on_reject)
When on_reject is configured, a rejection does not cancel the workflow. Instead, the executor runs an AI prompt with the rejection reason and re-pauses at the same gate:
Lifecycle with on_reject
- Workflow pauses at approval gate
- Reviewer rejects —
rejection_countincremented,rejection_reasonstored - If
rejection_count < max_attempts:on_reject.promptruns via AI, workflow re-pauses - If
rejection_count >= max_attempts: workflow cancelled
Report generation example
This pattern generates a report, then loops the gate until approved ormax_attempts exhausted:
.archon/workflows/generate-report.yaml
Multi-gate workflows
Multiple approval nodes in a single workflow are fully supported. Each pauses the workflow independently:.archon/workflows/careful-refactor.yaml
Edge cases
Approval node in a parallel layer
Approval node in a parallel layer
Other nodes in the same topological layer complete normally. The workflow pauses at the layer boundary once the approval node is reached.
Server restart while paused
Server restart while paused
The run persists in the database. The user can still approve or reject after restart—the workflow resumes from exactly where it left off.
Abandoning a paused run
Abandoning a paused run
Use
archon workflow abandon <id> or the Abandon button on the dashboard. This marks the run cancelled while preserving the completed-node history.Multiple approval nodes in the same workflow
Multiple approval nodes in the same workflow
Fully supported. Each pauses and resumes independently. The worktree path guard blocks other workflow starts while any approval node is paused.
Choosing: interactive loop vs approval with on_reject
| Interactive loop | Approval + on_reject | |
|---|---|---|
| YAML | loop.interactive: true | approval.on_reject: { prompt } |
| User input variable | $LOOP_USER_INPUT | $REJECTION_REASON |
| How it works | Same prompt runs each iteration, user input injected | Specific on_reject prompt runs only on rejection |
| Best for | Conversational iteration — explore, refine, review cycles | Gate-then-fix — approve to proceed, or reject to trigger a specific corrective action |
| Example | PIV loop: explore → user feedback → explore again | Report generation: generate → user rejects → AI revises |
Related pages
Authoring Workflows
Full workflow reference including the human-in-the-loop pattern.
Loop Nodes
Interactive loops with
$LOOP_USER_INPUT for conversational iteration.Variable Reference
$REJECTION_REASON, $LOOP_USER_INPUT, and all other variables.CLI Reference
archon workflow approve and archon workflow reject commands.