(agent_id, content_hash, version, composed_at, card_kind). Any consumer holding the public key from <api>/v1/.well-known/jwks.json can verify it offline, without ever holding a Mnemom credential.
The attestation is the cryptographic glue between three Phase 5 surfaces:
- The A2A AgentCard export attaches a fresh attestation as an extension on every public read.
- The transparency log stores the attestation alongside the canonical identity for durable historic verification.
- The
mnemom verify-cardCLI consumes the JWKS + log to verify offline.
Wire format
JWS Compact Serialization (RFC 7515):| Section | Shape |
|---|---|
| Header | { "alg": "EdDSA", "kid": "<key_id>", "typ": "AAP-Attestation/v1" } |
| Payload | See the schema — iss, sub, iat, exp, content_hash, version, composed_at, card_kind, optional smolt_id, optional historic_backfill |
| Signature | Ed25519 over <base64url(header)>.<base64url(payload)> |
What it commits to
The payload binds the identity. A change to any of these fields produces a different attestation:| Claim | Source |
|---|---|
content_hash | canonical_*_cards.content_hash |
version | canonical_*_cards.version |
composed_at | canonical_*_cards._composition.composed_at |
card_kind | alignment or protection |
sub | agents.agent_id |
/v1/agents/{id}/a2a-agent-card or GET /v1/agents/{id}/state) and check the body’s content_hash matches the attestation’s content_hash.
Verification
The full verification flow (mnemom verify-card executes this for you):
- Fetch
<iss>/v1/.well-known/jwks.json. - Locate the key with
kidmatching the token’s header. - Verify the Ed25519 signature.
- Check
issmatches the expected issuer (https://mnemom.aifor production). - Check
now() < exp(the verifier may apply a small clock-skew grace; default 60 seconds). - Check the canonical card body’s
content_hashmatches the attestation’scontent_hash.
mnemom-api/src/attestation/verifier.ts and the CLI verifier at mnemom-platform/cli/src/commands/verify-card.ts.
Key rotation + JWKS lifetime
The JWKS includes the active key plus recently-retired keys still inside their verification window. Once the retirement window plus the token-TTL plus a small grace has elapsed, the retired key drops out of the JWKS.| Window | Default | Configurable via |
|---|---|---|
| Token TTL | 1 hour | AAP_ATTESTATION_TTL_SECONDS |
| Retirement grace | 25 hours | AAP_ATTESTATION_RETIREMENT_WINDOW_SECONDS |
retired_at timestamp, and the current public keys are always discoverable from the published JWKS. (To rotate your own agent’s API key — a different operation — see Agent key rotation.)
Relationship to the transparency log
Tokens are short-lived (1-hour TTL by default). The durable record is the transparency log: every canonical card identity ever composed has a row incard_attestations with the full signed token + a Merkle inclusion proof. Beyond the token’s expiry, consumers query the log — not the token.
See also
- Schema reference — canonical wire format
mnemom verify-card— operator CLI for offline verification- Transparency log — durable record beyond the TTL window
- A2A AgentCard export — where the attestation surfaces on the public discovery API