Goal: prove the discovery document conforms, optionally prove the provider verification credential verifies, then get the implementation listed with reproducible evidence.
Conformance and verification are two independent results. The validator
reference is Conformance validator. The registry
criteria and entry schema are in the implementation
registry.
This page is the /registry target; there is no separate registry page.
Run the validator
From a clone of the spec repository:
git clone https://github.com/agentregistrar/spec
cd spec
pnpm install
pnpm --silent validate:discovery https://example.com/.well-known/agent-signup.json --jsonFrom any project, using the published package. There is no bin entry, so
invoke the TypeScript source with tsx:
npm install @agentregistrar/discovery@1.2.0 tsx@4.23.15
npx tsx node_modules/@agentregistrar/discovery/src/validate-discovery.ts \
https://example.com/.well-known/agent-signup.json --jsonFile mode needs no network:
pnpm --silent validate:discovery ./agent-signup.json --jsonUse pnpm --silent (or pnpm -s) so pnpm's banner does not pollute stdout. The
validator itself writes only JSON.
Flags added in v1.2
| Flag | Effect |
|---|---|
--verify-attestation |
Parse and verify rp_attestation if present. Opt-in issuer JWKS fetch; an absent field is unverified plus a warning and does not change the exit code. |
--require-attestation |
Implies --verify-attestation; any non-verified result fails the run. Use it as a CI gate. |
--trusted-rp-broker <issuer> |
Repeatable trusted RP-broker list. Flags override the AGENT_IDENTITY_TRUSTED_RP_BROKERS env fallback; an empty effective list trusts nothing. |
--jwks <path-or-url> |
Pin exactly one issuer's JWKS for an offline run. It never bypasses signature checks and never merges issuers. |
--at <rfc3339|epoch> |
Freeze the clock for deterministic fixture runs. Not for production. |
The existing --json, --probe-jwks, --probe-endpoints, --timeout, and
--max-bytes flags keep their meanings.
Two verdicts and exit codes
The JSON result has conformance (document-only) and attestation (separate).
valid remains the run result: valid === (exitCode === 0).
| Exit | Meaning | Next action |
|---|---|---|
0 |
The document was fetched, parsed, and is conformant; no required check failed. Warnings do not change the code. | Publish. Verification may still be unverified, expired, or invalid without --require-attestation. |
1 |
A conformance error (including unparseable JSON or a malformed rp_attestation field), or a failed attestation under --require-attestation. |
Read the errors array and fix the document or the credential. |
2 |
The run could not obtain what it needed: document read/fetch failure, or JWKS unavailable under --require-attestation. The conformance verdict is not evaluated. |
Fix hosting, the URL, the timeout, or the JWKS, then re-run. |
A malformed rp_attestation field is a conformance error with
attestation.status: "not_checked", not invalid. An expired attestation is a
verification warning by default. A bad signature, origin mismatch, or audience
mismatch is a verification failure. An absent credential is unverified.
Recorded v1.2 runs
The v1.2.0 release notes record the fixture matrix and validator output. The headline cases:
| Case | Command shape | Result |
|---|---|---|
| Conformant, no credential | validate:discovery fixtures/valid-minimal.json --json |
valid true, exit 0, attestation.status "unverified". |
Valid domain credential |
--verify-attestation --require-attestation --trusted-rp-broker ... --at ... |
verified, level domain, exit 0. |
| Expired credential, advisory | --verify-attestation --at <after exp> |
expired, exit 0. |
| Expired credential, gate | same plus --require-attestation |
exit 1. |
| Malformed field | no flags needed | conformance error, exit 1, not_checked. |
| Untrusted broker | --verify-attestation without trust |
attested_untrusted_broker; exit 0 unless required. |
| Broker unavailable | --require-attestation with a missing JWKS |
exit 2, unavailable. |
Run pnpm validate:fixtures and pnpm validate:registry for the full matrix
and the registry schema.
Validate a live provider
pnpm --silent validate:discovery https://example.com/.well-known/agent-signup.json \
--verify-attestation \
--trusted-rp-broker https://agentregistrar.dev \
--jsonAdd --require-attestation for a gate. Do not add a trusted broker you have not
decided to trust: the check happens before any JWKS fetch, and the validator
never contacts an untrusted issuer.
Registry criteria
To be listed, an implementation must:
- Pass the identity-only validator with zero errors. Warnings are permitted.
- Publish a public, stable HTTPS
/.well-known/agent-signup.jsonon its canonical origin, not a per-deploy or throwaway URL. - Provide a reachable security, abuse or legal contact that someone monitors.
- Publish a post-signup context guide if it has vendor capabilities to document.
- Optionally, carry a five-field
verificationsnapshot if it claims verification.
The registry lists protocol capabilities only: agent_signup and
post_signup_context. A catalog, a SKU or a provisioning endpoint is not a
registry capability. Listing is a statement about the discovery document, not an
endorsement of the product, its security, its uptime or its pricing.
The optional verification snapshot
Verification is a separate statement from conformance. To claim it, the entry carries all five fields:
"verification": {
"broker": "https://agentregistrar.dev",
"level": "domain",
"attestation_jti": "rpa_01j...",
"checked_at": "2026-10-24T00:00:00Z",
"status": "active"
}levelisdomainorentity.statusisactive,suspended, orrevokedatchecked_at.- The attestation must be live at
checked_at, andchecked_atmust fall inside its lifetime. - The provider must have a real provider account with the attesting broker.
The registry is a snapshot, not a live feed. A later suspension or revocation
does not rewrite the static entry or badge until a new check is recorded.
Only status:"active" at checked_at renders the verified badge. The badge is
separate from the conformance badge; there is no second verified badge.
A provider account is required only for this verified listing, attestation issuance, authenticated receipts, and abuse standing. It is not required to accept assertions, and there is no pricing or checkout in this release.
Submit an entry
- Make the document conformant using Publish discovery.
- Run the validator against the public URL and keep the JSON.
- Open a pull request against
agentregistrar/specthat adds one object to theimplementationsarray inregistry/implementations.jsonwith:name,url,discovery_url,audience,protocol,capabilities,contact,validated_at,validator_version;- a
validator_evidenceobject with the exact command and resulting counts; - optionally, the five-field
verificationobject above.
- Update the table in
registry/README.mdso it stays in lockstep. - Run
pnpm --silent validate:registry registry/implementations.json --json; it must reportvalid: true, exit0. - The pull request is reviewed against the criteria above.
Read audience and protocol from the validator's --json output rather than
retyping them. The field reference is in the validator
guide.
An entry whose document stops passing is removed or updated with fresh evidence.
Verify your work
- The file-mode run exits
0with zero errors. - The live URL run exits
0and the content type isapplication/json. -
--verify-attestationisverifiedif and only if the credential is present and you trust the broker. -
--require-attestationfails closed on absent, invalid, expired, untrusted, or unavailable. - The registry object contains no vendor capability fields.
- Any
verificationobject has all five fields, a livechecked_at, and only anactivesnapshot gets a badge. - The table and the JSON stay in lockstep.
Next
- Production checklist: what to do before and after listing.
- Troubleshooting: common validator failures.
- Reference implementation: the reference document and its evidence.
- Trust and limits: policy, unverified providers, and what verification does not mean.