Notable changes to apd. Versions follow semantic versioning.
Security fixes are called out explicitly, because deciding whether to upgrade is the reason most people read this file.
@authority is our own before acting on a signed request. A
signature made for one host was otherwise replayable against another: the
component binds a signature to its target, but only if the verifier checks the
value names itself. The check runs before parsing, verification or any key
fetch, so a mismatched request costs nothing and reveals nothing
(400 invalid_request, no Signature-Error)..local, .internal,
.test and friends resolve differently depending on where a daemon happens to
run, so admitting them makes egress policy a function of the network rather
than of configuration.actor
(oidc:alice@acme.example, or static-token), so an audit can finally answer
who revoked an agent. required_claims is mandatory and refused when empty:
authenticating against the company IdP proves employment, not entitlement.
See docs/identity-providers.md for Okta, Entra,
Google, Keycloak and Auth0.docs/STATUS.md — what is implemented, what is deliberately absent, and what
has never been exercised by a real counterparty.tools/aauthcheck — a conformance client that enrols a real agent and signs
real requests, including an interop step against whoami.aauth.dev.admin_oidc.issuer accepts an issuer with a path. It was validated as an
AAuth server identifier, which requires a bare origin — so an Okta custom
authorization server, an Entra tenant and a Keycloak realm were all refused at
startup, leaving only issuer forms that cannot mint a usable token. Admin SSO
could not have worked with Okta at all.{"groups":
"admins"} against an array-valued claim previously could never match: it
failed closed, but silently, so the configuration looked correct and denied
everyone.unknown_key. A network or
DNS failure fetching a JWKS was indistinguishable from a genuinely unknown
key, which sends an operator hunting for a key problem that does not exist.psd: egress
admission now tries every admitted address (a dual-stack host whose first
address refuses is no longer fatal), and revocation signs its body correctly.agent/agent_jkt (removed in -11) and omitted ps, sub and
presented_jti (required), so anyone following it produced a token no Person
Server could resolve. Found by live three-party testing./inbox long-polls.:latest moves only for a final
release.jwks_uri scheme. Local revocation stays authoritative and happens first; the
notification is best-effort and its outcome is reported and audited.-11: the person token (aa-person+jwt), the
accept_signature_algs common metadata field, and correct handling of the
RFC 9421 signature alg parameter, which a verifier must ignore.-10 and Signature-Key -08 compliance. Fully-specified Ed25519
throughout, replacing polymorphic EdDSA; the hwk scheme now requires
alg; new error responses and verification steps.