Agent attestations

Draft · predicate commonagent.net/attestation/v0.1 · 2026-11-02 · signed by an attester · one per version

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.

DocumentWho speaksWhat it holds
The DescriptorThe operatorWhat the agent does, refuses and needs. Said, never checked.
An attestationAn attesterWhat an independent party checked about one version, area by area, and on what evidence.
The AgentDocNobody; it is assembledEach 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."
  }
}
MemberHolds
subjectThe agent's name and the digest of the version checked: its package, or its image for a container agent.
attesterWho checked. Their key signs the envelope.
checked_at, expires_atWhen it was checked, and when it goes stale at the latest.
policyThe published list of checks it was held to, by address and version, so what "passed" meant cannot change afterwards.
areasThe 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.
coversOn 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.
evidenceEach record relied on, by digest, with who produced it.
wordsOne 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

  1. One document per version per attester. A new version of the agent needs a new attestation. Several attesters may attest the same version.
  2. Not attested is not failed. An attester reports what its evidence covers and says not attested for the rest. A reader sees the gap.
  3. 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.
  4. 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 in covers. 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.
  5. Self-attested is said. An operator may attest its own agent, but a reader treats that as a claim, not a check.
  6. 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

CheckPasses whenEvidence from
unique-nameThe name is bound to this agent and was never held by another.the registrar
bound-to-keyThe registered descriptor is signed by the agent's own key.the registration
named-ownerA person or organization is named as answering for it.the deployment record
acts-for over timeEvery request it made traced back to the person it acted for.the network
exact-versionThe running digest equals the digest in the signed build record.the build and deployment records

Authority: what it may do, and for whom

CheckPasses whenEvidence from
declared-offeringsWhat it does and refuses is written down and signed.the registration
mandates over timeEach piece of work carried a signed statement of what it may do and for whom.the network
delegation-narrows over timeNo authority it passed on was larger than what it held.the network
access-while-workingIts rights are held per task, expire and can be revoked.the identity provider
enforced-outsideSomething other than the agent decides what it may do.the network, or the deployment record

Spend: what it may cost

CheckPasses whenEvidence from
ceilingsA limit per task and per period, set by the owner, was in place before it started.the deployment record
who-pays over timeEvery cost landed on a named account.the network, or the billing records
cost-per-job over timeEvery spend traces to a job, and the total reconciles.the watcher's cost records
over-limit-refused over timeWork that would pass a ceiling was stopped before it spent.the network, or a conformance case

Reach: what it can touch

CheckPasses whenEvidence from
declared-systemsEvery system it uses is named, and the package's runtime requirements match.the architecture record and the package
network-fenceIt can reach only those systems.the network, or the deployment record
boundary-screened over timeEvery message it sent to or received from another organization's agents was screened before delivery.the network
own-secretsIts credentials are its own, placed by name, shared with nobody.the deployment record
data-keptWhat it stores, where and for how long is stated.the operator's data-use declaration

Provenance: how it was made

CheckPasses whenEvidence from
built-in-stagesThe 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
reviewedReview 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-buildThe build record is signed, verifies, and matches the package.the package maker
runs-as-approvedWhat runs is exactly what was approved and released.the network, or the deployment record
conformsA signed verdict says it does what it declared and nothing it refused.the conformance checker
bill-of-materialsEvery library, model and outside tool is listed with its version.CycloneDX or SPDX
trusted-sourcesEvery dependency is pinned and verified by checksum or signature.the bill of materials, or SLSA provenance
known-flaws over timeA scan found no unanswered critical vulnerabilities, within the last 30 days.a vulnerability scan, and VEX for answered findings
model-and-prompts-pinnedThe model is named, and the prompts are inside the package the digest covers.the descriptor and the package
reproducibleTwo independent builds give the same digest.two SLSA provenance records

Inside the agent: how it behaves while it works

CheckPasses whenEvidence from
no-endless-loopsIt stops when it repeats itself or stops making progress.the agent's framework
model-routingEach step goes to a model chosen for it.the agent's framework
personal-data-guarded over timePersonal data is masked or kept out of prompts, replies and logs.the agent's framework, or an eval
injected-instructions-ignoredInstructions hidden in what it reads are treated as content.an eval or red-team run, graded by the agent critic
tool-calls-checkedEach tool call is checked against what the tool accepts.the agent's framework
replies-checkedA reply is checked against its promised form before it leaves.the agent's framework
time-limitsSlow calls give up after a set time and retry within a limit.the agent's framework
step-tracing over timeEvery step, model call and tool call is traced with timing, tokens and cost.OpenTelemetry GenAI traces

People in the loop: when a person decides

CheckPasses whenEvidence from
approval-thresholdsWhich 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 timeAnything that committed the owner or moved money waited for the owner.the network
enough-contextThe person deciding sees what the agent wants to do and why.the operator's statement
decision-kept over timeEvery yes and no is recorded with who gave it.the network

Records: what it has done

CheckPasses whenEvidence from
who-asked over timeEvery piece of work names who asked and for whom.the network
what-it-did over timeEach act is recorded with its inputs and result, and no promised record is missing.the network and the conformance checker
errors-kept over timeFailures are recorded, not dropped.the network
immutable-evidenceRecords are only added to, and each is signed.the network
readable-by-others over timeSomeone outside the team could read the evidence; the attester did.the attester itself

Watching: whether it is working

CheckPasses whenEvidence from
working-now over timeThere is a current answer to whether it is working, or an open alert.the watcher
alerts-with-owner over timeA named person is told within a stated time when it fails.the watcher
quality-over-time over timeIts answers are graded against a standard set beforehand.the agent critic
incidents over timeEvery alert that fired has a written timeline.the incident recorder

Stopping: who can halt it

CheckPasses whenEvidence from
pause over timeA named person can pause it, and it resumes only when they say.the network
endA named person can end it for good.the network
credentials-revoked over timeA stop revokes its credentials at once.the network
stop-holds over timeEvery door checks the stop, so a stopped agent stays stopped.the network
name-never-reusedAn ended agent's name is never given to another.the registrar

Change: how it changes, and how it ends

CheckPasses whenEvidence from
versionedEvery release has a version, and earlier ones stay on record.the package maker
impact-on-othersEvery dependent was named and answered before the change.the impact analyst
approved-with-reasonThe change has a reason and an approver.the deployment manager's update record
rollback-on-purposeAny rollback was a recorded step, with what could not be undone.the deployment manager
retired-cleanlyWhen 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

  1. Where are attestations kept so a reader can find them: at the agent's registry, with the attester, or both?
  2. Is 90 days the right default life for an attestation when the version doesn't change?
  3. Should the policy's version move with the Managed Agent Framework's, so that a new attribute means a new policy?
  4. 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.

Back to the overview