Human Gates
Human gates are the operator-facing boundary where ASF50 stops and waits for a real owner decision. This page is the canonical reference for what scopes exist, what sources are accepted, and how consumption works.
Scopes
The canonical scopes (from scripts/goal-runner/scoped_owner_gate.py):
| Scope | Used for | Allowed sources |
|---|---|---|
MERGE_APPROVAL | Approving a PR merge at the exact head | github-review-approval, signed-ticket |
TAG_APPROVAL | Creating a Git tag | github-review-approval, signed-ticket |
RELEASE_APPROVAL | Authorizing a release | github-review-approval, signed-ticket |
PHASE_00_RESUME_APPROVAL | Resuming PHASE-00 after a pause | github-review-approval, signed-ticket |
PRODUCTION_PROMOTION | Promoting to production | github-review-approval, signed-ticket |
PAID_MODEL_DISPATCH_APPROVAL | Dispatching to a paid model adapter | owner-cli, signed-ticket, github-review-approval |
Sources
EXTERNAL_HUMAN_SOURCES = {github-review-approval, owner-cli, signed-ticket}
| Source | Channel | Used by |
|---|---|---|
github-review-approval | GitHub UI or gh pr review --approve, ingested by ingest-github-review.ps1 | MERGE_APPROVAL, TAG_APPROVAL, RELEASE_APPROVAL, PHASE_00_RESUME_APPROVAL, PRODUCTION_PROMOTION, PAID_MODEL_DISPATCH_APPROVAL |
signed-ticket | OpenSSH-signed authorization payload, verified by signed_ticket_verifier.py | MERGE_APPROVAL, TAG_APPROVAL, RELEASE_APPROVAL, PHASE_00_RESUME_APPROVAL, PRODUCTION_PROMOTION, PAID_MODEL_DISPATCH_APPROVAL |
owner-cli | goal-gate.ps1 -Action approve -Source owner-cli … | PAID_MODEL_DISPATCH_APPROVAL only |
Subject binding
Every high-stakes gate records a subject_sha. The orchestrator refuses to consume a gate whose subject_sha does not match the runtime HEAD. To re-issue a gate for a different HEAD, the owner re-runs the gate creation at the new head.
Consumption
A gate is consumed when the orchestrator uses it to authorize a step. After consumption:
- The gate transitions to
APPROVED(orCONSUMED). dispatches_usedis incremented.- The gate is no longer in the open list.
Replaying a consumed gate fails closed.
Operator commands
List open gates
.\scripts\goal-runner\goal-gate.ps1 -Action list -RuntimeRoot $env:ASF50_RUNTIME_ROOT
Inspect a specific gate
.\scripts\goal-runner\goal-gate.ps1 -Action inspect -GateId <gate-id> -RuntimeRoot $env:ASF50_RUNTIME_ROOT
Approve via owner-cli (paid-model only)
.\scripts\goal-runner\goal-gate.ps1 `
-Action approve `
-GateId <gate-id> `
-Approver "<human display name>" `
-Source owner-cli `
-Note "<bounded justification>" `
-RuntimeRoot $env:ASF50_RUNTIME_ROOT
Reject a gate
.\scripts\goal-runner\goal-gate.ps1 `
-Action reject `
-GateId <gate-id> `
-Approver "<human display name>" `
-Source owner-cli `
-Reason "<bounded reason>" `
-RuntimeRoot $env:ASF50_RUNTIME_ROOT
Ingest a GitHub review
.\scripts\goal-runner\ingest-github-review.ps1 `
-GoalId <GOAL_ID> `
-ReviewJsonPath "<path-to-review.json>"
What is NOT an approval
- A chat message saying "approved" — not a gate.
- A
gh pr review --approveinvocation that the orchestrator has not ingested. - A signed ticket whose
subject_shadoes not match the runtime HEAD. - An agent-role identity string in the
approverfield — rejected at write time. - A historical gate whose
dispatches_usedis already atmax_dispatches.
Provenance matrix
| Provenance | MERGE_APPROVAL | TAG_APPROVAL | RELEASE_APPROVAL | PHASE_00_RESUME_APPROVAL | PRODUCTION_PROMOTION | PAID_MODEL_DISPATCH_APPROVAL |
|---|---|---|---|---|---|---|
github-review-approval | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
signed-ticket | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
owner-cli | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ |