Blocking — the default
The agent’s HTTP call stays open until someone decides, orlimits.approval_timeout_ms expires. Simple to integrate: one request, one answer.
Right when a person is watching (Debug Mode, a developer at a terminal) or approvals take seconds.
Async
wait long-polls up to 60 seconds. While pending you get proposed; afterwards, exactly what a blocking call would have returned — committed with its approval, or rejected, expired, stale, or denied.
Debug Mode always blocks, whatever the mode says. A person stepping through an agent’s traffic live is not waiting on a poll.
What the agent can rely on
- A retry returns the same proposal. Re-sending with the same
idempotency_keywhile one is pending gives the sameoperation_id, so a lost ID is recoverable and a reviewer never sees two copies of one change. - Nothing runs until a person approves. Every other outcome — rejection, expiry, a stopped debug session — leaves the database untouched.
- An approval is re-checked before it runs. An agent frozen by a circuit breaker while its change waited is refused even though a human said yes, and its database identity is resolved again so the change never runs on a lease that expired while someone was deciding.
- A stale approval is refused. If the records moved between the preview and the commit, the result is
staleand nothing is written. See previews and fences.
Reviewing
Through the browser at/ (operator view), the terminal (warden debug attach), or the control plane: