<?xml version="1.0" encoding="utf-8"?>
<!-- name="GENERATOR" content="github.com/mmarkdown/mmark Mmark Markdown Processor - mmark.miek.nl" -->
<rfc version="3" ipr="trust200902" docName="draft-mw-spice-actor-chain-04" submissionType="IETF" category="std" xml:lang="en" xmlns:xi="http://www.w3.org/2001/XInclude" indexInclude="true">

<front>
<title abbrev="SPICE-ACTOR-CHAINS">Cryptographically Verifiable Actor Chains for OAuth 2.0 Token Exchange</title><seriesInfo value="draft-mw-spice-actor-chain-04" stream="IETF" status="standard" name="Internet-Draft"></seriesInfo>
<author initials="A." surname="Prasad" fullname="A Prasad"><organization>Oracle</organization><address><postal><street></street>
</postal><email>a.prasad@oracle.com</email>
</address></author><author initials="R." surname="Krishnan" fullname="Ram Krishnan"><organization>JPMorgan Chase &amp; Co</organization><address><postal><street></street>
</postal><email>ramkri123@gmail.com</email>
</address></author><author initials="D." surname="Lopez" fullname="Diego R. Lopez"><organization>Telefonica</organization><address><postal><street></street>
</postal><email>diego.r.lopez@telefonica.com</email>
</address></author><author initials="S." surname="Addepalli" fullname="Srinivasa Addepalli"><organization>Aryaka</organization><address><postal><street></street>
</postal><email>srinivasa.addepalli@aryaka.com</email>
</address></author><date year="2026" month="March" day="27"></date>
<area>Security</area>
<workgroup>SPICE</workgroup>
<keyword>actor chain</keyword>
<keyword>spice</keyword>
<keyword>oauth</keyword>
<keyword>rfc8693</keyword>
<keyword>token exchange</keyword>
<keyword>workload identity</keyword>
<keyword>delegation</keyword>
<keyword>AI agents</keyword>
<keyword>MCP</keyword>
<keyword>A2A</keyword>

<abstract>
<t>Multi-hop service-to-service and agentic workflows need a standardized way to
preserve and validate delegation-path continuity across successive token
exchanges. This document defines six actor-chain profiles for OAuth 2.0 Token
Exchange {{!RFC8693}}. {{!RFC8693}} permits nested <tt>act</tt> claims, but prior
actors remain informational only and token exchange does not define how a
delegation path is preserved and validated across successive exchanges.</t>
<t>This document profiles delegation-chain tokens and defines profile-specific
processing for multi-hop workflows. The six profiles are: Declared Full
Disclosure; Declared Subset Disclosure; Declared Actor-Only Disclosure;
Verified Full Disclosure; Verified Subset Disclosure; and Verified Actor-Only
Disclosure.</t>
<t>These profiles preserve the existing meanings of <tt>sub</tt>, <tt>act</tt>, and <tt>may_act</tt>.
They support same-domain and cross-domain delegation and provide different
tradeoffs among visible chain-based authorization, cryptographic
accountability, auditability, privacy, and long-running workflow support.
Plain RFC 8693 impersonation-shaped outputs remain valid RFC 8693 behavior but
are outside this profile family.</t>
</abstract>

</front>

<middle>

<section anchor="part-i-core-specification"><name>Part I. Core Specification</name>
</section>

<section anchor="introduction"><name>Introduction</name>
<t>In service-to-service, tool-calling, and agent-to-agent systems, including
those implementing the Model Context Protocol (MCP) and the Agent2Agent
(A2A) protocol, one workload often receives a token, performs work, and then
exchanges that token to call another workload. {{!RFC8693}} defines token
exchange and the <tt>act</tt> claim for the current actor, but it does not define a
standardized way to preserve and validate delegation-path continuity across a
sequence of exchanges.</t>
<t>This document defines six interoperable actor-chain profiles for OAuth 2.0
Token Exchange. They preserve the existing meanings of <tt>sub</tt>, <tt>act</tt>, and
<tt>may_act</tt>, and they define when nested <tt>act</tt> becomes authoritative visible
actor-chain state for profile-controlled processing. Depending on the selected
profile, the next hop can see the full visible chain, an Authorization-Server-
selected subset of that chain, only the current actor, or no inline <tt>act</tt> at
all.</t>
<t>The profiles are organized in two branches. The declared branch relies on the
Authorization Server to assert visible chain continuity. The verified branch
adds actor-signed step proofs and cumulative commitment state so that later
participants can validate stronger continuity and audit evidence. All profiles
support both same-domain continuation and cross-domain re-issuance. This
specification does not require any particular presenter-binding or actor-
authentication mechanism; those remain deployment-specific.</t>
<t>This specification defines a JWT / JSON Web Signature (JWS) binding for the
interoperable base protocol. A future version or companion specification MAY
define an equivalent COSE/CBOR binding.</t>
</section>

<section anchor="terminology"><name>Terminology</name>
<t>The key words &quot;MUST&quot;, &quot;MUST NOT&quot;, &quot;REQUIRED&quot;, &quot;SHALL&quot;, &quot;SHALL NOT&quot;, &quot;SHOULD&quot;,
&quot;SHOULD NOT&quot;, &quot;RECOMMENDED&quot;, &quot;NOT RECOMMENDED&quot;, &quot;MAY&quot;, and &quot;OPTIONAL&quot; in this
document are to be interpreted as described in BCP 14 {{!RFC2119}} {{!RFC8174}}
when, and only when, they appear in all capitals, as shown here.</t>
<t>This document also leverages terminology from OAuth 2.0 Token Exchange
{{!RFC8693}}, the SPICE Architecture {{!I-D.ietf-spice-arch}}, and the RATS
Architecture {{!RFC9334}}.</t>

<ul>
<li><t><strong>Actor</strong>: A workload, service, application component, agent, or other
authenticated entity that receives a token, performs work, and MAY
subsequently act toward another actor.</t>
</li>
<li><t><strong>Current actor</strong>: The authenticated entity presently performing token
exchange.</t>
</li>
<li><t><strong>Presenting actor</strong>: The actor that presents an inbound token to a
recipient.</t>
</li>
</ul>
<t>Example: when <tt>B</tt> exchanges a token at the Authorization Server, <tt>B</tt> is the
  current actor. When <tt>B</tt> later presents the resulting token to <tt>C</tt>, <tt>B</tt> is the
  presenting actor.</t>

<ul>
<li><t><strong>Recipient</strong>: The actor or resource server identified as the intended target
of an issued token.</t>
</li>
<li><t><strong>Actor chain</strong>: The ordered sequence of actors that have acted so far in one
workflow instance.</t>
</li>
<li><t><strong>Ordinary token</strong>: The access token issued for presentation to the next
hop. It is distinct from step proofs, bootstrap context handles, commitment
objects, and receiver acknowledgments.</t>
</li>
<li><t><strong>Visible chain</strong>: The ordered actor sequence represented by the <tt>act</tt>
structure of an artifact when <tt>actp</tt> is present. The outermost <tt>act</tt>
identifies the current actor. Any nested <tt>act</tt> members identify prior visible
actors only.</t>
</li>
<li><t><strong>Actor-visible chain</strong>: The exact ordered actor sequence that the current
actor is permitted to know and extend for the next hop. In the verified
profiles, this is the exact visible chain that the current actor verified on
the inbound hop, with that actor appended when it later acts.</t>
</li>
<li><t><strong>Authoritative workflow chain state</strong>: Authorization-Server-retained state
for the accepted workflow instance. It MAY be richer than the visible chain
disclosed in any given issued token. It is used for continuity, branch
correlation, forensic review, legal audit, and any policy-controlled future
redisclosure. This specification does not require that such retained state be
disclosed inline in ordinary tokens.</t>
</li>
</ul>
<t>In the full-disclosure profiles, the visible chain, the actor-visible chain,
  and the authoritative workflow chain state collapse to the same chain. They
  diverge only under subset and actor-only profiles, where the visible chain
  may be narrower than the actor-visible chain, which in turn may be narrower
  than the authoritative workflow chain state.</t>

<ul>
<li><t><strong>Proof-bound chain state</strong>: The cumulative cryptographic state carried in
<tt>actc</tt> that binds prior accepted chain state to a newly accepted hop.</t>
</li>
<li><t><strong>Step proof</strong>: A profile-defined proof signed by the current actor that
binds that actor's participation to the workflow, prior accepted state, the
profile-defined actor-visible chain for the hop, and target context.</t>
</li>
<li><t><strong>Target context</strong>: The canonical representation of the next-hop target that
a profile-defined proof or acknowledgment binds to. It always includes the
intended audience and MAY additionally include other target-selection inputs.
If no such additional inputs are used, it is identical to <tt>aud</tt>.</t>
</li>
<li><t><strong>Bootstrap context</strong>: An opaque handle issued by the Authorization Server
only to start a verified profile workflow. It lets the initial actor redeem
bound bootstrap state at the token endpoint without carrying that state
inline.</t>
</li>
<li><t><strong>Actor-chain identifier (<tt>acti</tt>)</strong>: A stable identifier minted once at workflow
start and retained for the lifetime of the workflow instance.</t>
</li>
<li><t><strong>Cross-domain re-issuance</strong>: A second token exchange performed at another
domain's Authorization Server in order to obtain a local token trusted by the
next recipient, without extending the actor chain.</t>
</li>
<li><t><strong>Home Authorization Server</strong>: The Authorization Server at which the current
actor normally performs the chain-extending token exchange for the next hop.
In same-domain operation it is the issuer that validates prior chain state
and issues the next ordinary token.</t>
</li>
<li><t><strong>Continuity</strong>: The property that the presenting actor of an inbound
artifact is the same actor that the workflow state and any required disclosed
current-actor information identify as the expected presenter.</t>
</li>
<li><t><strong>Append-only processing</strong>: The rule that a new actor is appended to the
prior accepted workflow chain state, and to any disclosed visible chain
fragment derived from it, without insertion, deletion, reordering, or
modification of prior actors.</t>
</li>
<li><t><strong>Terminal recipient</strong>: A recipient that performs work locally and does not
extend the actor chain further.</t>
</li>
<li><t><strong>Refresh-Exchange</strong>: A token-exchange operation by the same current actor
that preserves accepted chain state while refreshing transport characteristics
such as expiry according to local policy.</t>
</li>
<li><t><strong>Local policy</strong>: Deployment-specific authorization and risk rules used when
this specification defers a decision to the Authorization Server or
recipient. Local policy can include trust relationships, authenticated client
identity, permitted audiences or resources, chain-depth limits, profile
support, and business or risk controls.</t>
</li>
</ul>
</section>

<section anchor="relationship-to-rfc-8693-claims"><name>Relationship to RFC 8693 Claims</name>
<t>This specification extends OAuth 2.0 Token Exchange {{!RFC8693}} without
changing the base meanings of <tt>sub</tt>, <tt>act</tt>, or <tt>may_act</tt>. It profiles
delegation-chain workflow continuity and profile-controlled disclosure across
token exchange hops.</t>
<t>When <tt>actp</tt> is absent, <tt>act</tt> has ordinary RFC 8693 semantics. Nested prior
<tt>act</tt> claims, if present, remain informational only for access-control
purposes, consistent with {{!RFC8693}}.</t>
<t>The following rules apply when <tt>actp</tt> is present and points to a profile
defined by this specification:</t>

<ul spacing="compact">
<li><tt>sub</tt> continues to identify the subject of the issued token.</li>
<li><tt>acti</tt> identifies the stable workflow instance for the accepted actor-chain
state.</li>
<li>If <tt>act</tt> is present, it is the authoritative disclosed actor-chain fragment
for that artifact. The outermost <tt>act</tt>, when present, identifies the
disclosed current actor. Each nested <tt>act</tt> member, when present, identifies
the immediately prior disclosed actor.</li>
<li>Reduced actor disclosure, including omission of prior actors, omission of the
current actor from a disclosed subset, or omission of <tt>act</tt> entirely, does
not turn a profiled token into an ordinary impersonation output. When <tt>actp</tt>
is present, the token remains a delegation-chain token under this
specification.</li>
<li>Plain RFC 8693 outputs that do not carry this specification's profile
signals remain outside this profile family whether or not they contain
<tt>act</tt>.</li>
</ul>

<section anchor="disclosure-invariant"><name>Disclosure Invariant</name>
<t>For any selected <tt>actp</tt>, the Authorization Server is the policy decision and
policy enforcement point for actor-chain disclosure. The selected profile
defines the maximum actor-chain information, if any, that may be visible inline
to the next hop.</t>
<t>Accordingly:</t>

<ul spacing="compact">
<li>no other field, identifier encoding, compatibility form, or exchange option
may disclose more actor-chain information than the selected profile permits;</li>
<li>recipients and intermediaries MUST NOT infer hidden actors from omitted
entries, identifier structure, or other claims; and</li>
<li>when a profile hides prior actors or the workflow subject's globally useful
identifier, the Authorization Server MUST enforce that outcome across the
entire issued artifact, not only within <tt>act</tt>.</li>
</ul>
<t>Nothing in this specification redefines RFC 8693 delegation or impersonation
semantics. With <tt>actp</tt> absent, this document adds no new requirements on how
nested <tt>act</tt> is interpreted. With <tt>actp</tt> present, this document defines an
explicit profile-controlled extension in which the visible <tt>act</tt> structure
becomes authoritative for actor-chain processing under that profile.</t>
</section>
</section>

<section anchor="scope-and-model"><name>Scope and Model</name>
<t>This document specifies a family of profiles for representing and validating
actor progression across a workflow path using OAuth 2.0 Token Exchange.</t>
<t>Implementers primarily interested in interoperable behavior can focus first on
Common Basics, Common Validation Procedures, the profile sections, and
Appendices A, B, G, and H. Special preserve-state exchanges, metadata, and the
deeper enforcement rules are intentionally surfaced later so the reader can
learn the ordinary profile flow first. The appendices later in the document
contain background, rationale, threat discussion, and operational guidance that
may be useful for review and deployment planning but are not required for a
first implementation pass.</t>

<section anchor="workflow-model"><name>Workflow Model</name>
<t>The basic workflow path model is:</t>
<t>{::nomarkdown}
&lt;artwork type=&quot;ascii-art&quot;&gt;
A -&gt; B -&gt; C -&gt; D
&lt;/artwork&gt;
{:/nomarkdown}</t>
<t>The first actor initializes the workflow. Each subsequent actor MAY:</t>

<ol spacing="compact">
<li>validate an inbound token;</li>
<li>perform work; and</li>
<li>exchange that token for a new token representing itself toward the next hop.</li>
</ol>
</section>

<section anchor="profile-summary"><name>Profile Summary</name>
<t>This document defines six profiles:</t>

<ul spacing="compact">
<li><strong>Declared Full Disclosure</strong>, which carries the full visible
nested <tt>act</tt> chain in ordinary tokens and relies on AS-asserted chain
continuity under a non-collusion assumption;</li>
<li><strong>Declared Subset Disclosure</strong>, which carries a
recipient-specific disclosed nested <tt>act</tt> chain in ordinary tokens and relies
on the issuing AS for both chain continuity and disclosure policy;</li>
<li><strong>Declared Actor-Only Disclosure</strong>, which carries only the outermost current
actor in ordinary tokens and makes that actor the sole inline authorization
input for the next hop;</li>
<li><strong>Verified Full Disclosure</strong>, which is the verified
full-disclosure case in which every actor and downstream recipient sees the
full visible nested <tt>act</tt> chain;</li>
<li><strong>Verified Subset Disclosure</strong>, which preserves cumulative
commitment state and lets the Authorization Server disclose a
recipient-specific visible nested <tt>act</tt> chain while the current actor signs
the exact actor-visible chain it was allowed to see and extend; and</li>
<li><strong>Verified Actor-Only Disclosure</strong>, which keeps the verified proofs and
cumulative commitment state but discloses only the outermost current actor in
ordinary tokens.</li>
</ul>
<t>The six profiles are organized in two branches so that later profiles can be
read as deltas, not as full restatements:</t>

<ul spacing="compact">
<li>the <strong>declared branch</strong>, rooted at Declared Full Disclosure with two concise
disclosure-mode deltas: subset and actor-only; and</li>
<li>the <strong>verified branch</strong>, consisting of one common verified processing
section plus three disclosure modes: full disclosure, subset disclosure, and
actor-only disclosure.</li>
</ul>
<t>Each derived profile inherits all requirements of its branch root or common
verified processing section except as modified in that profile. Readers
therefore need only read:</t>

<ul spacing="compact">
<li><strong>Declared Full Disclosure</strong> for the declared branch;</li>
<li>the concise delta sections for the declared subset-disclosure and declared
actor-only variants; and</li>
<li><strong>Common Processing for the Verified Branch</strong> plus the concise verified
profile sections for the verified branch.</li>
</ul>
<t>Later sections introduce the additional verified-profile mechanisms only
where they are needed: a one-time bootstrap at workflow start, a per-hop
actor-signed step proof, cumulative commitment state in <tt>actc</tt>, and the
optional <tt>hop_ack</tt> extension. Every profile still issues the same basic
next-hop ordinary token.</t>
<t>The following table is a quick orientation aid.</t>
<table>
<thead>
<tr>
<th>Profile</th>
<th>Visible <tt>act</tt> in ordinary tokens</th>
<th><tt>actc</tt></th>
<th>Recipient-specific disclosure</th>
<th>Next-hop authorization basis</th>
<th>Primary trust/evidence model</th>
</tr>
</thead>

<tbody>
<tr>
<td>Declared Full Disclosure</td>
<td>Full nested chain</td>
<td>No</td>
<td>No</td>
<td>Full visible chain</td>
<td>AS-asserted continuity</td>
</tr>

<tr>
<td>Declared Subset Disclosure</td>
<td>Disclosed nested subset or omitted <tt>act</tt></td>
<td>No</td>
<td>Yes</td>
<td>Disclosed visible subset only; undisclosed actors unavailable from the artifact</td>
<td>AS-asserted continuity plus AS disclosure policy</td>
</tr>

<tr>
<td>Declared Actor-Only Disclosure</td>
<td>Outermost current actor only</td>
<td>No</td>
<td>Fixed actor-only</td>
<td>Current actor only</td>
<td>AS-asserted continuity plus actor-only disclosure policy</td>
</tr>

<tr>
<td>Verified Full Disclosure</td>
<td>Full nested chain</td>
<td>Yes</td>
<td>No</td>
<td>Full visible chain plus commitment continuity</td>
<td>Actor-signed visible-chain proofs plus cumulative commitment</td>
</tr>

<tr>
<td>Verified Subset Disclosure</td>
<td>Disclosed nested subset or omitted <tt>act</tt></td>
<td>Yes</td>
<td>Yes</td>
<td>Disclosed visible subset only; undisclosed actors unavailable from the artifact, plus commitment continuity</td>
<td>Actor-signed visible-chain proofs plus recipient-specific disclosure</td>
</tr>

<tr>
<td>Verified Actor-Only Disclosure</td>
<td>Outermost current actor only</td>
<td>Yes</td>
<td>Fixed actor-only</td>
<td>Current actor only plus commitment continuity</td>
<td>Actor-signed visible-chain proofs plus cumulative commitment with actor-only disclosure</td>
</tr>
</tbody>
</table></section>

<section anchor="branching-and-non-goals"><name>Branching and Non-Goals</name>
<t>Application logic may branch, fan out, and run in parallel. This document
standardizes one visible path per issued token, not a full call-graph language.
An Authorization Server MAY mint multiple accepted successor tokens from one
prior accepted state, each with its own <tt>jti</tt> and canonical <tt>target_context</tt>.
Such successor tokens MAY share the same <tt>acti</tt> and earlier workflow history.
Deployments that require strict linear continuation MAY instead enforce a local
single-successor policy under which the Authorization Server accepts at most one
successor from any accepted prior state. This base specification does not
define an interoperable on-the-wire signal for single-successor mode, sibling
invalidation, or proof that no parallel successor exists. This document does
not define merge semantics, sibling-discovery semantics, or inline
branch-selection semantics.</t>
<t>Post-facto reconstruction of branching is a forensic or legal-audit concern,
not a normal online authorization requirement. Retained Authorization Server
records, timestamps, commitment state, and causal links among presenting
actors, current actors, and subsequent actors can often reveal much of the
effective call graph, but this base specification alone does not guarantee a
complete standardized graph across all branches.</t>
<t>An issued token MAY still carry an <tt>aud</tt> string or array according to JWT and
OAuth conventions, but each issued token and each step proof binds exactly one
canonical next-hop <tt>target_context</tt>. Additional target contexts require
additional successor tokens.</t>
<t>Repeated ActorID values within one workflow instance are permitted. A sequence
such as <tt>[A,B,C,D,A,E]</tt> denotes that actor <tt>A</tt> acted more than once in the
same workflow instance. Collecting all accepted hop evidence for one <tt>acti</tt>,
such as retained tokens, proofs, commitments, and exchange records, can
therefore reconstruct the accepted hop sequence, including repeated-actor
revisits.</t>
</section>
</section>

<section anchor="protocol-overview"><name>Protocol Overview</name>

<section anchor="workflow-progression"><name>Workflow Progression</name>
<t>The actor chain advances only when an actor acts. Mere receipt of a token does
not append the recipient.</t>
<t>If <tt>A</tt> calls <tt>B</tt>, and <tt>B</tt> later calls <tt>C</tt>, then:</t>

<ol spacing="compact">
<li><tt>A</tt> begins the workflow and becomes the initial actor.</li>
<li>When <tt>A</tt> calls <tt>B</tt>, <tt>B</tt> validates a token representing <tt>A</tt>.</li>
<li>When <tt>B</tt> later exchanges that token to call <tt>C</tt>, <tt>B</tt> becomes the next
actor.</li>
<li><tt>C</tt> is not appended merely because <tt>C</tt> received a token. <tt>C</tt> is appended
only if <tt>C</tt> later acts toward another hop.</li>
</ol>
<t>Compact end-to-end examples appear in Appendix B.</t>
</section>

<section anchor="same-domain-and-cross-domain-hops"><name>Same-Domain and Cross-Domain Hops</name>
<t>Within one trust domain, the current actor exchanges its inbound token at its
home Authorization Server, meaning the Authorization Server that validates the
prior chain state for that actor and issues the next ordinary token.</t>
<t>Across a trust boundary, if the next recipient does not trust the current
Authorization Server directly, the current actor performs a second token
exchange at the next domain's Authorization Server. That second exchange
preserves the already-established chain state and does not append the next
recipient.</t>
<t>The trust/evidence differences among profiles are summarized in the profile
matrix above and discussed further in Appendix J. The special preserve-state
cases for cross-domain re-issuance and Refresh-Exchange are defined later, after
the ordinary profile flows.</t>
</section>
</section>

<section anchor="common-basics"><name>Common Basics</name>

<section anchor="common-token-requirements"><name>Common Token Requirements</name>
<t>Unless stated otherwise, &quot;ordinary token&quot; below means the access token
issued to the current actor for presentation to the next hop.
This section is about those tokens, not about verified-profile step proofs,
bootstrap context handles, or <tt>hop_ack</tt> objects.</t>
<t>In the interoperable self-contained ordinary-token binding defined by this
document, tokens issued under any profile:</t>

<ul spacing="compact">
<li>MUST be short-lived;</li>
<li><t>MUST contain:</t>

<ul spacing="compact">
<li>an issuer claim <tt>iss</tt>;</li>
<li>a profile identifier claim <tt>actp</tt>;</li>
<li>an actor-chain identifier claim <tt>acti</tt>;</li>
<li>a subject claim <tt>sub</tt>;</li>
<li>a unique token identifier claim <tt>jti</tt>;</li>
<li>an audience value <tt>aud</tt>; and</li>
<li>an expiry value <tt>exp</tt>.</li>
</ul></li>
</ul>
<t>A profile-governed ordinary token MAY additionally contain <tt>act</tt> according to
the selected profile and Authorization Server policy.</t>
<t>For interoperability and predictable freshness, deployments SHOULD use
ordinary-token lifetimes on the order of minutes rather than hours; a default
range of 1 to 10 minutes is RECOMMENDED. Validators SHOULD allow only modest
clock skew when evaluating <tt>exp</tt>, typically no more than 60 seconds unless
local clock discipline justifies a tighter bound.</t>
<t>Proof-bound profiles additionally MUST carry <tt>actc</tt>.</t>
<t>The token claims used by this document have these roles:</t>

<ul spacing="compact">
<li><tt>iss</tt> identifies the issuer namespace of the ordinary token and of that
token's top-level <tt>sub</tt>;</li>
<li><tt>actp</tt> identifies the selected actor-chain profile;</li>
<li><tt>acti</tt> identifies the workflow instance;</li>
<li><tt>sub</tt> identifies the workflow subject of the token;</li>
<li><tt>act</tt>, when present, carries the authoritative disclosed actor-chain
fragment for that artifact; and</li>
<li><tt>actc</tt>, when present, carries cumulative commitment state for stronger
tamper evidence, continuity, and auditability.</li>
</ul>
<t>This base specification defines interoperable direct claim carriage for
self-contained ordinary tokens. Deployments that instead use opaque access
tokens MAY keep authoritative workflow state only at the issuing Authorization
Server and MAY disclose actor-chain information, if any, through a companion
token-validation interface such as token introspection {{!RFC7662}}.</t>
<t>This specification does not define such companion interfaces. If the artifact
presented for validation does not expose enough information to satisfy the
selected profile's requirements, the implementation MUST treat that as a
profile-validation failure.</t>
<t>At workflow bootstrap, the issuing Authorization Server MUST establish the
workflow subject according to local policy and the selected disclosure profile.
The resulting <tt>sub</tt> value MAY be an ordinary subject identifier, a pairwise
identifier, or a workflow-local stable alias. For privacy-sensitive
subset-disclosure operation, the Authorization Server SHOULD choose a stable
representation that does not reveal a globally useful subject identifier to
recipients that are not entitled to learn it.</t>
<t>For same-domain token exchange and Refresh-Exchange, this specification
preserves that exact chosen <tt>sub</tt> representation within the same domain for the
lifetime of the workflow unless a later permitted cross-domain alias transition
occurs. Cross-domain re-issuance MAY translate <tt>sub</tt> only under the semantic-
equivalence rule defined later. This document does not define a same-workflow
subject-transition mechanism.</t>
<t>The chosen <tt>sub</tt> representation for a workflow MUST remain consistent with the
selected <tt>actp</tt> disclosure constraints. In particular, <tt>sub</tt> MUST NOT disclose
an actor identity or other actor-chain information that the selected profile is
intended to withhold from the relevant recipient class.</t>
<t>In this self-contained JWT/JWS binding, a returned ordinary token is visible
to the current actor that receives it and to the next recipient that validates
it. Therefore, when a profile returns a visible <tt>act</tt>, the Authorization Server
MUST NOT disclose in that returned token any actor identity that the current
actor is not permitted to learn. A future recipient-protected disclosure
mechanism or encrypted binding may support stronger recipient-only
redisclosure, but that is outside this base specification.</t>
</section>

<section anchor="actor-chain-identifier"><name>Actor-Chain Identifier</name>
<t>The <tt>acti</tt> value:</t>

<ul spacing="compact">
<li>MUST be minted once at workflow start by the issuing Authorization Server;</li>
<li>MUST be generated using a cryptographically secure pseudorandom number
generator (CSPRNG) with at least 122 bits of entropy;</li>
<li>MUST remain unchanged for the lifetime of that workflow instance; and</li>
<li>MUST NOT be used to signal profile selection.</li>
</ul>
<t>Implementation note: standard UUID version 4 (UUIDv4), which provides 122 bits
of random entropy, is acceptable for <tt>acti</tt> in this version. Deployments MAY use stronger
generation (for example, full 128-bit random values) by local policy.</t>
<t>Profile selection MUST be signaled explicitly using the token request parameter
<tt>actor_chain_profile</tt> and the corresponding token claim
<tt>actp</tt>.</t>
</section>

<section anchor="target-context-requirements"><name>Target Context Requirements</name>
<t><tt>target_context</tt> is the canonical next-hop target value bound into verified
profile step proofs and, when used, into <tt>hop_ack</tt>.</t>
<t>In this base specification, <tt>aud</tt> identifies the intended recipient service or
audience of the issued token. An optional <tt>resource</tt> value can further identify
a narrower protected resource, API surface, or object within that audience.
When no finer-grained targeting inputs are used, the canonical target context is
still a JSON object that contains only <tt>aud</tt>.</t>
<t>The following normative requirements apply to <tt>target_context</tt>.</t>
<t>For every profile-defined signed, hashed, compared, retained, or communicated
use in this specification, <tt>target_context</tt> MUST be a JSON object.</t>
<t><tt>target_context</tt> MUST contain an <tt>aud</tt> member carrying the verified audience
information exactly in the profile-defined canonical representation. If <tt>aud</tt> is
a string, <tt>target_context.aud</tt> MUST be that same JSON string. If <tt>aud</tt> is an
array of strings, <tt>target_context.aud</tt> MUST be that exact JSON array, preserving
element order.</t>
<t>If no additional target-selection values are used, <tt>target_context</tt> MUST be the
single-member object <tt>{ &quot;aud&quot;: aud }</tt>.</t>
<t>A deployment MAY additionally include:</t>

<ul spacing="compact">
<li><tt>resource</tt>, when the hop is bound to a narrower protected resource or API
surface within the audience;</li>
<li><tt>request_id</tt>, when the deployment expects multiple distinct accepted
successors under the same prior state and the same nominal target; and</li>
<li>other local extension members used by same-domain local authorization policy.</li>
</ul>
<t>This base specification assigns interoperable security semantics only to <tt>aud</tt>,
optional <tt>resource</tt>, and optional <tt>request_id</tt>. Cross-domain equivalence or
narrowing decisions defined by this document MUST be evaluated using only those
members unless a future companion specification defines additional target-context
members and their semantics.</t>
<t>When a deployment expects multiple distinct successors under the same prior
state and the same nominal target, it MUST include a request-unique
discriminator such as <tt>request_id</tt> inside <tt>target_context</tt>.</t>
<t><tt>target_context</tt> members MUST NOT disclose actor identities or other actor-chain
information that the selected <tt>actp</tt> would withhold from the relevant holder of
the artifact.</t>
<t>An Authorization Server that validates, preserves, or audits workflow
continuity using <tt>target_context</tt> MUST retain the exact canonical
<tt>target_context</tt> value for the accepted hop, or enough original request
material to reconstruct that exact canonical value later.</t>
<t>Whenever <tt>target_context</tt> is incorporated into a profile-defined signature or
commitment input in this JWT-based version, it MUST be represented as a JSON
object and canonicalized exactly once as part of the enclosing JSON
Canonicalization Scheme (JCS)-serialized payload object. Equality checks over
<tt>target_context</tt> MUST therefore compare the exact JSON object value after JCS
canonicalization. Implementations MUST NOT collapse an audience array to a
string, replace an object with a bare <tt>aud</tt> value, reorder array elements, or
otherwise rewrite the verified audience structure before signing or comparing
<tt>target_context</tt>.</t>
</section>

<section anchor="canonicalization"><name>Canonicalization</name>
<t>All profile-defined signed or hashed inputs MUST use a canonical serialization
defined by this specification.</t>
<t>In this version of the specification, <tt>CanonicalEncode(x)</tt> means JCS
{{!RFC8785}} applied to the JSON value <tt>x</tt>.</t>
<t><tt>Hash_halg(x)</tt> denotes the raw hash output produced by applying the selected
commitment hash algorithm <tt>halg</tt> to the octet sequence <tt>x</tt>.</t>
<t><tt>b64url(x)</tt> denotes the base64url encoding of the octet sequence <tt>x</tt> without
trailing padding characters, as defined by {{!RFC7515}} Appendix C.</t>
<t>Canonical profile-defined proof payloads MUST be serialized using JCS {{!RFC8785}}.</t>
</section>

<section anchor="actor-identity-representation"><name>Actor Identity Representation</name>
<t>This specification requires a canonical representation for actor identity in
profile-defined visible-chain entries and step proofs.</t>
<t>Each canonical actor identifier used by this specification MUST be
represented as an ActorID structure containing exactly two members:</t>

<ul spacing="compact">
<li><tt>iss</tt>: the issuer identifier naming the namespace in which the actor subject
value is defined; and</li>
<li><tt>sub</tt>: the subject identifier of the actor within that issuer namespace.</li>
</ul>
<t>An ActorID is a JSON object with members <tt>iss</tt> and <tt>sub</tt>, serialized using JCS {{!RFC8785}} when incorporated into profile-defined signed or hashed inputs.</t>
<t>An ActorID:</t>

<ul spacing="compact">
<li>MUST be stable for equality comparison within a workflow instance;</li>
<li>MUST be bound to the actor identity accepted under local policy for the
relevant exchange, proof-verification, or acknowledgment-validation step;</li>
<li>MUST be compared using exact equality of the pair (<tt>iss</tt>, <tt>sub</tt>); and</li>
<li>SHOULD support pairwise or pseudonymous subject values where deployment
policy allows.</li>
</ul>
<t>When deriving an ActorID from a validated inbound token:</t>

<ul spacing="compact">
<li>for the token subject, use <tt>{ &quot;iss&quot;: token.iss, &quot;sub&quot;: token.sub }</tt>;</li>
<li>for a validated <tt>act</tt> claim that contains both <tt>iss</tt> and <tt>sub</tt>, use those two
values directly; and</li>
<li>for a validated <tt>act</tt> claim that contains <tt>sub</tt> but omits <tt>iss</tt>, use the
enclosing token's <tt>iss</tt> as the ActorID <tt>iss</tt> value and the <tt>act.sub</tt> value as
the ActorID <tt>sub</tt> value.</li>
</ul>
<t>If no usable <tt>act</tt> claim is present and a profile needs the presenting actor,
that actor MUST be established from actor authentication or other locally
trusted inputs outside the scope of this specification and mapped into the same
ActorID representation the issuing Authorization Server uses for proof
construction.</t>
<t>When <tt>actp</tt> is present, the <tt>act</tt> structure used by this specification is an
ActorChainNode. An ActorChainNode is an ActorID object plus an OPTIONAL nested
member named <tt>act</tt> whose value is another ActorChainNode representing the
immediately prior visible actor. Newly issued profile-defined <tt>act</tt> structures
MUST carry explicit <tt>iss</tt> and <tt>sub</tt> in every visible node. Implementations
MUST be able to decode and normalize a validated inbound visible chain even
when a node omits <tt>iss</tt> and inherits the enclosing issuer according to the
derivation rule above.</t>
<t>The helper functions used throughout this document are therefore:</t>
<t>{::nomarkdown}
&lt;sourcecode type=&quot;text&quot;&gt;
VisibleChain(act) = ordered list of ActorID values obtained by recursively
                    reading nested <tt>act</tt> from the innermost prior actor to the
                    outermost current actor.</t>
<t>EncodeVisibleChain([A]) = {&quot;iss&quot;: A.iss, &quot;sub&quot;: A.sub}
EncodeVisibleChain([A,B]) = {&quot;iss&quot;: B.iss, &quot;sub&quot;: B.sub, &quot;act&quot;:
                             {&quot;iss&quot;: A.iss, &quot;sub&quot;: A.sub}}
EncodeVisibleChain([A,B,C]) = {&quot;iss&quot;: C.iss, &quot;sub&quot;: C.sub, &quot;act&quot;:
                               {&quot;iss&quot;: B.iss, &quot;sub&quot;: B.sub, &quot;act&quot;:
                                {&quot;iss&quot;: A.iss, &quot;sub&quot;: A.sub}}}
&lt;/sourcecode&gt;
{:/nomarkdown}</t>
<t>In examples and formulas, <tt>[A,B]</tt> denotes the ordered visible chain of ActorID
values for actors <tt>A</tt> and <tt>B</tt>, while <tt>EncodeVisibleChain([A,B])</tt> denotes the
nested JSON representation carried in <tt>act</tt>.</t>
</section>

<section anchor="artifact-typing"><name>Artifact Typing</name>
<t>JWT-based artifacts defined by this specification MUST use explicit <tt>typ</tt>
values.</t>
<t>The following JWT <tt>typ</tt> values are defined:</t>

<ul spacing="compact">
<li><tt>act-step-proof+jwt</tt></li>
<li><tt>act-commitment+jwt</tt></li>
<li><tt>act-hop-ack+jwt</tt></li>
</ul>
<t>Verifiers MUST enforce mutually exclusive validation rules based on artifact
type and MUST NOT accept one artifact type in place of another. They MUST verify
the expected JWT <tt>typ</tt>, exact <tt>ctx</tt> value where applicable, and artifact-specific payload structure defined by the relevant binding section of this
specification.</t>
</section>

<section anchor="issued-token-type"><name>Issued Token Type</name>
<t>Unless another application profile explicitly states otherwise, tokens issued
under this specification are access tokens.</t>
<t>Token exchange responses MUST use the RFC 8693 token type fields consistently
with the underlying representation and deployment.</t>
</section>

<section anchor="commitment-hash-algorithms"><name>Commitment Hash Algorithms</name>
<t>Proof-bound profiles use a named hash algorithm for construction of
<tt>actc</tt>. Commitment hash algorithm identifiers are values from the IANA Named
Information Hash Algorithm Registry {{!RFC6920}} {{IANA.Hash.Algorithms}}.</t>
<t>The following requirements apply:</t>

<ul spacing="compact">
<li><tt>halg</tt> MUST be a text string naming a hash algorithm from the IANA Named
Information Hash Algorithm Registry.</li>
<li>Implementations supporting verified profiles MUST implement <tt>sha-256</tt>.</li>
<li>Implementations SHOULD implement <tt>sha-384</tt>.</li>
<li>Every <tt>actc</tt> object and every verified profile bootstrap context MUST carry
an explicit <tt>halg</tt> value. Verifiers MUST NOT infer or substitute <tt>halg</tt> when
it is absent.</li>
<li>Verifiers MUST enforce a locally configured allow-list of acceptable
commitment hash algorithms and MUST NOT accept algorithm substitution based
solely on attacker-controlled inputs.</li>
<li>Hash algorithms with truncated outputs, including truncated <tt>sha-256</tt>
variants, MUST NOT be used with this specification.</li>
<li>Additional registry values MAY be used only if they are permitted by this
specification or a future Standards Track update to it, and verifiers MUST
reject locally deprecated or disallowed algorithms.</li>
<li>An Authorization Server MUST NOT initiate a new workflow using a locally
deprecated or disallowed algorithm. Whether an already-issued workflow using
such an algorithm may continue is a matter of local policy.</li>
</ul>
</section>

<section anchor="commitment-function"><name>Commitment Function</name>
<t>Proof-bound profiles use <tt>actc</tt> to bind each accepted hop to the
prior accepted state. The commitment hash algorithm is selected once for the
workflow by the issuing Authorization Server during bootstrap and remains fixed
for the lifetime of that workflow instance.</t>
<t>Each <tt>actc</tt> value is a signed commitment object whose payload
contains:</t>

<ul spacing="compact">
<li><tt>ctx</tt>: the context string <tt>actor-chain-commitment-v1</tt>;</li>
<li><tt>iss</tt>: the issuer identifier of the Authorization Server that signs this
commitment object;</li>
<li><tt>acti</tt>: the actor-chain identifier;</li>
<li><tt>actp</tt>: the active profile identifier;</li>
<li><tt>halg</tt>: the hash algorithm identifier;</li>
<li><tt>prev</tt>: the prior commitment digest, or the bootstrap <tt>initial_chain_seed</tt> at
workflow start;</li>
<li><tt>step_hash</tt>: <tt>b64url(Hash_halg(step_proof_bytes))</tt>; and</li>
<li><tt>curr</tt>: <tt>b64url(Hash_halg(CanonicalEncode({ctx, iss, acti, actp, halg, prev, step_hash})))</tt>.</li>
</ul>
<t>The <tt>curr</tt> value MUST be computed over exactly the seven members <tt>ctx</tt>, <tt>iss</tt>,
<tt>acti</tt>, <tt>actp</tt>, <tt>halg</tt>, <tt>prev</tt>, and <tt>step_hash</tt>, excluding <tt>curr</tt> itself. The
resulting digest is then inserted as the transported <tt>curr</tt> member.</t>
<t>Let <tt>prev_digest</tt> denote the prior commitment-state digest for the step being
processed: at bootstrap it is the <tt>initial_chain_seed</tt>, and for later steps it
is the verified <tt>curr</tt> value extracted from the inbound <tt>actc</tt>.
For the JWT binding defined in this version, let <tt>step_proof_bytes</tt> denote the
ASCII bytes of the exact compact JWS string submitted as
<tt>actor_chain_step_proof</tt>.
Let <tt>as_issuer_id</tt> denote the issuer identifier that the Authorization Server
places into the commitment object's <tt>iss</tt> member, typically its issuer value.
The commitment hash therefore binds the transmitted step-proof artifact, not
merely its decoded payload.</t>
<t>When a profile-defined proof input refers to a prior
<tt>actc</tt>, the value incorporated into the proof input MUST be
that prior commitment's verified <tt>curr</tt> digest string, copied directly from the
validated <tt>actc</tt> payload, not the raw serialized commitment object.</t>
<t>The abstract function used throughout this document is therefore:</t>
<t>{::nomarkdown}
&lt;sourcecode type=&quot;text&quot;&gt;
Commit_AS(as_issuer_id, acti, actp, prev_digest, step_proof_bytes, halg)
  = AS-signed commitment object over payload {
      ctx,
      iss,
      acti,
      actp,
      halg,
      prev = prev_digest,
      step_hash = b64url(Hash_halg(step_proof_bytes)),
      curr = b64url(Hash_halg(CanonicalEncode({ctx, iss, acti, actp, halg, prev, step_hash})))
    }
&lt;/sourcecode&gt;
{:/nomarkdown}</t>
<t>The exact wire encoding of the signed commitment object is defined in the JWT
binding in Appendix A.</t>
<t>In calls to <tt>Commit_AS</tt>, the <tt>iss</tt> input is the issuer identifier of the
Authorization Server signing the new commitment object, and <tt>acti</tt> and <tt>actp</tt>
are the workflow and profile values being preserved for that workflow state.</t>
</section>

<section anchor="common-cryptographic-operations"><name>Common Cryptographic Operations</name>
<t>The verified profiles use a small number of proof-input templates. This
section defines them once so that profile sections can state only their
profile-specific substitutions.</t>
<t>Let:</t>

<ul spacing="compact">
<li><tt>profile</tt> be the active <tt>actp</tt> value;</li>
<li><tt>acti</tt> be the stable actor-chain identifier;</li>
<li><tt>prev_state</tt> be either the returned base64url <tt>initial_chain_seed</tt> from
bootstrap or the verified prior commitment digest string from <tt>actc.curr</tt>, as
required by the profile;</li>
<li><tt>visible_actor_chain_for_hop</tt> be the exact ordered actor-visible chain for
the hop after appending the authenticated current actor;</li>
<li><tt>workflow_sub</tt> be the exact preserved workflow <tt>sub</tt> string for the hop being
extended within the current issuer domain;</li>
<li><tt>TC_next</tt> be the canonical <tt>target_context</tt> for the next hop, often the
object <tt>{ &quot;aud&quot;: aud }</tt> but extended when local policy needs finer-grained
target binding; and</li>
<li><tt>[N]</tt> denote the canonical ActorID JSON object representation of the
authenticated current actor.</li>
</ul>
<t>Symbols such as <tt>TC_B</tt>, <tt>TC_C</tt>, and <tt>TC_next</tt> denote the canonical
<tt>target_context</tt> for the corresponding next hop.</t>
<t>Proof-bound profiles instantiate the following generic step-proof payload
template:</t>
<t>{::nomarkdown}
&lt;sourcecode type=&quot;json&quot;&gt;
Sign_N({
  &quot;ctx&quot;: ds(profile),
  &quot;acti&quot;: acti,
  &quot;prev&quot;: prev_state,
  &quot;sub&quot;: workflow_sub,
  &quot;act&quot;: EncodeVisibleChain(visible_actor_chain_for_hop),
  &quot;target_context&quot;: TC_next
})
&lt;/sourcecode&gt;
{:/nomarkdown}</t>
<t>The domain-separation string <tt>ds</tt> is profile-specific:</t>

<ul spacing="compact">
<li><tt>actor-chain-verified-full-step-sig-v1</tt> for Verified Full Disclosure;</li>
<li><tt>actor-chain-verified-subset-step-sig-v1</tt> for Verified Subset Disclosure; and</li>
<li><tt>actor-chain-verified-actor-only-step-sig-v1</tt> for Verified Actor-Only Disclosure.</li>
</ul>
<t>These strings remain distinct even though the verified branch step-proof
payload members are structurally aligned. The signed step-proof payload does not
carry <tt>actp</tt> or another explicit profile identifier, and the meaning of the
<tt>act</tt> member remains profile-dependent. Distinct domain-separation strings are
therefore REQUIRED to bind the proof to the intended verified profile
semantics and to prevent cross-profile proof confusion or accidental proof
reuse.</t>
<t>In same-domain verified chain-extension hops, the step proof also binds the
exact preserved workflow <tt>sub</tt> string for that hop. This protects against
same-domain silent subject substitution without requiring this base
specification to cryptographically bind later cross-domain <tt>sub</tt> aliasing.</t>
<t>The profile-specific meaning of <tt>visible_actor_chain_for_hop</tt> is:</t>

<ul spacing="compact">
<li>for <strong>Verified Full Disclosure</strong>, the full visible chain for the
hop after appending the authenticated current actor;</li>
<li>for <strong>Verified Subset Disclosure</strong>, the exact inbound visible
chain verified by the current actor, with that current actor appended; and</li>
<li>for <strong>Verified Actor-Only Disclosure</strong>, that same exact inbound
disclosed visible chain verified by the current actor, with that current
actor appended, even though the returned ordinary token later discloses only
<tt>[N]</tt>.</li>
</ul>
<t>For verified subset-disclosure operation, any visible <tt>act</tt> disclosed to the
next recipient in this JWT/JWS binding MUST be derived from the verified
<tt>visible_actor_chain_for_hop</tt> and MUST be an ordered subsequence of it.
A singleton current-actor-only form <tt>[N]</tt> is syntactically representable under
subset disclosure, but this document also defines explicit actor-only profiles
so that such policy remains machine-readable. Omission of <tt>act</tt> is also
permitted under the subset profiles. A future recipient-protected disclosure
mechanism MAY define stronger redisclosure from Authorization-Server-retained
authoritative workflow state without requiring the presenting actor to learn
the broader disclosure, but that is outside this base specification.</t>
</section>
</section>

<section anchor="profile-selection-and-workflow-immutability"><name>Profile Selection and Workflow Immutability</name>
<t>This specification uses capability discovery plus explicit profile selection,
not interactive profile negotiation.</t>
<t>An actor requesting a token under this specification MUST select exactly one
<tt>actor_chain_profile</tt> value for that request. The Authorization Server MUST
either issue a token whose <tt>actp</tt> equals that requested profile identifier or
reject the request.</t>
<t>For a given workflow instance identified by <tt>acti</tt>, <tt>actp</tt> is immutable.
Accordingly, every accepted chain state within that workflow instance carries
the same <tt>actp</tt>. Any token exchange, cross-domain re-issuance, or
Refresh-Exchange that would change <tt>actp</tt> for that workflow instance MUST be
rejected. A current actor MUST reject any returned token whose <tt>actp</tt> differs
from the profile it requested or from the preserved profile state already
represented by the inbound token.</t>
<t>Profile switching therefore requires starting a new workflow instance with a
new <tt>acti</tt>, not continuing an existing accepted chain state.</t>
</section>

<section anchor="common-validation-procedures"><name>Common Validation Procedures</name>
<t>This section gives the short validation checklists that the profile sections
reuse. Detailed enforcement rules for actor authentication inputs, proof-key
binding, intended-recipient handling, and replay or freshness are collected
later in &quot;Common Security and Enforcement Requirements&quot;.</t>
<t>Implementations can think of validation in three layers:</t>

<ul spacing="compact">
<li><strong>Layer 1: Admission</strong> -- JWT signature, issuer trust, expiry, audience,
intended-recipient checks, and any locally established presenting-actor or
current-actor continuity checks required for that processing step.</li>
<li><strong>Layer 2: Profile authorization</strong> -- interpretation of the visible nested
<tt>act</tt> according to <tt>actp</tt> and application of local authorization policy using
only the visible chain that the profile exposes.</li>
<li><strong>Layer 3: Continuity and audit evidence</strong> -- validation of <tt>actc</tt>, step
proofs, acknowledgments, and retained Authorization Server records.</li>
</ul>
<t>Recipients that only consume an inbound token MAY apply Layer 3 according to
local policy. Current actors that extend a verified workflow, and
Authorization Servers that accept verified profile token exchange, MUST
validate the inbound <tt>actc</tt> and any required step proof before extending the
workflow.</t>

<section anchor="recipient-validation-of-an-inbound-token"><name>Recipient Validation of an Inbound Token</name>
<t>Unless a profile states otherwise, a recipient validating an inbound actor-chain
token MUST verify:</t>

<ul spacing="compact">
<li>token signature;</li>
<li>issuer trust;</li>
<li>profile identifier (<tt>actp</tt>);</li>
<li>presence and correct format of profile-required structural claims (<tt>actc</tt>
and any profile-required disclosed <tt>act</tt> according to <tt>actp</tt>);</li>
<li>expiry and replay requirements;</li>
<li>intended-recipient requirements; and</li>
<li>any profile-specific disclosed-chain checks.</li>
</ul>
<t>If a disclosed <tt>act</tt> is present, a recipient MUST decode the visible chain as
<tt>VisibleChain(act)</tt> and apply the profile-specific checks on that visible
chain. If the selected profile requires disclosed current-actor continuity and
the recipient establishes a presenting-actor identity for the inbound hop under
local policy, the recipient MUST also verify that the outermost <tt>act</tt> identifies
that same presenting actor. If the selected profile requires inline <tt>act</tt>
disclosure, omission of <tt>act</tt>, or presence of an <tt>act</tt> that violates the
profile's required disclosure rules, MUST be treated as a profile-validation
failure.</t>
<t>A recipient MUST use only the actor-chain information actually disclosed in the
inbound artifact for authorization. It MUST treat undisclosed prior actors, and
an undisclosed current actor, as unavailable from that artifact.</t>
</section>

<section anchor="authorization-server-validation-of-token-exchange"><name>Authorization Server Validation of Token Exchange</name>
<t>Unless a profile states otherwise, an Authorization Server validating an
actor-chain token exchange MUST verify:</t>

<ul spacing="compact">
<li>the inbound token signature and issuer trust;</li>
<li>the authenticated identity of the current actor;</li>
<li>intended-recipient semantics for the inbound token;</li>
<li>the selected profile identifier and any profile-specific step-proof
requirements;</li>
<li>the preserved <tt>acti</tt> and <tt>sub</tt> continuity expected for the workflow; and</li>
<li>any profile-specific disclosed-chain checks on any inbound <tt>act</tt>.</li>
</ul>
<t>If the inbound token discloses visible chain state, the Authorization Server
MUST decode <tt>VisibleChain(act_in)</tt> from the inbound token exactly as verified
for the current actor and MUST perform only append-only operations on that
disclosed visible chain fragment. If the selected profile requires disclosed
current-actor continuity, the Authorization Server MUST additionally verify
that the outermost <tt>act</tt> of the inbound token identifies the same actor that
authenticated as the current actor and is presenting that inbound hop for
exchange. If the selected profile requires inline <tt>act</tt> disclosure, omission of
<tt>act</tt>, or presence of an <tt>act</tt> that violates the profile's required disclosure
rules, MUST be treated as a profile-validation failure.</t>
<t>This specification does not define validation or handling rules for
<tt>may_act</tt>. Any effect of <tt>may_act</tt> is determined by RFC 8693, by the
specification governing the artifact that carries it, or by local policy. Such
use MUST NOT cause an artifact issued under this specification, or any related
protocol-visible outcome, to disclose actor-chain information that the
selected profile would withhold.</t>
<t>A token-exchange request under this specification MAY additionally carry the RFC
8693 <tt>actor_token</tt> and <tt>actor_token_type</tt> parameters. This specification does
not define whether or how <tt>actor_token</tt> contributes actor-related policy input.
Any such effect is determined by RFC 8693, by the specification governing that
artifact, or by local policy. Such use MUST NOT expand disclosure beyond the
selected profile and Authorization Server policy, and MUST NOT alter required
<tt>acti</tt>, <tt>actp</tt>, or <tt>sub</tt> continuity.</t>
<t>If neither <tt>may_act</tt> nor <tt>actor_token</tt> contributes actor-related policy input,
the Authorization Server applies local policy. For this specification, local
policy can include trust relationships, authenticated client identity,
permitted target contexts, chain-depth limits, profile support, and business or
risk controls.</t>
</section>

<section anchor="current-actor-validation-of-a-returned-token"><name>Current-Actor Validation of a Returned Token</name>
<t>Unless a profile states otherwise, a current actor validating a returned token
MUST verify:</t>

<ul spacing="compact">
<li>token signature and issuer trust;</li>
<li>that the returned <tt>actp</tt> equals the requested profile identifier and any
preserved active profile state;</li>
<li>that the returned <tt>acti</tt> equals the actor-chain identifier already represented by
the inbound token or bootstrap state;</li>
<li>that the returned <tt>sub</tt> equals the expected preserved workflow-subject value;</li>
<li>expiry and replay requirements; and</li>
<li>any profile-specific disclosed-chain or commitment checks.</li>
</ul>
<t>If a returned token discloses <tt>act</tt>, the current actor MUST verify that the
disclosed <tt>act</tt> conforms to the selected profile and Authorization Server
policy for that hop. If the selected profile requires inline <tt>act</tt> disclosure,
omission of <tt>act</tt>, or presence of an <tt>act</tt> that violates the profile's
required disclosure rules, MUST be treated as a profile-validation failure.</t>
<t>For readable full-disclosure profiles, the current actor MUST verify that the
returned visible chain equals the full verified chain for that hop. For
subset-disclosure profiles, if the returned token discloses <tt>act</tt>, the current
actor MUST verify that the returned visible chain is an ordered subsequence of
the exact verified actor-visible chain that the actor signed or otherwise
caused to be asserted for that hop. For actor-only profiles, the current actor
MUST verify that the returned visible <tt>act</tt> consists only of the outermost
current actor and that this actor is the current actor that requested or caused
the hop.</t>
</section>
</section>

<section anchor="profiles"><name>Profiles</name>
<t>The profile selection table appears earlier in &quot;Scope and Model&quot;. The sections
below present the ordinary chain-extending profile flows first. Each profile
depends on the common recipient, Authorization Server, and returned-token
validation procedures defined earlier, plus the later common security and
enforcement rules. Special preserve-state exchanges, metadata, and deeper
enforcement details appear later so they do not interrupt the main profile
story.</t>
</section>

<section anchor="declared-full-disclosure-profile"><name>Declared Full Disclosure Profile</name>

<section anchor="profile-identifier"><name>Profile Identifier</name>
<t>The profile identifier string for this profile is
<tt>declared-full</tt>. It is used as the <tt>actor_chain_profile</tt> token
request parameter value and as the <tt>actp</tt> token claim value.</t>
</section>

<section anchor="objective"><name>Objective</name>
<t>The Declared Full Disclosure profile extends token exchange by carrying the
full visible nested <tt>act</tt> chain in every ordinary token and by requiring
chain-continuity validation by both the current actor and the issuing
Authorization Server at each hop.</t>
</section>

<section anchor="security-model"><name>Security Model</name>
<t>This profile provides hop-by-hop visible-chain integrity based on
issuer-asserted chain state and continuity checks.</t>
<t>This profile assumes that an actor does not collude with its home
Authorization Server.</t>
</section>

<section anchor="bootstrap"><name>Bootstrap</name>
<t>At workflow start, actor <tt>A</tt> MUST request a token from <tt>AS1</tt> with:</t>

<ul spacing="compact">
<li><tt>grant_type=client_credentials</tt>;</li>
<li><tt>actor_chain_profile=declared-full</tt>; and</li>
<li>the requested OAuth targeting parameters (<tt>audience</tt>, <tt>resource</tt>, or both)
sufficient to identify <tt>B</tt> as the initial target context.</li>
</ul>
<t>If <tt>AS1</tt> accepts the request, <tt>AS1</tt> MUST establish the workflow subject
according to local policy before issuing <tt>T_A</tt>. At bootstrap under these
base profiles, <tt>AS1</tt> MUST choose a stable workflow-subject representation for
<tt>sub</tt> that is appropriate for the selected disclosure policy. <tt>AS1</tt> MUST then
issue <tt>T_A</tt> containing at least:</t>

<ul spacing="compact">
<li><tt>actp=declared-full</tt></li>
<li><tt>sub</tt></li>
<li><tt>act=EncodeVisibleChain([A])</tt></li>
<li><tt>acti</tt></li>
<li><tt>jti</tt></li>
<li><tt>aud=B</tt></li>
<li><tt>exp</tt></li>
</ul>
</section>

<section anchor="hop-processing"><name>Hop Processing</name>
<t>When <tt>A</tt> calls <tt>B</tt>, <tt>A</tt> MUST present <tt>T_A</tt> to <tt>B</tt>.</t>
<t><tt>B</tt> MUST perform recipient validation as described in
&quot;Recipient Validation of an Inbound Token&quot;.</t>
<t><tt>B</tt> MUST decode <tt>VisibleChain(T_A.act)</tt> and verify that its last actor is
<tt>A</tt>.</t>
<t>If that continuity check fails, <tt>B</tt> MUST reject the request.</t>
</section>

<section anchor="token-exchange"><name>Token Exchange</name>
<t>To call <tt>C</tt>, <tt>B</tt> MUST submit to <tt>AS1</tt> at least:</t>

<ul spacing="compact">
<li><tt>grant_type=urn:ietf:params:oauth:grant-type:token-exchange</tt>;</li>
<li><tt>actor_chain_profile=declared-full</tt>;</li>
<li><tt>T_A</tt> as the RFC 8693 <tt>subject_token</tt>;</li>
<li><tt>subject_token_type=urn:ietf:params:oauth:token-type:access_token</tt>; and</li>
<li>the requested OAuth targeting parameters (<tt>audience</tt>, <tt>resource</tt>, or both as
needed by local policy) sufficient to identify <tt>C</tt> as the next target
context.</li>
</ul>
<t><tt>B</tt> MAY additionally submit RFC 8693 <tt>actor_token</tt> and <tt>actor_token_type</tt>
parameters subject to the common validation rules in &quot;Authorization Server
Validation of Token Exchange&quot;.</t>
<t><tt>AS1</tt> MUST perform token-exchange validation as described in
&quot;Authorization Server Validation of Token Exchange&quot;.</t>
<t><tt>AS1</tt> MUST read the prior visible chain from <tt>T_A.act</tt>, append <tt>B</tt>, and issue <tt>T_B</tt>
containing at least:</t>

<ul spacing="compact">
<li><tt>actp=declared-full</tt></li>
<li><tt>sub</tt></li>
<li><tt>act=EncodeVisibleChain([A,B])</tt></li>
<li><tt>acti</tt></li>
<li><tt>jti</tt></li>
<li><tt>aud=C</tt></li>
<li><tt>exp</tt></li>
</ul>
</section>

<section anchor="returned-token-validation"><name>Returned Token Validation</name>
<t>Upon receipt of <tt>T_B</tt>, <tt>B</tt> MUST perform current-actor returned-token
validation as described in &quot;Current-Actor Validation of a Returned Token&quot;.</t>
<t><tt>B</tt> MUST verify that <tt>VisibleChain(T_B.act)</tt> is exactly the previously verified chain
from <tt>T_A</tt> with <tt>B</tt> appended.</t>
<t>If that append-only check fails, <tt>B</tt> MUST reject <tt>T_B</tt>.</t>
</section>

<section anchor="next-hop-validation"><name>Next-Hop Validation</name>
<t>Upon receipt of the final B-token, <tt>C</tt> MUST perform recipient validation as
described in &quot;Recipient Validation of an Inbound Token&quot;.</t>
<t><tt>C</tt> MUST decode <tt>VisibleChain(T_B.act)</tt> and use that visible chain for
authorization decisions.</t>
</section>

<section anchor="security-result"><name>Security Result</name>
<t>Under the non-collusion assumption, prior actors MUST NOT be silently inserted,
removed, reordered, or altered during token exchange.</t>
</section>
</section>

<section anchor="declared-subset-disclosure-profile"><name>Declared Subset Disclosure Profile</name>

<section anchor="profile-identifier-1"><name>Profile Identifier</name>
<t>The profile identifier string for this profile is
<tt>declared-subset</tt>. It is used as the
<tt>actor_chain_profile</tt> token request parameter value and as the <tt>actp</tt> token
claim value.</t>
</section>

<section anchor="objective-1"><name>Objective</name>
<t>This profile inherits the Declared Full Disclosure profile and changes the
visible chain carried across hops: the issuing Authorization Server MAY carry
and disclose only a recipient-specific ordered subset of the asserted chain
state for the hop, or MAY omit <tt>act</tt> entirely. Although a singleton
current-actor-only visible chain is syntactically representable here,
deployments that require actor-only policy to be explicit and machine-readable
SHOULD use the Actor-Only profile instead.</t>
</section>

<section anchor="inheritance-and-security-model"><name>Inheritance and Security Model</name>
<t>Except as modified below, all requirements of the Declared Full Disclosure
profile apply.</t>
<t>When this profile discloses <tt>act</tt>, the visible chain seen by a recipient,
obtained from <tt>VisibleChain(act)</tt>, MUST be an ordered subsequence of the
asserted chain state for that hop.</t>
<t>A recipient MUST treat undisclosed prior actors as unavailable and MUST NOT
infer adjacency, absence, or exact chain length from the disclosed subset
alone. If an inbound token under this profile omits <tt>act</tt>, or discloses <tt>act</tt>
without the current actor, this specification provides no inline current-actor
disclosure for that hop. Any additional authorization inputs are determined by
local policy and are outside the scope of this specification.</t>
<t>This profile relies on the issuing Authorization Server for continuity of the
asserted chain state and for disclosure policy. The Authorization Server MAY
retain authoritative workflow chain state richer than the disclosed subset for
audit, forensics, legal review, and branch reconstruction. In this base
JWT/JWS binding, however, the returned token is visible to the current actor
and to the next recipient, so the disclosed <tt>act</tt> in that token MUST be
acceptable for both.</t>
<t>Cross-domain re-issuance preserves only the visible asserted state carried in
the inbound token unless a trusted companion mechanism explicitly transfers
additional hidden state. This profile does not provide the step-proof-based
accountability or cumulative commitment state of the verified profiles.</t>
</section>

<section anchor="modified-bootstrap-and-issuance"><name>Modified Bootstrap and Issuance</name>
<t>At bootstrap, the initial actor MUST request a token with at least:</t>

<ul spacing="compact">
<li><tt>grant_type=client_credentials</tt>;</li>
<li><tt>actor_chain_profile=declared-subset</tt>; and</li>
<li>the requested OAuth targeting parameters (<tt>audience</tt>, <tt>resource</tt>, or both)
sufficient to identify the initial target context.</li>
</ul>
<t>At bootstrap and at each later exchange, wherever the Declared Full Disclosure
profile would issue a token containing a full visible <tt>act</tt> chain, this profile
MUST instead either issue a recipient-specific disclosed visible <tt>act</tt> chain
for the intended recipient or omit <tt>act</tt> entirely according to local policy.
When disclosed, the chain MAY be the singleton current actor if that is what
policy permits.</t>
</section>

<section anchor="modified-hop-processing-and-validation"><name>Modified Hop Processing and Validation</name>
<t>Where the Declared Full Disclosure profile requires presentation or validation
of a full visible chain, this profile instead requires presentation and
validation of any disclosed subset carried in <tt>act</tt>, if present.</t>
</section>

<section anchor="modified-token-exchange"><name>Modified Token Exchange</name>
<t>For this profile, the current actor MUST submit at least:</t>

<ul spacing="compact">
<li><tt>grant_type=urn:ietf:params:oauth:grant-type:token-exchange</tt>;</li>
<li><tt>actor_chain_profile=declared-subset</tt>;</li>
<li>the inbound token as the RFC 8693 <tt>subject_token</tt>;</li>
<li><tt>subject_token_type=urn:ietf:params:oauth:token-type:access_token</tt>; and</li>
<li>the requested OAuth targeting parameters (<tt>audience</tt>, <tt>resource</tt>, or both as
needed by local policy) sufficient to identify the next target context.</li>
</ul>
<t>The current actor MAY additionally submit RFC 8693 <tt>actor_token</tt> and
<tt>actor_token_type</tt> parameters subject to the common validation rules in
&quot;Authorization Server Validation of Token Exchange&quot;.</t>
<t>For this profile, the issuing Authorization Server MUST derive the next-hop
asserted chain state from accepted workflow state for the inbound hop, append
the current actor to that accepted chain state, and then derive any disclosed
visible chain for the returned token by selecting an ordered subsequence of the
resulting asserted chain state or by omitting <tt>act</tt> entirely. It MUST NOT
insert, reorder, or alter actor identities in any disclosed <tt>act</tt>.</t>
<t>Because the returned token is visible to the current actor in this base
binding, the Authorization Server MUST NOT disclose in that returned token any
actor identity that the current actor is not permitted to learn.</t>
<t>If an inbound token under this profile discloses <tt>act</tt>, the current recipient
MUST validate the disclosed subset according to this profile. If a returned
token under this profile discloses <tt>act</tt>, the current actor MUST validate that
disclosed subset according to this profile.</t>
<t>Unlike the Declared Full Disclosure profile, the current actor and downstream
recipient do not independently validate the hidden undisclosed portion of the
prior chain. They validate only the disclosed subset they receive.</t>
</section>

<section anchor="next-hop-authorization"><name>Next-Hop Authorization</name>
<t>A recipient MAY use any disclosed visible chain for authorization decisions.</t>
<t>A recipient MUST use only the disclosed visible chain, if any, for actor-chain
authorization and MUST treat undisclosed actors as unavailable. If the token
omits <tt>act</tt>, or discloses <tt>act</tt> without the current actor, this specification
provides no inline current-actor disclosure for that hop. Any additional
authorization inputs are determined by local policy and are outside the scope
of this specification.</t>
</section>

<section anchor="security-result-1"><name>Security Result</name>
<t>Under the non-collusion assumption, silent insertion, removal, reordering, or
alteration of the disclosed chain seen by a recipient is prevented with respect
to what the issuing Authorization Server asserted for that recipient.</t>
<t>This profile does not by itself prevent confused-deputy behavior.</t>
</section>
</section>

<section anchor="declared-actor-only-disclosure-profile"><name>Declared Actor-Only Disclosure Profile</name>

<section anchor="profile-identifier-2"><name>Profile Identifier</name>
<t>The profile identifier string for this profile is
<tt>declared-actor-only</tt>. It is used as the
<tt>actor_chain_profile</tt> token request parameter value and as the <tt>actp</tt> token
claim value.</t>
</section>

<section anchor="objective-2"><name>Objective</name>
<t>This profile inherits the Declared Subset Disclosure profile and fixes the
ordinary-token visible <tt>act</tt> disclosure to the singleton outermost current
actor only. Inline <tt>act</tt> disclosure is therefore mandatory for every ordinary
token under this profile. It is intended for workflows in which each hop
authorizes only on its immediate upstream actor while the Authorization Server
retains richer workflow state for later audit, forensics, or legal review.</t>
</section>

<section anchor="inheritance-and-security-model-1"><name>Inheritance and Security Model</name>
<t>Except as modified below, all requirements of the Declared Subset Disclosure
profile apply.</t>
<t>The Authorization Server MAY retain authoritative workflow chain state richer
than the singleton visible <tt>act</tt> disclosed in ordinary tokens, but every
ordinary token issued under this profile MUST expose only the current actor for
that hop. Recipients MUST authorize only on that visible current actor and
local policy.</t>
</section>

<section anchor="modified-bootstrap-and-issuance-1"><name>Modified Bootstrap and Issuance</name>
<t>At bootstrap, the initial actor MUST request a token with at least:</t>

<ul spacing="compact">
<li><tt>grant_type=client_credentials</tt>;</li>
<li><tt>actor_chain_profile=declared-actor-only</tt>; and</li>
<li>the requested OAuth targeting parameters (<tt>audience</tt>, <tt>resource</tt>, or both)
sufficient to identify the initial target context.</li>
</ul>
<t>At bootstrap and at each later exchange, wherever the Declared Subset
Disclosure profile would issue a token containing a disclosed visible <tt>act</tt>
chain, this profile MUST instead issue a token whose visible <tt>act</tt> contains
exactly one ActorChainNode identifying the actor represented by that ordinary
token.</t>
</section>

<section anchor="modified-hop-processing-and-validation-1"><name>Modified Hop Processing and Validation</name>
<t>Where the Declared Subset Disclosure profile requires presentation or
validation of a disclosed visible chain, this profile instead requires
validation that the visible <tt>act</tt> contains only the current actor for
this hop.</t>
</section>

<section anchor="modified-token-exchange-1"><name>Modified Token Exchange</name>
<t>For this profile, the current actor MUST submit at least:</t>

<ul spacing="compact">
<li><tt>grant_type=urn:ietf:params:oauth:grant-type:token-exchange</tt>;</li>
<li><tt>actor_chain_profile=declared-actor-only</tt>;</li>
<li>the inbound token as the RFC 8693 <tt>subject_token</tt>;</li>
<li><tt>subject_token_type=urn:ietf:params:oauth:token-type:access_token</tt>; and</li>
<li>the requested OAuth targeting parameters (<tt>audience</tt>, <tt>resource</tt>, or both as
needed by local policy) sufficient to identify the next target context.</li>
</ul>
<t>For this profile, the issuing Authorization Server MUST validate the inbound
visible <tt>act</tt> as current-actor-only, preserve and extend the accepted workflow
state for the authenticated current actor according to local policy, and issue
the returned token with a visible <tt>act</tt> containing exactly one ActorChainNode
identifying the actor represented by that returned token. The Authorization
Server MUST NOT disclose prior actors inline in ordinary tokens under this
profile.</t>
</section>

<section anchor="next-hop-authorization-1"><name>Next-Hop Authorization</name>
<t>A recipient MUST authorize only on the visible outermost current actor and
local policy.</t>
</section>

<section anchor="security-result-2"><name>Security Result</name>
<t>Under the non-collusion assumption, silent alteration of the visible current
actor is prevented with respect to what the issuing Authorization Server
asserted for that recipient. Prior actors remain available only through
Authorization Server records or other out-of-band evidence.</t>
</section>
</section>

<section anchor="common-processing-for-the-verified-branch"><name>Common Processing for the Verified Branch</name>
<t>This section defines the bootstrap, proof, commitment, token-exchange, and
returned-token rules shared by the three verified profiles. In this branch,
ordinary tokens still carry the hop-to-hop token state, but each chain-
extending hop is also backed by an actor-signed step proof and cumulative
commitment state:</t>

<ul spacing="compact">
<li>Verified Full Disclosure;</li>
<li>Verified Subset Disclosure; and</li>
<li>Verified Actor-Only Disclosure.</li>
</ul>
<t>The profile sections that follow define only the profile-specific meaning of the
actor-visible chain for the hop, the ordinary-token disclosure policy, and the
corresponding validation and authorization rules.</t>

<section anchor="common-parameters"><name>Common Parameters</name>
<t>Each verified profile supplies the following profile-specific parameters to the
common processing below.</t>
<table>
<thead>
<tr>
<th>Profile</th>
<th><tt>actp</tt> value</th>
<th>Step-proof domain-separation string</th>
<th>Proof-bound actor-visible chain for hop</th>
<th>Visible <tt>act</tt> in ordinary tokens</th>
</tr>
</thead>

<tbody>
<tr>
<td>Verified Full Disclosure</td>
<td><tt>verified-full</tt></td>
<td><tt>actor-chain-verified-full-step-sig-v1</tt></td>
<td>Full visible chain for the hop after appending the current actor</td>
<td>Full verified visible chain</td>
</tr>

<tr>
<td>Verified Subset Disclosure</td>
<td><tt>verified-subset</tt></td>
<td><tt>actor-chain-verified-subset-step-sig-v1</tt></td>
<td>Exact inbound disclosed visible chain verified by the current actor, with that actor appended</td>
<td>Ordered subsequence of the verified actor-visible chain, or omitted <tt>act</tt></td>
</tr>

<tr>
<td>Verified Actor-Only Disclosure</td>
<td><tt>verified-actor-only</tt></td>
<td><tt>actor-chain-verified-actor-only-step-sig-v1</tt></td>
<td>Exact inbound disclosed visible chain verified by the current actor, with that actor appended</td>
<td>Singleton current actor only</td>
</tr>
</tbody>
</table><t>The profile identifier, step-proof domain-separation string, and the
profile-specific interpretation of <tt>act</tt> therefore remain aligned across the
verified branch.</t>
</section>

<section anchor="common-bootstrap-context-request"><name>Common Bootstrap Context Request</name>
<t>At workflow start, the initial actor MUST request a bootstrap context from the
Authorization Server's <tt>actor_chain_bootstrap_endpoint</tt> using at least:</t>

<ul spacing="compact">
<li><tt>grant_type=urn:ietf:params:oauth:grant-type:actor-chain-bootstrap</tt>;</li>
<li>the selected verified profile <tt>actor_chain_profile</tt>; and</li>
<li>the requested OAuth targeting parameters (<tt>audience</tt>, <tt>resource</tt>, or both)
sufficient to identify the initial target context.</li>
</ul>
<t>The Authorization Server MUST authenticate the initial actor, bind that actor
to its ActorID representation, select a commitment hash algorithm, mint a
fresh <tt>acti</tt>, choose a stable workflow-subject representation for <tt>sub</tt>, derive
the bootstrap target context from the requested targeting parameters, and
return a bootstrap response containing at least:</t>

<ul spacing="compact">
<li><tt>actor_chain_bootstrap_context</tt>, an opaque bootstrap handle;</li>
<li><tt>acti</tt>;</li>
<li><tt>sub</tt>;</li>
<li><tt>halg</tt>;</li>
<li><tt>target_context</tt>, the exact canonical bootstrap-bound target context against
which the initial step proof will be validated; and</li>
<li><tt>initial_chain_seed</tt>, a base64url value to be used as <tt>prev_state</tt> for the
initial verified step proof.</li>
</ul>
<t>The <tt>initial_chain_seed</tt> MUST be generated using a CSPRNG with at least 128
bits of entropy, MUST be unique per workflow instance, and MUST NOT be derived
solely from <tt>acti</tt> or other predictable inputs.</t>
<t>The bootstrap context MUST be integrity-protected by the Authorization Server,
bound to the authenticated initial actor, the selected verified profile, the
chosen <tt>acti</tt>, <tt>sub</tt>, <tt>halg</tt>, and the bootstrap target context, and be
short-lived. It authorizes issuance of initial verified ordinary tokens for that
workflow instance while it remains valid.</t>
<t>For a given canonical chosen initial <tt>target_context</tt>, the Authorization Server
MUST treat repeated redemption of the same bootstrap handle as an idempotent
retry and MUST return the previously accepted initial state, or an equivalent
token representing that same accepted initial state. It MUST NOT issue a second
distinct accepted initial state for that same canonical chosen initial
<tt>target_context</tt>.</t>
<t>The Authorization Server MAY accept additional redemptions of the same bootstrap
handle for distinct canonical chosen initial <tt>target_context</tt> values, thereby
minting multiple accepted initial successors that share the same <tt>acti</tt> and
<tt>initial_chain_seed</tt>. If a deployment expects multiple distinct initial
successors under the same nominal target, the chosen initial <tt>target_context</tt>
MUST include a unique <tt>request_id</tt>.</t>
</section>

<section anchor="common-initial-actor-step-proof-and-bootstrap-issuance"><name>Common Initial Actor Step Proof and Bootstrap Issuance</name>
<t>After receiving the bootstrap response, the initial actor <tt>A</tt> MUST choose the
initial target context to be used for the first issued token. That chosen
initial target context MUST be identical to, or a locally authorized narrowing
of, the canonical bootstrap-bound <tt>target_context</tt> returned in the bootstrap
response. Because there are no prior actors at
workflow start, the profile-defined actor-visible chain for that initial hop
is <tt>[A]</tt> for all verified profiles. <tt>A</tt> MUST then sign an
<tt>actor_chain_step_proof</tt> over that initial chain, the exact preserved workflow
<tt>sub</tt> string returned in the bootstrap response, and the chosen initial target
context, and redeem the bootstrap context at the token endpoint using at least:</t>

<ul spacing="compact">
<li><tt>grant_type=client_credentials</tt>;</li>
<li>the selected verified profile <tt>actor_chain_profile</tt>;</li>
<li><tt>actor_chain_bootstrap_context</tt>;</li>
<li><tt>actor_chain_step_proof</tt>; and</li>
<li>the requested OAuth targeting parameters (<tt>audience</tt>, <tt>resource</tt>, or both)
sufficient to identify that chosen initial target context.</li>
</ul>
<t>The Authorization Server MUST verify the bootstrap context and verify that the
authenticated actor redeeming it is the same actor to which the bootstrap
context was issued. It MUST also verify that the requested profile matches the
bound bootstrap profile, that the chosen target context is identical to or
narrower than the bootstrap-bound target context according to local policy,
that the submitted step proof <tt>ctx</tt> equals the active profile's domain-
separation string, that the submitted step proof <tt>sub</tt> equals the bound
workflow <tt>sub</tt> string, and that the submitted step proof is otherwise valid. It
then creates the initial <tt>actc</tt> and issues an ordinary token containing at
least <tt>iss</tt>, <tt>actp</tt>, <tt>acti</tt>, <tt>sub</tt>, <tt>jti</tt>, <tt>aud</tt>, <tt>exp</tt>, and <tt>actc</tt>, and any
profile-governed disclosed <tt>act</tt>.</t>
<t>Because the initial verified hop has no prior visible actors, the exact
verified actor-visible chain for that hop is <tt>[A]</tt>. The returned ordinary token
MUST disclose that chain as <tt>act=EncodeVisibleChain([A])</tt> for the Verified Full
Disclosure and Verified Actor-Only Disclosure profiles. For Verified Subset
Disclosure, the Authorization Server MAY either disclose
<tt>act=EncodeVisibleChain([A])</tt> or omit <tt>act</tt> entirely according to local policy.</t>
</section>

<section anchor="common-hop-processing"><name>Common Hop Processing</name>
<t>When a current actor <tt>N</tt> receives an inbound verified profile token, it MUST:</t>

<ul spacing="compact">
<li>validate the inbound token and any required <tt>actc</tt>;</li>
<li>determine, under local policy, any presenting-actor identity for the
inbound hop needed by the selected profile;</li>
<li>derive the profile-defined actor-visible chain for the new hop;</li>
<li>sign <tt>actor_chain_step_proof</tt> over that visible chain, the preserved workflow
<tt>sub</tt> string for the hop, and the next target context; and</li>
<li>submit the inbound token plus the step proof in a token exchange request to
its home Authorization Server.</li>
</ul>
</section>

<section anchor="common-token-exchange"><name>Common Token Exchange</name>
<t>For a chain-extending verified profile token exchange, the current actor MUST
submit at least:</t>

<ul spacing="compact">
<li><tt>grant_type=urn:ietf:params:oauth:grant-type:token-exchange</tt>;</li>
<li>the selected verified profile <tt>actor_chain_profile</tt>;</li>
<li>the inbound token as the RFC 8693 <tt>subject_token</tt>;</li>
<li><tt>subject_token_type=urn:ietf:params:oauth:token-type:access_token</tt>;</li>
<li><tt>actor_chain_step_proof</tt>; and</li>
<li>the requested OAuth targeting parameters sufficient to identify the next
target context.</li>
</ul>
<t>The current actor MAY additionally submit RFC 8693 <tt>actor_token</tt> and
<tt>actor_token_type</tt> parameters subject to the common validation rules in
&quot;Authorization Server Validation of Token Exchange&quot;.</t>
<t>The Authorization Server MUST validate the inbound token, validate the step
proof for the active profile, MUST verify that the step proof <tt>ctx</tt> equals the
active profile's domain-separation string, MUST verify that the step proof
<tt>sub</tt> equals the preserved workflow <tt>sub</tt> string for the hop being extended,
verify append-only processing of the profile-defined actor-visible chain,
update <tt>actc</tt>, and return an ordinary token whose <tt>act</tt> representation matches
the profile's disclosure rules for the next recipient. Replay, idempotency, and
multiple-successor handling for submitted step proofs are defined later in
&quot;Replay and Freshness&quot;.</t>
</section>

<section anchor="common-returned-token-validation"><name>Common Returned-Token Validation</name>
<t>When validating a returned verified profile token, the current actor MUST
perform the common returned-token validation described earlier and MUST also
verify:</t>

<ul spacing="compact">
<li>that <tt>actc</tt> is present and valid;</li>
<li>that the returned token preserves <tt>acti</tt>, <tt>actp</tt>, and <tt>sub</tt> as required;</li>
<li>that the embedded <tt>actc</tt> payload preserves the expected <tt>acti</tt>, <tt>actp</tt>, and
<tt>halg</tt> values for the active workflow state;</li>
<li>that <tt>actc.prev</tt> equals the previously verified prior commitment digest, or
the <tt>initial_chain_seed</tt> for the initial verified hop;</li>
<li>that <tt>actc.step_hash</tt> equals <tt>b64url(Hash_halg(step_proof_bytes))</tt> computed
over the exact compact JWS string submitted as <tt>actor_chain_step_proof</tt> for
that hop; and</li>
<li>any profile-specific disclosed-chain checks for the active disclosure mode.</li>
</ul>
<t>Because <tt>actc</tt> is cumulative commitment state carried inline in verified profile
ordinary tokens, every later actor and every Authorization Server that extends
the verified workflow relies on that inline <tt>actc</tt> value. Online validation of
an inbound or returned <tt>actc</tt> proves issuer-signed commitment continuity and
internal commitment consistency. It does not by itself prove the semantic
meaning of <tt>step_hash</tt> against the underlying step proof unless the exact step
proof bytes and related verification material are also retained or discoverable
for later audit. Deployments MAY vary on whether every terminal recipient
performs synchronous <tt>actc</tt> validation at admission time, but chain extension
MUST NOT proceed without successful validation of the inbound <tt>actc</tt>.</t>
</section>
</section>

<section anchor="verified-full-disclosure-profile"><name>Verified Full Disclosure Profile</name>

<section anchor="profile-identifier-3"><name>Profile Identifier</name>
<t>The profile identifier string for this profile is
<tt>verified-full</tt>. It is used as the <tt>actor_chain_profile</tt> token
request parameter value and as the <tt>actp</tt> token claim value.</t>
</section>

<section anchor="objective-3"><name>Objective</name>
<t>The Verified Full Disclosure profile is the full-disclosure verified case. It
preserves a visible nested <tt>act</tt> chain in every ordinary token for every actor
and downstream recipient while adding per-hop actor-signed step proofs and
cumulative commitment state.</t>
</section>

<section anchor="security-model-1"><name>Security Model</name>
<t>Bootstrap, Common Token Exchange, and Common Returned-Token Validation follow
the Common Processing for the Verified Branch section. This profile inherits
all requirements of that common verified processing and specializes them to
the full-disclosure visible case.</t>
<t>This profile preserves visible chain-based authorization and provides stronger
accountability and non-repudiation than the Declared Full Disclosure profile.</t>
<t>This profile does not guarantee inline prevention of every invalid token that
could be issued by a colluding actor and its home Authorization Server.</t>
<t>The evidentiary value of this profile depends on retention or discoverability of
step proofs, exchange records, and associated verification material.</t>
</section>

<section anchor="profile-specific-hop-construction-and-validation"><name>Profile-Specific Hop Construction and Validation</name>
<t>For a current actor <tt>N</tt>, let <tt>chain_in</tt> be the full visible chain
verified from the inbound token. If <tt>N</tt> establishes a presenting actor for
the inbound hop under local policy, <tt>N</tt> MUST verify that the last actor in
<tt>chain_in</tt> is that same presenting actor.</t>
<t>The exact verified actor-visible chain for the hop is the full visible
append-only chain:</t>
<t>{::nomarkdown}
&lt;sourcecode type=&quot;text&quot;&gt;
visible_hop_N = chain_in + [N]
&lt;/sourcecode&gt;
{:/nomarkdown}</t>
<t>The Authorization Server MUST issue <tt>EncodeVisibleChain(visible_hop_N)</tt> as the visible
<tt>act</tt> in the returned token.</t>
<t>A recipient MUST use the full visible chain for authorization decisions.</t>
</section>

<section anchor="attack-handling"><name>Attack Handling</name>
<t>A claim that actor <tt>V</tt> participated in the chain MUST fail unless a valid step
proof for <tt>V</tt> can be produced and verified against the corresponding prior
commitment state and <tt>acti</tt>.</t>
<t>If an actor is omitted from a later visible chain, that omitted actor MAY prove
prior participation by presenting:</t>

<ul spacing="compact">
<li>an earlier token showing the prior chain state; and</li>
<li>the corresponding commitment state and verifiable step proof, or an immutable
Authorization Server exchange record.</li>
</ul>
<t>A denial of participation by actor <tt>X</tt> MUST fail if a valid step proof for <tt>X</tt>
is available and verifies.</t>
</section>

<section anchor="security-result-3"><name>Security Result</name>
<t>This profile preserves visible chain-based authorization while making tampering
materially easier to detect, prove, and audit.</t>
</section>
</section>

<section anchor="verified-subset-disclosure-profile"><name>Verified Subset Disclosure Profile</name>

<section anchor="profile-identifier-4"><name>Profile Identifier</name>
<t>The profile identifier string for this profile is
<tt>verified-subset</tt>. It is used as the
<tt>actor_chain_profile</tt> token request parameter value and as the <tt>actp</tt> token
claim value.</t>
</section>

<section anchor="objective-4"><name>Objective</name>
<t>This profile is the visible subset-disclosure verified case. The issuing
Authorization Server MAY disclose only a recipient-specific ordered subset of
the verified actor-visible chain, while the current actor signs the exact
actor-visible chain that it was allowed to verify and extend for the hop. This
preserves stronger continuity and later verifiability without requiring full
inline disclosure at every hop.</t>
</section>

<section anchor="security-model-2"><name>Security Model</name>
<t>Bootstrap, Common Token Exchange, and Common Returned-Token Validation follow
the Common Processing for the Verified Branch section. This profile inherits
all requirements of that common verified processing.</t>
<t>When this profile discloses <tt>act</tt>, the visible chain seen by a recipient,
obtained from <tt>VisibleChain(act)</tt>, MUST be an ordered subsequence of the
verified actor-visible chain for that hop.</t>
<t>Step proofs and <tt>actc</tt> values MUST be computed over the exact
actor-visible chain for the hop, not over a hidden canonical full chain that
the current actor was not permitted to see.</t>
<t>A recipient MUST treat undisclosed prior actors as unavailable and MUST NOT
infer adjacency, absence, exact chain length, or hidden prefixes from the
disclosed subset alone.</t>
<t>The Authorization Server MAY retain authoritative workflow chain state richer
than the disclosed subset for audit, forensics, legal review, and branch
reconstruction. In this base JWT/JWS binding, however, the returned token is
visible to the current actor and to the next recipient, so the returned visible
<tt>act</tt> MUST be acceptable for both. Accordingly, a later privileged recipient
can learn more than an earlier intermediary only at a hop where every holder of
the returned token is permitted to learn that broader disclosure, or by using a
future recipient-protected disclosure mechanism outside this base
specification.</t>
</section>

<section anchor="profile-specific-hop-construction-and-validation-1"><name>Profile-Specific Hop Construction and Validation</name>
<t>For a current actor <tt>N</tt>, let <tt>chain_in</tt> be the exact disclosed inbound
visible chain that <tt>N</tt> verified from the inbound token, or the empty chain if
the inbound token disclosed no <tt>act</tt>. If <tt>chain_in</tt> is non-empty and <tt>N</tt>
establishes a presenting actor for the inbound hop under local policy, <tt>N</tt> MUST
verify that its last actor is that same presenting actor.</t>
<t>The exact verified actor-visible chain for the hop is:</t>
<t>{::nomarkdown}
&lt;sourcecode type=&quot;text&quot;&gt;
visible_hop_N = chain_in + [N]
&lt;/sourcecode&gt;
{:/nomarkdown}</t>
<t>The current actor <tt>N</tt> MUST append only itself and MUST NOT insert, delete, or
reorder prior actors within <tt>chain_in</tt>.</t>
<t>The Authorization Server MUST verify that the submitted visible chain equals
the exact inbound disclosed chain previously verified by <tt>N</tt>, with <tt>N</tt>
appended. An omitted inbound <tt>act</tt> corresponds to the empty <tt>chain_in</tt> value.</t>
<t>Any visible <tt>act</tt> disclosed to the next recipient in this base binding MUST be
derived from the exact verified actor-visible chain for that hop and MUST be an
ordered subsequence of it. The singleton <tt>[N]</tt> is the actor-only disclosure
shape, and omission of <tt>act</tt> is also permitted under this profile.</t>
<t>When validating a returned token, the current actor <tt>N</tt> MUST additionally
verify, if the returned token discloses <tt>act</tt>, that the disclosed chain,
obtained from <tt>VisibleChain(act)</tt>, is an ordered subsequence of the exact
verified actor-visible chain that <tt>N</tt> signed for that hop.</t>
<t>A recipient MAY use the verified disclosed visible chain for authorization
decisions, but MUST use only the disclosed subset and MUST treat undisclosed
prior actors as unavailable. If the token omits <tt>act</tt>, or discloses <tt>act</tt>
without the current actor, this specification provides no inline current-actor
disclosure for that hop. Any additional authorization inputs are determined by
local policy and are outside the scope of this specification.</t>
</section>

<section anchor="attack-handling-1"><name>Attack Handling</name>
<t>Different recipients MAY receive different valid disclosed subsets derived from
the same verified actor-visible chain according to local disclosure policy.
That alone does not constitute an integrity failure.</t>
<t>A malicious or compromised Authorization Server could still attempt to issue a
disclosed subset inconsistent with the verified actor-visible chain. Such an
inconsistency MUST fail if the retained step proof for that hop or an immutable
Authorization Server exchange record is later checked.</t>
<t>An actor omitted from a disclosed chain MAY still prove prior participation by
presenting the corresponding step proof or immutable Authorization Server
exchange record for the verified actor-visible chain for the relevant hop.</t>
<t>When this profile omits <tt>act</tt>, or discloses only a narrow subset, later
reconstruction of the full accepted chain from step proofs alone is not
guaranteed. Such reconstruction can require retained Authorization Server
records or other authoritative workflow evidence. In those cases, the current
actor's signature provides non-repudiation only over the exact actor-visible
chain for that hop and the linked prior commitment digest, not over hidden
prefix semantics that the actor was not permitted to verify.</t>
</section>

<section anchor="security-result-4"><name>Security Result</name>
<t>This profile preserves Authorization-Server-validated continuity,
cumulative commitment state, and recipient-specific limited visible
authorization while avoiding disclosure of hidden prior actors beyond the
subset visible in the returned ordinary token.</t>
</section>
</section>

<section anchor="verified-actor-only-disclosure-profile"><name>Verified Actor-Only Disclosure Profile</name>

<section anchor="profile-identifier-5"><name>Profile Identifier</name>
<t>The profile identifier string for this profile is
<tt>verified-actor-only</tt>. It is used as the <tt>actor_chain_profile</tt> token
request parameter value and as the <tt>actp</tt> token claim value.</t>
</section>

<section anchor="objective-5"><name>Objective</name>
<t>This profile inherits the common verified processing and keeps the actor-signed
step proof and cumulative <tt>actc</tt> continuity state, while restricting ordinary
tokens to the singleton outermost current actor only. It is intended for
end-to-end execution pipelines in which each hop authorizes only on the
immediate upstream actor even though the Authorization Server retains richer
authoritative workflow state for later forensics, legal audit, or branch
reconstruction.</t>
</section>

<section anchor="security-model-3"><name>Security Model</name>
<t>Except as modified below, all requirements of the common verified processing
section apply.</t>
<t>The current actor signs the exact verified actor-visible chain for the hop, but
the ordinary token returned for the next hop MUST disclose only the current
actor. Recipients therefore authorize only on the visible current actor plus
local policy, while <tt>actc</tt> and retained step proofs preserve stronger
continuity evidence for later review.</t>
</section>

<section anchor="profile-specific-hop-construction-and-validation-2"><name>Profile-Specific Hop Construction and Validation</name>
<t>For each hop under this profile, the current actor MUST construct the
profile-defined verified actor-visible chain as the exact inbound disclosed
visible chain that the actor verified, with that actor appended. The step
proof MUST carry that exact actor-visible chain in its <tt>act</tt> member.</t>
<t>Where Verified Subset Disclosure permits any ordered subsequence of the
verified actor-visible chain to appear in the returned ordinary token, this
profile instead requires the issuing Authorization Server to return a visible
<tt>act</tt> containing exactly one ActorChainNode identifying the actor represented
by the returned token. The returned token MUST still carry the updated
cumulative <tt>actc</tt> state.</t>
<t>Upon receipt of the returned token, the current actor MUST verify that the
returned visible <tt>act</tt> consists only of the current actor and that the
returned <tt>actc</tt> matches the accepted successor state for the verified hop.</t>
<t>Upon receipt of the token, the next recipient MUST perform recipient
validation and authorize only on the visible current actor and local policy. If
the recipient establishes a presenting actor for the inbound token under local
policy, it MUST also confirm that the visible current actor matches that same
presenting actor.</t>
</section>

