A small, working permissions system for AI agents

actas

When an AI agent works for you, what stops it from doing more than you allowed? Actas gives each agent a pass that can only get smaller as work is handed on, runs out quickly, and leaves a record of who did what.

the owner's side (grant · revoke) granted refused scopelost at this hop

The fictional lab runs live token exchanges. The policy workbench checks your own configuration against the same policy engine. Neither uses pre-recorded results.

Build a policy. Catch a bad grant.

Design an agent's permissions, check the boundary cases, and take a regression pack back to your project. These are live decisions from Actas's policy engine, not a token decoder or a pretend approval.

Use non-sensitive examples only. Running checks or comparisons sends your pack to this server for in-memory processing. Do not enter tokens, credentials or confidential configuration. Downloads stay on your device.

Use this builder to create a new pack. Import and JSON edits use the pack below; they do not fill this form.

Add or edit a test request without JSON

Write a request you want to allow or refuse. Expectations are your intent, not a suggestion from the engine. Only these cases are tested; passing them is not a safety guarantee.

Load the current pack before editing a case. Changes stay in this tab until downloaded.

Edit configuration and test cases (JSON)

Change a case's expect_allowed to assert your intended rule. Up to 8 agents and 64 cases. Exact schema required; unknown or repeated fields are rejected.

Build a pack to begin.

Compare a proposed policy change

Keep a baseline, then edit the policy in the JSON pack above. Compare runs the candidate's exact cases under both policies, even if the saved baseline had different cases. A new allowance is a change to review, not automatically a vulnerability. Nothing is installed.

No baseline selected. Baselines live in this tab only; refreshing clears them.

Change a candidate policy without touching cases

Keep a baseline first. Load the current pack, select an agent, change its limits, then apply. Test requests and their expectations stay exactly as they are. This edits the pack only, not a running authorization server.

No policy loaded. Loading again discards unapplied form edits.

Inspect the kept baseline policies
No baseline selected.

Only supplied cases are tested. Unchanged outcomes do not mean policies are equivalent, and denied requests can have different refusal reasons. Signature, issuer, expiry, revocation and DPoP checks remain outside this tool.

Policy checks only: no issuer, signature, token expiry, revocation or proof-of-possession validation. Passing the chosen cases is not a security certification. Packs are sent to this server when you run them, processed in memory and not stored by this application. Do not paste tokens, credentials or confidential configuration. Downloads stay on your device.

live: every change runs the real exchange code on a throwaway server instance

Asha lets an assistant act for her. Change what she allows, what each agent asks for, and how long the pass lasts, then watch what is granted and what is refused. Start with the “Try to widen” preset. All people and systems here are made up.

what Asha grants

granted revoked by the owner refused scopelost at this hop

Agents pass work on.You ask an assistant to check your calendar. It hands part of the job to a helper. Today the helper often inherits your full access.
Access should shrink, not grow.Each hand-off should carry fewer permissions and a shorter life. Asking for more than you were given should simply fail.
You need a trail.If something goes wrong, you want to know which agent acted for whom, and be able to switch one off and everything it handed out with it.
Run the scripted story, inspect the audit log, send a raw token exchange

A fictional product manager, Asha, lets an assistant agent read her calendar and file notes. The assistant hands calendar work to a summarizer sub-agent. Watch the token shrink at each hop, watch a scope-widening attempt get refused, and see a stolen token fail without the key it was bound to.

Runs five hops against the live exchange endpoint and renders the token claims it returns.

chain unverified
#eventactordetail
Run the story to populate the log.

    
Real, runs on every click
The token exchange, scope narrowing, lifetime limits, RS256 signing, proof-of-possession checks, revocation of a token and everything derived from it, and the hash-chained audit log. Nothing on this page is pre-recorded.
Made up
Asha, the agents, the calendar and notes services, and their data. Each lab run uses a fresh throwaway service. Your policy workbench inputs are separate from this fictional world and are not stored by the application.
Not claimed
No login or consent screen, no independent security audit, not production ready. Proof of possession is a subset of the spec, and its single-use tracking works per server instance only. The audit chain shows tampering; it does not prevent it.
What this is. A runnable reference implementation of OAuth 2.0 Token Exchange (RFC 8693) built from public specifications, with RS256 JWTs (RFC 7519), a JWKS endpoint (RFC 7517), and a hash-chained audit log. The hash chain is tamper-evident: it detects edits to recorded history. It is not tamper-proof storage, and this server is not a production authorization server.