Gate Approval Workflow

Audience: operators who need to manually approve a rollout stage gate that requires explicit human sign-off before the stage can advance.

Background

Rollout stages can have multiple promotion conditions (time soak, metric gates, manual gates). A manual gate requires an explicit approval action before the stage is considered fully passed. Once the manual gate is approved, the system re-evaluates all conditions — if all pass, the stage is automatically promoted.

Important: Gate approval only marks the manual condition as passed. If other conditions (e.g. a metric gate) are still failing, the stage will not promote until those also pass. Approving a manual gate is not the same as force-promoting the stage.

To bypass all conditions, use the skip_failed recovery strategy instead (see Fleet Rollout Recovery §3.3).

Prerequisites

  • AUTONOMY_ORCHESTRATOR_URL set or --orchestrator-url flag available.

  • Plan ID and Stage ID of the gate to approve.

  • AUTONOMY_OPERATOR set for audit record attribution.


1. Identify gates pending approval

Inspect gate status for a stage

PLAN_ID="plan-abc123"
STAGE_ID="stage-03"

curl -sf \
  "${AUTONOMY_ORCHESTRATOR_URL}/v1/rollouts/${PLAN_ID}/stages/${STAGE_ID}/gates" \
  | jq .

Example response:

{
  "stage_phase": "open",
  "gates": [
    {
      "kind": "time_soak",
      "passed": true,
      "detail": "soak elapsed 30m of required 30m"
    },
    {
      "kind": "manual",
      "passed": false,
      "detail": "awaiting operator approval"
    }
  ],
  "manual_approved": false,
  "all_passed": false
}

manual_approved: false and all_passed: false indicate the manual gate is blocking.


2. Approve the manual gate

autonomy rollout gate approve \
  --orchestrator-url "$AUTONOMY_ORCHESTRATOR_URL" \
  --plan-id "$PLAN_ID" \
  --stage-id "$STAGE_ID" \
  --reason "release validated against SLO dashboard; no anomalies in 30m soak window"

Expected response (gate approved, all conditions pass, stage auto-promoted):

{
  "approved": true,
  "promoted": true,
  "message": "manual gate approved; all conditions passed; stage promoted",
  "approved_at": "2026-03-18T10:30:00Z"
}

Expected response (gate approved, other conditions still failing):

{
  "approved": true,
  "promoted": false,
  "message": "manual gate approved; waiting for metric gate: p99 latency above threshold",
  "approved_at": "2026-03-18T10:30:00Z"
}

3. Verify stage advancement

After a successful approval with promoted: true:

curl -sf \
  "${AUTONOMY_ORCHESTRATOR_URL}/v1/rollouts/${PLAN_ID}/stages/${STAGE_ID}/gates" \
  | jq '{stage_phase, manual_approved, all_passed}'
{
  "stage_phase": "promoted",
  "manual_approved": true,
  "all_passed": true
}

Watch the plan advance to the next stage:

watch -n 5 'curl -sf "${AUTONOMY_ORCHESTRATOR_URL}/v1/rollouts/${PLAN_ID}" | jq .current_stage_id'

4. Common failure branches

Manual gate re-approved (already approved)

The gate approval endpoint is idempotent for the manual condition. Re-approving a gate that was already approved is a safe no-op — it returns the same approved: true response and does not double-count the action in the audit trail.

Stage already in terminal phase

If the stage is already promoted, halted, or rollback, the gate approval endpoint returns:

{
  "error": "stage is already in a terminal phase"
}

No action needed — the gate is moot once the stage is terminal.

Plan in terminal phase

If the plan is rolled_back, cancelled, or completed, gate approval returns a 409. Check the plan status first:

autonomy rollout plan describe \
  --orchestrator-url "$AUTONOMY_ORCHESTRATOR_URL" \
  --plan-id "$PLAN_ID"

Known gaps

  • No gate list across all plans: There is no endpoint to enumerate all pending manual gates across the fleet. Operators must query per-stage. A bulk pending-approvals view is a follow-on item.

  • No notifications: The system does not notify operators when a manual gate is pending. Alerting on rollout.gate.pending events requires a log-based alert rule on the audit slog output.