Skip to main content
The ATB Pass Certificate is a verifiable credential issued by the Agent Trust Bench to agents that have demonstrated sound payment-decision behaviour against the live test corpus. The credential is JCS-canonical, signed with Falcon-1024 (post-quantum, FN-DSA / draft FIPS 206), and presented to participating x402 gateways via the X-ATB-Credential header for reputation-gated variable pricing.

Why it exists

The bench measures whether an agent refuses adversarial payment challenges. The credential lets that measurement travel. An agent that has passed ATB at the configured threshold can:
  • Receive discounted payment terms on participating x402 gateways
  • Be composed into composite_trust_query audit chains as an evidence source
  • Demonstrate compliance posture to upstream orchestrators without exposing session-level data
Concretely: a 20% discount on the x402 challenge amount is the default behaviour when an agent presents a valid passed=true certificate.

Recomputable, not faith-based

The ATB score is not an opaque, operator-maintained trust graph. It is a Falcon-1024-signed, JCS-canonical credential with a published score formula (see Score computation) and an expiry — recomputable from the bench events, presented by the agent (Phase 2: zero-knowledge), and used for variable pricing, never to block. Reputation here is a verifiable artifact, not a number you take on faith — the complement to the Compliance Gate’s stateless ALLOW/REFER/DENY admission. Together they keep both halves — the block and the reputation — signed and recomputable.

Two-phase rollout

Both phases are deployed. Phase 2 activates when the bench has ATB_ZKP_ENABLED=true; the gateway transparently handles both certificate versions.

Score computation

The score is derived from the agent’s session history in bench_events:
Where:
  • adv_challenged — number of adversarial profiles the agent was served
  • adv_refused — number of those it correctly refused (the primary signal)
  • adv_paid — number of those it incorrectly paid (penalty)
  • base_challenged / base_paid — baseline (honest) profile activity (small bonus for paying legitimate challenges)
A minimum of 10 adversarial challenges is required before a certificate will be issued. This prevents trivial cherry-picking of an easy subset.

Certificate format (Phase 1)

Signed payload

The payload is canonicalised per RFC 8785 (JCS) and signed with Falcon-1024 over the canonical bytes.

Wire encodings

The bench uses PQClean’s encoding for both the public key and the signature. PQClean prepends a 1-byte algorithm-ID header to the key; the signature is otherwise byte-identical across all conforming Falcon-1024 implementations. Public key (1793 bytes):
Signature (variable, typically ~1270 bytes, max 1280):
Cross-implementation matrix (validated 2026-06-01): The signature wire format itself is interoperable across all three. The only difference is the 1-byte public-key header that PQClean adds. Verifiers using non-PQClean libraries (BouncyCastle, liboqs without the PQClean compatibility layer) strip that byte before constructing their public key object. Phase 2 (Bulletproofs over Ristretto255) is not affected — that encoding is uniform across implementations. Canonical form verified across 8 implementations. The live (Phase 2) certificate’s JCS preimage canonicalizes byte-identically across eight independent implementations (Python, Node.js, Ruby, PHP, Go, Rust, Java, .NET) — the same conformance corpus discipline — so the exact bytes the Falcon-1024 signature covers are reproducible in your own stack. (Phase 1 carried a cleartext decimal score; Phase 2 replaces it with an integer threshold + a ZK commitment, which is what keeps the canonical form interoperable across all eight.)

Envelope (the actual header value)

The envelope is JSON-serialised and base64url-encoded for transport in a single HTTP header. Typical size: 2-3 KB.

How an agent obtains a certificate

The bench session cookie is hashed by the agent locally and the hash is sent to the bench. The raw cookie value is never transmitted in the certificate request.
Response (Phase 1, cleartext score):
Response (Phase 2, ZKP — score hidden):
The header_name field tells you which header to use — always read this field rather than hardcoding X-ATB-Credential. When the bench is running in Phase 2 mode, cert_version is "2", score is null (not disclosed), and the envelope contains a Pedersen commitment + Bulletproofs range proof instead of the raw score. If the agent has fewer than 10 adversarial challenges in its session, the endpoint returns 422 insufficient_data with guidance on how many more profiles to run.

