Agent attestations
An attestation is one signed document in which an independent party says it checked a version of an agent against the Managed Agent Framework and gives the result for each of its eleven areas. It is the third document about an agent, beside the two this site already describes.
| Document | Who speaks | What it holds |
|---|---|---|
| The Descriptor | The operator | What the agent does, refuses and needs. Said, never checked. |
| An attestation | An attester | What an independent party checked about one version, area by area, and on what evidence. |
| The AgentDoc | Nobody; it is assembled | Each claim beside what was checked, by whom and when. |
The Descriptor's own rule stays: evidence never enters it. An attestation sits beside it, and the AgentDoc carries it under standing, attributed and never audited.
1. Said and checked
Two parties are always named apart. The attester checks and signs. The evidence producers made what was checked: whoever holds each lifecycle role (the test writer, the code critic, the security reviewer, the conformance checker, the watcher), the network that carries the agent's traffic, and the framework the agent runs on. An agent is managed only when someone who did not build it can check it, so a reader must be able to see who did what.
Anyone can be an attester, and anyone can produce evidence. Nothing here depends on which network, platform or vendor is involved.
The strength of an attestation is the distance between the attester and the evidence producers. An attestation whose attester also ran the lifecycle and carries the traffic is still worth having, because the records are signed and a reader can check them, but it is closer to the operator's side of the line than one from a party that only read the evidence. The attestation names every producer, so that distance is visible, and the AgentDoc shows it beside each area rather than a bare tick.
2. The document
It follows the shape of SLSA's Verification Summary Attestation, which the container world already uses to say "a verifier checked this artifact against this policy". It is an in-toto Statement v1 in a DSSE envelope, signed by the attester, so existing tools can store and verify it.
It replaces nothing. The build record, the deployment record and the conformance verdict stay where they are and keep their own signatures. The attestation is a summary over them, the way a verification summary sits over provenance: it names each record by digest and says what the attester concluded from the set. A reader who wants the detail follows the digests.
In this example, the attester had evidence for six of the eleven areas.
{
"_type": "https://in-toto.io/Statement/v1",
"subject": [
{ "name": "invoice-checker.acme@example.com", "digest": { "sha256": "9f2c..." } }
],
"predicateType": "https://commonagent.net/attestation/v0.1",
"predicate": {
"attester": { "name": "Example Assurance", "id": "attester@assurance.example" },
"checked_at": "2026-11-02T17:05:00-07:00",
"expires_at": "2027-01-31T17:05:00-07:00",
"policy": { "uri": "https://commonagent.net/attestation/checks-0.2.json", "version": "0.2.0" },
"areas": {
"identity": { "result": "passed", "checks": { "unique-name": "passed", "bound-to-key": "passed", "named-owner": "passed", "acts-for": { "result": "passed", "covers": { "from": "2026-10-03", "to": "2026-11-02" } }, "exact-version": "passed" } },
"authority": { "result": "not_attested" },
"spend": { "result": "failed", "checks": { "ceilings": "failed" } },
"reach": { "result": "passed", "checks": { "declared-systems": "passed", "network-fence": "passed", "boundary-screened": { "result": "passed", "covers": { "from": "2026-10-03", "to": "2026-11-02" } }, "own-secrets": "passed", "data-kept": "passed" } },
"provenance": { "result": "passed", "checks": { "built-in-stages": "passed", "reviewed": "passed", "signed-build": "passed", "runs-as-approved": "passed", "conforms": "passed" } },
"inside": { "result": "not_attested" },
"people": { "result": "not_attested" },
"records": { "result": "not_attested" },
"watching": { "result": "passed", "checks": { "working-now": "passed", "alerts-with-owner": "passed" } },
"stopping": { "result": "not_attested" },
"change": { "result": "passed", "checks": { "versioned": "passed", "impact-on-others": "passed", "approved-with-reason": "passed" } }
},
"evidence": [
{ "what": "signed build record", "digest": "77e0...", "producer": "the package maker" },
{ "what": "conformance verdict", "digest": "3b9a...", "producer": "the conformance checker" },
{ "what": "security findings (SARIF)", "digest": "41ab...", "producer": "the security reviewer" },
{ "what": "deployment record", "digest": "5d10...", "producer": "the deployment manager" }
],
"words": "Identity, Reach, Provenance, Watching and Change passed. Spend failed: no ceiling per period is set. Five areas were not attested."
}
}
| Member | Holds |
|---|---|
subject | The agent's name and the digest of the version checked: its package, or its image for a container agent. |
attester | Who checked. Their key signs the envelope. |
checked_at, expires_at | When it was checked, and when it goes stale at the latest. |
policy | The published list of checks it was held to, by address and version, so what "passed" meant cannot change afterwards. |
areas | The eleven areas, each passed, failed or not_attested, with the result of each check inside it. An area passes only when every check in it passed. A check is not attested when the attester had no evidence for it. |
covers | On a check about conduct over time, the period the evidence spans, as from and to dates. A check about the artifact itself (a signed build, an exact version) is a point in time and carries none. The policy says which checks are which. |
evidence | Each record relied on, by digest, with who produced it. |
words | One plain sentence a person can read. |
3. The envelope
The statement travels in a DSSE envelope: payloadType is application/vnd.in-toto+json, payload is the statement's bytes in base64, and each entry in signatures carries the attester's key id and an ed25519 signature over DSSE's pre-authentication encoding of the payload type and the payload. An envelope is cited by the digest of its canonical form.
4. The rules
- One document per version per attester. A new version of the agent needs a new attestation. Several attesters may attest the same version.
- Not attested is not failed. An attester reports what its evidence covers and says not attested for the rest. A reader sees the gap.
- It goes stale on its own. An attestation is stale once its digest is no longer the version running, or at its expiry, 90 days by default.
- A point in time, or a period. A check about the artifact (a signed build, an exact version) is true or false at
checked_at. A check about conduct (every request named who asked, the stop held) is true only of a period, and the check says which one incovers. An attester that read 30 days of records says so; one that read a year says that. A reader never has to guess what "passed" spanned. - Self-attested is said. An operator may attest its own agent, but a reader treats that as a claim, not a check.
- Readers choose whom to trust. A reader's policy names the attesters it accepts, and a deploy or a network can refuse an agent that lacks a passing attestation from one of them.
5. The checks
The policy is the file an attestation names: attestation/checks-0.2.json. It lists every attribute of the Managed Agent Framework, 60 checks in 11 areas, each with when it passes and where its evidence comes from. That file is the normative list; the framework's article describes the same attributes in prose and points here, so there is one spelling of each check.
Version 0.2.0 added boundary-screened, under Reach. Version 0.1.0, with 59 checks, stays published at attestation/checks-0.1.json, because attestations already issued name it.
Where the file says the evidence comes from "the network", only the party that carries the agent's traffic sees it. Where it names a role, such as the code critic or the watcher, it names the kind of party that produced the evidence, using the open role names at agentroles.ai. A team that did not use that lifecycle still has a reviewer and a monitoring tool, and their records count the same way.
A check marked over time is about conduct across a period, not a single moment. Its result says which period the evidence covers. There are 23 of them.
Identity: who it is, and who answers for it
| Check | Passes when | Evidence from |
|---|---|---|
unique-name | The name is bound to this agent and was never held by another. | the registrar |
bound-to-key | The registered descriptor is signed by the agent's own key. | the registration |
named-owner | A person or organization is named as answering for it. | the deployment record |
acts-for over time | Every request it made traced back to the person it acted for. | the network |
exact-version | The running digest equals the digest in the signed build record. | the build and deployment records |
Authority: what it may do, and for whom
| Check | Passes when | Evidence from |
|---|---|---|
declared-offerings | What it does and refuses is written down and signed. | the registration |
mandates over time | Each piece of work carried a signed statement of what it may do and for whom. | the network |
delegation-narrows over time | No authority it passed on was larger than what it held. | the network |
access-while-working | Its rights are held per task, expire and can be revoked. | the identity provider |
enforced-outside | Something other than the agent decides what it may do. | the network, or the deployment record |
Spend: what it may cost
| Check | Passes when | Evidence from |
|---|---|---|
ceilings | A limit per task and per period, set by the owner, was in place before it started. | the deployment record |
who-pays over time | Every cost landed on a named account. | the network, or the billing records |
cost-per-job over time | Every spend traces to a job, and the total reconciles. | the watcher's cost records |
over-limit-refused over time | Work that would pass a ceiling was stopped before it spent. | the network, or a conformance case |
Reach: what it can touch
| Check | Passes when | Evidence from |
|---|---|---|
declared-systems | Every system it uses is named, and the package's runtime requirements match. | the architecture record and the package |
network-fence | It can reach only those systems. | the network, or the deployment record |
boundary-screened over time | Every message it sent to or received from another organization's agents was screened before delivery. | the network |
own-secrets | Its credentials are its own, placed by name, shared with nobody. | the deployment record |
data-kept | What it stores, where and for how long is stated. | the operator's data-use declaration |
Provenance: how it was made
| Check | Passes when | Evidence from |
|---|---|---|
built-in-stages | The statement of the job, the tests and the code were made in that order, and the tests failed before the code existed. | the spec writer's, test writer's and code writer's records |
reviewed | Review and security review were held by someone other than the code's author, with every finding answered. | the code critic and security reviewer (records or SARIF) |
signed-build | The build record is signed, verifies, and matches the package. | the package maker |
runs-as-approved | What runs is exactly what was approved and released. | the network, or the deployment record |
conforms | A signed verdict says it does what it declared and nothing it refused. | the conformance checker |
bill-of-materials | Every library, model and outside tool is listed with its version. | CycloneDX or SPDX |
trusted-sources | Every dependency is pinned and verified by checksum or signature. | the bill of materials, or SLSA provenance |
known-flaws over time | A scan found no unanswered critical vulnerabilities, within the last 30 days. | a vulnerability scan, and VEX for answered findings |
model-and-prompts-pinned | The model is named, and the prompts are inside the package the digest covers. | the descriptor and the package |
reproducible | Two independent builds give the same digest. | two SLSA provenance records |
Inside the agent: how it behaves while it works
| Check | Passes when | Evidence from |
|---|---|---|
no-endless-loops | It stops when it repeats itself or stops making progress. | the agent's framework |
model-routing | Each step goes to a model chosen for it. | the agent's framework |
personal-data-guarded over time | Personal data is masked or kept out of prompts, replies and logs. | the agent's framework, or an eval |
injected-instructions-ignored | Instructions hidden in what it reads are treated as content. | an eval or red-team run, graded by the agent critic |
tool-calls-checked | Each tool call is checked against what the tool accepts. | the agent's framework |
replies-checked | A reply is checked against its promised form before it leaves. | the agent's framework |
time-limits | Slow calls give up after a set time and retry within a limit. | the agent's framework |
step-tracing over time | Every step, model call and tool call is traced with timing, tokens and cost. | OpenTelemetry GenAI traces |
People in the loop: when a person decides
| Check | Passes when | Evidence from |
|---|---|---|
approval-thresholds | Which acts need a person is set in advance by risk, and those acts escalate. | the spec writer's record and the conformance checker |
owners-ok over time | Anything that committed the owner or moved money waited for the owner. | the network |
enough-context | The person deciding sees what the agent wants to do and why. | the operator's statement |
decision-kept over time | Every yes and no is recorded with who gave it. | the network |
Records: what it has done
| Check | Passes when | Evidence from |
|---|---|---|
who-asked over time | Every piece of work names who asked and for whom. | the network |
what-it-did over time | Each act is recorded with its inputs and result, and no promised record is missing. | the network and the conformance checker |
errors-kept over time | Failures are recorded, not dropped. | the network |
immutable-evidence | Records are only added to, and each is signed. | the network |
readable-by-others over time | Someone outside the team could read the evidence; the attester did. | the attester itself |
Watching: whether it is working
| Check | Passes when | Evidence from |
|---|---|---|
working-now over time | There is a current answer to whether it is working, or an open alert. | the watcher |
alerts-with-owner over time | A named person is told within a stated time when it fails. | the watcher |
quality-over-time over time | Its answers are graded against a standard set beforehand. | the agent critic |
incidents over time | Every alert that fired has a written timeline. | the incident recorder |
Stopping: who can halt it
| Check | Passes when | Evidence from |
|---|---|---|
pause over time | A named person can pause it, and it resumes only when they say. | the network |
end | A named person can end it for good. | the network |
credentials-revoked over time | A stop revokes its credentials at once. | the network |
stop-holds over time | Every door checks the stop, so a stopped agent stays stopped. | the network |
name-never-reused | An ended agent's name is never given to another. | the registrar |
Change: how it changes, and how it ends
| Check | Passes when | Evidence from |
|---|---|---|
versioned | Every release has a version, and earlier ones stay on record. | the package maker |
impact-on-others | Every dependent was named and answered before the change. | the impact analyst |
approved-with-reason | The change has a reason and an approver. | the deployment manager's update record |
rollback-on-purpose | Any rollback was a recorded step, with what could not be undone. | the deployment manager |
retired-cleanly | When ended, its key was retired, its data handled as stated and its dependents told. | the deployment manager |
6. How it is read
An AgentDoc carries each attestation on file about an agent under standing: the attester, the version it is about, each area's result, the evidence it relied on, and whether it still stands. A reader's policy names the attesters it accepts and which areas must pass, and applies that at the moment it matters: before a deploy, before a network admits an agent, or when a catalog shows the agent to a stranger.
7. From attestations to a rating
A reader who cannot go through every area can still get one answer. Agent Rating works out a grade from AAA to D for each version of an agent from its current attestations: which areas passed, who signed each one, and how long the evidence of its conduct covers. The method is published, so the same attestations always give the same grade, and a grade falls the day an attestation it rests on expires or is withdrawn.
The grade is a summary and never replaces the attestations. An AgentDoc that shows a grade also shows the area-by-area results and the attestations behind them.
8. Open questions
- Where are attestations kept so a reader can find them: at the agent's registry, with the attester, or both?
- Is 90 days the right default life for an attestation when the version doesn't change?
- Should the policy's version move with the Managed Agent Framework's, so that a new attribute means a new policy?
- Should the document carry a computed independence figure, such as the share of evidence produced by parties other than the attester, or is naming the producers enough?
v0.1 draft (2026-11-02): the first draft. The shape follows SLSA's verification summary on purpose, so that nothing here needs a verifier the container world does not already have.