Protocol
Escalation flow
Operational spend never votes. When a policy returns ESCALATE, the EscalationRouter opens a pending intent and walks the reporting line until a node with sufficient authority resolves it.
Worker proposes action
│
▼
PolicyStack.check ── DENY ──► revert
│
ALLOW ──► execute (session key / smart account)
│
ESCALATE
│
▼
Intent created · awaiting = parent
│
Parent resolve(approved?)
│
├── false → closed
└── true → (TODO) re-check parent policy / recurse / executeRules
- Leaves never pull from the treasury; they spend allowance only.
- Escalation is a purchase order, not a governance vote.
- Human root approvals are passkey signatures; where the root is a Safe the credential owns, that signature is the Safe's own — it authorizes an
execTransactionwhosemsg.senderonresolveis the Safe. Managers may auto-approve within their own policy bounds. See Self-hosting → When the root is a Safe. - Every
IntentCreated/IntentResolvedevent is part of the audit trail.
Current scaffolding
EscalationRouter.resolve re-checks policy as the approver:
- Reject → closed
- Approver
ALLOW→ finalized - Approver
ESCALATE→awaitingApproverclimbs to the parent (IntentEscalated) - Human root approval finalizes even when still over soft caps (mocked root authority)
Per-agent caps live on SpendCapPolicy.setAgentCap. propose must be signed by a valid SessionRegistry key (or the agent address). Structured scope checks and AA execution are still TODO.