Approval Queue
Human-in-the-loop gating for risky effects (driven by FirewallOutcome::ApprovalRequired):
firewall::evaluate → ApprovalRequired(req)
→ ApprovalBroker (SQLite, persistent)
→ Desktop UI "Approval Queue" tab
→ user: Approve / Reject / Delegate / Defer
→ ledger event
→ vigil-runner spawn (only if approved)
ApprovalScope
Each request carries a scope (see ADR 0014):
server_id+tool_nameeffect_kind(read / write / network / …)resource_pathduration(once / session / forever)
Delegate hands the decision to a super-user or batch-approval flow.
See ADR 0003 and ADR 0014.