<section anchor="attack-handling-2"><name>Attack Handling</name>
<t>If a returned ordinary token under this profile discloses any prior actor
inline, the current actor MUST reject it. If a recipient under this profile
attempts to infer hidden prior actors from omission, identifier structure, or
<tt>actc</tt> alone, that behavior is out of profile and MUST NOT be treated as a
conforming authorization decision.</t>
</section>

<section anchor="security-result-5"><name>Security Result</name>
<t>Under the non-collusion assumption and when step proofs and <tt>actc</tt> are
retained as required by local policy, silent alteration of the current actor in
ordinary tokens is prevented and stronger continuity evidence remains available
for later forensic or legal review, while inline disclosure remains restricted
to the current actor only.</t>
</section>
</section>

<section anchor="special-preserve-state-exchanges"><name>Special Preserve-State Exchanges</name>
<t>These sections define the two token-exchange cases that preserve previously
accepted chain state rather than appending a new actor. They are easiest
to read after the ordinary profile flows.</t>
<t>A token-exchange request under this specification MUST NOT set both
<tt>actor_chain_cross_domain=true</tt> and <tt>actor_chain_refresh=true</tt>. The
Authorization Server MUST reject any request that sets both.</t>

<section anchor="cross-domain-re-issuance"><name>Cross-Domain Re-Issuance</name>

<section anchor="request-format"><name>Request Format</name>
<t>If the next hop does not trust the current Authorization Server directly, the
current actor MUST perform a second token exchange at the next domain's
Authorization Server.</t>
<t>A cross-domain re-issuance request MUST include:</t>

<ul spacing="compact">
<li><tt>grant_type=urn:ietf:params:oauth:grant-type:token-exchange</tt>;</li>
<li><tt>actor_chain_cross_domain=true</tt>;</li>
<li><tt>actor_chain_profile</tt> set to the active profile identifier carried by the
inbound token;</li>
<li>the current inbound actor-chain token as the RFC 8693 <tt>subject_token</tt>;</li>
<li><tt>subject_token_type=urn:ietf:params:oauth:token-type:access_token</tt>; and</li>
<li>any requested OAuth targeting parameters (<tt>audience</tt>, <tt>resource</tt>, or both)
for the local target context to be minted by the re-issuing Authorization
Server.</li>
</ul>
<t>The re-issuing Authorization Server MUST ensure that any locally minted target
context is semantically equivalent to, or narrower than, the target context
authorized by the inbound token according to local trust policy and audience
mapping rules. When the earlier chain-extending hop bound a <tt>target_context</tt>
richer than plain <tt>aud</tt>, the re-issuing Authorization Server MUST evaluate
that equivalence or narrowing against the exact retained or otherwise
recoverable prior <tt>target_context</tt>, not against <tt>aud</tt> alone. It MUST NOT issue
a local token whose target context is broader than, or semantically unrelated
to, the target context authorized by the inbound token.</t>
<t>A cross-domain re-issuance request MUST NOT append the chain and MUST NOT
submit <tt>actor_chain_step_proof</tt>, because this exchange preserves rather than
extends the accepted chain state. The <tt>actor_chain_cross_domain</tt> parameter is
the explicit wire signal that the request is for preservation and local
re-issuance rather than ordinary same-domain chain extension.</t>
</section>

<section anchor="preservation-rules"><name>Preservation Rules</name>
<t>The cross-domain Authorization Server MUST:</t>

<ul spacing="compact">
<li>validate the inbound token signature and issuer trust according to local
policy;</li>
<li>validate the selected actor-chain profile;</li>
<li>validate the preserved visible-chain structure;</li>
<li>preserve <tt>actp</tt>;</li>
<li>preserve <tt>acti</tt>;</li>
<li>preserve <tt>actc</tt>, if present, exactly as verified;</li>
<li>continue to represent the same current actor; and</li>
<li>NOT append the next recipient.</li>
</ul>
<t>Visible <tt>act</tt> handling during cross-domain re-issuance is profile-specific:</t>

<ul spacing="compact">
<li>for the Full Disclosure profiles and the Actor-Only profiles, the re-issuing
Authorization Server MUST preserve the visible <tt>act</tt> exactly, except that if
an inbound visible node omitted <tt>iss</tt>, the re-issuing Authorization Server
MAY materialize that <tt>iss</tt> explicitly only to preserve the same ActorID
semantics;</li>
<li>for the Subset Disclosure profiles, if the inbound token discloses <tt>act</tt>, the
re-issuing Authorization Server MAY preserve that visible <tt>act</tt> exactly,
disclose any ordered subsequence of that inbound visible chain, or omit <tt>act</tt>
entirely according to local policy; it MUST NOT introduce any actor not
present in the inbound visible chain, reorder actors, or use hidden retained
state to broaden disclosure; when a returned visible node would otherwise rely
on inherited issuer context, the re-issuing Authorization Server MAY
materialize the corresponding <tt>iss</tt> explicitly only to preserve the same
ActorID semantics; and</li>
<li>if the inbound token omits <tt>act</tt>, the re-issuing Authorization Server MUST
NOT synthesize a visible <tt>act</tt> from hidden retained state.</li>
</ul>
</section>

<section anchor="subject-handling"><name>Subject Handling</name>
<t>For top-level <tt>sub</tt>, the re-issuing Authorization Server SHOULD preserve the
exact inbound value when doing so preserves the same underlying subject
semantics and does not broaden disclosure. If exact preservation would change
subject semantics under the new issuer namespace or would disclose more than the
inbound token disclosed, the re-issuing Authorization Server MAY translate
<tt>sub</tt> into a local alias that denotes the same underlying subject and MUST
retain an audit binding between the old and new subject representations. If the
re-issuing Authorization Server cannot establish same-subject semantic
continuity without broader disclosure, it MUST reject the request. Once such a
local alias is accepted in cross-domain re-issuance, that returned <tt>sub</tt> value
becomes the preserved workflow-subject representation for later same-domain
validation within the new issuer domain.</t>
<t>This specification cryptographically binds same-domain workflow-subject
continuity through verified step proofs. It does not cryptographically bind
cross-domain <tt>sub</tt> alias continuity in preserved <tt>actc</tt>; cross-domain subject
alias continuity therefore remains a matter of Authorization-Server policy and
retained audit evidence in this version.</t>
<t>Future companion specifications MAY define privacy-preserving Authorization
Server-to-Authorization Server transfer of additional hidden workflow state.
Such mechanisms are outside this base specification. This document's cross-
domain rules preserve only the visible state allowed by policy together with
any preserved <tt>actc</tt> state defined here.</t>
</section>

<section anchor="actorid-namespace-handling"><name>ActorID Namespace Handling</name>
<t>Each visible <tt>act</tt> entry uses ActorID semantics over (<tt>iss</tt>, <tt>sub</tt>). If an
inbound <tt>act</tt> node omitted <tt>iss</tt>, the re-issuing Authorization Server MUST
preserve the same ActorID semantics by emitting an explicit <tt>iss</tt> equal to the
inbound token's issuer together with the same actor <tt>sub</tt>, rather than relying
on the new local token issuer as an implicit namespace. Internal canonicalization
for proof, comparison, and ordered-subsequence evaluation in this document
therefore always uses fully materialized ActorID pairs.</t>
<t>The cross-domain Authorization Server MAY mint a new local <tt>jti</tt>, apply a new
local expiry, change token format or envelope, and add local trust or policy
claims. If cross-domain re-issuance narrows or locally rewrites the target
context, retained step proofs and preserved <tt>actc</tt> continue to reflect the
target context that was bound during the original chain-extending hop, not the
narrower or rewritten token audience issued by the re-issuing Authorization
Server.</t>
<t>A recipient or current actor in the new domain that trusts the re-issuing
Authorization Server MAY rely on that enclosing token signature as attestation
that any preserved foreign <tt>actc</tt> was validated and carried forward unchanged.
Such a recipient need not independently validate a foreign Authorization
Server's JWS signature on the preserved <tt>actc</tt> unless local policy or audit
requires it.</t>
</section>

<section anchor="returned-token-validation-1"><name>Returned-Token Validation</name>
<t>When validating a token returned by cross-domain re-issuance, the current actor
does not recompute a new commitment object from a new step proof. Instead, it
MUST verify the token signature and MUST verify that preserved chain-state
fields, including <tt>actp</tt>, <tt>acti</tt>, and <tt>actc</tt>, preserve the same accepted chain
state as the inbound token except where this specification explicitly permits
cross-domain re-issuance changes such as local <tt>sub</tt> aliasing under the
semantic-equivalence rule, local <tt>jti</tt>, local <tt>exp</tt>, token format or envelope,
approved local trust and policy claims, or explicit <tt>iss</tt> materialization in
<tt>act</tt> solely to preserve the same ActorID semantics when an inbound node had
omitted <tt>iss</tt>. For Full Disclosure and Actor-Only profiles, any returned
visible <tt>act</tt> MUST preserve the inbound visible <tt>act</tt> exactly except for such
permitted <tt>iss</tt> materialization. For Subset Disclosure profiles, any returned
visible <tt>act</tt>, if present, MUST be an ordered subsequence of the inbound
visible chain and MUST NOT introduce any actor not visible in the inbound
token.</t>
</section>
</section>

<section anchor="refresh-exchange"><name>Refresh-Exchange</name>
<t>A current actor MAY use token exchange to refresh a short-lived transport token
without appending the actor chain or regenerating a step proof.</t>

<section anchor="request-format-1"><name>Request Format</name>
<t>A Refresh-Exchange request MUST include:</t>

<ul spacing="compact">
<li><tt>grant_type=urn:ietf:params:oauth:grant-type:token-exchange</tt>;</li>
<li><tt>actor_chain_refresh=true</tt>;</li>
<li><tt>actor_chain_profile</tt> set to the active profile identifier carried by the
inbound token;</li>
<li>the current inbound actor-chain token as the RFC 8693 <tt>subject_token</tt>;</li>
<li><tt>subject_token_type=urn:ietf:params:oauth:token-type:access_token</tt>;</li>
<li>the same authenticated current actor that is continuing that accepted chain
state; and</li>
<li>any requested OAuth targeting parameters (<tt>audience</tt>, <tt>resource</tt>, or both).
If omitted, the requested target context is the same as the inbound token's
target context as represented by <tt>aud</tt> and any locally retained
target-selection context associated with that accepted token state.</li>
</ul>
<t>A Refresh-Exchange request MUST NOT include <tt>actor_chain_step_proof</tt>, because
Refresh-Exchange preserves rather than extends the accepted chain state.</t>
<t>A Refresh-Exchange request MUST NOT broaden the active profile, represented
actor identity, visible chain state visible to the current actor,
commitment state, or target context. The requested target context MUST be
identical to, or a locally authorized narrowing of, the target context already
represented by the inbound token and any associated retained target-selection
state according to local policy. Such narrowing MUST preserve the same
recipient identity; it MUST NOT retarget the token to an audience or resource server not
already present in the inbound token's canonical <tt>target_context</tt>.</t>
</section>

<section anchor="processing-rules"><name>Processing Rules</name>
<t>When processing Refresh-Exchange, the Authorization Server MUST:</t>

<ul spacing="compact">
<li>validate the inbound token and the identity of the current actor;</li>
<li>verify that the requested profile identifier exactly matches the inbound
token's <tt>actp</tt>;</li>
<li>verify intended-recipient semantics as applicable;</li>
<li>verify that the request does not append the chain, alter preserved chain
state, broaden target context, or change recipient identity; and</li>
<li>issue a replacement token with a new <tt>jti</tt> and refreshed <tt>exp</tt>.</li>
</ul>
<t>For Refresh-Exchange, the Authorization Server MUST preserve <tt>acti</tt>,
<tt>actp</tt>, <tt>sub</tt>, <tt>act</tt>, if present, and <tt>actc</tt>, if present,
exactly as verified for the current actor. A new step proof MUST NOT be
required, and a new commitment object MUST NOT be created. If Refresh-Exchange
narrows the target context, retained step proofs and preserved <tt>actc</tt> continue
to reflect the target context that was bound during the original
chain-extending hop, not the narrower refreshed target context.</t>
<t>This specification does not define or require any particular token-binding,
presenter-binding, or key-transition mechanism for Refresh-Exchange. If a
deployment changes such transport or authentication properties during refresh,
that handling is governed by local policy and any companion specifications
rather than by this document. Historical step proofs remain bound to the keys
used when those proofs were created and MUST be verified against those
historical bindings, not against later local authentication material.</t>
<t>A recipient or coordinating component MUST treat a token obtained by
Refresh-Exchange as representing the same accepted chain state as the inbound
token from which it was refreshed. If local policy records a presenter-binding
or key-transition event, later verifiers rely on those local records or other
retained evidence for that event itself.</t>
</section>

<section anchor="returned-token-validation-2"><name>Returned-Token Validation</name>
<t>When validating a token returned by Refresh-Exchange, the current actor does
not recompute a new commitment object from a new step proof. Instead, it MUST
verify the token signature and MUST verify that preserved chain-state fields,
including <tt>actp</tt>, <tt>acti</tt>, <tt>sub</tt>, <tt>act</tt>, and <tt>actc</tt>, are unchanged from the
inbound token except where this specification explicitly permits refresh-
specific changes such as <tt>jti</tt>, <tt>exp</tt>, or locally managed transport metadata.</t>
</section>
</section>
</section>

<section anchor="optional-receiver-acknowledgment-extension"><name>Optional Receiver Acknowledgment Extension</name>
<t>A recipient MAY produce a receiver acknowledgment artifact, called <tt>hop_ack</tt>,
for an inbound actor-chain token. This OPTIONAL extension does not alter chain
progression semantics.</t>
<t>A valid <tt>hop_ack</tt> proves that the recipient accepted responsibility for the
identified hop, bound to the actor-chain identifier, the identified inbound hop
state, recipient, target context, and the acknowledged inbound token instance
via <tt>inbound_jti</tt>. For verified profiles, the stronger workflow-level
correlation anchors are <tt>acti</tt> together with the inbound commitment digest for
that hop; <tt>inbound_jti</tt> remains the token-instance trace field. If the
deployment establishes a presenter ActorID for the acknowledged hop under local
policy, <tt>hop_ack</tt> MAY additionally bind that presenter. For declared profiles,
the inbound hop state is the verified visible <tt>act</tt> from the inbound token when
that profile disclosed <tt>act</tt> on the acknowledged hop. For verified profiles,
that inbound hop state is the verified inbound commitment digest extracted from
the inbound token's <tt>actc.curr</tt>.</t>
<t>A recipient can issue a valid <tt>hop_ack</tt> only if it can either deterministically
derive or receive the exact canonical <tt>target_context</tt> value for the
acknowledged hop. When <tt>target_context</tt> extends beyond plain <tt>aud</tt>, the caller
or a coordinating component MUST communicate that exact canonical JSON value to
the recipient by an integrity-protected application mechanism before expecting
a matching <tt>hop_ack</tt>.</t>
<t>A <tt>hop_ack</tt> is ordinarily returned to the presenting actor or to a coordinating
component acting for that hop. It MAY later be archived, forwarded, or made
available to an audit service or other authorized dispute-resolution component
under local policy.</t>
<t><tt>hop_ack</tt> MUST NOT by itself append the recipient to the actor chain.</t>
<t>A recipient MUST NOT emit <tt>hop_ack</tt> with status <tt>accepted</tt> until it has either:</t>

<ul spacing="compact">
<li>completed the requested operation; or</li>
<li>durably recorded sufficient state to recover, retry, or otherwise honor the
accepted request according to local reliability policy.</li>
</ul>
<t>A deployment MAY require <tt>hop_ack</tt> for selected hops, including terminal hops.
When <tt>hop_ack</tt> is required by policy, the calling actor and any coordinating
component MUST treat that hop as not accepted unless a valid <tt>hop_ack</tt> is
received and verified.</t>
<t>Deployments that rely on <tt>hop_ack</tt> for later audit or dispute resolution SHOULD
ensure that the caller side and the recipient side each retain the artifact, or
records sufficient to validate and contextualize it, for the applicable audit
period. For example, a downstream agent might bill the presenting agent only
for work that it accepted. In that case, the recipient-signed <tt>hop_ack</tt> helps
both sides later prove exactly which hop, target context, and accepted inbound
artifact are in scope.</t>
<t><tt>hop_ack</tt> does not by itself prove successful completion or correctness of the
requested operation.</t>
<t>Recipients are not required to issue <tt>hop_ack</tt> for rejected, malformed,
abusive, unauthorized, or rate-limited requests. Absence of <tt>hop_ack</tt> is
sufficient to prevent proof of acceptance.</t>
<t>When a deployment needs <tt>hop_ack</tt> to acknowledge multiple distinct operations
performed under the same inbound token and the same nominal target, it MUST
include a request-unique <tt>request_id</tt> inside <tt>target_context</tt>.</t>
<t>The acknowledgment payload MUST include at least:</t>

<ul spacing="compact">
<li><tt>ctx</tt> = <tt>actor-chain-hop-ack-v1</tt>;</li>
<li><tt>acti</tt>;</li>
<li><tt>actp</tt>;</li>
<li><tt>jti</tt>, a unique identifier for the <tt>hop_ack</tt> JWT itself;</li>
<li><tt>inbound_jti</tt>, copied from the acknowledged inbound token;</li>
<li>OPTIONAL <tt>presenter</tt>, the presenting actor's ActorID when established under
local policy for that hop;</li>
<li><tt>recipient</tt>, the acknowledging recipient's ActorID;</li>
<li><tt>target_context</tt>;</li>
<li><tt>iat</tt>, a JWT NumericDate recording when the acknowledgment was issued;</li>
<li><tt>exp</tt>, a short-lived JWT NumericDate;</li>
<li>for declared profiles, OPTIONAL inbound visible <tt>act</tt> when that profile
disclosed <tt>act</tt> on the acknowledged hop;</li>
<li>for verified profiles, <tt>inbound_commitment</tt>, the verified inbound
commitment digest copied directly from the inbound token's <tt>actc.curr</tt>; and</li>
<li><tt>ack</tt>, whose value MUST be <tt>accepted</tt>.</li>
</ul>
<t>A <tt>hop_ack</tt> MUST be signed by the recipient using JWS.</t>

<section anchor="receiver-acknowledgment-validation"><name>Receiver Acknowledgment Validation</name>
<t>A caller or coordinating component that receives <tt>hop_ack</tt> and relies on it for
acceptance processing MUST verify at least:</t>

<ul spacing="compact">
<li>the JWS signature using the recipient identity and keying material expected by
local trust policy;</li>
<li>the JWS protected header contains <tt>typ=act-hop-ack+jwt</tt>;</li>
<li><tt>ctx=actor-chain-hop-ack-v1</tt>;</li>
<li><tt>acti</tt> equals the actor-chain identifier of the inbound token for which
acknowledgment is being evaluated;</li>
<li><tt>actp</tt> equals the active profile of that inbound token;</li>
<li><tt>jti</tt> is unique for the acknowledgment artifact under local replay policy;</li>
<li><tt>inbound_jti</tt> equals the <tt>jti</tt> of the inbound token that was actually sent to
the recipient;</li>
<li>if <tt>presenter</tt> is present, it equals the presenting actor established under
local policy for the acknowledged hop;</li>
<li><tt>recipient</tt> equals the recipient from which acknowledgment is expected;</li>
<li><tt>target_context</tt> equals the exact canonical target context that was
requested, communicated, or deterministically derived for the acknowledged
hop;</li>
<li><tt>iat</tt> is present and acceptable under local clock policy;</li>
<li><tt>exp</tt> has not expired;</li>
<li>for declared profiles, if <tt>act</tt> is present, the carried <tt>act</tt> equals the
inbound visible <tt>act</tt> for the acknowledged hop and MUST NOT disclose more
than that acknowledged hop disclosed;</li>
<li>for verified profiles, <tt>inbound_commitment</tt> equals the verified inbound
commitment digest copied from the inbound token's <tt>actc.curr</tt>; and</li>
<li>the <tt>ack</tt> member is present and its value equals <tt>accepted</tt>.</li>
</ul>
<t>When the inbound token being acknowledged was obtained by cross-domain
re-issuance or Refresh-Exchange, the <tt>target_context</tt> compared here is the
exact canonical value for that acknowledged presentation. Any preserved step
proofs and <tt>actc</tt> from an earlier chain-extending hop continue to reflect the
target context of that earlier hop, not a later locally rewritten audience,
unless those values are identical.</t>
</section>
</section>

<section anchor="common-security-and-enforcement-requirements"><name>Common Security and Enforcement Requirements</name>
<t>This section collects enforcement requirements that all profiles rely on but
that need not be read before the main profile flows. Implementations still
MUST satisfy these requirements even when they are consulted later in a first
reading pass.</t>

<section anchor="actor-authentication-and-presenter-binding"><name>Actor Authentication and Presenter Binding</name>
<t>This specification does not define or require any particular actor-
authentication, presenter-binding, or token-binding mechanism. Authorization
Servers and recipients MAY establish current-actor or presenting-actor identity
using any locally trusted method. Recipient authorization policy based on such
inputs is outside the scope of this specification.</t>
</section>

<section anchor="actor-and-recipient-proof-keys"><name>Actor and Recipient Proof Keys</name>
<t>For verified profiles and for <tt>hop_ack</tt>, any signature used as a
profile-defined proof MUST be generated with an asymmetric key whose
verification material is trusted under local policy for the actor or recipient
identity represented in that artifact.</t>
<t>For a verified profile step proof, the ActorID represented in the proof and the
key used to sign the proof MUST be bound to the same actor identity under local
trust policy. The Authorization Server MUST verify the proof using trusted
verification material for that actor identity before accepting the proof.</t>
<t>For <tt>hop_ack</tt>, the recipient ActorID and the key used to sign the acknowledgment
MUST likewise be bound to the same recipient identity under local trust policy.
If <tt>presenter</tt> is included in a <tt>hop_ack</tt>, that value MUST be established under
local policy and MUST NOT expand disclosure beyond the selected profile.</t>
<t>Shared client secrets MUST NOT be the sole basis for independently verifiable
step proofs or receiver acknowledgments.</t>
<t>Deployments that rely on later verification of archived step proofs or
acknowledgments MUST retain, or be able to recover, the verification material
and identity-binding records needed to validate those signatures during the
applicable audit period. Deployments that claim verified-profile auditability
beyond Authorization-Server-only trust SHOULD also retain, or be able to
recover, the exact compact JWS step-proof artifacts and their associated
workflow context for the applicable audit period, because commitment digests
alone do not prove which actor signed which hop.</t>
</section>

<section anchor="intended-recipient-validation"><name>Intended Recipient Validation</name>
<t>When a current actor submits an inbound token as a <tt>subject_token</tt> in token
exchange, the accepting Authorization Server MUST normally verify that the
authenticated current actor was an intended recipient of that inbound token
according to local audience, resource, or equivalent validation rules. For
<tt>actor_chain_refresh=true</tt> and <tt>actor_chain_cross_domain=true</tt>, this intended-
recipient check does not apply, because the current actor is legitimately
redeeming a token it holds as the presenter in order to refresh or preserve
previously established chain state.</t>
<t>Possession of an inbound token alone is insufficient.</t>
</section>

<section anchor="replay-and-freshness"><name>Replay and Freshness</name>
<t>Recipients and Authorization Servers MUST enforce replay and freshness checks on
inbound tokens according to local policy.</t>
<t>For profiles that use actor-signed step proofs, the accepting Authorization
Server:</t>

