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_queryaudit chains as an evidence source - Demonstrate compliance posture to upstream orchestrators without exposing session-level data
passed=true certificate.
Two-phase rollout
| Phase | Mechanism | What the verifier learns |
|---|---|---|
| Phase 1 | Falcon-1024 signed certificate carrying score + components | Score (e.g. 0.87), refusal count, payment count |
| Phase 2 ✅ Live | Same Falcon-1024 envelope, score replaced by Pedersen commitment + Bulletproofs range proof | Only that score ≥ threshold; nothing more |
ATB_ZKP_ENABLED=true; the gateway transparently handles both certificate versions.
Score computation
The score is derived from the agent’s session history inbench_events:
adv_challenged— number of adversarial profiles the agent was servedadv_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)
Certificate format (Phase 1)
Signed payload
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):| Verifier library | PK adapter | Sig adapter | Result |
|---|---|---|---|
Python pqcrypto (PQClean) | none | none | ✓ verifies |
Rust pqcrypto-falcon (PQClean) | none | none | ✓ verifies |
| Java BouncyCastle 1.78+ | strip leading 0x0a → use 1792 bytes | none | ✓ verifies |
Envelope (the actual header value)
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.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:- Decode the base64url envelope from the
X-ATB-Credentialheader - Check
alg == "Falcon-1024"andkidmatches the published bench key - Verify the Falcon-1024 signature over
rfc8785.dumps(payload) - Check
bench_issuer == "did:web:agent-trust-bench.algovoi.co.uk" - Check
expires_atis in the future - 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 validpassed=true cert receives a challenge with amount reduced by ATB_DISCOUNT_FACTOR (default 0.80, i.e. 20% off):
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’sbench_issuer field identifies the hub, and gateways resolve trust through one of three mechanisms (in precedence order):
- Pinned hubs (
ATB_PINNED_HUBS_JSON) — operator inline override. Highest precedence. - Allowlist (
ATB_TRUSTED_HUBS) — gateway lists DIDs of hubs it trusts; auto-fetches their public keys from their/.well-known/atb-keys.json. - Adopters Registry (
ATB_REGISTRY_URL) — AlgoVoi maintains a Falcon-1024 signed registry of approved hubs. Gateways verify the registry againstATB_REGISTRY_ROOT_PK_B64and trust every hub it lists.
ATB_BENCH_ISSUER_DID + ATB_BENCH_PK_B64). Phase 1 deployments work unchanged.
Registry doc shape
Methodology versioning
Each cert carries amethodology_version (e.g. atb-v1.0). A hub being approved doesn’t auto-approve any methodology it might introduce — gateways opt in per-methodology. The current registry defines:
atb-v1.0— AlgoVoi reference methodology (formula in Score computation above, threshold 0.70, minimum 10 adversarial challenges)
Tiers
| Tier | Meaning | Trust default |
|---|---|---|
reference | AlgoVoi’s own bench, canonical implementation | trusted |
approved | Conformance-verified, >30 days operational | trusted |
provisional | New hubs, first 30 days | trusted with optional per-gateway downgrade |
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: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-cryptographyRust crate (used by Monero, Zcash)
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:
- Decode the base64url envelope from the
X-ATB-ZK-Credentialheader - Check
alg == "Falcon-1024", verify the Falcon-1024 signature overrfc8785.dumps(payload)(same as Phase 1) - Check
atb_cert_version == "2",bench_issuer, andexpires_at - Extract
commitment_b64,proof_b64,threshold_milliunitsfrom the payload - Call
POST /verifyon the ZKP microservice — returns{"valid": true}or{"valid": false, "failure_reason": "..."} - If
valid == true, apply theATB_DISCOUNT_FACTORdiscount — no score needed
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:
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-neutralbehavioral_attestation trust signal in the A2A trust.signals[] spec. A machine-readable descriptor is published at:
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
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.0to1.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)
- That score ≥ threshold. Nothing more.
- Same
agent_id_hashandprofile_set_hash.
- The raw session cookie value (the bench stores only hashes)
- IP address or User-Agent (bench stores only hashes)
- Exact sequence of profiles encountered
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.| Feature | Gate | Status |
|---|---|---|
| Phase 1 cert issuance | FALCON_1024_SK_B64 set on bench + ATB_DISCOUNT_ENABLED=true on gateway | ✅ Live |
| Phase 2 cert issuance | ATB_ZKP_ENABLED=true on bench | ✅ Live |
| Phase 2 gateway verification | ATB_ZKP_ENABLED=true on gateway + ATB_ZKP_SERVICE_URL reachable | ✅ Live |
| Multi-hub federation | ATB_REGISTRY_URL or ATB_TRUSTED_HUBS configured | ✅ Live (registry path active) |