Foundable Research · Interactive evaluator

A permission should be an exact action, not a blank check.

Explore how a consumer AI deputy can bind approval to one action, reject changed or expired authority, and prevent later replay.

Published July 23, 2026 · Version 1.1 · Last substantive update August 5, 2026

Maintainers
Stefan Stoll and Wesley Lin
Publisher
Foundable Research

Synthetic browser-local simulation · No sign-in · Nothing sends, saves, or spends

Purpose-bound action evaluator

Approve one consequence. Test what happens next.

All values use the reserved .test domain. State lives only in this page until refresh.

No grant
1

Review the exact consequence

Send this email

Integration
Gmail
Action
Send email
Destination
buyer@example.test
Subject
Pilot details
Body
Here is the bounded pilot we discussed.
Authorization
[hidden]

Exact grant binding

Foundable
demo-tenant
Tool use
toolu_demo_001
Tool
gmail.send_email
Digest
8f3c...a91e
Expiry
5 minutes
Uses
1
2

Choose an execution attempt

What reaches the boundary?

Ready to evaluate

Approval alone is not enough. The current attempt must still match at the boundary.

This browser-local evaluator calls no account, API, provider, database, or credential. It demonstrates the decision model; it does not establish formal correctness or production security outcomes.

Method and scope

One deterministic model drives the page and its public test vectors.

The evaluator is a browser-local state machine. It compares three grant states with four execution attempts and returns a stable decision code, explanation, and consume-or-retain outcome. The same pure decision function powers the visible evaluator and the test vectors published inline below.

The six published vectors cover no grant, an exact active grant, replay, changed content, a different tool, and expiry. They test only this educational model; they do not exercise a Foundable server, provider, account, credential, or external effect.

Inspect the v1.1 JSON test vectors
{
  "title": "Purpose-Bound Action Grants evaluator test vectors",
  "version": "1.1",
  "publishedAt": "2026-07-23T00:00:00.000Z",
  "modifiedAt": "2026-08-05T00:00:00.000Z",
  "scope": "Deterministic vectors for the browser-local educational evaluator; not a production security test or compliance artifact.",
  "vectors": [
    {
      "id": "missing-grant",
      "grantState": "unapproved",
      "attempt": "exact",
      "expected": {
        "verdict": "denied",
        "code": "approval_required",
        "title": "Denied before any external effect",
        "detail": "No purpose-bound grant exists for this action.",
        "consumesGrant": false
      }
    },
    {
      "id": "exact-active-grant",
      "grantState": "active",
      "attempt": "exact",
      "expected": {
        "verdict": "allowed",
        "code": "exact_grant_consumed",
        "title": "Allowed exactly once",
        "detail": "The action matches the approved snapshot. The grant is atomically consumed before the simulated effect.",
        "consumesGrant": true
      }
    },
    {
      "id": "replayed-grant",
      "grantState": "consumed",
      "attempt": "exact",
      "expected": {
        "verdict": "denied",
        "code": "grant_already_consumed",
        "title": "Replay denied",
        "detail": "The single-use grant was already consumed. A later attempt needs fresh authority.",
        "consumesGrant": false
      }
    },
    {
      "id": "changed-payload",
      "grantState": "active",
      "attempt": "changed",
      "expected": {
        "verdict": "denied",
        "code": "approval_content_changed",
        "title": "Changed content needs fresh review",
        "detail": "The recipient and subject no longer match the action snapshot that was approved.",
        "consumesGrant": false
      }
    },
    {
      "id": "different-tool",
      "grantState": "active",
      "attempt": "wrong_tool",
      "expected": {
        "verdict": "denied",
        "code": "grant_scope_mismatch",
        "title": "Different tool denied",
        "detail": "Authority for Gmail send_email cannot be reused for drive.create_file.",
        "consumesGrant": false
      }
    },
    {
      "id": "expired-grant",
      "grantState": "active",
      "attempt": "expired",
      "expected": {
        "verdict": "denied",
        "code": "grant_expired",
        "title": "Expired authority denied",
        "detail": "The grant's short approval window ended before the external boundary.",
        "consumesGrant": false
      }
    }
  ]
}

Interaction-design principles

Make the secure path the ordinary path.

Show consequences, not capability jargon

Review the destination, message, amount, channel, and public effect instead of asking a person to reason about a reusable credential.

Bind approval to what was shown

If material content, destination, tool, or caller changes, the earlier approval no longer applies.

Default to one use

Authority for one action should not become a reusable grant for every later action the same credential could perform.

Recheck at the irreversible boundary

A pause, expiry, scope reduction, stale claim, or unavailable safety read should stop the effect rather than inherit earlier authority.

Primary references

Standards and security guidance behind the design choices.

These sources inform the evaluator's design. Citing them does not establish compliance, independent validation, or production correctness.

OWASP Transaction Authorization Cheat Sheet

Guidance on showing exact consequences, invalidating changed transaction data, enforcing a final server-side gate, limiting lifetime, and preventing replay.

Read the OWASP guidance

IETF RFC 9396: OAuth 2.0 Rich Authorization Requests

A standards-track format for carrying fine-grained authorization details. It informs scope vocabulary; this evaluator does not implement the RFC.

Read RFC 9396

IETF RFC 9449: OAuth 2.0 DPoP

Standards-track replay and sender-constraint guidance, including short proof lifetimes and the explicit limitation that DPoP does not bind a request body.

Read RFC 9449

Evidence boundary

This is an evaluator, not a security guarantee.

The page mirrors implemented design constraints with synthetic data. It is not formal verification, an independent user study, a penetration test, or proof that every production path is free of defects. It connects to no account, provider, credential, database, or Foundable API.

v1.1 · August 5, 2026: Added named authorship and maintenance, explicit method and limitations, primary references, machine-readable test vectors, and this public correction record. The evaluator's decisions did not change.

Continue to footer navigation