<ul spacing="compact">
<li>MUST detect replay of a previously accepted step proof within its
replay-retention window;</li>
<li>MUST treat an exact replay of a previously accepted compact-JWS step proof
for the same authenticated actor and same prior state as an idempotent retry,
not as a distinct successor;</li>
<li>MUST, for such an idempotent retry, return the previously accepted
successor state, or an equivalent token representing that same accepted
successor state, while any required retry record is retained; and</li>
<li>SHOULD, during that retry-retention window, retain the exact previously
issued response or otherwise ensure that a retried response carries the same
accepted chain state, because recomputing with probabilistic signatures can
change wire bytes even when the decoded accepted state is equivalent; and</li>
<li>MUST reject a different attempted successor for the same
<tt>(acti, prior_state, target_context)</tt> tuple unless local policy explicitly
authorizes replacement or supersession; this base specification does not
standardize how multiple accepted successors that share earlier history are
correlated or later merged. Deployments that expect multiple distinct
same-target successors SHOULD distinguish them by including a unique
<tt>request_id</tt> in <tt>target_context</tt>.</li>
</ul>
</section>
</section>

<section anchor="authorization-server-metadata"><name>Authorization Server Metadata</name>
<t>Actor-chain capability discovery uses OAuth 2.0 Authorization Server Metadata
{{!RFC8414}}. This specification does not define a new discovery endpoint.
Clients retrieve Authorization Server metadata from the RFC 8414 well-known
metadata endpoint derived from the issuer, verify that the returned <tt>issuer</tt>
matches the configured issuer, and then process the actor-chain-specific
metadata values defined below.</t>
<t>An Authorization Server supporting this specification SHOULD publish metadata
describing its supported actor-chain capabilities.</t>
<t>This specification defines the following Authorization Server metadata values:</t>

<ul spacing="compact">
<li><tt>actor_chain_bootstrap_endpoint</tt>:
URL of the Authorization Server endpoint used to mint verified profile
bootstrap context for initial actors;</li>
<li><tt>actor_chain_profiles_supported</tt>:
array of supported actor-chain profile identifiers. Each value MUST be the
exact identifier string used both as the <tt>actor_chain_profile</tt> token request
parameter value and as the <tt>actp</tt> token claim value;</li>
<li><tt>actor_chain_commitment_hashes_supported</tt>:
array of supported commitment hash algorithm identifiers;</li>
<li><tt>actor_chain_receiver_ack_supported</tt>:
boolean indicating whether the Authorization Server supports processing and
policy for <tt>hop_ack</tt>;</li>
<li><tt>actor_chain_refresh_supported</tt>:
boolean indicating whether the Authorization Server supports Refresh-Exchange
processing under this specification; and</li>
<li><tt>actor_chain_cross_domain_supported</tt>:
boolean indicating whether the Authorization Server supports cross-domain
re-issuance processing under this specification.</li>
</ul>
<t>Client behavior is:</t>

<ol spacing="compact">
<li>obtain or configure the Authorization Server issuer;</li>
<li>fetch RFC 8414 metadata from the corresponding well-known endpoint;</li>
<li>verify the returned <tt>issuer</tt> exactly matches the configured issuer;</li>
<li>check <tt>actor_chain_profiles_supported</tt> and any other needed actor-chain
capability fields; and</li>
<li>fail closed if the required profile or capability is absent, unless local
policy explicitly allows fallback to plain RFC 8693 behavior.</li>
</ol>
<t>If omitted, clients MUST NOT assume support for any actor-chain profile beyond
out-of-band agreement.</t>
</section>

<section anchor="error-handling"><name>Error Handling</name>
<t>Token exchange errors in this specification build on OAuth 2.0 and OAuth 2.0
Token Exchange.</t>
<t>An Authorization Server processing a token exchange request applies the
following mapping:</t>
<table>
<thead>
<tr>
<th>OAuth error code</th>
<th>Triggering condition</th>
</tr>
</thead>

<tbody>
<tr>
<td><tt>invalid_request</tt></td>
<td>Malformed or missing profile-defined parameters, malformed bootstrap context, malformed ActorID values, malformed commitment objects, unsupported profile bindings, both <tt>actor_chain_cross_domain=true</tt> and <tt>actor_chain_refresh=true</tt>, or structurally malformed inline <tt>act</tt></td>
</tr>

<tr>
<td><tt>invalid_target</tt></td>
<td>The requested audience, canonical target context, or recipient is not permitted or not supported, or a Refresh-Exchange attempts to retarget to a different recipient</td>
</tr>

<tr>
<td><tt>invalid_grant</tt></td>
<td>The <tt>subject_token</tt> fails validation, the intended-recipient check fails, continuity fails at token exchange, replay or freshness checks fail, <tt>actor_chain_step_proof</tt> verification fails, bootstrap-context reuse that is neither an idempotent retry nor an authorized distinct initial successor is detected, required inline <tt>act</tt> disclosure is absent, profile-disclosure rules fail, or the submitted prior state is inconsistent with the claimed profile state</td>
</tr>
</tbody>
</table><t>Recipients and Authorization Servers MUST return protocol-appropriate error
signals for authentication, authorization, profile-validation, and continuity
failures. When the selected profile requires inline <tt>act</tt> disclosure for an
artifact, omission of <tt>act</tt>, or presence of an <tt>act</tt> value that fails that
profile's disclosure rules, MUST be treated as a profile-validation failure.</t>
<t>In HTTP deployments, this typically maps to 400-series status codes and
OAuth-appropriate error values. In non-HTTP deployments, functionally
equivalent protocol-native error signaling MUST be used.</t>
<t>Error responses and logs MUST NOT disclose undisclosed prior actors, full step
proofs, canonical proof inputs, or other sensitive proof material unless the
deployment explicitly requires such disclosure for diagnostics.</t>
</section>

<section anchor="part-ii-security-privacy-deployment-and-rationale"><name>Part II. Security, Privacy, Deployment, and Rationale</name>
</section>

<section anchor="motivating-real-world-examples"><name>Motivating Real-World Examples</name>

<section anchor="full-disclosure-emergency-production-change-in-critical-infrastructure"><name>Full Disclosure: Emergency Production Change in Critical Infrastructure</name>
<t>A safety-critical production environment requires a hotfix during an incident.
The workflow is:</t>

<ul spacing="compact">
<li><tt>A</tt> = on-call engineer;</li>
<li><tt>B</tt> = incident commander;</li>
<li><tt>C</tt> = security approver;</li>
<li><tt>D</tt> = deployment service; and</li>
<li><tt>E</tt> = runtime control plane.</li>
</ul>
<t>Every downstream hop must see the complete visible approval path before
allowing the change to proceed. The deployment service and runtime control
plane both need to verify inline that the on-call engineer initiated the
action, the incident commander approved it, and the security approver signed
off. This is the motivating case for the Full Disclosure profiles: every hop
needs the same full visible lineage for normal online authorization.</t>
</section>

<section anchor="subset-disclosure-regulated-m-a-review"><name>Subset Disclosure: Regulated M&amp;A Review</name>
<t>A large acquisition review passes through multiple highly sensitive business
functions. The workflow is:</t>

<ul spacing="compact">
<li><tt>A</tt> = market-intelligence team;</li>
<li><tt>B</tt> = product-strategy review;</li>
<li><tt>C</tt> = internal legal review;</li>
<li><tt>D</tt> = antitrust counsel; and</li>
<li><tt>E</tt> = Chief Executive Officer.</li>
</ul>
<t>Intermediate actors are intentionally compartmentalized and may be forbidden
from learning who else contributed to the decision. The CEO, however, may need
a richer disclosed chain before approving the transaction. This is the
motivating case for the Subset Disclosure profiles: the Authorization Server
retains authoritative workflow state and discloses to each recipient only the
portion of the chain that recipient is allowed to learn.</t>
</section>

<section anchor="actor-only-disclosure-bank-wire-payment-processing-pipeline"><name>Actor-Only Disclosure: Bank Wire-Payment Processing Pipeline</name>
<t>A bank processes high-value wire payments through a sequence of narrowly scoped
control services. The workflow is:</t>

<ul spacing="compact">
<li><tt>A</tt> = payment-initiation service;</li>
<li><tt>B</tt> = sanctions-screening service;</li>
<li><tt>C</tt> = fraud-scoring service;</li>
<li><tt>D</tt> = treasury and limit-check service;</li>
<li><tt>E</tt> = payment-release service; and</li>
<li><tt>F</tt> = SWIFT or bank-connector service.</li>
</ul>
<t>Each stage authorizes only on the immediately preceding actor for that hop.
The sanctions service needs to know only that the payment-initiation service
invoked it; the fraud service needs to know only that sanctions invoked it;
and so on. Revealing the entire upstream pipeline to every stage adds no value
to the local authorization decision and unnecessarily exposes internal control
topology. This is the motivating case for the Actor-Only profiles: every hop
sees only the current actor inline, while richer workflow state may still be
retained by the Authorization Server for forensic review, legal audit, or
incident review.</t>
</section>
</section>

<section anchor="security-considerations"><name>Security Considerations</name>
<t>A fuller threat discussion appears in Appendix I. This section keeps only the
security considerations that directly affect interoperable processing or likely
implementation choices.</t>

<section anchor="actor-authentication-and-presenter-binding-are-deployment-specific"><name>Actor Authentication and Presenter Binding Are Deployment-Specific</name>
<t>This specification assumes that Authorization Servers can determine the current
actor for an exchange and that recipients MAY establish the presenting actor for
a hop under local policy when needed. The mechanisms that provide those inputs
are intentionally outside the scope of this specification.</t>
</section>

<section anchor="canonicalization-errors-break-interoperability-and-proof-validity"><name>Canonicalization Errors Break Interoperability and Proof Validity</name>
<t>Any ambiguity in canonical serialization, actor identity representation, target
representation, or proof payload encoding can cause false verification failures
or inconsistent commitment values across implementations.</t>
</section>

<section anchor="readable-chain-does-not-prevent-payload-abuse"><name>Readable Chain Does Not Prevent Payload Abuse</name>
<t>A valid visible <tt>act</tt> does not imply that the application-layer request
content is safe, correct, or policy-conformant. Recipients MUST apply local
payload validation and authorization.</t>
</section>

<section anchor="verified-profiles-depend-on-proof-retention"><name>Verified Profiles Depend on Proof Retention</name>
<t>The evidentiary benefits of the verified profiles depend on retention or
recoverability of step proofs, exchange records, and relevant verification
material. Without such retention, the profiles still provide structured
commitment state, but post hoc provability and non-repudiation are materially
weakened.</t>
<t>Authorization Servers supporting verified profiles SHOULD retain proof state,
exchange records, authoritative workflow chain state, and the historical
verification material needed for later verification for at least the maximum
validity period of the longest-lived relevant token plus a
deployment-configured audit window. Retention policies SHOULD also account for
later verification during or after key rotation.</t>
</section>

<section anchor="subset-disclosure-profiles-reveal-only-a-verified-subset"><name>Subset-Disclosure Profiles Reveal Only a Verified Subset</name>
<t>Recipients using the subset-disclosure profiles can authorize based only on the
disclosed visible chain subset that they verify. They MUST treat undisclosed
prior actors as unavailable and MUST NOT infer adjacency, absence, or exact
chain length from the disclosed subset alone.</t>
<t>In this base JWT/JWS binding, the returned ordinary token is visible to the
current actor and to the next recipient. Therefore, a returned subset-disclosure
token cannot safely reveal an actor identity that the current actor is not
permitted to learn. A future recipient-protected disclosure mechanism MAY relax
that limitation, but it is outside this base specification.</t>
<t>A singleton visible chain containing only the current actor is a valid
subset-disclosure outcome. In that case, downstream authorization is current-
actor-only even though the underlying profile remains one of the subset
profiles unless <tt>actp</tt> explicitly selects an actor-only profile.</t>
</section>

<section anchor="cross-domain-re-issuance-must-preserve-chain-state"><name>Cross-Domain Re-Issuance Must Preserve Chain State</name>
<t>A cross-domain Authorization Server that re-issues a local token for the next
recipient MUST preserve the relevant visible chain state unchanged. For <tt>sub</tt>,
it MAY translate the representation only when it preserves the same underlying
subject semantics and does not broaden disclosure.</t>
</section>

<section anchor="branch-reconstruction-is-an-audit-concern"><name>Branch Reconstruction Is an Audit Concern</name>
<t>This specification allows an Authorization Server to issue multiple successor
tokens from one prior accepted state, but it does not standardize merge or
sibling-discovery semantics across branches. Reconstructing a branched call
graph is therefore a forensic or legal-audit concern rather than a normal
online authorization requirement.</t>
<t>Retained Authorization Server records, timestamps, commitment state, and causal
links among presenting actors, current actors, and subsequent actors can often
reveal much of the effective call graph, but this base specification alone does
not guarantee a complete standardized graph across all branches.</t>
<t>This specification does not standardize per-actor causal timestamps inside
nested <tt>act</tt>. Deployments that need branch and time reconstruction SHOULD rely
on retained Authorization Server records, ordinary token or proof timestamps,
commitment state, and parent-child causal linkage across accepted successor
tokens rather than embedding chronology fields in visible <tt>act</tt> entries.</t>
</section>

<section anchor="intended-recipient-checks-reduce-confused-deputy-risk"><name>Intended Recipient Checks Reduce Confused-Deputy Risk</name>
<t>Accepting Authorization Servers MUST ensure that the authenticated current actor
was an intended recipient of the inbound <tt>subject_token</tt>. This reduces a class
of deputy and repurposing attacks, though it does not eliminate all
confused-deputy scenarios.</t>
</section>

<section anchor="chain-depth"><name>Chain Depth</name>
<t>Authorization Servers SHOULD enforce a configurable maximum chain depth. A
RECOMMENDED default is 10 entries. Relying Parties MAY enforce stricter limits.</t>
</section>

<section anchor="key-management"><name>Key Management</name>
<t>Actors SHOULD use short-lived keys and/or hardware-protected keys. Deployments
that require long-term auditability MUST retain, or make durably discoverable,
the historical verification material needed to validate archived step proofs and
receiver acknowledgments after key rotation.</t>
</section>
</section>

<section anchor="privacy-considerations"><name>Privacy Considerations</name>
<t>This section keeps the privacy requirements that affect protocol behavior.
Additional trust-boundary and operational notes appear in Appendix J.</t>
<t>Readable-chain profiles disclose prior actors to downstream recipients.
Deployments that do not require full visible prior-actor authorization SHOULD
consider one of the subset-disclosure profiles.</t>
<t>The stable actor-chain identifier <tt>acti</tt> correlates all accepted hops within one
workflow instance. Accordingly, <tt>acti</tt> MUST be opaque and MUST NOT encode actor
identity, profile selection, business semantics, or target meaning.</t>
<t>Even in the privacy-preserving profiles, the Authorization Server
processing token exchange observes the authenticated current actor and any
retained chain-related state. Accordingly, these profiles reduce ordinary-token
disclosure but do not hide prior actors from the issuing Authorization Server.</t>
<t>Deployments concerned with minimization SHOULD consider:</t>

<ul spacing="compact">
<li>pairwise or pseudonymous actor identifiers;</li>
<li>workflow-local or pairwise <tt>sub</tt> aliases;</li>
<li>omission of auxiliary claims unless receiving policy depends on them; and</li>
<li>the subset-disclosure profiles when partial visible-chain disclosure is
sufficient.</li>
</ul>

<section anchor="subset-disclosure-extensions"><name>Subset Disclosure Extensions</name>
<t>This specification defines subset-disclosure semantics for the Declared
Subset Disclosure profile and the Verified Subset Disclosure profile. In
both profiles, if <tt>act</tt> is disclosed, the recipient-visible <tt>act</tt> is a
profile-defined ordered subsequence of the actor chain for that hop, carried as
an ordinary visible <tt>act</tt> claim containing only the disclosed subset. A subset
profile MAY also omit <tt>act</tt> entirely.</t>
<t>When a subset profile discloses <tt>act</tt>, that representation is the interoperable
base-wire format for the disclosed subset.</t>
<t>Deployments MAY additionally use an optional selective-disclosure or
recipient-protected encoding technique by agreement, including Selective
Disclosure JWT (SD-JWT) {{!RFC9901}}, a future COSE/CBOR companion binding,
or an encrypted envelope, but only as an auxiliary overlay. Such an overlay
MUST NOT replace any required visible subset <tt>act</tt> representation in the
interoperable base-wire format; it MAY only add an equivalent presentation form
whose disclosed value matches the same recipient-visible <tt>act</tt> and does not
change any required validation result.</t>
<t>This specification defines the following actor-chain-specific constraints on
such use:</t>

<ul spacing="compact">
<li>for the Declared Subset Disclosure profile, any disclosed visible chain MUST
be an ordered subsequence of the asserted chain state for that hop;</li>
<li>for the Verified Subset Disclosure profile, any disclosed visible chain MUST
be an ordered subsequence of the verified actor-visible chain for that
hop;</li>
<li>if the selected profile uses step proofs or chain commitments, those
artifacts remain bound to the verified hop progression, not to a later
disclosed subset;</li>
<li>a verifier MUST treat undisclosed information as unavailable and MUST require
disclosure of any information needed for authorization; and</li>
<li>an encoding used with a Full Disclosure profile MUST reveal the full readable
chain required by that profile to the recipient before authorization.</li>
</ul>
</section>
</section>

<section anchor="appendix-a-jwt-binding-normative"><name>Appendix A. JWT Binding (Normative)</name>
<t>This appendix defines the JWT and JWS wire representation for profile-defined
ActorID values, visible <tt>act</tt> structures, step proofs, receiver acknowledgments, and commitment
objects.</t>

<section anchor="actorid-in-jwt"><name>ActorID in JWT</name>
<t>An ActorID is a JSON object with exactly two members:</t>

<ul spacing="compact">
<li><tt>iss</tt>: a string containing the issuer identifier; and</li>
<li><tt>sub</tt>: a string containing the subject identifier.</li>
</ul>
<t>The object MUST be serialized using JCS {{!RFC8785}} whenever it is included in
profile-defined proof or commitment inputs.</t>
<t>When <tt>actp</tt> is present, the visible <tt>act</tt> structure in a JWT is an
ActorChainNode. Newly issued profile-defined nodes MUST contain explicit
<tt>iss</tt> and <tt>sub</tt>, and MAY contain a nested <tt>act</tt> member whose value is the
immediately prior visible ActorChainNode. Validators MUST also be able to
normalize a validated inbound node that omits <tt>iss</tt> and inherits the enclosing
issuer context.</t>
</section>

<section anchor="step-proof-in-jwt"><name>Step Proof in JWT</name>
<t>The <tt>actor_chain_step_proof</tt> token request parameter value MUST be a compact JWS
string {{!RFC7515}}. The JWS protected header MUST contain <tt>typ=act-step-proof+jwt</tt>. The
JWS payload MUST be the UTF-8 encoding of a JCS-serialized JSON object.</t>
<t>For all profiles in the verified branch, the payload MUST contain:</t>

<ul spacing="compact">
<li><tt>ctx</tt>;</li>
<li><tt>acti</tt>;</li>
<li><tt>prev</tt>;</li>
<li><tt>sub</tt>;</li>
<li><tt>target_context</tt>; and</li>
<li><tt>act</tt>.</li>
</ul>
<t>When this payload is used as commitment input through <tt>step_hash</tt>, the
<tt>step_proof_bytes</tt> value is the ASCII byte sequence of the exact compact JWS
serialization of the proof artifact.</t>
<t>The <tt>ctx</tt> member value MUST equal the profile-specific step-proof
domain-separation string <tt>ds(profile)</tt> defined in Common Processing for the
Verified Branch. The <tt>prev</tt> member MUST be the base64url string value of the
prior commitment digest or bootstrap seed, copied directly from the verified
inbound <tt>actc.curr</tt> or bootstrap response, respectively. The <tt>sub</tt> member MUST
be the exact preserved workflow <tt>sub</tt> string for the same-domain hop being
extended. The <tt>act</tt> member MUST
be an ActorChainNode structure and denotes the profile-defined verified
actor-visible chain for the hop. For the Verified Subset Disclosure profile,
the returned ordinary-token <tt>act</tt> MAY disclose any ordered subsequence of that
verified chain that disclosure policy permits, or MAY omit <tt>act</tt> entirely when
that profile and local policy permit omission. For the Verified Actor-Only
Disclosure profile, the returned ordinary-token <tt>act</tt> MUST contain only the
outermost current actor. The <tt>target_context</tt> member MUST conform to the
representation defined in Target Context Requirements.</t>
<t>The JWS algorithm MUST be an asymmetric algorithm. The <tt>none</tt> algorithm MUST
NOT be used. The JWS verification key MUST be trusted under local policy for
the ActorID represented in the proof.</t>
</section>

<section anchor="receiver-acknowledgment-in-jwt"><name>Receiver Acknowledgment in JWT</name>
<t>A <tt>hop_ack</tt>, when used in a JWT deployment, MUST be a compact JWS string {{!RFC7515}}. The
JWS protected header MUST contain <tt>typ=act-hop-ack+jwt</tt>. The JWS payload MUST
be the UTF-8 encoding of a JCS-serialized JSON object with at least these
members:</t>

<ul spacing="compact">
<li><tt>ctx</tt>;</li>
<li><tt>acti</tt>;</li>
<li><tt>actp</tt>;</li>
<li><tt>jti</tt>;</li>
<li><tt>inbound_jti</tt>;</li>
<li><tt>iat</tt>;</li>
<li><tt>exp</tt>;</li>
<li><tt>target_context</tt>;</li>
<li>OPTIONAL <tt>presenter</tt>;</li>
<li><tt>recipient</tt>;</li>
<li>for declared profiles, OPTIONAL <tt>act</tt> as permitted by the selected profile's
disclosure rules for the acknowledged inbound hop;</li>
<li>for verified profiles, <tt>inbound_commitment</tt>; and</li>
<li><tt>ack</tt>.</li>
</ul>
<t>The <tt>ctx</tt> member value MUST equal <tt>actor-chain-hop-ack-v1</tt>. The
<tt>recipient</tt> member MUST be an ActorID object. If <tt>presenter</tt> is present, it
MUST be an ActorID object established under local policy for that hop. The
<tt>ack</tt> member MUST have the value <tt>accepted</tt>. The <tt>jti</tt> member MUST uniquely
identify the <tt>hop_ack</tt> JWT itself. The <tt>inbound_jti</tt> member MUST carry the
<tt>jti</tt> value from the acknowledged inbound token. The <tt>iat</tt> and <tt>exp</tt> members
MUST be JWT NumericDate values, and <tt>exp</tt> SHOULD be short-lived according to
local policy. The <tt>target_context</tt> member MUST conform to the representation
defined in Target Context Requirements. For declared profiles, the <tt>act</tt>
member, when present, MUST carry the verified inbound visible <tt>act</tt> value and
MUST NOT disclose more than the selected profile allowed on the acknowledged
inbound hop. For verified profiles, the <tt>inbound_commitment</tt> member MUST be
copied directly from the verified inbound commitment digest extracted from the
inbound token's <tt>actc.curr</tt>. The JWS signer MUST be the recipient, and the
verification key MUST be trusted under local policy for that recipient
ActorID.</t>
</section>

<section anchor="commitment-object-in-jwt"><name>Commitment Object in JWT</name>
<t>The <tt>actc</tt> claim value MUST be a compact JWS string {{!RFC7515}}. The JWS
protected header MUST contain <tt>typ=act-commitment+jwt</tt>.</t>
<t>The JWS payload MUST be the UTF-8 encoding of a JCS-serialized JSON object with
exactly these members:</t>

