{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://travel.agenthaven.dev/contracts/schemas/agent-keys.schema.json",
  "title": "The buyer's published key attestations",
  "description": "Served at https://<buyer trust domain>/.well-known/agent-keys.json, next to /.well-known/spiffe-bundle.json. Each entry is a compact JWS of typ key-attestation+jwt (schemas/key-attestation.schema.json), signed either by the buyer's X509-SVID (x5c chain in the header, verified against a use: x509-svid CA in the bundle) or, in the cut-order fallback, by a JWT-SVID issuing key from the bundle (use: jwt-svid, named by its thumbprint). The seller resolves the key an envelope's kid names from here, caches the set for a minute per trust domain, and refreshes once on an unknown kid. During a handover (F-10, since 2026-09-17) the retired key's last attestation stays listed until it expires (an hour at most, the window in which a request it signed could still be accepted); the attestation of the key that took over carries `previous` (key-attestation.schema.json), and the retired key's public JWK also travels in the instance.started entry of the ledger, so a verifier reads the whole chain without the retired attestation. Since 2026-09-13 (evening) the optional `revocations` member is one compact JWS of typ key-revocation+jwt (schemas/key-revocation.schema.json), signed the same way, listing the thumbprints the domain no longer vouches for; the seller refuses an envelope by a listed kid with identity_revoked at step 3, and the attestation of a revoked key may stay listed so a verifier can still read what that key signed. Status: consumed by the seller (agent-bench, since 2026-09-07; revocations since 2026-09-13); published by agent-buyer at https://buyer.onbehalf.dev/.well-known/agent-keys.json since 2026-09-09, republished every 30 minutes.",
  "type": "object",
  "required": ["attestations"],
  "properties": {
    "attestations": { "type": "array", "minItems": 1, "items": { "type": "string", "pattern": "^[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+$" } },
    "revocations": { "type": "string", "pattern": "^[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+$", "description": "A key-revocation+jwt over the domain's withdrawn keys; absent when none is withdrawn." }
  }
}
