Rework the explorer for AAuth -11 and R3 -02 - #5
Merged
Conversation
The site was last touched 2026-05-28 and showed several mechanisms the
protocol no longer has: the AAuth-Mission header, the act delegation
chain, agent identifiers in resource and auth tokens, the old mission
endpoint shape, four access modes, and r3_conditional.
Protocol changes reflected:
- Person token (aa-person+jwt). New scenario at /access/person-identity
covering issuance at the person_token_endpoint and presentation via
Signature-Key. Every flow that reaches a resource token now obtains
and presents one first, because a resource MUST have verified one
before it issues a resource token.
- AAuth-Mission removed. A mission reaches a resource only as the
mission_s256 claim of a PS-issued token. Header dropped from the
inspector, the tooltips, the scenarios and the comparison page.
- act and the delegation chain removed. Chain routing uses the auth
token's ps claim; the PS holds the chain because it authorizes each
hop. Call chaining and interaction chaining rebuilt around that, with
the intermediary obtaining a person token for the downstream resource.
- No agent identifier in any token a resource reads. Resource tokens
carry ps, sub, person_token_jti; auth tokens carry ps and a required
directed sub. agent_jkt and cnf are the binding.
- Mission surface rewritten: proposals at the mission endpoint,
action: update and action: completion at the mission's own URL, and
the {s256, mission, capabilities, person_tokens} approval response.
Mission digests are now computed from the blob bytes, so they verify.
- Five access modes on the comparison page; session-token naming for
the credential a resource issues in resource-managed access.
- R3 -02: r3_conditional renamed r3_per_call, the version field removed,
and per-call proposals rebuilt as full R3 documents with a parameters
object. /r3/conditional-ops moved to /r3/per-call-ops.
Removed lib/scenarios/user-delegation.json and /access/user-delegation:
its content is the federated scenario's "With User Approval" variant,
and what it added on top contradicted -11.
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
Merged
…r-local Signed-off-by: Christian Posta <christian.posta@gmail.com>
Deploying explorer with
|
| Latest commit: |
f2652da
|
| Status: | ✅ Deploy successful! |
| Preview URL: | https://3a18c59f.explorer-292.pages.dev |
| Branch Preview URL: | https://aauth-11-wp18-explorer.explorer-292.pages.dev |
This was referenced Aug 18, 2026
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.
Generated from the AAuth protocol -11 / R3 -02 migration. The explorer's last commit was 2026-05-28, so it was already behind before -11 landed; twelve of the twenty-seven scenarios depicted mechanisms that no longer exist.
Please push back on any scenario framing that does not match how you teach the protocol. I optimised each scenario for "what does this one thing show", and several of those calls are judgement rather than spec.
What changed in the protocol
Seven changes drove everything here. If you have not read the -11 diff:
aa-person+jwt, issued by the PS from a new REQUIREDperson_token_endpoint, audience-restricted to one resource, carrying a directedsuband no authorization at all. The agent presents it viaSignature-Keyin place of its agent token. A resource MUST have verified one before it issues a resource token — which is why it now appears in every flow that reaches one.AAuth-Missionwas removed, header and IANA registration both. A mission reaches a resource only inside a PS-issued token, as themission_s256claim. It is no longer agent-asserted.actand the delegation chain were removed. Chain routing uses the auth token'spsclaim. The PS holds the chain because it authorizes every hop; no token a resource reads shows it.ps,sub,person_token_jti; auth tokens carrypsand a REQUIRED directedsub.agent_jktandcnfare the binding.POST {mission_endpoint}proposes;POST {mission_endpoint}/{mission_s256}withaction: updateoraction: completion. Completion moved off the interaction endpoint. The approval response is{s256, mission, capabilities, person_tokens}— the blob base64url-encoded so the digest covers unambiguous bytes.aauth-access-tokenbecamesession-token.r3_conditional→r3_per_call, theversionfield removed, per-call proposals are now full R3 documents carrying aparametersobject, and theopenapi-gatewayvocabulary is gone (it was not in the site).New scenario: Person Identity Access
/access/person-identity— the centre of the protocol now, and the one thing the site had no representation of at all. Four steps:401 AAuth-Requirement: requirement=person-token(also new in -11).POST {person_token_endpoint}with{resource}→aa-person+jwtwithaud= the one resource, a directedsub,cnf.jwk= the agent's key, noscope, noaccount.Signature-Keyin place of its agent token and is served on identity alone. No resource token, no auth token, the PS not in the path of the call.requirement=auth-token— and the resource token it issues copiesps,subandperson_token_jtistraight out of the person token it just verified.Step 4 is the point I most want you to check. I used it to show the person-token → resource-token copy (interop profile Surface 2) and the "most calls on identity, a few sensitive operations challenging for more" shape, rather than ending the scenario at step 3. It makes the scenario do two jobs.
Scenarios changed
Access modes
ps-asserted→ retitled PS Authorization Access. Rebuilt on the authorization-endpoint path from the spec's own figure: person token,POST /authorizewith it, resource tokenaud=PS,auth_token_endpoint, present. Both variants.federated→ retitled Federated Authorization Access. Same two steps prepended,aud=AS, annotations on whyagent_tokenstays REQUIRED at the AS and why only the PS can redeem a resource token.identity-based→ retitled Agent Identity Access, description mentionsrequirement=agent-token.resource-managed→ "opaque token" is now the session token throughout, with theaccess_mode=session-tokenvalue and the rolling-refresh behaviour called out.access/compare→ five modes, each carrying the spec's "resource knows / established by" pair.Missions (all eight)
missions-lifecycle→ proposal carriesresources; approval returns{s256, mission, capabilities, person_tokens}; annotations explain thatcapabilitiesis not in the blob and not covered by the digest. PS metadata showsperson_token_endpoint,auth_token_endpoint,mission_control_endpoint.missions-resource-access→ retitled Mission Context at a Resource. Rebuilt aroundmission_s256flowing person token → resource token → auth token, with an s256 chain visual.missions-out-of-bounds→ person token naming M1 added; new-mission approval uses the new response shape; annotation notes thataction: updateis the right tool when the description still describes the work.missions-completion→ retitled Mission Update & Completion. New first step showingaction: updateand the returned update digest; completion moved fromPOST /interaction {type: completion}toPOST /mission/{s256} {action: completion}; termination reasons added.missions-audit→missionobject →mission_s256; the terminated case returnsapplication/problem+jsonwithtermination_reason.missions-permission→ mission variant namesmission_s256; annotations tie decisions toapproved_toolsand the mission log.missions-end-to-end→ person token comes back attached to the approval, so no extra request; s256 chain added.missions/compare→ the whole token diff rebuilt: no header, noact, noagent, person token column added, lifecycle list rewritten to include update and completion.Mission digests are now real.
s256is the actual SHA-256 of the blob bytes, andmissionis those bytes base64url-encoded. You can decode and verify them from the page, which is what the interop profile asks a Surface 1 implementer to do.Advanced
call-chaining→ R1 now acts as an agent with its own agent token (it was signingsig=jwks_urias a resource). It obtains a person token for R2 withupstream_token, then routes the token request to the PS named by the upstream token'spsclaim, with an annotation on why its ownpsclaim is not used.actannotations replaced with why the chain is absent from the token and present at the PS. Directed-sub-across-a-chain explained.interaction-chaining→ same person-token step; the downstream token request now goes to the PS rather than straight to AS2 (the -11 change removed that branch).clarification→ was showing the agent POSTing directly to the AS token endpoint, which was never right. Retargeted to the PS. Added theaction: clarification_responsediscriminator, which the scenario was missing.R3
r3-conditional-ops→r3-per-call-ops, route/r3/conditional-ops→/r3/per-call-ops. The bespokecall_paramsclaim in the resource token andcall_bindingin the auth token are gone; the resource now builds a per-call proposal (a full R3 document withparameters, including a digest-object parameter for a large value) and the token carries onlyr3_uri/r3_s256. The challenge is a proper401+AAuth-Requirementrather than an inventedconditional_operationerror.r3-vocabulary-basics,r3-content-addressing→ person token presented at the authorization endpoint;versionremoved from the documents;r3_s256values are now the real SHA-256 of the document bytes shown;token_type: DPoPandAuthorization: DPoP …replaced withexpires_inandSignature-Key.Components
HeaderInspector—AAuth-Missionremoved from tooltips and the AAuth-header set;AAuth-AccessandAuthorizationdescriptions rewritten around the session token.JWTViewer—actandmissiontooltips gone;mission_s256,person_token_jti,tenant,account,parent_agentadded;subandpsrewritten;r3_conditional→r3_per_call.MissionBlobViewer— separates blob members (whereapproverstill lives) from the identifier, and shows the base64urlmissionmember next to its digest.R3DocumentViewer—versionbadge replaced with a per-call-proposal badge; rendersparametersanddisplay.detail.lib/types.ts—MissionBlobDatagainsexpires_at,approved_resources,encoded;R3Documentlosesversion, gainsparameters;R3Displaygainsdetail.Housekeeping: every token's
rawis regenerated from its header and payload, so the raw tab decodes to what the decoded tab shows. It did not before — several raws still decoded to127.0.0.1:800xvalues and to claims that had been edited away.Removed
lib/scenarios/user-delegation.jsonand/access/user-delegation. Its steps are the federated scenario's "With User Approval" variant; what it added on top was wrong under -11 (the agent signingsig=jwks_uri, andAAuth-Accesssent as a request header carrying the auth token). Rather than rebuild a duplicate I dropped it and removed the sidebar entry. Say the word and I will restore it — it is one file.Things I was unsure about
ps-assertedandfederatednow use the authorization endpoint rather than the401challenge those scenarios used before. It matches the figures in the spec and makes the person-token requirement natural, but it does change what those two pages teach. The401path is mentioned in an annotation on each.https://ps.example/auth-token. The rename in -11 is of the metadata field (token_endpoint→auth_token_endpoint), not the path; the spec's own examples still usePOST /token. I renamed the path too so it reads next to/person. Easy to revert if you would rather the URLs match the spec examples.delegation.jsonwas on my list as act-chain-based but is not — it is thesig=jwtagent-token scenario and has noact. Left alone apart from the mechanical claim-ordering pass.missions-permission's autonomous variant is the no-mission case and stays that way; only the interactive variant namesmission_s256.r3_s256and missions256are real digests now but the JWTsignature_b64values are still decorative. Making signatures real would mean shipping keys, which seems like a different decision.Left alone deliberately (pre-existing, not -11)
alg: "EdDSA"in every JWT header. -10 adopted the fully-specifiedEd25519of RFC 9864 and says implementations MUST NOT accept the polymorphicEdDSA. Every token in the site would needEd25519, and everycnfJWK needs analgmember. Mechanical, but it is a -10 change and I did not want it inside a -11 review.;alg="ed25519"as an HTTP signature parameter. -10 says thealgsignature parameter MUST NOT be used. It appears in everySignature-Inputand signature base on the site. Same reasoning.interaction_endpointscenarios'AAuth-Capabilitiesannotations still cite section numbers from an older draft (§1731and friends). The claims are right; the numbers are stale everywhere in the repo and I did not renumber them.rawregeneration pass.