<ul spacing="compact">
<li><tt>ctx</tt>;</li>
<li><tt>iss</tt>;</li>
<li><tt>acti</tt>;</li>
<li><tt>actp</tt>;</li>
<li><tt>halg</tt>;</li>
<li><tt>prev</tt>;</li>
<li><tt>step_hash</tt>; and</li>
<li><tt>curr</tt>.</li>
</ul>
<t>The meaning of those members is defined in the main text. <tt>actc</tt> is a
commitment-ledger artifact, not an access token, and therefore does not use
access-token lifetime claims such as <tt>exp</tt>.</t>
</section>
</section>

<section anchor="appendix-b-compact-end-to-end-examples-informative"><name>Appendix B. Compact End-to-End Examples (Informative)</name>

<section anchor="example-1-declared-full-disclosure-in-one-domain"><name>Example 1: Declared Full Disclosure in One Domain</name>
<t>Assume <tt>A</tt>, <tt>B</tt>, and <tt>C</tt> are governed by <tt>AS1</tt>.</t>

<ol spacing="compact">
<li><tt>A</tt> requests a token for <tt>B</tt> under the Declared Full Disclosure profile.</li>
<li><tt>AS1</tt> issues <tt>T_A</tt> with <tt>act=EncodeVisibleChain([A])</tt> and <tt>aud=B</tt>.</li>
<li><tt>A</tt> calls <tt>B</tt> and presents <tt>T_A</tt>.</li>
<li><tt>B</tt> validates <tt>T_A</tt>, verifies continuity, and exchanges <tt>T_A</tt> at <tt>AS1</tt> for
a token to <tt>C</tt>.</li>
<li><tt>AS1</tt> authenticates <tt>B</tt>, verifies that <tt>B</tt> was an intended recipient of the
inbound token, appends <tt>B</tt>, and issues <tt>T_B</tt> with
<tt>act=EncodeVisibleChain([A,B])</tt> and <tt>aud=C</tt>.</li>
<li><tt>B</tt> validates that the returned visible chain is exactly the prior chain plus <tt>B</tt>.</li>
<li><tt>B</tt> presents <tt>T_B</tt> to <tt>C</tt>.</li>
<li><tt>C</tt> validates the token and authorizes based on the visible chain <tt>[A,B]</tt>.</li>
</ol>
</section>

<section anchor="example-2-declared-subset-disclosure"><name>Example 2: Declared Subset Disclosure</name>
<t>Assume <tt>A</tt>, <tt>B</tt>, and <tt>C</tt> use the Declared Subset Disclosure profile and accept the issuing AS as the trust anchor for disclosure
policy.</t>

<ol spacing="compact">
<li><tt>A</tt> requests a token for <tt>B</tt> under the Declared Subset Disclosure profile.</li>
<li><tt>AS1</tt> issues <tt>T_A</tt> with a recipient-specific disclosed visible <tt>act</tt> intended for <tt>B</tt>,
or omits <tt>act</tt> entirely according to local policy.</li>
<li><tt>A</tt> calls <tt>B</tt> and presents <tt>T_A</tt>.</li>
<li><tt>B</tt> validates the token and uses only the disclosed visible chain, if any, for actor-chain
authorization. If <tt>act</tt> is omitted, this specification provides no inline actor-chain
input beyond what is disclosed; any additional authorization inputs come from local policy.</li>
<li><tt>B</tt> exchanges <tt>T_A</tt> at <tt>AS1</tt> for a token to <tt>C</tt>.</li>
<li><tt>AS1</tt> appends <tt>B</tt> to the accepted workflow state for that hop, applies disclosure
policy for <tt>C</tt>, and issues <tt>T_B</tt> with a recipient-specific disclosed visible <tt>act</tt>, or
with no <tt>act</tt>, according to local policy.</li>
<li><tt>B</tt> presents <tt>T_B</tt> to <tt>C</tt>.</li>
<li><tt>C</tt> validates the token and authorizes only on the disclosed visible chain, if any. If
<tt>act</tt> is omitted or does not disclose <tt>B</tt>, this specification provides no inline current-
actor disclosure for that hop, and <tt>C</tt> treats undisclosed actors as unavailable.</li>
</ol>
</section>

<section anchor="example-2b-declared-actor-only-disclosure"><name>Example 2b: Declared Actor-Only Disclosure</name>
<t>Assume <tt>A</tt>, <tt>B</tt>, and <tt>C</tt> use the Declared Actor-Only Disclosure profile.</t>

<ol spacing="compact">
<li><tt>A</tt> requests a token for <tt>B</tt> under the Declared Actor-Only Disclosure profile.</li>
<li><tt>AS1</tt> issues <tt>T_A</tt> with <tt>act=EncodeVisibleChain([A])</tt> and <tt>aud=B</tt>.</li>
<li><tt>A</tt> calls <tt>B</tt> and presents <tt>T_A</tt>.</li>
<li><tt>B</tt> validates that the visible <tt>act</tt> identifies only the current actor
<tt>A</tt> and authorizes only on that actor and local policy.</li>
<li><tt>B</tt> exchanges <tt>T_A</tt> at <tt>AS1</tt> for a token to <tt>C</tt>.</li>
<li><tt>AS1</tt> issues <tt>T_B</tt> with <tt>act=EncodeVisibleChain([B])</tt> and <tt>aud=C</tt>.</li>
<li><tt>B</tt> presents <tt>T_B</tt> to <tt>C</tt>.</li>
<li><tt>C</tt> validates the token and authorizes only on the visible current actor
<tt>B</tt> and local policy.</li>
</ol>
</section>

<section anchor="example-3-verified-full-disclosure-across-two-domains"><name>Example 3: Verified Full Disclosure Across Two Domains</name>
<t>Assume <tt>A</tt> and <tt>B</tt> are governed by <tt>AS1</tt>, while <tt>C</tt> is governed by <tt>AS2</tt>.</t>

<ol spacing="compact">
<li><tt>A</tt> obtains bootstrap context from <tt>AS1</tt>, signs <tt>chain_sig_A</tt>, and receives
<tt>T_A</tt> with <tt>act=EncodeVisibleChain([A])</tt> and <tt>actc</tt>.</li>
<li><tt>A</tt> calls <tt>B</tt> with <tt>T_A</tt>.</li>
<li><tt>B</tt> validates <tt>T_A</tt>, constructs <tt>[A,B]</tt>, signs <tt>chain_sig_B</tt>, and exchanges
<tt>T_A</tt> at <tt>AS1</tt> for a token to <tt>C</tt>.</li>
<li><tt>AS1</tt> verifies <tt>chain_sig_B</tt> submitted as <tt>actor_chain_step_proof</tt>, updates the commitment, and issues <tt>T_B</tt> with
<tt>act=EncodeVisibleChain([A,B])</tt> and <tt>aud=C</tt>.</li>
<li>Because <tt>C</tt> does not trust <tt>AS1</tt> directly, <tt>B</tt> performs a second exchange at
<tt>AS2</tt>.</li>
<li><tt>AS2</tt> preserves <tt>actp</tt>, <tt>acti</tt>, <tt>act=EncodeVisibleChain([A,B])</tt>, and
<tt>actc</tt>, and issues a local token trusted by <tt>C</tt> that still
represents <tt>B</tt>.</li>
<li><tt>C</tt> validates the local token, sees the visible chain <tt>[A,B]</tt>, and
authorizes accordingly.</li>
</ol>
</section>

<section anchor="example-4-verified-actor-only-disclosure"><name>Example 4: Verified Actor-Only Disclosure</name>
<t>Assume <tt>A</tt>, <tt>B</tt>, and <tt>C</tt> use the Verified Actor-Only Disclosure profile.</t>

<ol spacing="compact">
<li><tt>A</tt> obtains bootstrap context, signs <tt>chain_sig_A</tt> over visible chain <tt>[A]</tt>,
and receives <tt>T_A</tt> with <tt>act=EncodeVisibleChain([A])</tt> and <tt>actc</tt>.</li>
<li><tt>A</tt> calls <tt>B</tt> with <tt>T_A</tt>.</li>
<li><tt>B</tt> validates <tt>T_A</tt>, verifies that <tt>A</tt> is the presenter, constructs the
verified actor-visible chain <tt>[A,B]</tt>, signs <tt>chain_sig_B</tt>, and exchanges
<tt>T_A</tt> at its home AS to obtain <tt>T_B</tt> for <tt>C</tt>.</li>
<li><tt>T_B</tt> contains the updated <tt>actc</tt> and visible <tt>act=EncodeVisibleChain([B])</tt>.</li>
<li><tt>B</tt> presents <tt>T_B</tt> to <tt>C</tt>.</li>
<li><tt>C</tt> validates the token and authorizes based only on the disclosed current actor
<tt>B</tt> and local policy. <tt>C</tt> MUST NOT infer prior-actor identity or count from
undisclosed information or from <tt>actc</tt> alone.</li>
</ol>
</section>

<section anchor="example-5-verified-subset-disclosure"><name>Example 5: Verified Subset Disclosure</name>
<t>Assume <tt>A</tt>, <tt>B</tt>, and <tt>C</tt> use the Verified Subset Disclosure profile.</t>

<ol spacing="compact">
<li><tt>A</tt> obtains bootstrap context, signs <tt>chain_sig_A</tt>, and receives <tt>T_A</tt> with
a recipient-specific disclosed visible <tt>act</tt>, or with no <tt>act</tt>, plus <tt>actc</tt> intended
for <tt>B</tt> according to local policy.</li>
<li><tt>A</tt> calls <tt>B</tt> and presents <tt>T_A</tt>.</li>
<li><tt>B</tt> validates the token and uses only the disclosed visible chain, if any, for actor-chain
authorization. If <tt>act</tt> is omitted, this specification provides no inline actor-chain
input beyond what is disclosed; any additional authorization inputs come from local policy.</li>
<li><tt>B</tt> signs <tt>chain_sig_B</tt> over the exact actor-visible chain that <tt>B</tt>
verified on the inbound hop, with <tt>B</tt> appended, and exchanges <tt>T_A</tt> at its
home AS alongside <tt>chain_sig_B</tt> as <tt>actor_chain_step_proof</tt> to obtain <tt>T_B</tt>
for <tt>C</tt>.</li>
<li><tt>AS1</tt> verifies that submitted chain state, applies disclosure policy for <tt>C</tt>,
and issues <tt>T_B</tt> with a recipient-specific disclosed visible <tt>act</tt>, or with no <tt>act</tt>,
and updated <tt>actc</tt>.</li>
<li><tt>B</tt> presents <tt>T_B</tt> to <tt>C</tt>.</li>
<li><tt>C</tt> validates the token and authorizes only on the disclosed visible chain, if any. If
<tt>act</tt> is omitted or does not disclose <tt>B</tt>, this specification provides no inline current-
actor disclosure for that hop, and <tt>C</tt> treats undisclosed actors as unavailable.</li>
<li>If later audit is needed, the verified actor-visible chain for the hop can
be reconstructed from retained step proofs together with exchange records
and, when subset disclosure omitted <tt>act</tt>, any retained Authorization-Server
workflow records needed to supply hidden continuity context.</li>
</ol>
</section>
</section>

<section anchor="appendix-c-future-considerations-informative"><name>Appendix C. Future Considerations (Informative)</name>

<section anchor="terminal-receipts-and-result-attestations"><name>Terminal Receipts and Result Attestations</name>
<t>This specification defines special handling for the first actor in order to
initialize chain state. It does not define corresponding terminal-hop semantics
for a final recipient that performs work locally and does not extend the chain
further.</t>
<t>Future work MAY define:</t>

<ul spacing="compact">
<li>a terminal receipt proving that the recipient accepted the request;</li>
<li>an execution attestation proving that the recipient executed a specific
operation; and</li>
<li>a result attestation binding an outcome or result digest to the final
commitment state.</li>
</ul>
</section>

<section anchor="bootstrap-receipts-and-portable-initial-state-evidence"><name>Bootstrap Receipts and Portable Initial-State Evidence</name>
<t>This specification does not define a bootstrap-signed receipt artifact. Later
audit of bootstrap processing therefore relies on Authorization Server records,
the bootstrap response, the initial step proof, and the first issued ordinary
token.</t>
<t>Future work MAY define a portable bootstrap receipt or bootstrap attestation
artifact if deployments need independently portable evidence of workflow
initialization outside Authorization Server logs.</t>
</section>

<section anchor="receiver-acceptance-and-unsolicited-victim-mitigation"><name>Receiver Acceptance and Unsolicited Victim Mitigation</name>
<t>This specification deliberately does not append a recipient merely because that
recipient was contacted. It also defines an OPTIONAL <tt>hop_ack</tt> extension that
lets a recipient prove accepted responsibility for a hop.</t>
<t>However, this specification still does not by itself prevent a malicious actor
from sending a validly issued token to an unsolicited victim service. Future
work MAY define stronger receiver-driven protections, including:</t>

<ul spacing="compact">
<li>stronger result attestations for completed terminal work;</li>
<li>a challenge-response model for high-risk terminal hops; and</li>
<li>recipient-issued nonces or capabilities that MUST be bound into the final
accepted hop.</li>
</ul>
</section>

<section anchor="subset-disclosure-extensions-1"><name>Subset Disclosure Extensions</name>
<t>This document now defines baseline Declared Subset Disclosure and
Verified Subset Disclosure profiles at the actor-chain semantics
layer. Future work MAY define stronger or more standardized subset-disclosure
encodings and verification techniques, including Selective Disclosure JWT
(SD-JWT) {{!RFC9901}}, a future COSE/CBOR companion binding, recipient-bound
disclosure artifacts, zero-knowledge proofs over the canonical full chain, or
richer verifier-assisted consistency checks against retained proof state.</t>
<t>Any future encoding or presentation profile MUST preserve the disclosure
semantics of the selected base profile. In particular, a Full Disclosure
profile still requires full visible-chain disclosure to the recipient, while
subset-disclosure outcomes that reveal only the current actor MUST NOT expose hidden actor entries to
recipients of ordinary tokens merely as digests or selectively revealable placeholders.</t>
</section>

<section anchor="branching-and-fan-out"><name>Branching and Fan-Out</name>
<t>This specification defines one visible path per issued token and does not
standardize merge or sibling-discovery semantics across multiple descendants
that share earlier workflow history.</t>
<t>An Authorization Server MAY nevertheless mint multiple accepted successor
tokens from one prior accepted state. Such branching is represented across
multiple tokens, not inside one token's nested <tt>act</tt> structure. Later
reconstruction of the resulting call graph is primarily a forensic or legal-
audit concern.</t>
<t>Future work MAY define explicit branch identifiers, parent-child workflow
correlation, tree-structured commitment verification, inclusion proofs, partial
disclosure across branches, and later merge behavior. Such future work could
also help correlate related <strong>WHO</strong>, <strong>WHAT</strong>, and <strong>HOW</strong> evidence across
companion Actor Chain, Intent Chain {{!I-D.draft-mw-spice-intent-chain}}, and
Inference Chain {{!I-D.draft-mw-spice-inference-chain}} deployments.</t>
</section>

<section anchor="evidence-discovery-and-governance-interoperability"><name>Evidence Discovery and Governance Interoperability</name>
<t>Proof-bound profiles derive much of their value from later verification of step
proofs and exchange records. Future work MAY standardize interoperable evidence
discovery, retention, and verification-material publication.</t>
<t>Any such specification should define, at minimum, evidence object typing,
authorization and privacy controls for cross-domain retrieval, stable lookup
keys such as <tt>jti</tt> or <tt>acti</tt>, error handling, and retention expectations.</t>
</section>
</section>

<section anchor="appendix-d-design-rationale-and-relation-to-other-work-informative"><name>Appendix D. Design Rationale and Relation to Other Work (Informative)</name>
<t>This document complements {{!RFC8693}} by defining chain-aware token-exchange
profiles. It also fits alongside the broader SPICE service-to-service and
attestation work {{!I-D.ietf-spice-s2s-protocol}}
{{!I-D.draft-mw-spice-transitive-attestation}} and composes with companion
SPICE provenance work: Actor Chain addresses <strong>WHO</strong> acted, Intent Chain
{{!I-D.draft-mw-spice-intent-chain}} addresses <strong>WHAT</strong> was produced or
transformed, and Inference Chain {{!I-D.draft-mw-spice-inference-chain}}
addresses <strong>HOW</strong> a result was computed.</t>
<t>This specification defines six profiles instead of one deployment mode
so that implementations can choose among full visible chain-based
authorization, trust-first partial disclosure, explicit actor-only operation,
stronger commitment-state accountability, recipient-specific commitment-backed
partial disclosure, and verified actor-only disclosure without changing the
core progression model.</t>
<t>The base specification remains linear. Branching, richer disclosure mechanisms,
and evidence-discovery protocols remain future work because they require
additional identifiers, validation rules, and interoperability work.</t>
</section>

<section anchor="appendix-e-implementation-conformance-checklist-informative"><name>Appendix E. Implementation Conformance Checklist (Informative)</name>
<t>An implementation is conformant only if it correctly implements the profile it
claims to support and all common requirements on which that profile depends.</t>
<t>At a minimum, implementers should verify that they have addressed the
following:</t>
<table>
<thead>
<tr>
<th>Requirement</th>
<th>Draft section reference</th>
<th>Implemented [ ]</th>
</tr>
</thead>

<tbody>
<tr>
<td>Stable generation and preservation of <tt>acti</tt>, using a CSPRNG with at least 122 bits of entropy (for example, standard UUIDv4 or stronger generation)</td>
<td>Actor-Chain Identifier (<tt>acti</tt>)</td>
<td>[ ]</td>
</tr>

<tr>
<td>Local policy for actor authentication or presenter binding, if relied upon</td>
<td>Actor Authentication and Presenter Binding</td>
<td>[ ]</td>
</tr>

<tr>
<td>Exact ActorID equality over (<tt>iss</tt>, <tt>sub</tt>)</td>
<td>Actor Identity Representation</td>
<td>[ ]</td>
</tr>

<tr>
<td>Canonical serialization for all proof and commitment inputs</td>
<td>Canonicalization; Target Context Requirements; Appendix F</td>
<td>[ ]</td>
</tr>

<tr>
<td>Intended-recipient validation during token exchange</td>
<td>Intended Recipient Validation</td>
<td>[ ]</td>
</tr>

<tr>
<td>Replay and freshness handling for tokens and step proofs</td>
<td>Replay and Freshness</td>
<td>[ ]</td>
</tr>

<tr>
<td>Exact append-only checks for full-disclosure profiles</td>
<td>Declared Full Disclosure Profile; Verified Full Disclosure Profile</td>
<td>[ ]</td>
</tr>

<tr>
<td>Correct ordered-subsequence validation for subset-disclosure profiles</td>
<td>Declared Subset Disclosure Profile; Verified Subset Disclosure Profile</td>
<td>[ ]</td>
</tr>

<tr>
<td>Current-actor-only validation for actor-only profiles</td>
<td>Declared Actor-Only Disclosure Profile; Verified Actor-Only Disclosure Profile</td>
<td>[ ]</td>
</tr>

<tr>
<td>Exact commitment verification for verified profiles</td>
<td>Commitment Function; Verified Full Disclosure Profile; Verified Subset Disclosure Profile; Verified Actor-Only Disclosure Profile</td>
<td>[ ]</td>
</tr>

<tr>
<td>Proof-key binding between ActorID and proof signer under local trust policy</td>
<td>Actor and Recipient Proof Keys</td>
<td>[ ]</td>
</tr>

<tr>
<td>Non-broadening Refresh-Exchange processing, if supported</td>
<td>Refresh-Exchange</td>
<td>[ ]</td>
</tr>

<tr>
<td>Correct binding and one-time redemption of bootstrap context for verified workflows</td>
<td>Common Bootstrap Context Request; Common Initial Actor Step Proof and Bootstrap Issuance</td>
<td>[ ]</td>
</tr>

<tr>
<td>Policy for when <tt>hop_ack</tt> is optional or required</td>
<td>Optional Receiver Acknowledgment Extension</td>
<td>[ ]</td>
</tr>

<tr>
<td>Preserve-state handling for cross-domain re-issuance and Refresh-Exchange, if supported</td>
<td>Cross-Domain Re-Issuance; Refresh-Exchange</td>
<td>[ ]</td>
</tr>

<tr>
<td>Privacy-preserving handling of logs and error messages</td>
<td>Error Handling; Privacy Considerations</td>
<td>[ ]</td>
</tr>
</tbody>
</table></section>

<section anchor="appendix-f-canonicalization-test-vectors-informative"><name>Appendix F. Canonicalization Test Vectors (Informative)</name>
<t>The following illustrative vectors are intended to reduce interoperability
failures caused by divergent canonicalization. They are not exhaustive, but
they provide concrete byte-for-byte examples for common JWT/JCS ActorID and
<tt>target_context</tt> inputs.</t>

