Skip to main content

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):

ScopeUsed forAllowed sources
MERGE_APPROVALApproving a PR merge at the exact headgithub-review-approval, signed-ticket
TAG_APPROVALCreating a Git taggithub-review-approval, signed-ticket
RELEASE_APPROVALAuthorizing a releasegithub-review-approval, signed-ticket
PHASE_00_RESUME_APPROVALResuming PHASE-00 after a pausegithub-review-approval, signed-ticket
PRODUCTION_PROMOTIONPromoting to productiongithub-review-approval, signed-ticket
PAID_MODEL_DISPATCH_APPROVALDispatching to a paid model adapterowner-cli, signed-ticket, github-review-approval

Sources

EXTERNAL_HUMAN_SOURCES = {github-review-approval, owner-cli, signed-ticket}
SourceChannelUsed by
github-review-approvalGitHub UI or gh pr review --approve, ingested by ingest-github-review.ps1MERGE_APPROVAL, TAG_APPROVAL, RELEASE_APPROVAL, PHASE_00_RESUME_APPROVAL, PRODUCTION_PROMOTION, PAID_MODEL_DISPATCH_APPROVAL
signed-ticketOpenSSH-signed authorization payload, verified by signed_ticket_verifier.pyMERGE_APPROVAL, TAG_APPROVAL, RELEASE_APPROVAL, PHASE_00_RESUME_APPROVAL, PRODUCTION_PROMOTION, PAID_MODEL_DISPATCH_APPROVAL
owner-cligoal-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 (or CONSUMED).
  • dispatches_used is 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 --approve invocation that the orchestrator has not ingested.
  • A signed ticket whose subject_sha does not match the runtime HEAD.
  • An agent-role identity string in the approver field — rejected at write time.
  • A historical gate whose dispatches_used is already at max_dispatches.

Provenance matrix

ProvenanceMERGE_APPROVALTAG_APPROVALRELEASE_APPROVALPHASE_00_RESUME_APPROVALPRODUCTION_PROMOTIONPAID_MODEL_DISPATCH_APPROVAL
github-review-approval
signed-ticket
owner-cli