Skip to content

AdCP 3.3 agent identity: Web Bot Auth profile, trust.json, grants, onboarding posture, relationship status #1500

Open

Description

@bokelley

Summary

AdCP 3.3 adds a new way for agents to sign and be identified, and the WG ratified it on 2026-10-12. This issue tracks what this SDK needs to support it.

Spec and decisions

What changes on the wire

RFC 9421 profile (deprecated in 3.3, works through 3.x, removed in 4.0) Web Bot Auth profile (web-bot-auth, experimental in 3.3)
Identity Canonical agent URL in the operator's brand.json The signer's canonical origin, one agent per origin
Keys brand.json agents[].jwks_uri, found through the agent's get_adcp_capabilities → identity.brand_json_url The origin's key directory, /.well-known/http-message-signatures-directory; no capabilities call
Key IDs Operator-chosen RFC 7638 thumbprint
Operator record brand.json named by the capabilities pointer trust.json derived at https://{eTLD+1(origin)}/.well-known/trust.json, evaluated only at binding, grants, and open onboarding, never on the signature path
First contact Out-of-band onboarding record The covered Signature-Agent names the origin. A verified, unbound signer is identity-established and gets no authority
Errors request_signature_* codes WBA status and headers: 403 with Accept-Signature, 400, 429

Also new (experimental):

  • demand-side grants in trust.json, with the grant_absent reason on PERMISSION_DENIED;
  • account.agent_onboarding on capabilities;
  • buyer onboarding posture in trust.json;
  • relationship on get_principal, with the principal.changed reasons relationship_changed and relationship_expiring;
  • optional RFC 5280 revocation_details (reason, invalidity_date) on revocation lists.

Not in 3.3: JWS document signing (governance context iss, designated-task response signing, rights attestations) stays on the RFC 9421 chain until 3.4.

Does this wait for the 3.3 release?

No. Ship behind flags or experimental options, as the 3.3 agent-resolution alignment did (it shipped right after the spec merged, while the wire pin stayed 3.2). The real dependencies:

Common work items

Verifier

  • Web Bot Auth verification. Parse the covered Signature-Agent member, fetch the directory at that origin (WBA fetch rules; validate the signed directory response, WBA Appendix B.1), and look the key up by (origin, thumbprint kid). Enforce nonce replay, the created/expires window, and tag="web-bot-auth". The result is the verified canonical origin.
  • Profile selection. A message carrying Signature-Agent or the web-bot-auth tag is verified under Web Bot Auth only. An uncovered Signature-Agent member is never attributed.
  • A resolver for many signers, keyed by the header, so a seller with many buyers needs no hand-written keyid → agent dispatch.
  • Revocation at the origin. Read /.well-known/governance-revocations.json (adcp-gov-revocation+jws), parse revocation_details (RFC 5280 reason, invalidity_date), keep the most severe detail ever seen, and never un-revoke.
  • Errors as WBA status and headers. Keep the request_signature_* codes for the RFC 9421 profile.

Trust record, binding, grants

  • Canonical origin helper. Scheme and authority after URL canonicalization steps 1–4; reuse the existing canonicalization code.
  • Trust-record evaluator, called only at binding, grant evaluation, and open onboarding:
    • derive https://{eTLD+1}/.well-known/trust.json with a pinned PSL snapshot (ICANN and PRIVATE sections);
    • SSRF rules, 2 MiB cap, strict parse, one authoritative_location hop;
    • exactly one agents[] match by canonical origin with the required role;
    • freshness cache bounded by the revocation polling interval;
    • fail closed for spend on a fetch failure.
  • Binding hooks. An identity-established signer gets no authority. Provide a hook to bind an origin to a principal (one principal per origin). Binding onto an existing RFC 9421 principal needs explicit approval. No downgrade to RFC 9421 for a bound origin.
  • Grant evaluation at sync_accounts (DR-0025):
    • the brand's record authorizes;
    • implicit authority when operator, brand, and signer's operator share a registrable domain;
    • otherwise a chain reaching the signer's operator with account.operator on it;
    • intersection along the chain, and exclusive_grants;
    • trust.json 200 disables authorized_operators;
    • PERMISSION_DENIED with { scope: "agent", reason: "grant_absent" }.

Signer and publishing

  • Web Bot Auth signer (opt-in): set and cover Signature-Agent with the agent's origin, tag="web-bot-auth", a nonce, and a thumbprint kid.
  • Key directory tooling: generate the directory, sign it per key, and re-sign before expires (CLI or helper).
  • trust.json authoring/validation helper: one agent per origin, no keys.

Types and surfaces

  • Types for the new schemas: account.agent_onboarding (+ tier, requirement, enums), buyer onboarding posture, get_principal relationship, the new principal.changed reasons, grant_absent, revocation_details, and trust.json v1 without jwks_uri.
  • Deprecation warning on RFC 9421-profile signing and verification configuration. It keeps working through 3.x.

Docs and tests

adcp-client-python specifics

  • SignerKeyResolver: the protocol needs a signer-origin parameter. Add a DiscoveredSignerKeys resolver keyed by the covered Signature-Agent and wire it into server/signed_requests.py. This also covers Inbound verification accepts one expected agent_url, but brand.json declares agents[] as a list #1214 (more than one expected agent). Size M.
  • async_resolve_agent and verify_from_agent_url: keep them for the RFC 9421 profile. The Web Bot Auth path doesn't call capabilities. Size M–L.
  • SigningConfig: add the agent origin and header emission. Size S.
  • Trust records: move BrandJsonJwksResolver, brand_authz, and governance helpers toward the trust-record type where grants are evaluated. Governance JWS stays on the RFC 9421 chain in 3.3. Size M.
  • Timing: 9.0 is still in beta, so any breaking defaults should land before 9.0 GA. COMPATIBLE_ADCP_VERSIONS gains "3.3" when 3.3 is cut.

Rough size overall: M–L.

Refs adcontextprotocol/adcp#8118

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions