AAuth -11: correct token recitals, PS discovery, and the JWT claims registry - #93
Merged
Conversation
R3's base-claim recitals for the resource token and the auth token still described AAuth Protocol -09. The `agent` claim is gone from both tokens: a resource token carries `ps`, `sub`, and `person_token_jti`, an auth token carries `ps` and a REQUIRED directed `sub` plus an OPTIONAL `mission_s256`. Updated both lists and both JSON examples, including the auth token example's `sub`, which showed an email address where the value is an opaque directed identifier. Two other places in R3 named parties or claims that -11 removed. AS Processing step 4 required the AS to log "the agent identifier" against a resource token that no longer carries one; it now names `ps`, `sub`, and `agent_jkt` from the resource token, and the text says the agent identifier comes from the `agent_token` the PS sends on the PS-to-AS request. R3 Document Access Restriction identified the entitled PS by the agent token's OPTIONAL `ps` claim, but under -11 the agent presents a person token in place of its agent token at the authorization endpoint; the entitled PS is the issuer of that person token, which the resource recorded as the resource token's REQUIRED `ps`. The protocol said in three places that a resource discovers the agent's PS from the agent token's `ps` claim, contradicting its own Design Rationale. That claim is the advance signal that the agent has a person server at all, which is what lets a resource decide to challenge for a person token; the PS of an issued authorization is the `iss` of the person token the resource verified. The protocol's JWT Claims Registrations table registered `ps` twice, still registered `agent` (now only a mission blob member, not a JWT claim), and omitted `person_token_jti`, `account`, and `interaction`. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FmiCqDjRUSx6zb1N4gZPXE
This was referenced Aug 12, 2026
Merged
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Editorial corrections to the two drafts, bringing R3 -02's recitals and the protocol's registry into line with what -11 actually says. No new normative behaviour — the normative changes for -11 already landed on
main(issues #75–#81, #84). This is the cleanup pass that the eleven implementation PRs were written against, plus six new issues raised by implementing it.What changed
R3 (
draft-hardt-aauth-r3.md) — its base-claim recitals for the resource token and the auth token still described AAuth Protocol -09:agentclaim is gone from both. A resource token carriesps,sub,person_token_jti; an auth token carriespsand a REQUIRED directedsubplus an OPTIONALmission_s256. Both lists and both JSON examples updated — including the auth-token example'ssub, which showed an email address where the value is an opaque directed identifier.ps,subandagent_jktfrom the resource token, and says the agent identifier comes from theagent_tokenthe PS sends on the PS-to-AS request.psclaim. Under -11 the agent presents a person token at the authorization endpoint; the entitled PS is the issuer of that person token, which the resource recorded as the resource token's REQUIREDps.Protocol (
draft-hardt-oauth-aauth-protocol.md):psclaim — contradicting the draft's own Design Rationale.pson an agent token is the advance signal that the agent has a person server at all, which is what lets a resource decide to challenge for a person token. The PS of an issued authorization is theissof the person token the resource verified.pstwice, still registeredagent(now only a mission-blob member, not a JWT claim), and omittedperson_token_jti,accountandinteraction.Six issues filed while implementing -11
Implementation proceeds without resolutions for all of them; each is recorded so the text catches up.
tenantfor a person token when a person holds a personal context plus several managed ones.proxy-mcp's binding-set model depends on the answer. Provisionally closed by acceptingtenantat the person token endpoint.202 requirement=interaction.@aauth/agentcurrently sendsAAuth-Capabilitiesthere, contradicting §AAuth-Capabilities — deliberate, and pending this decision.r3_per_callchallenge fires on a request carrying an auth token, which haspsandsubbut noperson_token_jti— yet the resource token it must issue makes that claim REQUIRED, so every resource must retain the person tokens it verified.notesimplements the retention reading: a record per (ps, sub, agent key, mission), TTL = the person token'sexp. Whatever text resolves this should specify the retained record as the whole tuple, not thejtialone — keeping thejtiwhile losing its mission fails safe, but picking the wrong record among several produces a spurious rejection.202, and make the grant single-use.This is one coordinated wave
Twelve PRs across twelve repositories implement AAuth -11 and R3 -02. They were built in parallel worktrees that could not see each other, against a pinned interface contract, and reconciled in one integration pass.
Merging any one alone breaks the others. For this repo the coupling runs the other way from the code repos: this is only text, so merging it early is harmless in itself — but the published editor's copy would then describe a protocol that
person.hello.coopand the whole resource fleet do not yet speak, and the walkthrough and diagrams inaauth-dev/wwwwould contradict the live services. Merging the implementations without this leaves the normative recitals describing -09.The twelve PRs
hellocoop/mockindickhardt/AAuthaauth-dev/packages-js@aauth/protocol1.0.0 (new),@aauth/agent3.0.0,@aauth/resource2.0.0, five more.aauth-dev/proxy@aauth/proxy1.0.0 — the agent-proxy core.hellocoop/aauth-proxyhellocoop/proxy-mcp@aauth/proxy^1.0.0; AP metadata cleanup.aauth-dev/notesaauth-dev/whoamiaauth-dev/web-agent-demo(playground)202deferred path.aauth-dev/playground-popupaauth-dev/registryaauth-dev/wwwRelated and already open:
aauth-dev/explorer#5 reworks the explorer for -11 / R3 -02.Background:
AAUTH-11-INTEGRATION.md(the integration ledger) andAAUTH-11-PACKAGE-CONTRACT.md(the pinned interface contract the parallel work packages were built against).Ordering constraints for the wave
@aauth/protocol1.0.0 needs a manual first publish. npm will not accept a trusted publisher for a name that does not exist in the registry, sorelease.ymlcannot publish it until someone runsnpm publish --access publicby hand and then registers the publisher.@aauth/proxy1.0.0 must publish before the fleet servesperson-token. 0.4.0 hard-fails on an unrecognizedaccess_mode(invalid access_mode person-token).HelloCoop/Walletsvr/issuer/sign.js:32must shipEd25519in the same window. It readsconst alg = useEdDSA ? 'EdDSA' : 'RS256'withuseEdDSA = isAAuthType(typ), so everyaa-auth+jwtandaa-person+jwtperson.hello.coopissues today carriesalg: EdDSA. Every verifier in this wave rejectsEdDSA— -10 allows no transition. If that line does not ship, every resource rejects every token the live PS issues. RS256 stays for OIDC.Not covered
This PR is prose; there is no test suite. Two things a reader should know about the wave it documents:
llms.txtinaauth-dev/wwwpoints at the document page and the editor's copy rather than pinning a revision.mission_endpointis unimplemented by agreement across the whole wave.mission_s256is accepted, stamped, copied and compared everywhere, but the reference PS accepts any value as a mission hash — there is no mission to look up. §Resource Token Verification step 7 (mission active, current time beforeexpires_at) is therefore never exercised, and everyexpires_atclamp in the fleet is untested.What a reviewer should check
psonce, does not listagent, and does listperson_token_jti,accountandinteraction.psclaim.subreads as an opaque directed identifier, not an email address.