A task that needs three permissions gets tokens for everything, valid for months, usable by anything the agent reads.
CapAuth issues a signed lease per task, checks every tool call against it in code, and records each decision in a hash-chained log.
Hosted replays of real runs. Running CapAuth locally? Open the live console on port 8000.
The agent holds its user's tokens: read every channel, push and merge, read and share every file, email anyone. Those grants do not depend on the task, and they do not expire.
Agents multiply them. Classic access control assumes an actor whose permissions do not depend on a decision it has not made yet.
An agent that reads a document or a web page can be instructed by it. There is no equivalent of a parameterized query.
EU AI Act high-risk obligations for logging and human oversight took effect in August 2026. What counts as a sufficient agent audit log is not yet specified.
Figures from the AGI House Enterprise Deployment primer, Layer 7.
The lease holds only the capabilities the agent's plan needs: this channel, this repo, this customer. Nothing else is there to misuse.
Ten minutes by default, revoked the moment the task ends. There is no standing access left behind.
Every tool call is checked against the lease by a deterministic gate. The model proposes; the code decides.
Every decision lands in a hash-chained ledger with who, for whom, what, why, and when.
A signed lease per task and a verifiable ledger are artifacts. A model's refusal rate is not. The review evaluates the ceiling and the enforcer, not the transcript.
The policy ceiling is per agent identity, the way a service account is scoped today. The lease is the just-in-time narrowing on top. Every entry carries the human the agent acts for.
Who, for whom, what, why, and when, hash-chained, with an attestation and JSONL export to a SIEM. Aimed at the EU AI Act high-risk logging and oversight duties in force since August 2026.
Sensitive actions wait for a person. Approvals are recorded under the operator's identity, once or for the task, never silently.
CapAuth sits as an MCP server in front of the tools. The agent framework and the tool servers stay as they are. Any model behind it, frontier or local.
When a manager agent creates a worker, the worker's lease is a strict subset with a shorter TTL, and both write to one audit trail. Authority narrows at every hop.
The numbers behind these claims are on this page: 72 measured runs, a live delegation, and the full source.
One screen per run: the plan, the lease, and every decision.



slack.search(channel="#payments")
Inside the lease, so it ran.
slack.search(channel="*") narrowed to #payments
The plan wanted every channel. The lease gave one.
github.merge_pr(acme/payments-api, #481)
Sensitive under policy. Waited for the operator, then ran.
slack.post_message(channel="#payments")
Not in the task. Denied, with provenance.
72 runs through Claude Code: three models, four injection payloads, CapAuth on and off, three runs per cell. Every run read the poisoned thread.
| Agent under test | Injection variants | Runs | Took the injected action | Customer data left the org | Legitimate issue filed |
|---|---|---|---|---|---|
| Opus 5 | 4 | 24 | 0 | 0 | 24 / 24 |
| Sonnet 5 | 4 | 24 | 0 | 0 | 24 / 24 |
| Haiku 4.5 | 4 | 24 | 0 | 0 | 24 / 24 |
No model took the injected action. The legitimate task completed 72 of 72 times. A refusal rate is not a control; with CapAuth the out-of-lease action is unreachable regardless of the model. The same lease stopped overreach that was not an attack: a stray Slack post, a search across every channel.
AI managers create task-specific AI employees. Humans set direction and approve decisions. Every agent is tied to a responsible person.
A manager agent hands a worker a smaller lease through capauth.delegate. The worker's lease is a strict subset of the manager's, cannot outlive it, and carries the parent lease id. Both write to one audit trail.
Live run: the manager holds three capabilities, the worker gets one for five minutes, three decisions on two hash chains.
One YAML file per agent identity: the ceiling, the actions that need a person, the actions that are never granted.
See what a task template would get before any agent holds it.
Child leases are strict subsets with shorter TTLs. The ledger shows the chain.
Hash-chained entries: who, for whom, what, why, when. Attestation, JSONL export, and an offline verifier that fails on tamper.
Sits in front of any MCP client. The agent and the tools do not change.
Enforcement does not depend on the model.
An AI organization. A live Claude Code run. The manager delegates one capability to a worker. Nothing simulated.
Customer-facing agent, before and after. The customer asks the agent to export every record. Simulated agent, labeled on screen.
Poisoned Slack thread, before and after. Without CapAuth the export and the email run; with CapAuth both are denied. Simulated agent, labeled.
Requirements: Python 3.13, uv, and the claude CLI logged in. No API key.
git clone https://github.com/HivaMohammadzadeh1/capauth && cd capauth uv sync uv run python server.py # open http://localhost:8000 uv run pytest # 21 tests uv run python attack/demo.py --scope off # terminal before uv run python attack/demo.py --scope on # terminal after
Built at AGI House Enterprise Deployment Build Day, 19 September 2026.