Approvals PREVIEW
A person decides, and signs exactly what they were shown.
What it is
- When policy answers REQUIRE_APPROVAL, an obligation opens. It is discharged by a named person reviewing the specific action and authenticating with a passkey, after which Custody signs the approval.
Why it exists
- “A human approved it” is worth nothing if nobody can say what the human saw. The ceremony exists so the answer is: exactly the statement the signature commits to.
How it works
- The Console asks the Gateway for a challenge and renders the Gateway's reading of the obligation — throwing away what it was displaying.
- The passkey proves the person is present.
- The Gateway asks Custody to sign the approval payload with that principal's Ed25519 key.
Who uses it
- Approvers
- Auditors reading the trail afterwards
Security boundary
- The passkey proves presence. It does not sign the approval — a separate key held by Custody does.
- Self-approval is refused, and one person cannot satisfy a two-person rule twice.
- If Custody's answer is lost, the result is UNKNOWN and is held for a person. It is never retried.
Example flow
A 40,000 ₺ purchase
- The agent asks. Policy answers REQUIRE_APPROVAL and the action does not proceed.
- An approver opens it, and reads the amount, resource and agent as the Gateway states them.
- They authenticate with their passkey; Custody signs; the approval is recorded.
- The agent's next attempt carries the discharged obligation and proceeds.
Current status
| Capability | Status | Where |
|---|---|---|
| See the approval queue Reading the queue and one approval. Deciding is APPROVER. | READ ONLY | /projects/:id/approvals |
| Approve or reject, with a passkey | AVAILABLE | /projects/:id/approvals/:id |
| Enrol a passkey | AVAILABLE | /security/passkeys |
Related API
POST /v1/console/projects/:id/approvals/:id/challengePOST /v1/console/projects/:id/approvals/challenges/:id/complete