---
title: "Graded approvals"
canonical: https://guavaindex.com/specs/approvals
modified: 2026-11-10T08:36:22Z
lang: en
---

# Graded approvals

Status: draft 0.1. Covers friction #18 (approval prompts are all or nothing). Reference implementation: `agent_index/approvals.py`.

Approving every step trains people to rubber-stamp. Approving nothing blocks useful work. A short policy decides per action, from what the action would actually do.

## Action

`effect` (read, write, send, spend, delete), `target` (a domain or resource), `amount` (cents, for spend), `reversible`, `bulk`, and free `tags`. Site [action manifests](/specs/agent-actions) declare `effect` for each action, so agents don't have to guess.

## Policy

```json
{
  "rules": [
    {"when": {"effect": "delete", "bulk": true}, "then": "deny"},
    {"when": {"effect": "read"}, "then": "allow"},
    {"when": {"effect": "write", "reversible": true}, "then": "allow"},
    {"when": {"effect": "spend", "amount_lte": 2000}, "then": "allow", "note": "under $20"},
    {"when": {"effect": "spend"}, "then": "ask"},
    {"when": {"effect": "send"}, "then": "ask"},
    {"when": {"effect": "delete"}, "then": "ask"}
  ],
  "default": "ask",
  "remember_approvals_for_seconds": 3600
}
```

The first matching rule wins. Conditions: `effect` (one or a list), `target` (glob), `amount_lte`, `amount_gt`, `reversible`, `bulk`, `tag`.

## Remembering approvals

When the person approves an "ask", similar actions (same effect, same target, same bulk flag) are allowed for `remember_approvals_for_seconds`. "Yes, you can buy from this shop for the next hour" is one tap, not one per item. A "deny" is never remembered away.
