AI agent identity: sponsors, principals and signed receipts
Every agent is a principal of its own, a person answers for it, and every run can be proved to somebody who does not trust you.
In the adminAgents
Each agent is a principal, agent/NAME. What it writes is authored by that name, the audit log records it as the actor, and the access policy can grant it a role like anybody else. A sponsor is the person who answers for it: told when it misbehaves, and without whom it stops.
Give each agent a sponsor
-
Name the person who answers for it
quilzo agent sponsor returns-editor danareturns-editor is answered for by dana until 6 January 2027The sponsor must be somebody who can act in this installation. An identity lasts 90 days unless you say otherwise, and a year at most.
-
See who answers for what
The Answered for by column on Administration › Agents shows each sponsor and when the identity ends. An agent nobody answers for is marked nobody, with the command that fixes it.

One agent with a sponsor, and one without. -
Renew it before it ends
quilzo agent renew returns-editor --for 2160hMost agents nobody looks after are agents nobody needs. Renewal is when somebody decides which.
When an agent stops
| What happened | What the agent does |
|---|---|
| Its sponsor's access ended, or the identity provider suspended or removed them | Does not run, and the Agents screen says the sponsor can no longer act here. |
| Its identity reached its end date | Does not run until somebody renews it. |
| It was never given a sponsor | Runs, and the security posture reports it (agent.no-sponsor) until somebody answers for it. |
| The shield paused it | Does not run until the pause ends or is lifted. |
Evaluations still run in every case. They change nothing, and they are how a new sponsor finds out what they are taking on. Because the sponsor is checked against the same access the identity provider manages, deprovisioning a person through SCIM also stops the agents they answer for.
Prove what a run did
A receipt is every record of one run, taken from the hash-chained audit log, each with a proof that it is in the log, and a log head signed with Ed25519 and ML-DSA. Somebody holding only the receipt and your public keys can check it without access to your installation.
-
Write the receipt
quilzo agent receipt RUN -o receipt.json6 records of run run-20261008-f8cd3989, each with its proof, against a head of 52 signed by 0e667cb95d838091 -
Publish your public keys
The head's public keys are in
head.pub.json, beside the audit log in the store. Put them somewhere the people who will check your receipts can fetch them independently, such as your own website. -
Check it anywhere
quilzo agent verify-receipt receipt.json --keys head.pub.jsonverified 6 records of run run-20261008-f8cd3989 by returns-editor, steps [1 2 3 4] each is in the log under a head signed by 0e667cb95d838091Without
--keys, the receipt is checked against the keys it carries, which proves only that it agrees with itself. Checking against keys you were given proves it came from that log.
A receipt includes what the run was asked, what it did, what it was refused, what it cost, whether it finished, and the memory it recalled and kept. Refusals are part of the outcome: a run that tried to publish four times and was stopped is a different product from one that did the work, and somebody paying per outcome is entitled to know which they got.
The same kind of receipt exists for an app's calls through one connection (quilzo apps receipt) and for what was forgotten about a person (quilzo memory receipt).
Give another vendor's agent a credential
An agent built elsewhere, such as Claude Code, Codex or a team's own program, can use one of your browser grants with a signed credential in place of a person's token. The credential is a W3C Verifiable Credential, signed with your store's own issuer key, naming the agent, its sponsor, the one grant, whether it may act or only read, and the agent's own public key. Without that key, a copy of the credential is worthless.
Issue it
The agent must be declared here and have a sponsor who can still act. Give its public key as a
did:key, or let Quilzo make one and hand the key to the agent:quilzo agent credential issue buyer --grant browser:shop --act --holder did:key:z6Mk… --for 24hA credential lasts at most 30 days and never beyond the agent's next renewal.
Present it
The agent sends the credential as
Authorization: Bearer …to/mcp/browser/NAME, with anAgent-Proofheader on every request: a JWS signed by its key that names the method, the address, the time, a one-time identifier and the credential. Each proof is accepted once, within a minute.Check or withdraw it
quilzo agent credential list quilzo agent credential verify buyer.cred quilzo agent credential revoke urn:uuid:…The issuer's public keys are published at
/.well-known/agent-credentials.jsonon the admin, so anyone can check a credential with their own tools.
The agent acts within its sponsor's authority, on the one grant it carries. Everything it does is recorded under the agent's name on the sponsor's behalf, and a press that commits to something waits for a person, exactly as with a token.
Grant an agent a role
Because an agent is a principal, the access policy can bound it whoever starts it:
quilzo auth grant agent/returns-editor author --on /help
A run is then limited by three things at once: the declaration, the agent's own role, and the person who started it. See People and access.