How it behaves
- The run reaches the node and suspends.
- Someone answers it through the Management API:
POST /v1/workflows/{workflow_id}/runs/{run_id}/approvalwith{"approved": true}or{"approved": false}. An optionalcommentanddataride along. - The run resumes.
Two different things can park a run
Do not confuse the authored Approval node with an autonomy gate raised by a capability call inside the run. They are separate mechanisms and are answered in different places.GET /v1/workflow-runs/{run_id}/gates/pending lists the second kind. Workflow
gates have no thread, so they are addressed by run rather than by thread.
Who can answer an autonomy gate on a run
An agent cannot approve its own run’s gate. That is enforced in the resolve
transaction, not just in the UI.
Only two answers
Approve and deny. The broadening answers available in agent chat — “allow for this thread”, “allow always” — are rejected on a workflow run, because there is no thread and no user to broaden over.Why a workflow step does not raise its own approval
Workflow steps are allowed inside the autonomy policy stage without consulting level or allowlists, precisely because a workflow is an authored plan — human review belongs in the graph. The hardline floor and the account denylist still apply.Designing with it
- Put the Approval node before the irreversible step, not after.
- Label the node for the decision it asks for. “Approve?” tells whoever inherits the graph nothing.
- A denial ends the run as failed; there is no deny branch to route down. If a rejection needs its own handling, model it before the Approval node.
- If the decision needs to time out, model it explicitly with a parallel path, since the node itself will not.