Skip to content
↑↓ to move · Enter to openEsc to close
Glossary · Cryptography

ManifestProof: how an operator signs for its AI agent

Updated

The manifest says what the operator declares. The ManifestProof makes that declaration tamper-evident: the operator signs a small payload naming the agent, the manifest version and the manifest's digest.

It is one of the two signed objects in AgenID v1.1.1. The other is the verification assertion, signed by an authority. Keeping them separate stops one key role from speaking for the other.

Definition

A ManifestProof is the operator-signed object that binds an AgenID identifier to one version of its manifest by SHA-256 digest. It is signed with an operator-role Ed25519 key and can only ever produce the DECLARED claim state.

Also known as: manifest self-declaration proof

How it works in AgenID

The payload carries $schema, proof_type (always manifest_self_declaration), agent_id, manifest_version, manifest_digest, key_id, created_at and expires_at. The signing input is the RFC 8785 canonical bytes of that payload without signature, $schema included, signed with pure Ed25519 and carried as base64url.

A verifier recomputes the manifest digest first, then resolves key_id, requires role operator with controller equal to the agent, checks the time window, and only then checks the signature.

Why it matters

Because anyone can verify the proof, the registry that stores it cannot alter it unnoticed. Registration at /issue rejects a tampered manifest, a wrong key, an authority-role key and a replay before anything is stored.

The time window matters too. expires_at is checked independently of the key's status, so an old proof cannot be presented indefinitely, and the registry bounds how far into the future a new proof's created_at may sit. Everything is re-derivable from the signed object, the manifest and the key document, so a verifier needs nothing from AgenID's database.

What it does not mean

A valid ManifestProof shows who signed and what they declared. It does not make any statement true, and it cannot produce VERIFIED; that needs an authority. Nor does it say what the agent is allowed to do: AUTHORIZED has no signed object in v1.1.1.

Frequently asked questions

Who can create a ManifestProof?

Only the holder of the operator private key. AgenID never holds it; the key is generated in your browser or with the CLI.

What happens when a proof expires?

Verification fails outside the created_at to expires_at window. Re-attestation issues a new proof rather than changing the old one.

Can I check a proof myself?

Yes. Resolve the agent at /verify and re-run the checks offline against the envelope, as the verification guide describes.

What agenid.com issues today

The reference deployment at agenid.com issues DECLARED and L1_REGISTERED only. L2_DOMAIN_VERIFIED and higher require a VerificationAssertion signed by a root authority key, and that key has not been created yet. L5 is reserved by the specification and is not issuable at all.

Identity is not permission

Which agent is acting and who declared it is one question. What that agent is allowed to do is another, and it stays with the party on the other side and with the operator. Protocol v1.1.1 defines no signed authorization object.

Sources

  1. AgenID protocol specification (public repository)

Give your agent an identity

Register an agent in the browser — the signing key is generated on your device and never sent to AgenID — or resolve an existing AgenID and re-check its signature yourself.