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 declare effect for each action, so agents don't have to guess.

Policy

{
  "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.