Skip to main content
An IntegrityCertificate is a machine-readable cryptographic document that bundles all verification evidence for a single integrity checkpoint. It is modeled on C2PA content credentials and W3C Verifiable Credentials, adapted for AI agent integrity attestation. Certificates are self-describing: they contain the verdict, the cryptographic proofs, and the URLs needed to verify them. Any party can independently verify a certificate without trusting the Mnemom API.

Certificate schema

An IntegrityCertificate has four top-level sections: subject, claims, input_commitments, and proofs.

Envelope fields

Subject

Identifies the integrity checkpoint this certificate attests to.

Claims

The analysis verdict and supporting evidence.

Input commitments

Cryptographic commitments to the inputs used for analysis. These enable verification that the analysis was performed over the claimed inputs without revealing the inputs themselves.

Proofs

Cryptographic evidence supporting the claims. Contains four proof types.

proofs.signature

Ed25519 digital signature over the signed payload.

proofs.chain

Hash chain linking this checkpoint to its predecessor in the session.

proofs.merkle

Merkle tree inclusion proof. May be null if the checkpoint has not yet been added to the agent’s Merkle tree.

proofs.verdict_derivation

Zero-knowledge proof of correct verdict derivation. May be null if no ZK proof has been generated. See Verifiable Verdicts for details.

Verification URLs

Self-contained links for independent verification.

Signed payload format

The signed_payload field contains the exact JSON string that the Ed25519 signature covers. It is constructed with deterministic key ordering (alphabetically sorted) to ensure the same payload produces the same bytes regardless of property insertion order. The signed payload includes these fields, sorted alphabetically:
The JSON is produced using JSON.stringify(payload, Object.keys(payload).sort()), which ensures keys appear in lexicographic order. This exact string (UTF-8 encoded) is the message passed to Ed25519.sign().

Input commitment computation

The combined_commitment is computed as follows:
  1. Each input field is serialized to JSON with recursively sorted keys (deterministic stringify).
  2. The serialized fields are concatenated with a pipe (|) separator in this order:
    • Card (full Alignment Card object)
    • Conscience values array
    • Window context array
    • Model version string
    • Prompt template version string
  3. The concatenated string is UTF-8 encoded and hashed with SHA-256.
  4. The result is the hex-encoded hash.
This commitment proves the analysis was performed over specific inputs without revealing the inputs. A verifier who has the original inputs can recompute the commitment and compare.

Verification instructions

Any party can verify an IntegrityCertificate using the following five steps. Steps 1-4 can be performed offline with the certificate and the public key. Step 5 requires a network call to the prover service.

Step 1: Fetch the public key

Retrieve the signing key referenced by proofs.signature.key_id:
Find the key entry matching key_id. The public_key field is the hex-encoded Ed25519 public key.
Public keys can be cached. They rotate infrequently, and the is_active field indicates whether a key is currently in use for new signatures.

Step 2: Verify the Ed25519 signature

Verify proofs.signature.value (base64-encoded) against proofs.signature.signed_payload (UTF-8 string) using the public key from Step 1.
If the signature is invalid, the certificate has been tampered with. Reject it.

Step 3: Recompute and verify the chain hash

Recompute the chain hash from the certificate fields and compare to proofs.chain.chain_hash:
If expected !== proofs.chain.chain_hash, the chain link has been altered.

Step 4: Walk the Merkle inclusion proof

If proofs.merkle is present, verify that the checkpoint is included in the agent’s Merkle tree:
  1. Start with current = proofs.merkle.leaf_hash.
  2. For each sibling in proofs.merkle.inclusion_proof:
    • If position === "left": current = SHA-256(sibling.hash + current)
    • If position === "right": current = SHA-256(current + sibling.hash)
  3. Compare current to proofs.merkle.root.
If they match, the checkpoint is included in the tree. Cross-reference the root against the agent’s published Merkle root via GET /v1/agents/{agent_id}/merkle-root.

Step 5: Verify the STARK proof (optional)

If proofs.verdict_derivation is present, the verdict was proven via an SP1 STARK proof. Verification can be performed:
  • Via the API: Submit the certificate to POST /v1/verify. The API will delegate STARK verification to the prover service.
  • Locally: Use the SP1 verifier with the image_id and receipt from the certificate. See Verifiable Verdicts for details.

Example certificate


Design influences

The IntegrityCertificate format draws from two established standards:
  • C2PA Content Credentials: The concept of a self-describing, machine-readable credential that bundles claims with cryptographic evidence. C2PA uses this pattern for media provenance; AIP adapts it for AI agent integrity.
  • W3C Verifiable Credentials: The subject/claims/proofs structure and the @context namespace pattern. The certificate acts as a verifiable credential where the issuer is the Mnemom analysis service and the subject is the integrity checkpoint.
Key differences from these standards: AIP certificates use Ed25519 instead of JWS/JWT, include hash chain and Merkle proofs for ordering and completeness guarantees, and support optional zero-knowledge proofs for computational integrity.

See also