How a gateway verifies a certificate

The bench’s public key is published at:
Response:
Verification steps:
  1. Decode the base64url envelope from the X-ATB-Credential header
  2. Check alg == "Falcon-1024" and kid matches the published bench key
  3. Verify the Falcon-1024 signature over rfc8785.dumps(payload)
  4. Check bench_issuer == "did:web:agent-trust-bench.algovoi.co.uk"
  5. Check expires_at is in the future
  6. If passed == true, apply the discount

Gateway integration (AlgoVoi reference implementation)

The AlgoVoi gateway applies the discount transparently in the x402 challenge construction. An agent presenting a valid passed=true cert receives a challenge with amount reduced by ATB_DISCOUNT_FACTOR (default 0.80, i.e. 20% off):
Cache: the gateway caches verified credentials by signature hash for up to 5 minutes (ATB_CREDENTIAL_CACHE_TTL_SECS) to avoid re-running Falcon-1024 verification on every request. Degradation: if the gateway is missing the bench public key, or the certificate is malformed, expired, forged, or below threshold, the discount path is silently skipped and the agent receives the full list price. There are no error responses for credential failures.

Multi-hub federation

The substrate is open: any organisation can operate an ATB Pass Certificate hub. The certificate’s bench_issuer field identifies the hub, and gateways resolve trust through one of three mechanisms (in precedence order):
  1. Pinned hubs (ATB_PINNED_HUBS_JSON) — operator inline override. Highest precedence.
  2. Allowlist (ATB_TRUSTED_HUBS) — gateway lists DIDs of hubs it trusts; auto-fetches their public keys from their /.well-known/atb-keys.json.
  3. Adopters Registry (ATB_REGISTRY_URL) — AlgoVoi maintains a Falcon-1024 signed registry of approved hubs. Gateways verify the registry against ATB_REGISTRY_ROOT_PK_B64 and trust every hub it lists.
If a gateway has no multi-hub config, it falls back to the legacy single-issuer path (ATB_BENCH_ISSUER_DID + ATB_BENCH_PK_B64). Phase 1 deployments work unchanged.

Registry doc shape

The registry root key is separate from any bench’s issuance key — it lives in cold storage and rotates annually. Bench-side keys rotate on a faster cycle (monthly or on incident).

Methodology versioning

Each cert carries a methodology_version (e.g. atb-v1.1). A hub being approved doesn’t auto-approve any methodology it might introduce — gateways opt in per-methodology. The current registry defines:
  • atb-v1.1 — current AlgoVoi reference methodology (179-profile adversarial set including the resource-bounds / substrate-guard family; formula in Score computation above, threshold 0.70, minimum 10 adversarial challenges)
  • atb-v1.0 — superseded but recognised (171-profile set; certs issued under it remain valid, the signing key is unchanged)
Future versions and third-party methodologies require an explicit spec page + registry update.

Tiers

Becoming a hub

See ATB Hub Conformance for the full specification and application process. Short version: implement the spec, pass the conformance vectors, submit an application issue, get listed in the next signed registry refresh. The substrate is Apache 2.0. Operating outside the registry is permitted; registry inclusion is a discovery + trust-by-default convenience, not a gatekeeping mechanism.

Phase 2 — zero-knowledge range proof ✅ Live

Phase 2 replaces the cleartext score with a Pedersen commitment and a Bulletproofs range proof. The Falcon-1024 envelope still wraps the credential; only what the verifier learns changes:
The verifier learns only that score ≥ threshold. The exact score, score components, and underlying behaviour distribution are hidden behind the Pedersen commitment. Phase 2 certificates are presented via X-ATB-ZK-Credential (a separate header from Phase 1’s X-ATB-Credential). The gateway processes both independently; if neither header triggers a discount, the full list price applies. Why Bulletproofs:
  • No trusted setup — no setup ceremony required, unlike Groth16/PLONK
  • Compact — 64-bit range proof on Ristretto255 is ~672–896 bytes
  • Battle-tested — production-grade dalek-cryptography Rust crate (used by Monero, Zcash)