<section anchor="jwt-jcs-actorid-example"><name>JWT / JCS ActorID Example</name>
<t>Input object:</t>
<t>{::nomarkdown}
&lt;sourcecode type=&quot;json&quot;&gt;
{&quot;iss&quot;:&quot;<eref target="https://as.example&quot;,&quot;sub&quot;:&quot;svc:planner&quot;">https://as.example","sub":"svc:planner"</eref>}
&lt;/sourcecode&gt;
{:/nomarkdown}</t>
<t>JCS serialization (UTF-8 bytes rendered as hex):</t>
<t>{::nomarkdown}
&lt;sourcecode type=&quot;text&quot;&gt;
7b22697373223a2268747470733a2f2f61732e6578616d706c65222c22737562223a227376633a706c616e6e6572227d
&lt;/sourcecode&gt;
{:/nomarkdown}</t>
<t>SHA-256 over those bytes:</t>
<t>{::nomarkdown}
&lt;sourcecode type=&quot;text&quot;&gt;
7a14a23707a3a723fd6437a4a0037cc974150e2d1b63f4d64c6022196a57b69f
&lt;/sourcecode&gt;
{:/nomarkdown}</t>
</section>

<section anchor="jwt-jcs-target-context-example"><name>JWT / JCS <tt>target_context</tt> Example</name>
<t>Input object:</t>
<t>{::nomarkdown}
&lt;sourcecode type=&quot;json&quot;&gt;
{&quot;aud&quot;:&quot;<eref target="https://api.example&quot;,&quot;method&quot;:&quot;invoke&quot;,&quot;resource&quot;:&quot;calendar.read&quot;">https://api.example","method":"invoke","resource":"calendar.read"</eref>}
&lt;/sourcecode&gt;
{:/nomarkdown}</t>
<t>JCS serialization (UTF-8 bytes rendered as hex):</t>
<t>{::nomarkdown}
&lt;sourcecode type=&quot;text&quot;&gt;
7b22617564223a2268747470733a2f2f6170692e6578616d706c65222c226d6574686f64223a22696e766f6b65222c227265736f75726365223a2263616c656e6461722e72656164227d
&lt;/sourcecode&gt;
{:/nomarkdown}</t>
<t>SHA-256 over those bytes:</t>
<t>{::nomarkdown}
&lt;sourcecode type=&quot;text&quot;&gt;
911427869c76f397e096279057dd1396fe2eda1ac9e313b357d9cecc44aa811e
&lt;/sourcecode&gt;
{:/nomarkdown}</t>
</section>
</section>

<section anchor="appendix-g-illustrative-wire-format-example-informative"><name>Appendix G. Illustrative Wire-Format Example (Informative)</name>
<t>This appendix shows one abbreviated decoded JWT payload together with one
abbreviated decoded <tt>actc</tt> JWS payload. The values are
illustrative and signatures are omitted for readability.</t>

<section anchor="decoded-access-token-payload-example"><name>Decoded Access Token Payload Example</name>
<t>{::nomarkdown}
&lt;sourcecode type=&quot;json&quot;&gt;
{
  &quot;iss&quot;: &quot;<eref target="https://as.example&quot;">https://as.example"</eref>,
  &quot;sub&quot;: &quot;svc:planner&quot;,
  &quot;act&quot;: {
    &quot;iss&quot;: &quot;<eref target="https://as.example&quot;">https://as.example"</eref>,
    &quot;sub&quot;: &quot;svc:planner&quot;,
    &quot;act&quot;: {
      &quot;iss&quot;: &quot;<eref target="https://as.example&quot;">https://as.example"</eref>,
      &quot;sub&quot;: &quot;svc:orchestrator&quot;
    }
  },
  &quot;aud&quot;: &quot;<eref target="https://api.example&quot;">https://api.example"</eref>,
  &quot;exp&quot;: 1760000000,
  &quot;jti&quot;: &quot;2b2b6f0d3f0f4d7a8c4c3c4f9e9b1a10&quot;,
  &quot;acti&quot;: &quot;6cb5f0c14ab84718a69d96d31d95f3c4&quot;,
  &quot;actp&quot;: &quot;verified-full&quot;,
  &quot;actc&quot;: &quot;&lt;compact JWS string&gt;&quot;
}
&lt;/sourcecode&gt;
{:/nomarkdown}</t>
</section>

<section anchor="decoded-actc-jws-example"><name>Decoded <tt>actc</tt> JWS Example</name>
<t>Protected header:</t>
<t>{::nomarkdown}
&lt;sourcecode type=&quot;json&quot;&gt;
{&quot;alg&quot;:&quot;ES256&quot;,&quot;typ&quot;:&quot;act-commitment+jwt&quot;}
&lt;/sourcecode&gt;
{:/nomarkdown}</t>
<t>Payload:</t>
<t>{::nomarkdown}
&lt;sourcecode type=&quot;json&quot;&gt;
{
  &quot;ctx&quot;: &quot;actor-chain-commitment-v1&quot;,
  &quot;iss&quot;: &quot;<eref target="https://as.example&quot;">https://as.example"</eref>,
  &quot;acti&quot;: &quot;6cb5f0c14ab84718a69d96d31d95f3c4&quot;,
  &quot;actp&quot;: &quot;verified-full&quot;,
  &quot;halg&quot;: &quot;sha-256&quot;,
  &quot;prev&quot;: &quot;SGlnaGx5SWxsdXN0cmF0aXZlUHJldkRpZ2VzdA&quot;,
  &quot;step_hash&quot;: &quot;z7mq8c0u9b2C0X5Q2m4Y1q3r7n6s5t4u3v2w1x0y9z8&quot;,
  &quot;curr&quot;: &quot;Vb8mR6b2vS5h6S8Y6j5X4r3w2q1p0n9m8l7k6j5h4g3&quot;
}
&lt;/sourcecode&gt;
{:/nomarkdown}</t>
<t>On the wire, the <tt>actc</tt> claim carries the usual compact-JWS
form:</t>
<t>{::nomarkdown}
&lt;sourcecode type=&quot;text&quot;&gt;
BASE64URL(protected-header) &quot;.&quot; BASE64URL(payload) &quot;.&quot; BASE64URL(signature)
&lt;/sourcecode&gt;
{:/nomarkdown}</t>
</section>
</section>

<section anchor="appendix-h-problem-statement-and-deployment-context-informative"><name>Appendix H. Problem Statement and Deployment Context (Informative)</name>
<t>defines the top-level <tt>act</tt> claim for the current actor and allows
nested prior actors. However, prior nested <tt>act</tt> claims are informational only
for access-control decisions. In multi-hop systems, especially service-to-service and agentic systems, that is not sufficient.</t>
<t>Consider:</t>
<t>{::nomarkdown}
&lt;artwork type=&quot;ascii-art&quot;&gt;
User -&gt; Orchestrator -&gt; Planner -&gt; Tool Agent -&gt; Data API
&lt;/artwork&gt;
{:/nomarkdown}</t>
<t>By the time the request reaches the Data API, the immediate caller may or
may not be visible in the token, and the upstream delegation path is not
standardized as a policy input
and is not bound across successive token exchanges in a way that can be
independently validated or audited. This creates several concrete gaps:</t>

<ul spacing="compact">
<li>downstream policy cannot reliably evaluate the full delegation path;</li>
<li>cross-exchange continuity is not standardized;</li>
<li>tampering by an actor and its home AS is not uniformly addressed;</li>
<li>forensic verification of per-hop participation is not standardized; and</li>
<li>ordinary tokens may disclose more visible-chain information than some
deployments are willing to reveal.</li>
</ul>
</section>

<section anchor="appendix-i-threat-model-informative"><name>Appendix I. Threat Model (Informative)</name>
<t>This specification defines a multi-hop, multi-actor delegation model across one
or more trust domains. The security properties provided depend on the selected
profile, the trust relationship among participating Authorization Servers,
and the availability of step proofs or exchange records where relied upon.</t>

<section anchor="assets"><name>Assets</name>
<t>The protocol seeks to protect the following assets:</t>

<ul spacing="compact">
<li>continuity of the delegation path;</li>
<li>integrity of prior-actor ordering and membership;</li>
<li>continuity of the actor represented as current for each hop when such continuity is disclosed or otherwise established under local policy;</li>
<li>binding of each hop to the intended target;</li>
<li>resistance to replay of previously accepted hop state;</li>
<li>audit evidence for later investigation and proof; and</li>
<li>minimization of prior-actor disclosure where privacy-preserving profiles are
used.</li>
</ul>
</section>

<section anchor="adversaries"><name>Adversaries</name>
<t>Relevant adversaries include:</t>

<ul spacing="compact">
<li>an external attacker that steals or replays a token;</li>
<li>a malicious actor attempting to insert, omit, reorder, or repurpose hop
state;</li>
<li>a malicious actor colluding with its home Authorization Server;</li>
<li>a malicious downstream recipient attempting to over-interpret or misuse an
inbound token;</li>
<li>an untrusted or compromised upstream Authorization Server in a multi-domain
path; and</li>
<li>an unsolicited victim service reached by a validly issued token without
having agreed to participate.</li>
</ul>
</section>

<section anchor="assumptions"><name>Assumptions</name>
<t>This specification assumes:</t>

<ul spacing="compact">
<li>verifiers can validate token signatures and issuer trust;</li>
<li>the authenticated actor identity used in token exchange is bound under
local trust policy to the actor identity represented in profile-defined
proofs; and</li>
<li>deployments that rely on later proof verification retain, or can discover,
the verification material needed to validate archived step proofs and exchange
records.</li>
</ul>
</section>

<section anchor="security-goals"><name>Security Goals</name>
<t>The protocol aims to provide the following properties:</t>

<ul spacing="compact">
<li>in the Declared Full Disclosure profile, silent insertion, removal,
reordering, or modification of prior actors is prevented under the assumption
that an actor does not collude with its home Authorization Server;</li>
<li>in the Declared Subset Disclosure profile, ordinary
tokens reveal only a visible ordered subset of actors selected by the
Authorization Server, and authorization is limited to that disclosed subset;</li>
<li>in the Verified Subset Disclosure profile, each
accepted hop is bound to an actor-signed proof over the exact actor-visible
chain for that hop and to cumulative commitment state, while ordinary tokens
reveal only an ordered subset of that actor-visible chain selected by the
Authorization Server;</li>
<li>in the Verified Full Disclosure profile, the actor-visible chain equals the
full visible chain at each hop, preserving full visible authorization while
improving detectability, provability, and non-repudiation; and</li>
<li>in the Verified Actor-Only Disclosure profile, ordinary tokens MUST
disclose only the current actor while preserving current-actor continuity
where that continuity is disclosed or otherwise established under local
policy, together with cumulative commitment state for later verification.</li>
</ul>
</section>

<section anchor="non-goals"><name>Non-Goals</name>
<t>This specification does not by itself provide:</t>

<ul spacing="compact">
<li>integrity or safety guarantees for application payload content;</li>
<li>complete prevention of confused-deputy behavior;</li>
<li>concealment of prior actors from the Authorization Server that processes
token exchange;</li>
<li>standardized merge or branch-selection semantics across branched work; or</li>
<li>universal inline prevention of every invalid token that could be issued by a
colluding actor and its home Authorization Server.</li>
</ul>
</section>

<section anchor="residual-risks"><name>Residual Risks</name>
<t>Even when all checks succeed, a valid token chain does not imply that the
requested downstream action is authorized by local business policy. Recipients
MUST evaluate authorization using only the actor-chain information actually
disclosed to them by the artifact together with token subject, intended target,
and local policy.</t>
<t>Deployments that depend on independently verifiable provenance for high-risk
operations SHOULD require synchronous validation of commitment-linked proof state or
otherwise treat the issuing Authorization Server as the sole trust anchor.</t>
<t>In the Verified Subset Disclosure and Verified Actor-Only Disclosure profiles,
a current actor signs only the exact actor-visible chain available at that hop.
Those profiles therefore provide non-repudiation over the signed visible chain
and linked commitment state, not over hidden prefix semantics against a rogue or
colluding Authorization Server.</t>
</section>
</section>

<section anchor="appendix-j-trust-boundaries-and-audit-guidance-informative"><name>Appendix J. Trust Boundaries and Audit Guidance (Informative)</name>
<t>The trust model and visible-disclosure properties of the six profiles are
defined in the main specification text and Appendix I. This appendix focuses on
operational retention and forensic guidance rather than restating those profile
summaries.</t>
<t>Authorization Servers supporting these profiles SHOULD retain records keyed by
<tt>acti</tt> and <tt>jti</tt>.</t>
<t>For verified profiles, the retention period SHOULD be at least the maximum
validity period of the longest-lived relevant token plus a deployment-configured audit window, and it SHOULD remain sufficient to validate historical
proofs across key rotation.</t>
<t>For verified profiles, such records SHOULD include:</t>

<ul spacing="compact">
<li>prior token reference;</li>
<li>authenticated actor identity accepted for the exchange or proof-validation step;</li>
<li>step proof reference or value;</li>
<li>issued token reference;</li>
<li>commitment state;</li>
<li>requested audience or target context; and</li>
<li>timestamps.</li>
</ul>
<t>For subset-disclosure profiles, retained records SHOULD also allow
reconstruction of the verified actor-visible chain for each hop and the
disclosed subset issued for each recipient. Collecting all such accepted hop
evidence for one <tt>acti</tt>, including retained tokens, proofs, commitments, and
exchange records, can reconstruct the accepted hop sequence, including
repeated-actor revisits, and can often reveal much of the effective call
graph, but this specification does not by itself yield a complete standardized
graph across related branches. If a deployment also relies on a hidden
full-chain prefix not signed by every acting intermediary, the Authorization
Server SHOULD retain the additional state needed to reconstruct that hidden
prefix for later audit.</t>
<t>Actors SHOULD also retain local records sufficient to support replay detection,
incident investigation, and later proof of participation.</t>
</section>

<section anchor="appendix-k-design-decisions-informative"><name>Appendix K. Design Decisions (Informative)</name>
<t>This appendix records key design decisions made in the core specification so
that future revisions can preserve the underlying interoperability and security
rationale even if the document is later split.</t>

<section anchor="why-visible-chain-state-is-carried-in-nested-act"><name>Why visible chain state is carried in nested <tt>act</tt></name>
<t>The interoperable JWT form uses nested <tt>act</tt> as the single authoritative
inline carrier for visible actor-chain state. This avoids maintaining separate
readable chain claims and prevents dual-truth bugs in which two different
claims could describe different visible histories.</t>
</section>

<section anchor="why-top-level-sub-remains-the-workflow-subject"><name>Why top-level <tt>sub</tt> remains the workflow subject</name>
<t>Top-level <tt>sub</tt> identifies the workflow subject of the token rather than the
current actor. This keeps ordinary token semantics aligned with RFC 8693 and
allows the current actor to remain visible in <tt>act</tt>. Replacing <tt>sub</tt> with the
current actor or with a constant marker would make token subject semantics much
less clear for recipients and auditors.</t>
</section>

<section anchor="why-privacy-sensitive-profiles-use-stable-subject-aliases"><name>Why privacy-sensitive profiles use stable subject aliases</name>
<t>Subset-disclosure operation can hide actors only if other visible fields do not
reveal the hidden subject indirectly. The AS therefore chooses a stable
workflow-subject representation at bootstrap, such as a pairwise or
workflow-local alias, and preserves it for the workflow.</t>
</section>

<section anchor="why-subset-disclosure-is-recipient-specific-and-as-driven"><name>Why subset disclosure is recipient-specific and AS-driven</name>
<t>Different recipients in the same workflow can have different need-to-know. The
AS is therefore the policy decision and enforcement point for disclosure and
may issue a narrower or broader visible nested <tt>act</tt> to different recipients,
so long as each returned token remains consistent with the active profile and
any disclosed <tt>act</tt> is a permitted profile-conformant disclosure of the
accepted chain state for that hop.</t>
</section>

<section anchor="why-actor-only-is-a-separate-profile-even-though-subset-can-express-it"><name>Why actor-only is a separate profile even though subset can express it</name>
<t>Actor-only disclosure can be expressed as a special case of subset disclosure,
but this document gives it distinct profile identifiers so that the intended
policy remains explicit and machine-readable to current and future
implementations. A token carrying <tt>actp=declared-actor-only</tt> or
<tt>actp=verified-actor-only</tt> therefore tells every conforming actor and
recipient that ordinary tokens in that workflow MUST expose only the outermost
current actor inline, even though the Authorization Server may retain richer
hidden workflow state for later audit or forensics.</t>
</section>

<section anchor="why-branching-is-represented-across-tokens-not-inside-one-token"><name>Why branching is represented across tokens, not inside one token</name>
<t>Each token carries one visible path in nested <tt>act</tt>. Branching is represented
by issuing multiple successor tokens that share a prior workflow state. This
keeps token syntax simple while still supporting forensic and legal-audit
reconstruction of a broader call graph from retained AS records and related
artifacts.</t>
</section>

<section anchor="why-actc-uses-parent-pointer-commitments-instead-of-merkle-trees"><name>Why <tt>actc</tt> uses parent-pointer commitments instead of Merkle trees</name>
<t>The base commitment mechanism is hop-oriented: each accepted successor step
binds exactly one parent commitment state and one new verified hop. Allowing
multiple successors to share the same parent forms a hash-linked workflow graph
without requiring Merkle-tree ordering rules, sibling proof transmission, or
merge semantics. Future work can add Merkle-style aggregation if deployments
need compact set commitments across many branches.</t>
</section>

<section anchor="why-actp-and-actc-use-short-claim-names"><name>Why <tt>actp</tt> and <tt>actc</tt> use short claim names</name>
<t>These claims appear in every token issued under this specification, and <tt>actc</tt>
also travels in later verified hops. The document therefore uses short claim
names to limit repeated per-hop overhead on the wire. Their meanings are fixed
only by this specification, and the main body defines those semantics before
IANA registration.</t>
</section>

<section anchor="why-rfc-8414-metadata-discovery-is-reused"><name>Why RFC 8414 metadata discovery is reused</name>
<t>The specification reuses the standard RFC 8414 authorization-server metadata
endpoint for discovery. This avoids inventing a new discovery API and keeps
capability negotiation in the well-known OAuth metadata channel that
implementations already use.</t>
</section>

<section anchor="privacy-goals-and-limits"><name>Privacy goals and limits</name>
<t>Subset disclosure limits per-hop visibility, but it does not hide information
from the issuing AS or from colluding parties that pool tokens, proofs,
acknowledgments, and logs. The design therefore treats complete branch and call
graph reconstruction primarily as a forensics or legal-audit concern rather
than an online authorization requirement.</t>
</section>
</section>

<section anchor="iana-considerations"><name>IANA Considerations</name>
<t>This specification does not create a new hash-algorithm registry.
<tt>actc</tt> uses hash algorithm names from the IANA Named
Information Hash Algorithm Registry {{IANA.Hash.Algorithms}}, subject to the
algorithm restrictions defined in this document.</t>

<section anchor="json-web-token-claims-registration"><name>JSON Web Token Claims Registration</name>
<t>This document requests registration of the following claims in the &quot;JSON Web
Token Claims&quot; registry established by {{!RFC7519}}:</t>
<table>
<thead>
<tr>
<th>Claim Name</th>
<th>Claim Description</th>
<th>Change Controller</th>
<th>Specification Document(s)</th>
</tr>
</thead>

<tbody>
<tr>
<td><tt>actc</tt></td>
<td>Proof-bound chain state binding accepted hop progression for the active profile.</td>
<td>IETF</td>
<td>[this document]</td>
</tr>

<tr>
<td><tt>acti</tt></td>
<td>Actor-chain identifier preserved across accepted hops.</td>
<td>IETF</td>
<td>[this document]</td>
</tr>

<tr>
<td><tt>actp</tt></td>
<td>Actor-chain profile identifier for the issued token.</td>
<td>IETF</td>
<td>[this document]</td>
</tr>
</tbody>
</table></section>

<section anchor="media-type-registration"><name>Media Type Registration</name>
<t>This document requests registration of the following media types in the
&quot;Media Types&quot; registry established by {{!RFC6838}}:</t>
<table>
<thead>
<tr>
<th>Media Type Name</th>
<th>Media Subtype Name</th>
<th>Required Parameters</th>
<th>Optional Parameters</th>
<th>Encoding Considerations</th>
<th>Security Considerations</th>
<th>Interoperability Considerations</th>
<th>Published Specification</th>
<th>Applications that use this media type</th>
<th>Fragment Identifier Considerations</th>
<th>Additional Information</th>
<th>Contact</th>
<th>Intended Usage</th>
<th>Restrictions on Usage</th>
<th>Author</th>
<th>Change Controller</th>
</tr>
</thead>

<tbody>
<tr>
<td><tt>application</tt></td>
<td><tt>act-step-proof+jwt</tt></td>
<td>N/A</td>
<td>N/A</td>
<td>binary</td>
<td>see [this document]</td>
<td>N/A</td>
<td>[this document]</td>
<td>OAuth 2.0 Token Exchange actor-chain step proofs</td>
<td>N/A</td>
<td>Magic Number(s): N/A; File Extension(s): N/A; Macintosh File Type Code(s): N/A</td>
<td>IETF</td>
<td>COMMON</td>
<td>N/A</td>
<td>IETF</td>
<td>IETF</td>
</tr>

<tr>
<td><tt>application</tt></td>
<td><tt>act-commitment+jwt</tt></td>
<td>N/A</td>
<td>N/A</td>
<td>binary</td>
<td>see [this document]</td>
<td>N/A</td>
<td>[this document]</td>
<td>OAuth 2.0 Token Exchange actor-chain commitments</td>
<td>N/A</td>
<td>Magic Number(s): N/A; File Extension(s): N/A; Macintosh File Type Code(s): N/A</td>
<td>IETF</td>
<td>COMMON</td>
<td>N/A</td>
<td>IETF</td>
<td>IETF</td>
</tr>

<tr>
<td><tt>application</tt></td>
<td><tt>act-hop-ack+jwt</tt></td>
<td>N/A</td>
<td>N/A</td>
<td>binary</td>
<td>see [this document]</td>
<td>N/A</td>
<td>[this document]</td>
<td>OAuth 2.0 Token Exchange actor-chain receiver acknowledgments</td>
<td>N/A</td>
<td>Magic Number(s): N/A; File Extension(s): N/A; Macintosh File Type Code(s): N/A</td>
<td>IETF</td>
<td>COMMON</td>
<td>N/A</td>
<td>IETF</td>
<td>IETF</td>
</tr>
</tbody>
</table></section>

<section anchor="oauth-uri-registration"><name>OAuth URI Registration</name>
<t>This document requests registration of the following value in the
&quot;OAuth URI&quot; registry established by {{!RFC6749}}:</t>
<table>
<thead>
<tr>
<th>URI</th>
<th>Description</th>
<th>Change Controller</th>
<th>Specification Document(s)</th>
</tr>
</thead>

<tbody>
<tr>
<td><tt>urn:ietf:params:oauth:grant-type:actor-chain-bootstrap</tt></td>
<td>OAuth grant type for the initial verified profile bootstrap token request.</td>
<td>IETF</td>
<td>[this document]</td>
</tr>
</tbody>
</table></section>

<section anchor="oauth-authorization-server-metadata-registration"><name>OAuth Authorization Server Metadata Registration</name>
<t>This document requests registration of the following metadata names in the
&quot;OAuth Authorization Server Metadata&quot; registry established by {{!RFC8414}}:</t>
<table>
<thead>
<tr>
<th>Metadata Name</th>
<th>Metadata Description</th>
<th>Change Controller</th>
<th>Specification Document(s)</th>
</tr>
</thead>

<tbody>
<tr>
<td><tt>actor_chain_bootstrap_endpoint</tt></td>
<td>Endpoint used to mint bootstrap context for verified profile initial actors.</td>
<td>IETF</td>
<td>[this document]</td>
</tr>

<tr>
<td><tt>actor_chain_profiles_supported</tt></td>
<td>Supported actor-chain profile identifiers.</td>
<td>IETF</td>
<td>[this document]</td>
</tr>

<tr>
<td><tt>actor_chain_commitment_hashes_supported</tt></td>
<td>Supported commitment hash algorithm identifiers.</td>
<td>IETF</td>
<td>[this document]</td>
</tr>

<tr>
<td><tt>actor_chain_receiver_ack_supported</tt></td>
<td>Indicates support for receiver acknowledgments (<tt>hop_ack</tt>) under this specification.</td>
<td>IETF</td>
<td>[this document]</td>
</tr>

<tr>
<td><tt>actor_chain_refresh_supported</tt></td>
<td>Indicates support for Refresh-Exchange under this specification.</td>
<td>IETF</td>
<td>[this document]</td>
</tr>

<tr>
<td><tt>actor_chain_cross_domain_supported</tt></td>
<td>Indicates support for cross-domain re-issuance under this specification.</td>
<td>IETF</td>
<td>[this document]</td>
</tr>
</tbody>
</table></section>

<section anchor="oauth-parameter-registration"><name>OAuth Parameter Registration</name>
<t>This document requests registration of the following parameter names in the
relevant OAuth parameter registry:</t>
<table>
<thead>
<tr>
<th>Parameter Name</th>
<th>Parameter Usage Location</th>
<th>Change Controller</th>
<th>Specification Document(s)</th>
</tr>
</thead>

<tbody>
<tr>
<td><tt>actor_chain_profile</tt></td>
<td>actor-chain bootstrap endpoint request; OAuth token endpoint request</td>
<td>IETF</td>
<td>[this document]</td>
</tr>

<tr>
<td><tt>actor_chain_bootstrap_context</tt></td>
<td>actor-chain bootstrap endpoint response; OAuth token endpoint request</td>
<td>IETF</td>
<td>[this document]</td>
</tr>

<tr>
<td><tt>actor_chain_step_proof</tt></td>
<td>OAuth token endpoint request</td>
<td>IETF</td>
<td>[this document]</td>
</tr>

<tr>
<td><tt>actor_chain_refresh</tt></td>
<td>OAuth token endpoint request</td>
<td>IETF</td>
<td>[this document]</td>
</tr>

<tr>
<td><tt>actor_chain_cross_domain</tt></td>
<td>OAuth token endpoint request</td>
<td>IETF</td>
<td>[this document]</td>
</tr>
</tbody>
</table></section>
</section>

</middle>

<back>

</back>

</rfc>
