{ "name": "Enterprise approval", "objective": "Move a permissioned change through its required approvals without a human chasing reviewers, while keeping every gate, approver, and decision on the record.", "trigger": { "type": "scheduled", "cadence_or_event": "Every 1-4 hours during business hours while an approval is open, and when a gate completes or an approver is assigned." }, "intake": { "sources": ["change request", "linked diff or runbook", "required gate results", "approver decisions"], "selection_rule": "Act only on the next unmet required gate or pending approver; never advance while a required gate is unmet." }, "workspace": { "isolation": "Read access to approval metadata, gate results, diffs, and policy documents; no merge or access-grant surface.", "allowed_actions": ["read approval state", "attach sourced evidence", "request reviews", "update status fields"], "disallowed_actions": ["self-approve", "bypass a gate", "edit policy", "merge or ship the change"] }, "context": { "required_files": ["approval policy", "AGENTS.md", "change-management runbook"], "runtime_sources": ["current gate status", "approver availability", "SLA timers"] }, "agents": [ { "role": "Explorer", "responsibility": "Summarize the change and which gates and approvers still block it." }, { "role": "Coordinator", "responsibility": "Route the request to the next required gate or approver and track SLAs." }, { "role": "Reviewer", "responsibility": "Check that attached evidence satisfies each named policy gate." }, { "role": "Judge", "responsibility": "Decide whether to advance, request changes, or escalate to a human owner." } ], "verification": { "gates": ["every required gate has a recorded pass, fail, or waiver with evidence", "each approval is attributable to a named human", "the change does not advance while any gate is unmet"], "receipts": ["change request ID", "gate status with evidence links", "approver decisions and conditions", "timestamps"] }, "state": { "artifacts": ["approval ledger entry", "gate and approver status record"], "update_rule": "Record what advanced, what blocked, and why after every run, preserving an immutable audit trail." }, "budget": { "max_retries": 3, "max_runtime_minutes": 240 }, "escalation": { "conditions": ["approver unresponsive past SLA", "a gate fails", "policy is ambiguous", "a waiver is requested", "regulated data or production access is involved"], "destination": "Named human owner via the change-management channel" }, "exit": { "success": "The change is fully approved with a complete audit trail, or cleanly rejected.", "stop_without_success": "The loop is blocked on a human decision, a failed gate, or an unresponsive approver." } }