The proof is generated and verified by atb-zkp-service, a small Rust microservice wrapping the bulletproofs crate. Python-native Bulletproofs libraries are not production-quality at the time of writing; the thin Rust service is the correct deployment pattern. Gateway verification flow for Phase 2:
  1. Decode the base64url envelope from the X-ATB-ZK-Credential header
  2. Check alg == "Falcon-1024", verify the Falcon-1024 signature over rfc8785.dumps(payload) (same as Phase 1)
  3. Check atb_cert_version == "2", bench_issuer, and expires_at
  4. Extract commitment_b64, proof_b64, threshold_milliunits from the payload
  5. Call POST /verify on the ZKP microservice — returns {"valid": true} or {"valid": false, "failure_reason": "..."}
  6. If valid == true, apply the ATB_DISCOUNT_FACTOR discount — no score needed
The Falcon-1024 step anchors the commitment to the trusted bench issuer. The ZKP step proves the committed value is ≥ threshold. Neither alone is sufficient.

Composition with composite_trust_query

An ATB certificate can be presented to a composite trust query alongside compliance and settlement receipts. It maps to a synthetic receipt format:
For Phase 2 certs, atb_score is omitted and replaced with atb_zkp_verified: true — the verifier has already confirmed the range proof, so the trust oracle can trust the claim without seeing the score. See composite_trust_query for the full multi-source aggregation flow.

A2A trust.signals[] discovery

The ATB Pass Certificate is declared as a provider-neutral behavioral_attestation trust signal in the A2A trust.signals[] spec. A machine-readable descriptor is published at:
Response:
The evidence_type: signed_behavioral_credential is the provider-neutral shape accepted by the A2A trust.signals[] specification. ATB specifics (issuer DID, ZKP scheme, credential header) resolve behind did:web:agent-trust-bench.algovoi.co.uk for consumers that want them. The credential_header field reflects the bench’s active certificate version — X-ATB-ZK-Credential when Phase 2 (ZKP) is enabled, X-ATB-Credential otherwise. Gateways should read this field rather than hardcoding either header name.

IETF anchor

The certificate format and gateway processing rules are specified in a forthcoming Internet-Draft:
  • draft-hopley-x402-atb-reputation-credential-00
This draft references draft-hopley-x402-canonicalisation-jcs-v1 for the canonicalisation discipline and composes upstream of draft-hopley-x402-composite-trust-query as an evidence-source primitive.

Security and privacy considerations

What the gateway learns from Phase 1:
  • The exact score (0.0 to 1.0)
  • Number of adversarial challenges, refusals, and payments
  • The agent’s agent_id_hash (double-hash of a session cookie — not linkable to identity without the cookie)
  • Which profile-set version was used (profile_set_hash)
What the gateway learns from Phase 2:
  • That score ≥ threshold. Nothing more.
  • Same agent_id_hash and profile_set_hash.
What neither version reveals:
  • The raw session cookie value (the bench stores only hashes)
  • IP address or User-Agent (bench stores only hashes)
  • Exact sequence of profiles encountered
Replay across verifiers: A certificate is currently bearer-style — any party with the envelope can present it. To prevent cross-verifier replay, a future revision will bind the credential to an audience field and require a verifier nonce. This is deferred to v2.1. Falcon-1024 choice: Falcon was selected over ML-DSA-65 for compactness (~1280 bytes signature vs ~3309 bytes). The Gaussian-sampler side-channel concern applies to software implementations on adversary-co-located hardware; the bench signing context (isolated VM, no shared tenancy) is materially different.

Reference implementation

The bench-side issuer, gateway-side verifier, Falcon-1024 wrapper, and JCS canonicalisation modules are all AlgoVoi-authored under Apache 2.0. Source code is made available to approved hub operators and acquisition counterparties via NDA; the substrate format and canonicalisation discipline are specified normatively in this document and the linked IETF I-D. The substrate-author position lives in the JCS canonicalisation discipline and the IETF-anchored credential format. Anyone implementing the spec from this page can build a conformant verifier or hub; see the hub conformance spec for the path.

Operational status

Both Phase 1 and Phase 2 are deployed and live on the AlgoVoi reference bench and gateway. With all flags disabled, the system behaves exactly as before the credential layer was added — no impact on existing payment flows.