| Internet-Draft | OAuth Mission | November 2026 |
| McGuinness | Expires 6 May 2027 | [Page] |
OAuth 2.0 has authorization grants and access tokens but no standard object that binds an approved task, such as one an AI agent performs on a user's behalf, to the authority approved for it and governs the tokens later issued under that authority. This document defines that object for OAuth 2.0: a Mission.¶
A client submits, through Pushed Authorization Requests, a Mission Intent describing the task it will perform. The authorization server derives Rich Authorization Requests authorization details from it, binds the approved task and that authority to the Approver's consent through integrity anchors, and records a durable Mission. Every access token issued under the Mission carries a subset of the approved authority and a "mission" claim, and every issuance is gated on the Mission's lifecycle state. Revoking a Mission stops further issuance; it does not recall tokens already issued, which a resource server that enforces from the token alone can continue to honor until they expire.¶
Optional capabilities represent delegation among agents with the OAuth Actor Profile and, as specified by a companion, let a single Mission be honored across trust domains. Runtime enforcement of each action is a separate, optional layer.¶
This note is to be removed before publishing as an RFC.¶
The latest revision of this draft can be found at https://mcguinness.github.io/mission-bound-authorization/draft-mcguinness-oauth-mission.html. Status information for this document may be found at https://datatracker.ietf.org/doc/draft-mcguinness-oauth-mission/.¶
Source for this draft and an issue tracker can be found at https://github.com/mcguinness/mission-bound-authorization.¶
This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79.¶
Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet-Drafts is at https://datatracker.ietf.org/drafts/current/.¶
Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress."¶
This Internet-Draft will expire on 6 May 2027.¶
Copyright (c) 2026 IETF Trust and the persons identified as the document authors. All rights reserved.¶
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Revised BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Revised BSD License.¶
This document defines a Mission: a durable authorization object that binds a disclosed task to an explicitly approved Authority Set and governs the lifecycle of the authority derived from that approval.¶
Agent-identity work such as [I-D.draft-ietf-wimse-aims]
establishes how an AI agent authenticates and how a user delegates
authority to it. It leaves out of scope how the agent's task is
translated into authorization, how the user's approval of that task
is captured, and how later token issuance stays bound to that
approval. OAuth itself defines no task record that links approval of
a task to the grants obtained for it: an authorization_details
entry ([RFC9396]) expresses authority, but not the task it serves
or a lifecycle of its own, so withdrawing approval of a task need not
stop issuance under its grants.¶
A Mission fills that gap. A client submits a Mission Intent
describing the task, the authorization server (AS) derives the
Authority Set the task needs, and an Approver consents to that
Authority Set. The AS records the Mission and binds the resulting
grant to it. It then issues tokens under the Mission only while the
Mission is active, each bounded by the approved Authority Set, and
resource servers enforce the resulting tokens. Revoking or expiring a
Mission stops further issuance and refresh, but does not by itself
invalidate an already-issued access token (Section 10.2).
Section 2 shows the protocol flow and an example.¶
The sections follow this flow. Section 4 and Section 5 define what a client submits and what the AS derives from it; Section 6 the approval, the record, and the grant binding; Section 7 issuance on every path; Section 8, an optional capability, delegation within a Mission; Section 9 enforcement and introspection; and Section 10 the Mission's state and its termination. Section 11, Section 12, Section 13, and Section 14 are reference sections; Section 15 defines the conformance roles; and Appendix B lists what a deployment decides and how each party learns it.¶
This document targets OAuth deployments where authority serves a durable, approved task that spans more than one token, request, or audience: an agent pursuing a multi-step objective on a user's behalf, or a workflow whose audit must join activity across hops on a shared task.¶
This document is not intended for single-request user flows and short-lived authorizations where the credential's lifetime is the task's lifetime, ordinary machine-to-machine service credentials among them; those use OAuth unchanged. The boundary is that lifetime equality, not the absence of a human: a workload's durable multi-step task is in scope as a service-owned Mission (Section 6.1.4).¶
Without its optional capabilities (Section 15.2), an
implementation of this document needs nothing beyond its normative
references and one AS-supported authorization_details type
(Section 15). It turns an Approver's consent to a task's derived
Authority Set into a Mission at approval and binds the Mission to the
authorization code it issues (Section 6.4). Every token derived
from that grant carries the Mission, every issuance is gated on its
state and bounded by its Authority Set, every credential the Mission
Issuer derives expires no later than the Mission, and the Mission Issuer
accepts revocation by mission_id from a party its policy authorizes,
independent of possession of any token (Section 10.2). Resource
servers enforce the carried entries, or a scope projected from them
(Section 7.7); a runtime layer that evaluates each
consequential action against the Mission is out of scope
(Section 17.3.1).¶
The direct realization creates each Mission at an approval interaction on the authorization endpoint, and a Mission is intended to cover one concrete task, not an agent's whole lifetime. Other creation paths are extensions (Section 14.3); [I-D.draft-mcguinness-mission-architecture] describes deployment patterns, including Mission sizing (Section "Mission Deployment Patterns").¶
The following figure shows the protocol flow between the agent (the OAuth client) and the Mission Issuer (the AS); Section 3 defines the Subject, the Approver, and the other terms:¶
Agent (client) Mission Issuer (AS)
| |
| 1. PAR: intent + proposal --------->| derive authority
|<----------- request_uri ------------| (authz_details)
| |
| 2. authorization request ---------->| Approver consents
| | -> authority_hash
|<-------------- code ----------------| -> Mission active
| | (bound to the grant)
| |
| 3. token request ------------------>| gate: active?
|<----------- access token -----------| + authz_details
| | + mission claim
v
¶
Submit. The client pushes a Mission Intent describing the
task, optionally with proposed authorization_details
(Section 4.2). The AS derives the Authority Set, the
concrete authority the task needs (Section 5).¶
Approve and commit. The Approver consents to that Authority
Set itself, not to the task description alone (Section 6.1).
The AS records the active Mission, commits the Intent as
intent_hash and the approved Authority Set as authority_hash
(Section 6.3.1), and binds the grant the approval produces
to the Mission server-side. Any grant lineage bound to a Mission
resolves to exactly that Mission, and no client input chooses it
(Section 6.4).¶
Issue. At each token request the AS checks that the Mission is
active and derives authority no broader than the approved
Authority Set (Section 7.1, Section 5.4). The access token
carries the derived authorization details and a mission claim
identifying the Mission (Section 7.8), and a resource server
enforces statelessly from the token (Section 9.1).¶
Each later issuance from that grant lineage, such as a refresh, is a
derivation under the same checks, and a token derived by Token
Exchange carries the same mission claim (Section 7.5,
Section 8.2). Revoking or expiring the Mission stops
further issuance and refresh, including from any grant lineage bound
to it (Section 6.4.3). An already-issued access token can
still be honored on a stateless enforcement path until it expires
(Section 10.2). A user thus approves
a task's authority once, and that approval bounds every token the
agent derives. Section 2.2 walks through these steps with
concrete values.¶
In the examples in this document, each service's operation contract
identifies the service's own identifier, such as
https://erp.example.com, as the operation target
([I-D.draft-mcguinness-oauth-mission-resource-access]). Actions and
constraints determine the permitted operations within that service.¶
The following example shows a registered client reading invoices
from one ERP resource for Alice, who is both the Subject and the
Approver; the authority source is user-delegated. The AS and ERP
support the mission_resource_access type defined by
[I-D.draft-mcguinness-oauth-mission-resource-access]. The example
uses a direct approval, a JWT access token, no delegated token, and
no submission evidence (the AS's admission policy requires none).
All times are UTC on the same day.¶
Submit. The client pushes a Mission Intent naming
https://erp.example.com and requesting expiry at 13:00, with a
proposed authorization_details entry of type
mission_resource_access for that resource and the action
invoices.read. It follows the PAR request_uri into the
authorization interaction (Section 4.2).¶
Approve and commit. At 12:00 the AS authenticates Alice, verifies the authority source and proposed read authority, and renders that authority and the effective 13:00 expiry for her approval. On approval it atomically creates the active Mission, records its commitments, and binds the authorization code to it (Section 6.1.1, Section 6.4.1).¶
Issue. Still at 12:00, the client redeems the code. The AS
resolves and checks the Mission and returns a sender-constrained
ERP token that expires at 12:05, with the read authority and a
mission reference. The response also carries the granted
authority (Section 7.3), mission_id, and
mission_expires_at; the access token's five-minute lifetime is
distinct from the Mission's one-hour lifetime
(Section 7.3.1).¶
Use. The ERP is a Mission-aware Resource Server: it enforces
the mission_resource_access entry itself, work a plain
[RFC9068] resource server does not do (Section 15). It
validates the token and proof of possession and permits the
authorized read; the
token grants no write authority. The resource request involves no
Mission-state lookup or complete-set retrieval (Section 9.1).¶
Stop further issuance. At 12:02 an authorized revocation makes
the Mission non-active. A subsequent refresh, if the AS issued a
refresh token, is refused with the invalid_grant error code
(Section 7.1.1). The already-issued access token can
still be honored on this stateless path until 12:05; revocation does
not undo a completed read (Section 10.2).¶
An ERP that instead introspects on every request stops honoring the
token on its next request after revocation, through the composite
active result (Section 9.2.2).¶
The later message examples use the end-to-end example's separate Q3 reconciliation Mission (Appendix A), whose approved authority includes invoice reads and bounded journal writes. Its identifiers and timeline differ from this introductory example.¶
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" 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.¶
All JSON shown in this document is non-normative and illustrative; the member definitions in the surrounding text are authoritative. An example line too long for the page is folded with the single backslash strategy of [RFC8792].¶
The OAuth client acting for the Mission's Subject, identified by
client_id. Agent identity is established per
[I-D.draft-ietf-wimse-aims] or ordinary OAuth client
authentication.¶
The user, workload, or organizational principal on whose behalf the
Mission is approved (Section 6.1.4), identified by an
(iss, sub) pair and carried in derived tokens' sub claim.¶
The single accountable principal who approves the Mission: at its direct approval event or, under a standing-consent basis, through the earlier standing consent (Section 14.3). Equal to the Subject for self-approval; different for administrator or delegated approval. Multi-party approval and the provenance of delegated approval authority are out of scope (Section 6.1.8).¶
The OAuth AS that validates a Mission Intent, runs the approval
event, records the Mission, and derives tokens. It is the Mission's
issuer; this document also calls it the "issuer AS" or the "AS".¶
The client conformance role, defined in Section 15.¶
A client that the deployment registers as Mission-governed ("a client registered as Mission-governed"); Section 4.3.3 states the rule that registration triggers.¶
The resource server conformance role, defined in Section 15.¶
An authorization server in another trust domain that honors a Mission it did not issue, minting its own tokens for its resources; it is never the Mission Issuer.¶
The structured description of the task the client submits (Section 4).¶
The object a client submits as the mission_intent parameter
value: the Mission Intent under intent, and Intent Submission
Evidence under evidence where any is presented
(Section 4.2.1).¶
Typed artifacts a client presents in support of claims about a submitted Mission Intent (Section 4.4): authenticated policy input, not authority. The term names only inbound, client-presented material, not the issuer- or runtime-produced evidence this document and companion profiles emit and record (a consent-evidence artifact, an audit evidence base).¶
The authorization_details array a client submits alongside a
Mission Intent, a proposal for Authority Set derivation and not
authority (Section 4.3).¶
The set of authorization_details entries the AS derives from a
Mission Intent and the Approver approves
(Section 5).¶
Computing the Authority Set from a Mission Intent and any authority proposal, in narrowing or configured-mapping mode (Section 5.1).¶
One issuance operation the issuer AS performs for a single request (Section 7.1): the initial authorization-code exchange, a refresh, a Token Exchange, or the redemption of a profile-defined grant. Distinct from Authority Set derivation, which some section titles and fixed phrases, such as "derivation policy", also call derivation.¶
The durable authorization object that binds a disclosed task (its
Mission Intent) to an explicitly approved Authority Set and governs
the lifecycle of the authority derived from that approval. It is the
record created at the approval event (Section 6.2), immutable
except for its state and termination members, identified by a
Mission Identifier (Section 6.2.5) and, globally, by
the pair (issuer, id). A Mission is independent of any OAuth
grant (Section 6.4). "The approved task" is shorthand for this
binding: the Approver approves the Authority Set, and the task is
disclosed and committed beside it.¶
The AS-controlled, functional mapping from one persistent,
redeemable grant lineage to exactly one Mission (Section 6.4).
Distinct from a Derived token's own mission claim, which every
Derived token carries without itself creating a grant binding.¶
A token that carries a Mission reference (for example, a
mission_id or a descriptor a companion profile defines) without
Mission-derived authority or any gating guarantee. An access token
of this class does not carry the mission claim
(Section 7.8.1).¶
An access token issued under a Mission, carrying its Mission-derived
authority (the full Authority Set or a narrowed subset) as
authorization_details and a mission claim
(Section 7).¶
A Mission-derived access token or refresh token whose issuance and
refresh are gated on the Mission's active state and bounded by the
subset rule (with refresh tokens bound server-side). Only this class
carries the gating guarantee of this document; a token that only
references or carries Mission data without the gates is not
Mission-bound (Section 15).¶
An authorization_details entry that applies, under the entry's
type, to a request to a resource server: where the type defines a
resource, the request's operation target matches it under that type
(Section 7.3). Section 9.1.1 governs an entry whose type
the resource server does not implement, or whose type-defined
enforcement it cannot complete.¶
A sub-agent, service, or tool, itself an OAuth client authenticated as a distinct actor, that obtains a delegated token by Token Exchange (Section 8).¶
The holder of a Mission-bound access token that obtains a designation for a delegate: the Mission's approved agent, or a delegate delegating further (Section 8.1).¶
The delegating party's authorization, obtained by Token Exchange, for one delegate to obtain delegated tokens (Section 8.1).¶
The Token Exchange in which a delegate redeems a designation naming
it for a delegated token, whose act claim names that delegate as
the current actor (Section 8.2).¶
A Token Exchange with no actor in which an agent presents its own Mission-bound access token to obtain a narrowed one; it delegates nothing (Section 7.5).¶
This document maps principals onto native OAuth constructs:¶
The Agent is the OAuth client, referenced by client_id; its
identity and credentialing are out of scope
([I-D.draft-ietf-wimse-aims]).¶
The Subject and Approver are each an (iss, sub) pair,
matching the access token sub model of [RFC9068]. The Approver is
the accountable consent principal whose approval created the Mission,
always equal to approval_basis.consent_principal. Under a
standing-consent basis, the Approver remains the human whose consent
roots the Mission (Section 14.3).¶
On a derived token, the iss claim is the AS and the sub claim is
the AS-local sub to which the AS maps the Subject under the
injective mapping of Section 6.1.3; adopting the external sub
verbatim is the common case. Within the issuing AS's namespace, this
(iss, sub) pair is the AS-local subject principal, authoritative
for the Subject, and resource servers authorize against it.¶
The Mission separately records the Subject's home issuer and
identifier as subject.iss and subject.sub: the external subject
identity, carried as provenance for audit and not on the token. This
document defines no runtime lookup of it.¶
The record's (subject.iss, subject.sub) and the token's (AS
iss, sub) identify the same Subject in two issuer namespaces.¶
Issuer roles obey two invariants: a Mission has exactly one Mission
Issuer, its issuer, and a Resource AS never creates or alters a
Mission.¶
Principals are recorded at the approval event and are immutable. Two
principals are equal when their iss and sub are byte-equal, so
the test compares principals only within one issuer namespace and
never compares the external subject identity with the AS-local
subject principal.¶
Dynamic delegation (the actors an agent delegates to during
execution) is carried on derived tokens in the act chain
(Section 8.2), not on the Mission Record. This
document uses only (iss, sub) pairs, not the subject identifier
formats of [RFC9493].¶
A Mission Intent is a JSON object describing the task. The client
submits it as the intent member of the Submission envelope
(Section 4.2.1), in place of scope or alongside a narrowed
scope.¶
Before the approval event (Section 6.1), only the Mission Intent exists, as untrusted client input (Section 4.2); after it, only the Mission is authoritative. A Mission Intent therefore has no protocol identifier of its own: two submissions of the same Intent produce two distinct pending requests, and a Mission acquires its Mission Identifier (Section 6.2.5) only at activation.¶
The approved Intent carries no authority members. The task, the proposed authority, and the granted authority are committed separately (Section 6.3.1):¶
intent_hash commits the approved Intent, which is recorded on the
Mission;¶
proposal_hash commits any authority proposal, which the client
submits separately, on the standard authorization_details parameter
(Section 4.3); and¶
authority_hash commits the granted authority, the derived Authority
Set (Section 5).¶
The client writes every Intent member; how it produces them, for
example through a Mission Shaper working from a natural-language
instruction, is out of scope ([I-D.draft-mcguinness-mission-shaping]).
The prose members (goal, task_bounds) bound authority only through
disclosure: the Approver refuses authority the words do not support
(Section 5).¶
An AS that makes no use of an optional member still accepts it and records it with the Intent (Section 4.5). The smallest Intent carries only the three required members, as in the Submission envelope example (Section 4.2.1). The following summary is informative; the member definitions after it are authoritative.¶
| Member | Required | What the AS does with it |
|---|---|---|
goal
|
yes | Records it and renders it to the Approver as inert text; never interprets it |
goal_lang
|
no | Checks the language tag and uses it when rendering |
target_resources
|
yes | Bounds the resources a derived entry can name; can key a configured mapping |
task_bounds
|
no | Records it and renders it to the Approver as inert text; never interprets it |
purpose
|
no | Records it; can key a configured mapping; in any other decision can only lead to a refusal or stricter treatment |
expires_at
|
yes | Caps the Mission's effective expiry; refuses a malformed or past value |
The Mission Intent members are:¶
goal:REQUIRED. A string. A human-readable statement of the task, for rendering to the Approver. Maximum 4096 characters.¶
It can describe the outcomes that show the task is complete; like the rest of the prose, that description carries no machine semantics (Section 5).¶
Prose here persists on the record and can carry personal data about third parties (Section 18.4).¶
goal_lang:OPTIONAL. A string. A BCP 47 language tag [RFC5646] declaring the
language of the Intent's human-readable members (goal,
task_bounds).¶
It is disclosure metadata for rendering, committed by intent_hash
like every Intent member, and carries no machine semantics
(Section 5).¶
At submission acceptance, the AS MUST refuse a goal_lang that is
not a well-formed language tag with invalid_request (Section 19).¶
target_resources:REQUIRED. An array of strings. A client-requested Intent ceiling on the task's target resources, each an absolute URI identifying a protected resource (an OAuth resource per [RFC8707]-style indicators or a protected resource per [RFC9728]).¶
It bounds which resources a derived Authority Set entry may name
(Section 5) and serves as a configured-mapping
lookup key (Section 5.1); like purpose, the key alone
grants no authority.¶
It is not RFC 8707 resource carriage: a client separately requests
the audience of a given token with the standard resource parameter
(Section 7.3).¶
task_bounds:OPTIONAL. An array of strings. Human-readable bounds on the task (for example, "read only invoices from 2026"). They are disclosure and audit context, rendered to the Approver beside the derived Authority Set (Section 6.1.1), and carry no machine semantics (Section 5); a machine-enforceable bound enters as structure instead.¶
purpose:OPTIONAL. A string. A URI identifying the purpose of the task, recorded for disclosure and audit. Its semantics are deployment- or registry-defined and opaque to this document.¶
purpose is an opaque lookup key: a configured mapping can key on
it to select candidate entries, which the Intent, policy, and the
approval event bound as in any Authority Set derivation
(Section 5); the key alone grants no authority.¶
In any other decision, purpose MAY contribute only to a refusal or
to stricter treatment: its value, its absence, or a substituted
value MUST NOT supply, widen, relax, or refresh authority, or
replace a check that applies independently of it.¶
After approval, the purpose consulted is the approved Mission's,
or a validated projection of it.¶
expires_at:REQUIRED. A string. An RFC 3339 [RFC3339] date-time: the client's requested not-after ceiling for the Mission's lifetime.¶
The submitted Intent is recorded verbatim.¶
The granted lifetime is the Mission Record's effective expires_at,
which the AS establishes at Mission creation and which is no later
than this value (Section 6.1.1, Section 6.2).¶
At submission acceptance, the AS MUST refuse a malformed or
already-past value with invalid_request.¶
Acceptance does not freeze time: Mission creation re-checks the effective expiry atomically at the commit (Section 6.1.1).¶
A request that resolves to an already-committed operation is recovery, not a new submission, and returns the stored outcome under the applicable idempotency rules even when the ceiling has since passed (Section 7.3.1, Section 6.2).¶
The Approver's authentication strength for the approval event is
requested with the standard acr_values and max_age
authorization-request parameters, not on the Intent
(Section 6.1.2.1).¶
The Mission Intent's top level is closed to the members above and to those a companion profile the AS implements defines (Section 14, Section 4.2.1).¶
The following is an example of a Mission Intent:¶
=============== NOTE: '\' line wrapping per RFC 8792 ===============
{
"goal": "Reconcile Q3 invoices and post adjustments of at most \
USD 500 per journal entry.",
"target_resources": ["https://erp.example.com"],
"task_bounds": [
"Read only invoices issued in 2026-Q3.",
"Post journal entries of at most USD 500 each."
],
"purpose": "urn:example:purpose:reconcile",
"expires_at": "2026-12-31T23:59:59Z"
}
¶
A client submits a Mission Intent, with any Intent Submission
Evidence, in a Submission envelope (Section 4.2.1) sent as
mission_intent. On the authorization-code path, the envelope travels
through a Pushed Authorization Request (Section 4.2.2); a
companion profile can define another, back-channel carriage
(Section 4.2.3).¶
A Mission Intent, and any authority proposal submitted alongside it (Section 4.3), is untrusted client input; trust enters only when the AS validates it and the Approver consents to the rendered result. The AS derives and bounds authority by its own policy, whatever the client submitted (Section 5).¶
The Submission envelope is a JSON object with exactly these members:¶
intent:evidence:OPTIONAL. A non-empty array of Intent Submission Evidence entries
(Section 4.4); the AS refuses an empty array
with the invalid_request error code.¶
The intent_hash anchor commits exactly the intent object, not the
Submission envelope or its evidence array (Section 6.3.1).¶
The following rules govern a submission:¶
Structural validity. An AS that cannot parse mission_intent as
a JSON object, or that parses it but finds the Submission envelope or
the Intent structurally invalid against this document's member
definitions, MUST refuse the request with the invalid_request
error code.¶
Closed top levels. The AS MUST refuse a submission with the
invalid_request error code if the Submission envelope contains a
top-level member other than intent and evidence, or if the
intent contains a top-level member that neither this document
nor a companion profile the AS implements defines
(Section 14). A bare Mission Intent submitted as the
parameter value fails this rule, since its goal and sibling
members are unknown envelope members.¶
Bounded size. The AS MUST bound the Submission envelope's
total size, the Intent's total size and the lengths of its arrays,
and the count and per-entry sizes of evidence entries, refusing
a submission that exceeds the deployment-defined limits with
invalid_request.¶
The following is an example of a Submission envelope carrying a compact Intent and one evidence entry of an illustrative, deployment-defined type:¶
=============== NOTE: '\' line wrapping per RFC 8792 ===============
{
"intent": {
"goal": "Reconcile Q3 invoices and post adjustments of at most \
USD 500 per journal entry.",
"target_resources": ["https://erp.example.com"],
"expires_at": "2026-12-31T23:59:59Z"
},
"evidence": [
{
"type": "urn:example:intent-evidence:admission",
"assertion": "eyJhbGciOiJFUzI1NiIsImtpZCI6ImFkbS0xIn0..."
}
]
}
¶
On the authorization-code path (Section 6.1), a client MUST
submit a Mission Intent through a Pushed Authorization Request
[RFC9126] using the mission_intent request parameter. The parameter
value is the UTF-8 JSON [RFC8259] serialization of the Submission
envelope, form-encoded in the application/x-www-form-urlencoded PAR
request body like any other OAuth parameter.¶
On the authorization-code path, the AS accepts the Intent in one of two forms:¶
the form-encoded mission_intent parameter of the PAR request
body; or¶
a mission_intent claim inside a signed Request Object
([RFC9101]) that is itself pushed through PAR. The claim's
value is the Submission envelope itself, a JSON object, not its
serialization; the AS MUST refuse with invalid_request a claim
whose value is a string or any other value that is not a JSON
object.¶
When the pushed request carries a Request Object (a request
parameter value), that object is authoritative: a mission_intent
submitted outside the Request Object in the same push MUST be refused
with invalid_request, strengthening Section 6.3 of [RFC9101],
under which the AS would only ignore such a value.¶
A client proposes concrete authority on the standard
authorization_details parameter in the same push
(Section 4.3). A client can also push scope and
resource ([RFC8707]) values; the AS treats them as a requested
subset of the authority the Mission Intent yields
(Section 5).¶
The AS returns a request_uri as usual, which the client uses to
start authorization. Pushed parameters are authoritative: on the
front-channel request that redeems the request_uri, the AS MUST
ignore any mission_intent, authorization_details, scope, or
resource presented.¶
The AS MUST refuse with invalid_request a mission_intent presented
on a front-channel authorization request that does not use a
PAR-issued request_uri. A client MUST NOT send mission_intent as a
plaintext front-channel authorization-request parameter, whether or
not a Request Object is also present.¶
A Mission Intent travels on no other request unless a companion profile explicitly defines that request as a back-channel carriage of the Submission envelope. Support for a grant type or endpoint never establishes such a carriage on its own.¶
A profile that defines such a carriage carries the envelope and any authority proposal in one request that never traverses a user agent, and preserves:¶
the envelope and proposal rules of Section 4.2;¶
the processing order (Section 4.5);¶
the approval-event rules for the Mission's approval basis (Section 6.1, Section 14.3, with a direct approval relocated only as Section 14 permits); and¶
the grant binding (Section 6.4).¶
The Submission envelope's evidence array carries Intent
Submission Evidence: typed artifacts the client presents in support
of claims about the submitted Intent, such as its originator, an
admission or consent decision that applies to it, or the presenter
authorized to submit it. Each entry is a JSON object whose type
member names its evidence type.¶
Processing is governed by the following rules:¶
Refuse, do not ignore. An entry that is not a JSON object, or
that lacks type, is structurally invalid and refused with the
invalid_request error code at step 1 of the processing order
(Section 4.5). The AS MUST refuse an entry whose
type it does not support, and an entry that fails its type's
validation or verification, with the invalid_mission_intent_evidence
error code (Section 20.2). A
submission is accepted only when every presented entry verifies.¶
Policy input, not authority. A verified entry is not copied into the Authority Set and does not stand in for the approval event (Section 6.1), the sole activation of authority. Verified evidence can serve as authenticated input to admission and derivation policy; AS policy decides whether the verified claims are acceptable for this request.¶
Supporting an evidence type is optional, but these rules are not: an AS that supports none still applies them and refuses every presented entry (Section 15.1).¶
The record's submission_evidence member (Section 6.2.2)
is provenance, not enforcement input, and is not carried on the
mission claim (Section 7.8). Recorded facts, such as a
verified consent reference, are provenance and policy input only; a
resource domain validates them under its own current policy
(Section 18.4).¶
No integrity anchor commits submission_evidence: its digests are
only as trustworthy as the Mission Record that holds them and do not
independently prove which artifacts were presented at admission. A
profile whose threat model requires that proof commits normalized
provenance under its own anchor typ (Section 6.3.1,
Section 14).¶
Mission Intent Submission Evidence for OAuth 2.0 ([I-D.draft-mcguinness-oauth-mission-submission-evidence]) specifies the evidence framework, including required-evidence resolution and the binding of evidence to one Intent and its presenter.¶
The AS processes a submission in the following order. Steps 1 to 6 run when the submission arrives; step 7 can run provisionally then and is complete before the approval rendering (Section 5.1); step 8 belongs to the approval event, and step 9 to activation. Section 6.3.3 states how JSON destined for commitment is parsed, including the rejection of duplicate member names.¶
Parse the Submission envelope, enforce both closed top levels and
the size bounds (Section 4.2), and check that each
evidence entry is a JSON object with a type member
(Section 4.4).¶
Validate the intent object against the Mission Intent member
definitions (Section 4).¶
Validate any authority proposal: refuse an entry of a type the AS
does not support, or one that fails its type's definition or a
schema advertised for it or established out of band, with
invalid_authorization_details, and a proposed entry that carries a
resource member whose value is not among the Intent's
target_resources, with invalid_request (Section 4.3.1).¶
Compute the provisional intent_hash over the intent object
(Section 6.3.1).¶
Apply any submission checks that configured admission policy or
adopted profiles require before evidence verification, including
when no evidence member is present. For example, the Submission
Evidence companion resolves required evidence here and refuses a
missing required type
([I-D.draft-mcguinness-oauth-mission-submission-evidence], Section
"Required Evidence Is Resolved Before Derivation").¶
Dispatch each presented entry on its type, and validate and
verify it under that type's rules (Section 4.4).¶
Apply admission policy and derive the Authority Set independently
(Section 5), including the target_resources
membership of each entry that carries a resource member
(Section 5.1) and, where a proposal was submitted, that
each derived entry is a same-type subset of a proposed entry
(Section 4.3.2).¶
Render the Intent, the Authority Set, and the material verified provenance for approval; a change to any of them before the decision is re-rendered and approved over the changed context (Section 6.1).¶
At activation, record the approved intent, the Authority Set,
and the verified evidence facts as submission_evidence
(Section 6.2).¶
The AS MUST refuse a submission that fails more than one check with the error of the earliest failing step in this order. For example:¶
a malformed proposal together with a missing required evidence
type is refused at step 3, with invalid_authorization_details;¶
a proposed entry outside target_resources together with a
presented evidence entry that fails verification is refused at
step 3, with invalid_request;¶
an intent object that fails validation together with a malformed
proposal is refused at step 2, with invalid_request; and¶
a structurally invalid evidence entry together with a malformed
proposal is refused at step 1, with invalid_request.¶
The material verified provenance of step 8 is part of the approval
surface. Where a deployment commits the rendered approval surface,
that commitment MUST cover the normalized provenance facts, at least
as a digest of their canonical submission_evidence representation
(Section 6.2). That commitment MAY omit each element's
verified_at, which the AS generates at each verification, and no
other member: type, artifact_hash, and facts, including any
timestamp within facts, stay covered.¶
Approval creates a Mission. This section defines the direct creation path: the approval event and its steps (Section 6.1), the record the AS keeps (Section 6.2), the commitments to its approved content (Section 6.3), and how the grant the AS issues is bound to the Mission (Section 6.4).¶
A companion profile can modify that path. A standing-consent basis activates Mission instances under an accountable human's earlier approval (Section 14.3), and a profile can relocate the approval event or carry the submission over a back channel (Section 14.1). An AS that implements such a profile also meets the sections that profile relies on.¶
An approval event is the atomic transition that creates a Mission.
Every Mission is created at its own approval event, which the record's
approval_event_id identifies.¶
The approval basis (approval_basis, Section 6.2) and its
adjudication, not the event alone, determine whether a human decides
at that event or an earlier standing consent authorizes the instance:¶
A direct approval event includes the Approver's contemporaneous
consent: it is a human approval event.¶
Under a standing-consent basis (Section 14.3), the instance is decided under an accountable human's earlier approval, with no fresh human approval.¶
At a direct approval event the AS MUST perform steps 1 to 7, in order, as one procedure: steps 1 to 5 prepare the approval (Section 6.1.1.1), and steps 6 and 7, which continue the same procedure, commit the Mission (Section 6.1.1.2).¶
The steps of this section define the direct approval basis
(approval_basis, Section 6.2); a companion profile that
relocates a direct approval keeps them unchanged (Section 14).¶
Section 6.4.1 states the rule that keeps consent reuse,
for an authorization request that carries no mission_intent, from
selecting a grant bound to a Mission.¶
Refusals follow Section 11.¶
Authenticate the Approver, subject to the approval-authentication floor and any client-requested strength (Section 6.1.2).¶
Establish the Subject: the principal the task is for, recorded as
the Mission's subject and mapped to the sub of every derived
token (Section 7.2), under the rules of
Section 6.1.3.¶
Establish the authority source: whose authority the approval
draws on, recorded as the Mission's authority_source
(Section 6.2), and check the Approver and the derived
Authority Set against it, under the rules of Section 6.1.4.¶
Establish the effective Mission expiry: the requested
intent.expires_at ceiling narrowed by applicable AS policy and
any ceiling an applicable Mission-creating profile defines. The
value is bounded as expires_at requires (Section 6.2) and
is rechecked at the creation commit (step 7).¶
Shortening under applicable AS policy, or under an already-approved parent, predecessor, or standing-consent bound a Mission-creating profile defines, is ordinary narrowing of the granted lifetime, not Authority Set derivation; for direct creation under this document the only additional ceiling is applicable AS policy.¶
Render for consent the derived Authority Set in human-meaningful
terms, with the goal, task_bounds, and the effective
expires_at (and, when it differs, the requested
intent.expires_at, so the Approver sees the narrowing) as
context, under the rules of Section 6.1.5.¶
The same procedure continues from step 5:¶
Compute the integrity anchors (Section 6.3.1):
authority_hash over the consented Authority Set, intent_hash
over the approved Mission Intent, and, when an authority proposal
was submitted (Section 4.3), proposal_hash over the
submitted authorization_details array. The AS computes them here
whether or not the record carries them; an artifact bound at the
approval event that carries one of these anchors carries the value
computed here.¶
Create the Mission Record (Section 6.2) in the active
state atomically with the approval decision and issuance of the
authorization code, or, under a back-channel carriage profile
(Section 14), with establishment of the Mission grant binding
and activation of the profile-defined grant for redemption. The
commit MUST verify atomically that the effective expiry is
strictly later than the creation instant: acceptance of the
submission does not freeze time, and where the requested ceiling
passed while the approval was pending, completion creates no
Mission. Where a direct approval fails this check, the AS MUST
refuse the request with access_denied (Section 11),
issuing no authorization code or profile-defined grant. A deferred
or relocated approval flow (Section 14) inherits this check
at its own creation commit, with the completion error each flow
defines.¶
The authority_hash is the authority commitment: it commits, by
cryptographic digest, exactly the authority the Approver approved.¶
Section 16.1 states how the AS deduplicates a retried or
duplicate delivery of the same approval decision on
approval_event_id.¶
Step 1 of the direct approval steps (Section 6.1.1) authenticates the Approver. The AS MUST NOT take the Approver's identity or achieved authentication context from unauthenticated client input; the authenticated surface that resolved the approval establishes both.¶
A deployment MUST publish a statement declaring the minimum approval-authentication strength (the approval-authentication floor) it enforces for Missions whose derived Authority Set carries high-risk authority, and the deployment scope it applies to. This document requires no particular serialization.¶
High-risk authority means irreversible, external-commitment, or privileged-administration actions under the deployment's classification, or a cumulative consumption bound (Appendix C.1).¶
The authentication actually achieved for the approval event (acr,
amr, and auth_time, in the sense [RFC9470] and [OpenID.Core]
define them) is approval-time provenance, not requested Intent. This
document never records it as a Mission Intent member, and an AS
MUST NOT read it back from a Mission Intent member.¶
This document defines no Mission Record member for the achieved values.¶
For the direct flow, a client MAY additionally request an
approval-authentication strength on the authorization request using
the acr_values and max_age parameters defined in Section 3.1.2.1
of [OpenID.Core].¶
In a Mission approval interaction, these parameters describe the requested authentication of the Approver, not of the token's Subject, who can be a different principal (Section 6.1.3). Requesting them implies nothing about the authentication claims of an issued token: those claims describe the token's Subject, not the Approver (Section 7.6). When the Approver is the Subject, one authentication event can back both.¶
The Approver's authentication satisfies acr_values when it matches
any one listed value under the deployment's own policy mapping. This
document defines no global ordering of acr values. The max_age
parameter bounds the elapsed time since that authentication.¶
Approval authentication for a high-risk Mission MUST satisfy both the
published floor and, where the client requested one, the
acr_values/max_age carriage above; the floor is never relaxed by
a narrower or absent client request.¶
This document does not require an AS to support OpenID Connect [OpenID.Core].¶
An authorization request whose scope includes openid asks for an
ID Token about the End-User the approval interaction authenticates,
who is the Approver. When the Approver is not the Subject established
at step 2 of Section 6.1.1, the AS MUST refuse such a
request, without creating the Mission, with the invalid_scope error
code (Section 4.1.2.1 of [RFC6749]).¶
When the Approver is not the Subject, whether or not openid was
requested, the AS MUST NOT issue an ID Token, serve UserInfo, or
establish an authentication session for the Subject solely as a
result of the Approver's authentication or approval.¶
When the Approver is the Subject, the openid scope value and the
acr_values and max_age parameters keep their [OpenID.Core]
meaning, which then describes the same authentication this document
requires.¶
In every approval interaction, the prompt, login_hint, and
id_token_hint parameters concern the Approver.¶
These rules apply at step 2 of the direct approval steps (Section 6.1.1). The Subject can be a workload or organizational principal, established and mapped the same way; which principal a service-owned or organizational Mission records as its Subject is stated for every Mission in Section 6.1.4.¶
Self-approval. When the Approver is the Subject, the Subject is the authenticated Approver.¶
Approval for another principal. When the Approver is a different principal (for example, an administrator approving on a user's behalf), the AS MUST NOT take the Subject from unauthenticated client input, and MUST authorize the Approver to approve for that Subject under local policy. This document defines no wire parameter for the Subject; how the AS establishes it (administrative selection, a directory, an authenticated reference) is a deployment matter.¶
External Subject. When the Subject's home issuer
(subject.iss) differs from the AS, the AS MUST map the external
(subject.iss, subject.sub) pair to an AS-local sub under an
injective mapping (no two distinct external Subjects map to the
same local sub). A derived token's (iss, sub) pair then
denotes exactly one Subject. Adopting the external sub verbatim
is valid only where it collides with no other principal's sub.¶
These rules apply at step 5 of the direct approval steps (Section 6.1.1).¶
The consent object is the derived Authority Set: what the agent
may do. It is not the goal or Mission Intent, because Authority Set
derivation is local policy and nothing commits that the derived
authority reflects the goal the Approver read. An approval surface
that renders only the goal or Mission Intent does not conform.¶
These requirements apply to the rendering:¶
The rendering MUST identify the OAuth client that receives the authority, the Agent, from client identity information the AS trusts, such as its own registration of the client; display text the client supplies does not by itself identify it.¶
When the Approver is not the Subject, the rendering MUST identify the Subject the authority is granted for.¶
The rendering MUST identify the authority source and, for
organizational, the governed policy it draws on
(authority_source.policy).¶
When the client submitted an authority proposal (Section 4.3), the rendering MUST distinguish the entries the client proposed from any narrowing or restructuring the AS applied.¶
The consent rendering is hardened against client text:¶
Client-supplied strings (goal, task_bounds) MUST be rendered as
inert text and MUST NOT be interpreted as markup.¶
The AS SHOULD mitigate Unicode direction-override and confusable-character presentation in them.¶
The rendering MUST visually distinguish the AS-derived Authority Set from client-supplied text and attribute that text to the client, identified from client identity information the AS trusts (above), so crafted client text cannot pass as derived authority or as a statement of the AS.¶
The rendering presents goal and task_bounds as recorded, without
truncation: the Intent is recorded verbatim and committed by
intent_hash (Section 6.3.1), so a truncated rendering would
show the Approver less than the record holds.¶
Rendering a bound is not the same as enforcing it: a deployment MUST NOT present a rendered bound as enforced when no party enforces it.
Which party enforces each bound, and what holds when that party is
absent, follows from Enforcement Requirements (Section 9.1.1)
and, for a resource server that enforces only scope, from Scope
Projection (Section 7.7).
An AS SHOULD make clear to the Approver which rendered bounds its
deployment actually enforces, so consent is not given to a limit that
binds nowhere.¶
If any of the following changes between approval rendering and the approval decision, the AS MUST recompute the affected values and the integrity anchors, and MUST NOT create the Mission without the Approver's consent to the changed context:¶
the task or the authority proposal;¶
the derived Authority Set;¶
the established authority source (Section 6.1.4);¶
the effective expires_at; or¶
a policy input establishing any of them.¶
Each anchor (intent_hash, authority_hash, and proposal_hash where
a proposal was submitted) is computed over the approved context. Because
the proposal is committed separately, a proposal swapped between
rendering and decision changes proposal_hash even where intent_hash
is unchanged.¶
The direct realization runs as an OAuth 2.0 [RFC6749]
authorization-code flow initiated from the PAR-issued request_uri
(Section 4.2.2). Because the authorization code is the
artifact the Mission grant binds to (Section 6.4.1)
and it passes through the front channel, the AS MUST bind the code
to the requesting client with PKCE ([RFC7636], S256 challenge
method) or, equivalently, issue a DPoP-bound authorization code
([RFC9449]). Redemption is then verified as
Section 4.6 of [RFC7636] or Section 10 of [RFC9449] specifies.
This prevents authorization-code injection from yielding the Mission
grant. Issuance at the code's redemption applies the issuance procedure of
Section 7.1 as it states for code redemption.¶
The AS SHOULD include the iss authorization-response parameter
([RFC9207]) on the authorization response, so the client can detect
a mix-up attack on the consent-bearing redirect leg ([RFC9700]).¶
This document records exactly one accountable principal,
approval_basis.consent_principal: the principal who approved the
Mission. Two richer patterns are out of scope:¶
Multi-party approval (M-of-N or dual control), where more than
one principal must approve. The number of approvers does not change
the authority commitment: principals approving the same rendered
Authority Set produce the same authority_hash and the same
derived tokens. A deployment requiring dual control records one
accountable Approver; this document does not represent the
co-approvers.¶
Approval-authority provenance: the standing behind a delegate's
authority to approve for another principal (for example, whether
an administrator was entitled to approve on a user's behalf). This
is governance state about the delegate, not the standing-consent
basis that approval_basis records (Section 6.2).¶
A Mission is the durable record created at the approval event; a
Mission Identifier (Section 6.2.5) identifies it. Its members MUST NOT
be changed after creation, except state and the termination member
written once when the Mission terminates (Section 10.1).¶
The record is a logical object: this document constrains its members and their values and requires no storage form. Where a surface or profile exchanges or signs the record, the record's JSON form, with the members this section defines, governs.¶
Record member names omit the mission prefix, which marks surfaces
that reference a Mission from outside it, such as the mission_id
response parameter. They are spelled out (issuer, expires_at,
created_at) and spelled identically on every surface; the compact
JWT names (iss, exp, iat) belong to a signed artifact's own
envelope or to an {iss, sub} party object, not the Mission.¶
Like the mission claim (Section 7.8), the record is open
(Section 14): a companion profile of this document MAY record
additional members set at creation using short names coordinated with
it (for example, a lineage member linking the Mission to a
predecessor or parent); any other extension MUST use
collision-resistant names. A consumer does not interpret a member it
does not recognize, and does not remove it from a record it retains
or commits.¶
The following subsections define the record's members. The record's
required members are its invariants: id, issuer, state,
intent, authority_set, subject, approval_basis and
authority_source with the members each requires, client_id,
approval_event_id, created_at, and expires_at, and, under the
condition each states, termination, proposed_authority,
submission_evidence, and policy_version. The integrity anchors
intent_hash, authority_hash, and proposal_hash are implied
members (Section 6.2.2). Every other member is optional
or defined by the profile that uses it.¶
id:REQUIRED. A string. The canonical Mission Identifier (Section 6.2.5).¶
issuer:REQUIRED. A string. The issuer URL of the Mission Issuer that
approved the Mission. Equals the iss of tokens that AS derives
(Section 7.8).¶
state:REQUIRED. A string. The current lifecycle state: active or
terminated in this document, or an additional state defined by a
companion profile, subject to the forward-compatibility rule of
Section 10.¶
termination:CONDITIONAL. An object, present exactly when state is
terminated: the reason and instant the Mission terminated
(Section 10.1).¶
intent:REQUIRED. An object. The approved Mission Intent.¶
proposed_authority:REQUIRED when the client submitted an authority proposal
(Section 4.3), absent otherwise. An array: the submitted
authorization_details array, recorded exactly as submitted. A
Mission derived in configured-mapping mode
(Section 5) records none.¶
authority_set:REQUIRED. An array. The consented Authority Set.¶
authority_hash:OPTIONAL. A string. The authority commitment over the Authority Set
(Section 6.3.1); its implied value is that anchor over the
record's authority_set. It is not carried on the baseline
mission claim (Section 7.8).¶
intent_hash:OPTIONAL. A string. The integrity commitment over the approved
Mission Intent (Section 6.3.1); its implied value is that
anchor over the record's intent.¶
proposal_hash:OPTIONAL when proposed_authority is present, absent otherwise. A
string. The integrity commitment over the recorded
proposed_authority (Section 6.3.1); its implied value is
that anchor over the record's proposed_authority. It is
approval-time provenance, not enforcement input, and is not carried
on the mission claim (Section 7.8).¶
submission_evidence:REQUIRED when the approved submission carried evidence, absent
otherwise. An array. The verified Intent Submission Evidence facts
(Section 4.4), one element per verified entry,
in the submission's evidence order so the array has one canonical
form (Section 6.3.2). Each element carries exactly these
members:¶
type:The entry's evidence type.¶
artifact_hash:An integrity anchor (Section 6.3.1) with typ
mission-intent-evidence over the entry exactly as presented.¶
verified_at:An RFC 3339 timestamp of verification.¶
facts:An object holding the verified output facts the type's specification selects for recording, nested so type-owned facts cannot collide with the common members.¶
The three anchors are implied members, as the direct approval
basis's members are (Section 6.2.3): an omitted anchor
has its implied value, a reader does not insert it into a record
before hashing or committing the record, and an issuer does not
remove an anchor a record carries. A recorded anchor MUST equal its
implied value. A party that finds one that differs MUST refuse the
operation that relies on it and MUST NOT substitute the implied
value.¶
subject:REQUIRED. An object. The Subject, an object with iss and sub.¶
approval_basis:REQUIRED. An object. The approved authorization basis this Mission is
rooted in, fixed at the approval event and immutable thereafter, like
subject. This document defines the direct basis in full; a
companion profile can define a standing-consent basis
(Section 14.3). The members below apply to every
approval basis, with the presence each one states. Three of these
members answer the questions an approval raises: who consented
(consent_principal), who triggered this instance
(activation_actor), and what mechanism decided it (adjudication).¶
type:REQUIRED. A string: direct, or a standing-consent value that a
companion profile defines (Section 14.3).¶
consent_principal:REQUIRED. An object with iss and sub. The accountable human
(or human-accountable principal) who consented. MAY equal
subject.¶
activation:OPTIONAL for direct. What activated this Mission instance; its
implied value for direct is an object whose approval_event_id
is the record's own approval_event_id (below).¶
activation_actor:OPTIONAL for direct. Who or what triggered this instance; its
implied value for direct is consent_principal: the Approver
triggers their own approval.¶
root_commitment:OPTIONAL for direct. The commitment to the consented root; its
implied value for direct is this Mission's own authority_hash,
recorded or implied.¶
When present for direct, activation, activation_actor, and
root_commitment MUST each match its implied value. The implied
values are semantic defaults: an omitted member has its implied value,
and a reader does not insert it into a record before hashing or
committing the record. For a standing-consent basis, the activating
issuer records all three (Section 14.3): activation
is an object in the shape the basis's defining profile specifies,
activation_actor is an object with iss and sub, and
root_commitment is a string that identifies the exact consented
root.¶
adjudication:OPTIONAL. A discriminated object naming the decision mechanism
that adjudicated this instance: distinct from activation_actor
(who triggered it) and consent_principal (who is accountable for
it). Present when a Mission-creating profile or deployment chooses
to make the mechanism explicit; where absent, the mechanism is still
fixed by type and the construction rules of this document or a
companion profile (below). Members, where present:¶
kind:REQUIRED. A string: human or policy, naming a decision
mechanism, not a storage location for supporting evidence; a
companion profile MUST NOT define a kind value that names a
record, an evidence store, or the requesting or dispatching
party.¶
A companion profile can define further members of adjudication;
Approval Governance defines governance_record
([I-D.draft-mcguinness-mission-approval-governance]).¶
For kind: human: no additional kind-specific members; the
deciding human is consent_principal.¶
For kind: policy: the kind-specific members that the profile
defining the standing-consent basis specifies.¶
approved_at:Absent for direct, whose approval event carries its own instant
(Section 6.1). For a standing-consent basis, the activating
issuer records it (Section 14.3): an RFC 3339
date-time, the instant the accountable human approved the exact
consented root that root_commitment identifies, not the instant
this instance was activated.¶
The following rules apply to approval_basis:¶
Where adjudication is present for direct, kind MUST be
human, with or without governance_record: a policy decides an
instance only under a standing-consent basis
(Section 14.3).¶
For direct, activation.approval_event_id MUST identify a human
approval event (Section 6.1).¶
approval_basis is provenance: none of the record's integrity
anchors, such as intent_hash, authority_hash or proposal_hash,
covers it (Section 6.3.1); a profile that commits the
Mission Record itself covers it under that profile's own anchor.¶
Its disclosure through introspection follows Section 9.2.1.¶
It is not carried on the baseline mission claim
(Section 7.8), and it MUST NOT be relied on to grant or widen
authority wherever it does appear.¶
authority_source:REQUIRED. An object. The source of the authority the approval
draws on (Section 6.1.4), established at the approval event
(Section 6.1) and immutable thereafter, like
approval_basis. Members:¶
type:REQUIRED. A string: user_delegated, service_owned, or
organizational.¶
policy:REQUIRED for organizational, absent otherwise. An object with
id, version, and digest: the stable reference to, and
commitment over, the governed organizational policy the Mission
draws on.¶
The authority_source member is provenance like approval_basis:
recorded alongside it, folded into neither intent_hash nor
authority_hash, and not carried on access tokens; resource
servers enforce authorization_details and do not consult it.¶
client_id:REQUIRED. A string. The Agent (OAuth client) that submitted the Mission Intent.¶
An unrecognized approval_basis.type, adjudication.kind, or
authority_source.type value is preserved unchanged as opaque
provenance on an otherwise valid record: a consumer MUST NOT infer or
fabricate the human, policy, or Approval Governance Record standing
behind it, and MUST refuse only a profile operation that itself
requires recognized adjudication semantics to proceed (for example,
evaluating a policy-approval recency ceiling); for
authority_source.type, the operation refused is any operation, of
this document or a profile, that itself requires recognized source
semantics (for example, applying the source's authority ceiling or
its governed policy). Unlike an unrecognized
lifecycle state (Section 10), such a value does not by itself
invalidate or deactivate the Mission.¶
policy_version:OPTIONAL. A string. An opaque audit correlator naming the derivation policy version in effect at the approval event; the policy itself does not travel. It is REQUIRED where a feature or profile the deployment uses depends on versioned derivation-policy identification. A deployment using such a feature records it from creation and never supplies a replacement value later.¶
approval_event_id:REQUIRED. A string. A unique identifier of the approval event, used as the approval idempotency key: one approval event creates at most one Mission (Section 16.1). The identifier names the approval event that creates this Mission (Section 6.1); under a standing-consent basis (Section 14.3), it identifies this instance's creation, not the earlier standing approval.¶
created_at:REQUIRED. A string. RFC 3339 timestamp of creation: the instant of the atomic creation commit (Section 6.1.1.2).¶
expires_at:REQUIRED. A string. An RFC 3339 date-time: the AS-established
effective Mission expiry (Section 10, Section 7.1). It
MUST be later than created_at and MUST NOT be later than
intent.expires_at, the requested ceiling (Section 4).¶
A Mission Identifier is an opaque URL-safe ASCII string of
[A-Za-z0-9_-] characters, with at least 128 bits of entropy,
carrying no semantic content. The AS MUST NOT reuse a Mission
Identifier. The record and the mission claim carry it as id; a
surface that references a Mission from outside carries it as
mission_id, as in the token-response parameter
(Section 7.3.1).¶
The following is an example of a Mission Record:¶
=============== NOTE: '\' line wrapping per RFC 8792 ===============
{
"id": "msn_8RfX2Lqv9TqMv4z7sA2bN1k0YpEdHc9-",
"issuer": "https://as.example.com",
"state": "active",
"intent": {
"goal": "Reconcile Q3 invoices and post adjustments of at most \
USD 500 per journal entry.",
"target_resources": ["https://erp.example.com"],
"task_bounds": [
"Read only invoices issued in 2026-Q3.",
"Post journal entries of at most USD 500 each."
],
"purpose": "urn:example:purpose:reconcile",
"expires_at": "2026-12-31T23:59:59Z" },
"proposed_authority": [
{ "type": "mission_resource_access",
"resource": "https://erp.example.com",
"actions": ["invoices.*"],
"constraints": {
"resource_issued_after": "2026-07-01T00:00:00Z",
"resource_issued_before": "2026-09-30T23:59:59Z"
},
"delegation": {
"max_depth": 2,
"allowed_delegates": [{ "sub_profile": "ai_agent" }]
} },
{ "type": "mission_resource_access",
"resource": "https://erp.example.com",
"actions": ["journal-entries.write"],
"constraints": {
"max_amount": { "amount": "500.00", "currency": "USD" }
} }
],
"authority_set": [
{ "type": "mission_resource_access",
"resource": "https://erp.example.com",
"actions": ["invoices.read"],
"constraints": {
"resource_issued_after": "2026-07-01T00:00:00Z",
"resource_issued_before": "2026-09-30T23:59:59Z"
},
"delegation": {
"max_depth": 2,
"allowed_delegates": [{ "sub_profile": "ai_agent" }]
} },
{ "type": "mission_resource_access",
"resource": "https://erp.example.com",
"actions": ["journal-entries.write"],
"constraints": {
"max_amount": { "amount": "500.00", "currency": "USD" }
} }
],
"authority_hash":
"sha-256:hjXlwWBY64-RPs1Z-E_gbyklNcViI5c9jiyMbE4KvFM",
"intent_hash":
"sha-256:6T-7s_f-mNW9UpfrrZh3r0HRJmU4My_EsNAf1C1U4r0",
"proposal_hash":
"sha-256:p-s-EzdNQTn6RoPHXESkwVtGdk8yL1PxryNyMwroKGo",
"subject": { "iss": "https://idp.example.com",
"sub": "user_3p2q8mN1a0kV7tR" },
"approval_basis": {
"type": "direct",
"consent_principal": { "iss": "https://idp.example.com",
"sub": "user_3p2q8mN1a0kV7tR" },
"activation": { "approval_event_id": "ape_8K2nP4qV9rL3tY6sB1z" },
"activation_actor": { "iss": "https://idp.example.com",
"sub": "user_3p2q8mN1a0kV7tR" },
"adjudication": { "kind": "human" },
"root_commitment":
"sha-256:hjXlwWBY64-RPs1Z-E_gbyklNcViI5c9jiyMbE4KvFM"
},
"authority_source": { "type": "user_delegated" },
"client_id": "s6BhdRkqt3",
"policy_version": "deploy-policy:v17",
"approval_event_id": "ape_8K2nP4qV9rL3tY6sB1z",
"created_at": "2026-11-02T08:00:00Z",
"expires_at": "2026-12-31T23:59:59Z"
}
¶
The following example shows an excerpt, other members omitted, of a
Mission for an agent acting for its own workload principal: subject
is the workload principal, client_id is the agent, and
consent_principal is the administrator who approved it under the
service_owned source.¶
{
"subject": { "iss": "https://login.example.com",
"sub": "agt_ledger_reconciler" },
"client_id": "ledger-reconciler",
"authority_source": { "type": "service_owned" },
"approval_basis": {
"type": "direct",
"consent_principal": { "iss": "https://login.example.com",
"sub": "adm_4Hq9Tz" },
"activation": { "approval_event_id": "ape_2Lw7Kq9Rv4" },
"activation_actor": { "iss": "https://login.example.com",
"sub": "adm_4Hq9Tz" },
"root_commitment":
"sha-256:R6tY2nD9bM7sX1cF8gH2vJ4kE5pNQl3KvZ4mP5x0wQo"
}
}
¶
The first example's anchors are computed over its displayed intent,
proposed_authority and authority_set (Section 6.3.1); the
excerpt's root_commitment is illustrative. A companion that extends
this example either reproduces the recorded objects byte-exactly or
states that its example diverges and its anchors differ.¶
This section defines how the anchors the Approver consents to at the approval event (Section 6.1) are constructed, canonicalized, and bound. The Mission Record (Section 6.2) records them, and the test vectors (Appendix D) pin the construction byte-for-byte. Section 14.4 classifies these anchors and states the contract for commitments other specifications define.¶
Every anchor is computed the same way over a domain-separated, issuer-bound envelope:¶
Construct the envelope, where typ selects the committed object
and value is that object:¶
{
"typ": "<mission-intent | mission-proposed-authority
| mission-authority-set>",
"iss": "<the AS issuer URL>",
"value": <the committed object>
}
¶
Each anchor sets typ and value as follows:¶
For intent_hash, typ is mission-intent and value is the
approved Mission Intent object: the Submission envelope's
intent member, not the envelope or its evidence
(Section 4.2.1).¶
For proposal_hash, typ is mission-proposed-authority and
value is the submitted authorization_details array exactly
as recorded (Section 4.3.2); the anchor is defined
exactly when a proposal was submitted.¶
For authority_hash, typ is mission-authority-set and
value is the Authority Set as a JSON array of entries.¶
Encode as sha-256: followed by the base64url, no-padding
[RFC4648] encoding of the digest.¶
The typ field domain-separates the anchors so a digest of one
object cannot be mistaken for another's. The iss binding prevents
a committed object from being transplanted across authorization
servers. The sha-256: prefix is the algorithm-agility mechanism
(Section 6.3.3).¶
An implied anchor (Section 6.2.2) is this section's
sha-256 construction over the retained record: the record's
intent, authority_set, or proposed_authority, each array in its
recorded order, with iss the record's issuer, whatever algorithm
the issuer uses for new commitments. Once a Mission exists, an issuer
that emits or verifies its intent_hash, authority_hash, or
proposal_hash MUST resolve the anchor, recorded or implied, from
the Mission's retained record, never from a token's carried subset, a
projection or response it serves, or authority a companion narrows
after approval. This governs only those anchors of an existing
Mission: a computation before the Mission exists, such as the
provisional intent_hash (Section 4.5) or step 6
(Section 6.1.1.2), and a commitment whose inputs a companion
defines keep their own inputs.¶
The anchors this section lists, and the Authority Set entry
commitment (Section 14.4.1), bind the AS issuer. The digest of an
authority_source.policy reference (Section 6.2.3) is
not one of them: it uses the issuer the policy's format defines, for a
governed organizational policy its governing authority. That binding
keeps the policy's commitment from being transplanted across policy
authorities, and the same policy commits identically at every AS that
records it.¶
The intent_hash and authority_hash anchors are independent
commitments to independent objects. That the approved task bounds the
derived authority is a governance assertion, made by derivation policy and
auditable through policy_version where the Mission records it
(Section 5), not a cryptographic relation between
the anchors: neither anchor proves anything about the other's object.¶
The typ value space is an extension point
(Section 14.4): additional committed objects use this
same envelope with a new typ and the canonicalization below.¶
The authority_hash anchor commits an Authority Set, not a Mission:
two Missions that approve byte-identical authority share it, and a
consumer MUST NOT use it as a Mission Identifier or as a replay or
idempotency key for a Mission.¶
JCS [RFC8785] alone does not make two implementations agree on every byte. The following rules close the remaining gaps; they apply to computing an anchor and to comparing committed values:¶
The committed value is exactly the object the AS recorded on the
Mission: the approved intent for intent_hash, the recorded
proposed_authority for proposal_hash, and the authority_set
for authority_hash. An auditor reproduces a digest from the
record alone.¶
Duplicate member names are rejected at parse time (Section 6.3.3).¶
JCS does not reorder array elements, and this document defines no element sorting, so array order is significant. The AS MUST present each committed array in its recorded order wherever it emits the committed object; that order is part of the canonical form.¶
URI-valued members are compared byte-for-byte, with no
normalization (Section 12 of [RFC9396]), unless a member's own type
definition
specifies a normalization. Where a type defines one, it applies only
to the comparison the type defines it for: the default resource
equality test remains an exact match, and anchor computation is always
byte-exact over the recorded values.¶
Every committed JSON value and its envelope are I-JSON [RFC7493] data, as Section 3.1 of [RFC8785] requires. Strengthening Section 3.1 of [RFC8785], which adapts input to I-JSON, the party computing or verifying a commitment MUST reject non-conformant input before canonicalization rather than adapt it: externally received JSON destined for commitment is parsed by a duplicate-detecting parser, and an object carrying duplicate member names is rejected at parse time, before the parsed data model exists.¶
The commitment is over the parsed I-JSON data value, not the source text: JCS does not preserve a source lexeme's spelling or excess precision. A profile whose values need exact decimal or large-integer semantics carries them as strings, as Section 3.1 of [RFC8785] recommends, or defines a stricter numeric domain.¶
The security considerations of [RFC8785] apply to every JCS computation.¶
The algorithm prefix is the agility mechanism. The sha-256 algorithm
is mandatory to implement and the only algorithm this document defines.
A new algorithm enters only through a new prefix defined by a
referencing specification, its name drawn from the Named Information
Hash Algorithm Registry ([RFC6920]); this document defines no
negotiation.¶
A verifier MUST reject a digest whose algorithm prefix it does not recognize, so an algorithm added later cannot be exploited as a downgrade.¶
A Mission is independent of any OAuth grant: it is identified
globally by the pair (issuer, id) (Section 6.2), and it
can be approved, tracked, and terminated with no OAuth grant at all.
Where this document derives a Mission through OAuth, it relates the
Mission to OAuth in two distinct ways: the Mission grant binding,
defined below, and the mission claim a derived token carries as its
own Mission reference (Section 7.8).¶
The Mission grant binding is an AS-controlled, functional mapping from one persistent, redeemable grant lineage to exactly one Mission. The AS alone establishes a binding and resolves it from the grant itself; a client never supplies or negotiates one, and no client input determines its Mission.¶
A grant lineage is state the AS can resolve again on a later request, either:¶
the authorization code issued at approval and, where its redemption emits one, the refresh-token family that follows it; or¶
another profile-defined reusable grant, such as a refresh-token family a Token Exchange establishes later for the same Mission (Section 6.4.2).¶
At a direct approval event the AS binds the Mission to the
authorization code it issues, or, under a back-channel carriage
profile, to the grant artifact that profile defines
(Section 14). The binding is server-side, and it resolves the
Mission for operations using that binding; a profile-defined grant can
instead resolve it through its authenticated mission reference.¶
An authorization request that carries no mission_intent proposes no
Mission. An AS that answers such a request through consent reuse,
such as with a grant an authentication session holds for the client,
MUST NOT select a grant bound to a Mission: the request would
otherwise acquire an earlier Mission's binding with no submission or
approval of its own. This rule governs grant selection for a new
authorization request. It neither prohibits ordinary consent nor
changes how a derivation resolves an existing binding.¶
The code itself carries no refresh-token family; only a successful redemption produces one. A refresh-token family so produced inherits the code's binding atomically with its issuance, extending the same Mission grant binding rather than starting a second one.¶
At each subsequent derivation the AS resolves the Mission from the grant the client presents:¶
the authorization code at the token endpoint;¶
the refresh token on refresh;¶
the Mission-bound subject_token on Token Exchange (a delegate is
identified by its client authentication, Section 8.2); or¶
a profile-defined grant, through the authenticated mission
reference it carries.¶
It then applies the gating of Section 7.1.¶
A Mission MAY carry zero or more grant bindings. Beyond any
authorization-code lineage established at approval, a refresh-token
family a Token Exchange establishes later (above) is a further
binding, or the Mission's first where it has none, rooted in the
Mission its own subject_token resolved to.¶
The AS MUST resolve a bound grant lineage to the same Mission on every derivation performed against it: the mapping is fixed for the lineage's lifetime and is never reassigned to a different Mission. An AS that finds a lineage resolving to more than one Mission fails closed on that lineage.¶
Where a profile-defined operation lets a client present a Mission
Identifier alongside a credential, the identifier is a
non-authoritative cross-check: the AS MUST verify it against the
Mission the credential resolves to and refuse a mismatch with the
invalid_grant error code.¶
Because the grant, not the identifier, determines the Mission, a
client does not supply mission_id to obtain a derivation, and an AS
MUST NOT derive Mission-bound authority from a client-supplied
mission_id.¶
Non-active state gates every future derivation across every Mission
grant binding (Section 7.1). It does not itself revoke an
OAuth grant the same client or subject holds outside any Mission
binding, and it does not recall an access token already issued before
its exp absent a runtime state check the token's consumer performs
(Section 10.2, Section 9.2).¶
When the authorization code expires unredeemed, no derivation is
possible under the Mission regardless of which lifecycle outcome
follows. The deployment either revokes the Mission or lets it expire at
expires_at, and applies one choice consistently; both outcomes
terminate it (Section 10), so reprocessing the same timeout
changes nothing.¶
An access token issued under a Mission takes one of two forms:¶
a self-contained JWT per [RFC9068], which a resource server can enforce from the token alone (Section 9.1) and which this document's token-carried enforcement assumes; or¶
an opaque Mission-bound token, profiled only under the introspected consumption mode (Section 9.2.4), where introspection or issuer-local resolution carries its claims, with the same enforcement obligations.¶
Section 7.1 states the issuance procedure for every path. The
sections that follow state the token's claims (Section 7.2), its
audience and the token response (Section 7.3), refresh
(Section 7.4), self-exchange (Section 7.5),
authentication claims and lifetime (Section 7.6),
scope projection (Section 7.7), and the mission claim
(Section 7.8).¶
A derivation is one issuance operation the issuer AS performs for a single request: the initial authorization-code exchange, a refresh, a Token Exchange, or the redemption of a profile-defined grant.¶
This document defines five issuance paths:¶
code redemption, the token response that redeems a newly created Mission's authorization code (Section 6.1.7);¶
a refresh (Section 7.4);¶
a designation (Section 8.1);¶
a delegated exchange (Section 8.2); and¶
a self-exchange (Section 7.5).¶
Designation and the delegated exchange belong to the optional Delegation capability, and self-exchange is optional too (Section 15.2).¶
Each of these paths passes every check below. Each check is stated in
the sections it cites, with any difference by path, and a path's own
section states its further rules. Any other derivation, such as one a
companion profile defines, passes at least checks 1, 3, 5, and 7, the
exp bound of check 8, and check 10.¶
The numbering is presentation order only: it imposes no execution order and no error precedence (Section 11 gives the error codes). An order that a rule states still applies, including these:¶
The Mission-governed refusal applies only to an otherwise processable request. On a refresh, it is decided before the refresh token is consumed or rotated (Section 4.3.3).¶
A refresh establishes any scope projection before the refresh token is consumed or rotated, or within the same atomic issuance (Section 7.7.6).¶
A delegated exchange authenticates the client before it refuses an
actor_token (Section 8.2).¶
The revocation refusal applies at the AS's final decision to release the result (check 10).¶
A companion profile that sequences a check within a path keeps that sequence.¶
The checks are:¶
Mission resolution from the presented grant
(Section 6.4.1): the code, the refresh token, or the
subject_token, which on a delegated exchange is the designation.¶
Client and sender binding, as the path's section states for the code (Section 6.1.7), the refresh token (Section 7.4), the token a designation request presents (Section 8.1), the delegate (Section 8.2), and the self-exchanging agent (Section 7.5).¶
Mission state: the Mission is active (Section 7.1.1,
Section 10). A delegated exchange evaluates each redemption
afresh (Section 8.2).¶
Mission-governed resources (Section 4.3.3). A refresh, a
self-exchange, or a designation request needs no mission_intent.¶
Subset (Section 5.4): against the Mission Authority Set, and also against the presented refresh grant on a refresh, the presented token on a designation or a self-exchange, and the designation on a delegated exchange; on a designation or a delegated exchange, only as Section 8.4 permits. An entry is narrowed, issued to another audience, delegated, or projected only under a declared capability (Section 5.5.1).¶
Audience (Section 7.2, Section 7.3,
Section 5.5.1): by each entry's original approved
audience. For a designation, the check uses the resource audiences
of its entries, not the client its aud names. For a delegated
token, the audience is also one that processes the act chain
(Section 9.1.2).¶
Scope projection (Section 7.7), wherever scope is
emitted, requested, or the only form the target consumes. On a
refresh, it applies with that section's protection of the refresh
token.¶
Claims and lifetime (Section 7.2, Section 7.8,
Section 7.8.1, Section 7.6).
Each token's exp does not exceed the Mission's expires_at. A
designation, a delegated exchange, and a self-exchange keep the
presented token's mission claim, with the differences
Section 8.1 and Section 8.2 state.¶
Response members: the response echoes the granted
authorization_details (Section 7.3) and carries
mission_id and mission_expires_at as
Section 7.3.1 states.¶
Release: the revocation refusal (Section 7.1.1) applies at the AS's final decision to release the result.¶
Unless the referenced Mission is active, the AS MUST refuse a
request to derive a token at the token endpoint: a Token Exchange
([RFC8693]) with the invalid_request error code
(Section 2.2.2 of [RFC8693]), and any other grant, refresh
included, with the invalid_grant error code. The AS MUST refuse a
derivation request it answers after it has acknowledged a revocation
of the Mission, with the same error code.¶
A Token Exchange takes invalid_request because a presented token
whose Mission is not active is unacceptable for the exchange, a case
Section 2.2.2 of [RFC8693] assigns to that code.¶
The AS answers a request when it makes its final decision to release the result, not when network delivery of the response completes. A result prepared before the acknowledgment and released after it is therefore refused.¶
The AS acknowledges a revocation when it commits the Mission's
termination with reason revoked (Section 10.1), whether a
revocation request or the deployment's policy caused it
(Section 10.2). Receiving or queuing a revocation request does not
acknowledge it, and acknowledgment does not wait for an HTTP response
to complete or an event to be delivered. The refusal at release
re-checks only an acknowledged revocation; it is not a general
re-check of Mission state.¶
Where a profile of a Token Exchange that the AS implements assigns
its own error code to either refusal, such as a continuation
profile's code for an ended chain, the AS uses that profile's code
instead; the refusal itself, and the mission_error member
(Section 7.1.2), still apply.¶
The error code alone does not tell a client which gate refused. On a
refusal under Section 7.1, the AS SHOULD include, alongside
error, the mission_error token-error-response member
(Section 20.1) with one of the values revoked,
expired, or superseded (where a companion defines supersession),
the Mission's termination reason (Section 10.1).¶
These values are termination reasons. A companion profile that
defines either of the following defines any mission_error value for
it:¶
another Mission state (Section 10), which Section 7.1 also refuses; or¶
a further refusal at issuance.¶
A Mission in a state from which it can return to active MUST NOT be
reported with a termination reason.¶
The mission_error member is diagnostic only and optional, whichever
document defines its value:¶
it grants nothing;¶
an unrecognized value is ignored and is not authoritative about the Mission's state; and¶
it is returned only to the authenticated client presenting the Mission's grant.¶
Each mission_error value this section names reports a terminated
Mission (Section 10.1): no retry under the same grant cures the
refusal. Further work needs a new approval or, for superseded, the
Mission that superseded it. A new approval is a fresh approval event,
not an automatic consequence of the refusal. A credential held outside
the Mission is no fallback for its task (Section 17.1.2). The
refusal gives no assurance that the refresh token remains usable. This
reading is keyed on the value, not on the error code, because the same
refusal covers a Mission in a non-terminal state that a companion
profile registers (Section 20.7), whose meaning that
profile defines.¶
Derived tokens SHOULD be short-lived so that a transition to
terminated takes effect promptly without per-request revocation
checks. A resource server that does not check Mission state per
request can accept a derived token until its exp. At such a resource
server, the token's lifetime is therefore the termination latency
(Section 17.3.1).¶
Short-lived means within the termination latency the deployment
accepts. This document sets no numerical bound; a deployment profile
can. The cap at the Mission's expires_at
(Section 7.6) does not by itself make a token
short-lived.¶
[RFC9068] fixes the JWT's required claims (including jti), the typ
header parameter value at+jwt, and resource server validation
(Section 2.1 of [RFC9068], Section 2.2 of [RFC9068],
Section 4 of [RFC9068]). A token whose format a companion profile
explicitly defines, with its own typ and verification rules, follows
that profile instead. JWT access-token validation remains governed by
Section 4 of [RFC9068], including acceptance of at+jwt or
application/at+jwt. A companion-format token is consumed only under
that companion's verification rules. In addition to what [RFC9068]
requires, a derived token:¶
carries the token's Mission-derived authority as
authorization_details ([RFC9396]); this MAY be the full Authority
Set or a narrowed subset (Section 5.4);¶
carries a mission claim (Section 7.8);¶
sets sub to the AS-local sub the AS maps the Mission's
Subject to (Section 6.1);¶
carries client_id with its ordinary meaning
(Section 4.3 of [RFC8693], Section 2.2 of [RFC9068]): the client
that requested this particular token;¶
MUST set aud to identify the resource server(s) authorized to
consume the carried authorization_details, and MUST NOT include an
audience unrelated to that carried authority (Section 7.3, Paragraph 1),
except that a token the AS issues only for presentation back to
itself at a Token Exchange, such as a designation (Section 8.1),
names in aud the client that presents it;¶
MAY carry an act claim when the agent has delegated execution
(Section 8.2);¶
MAY carry a scope claim, subject to Section 7.7; and¶
can be sender-constrained, as Section 2.2.1 of [RFC9700]
recommends, via a cnf claim [RFC7800]: DPoP [RFC9449]
(cnf.jkt) or mTLS [RFC8705] (cnf.x5t#S256).¶
A Mission-bound access token that is not a delegated token may be a bearer token, preserving compatibility with bearer-only resource servers while retaining Section 2.2.1 of [RFC9700]'s recommendation; the cost is the stolen-token exposure (Section 17.4.1).¶
A delegated token is sender-constrained to the delegate's own key (Section 8.2), and the Cross-Domain capability sender-constrains every credential that crosses a trust domain (Section 15.2).¶
An AS that issues Mission-bound JWT access tokens for resource servers
to consume MUST publish its token verification keys (for example, at
its [RFC8414] jwks_uri, as Section 4 of [RFC9068] recommends);
rotation retires a key from signing, never from resolvability while
tokens signed under it remain valid. A token the AS issues only for
presentation back to itself, such as a designation (Section 8.1),
creates no publication duty by itself.¶
The AS audience-restricts the token per Section 2 of [RFC8707] and
Section 3 of [RFC9068]; aud names resource server(s), APIs, or
security domains, not necessarily the entries' resource values. The
client obtains a single-audience token (Section 2.3 of [RFC9700])
with the [RFC8707] resource parameter, and can narrow it further
with scope; the AS narrows the Authority Set under Section 5.4 to the
requested resource(s) and sets aud accordingly.¶
A token-endpoint resource value outside the Authority Set is an
invalid resource value in the sense of [RFC8707].¶
Three identifiers stay distinct. An entry's resource, where its type
defines one, names the protected resource its authority covers, and a
resource server matches each request's operation target against it
under the entry's type. A token request's resource parameter
([RFC8707]) selects the audience the client asks for. The token's
aud names the recipients that accept the token, and the AS relates an
entry to them through the entry's original approved audience
(Section 5.5.1).¶
A token issued for an audience carries only the entries whose original
approved audience includes that audience; an entry approved for another
audience is not carried, unless a declared narrowing capability
permits issuing it there. A token whose aud names several audiences
is issued only where the same entries are approved for each of them;
where they differ, the AS refuses the request with invalid_target, and
the client requests a separate token for each audience. The AS also
refuses with invalid_target a request whose audience is approved for
none of the entries the token would carry, and one whose
authorization_details (Section 6 of [RFC9396]) names an entry not
approved for its audience.¶
Section 8.1 states how these rules apply to a designation and to the delegated token issued at its redemption.¶
The AS returns the granted authorization_details in every token
response, including refresh and Token Exchange responses
(Section 7 of [RFC9396]). Strengthening Section 7 of [RFC9396],
the AS MUST NOT omit values from it: the response states exactly the
(possibly narrowed) set assigned to the issued token, and it is the
authoritative statement of what was granted, which the client
compares with its proposal (Section 4.3). A client MUST NOT
assume authority absent from the granted set. An entry the echo
narrows grants the narrower authority it states, and a client need
not reject a grant narrower than its proposal. The mission_id and
mission_expires_at response parameters carry the Mission reference
and expiry beside it (Section 7.3.1).¶
The following is an example of a refresh request that narrows the
canonical ERP Mission (the worked example of Section 6.2) to a
read-only token with the [RFC8707] resource parameter and the
authorization_details parameter (Section 6 of [RFC9396]). The ERP
consumes authorization_details, so a resource scope for it would
be refused (Section 7.7). Extra line breaks are for display
purposes only:¶
POST /token HTTP/1.1 Host: as.example.com Content-Type: application/x-www-form-urlencoded DPoP: eyJ0eXAiOiJkcG9wK2p3dCIsImFsZyI6IkVTMjU2Iiwi... grant_type=refresh_token &refresh_token=rt_4mN8qV2xP7sL1tY9zB3k &resource=https%3A%2F%2Ferp.example.com &authorization_details=%5B%7B%22type%22%3A%22mission_resource_acc...¶
The authorization_details value, before form encoding, requests the
Mission's read entry alone:¶
[
{ "type": "mission_resource_access",
"resource": "https://erp.example.com",
"actions": ["invoices.read"],
"constraints": {
"resource_issued_after": "2026-07-01T00:00:00Z",
"resource_issued_before": "2026-09-30T23:59:59Z"
},
"delegation": {
"max_depth": 2,
"allowed_delegates": [{ "sub_profile": "ai_agent" }]
} }
]
¶
The issuance is a derivation, gated on the Mission being active
(Section 7.1). The following example shows the token response.
It carries no scope member because none was requested or granted, and
it echoes the narrowed grant and the mission_id reference
(Section 7.3.1). The emitted entry is a subset
(Section 5.4) of the Mission's read entry, its constraints carried
intact:¶
{
"access_token": "eyJhbGciOiJFUzI1NiIsInR5cCI6ImF0K2p3dCJ9...",
"token_type": "DPoP",
"expires_in": 300,
"mission_id": "msn_8RfX2Lqv9TqMv4z7sA2bN1k0YpEdHc9-",
"mission_expires_at": "2026-12-31T23:59:59Z",
"authorization_details": [
{ "type": "mission_resource_access",
"resource": "https://erp.example.com",
"actions": ["invoices.read"],
"constraints": {
"resource_issued_after": "2026-07-01T00:00:00Z",
"resource_issued_before": "2026-09-30T23:59:59Z"
},
"delegation": {
"max_depth": 2,
"allowed_delegates": [{ "sub_profile": "ai_agent" }]
} }
]
}
¶
This document defines mission_id as a token-endpoint response
parameter: a string carrying the Mission Identifier, returned
alongside the issued token. It is an informational reference only:
presenting it authorizes nothing (Section 6.4.1), and a
client MUST NOT derive authority from it.¶
Alongside it, this document defines mission_expires_at: the exact
RFC 3339 string recorded as the Mission Record's effective
expires_at (Section 6.2), the common member of every
Mission-creating success response, whatever surface completes the
creation. The expires_in parameter describes the access token's
lifetime, not the Mission's, and the effective expiry can be shorter
than the requested intent.expires_at.¶
A client learns both values from these members, not from the access token, which it treats as opaque (Section 6 of [RFC9068]). The AS returns them as follows:¶
The success response that first delivers a newly created Mission's identifier or credential MUST carry both. On the authorization-code path, the authorization response carrying only the code is not that response; the token response redeeming the code is.¶
A delegated exchange response carries both as Section 8.2 requires.¶
Any other Mission-bound token response, including a refresh, designation (Section 8.1), or self-exchange (Section 7.5) response, SHOULD carry both.¶
A creation replay deduplicated under the applicable operation
identifier (approval_event_id for direct approval
(Section 6.2), or the identifier a Mission-creating profile
defines) returns the committed effective value unchanged.¶
On OAuth token responses mission_expires_at is additionally
registered as a token-endpoint response parameter
(Section 20.1). It is informational in the same
way: presenting it authorizes nothing.¶
Issuance on a refresh applies the issuance procedure of
Section 7.1 as it states for a refresh. Section 4.3.3
states a refresh's exemption from mission_intent and, for a
Mission-governed resource, the refusal's precedence and its timing
relative to consuming or rotating the refresh token.¶
A Mission-bound refresh token is bound to the client it was issued to. For a confidential client, client authentication supplies the binding: on refresh, the AS authenticates the client and verifies that the refresh token was issued to it (Section 6 of [RFC6749]), so the token need not also be bound to the DPoP proof key (Section 5 of [RFC9449]). A public client's refresh token MUST be sender-constrained or use refresh token rotation (Section 2.2.2 of [RFC9700]).¶
The AS can rotate either client type's refresh token; rotation detects replay of a consumed refresh token (Section 4.14.2 of [RFC9700]) and is not a cryptographic binding.¶
A refresh request can carry authorization_details to narrow the
issued token (Section 6 of [RFC9396]). The AS MUST refuse such a
request with the invalid_authorization_details error code when a
requested entry exceeds the presented refresh grant or the Mission
Authority Set (Section 5.4), and MUST NOT instead issue a narrower set
than the one requested.¶
An agent MAY present its own Mission-bound access token as the
subject_token of a Token Exchange ([RFC8693]) with no actor, to
obtain a narrowed token (for example, a single-audience one). Because
it names no actor, such an exchange does not delegate: it re-scopes
the agent's own authority downward. A designation (Section 8.1)
names a delegate, so it is not a self-exchange, and these rules do not
apply to it. An exchange whose subject_token is a designation is a
delegated exchange (Section 8.2), not a no-actor exchange,
even when it carries no actor_token. Issuance applies the issuance
procedure of Section 7.1 as it states for a self-exchange.
Section 4.3.3 states a self-exchange request's exemption from
mission_intent and the checks that still apply to it. A no-actor
exchange is subject to the following:¶
The AS MUST refuse a no-actor exchange with the invalid_request
error code (Section 2.2.2 of [RFC8693]) unless the authenticated
client is the Mission's approved agent (the Mission Record's
client_id, Section 6.2). A delegate narrows only through a
delegated exchange that names it in the act chain.¶
The result MUST be a subset (Section 5.4) of the presented token's
authority; it carries the same mission claim (Section 7.8)
and adds no act chain.¶
Self-exchange is an optional capability (Section 15.2). An
AS that does not support it refuses a no-actor exchange: with
unsupported_grant_type (Section 5.2 of [RFC6749]) if it does not
support the Token Exchange grant type, and otherwise with
invalid_request, as for a presented token it does not accept for the
exchange (Section 2.2.2 of [RFC8693]). Any other error that applies
still applies, such as invalid_client for a client that fails
authentication.¶
A derived token's authority comes from the Mission, not from a fresh
authentication. Authentication claims (acr, amr, auth_time) on
a derived access token follow Section 2.2.1 of [RFC9068]: they
describe the token's Subject and keep the values of the
authentication event behind the grant, so derivation does not
refresh them. An AS MUST NOT use the authentication of an Approver
who is not the token's Subject as authentication information about
that Subject.¶
These claims neither establish approval nor expand Mission authority; the Approver's approval-time authentication remains provenance (Section 6.1.2). Where no authentication of the Subject applies, as when a human approves a Mission for another principal or for a workload, the claims are absent, and their absence is not an authentication downgrade.¶
The authorization_details claim is the authoritative expression of
a Mission-bound token's authority; a scope claim
(Section 7.7) is a compatibility projection that cannot
carry per-entry constraints.¶
A credential the Mission Issuer derives MUST have an exp that does
not exceed the Mission's expires_at, so that no credential outlives
the approved Mission.¶
Within that bound, a derived token's lifetime is the AS's policy,
which Section 7.1.3 recommends keeping short. Token
Exchange does not tightly couple an issued token's lifetime to its
subject_token's (Section 2.1 of [RFC8693]); Section 8.1
states how this applies to a designation and to the delegated token
issued from it.¶
This section applies to every issuance that emits scope on a
Mission-bound token or whose request names a scope value, and to
issuance for a target that consumes only scope: such a target
receives a safe projection or a refusal (projection step 5 below).¶
For every target audience, the AS MUST establish that the effective
rights the target's enforcement path grants from the projected
scope, together with every independently mandatory control on that
path, are a subset of the rights the token's applicable
authorization_details grant.¶
This is a semantic condition, not a structural one. Exactly as it
fails for a relaxed constraint, it fails for a constraints-free
entry whose scope:¶
For a multi-audience token, the AS establishes the condition independently for each audience; a single-audience token (Section 7.3) remains preferred.¶
To emit scope for an entry, the AS:¶
determines the target resource server or audience for the token;¶
resolves a trusted, versioned scope-projection mapping for that target, established through the target's protected resource metadata ([RFC9728]) or authenticated out-of-band configuration;¶
establishes, under the subset condition above, that the complete
effective authorization the projected scope grants at that
target is no broader than the applicable carried entries;¶
omits scope for an entry where the target's enforcement path
consumes authorization_details instead; and¶
MUST refuse issuance to a target that is scope-only when no safe
projection exists for the applicable entries: an issued token no
enforcement path can safely evaluate is not a usable credential.¶
Unknown scope semantics, unknown resource server enforcement
behavior, or an ambiguous or stale mapping all fail closed under step
5 (Section 11). A changed mapping is not by itself stale: the
AS evaluates each issuance, refresh included, against the target's
current trusted mapping, and a mapping is stale only when the AS
cannot establish that it is the current trusted mapping for that
target. This rule applies to every issuance path that can emit
scope on a Mission-bound token: initial issuance, refresh, Token
Exchange, and any other derived-token path.¶
This is the type-agnostic form of the rule; a type's own specification states when the mapping in step 3 is safe for that type's entries.¶
Scope projection does not change OAuth response semantics and does not make access-token inspection a client requirement.¶
Section 3.3 of [RFC6749] requires the token response to carry scope
whenever the granted scope differs from the requested scope, and its
grammar defines no empty scope, so an issuance cannot report an
ungranted requested value by omission. The AS MUST refuse, with
invalid_scope (Section 11), a request that explicitly names a
scope value the issuance cannot grant: a value the target's trusted
mapping names but no carried entry makes safe (step 3), or any scope
value the AS associates with a target that consumes
authorization_details (step 4).¶
An unknown, ambiguous, or stale mapping fails projection step 5 and yields
the invalid_target error code even when the request also names a
scope value; invalid_scope applies only under a mapping the AS
trusts.¶
Where the AS emits a projected scope, a requested scope narrows
it to the requested values, and the token response reports the
values granted (Section 5.1 of [RFC6749]). A Mission-creating
client does not request a resource scope for a target that consumes
authorization_details; for a scope-only target, a requested
scope selects among the values the projection can grant. Scope
values with their own semantics, such as openid ([OpenID.Core]),
are unaffected and combine with authorization_details as
Section 3.1 of [RFC9396] permits.¶
For a scope-only target, the trusted mapping also relates a requested
scope value back to authority, so a deployment's existing scope
values can request a Mission in configured-mapping mode
(Section 5.1), combining scope with the Mission's
authorization_details as Section 3.1 of [RFC9396] leaves to the AS.¶
Each requested value stands for the entries that the type's specification derives from the mapping.¶
The Authority Set is those entries narrowed to policy, and the token for that target carries their projection under the steps above.¶
A requested value the target's trusted mapping does not name cannot be
granted, and is refused with invalid_scope (Section 11).¶
A refusal caused solely by failure to establish a safe scope projection MUST NOT invalidate an otherwise-valid refresh token or its authorization grant. Independent expiration, revocation, and replay-detection rules continue to apply. An AS meets this by establishing the projection before it consumes or rotates the refresh token, or within the same atomic issuance, not by disabling rotation or restoring a consumed token.¶
The mission claim is a JSON object:¶
id:REQUIRED. A string. The Mission Identifier (Section 6.2.5).¶
issuer:REQUIRED. A string. The Mission's issuer (Section 6.2). A
credential's iss names the party that minted it; mission.issuer
names the party that approved and serves the Mission, and the two
differ for tokens minted in another trust domain
(Section 7.8.1).¶
The id and issuer members identify the Mission and carry no
authority of their own; the token's own signature authenticates the
pair, and the carried authorization_details remains the token's
concrete authority.¶
expires_at:OPTIONAL. A string. The Mission's expires_at
(Section 6.2), in RFC 3339 [RFC3339] date-time form. It
commits a lifetime bound, not current state: a validator can check
that the token's exp does not exceed it, but that check does not
establish that the Mission is still active, the only state that
permits reliance (Section 10).¶
A consumer that relies only on the presented token's own validity
needs nothing further: the token's exp already bounds it. A profile
that mints a further credential downstream of this one, or that
verifies a Mission's remaining lifetime from retained state rather
than a live token, MUST require expires_at and MUST treat its
absence as an error. The token's own exp bounds only that one
credential, not every credential the Mission may still yield.¶
The baseline mission claim carries neither authority_hash nor
approval_basis. Neither is an enforcement input a narrowed-token
resource server can exercise: authority_hash commits the complete
Authority Set, which such a resource server does not hold
(Section 9.1); approval_basis.type is provenance, not
authority (Section 6.2). An authorized introspection caller
can receive authority_hash and approval_basis.type
(Section 9.2.1).¶
The mission claim is an open object (Section 14): additional
members MAY appear alongside the members above. This document defines no
registry of mission members. A companion profile of this document MAY
use short member names coordinated with it; any other extension member
MUST use a collision-resistant name (for example, a name in a namespace
the extension controls, per the Collision-Resistant Name guidance of
Section 4.2 of [RFC7519]) and is defined by the profile that
introduces it.¶
A consumer MUST ignore members it does not understand and MUST NOT use any additional member to grant or widen authority; the members above remain authoritative.¶
The following is an example of a decoded Mission-bound token payload:¶
{
"iss": "https://as.example.com",
"sub": "user_3p2q8mN1a0kV7tR",
"aud": "https://erp.example.com",
"client_id": "s6BhdRkqt3",
"iat": 1793606405,
"exp": 1793606705,
"jti": "at_9Kp2vN7sR1tY8mZ3qX5b",
"authorization_details": [
{ "type": "mission_resource_access",
"resource": "https://erp.example.com",
"actions": ["invoices.read"],
"constraints": {
"resource_issued_after": "2026-07-01T00:00:00Z",
"resource_issued_before": "2026-09-30T23:59:59Z"
},
"delegation": {
"max_depth": 2,
"allowed_delegates": [{ "sub_profile": "ai_agent" }]
} },
{ "type": "mission_resource_access",
"resource": "https://erp.example.com",
"actions": ["journal-entries.write"],
"constraints": {
"max_amount": { "amount": "500.00", "currency": "USD" }
} }
],
"cnf": { "jkt": "0ZcOCORZNYy-DWpqq30jZyJGHTN0d2HglBV3uiguA4I" },
"mission": {
"id": "msn_8RfX2Lqv9TqMv4z7sA2bN1k0YpEdHc9-",
"issuer": "https://as.example.com"
}
}
¶
The mission claim of an access token, and the mission member that
introspection returns for an access token (Section 9.2), are
reserved for issuance that conforms to a Mission-binding profile. An
AS MUST NOT issue an access token carrying the mission claim unless
the token's issuance or derivation conforms to one: this document's
issuance gating (Section 7.1) and subset rule (Section 5.4) for
a token the Mission's issuer derives, or a companion profile that
defines another issuance or derivation path, including a token that a
Resource AS or a consuming AS issues and a token a holder derives under
an attenuation profile.¶
A profile that defines such a path MUST identify:¶
the authenticated grant or parent chain that connects the token's authority to the Mission;¶
the authority bound the path enforces, and the comparison or projection by which it enforces it;¶
where Mission state is checked, by which party, and the freshness or lifetime bound within which that check is relied on; and¶
any check a consumer of the token performs.¶
A mission claim means that the token's issuance or derivation
conformed to its profile. It does not mean that the party that minted
the token queried the Mission's current state, and it attests issuance,
not the Mission's state afterward: a later suspension or revocation
does not change what the claim attests (Section 10,
Section 9.2). The claim establishes no trust by its presence; a
resource server's issuer authorization and claim validation
(Section 9.1.1) still apply.¶
This reservation concerns access tokens and their introspection
representation. An evidence or control artifact that embeds a
mission descriptor (Section 14.1) is not an access token, and
this section does not change its meaning.¶
Delegation is an optional capability (Section 15). An agent may
delegate execution to downstream actors (a sub-agent, service, or tool
that is itself an OAuth client) within a Mission. Delegation is
represented with the OAuth Actor Profile
[I-D.draft-mcguinness-oauth-actor-profile], which profiles the
act (actor) claim of Section 4.1 of [RFC8693].¶
An intermediary in the agent's own trust domain that presents the agent's own tokens, such as a gateway holding the agent's credentials, acts as part of the agent and is not a delegate; acting as the agent, it can also narrow by self-exchange (Section 7.5), which does not delegate. An intermediary authenticated as a distinct actor that obtains a delegated token by Token Exchange is a delegate.¶
Delegation takes two kinds of Token Exchange, in this order:¶
The delegating party obtains a designation that names the delegate (Section 8.1).¶
The delegate redeems that designation for a delegated token (Section 8.2).¶
Delegating party AS Delegate | Token Exchange: | | | subject_token = | | | Mission-bound token, | | | audience = delegate ---->| | |<------ designation ------| | |---------------------- designation ------------------->| | |<------ Token Exchange: | | | subject_token = | | | designation | | |------- delegated token --->|¶
A designation is the delegating party's authorization for one
delegate to obtain delegated tokens. The holder of a Mission-bound
access token obtains it by Token Exchange ([RFC8693]): it presents
that token as the subject_token, proves possession of the token's
confirmation key, and names another client's identifier as
audience, with requested_token_type
urn:ietf:params:oauth:token-type:access_token. Only a
sender-constrained token can therefore be designated. The holder is
the Mission's approved agent for a token that carries no act claim,
and otherwise the delegate that the AS's accounting records as the
token's outermost actor (Section 8.4).¶
Issuing a designation applies the issuance procedure of
Section 7.1 as it states for a designation. A designation
request is a token request under an existing Mission-bound grant
(Section 4.3.3):
it needs no mission_intent, and every other check that section names
still applies to it.¶
A designation the AS issues:¶
carries a subset (Section 5.4) of the presented token's authority,
and the same mission claim (Section 7.8);¶
has aud equal to the designated client's identifier, and a
may_act claim (Section 4.4 of [RFC8693]) whose sub is that
identifier;¶
carries no cnf and no act claim: like an authorization code, it
is bound to the client that redeems it, which authenticates and
proves its own key in the delegated exchange (Section 8.2),
and the delegated token's act renders the AS's accounting
(Section 8.4); and¶
MUST expire shortly after it is issued, and no later than the
presented token or the Mission's expires_at.¶
A designation's aud names its redeemer and reassigns no entry's
original approved audience (Section 5.5.1). For a
designation, the audience rules of Section 7.3 test the resource
audiences associated with the entries it carries, never the designated
client its aud names (Section 7.2). A designation carries only a
permitted subset of the presented token's entries (Section 5.4,
Section 8.4), each keeping its original approved
audience (Section 5.5.1). An entry without an
original approved audience is not carried, and a designation that
would carry no entry is refused with invalid_target. Its redemption
issues an entry only as Section 5.5.1 and
Section 8.2 permit, including their narrowing condition.
The delegated token issued at its redemption is subject to every rule
of Section 7.3 unchanged.¶
A designation names a delegate and adds none. Whether one may be redeemed more than once within its lifetime is the AS's policy; each redemption is a delegated exchange of its own (Section 8.2). Its expiry bounds when it can be redeemed, not the lifetime of a delegated token issued from it (Section 7.6). That delegated token can outlive both the designation and the credential the designation was derived from. Revoking the grant state backing that credential still refuses every later redemption (Section 8.2).¶
A designation authorizes no resource access. A designated client's
identifier MUST NOT be an audience that any resource server accepts
for this AS's access tokens, throughout the designation's lifetime.
That includes an alias a resource server accepts but the AS never
issues as an audience. The AS MUST refuse, with invalid_target
(Section 2.2.2 of [RFC8693]), a designation request naming a client
for which it cannot establish that separation. A resource server that
validates a JWT access token's audience (Section 4 of [RFC9068])
therefore rejects a designation, and at introspection
(Section 9.2.2) the AS MUST return active: false for one,
with no mission member.¶
A delegate obtains a delegated token by Token Exchange ([RFC8693]), presenting a designation that the delegating party obtained for it (Section 8.1). Issuance applies the issuance procedure of Section 7.1 as it states for a delegated exchange. The AS issues the delegated token subject to all of the following:¶
The exchange is explicit. The subject_token is a designation
this AS issued naming the authenticated requesting client
(Section 8.1), with subject_token_type
urn:ietf:params:oauth:token-type:access_token, and the
requested_token_type is
urn:ietf:params:oauth:token-type:access_token. The AS MUST refuse
any other subject_token with invalid_request
(Section 2.2.2 of [RFC8693]); an access token issued for resource
access is never sufficient. The delegate is identified by its own
client authentication, and the AS asserts the actor itself
(Section 8.4).¶
The delegate authenticates. The AS MUST authenticate the
requesting client, whether or not the request carries an
actor_token, by a method it relies on to identify the client
(Section 2.3 of [RFC6749]), and MUST refuse a client it does not
so authenticate with invalid_client (Section 5.2 of [RFC6749]),
issuing no token. Once it has so authenticated the client, the AS
MUST refuse a request that carries an actor_token with
invalid_request (Section 2.2.2 of [RFC8693]), issuing no token.
A claimed client_id, possession of the designation, or proof of
an independently chosen key, such as a DPoP key, does not
authenticate a client. This document does not
support a public client as a delegate: Section 2.3 of [RFC6749]
lets an AS establish a client authentication method with a public
client but not rely on it to identify the client. Only an extension
that defines an explicit binding of a designation to its delegate
admits one; deployment policy alone does not.¶
Subject is stable. sub remains the Mission's Subject. The
delegate is an actor, not the Subject.¶
client_id keeps its ordinary meaning. It names the client that
requested the token (Section 7.2); the originally-approved agent
stays in the Mission Record (Appendix C.3).¶
The act chain identifies the delegates. The delegated token
carries an act claim per Section 4.1 of [RFC8693] and the Actor
Profile [I-D.draft-mcguinness-oauth-actor-profile]: the outermost
act is the current delegate, and each earlier delegate is nested
in the previous actor's act member. Each actor object carries the
members that profile defines (for example, sub, iss, and the
sub_profile actor-type classification, such as ai_agent).¶
The audience processes the chain. The AS issues the delegated
token only for an audience that meets the issuance rule of
Section 9.1.2, and refuses any other with invalid_target.¶
Authority only narrows. The delegated token's
authorization_details MUST be a subset (Section 5.4) of the
designation's authority, hence of the delegating token's and of the
Mission Authority Set. A type that declares delegation without
narrowing (Section 5.5.1) is delegable only
unchanged: the AS MUST NOT include an entry of such a type in a
delegated token unless it is equal (Section 5.4) to an entry of the
presented delegating token, it keeps that entry's approved audience,
and the type's delegation policy permits the delegate
(Section 8.4). The reference is the presented token,
not the Mission Authority Set, so equality never restores an entry,
or any part of one, that the presented token omits.¶
The mission claim is unchanged. The delegated token carries
the delegating token's mission claim (Section 7.8)
unchanged, so every actor in the chain operates under the one
consented authority.¶
Each delegate is bound to its own key. The delegated token MUST
be sender-constrained (Section 7.2) to the delegate's
own key: its cnf is the delegate's DPoP or mTLS key, not the
delegating party's, and the delegate proves possession of that key
in the Token Exchange. Compromise of a delegate's key therefore does
not enable use of tokens bound to the agent's or another delegate's
key.¶
Each redemption is gated. Issuing a delegated token is a
derivation, refused unless the Mission is active
(Section 7.1.1). The AS MUST evaluate every redemption of
a designation afresh, as a derivation of its own: the credential the
designation was derived from, and all applicable grant state
backing that credential, are still valid; the Mission is active;
and the delegation policy (Section 8.4) and the
Mission's current authority admit the result. An earlier redemption
establishes none of these. Where that credential was issued under a
grant lineage, the backing grant state includes that lineage, kept
through any exchange that established no new grant lineage
(Section 6.4.2). A credential issued under none has no
lineage to validate; that never excuses dropping or ignoring a lineage
that does exist. The Mission's active state never substitutes for
backing grant state.¶
A delegated exchange response MUST carry mission_id and
mission_expires_at (Section 7.3.1), because the
delegate did not receive the response that created the Mission.¶
The act chain nests (act.act) for as long as, and only while,
authority continues under the same approved Mission. A new approval
basis, such as a Mission created from an existing Mission's authority
(Section 6.4.2), begins its own delegation basis and chain,
and no organizational, network, or deployment boundary by itself
restarts or extends a chain.¶
The chain is attribution, not authority:¶
An act entry names who acted, for audit.¶
The input to the eligibility matching of Section 8.4 is the delegate the AS authenticates and asserts at the exchange, not an entry read from the chain.¶
An asserted actor identity grants nothing.¶
The authorization_details subset relations (Section 5.4), not the
chain, show that authority narrowed.¶
Where a deployment authenticates client instances
([I-D.draft-mcguinness-oauth-client-instance-id], with attesters a
client endorses under [I-D.draft-mcguinness-oauth-client-attesters]),
the delegate named by the outermost act can be an actor that an
authenticated instance represents. Instance evidence does not
establish that actor
(Section 5 of [I-D.draft-mcguinness-oauth-client-instance-id]), so
the AS establishes the delegate's actor identity, and that actor's
trusted association with the instance, separately.¶
Because a delegated token is sender-constrained to the delegate's own
key (Section 8.2), and the Actor Profile makes the
top-level cnf the current presenter's key
([I-D.draft-mcguinness-oauth-actor-profile]), that cnf is a key
the instance possesses.¶
A deployment MAY convey client_instance in delegated tokens under
[I-D.draft-mcguinness-oauth-client-instance-id]. This composition
selects the authenticated presenting instance for output context.
The instance specification owns attestation validation,
instance-to-key association, audience-scoped mapping, and Context
Consumer validation; this section supplies the Mission-specific
authorization and context selection. Deployments configure its use
and whether instance attribution is required.¶
When issuing context under this composition, the AS MUST use the presenting instance validated under Section 5 of [I-D.draft-mcguinness-oauth-client-instance-id], establish its trusted association with the separately authenticated delegate, and bind the output token to an instance-unique key whose possession it verified in that exchange. Context is mapped from that validated instance into the output audience's Consumer Scope under Section 7.1 of [I-D.draft-mcguinness-oauth-client-instance-id]. The AS MUST NOT use context copied or remapped from an input token as a substitute for the presenting instance's evidence. For example, when instance B is authorized to continue work from instance A, output context names B; A's context does not become B's identity by remapping it.¶
The actor authentication, delegation eligibility, subset, and lifecycle checks of Section 8.2 and Section 8.4 still authorize the exchange; instance evidence satisfies none of them by itself.¶
Where deployment policy requires instance attribution, the AS MUST refuse the exchange if the required instance evidence or its association with the delegate and output key cannot be established. Section 11 gives the error codes for these refusals.¶
If the exchange issues a refresh token, and so establishes a redeemable grant lineage (Section 6.4.2), the grant-continuity rules of Section 5.1 of [I-D.draft-mcguinness-oauth-client-instance-id] apply alongside Section 6.4; instance continuity alone does not authorize replacement of the recorded instance or key rebinding.¶
Consumers establish presenter attribution under Sections 7.3 and 7.5 of [I-D.draft-mcguinness-oauth-client-instance-id]. A consumer requiring attribution rejects unestablished associations under Section 7.6 of [I-D.draft-mcguinness-oauth-client-instance-id].¶
This composition does not add provenance to client_instance: a
consumer can use the direct-attestation trust configuration only when
the issuer meets that configuration's restriction against upstream
context.¶
An issuer also conveying upstream context needs a separately specified, authenticated provenance mechanism before its context can support presenter attribution.¶
What may be delegated, how far, and to whom is governed per Authority
Set entry by a type-defined delegation policy (Section 5.5). For
mission_resource_access, the policy is the delegation member,
whose concrete depth and matcher conditions the Mission Resource
Access Profile defines
([I-D.draft-mcguinness-oauth-mission-resource-access]).¶
Because the policy lives in the entry, authority_hash commits it
with the rest of the Authority Set.¶
Delegation depth. The delegation depth of a token is the number
of delegations between the approved agent and the token's current
actor: the agent's own non-delegated token is depth 0, the first
delegate is depth 1, and each further delegate adds 1. The depth
checked against max_depth is that of the token being issued,
computed after appending the new outermost actor, not the depth of
the delegating token.¶
Depth accounting. The AS MUST establish delegation depth from
accounting it maintains for the tokens it issues under the Mission
and associates with the credential it validates (for example, recorded
at issuance against the token), not from the nesting of a presented
act claim. The act chain is attribution
(Section 8.2): it renders the accounted chain and is not
the source of the count.¶
Over the exchanges this document defines, the accounting is complete:¶
each delegated exchange adds exactly one delegate; and¶
a designation (Section 8.1) and a self-exchange (Section 7.5) add none.¶
A profile that issues Mission-bound tokens by another path specifies how it preserves or reconstructs this accounting and any reset it defines.¶
Where the AS cannot establish the depth of the token being issued, no entry's delegation policy can be evaluated at that depth, so every entry narrows out under the per-entry rule below and the exchange is refused as an empty result. A resource server bases no authorization decision on a prior actor (Section 4.1 of [RFC8693]).¶
Per-entry enforcement. When the AS issues a token to a delegate
(the actor that becomes the outermost act) at delegation depth
d, it includes a Mission Authority Set entry in the delegated
token's authorization_details only if both of the following hold:¶
The entry's type defines a delegation policy for the entry. An entry carrying no type-defined delegation policy is non-delegable, the default.¶
That policy, evaluated at depth d, permits this delegate. The AS
applies the policy's own eligibility test at every exchange; where
the policy leaves a matcher unstated, the AS's
delegation-authorization policy decides, and absence is never a
blanket grant.¶
An entry failing either condition narrows out of the delegated token, consistent with the subset rule (Section 5.4). The delegation policy is not part of the subset comparison itself, and a surviving entry carries it intact so the next hop is evaluated the same way.¶
Empty result. If narrowing leaves no entries for the delegate,
the AS MUST refuse the exchange with the invalid_target error code
(Section 2.2.2 of [RFC8693]) rather than issue a token with empty
authority. The requested delegation has no authority to carry, while
the subject grant itself remains valid for other exchanges.¶
The resource server enforces none of this. The AS applies
delegation constraints at issuance; a resource server sees only the
already-narrowed authorization_details and enforces those as usual
(Section 9.1).¶
In this example, the Mission's Authority Set has two entries on the ERP:
invoices.read, delegable to ai_agent actors through depth 2; and
journal-entries.write, which carries no delegation member and is
therefore non-delegable. The approved agent s6BhdRkqt3 designates
sub-agent tool-runner-7, an ai_agent, which redeems the
designation at depth 1. The read entry
is permitted (depth 1 <= 2, ai_agent allowed) and the write entry
narrows out. The following is an example of the decoded delegated
access token:¶
{
"iss": "https://as.example.com",
"sub": "user_3p2q8mN1a0kV7tR",
"aud": "https://erp.example.com",
"client_id": "tool-runner-7",
"iat": 1793607005,
"exp": 1793607305,
"jti": "at_3qX5bN7sR1tY8mZ9Kp2v",
"authorization_details": [
{ "type": "mission_resource_access",
"resource": "https://erp.example.com",
"actions": ["invoices.read"],
"constraints": {
"resource_issued_after": "2026-07-01T00:00:00Z",
"resource_issued_before": "2026-09-30T23:59:59Z"
},
"delegation": {
"max_depth": 2,
"allowed_delegates": [{ "sub_profile": "ai_agent" }]
} }
],
"act": {
"sub": "tool-runner-7",
"iss": "https://as.example.com",
"sub_profile": "ai_agent"
},
"cnf": { "jkt": "Inaz7NtW9__w8ZNhk-CB7X_Y1G-XSCRAYT4oBffaS_0" },
"mission": {
"id": "msn_8RfX2Lqv9TqMv4z7sA2bN1k0YpEdHc9-",
"issuer": "https://as.example.com"
}
}
¶
The sub claim is still the user. The client_id claim is
tool-runner-7, the delegate that authenticated the Token Exchange
and requested this token (Appendix C.3); it matches the
outermost act only because tool-runner-7 authenticated the
exchange itself. The client_id claim does not name s6BhdRkqt3, the
originally-approved agent, whose identity remains recoverable from the
Mission Record via mission_id (Section 6.2).¶
The cnf is tool-runner-7's own key, not the agent's, so this token
cannot be replayed as the agent. The non-delegable write entry was
dropped; the read entry survives, carrying its delegation member so
a further hop can be evaluated: a depth-3 delegate, or a
non-ai_agent one, would narrow it out too. The mission claim is
unchanged.¶
Section 9.1 states how a resource server enforces a Mission-bound token, and Section 9.2 how the issuer reports a token's Mission state through token introspection.¶
A resource server enforces a JWT Mission-bound token from the token
alone; no call to the AS is required. It validates the token per
Section 4 of [RFC9068], and any sender-constraint binding (cnf)
per Section 7.1 of [RFC9449] or Section 3 of [RFC8705], locally,
even when it introspects (Section 9.2.2).¶
An opaque Mission-bound token is enforced from its active introspection response or issuer-local resolution instead, under the same rules (Section 9.2.4).¶
A resource server:¶
MUST treat authorization_details as the authoritative expression
of authority and enforce each applicable entry according to that
entry's own type specification. Where more than one carried entry
applies, entries are alternative grants of authority, not conjunctive
filters, unless the entry's type states otherwise.¶
MUST treat as providing no authority any applicable entry whose
type it does not implement, or whose type-defined enforcement it
cannot complete (an unrecognized member, an unenforceable
constraint, or an unrecognized matching mode). It MUST challenge
with insufficient_scope ([RFC6750]), or with the
RAR-remediation challenge as Section 9.1.4 states, unless another
applicable entry that it can fully enforce authorizes the whole
request on its own, and MUST NOT combine parts of several entries
to authorize one request. A failure of the token's own validation
(above) rejects the token whatever its entries carry.¶
MUST NOT, when a token also carries scope, grant on the basis of
a scope value any access broader than the corresponding
authorization_details entry permits, including access that
bypasses a constraint carried only in authorization_details.¶
MUST NOT infer the Mission's originally-approved agent from
client_id, which names the client that requested this token, on
a delegated token or otherwise (Section 4.3 of [RFC8693],
Appendix C.3); the approved agent is recorded only in
the Mission Record (Section 6.2) at the issuer.¶
MUST, when configured to require the mission claim for a
Mission-governed resource, challenge with the invalid_token error
code a request whose token lacks it. The issuance-side duty that
pairs with this challenge is stated in Section 4.3.3, the
downgrade it prevents in Section 17.1.2, and the
metadata that advertises the requirement in
Section 13.¶
MUST accept a mission claim only from an issuer it explicitly
trusts to issue Mission-bound authorization for the resource;
trusting the issuer's ordinary access tokens is not enough. It MUST
require mission.issuer to equal the token's iss, unless a
Mission-binding profile it has adopted (Section 7.8.1),
such as [I-D.draft-mcguinness-oauth-mission-cross-domain],
explicitly establishes the permitted relationship between the two.
It MUST
challenge with the invalid_token error code a request whose token
fails either check. For an opaque token, the issuer is the AS whose
introspection response or issuer-local resolution the resource
server relies on, and the same checks apply to that response's
mission member (Section 9.2.4).¶
Other sections state how a resource server treats a reported Mission
state (Section 10), mission claim members (Section 7.8), an
entry's resource against a request's target (Section 7.3), and
a designation presented to it (Section 8.1).¶
A resource server can also:¶
require that a token carry an act chain and record it, while
authorizing only the token's current actor
(Section 4.1 of [RFC8693]);¶
log the mission claim's id and the token's jti claim with
each served request, so its access logs join to Mission evidence;
or¶
where the AS offers it, introspect the token (Section 9.2) to observe Mission state per request.¶
A resource server that receives no delegated token need not be
Mission-aware. One that authorizes only from scope operates within
the Mission only to the extent the AS established a safe projection
for it at issuance (Section 7.7); constrained authority that
no safe projection carries is enforced only where a resource server,
or a runtime layer, evaluates authorization_details.¶
Two parties keep a delegated Mission-bound token, one carrying an
act claim, from consumers that do not process the act chain:¶
The AS, at issuance. The AS MUST refuse, with invalid_target
(Section 11), a request for a delegated Mission-bound token
whose audience it has not established as a Mission-aware Resource
Server (Section 9.1.1) that also processes the act chain,
authorizing and logging the caller from the chain rather than from
client_id alone. That the audience parses act does not
establish this.¶
The deployment, after issuance. A deployment MUST NOT route a
delegated Mission-bound token to a Mission-unaware resource server,
or to logging or audit infrastructure, that authorizes or logs the
caller on client_id without processing the act chain. The AS
cannot verify where a token travels beyond its audience or which
pipelines log its use, so that routing and logging remain the
deployment's.¶
A Mission-unaware [RFC9068] resource server reads client_id as
the immediate client, which is accurate for that single token. It
cannot see the delegation lineage in the act chain or look up the
originally-approved agent in the Mission Record, so it cannot
recognize the current actor as a delegate, record that lineage, or
join a delegate's action to the Mission's approval in its audit
records.¶
A resource that requires Mission-bound tokens can advertise that
through the mission_bound_authorization_required protected resource
metadata member (Section 13); a resource server
that serves such a resource is, by that requirement, Mission-aware.
That requirement does not by itself establish that the resource
server processes the act chain.¶
A resource server denial falls into one of four cases, each using the OAuth challenge for its own failure class (Section 11 gives the codes):¶
Weak or stale Subject authentication. Where the deployment
conveys the authentication of the token's Subject, through the
claims of Section 7.6 or introspection
(Section 6 of [RFC9470]), and that authentication does not meet
the resource's requirement, the resource server challenges with
insufficient_user_authentication and the acr_values or
max_age parameters (Section 3 of [RFC9470]).¶
Where no Subject authentication applies, the token carries no such claims and the challenge offers no remediation, so the resource server does not use it. The Subject's authentication is a distinct fact from the Approver's approval-time authentication; a requirement on the Approver is an approval floor (Section 6.1.2), not a resource server challenge.¶
Sender-constraint or key-binding failure. The token's proof of
possession is missing or invalid: the resource server challenges
with invalid_token, in the DPoP scheme for a DPoP-bound token
(Section 7.1 of [RFC9449], with use_dpop_nonce per
Section 9 of [RFC9449]) and in the Bearer scheme for a
certificate-bound token (Section 3 of [RFC8705]). This is not a
step-up: no fresh user authentication repairs a missing or wrong
key.¶
Insufficient carried authority. The action is outside the
token's carried authority: the resource server challenges with
insufficient_scope ([RFC6750]), or with the RAR-remediation
challenge where
[I-D.draft-ietf-oauth-rar-metadata-remediation] is deployed
(Section 9.1.5).¶
Unenforceable constraint. An applicable entry carries a type-defined member or constraint the resource server cannot enforce, and the resource server challenges with the same base error as case 3.¶
Cases 3 and 4 are identical 403 responses to a client, which cannot
tell from them whether a new approval would help. A Mission-aware
Resource Server SHOULD therefore indicate which of the two cases
applies by including, alongside error ([RFC6750]), the
mission_denial attribute that this document defines for the
WWW-Authenticate response header field, with one of two values:¶
insufficient_authority:The action is outside the token's carried authority; more requires a new approval.¶
constraint_unrecognized:An applicable entry carries a type-defined member or constraint the resource server cannot enforce. A client MUST NOT treat this value as inviting retry, step-up, or fresh approval: none of those makes a resource server enforce a constraint it does not implement.¶
A value the client does not recognize is treated as
insufficient_authority. A resource server SHOULD include the
attribute only in a response to a validly signed, audience-correct
token whose holder its deployment permits to learn the distinction
(Section 17.3.2).¶
A denial can carry independent remediation grains: separate
remediation mechanisms, each naming a next step without granting
anything. There are three: the mission_denial attribute of the
WWW-Authenticate challenge (Section 9.1.4); the
insufficient_authorization error code with the
authorization_remediation parameter
([I-D.draft-ietf-oauth-rar-metadata-remediation]), which names what
mission_denial: insufficient_authority only points at; and the
requestable denial of [AuthZEN.ARAP], profiled by
[I-D.draft-mcguinness-mission-authzen], which routes the same denial
into a governed access request rather than a fresh derivation. Each
grain keeps the wire shape and response status its defining document
gives it.¶
A client that decodes authorization_remediation can request the
carried entries on the standard authorization_details parameter of
a refresh request (Section 7.3), where they derive under
this document's ordinary rules (Section 5): of an
advertised, schema-valid type (Section 12), narrowed same-type
(Section 5.4, Section 5.5) like any other request. The AS issues
only what both the presented refresh grant (Section 6 of [RFC9396])
and the Authority Set contain, and refuses a request beyond either
(Section 7.4), so a refresh-token family narrower than the
Mission does not obtain the Mission's wider authority.¶
For entries outside the Authority Set, more authority requires a new approval, proposed as for a new Mission (Section 4.3). A client holding no refresh grant that covers the entries proposes them as for a new Mission.¶
The three grains compose: a deployment can offer any subset, and none widens authority beyond what Section 5 derives from the same proposal unremediated.¶
A resource server consults the issuer about a Mission-bound token in one of three cases, with different obligations:¶
JWT state observation. A resource server that observes Mission state per request introspects the JWT Mission-bound token it holds, instead of waiting for the token to expire.¶
Opaque-token consumption. For an opaque Mission-bound token, introspection is the claims carriage: an active response carries what the JWT would (Section 9.2.4).¶
Issuer-local resolution. In place of introspection for an opaque Mission-bound token, an AS can serve a qualifying resource server by a direct read of the AS's authoritative committed token and grant state (Section 9.2.4).¶
The cases separate token representation from state freshness.
Representation is where a resource server reads the token's
authority: the JWT itself or, for an opaque token, its active
introspection response or issuer-local resolution. Freshness is how
recent its view of Mission state is: a JWT read alone shows only that
the Mission was active when the token was issued; an introspection
response reports the token and its Mission for one decision; and a
state-distribution companion reports the Mission's state, not a token's,
with its own freshness. In every case the authority a resource server
enforces is the one the token carries (Section 9.1.1).¶
An AS MAY support OAuth 2.0 Token Introspection [RFC7662] for
Mission-bound access tokens. When it does, an active: true response
for such a token, to a caller authorized to receive Mission data
(Section 9.2.1), MUST carry, in addition
to the standard members, a mission member: a JSON object with the
following members:¶
id and issuer: as in the mission claim (Section 7.8).¶
state: the Mission's current lifecycle state (string). Its value
space, including a state a deployed companion profile defines, and
the consumer's forward-compatibility rule are those of
Section 10.¶
termination: when state is terminated, the Mission's
termination (Section 10.1) (object).¶
proposal_hash: when the Mission records an authority proposal,
the Mission's proposal_hash (Section 6.2) (string).¶
authority_hash: the Mission's Authority Set commitment
(Section 6.2) (string).¶
approval_basis: the Mission's approval_basis
(Section 6.2), carrying type only.¶
authority_source: the Mission's authority_source
(Section 6.2), carrying type and, for organizational,
policy with id and version only, never the policy digest.¶
Only the Mission issuer reports state, termination,
proposal_hash, authority_hash, approval_basis, and
authority_source (Section 9.2.3). The last four are
audit and correlation signals, not enforcement inputs
(Section 9.1); each is disclosed only as
Section 9.2.1 permits.¶
For a malformed, unknown, individually expired, or otherwise
unresolvable token, the AS responds per [RFC7662] (active: false)
with no mission member; it does not reveal Mission state for a
token it cannot bind to a Mission. The AS discloses a mission member
only for a token it has established was issued on a path that
conforms to Section 7.8.1; a token it cannot establish
so is unresolvable in this sense. How the AS establishes this is its
own; a record of its own issuance is one means.¶
The composite-active rule (Section 9.2.2) and the mission
member apply equally when a Mission-bound refresh token is
introspected.¶
Freshness is per use. Strengthening Section 4 of [RFC7662], which
permits a protected resource to cache the response, this document
defines no caching semantics for the mission member: a resource
server that relies on introspection for Mission state treats each
response as an observation for that decision, not as a cacheable
state assertion.¶
A deployment that needs bounded-staleness caching adopts the Mission Status companion, whose signed responses carry explicit freshness ([I-D.draft-mcguinness-oauth-mission-status]).¶
The introspection active member reflects the composite
authorization, not the token in isolation. Strengthening
Section 4 of [RFC7662], the AS MUST return active: true only when
the access token passes that section's checks (valid signature,
unexpired, and not individually revoked) and the Mission is
active. A designation, which authorizes no resource access, is
reported inactive with no mission member, as Section 8.1 states.¶
The AS does not verify the token's sender-constraint (cnf) at
introspection; the resource server checks proof of possession when
the token is presented, so active: true is not by itself evidence
that the caller holds the bound key.¶
When the token is otherwise valid but the Mission is terminated,
the AS MUST return active: false and include mission.state and
mission.termination, whose reason gives the cause, so a resource
server can distinguish a dead Mission from a bad token. A Mission
transition does not by itself revoke the token as an individual
credential; introspection reports the composite authorization as
inactive. An otherwise valid token is one that passes those checks and
that the AS has established was issued on a conforming path
(Section 9.2).¶
Reporting the mission member, mission.state included, for an
inactive token deviates from the SHOULD NOT of Sections 2.2 and 4 of
[RFC7662] against including additional information about an
inactive token. The caller authorization and minimization rules
(Section 9.2.1) govern that deviation.¶
An AS MUST NOT include mission.state, mission.termination,
proposal_hash, authority_hash, approval_basis, or
authority_source in an introspection response unless it holds the
Mission, that is, unless it is the Mission issuer. Introspection at
a non-issuer Resource AS, which returns only the claim-shape members,
is specified by the cross-domain companion
([I-D.draft-mcguinness-oauth-mission-cross-domain]).¶
The RFC 9068 JWT of Section 7 is this document's self-contained carriage. An AS MAY instead issue a Mission-bound access token as an opaque reference token, under this mode and only under it; an opaque Mission-bound token outside this mode is not profiled.¶
In this mode, an AS issuing opaque Mission-bound tokens MUST offer introspection for them with the members this mode names, unless every resource server that consumes them uses issuer-local resolution (below).¶
An active (active: true) response for such a token MUST carry,
as introspection response members, the audience-filtered granted
authorization_details ([RFC9396]), the mission member above,
aud, cnf where the token is sender-constrained ([RFC8705],
[RFC9449]), and act where execution was delegated
(Section 8): everything Section 7 requires the
JWT to carry, sourced from the same issuance state.¶
The granted authorization_details and any act chain appear
only on an active response. An inactive response carries
active: false and the mission state facts
(Section 9.2.2), never the authority itself.¶
A resource server consuming an opaque Mission-bound token:¶
MUST resolve it through introspection or issuer-local resolution (below) before service;¶
MUST verify active is true, its own identity in aud, and
the sender-constraint binding cnf names; and¶
MUST enforce the response's authorization_details under the
same rules as the token-carried form (Section 9.1), the
fail-closed duties included.¶
A resource server whose introspection response for an opaque
Mission-bound token is active: false, or whose issuer-local
resolution resolves it as inactive, MUST refuse the request with
the invalid_token error code (Section 3.1 of [RFC6750]), in the
DPoP scheme for a DPoP-bound token (Section 7.1 of [RFC9449]).¶
A resource server that cannot obtain a valid introspection response
or issuer-local resolution for an opaque Mission-bound token MUST
refuse the request rather than serve it from any cached or
out-of-band belief about the token's authority. The failure
establishes nothing about the token: the resource server MUST
respond with HTTP status code 503 (Service Unavailable)
(Section 15.6.4 of [RFC9110]), adding a Retry-After header field
where a retry time is meaningful, and MUST NOT report the token as
invalid, such as with the invalid_token error code.¶
The per-use freshness rule of Section 9.2 covers the whole response in this mode: each response is one observation of the token's claims and Mission state, not a cacheable authority record.¶
An AS MAY serve a resource server through issuer-local resolution: a direct read of the AS's authoritative committed token and grant state, not a call to an introspection endpoint. [RFC7662] introspection keeps its meaning as a network protocol. A resource server qualifies only when it is inside the issuer's trusted implementation boundary and the AS authorizes it to read that state; common ownership or a shared network does not by itself qualify it.¶
For each resolution, the AS:¶
MUST resolve the presented token to that token's own issuer-qualified issuance or grant record, and establish from that record the token's expiry, revocation and grant validity, its intended audience, the composite active state (Section 9.2.2), and the token's own authority;¶
MUST authorize the resource server and minimize disclosure to it as Section 9.2.1 requires for an introspection caller; and¶
MUST yield, when the token is active, only what an active response
for that token carries in this mode, audience-filtered for that
resource server and with act and cnf as that response carries
them, and never the Mission's Authority Set or other authority the
token does not carry.¶
Mission state alone, or a lookup by Mission Identifier, never
establishes a token's validity or authority. An unknown, invalid,
expired or revoked token, or a Mission that is not active, resolves
as inactive and yields no authority; missing or unavailable state
yields no valid resolution.¶
In the resource server duties above, the resolution stands in for the introspection response, possession proof and fail-closed refusal included, and each resolution is one per-use observation, not a cacheable assertion.¶
The following is an example of an introspection response for the
canonical ERP token (Section 7.8) while the Mission is
active. The issuer AS returns the standard [RFC7662] members and
the mission member to a caller holding the deployment's
audit-and-correlation disclosure privilege, so authority_hash and
proposal_hash appear; the default audience-filtered enforcement
projection omits them.¶
{
"active": true,
"iss": "https://as.example.com",
"sub": "user_3p2q8mN1a0kV7tR",
"client_id": "s6BhdRkqt3",
"aud": "https://erp.example.com",
"exp": 1793606705,
"authorization_details": [
{ "type": "mission_resource_access",
"resource": "https://erp.example.com",
"actions": ["invoices.read"],
"constraints": {
"resource_issued_after": "2026-07-01T00:00:00Z",
"resource_issued_before": "2026-09-30T23:59:59Z"
},
"delegation": {
"max_depth": 2,
"allowed_delegates": [{ "sub_profile": "ai_agent" }]
} },
{ "type": "mission_resource_access",
"resource": "https://erp.example.com",
"actions": ["journal-entries.write"],
"constraints": {
"max_amount": { "amount": "500.00", "currency": "USD" }
} }
],
"mission": {
"id": "msn_8RfX2Lqv9TqMv4z7sA2bN1k0YpEdHc9-",
"issuer": "https://as.example.com",
"authority_hash":
"sha-256:hjXlwWBY64-RPs1Z-E_gbyklNcViI5c9jiyMbE4KvFM",
"proposal_hash":
"sha-256:p-s-EzdNQTn6RoPHXESkwVtGdk8yL1PxryNyMwroKGo",
"state": "active"
}
}
¶
The following is an example of the response, after the Mission is revoked, for an unexpired token the AS issued on refresh before the revocation (Section 9.2.2):¶
{
"active": false,
"mission": {
"id": "msn_8RfX2Lqv9TqMv4z7sA2bN1k0YpEdHc9-",
"issuer": "https://as.example.com",
"authority_hash":
"sha-256:hjXlwWBY64-RPs1Z-E_gbyklNcViI5c9jiyMbE4KvFM",
"state": "terminated",
"termination": {
"reason": "revoked",
"terminated_at": "2026-11-02T08:53:20Z"
}
}
}
¶
A Mission is in one of two states:¶
active: the only state in which the AS derives tokens.¶
terminated: a terminal state; the Mission has ended. Its
termination member (Section 10.1) gives the reason: revoked
when it was revoked (Section 10.2), or expired when its
expires_at passed.¶
The transitions are:¶
| From | Event | To | Reason |
|---|---|---|---|
| (none) | approval event |
active
|
|
active
|
revoke |
terminated
|
revoked
|
active
|
expires_at reached |
terminated
|
expired
|
The Mission Lifecycle States registry (Section 20.7) holds these states, and the Mission Termination Reasons registry (Section 20.8) holds the reasons. A companion profile MAY register an additional state for a lifecycle it introduces (for example, a paused state). A companion profile that defines a further way for a Mission to end registers a termination reason, not a state.¶
Wherever a Mission state is reported, including the Mission Record
and the introspection mission member, a consumer MUST treat only
the exact value active as permitting derivation or continued
reliance, and MUST treat every other value, including one it does
not recognize, as non-active and non-deriving (the
forward-compatibility rule).¶
For every state-dependent decision this document defines, the AS MUST
treat a Mission as active only when its stored state is active
and the decision time is strictly before expires_at. From
expires_at, a Mission whose stored state is still active is
terminated with reason expired for every such decision, whether
or not that transition is persisted, including when persisting it
fails.¶
Persisting that transition, and emitting any lifecycle event a state-distribution companion defines, can happen after the decision that observed the boundary; persisting it never replaces a termination already recorded.¶
A Mission whose state is terminated carries a termination
object, in the Mission Record and wherever its state is reported with
it; a Mission in any other state carries none. Its members are:¶
reason:REQUIRED. A string, a value of the Mission Termination Reasons
registry (Section 20.8): revoked or expired in
this document, or a reason a companion profile registers.¶
terminated_at:REQUIRED, except as described below. A
string. An RFC 3339 [RFC3339] date-time: the instant the
termination took effect. For expired, it is the Mission's
expires_at.¶
A companion profile that registers a reason defines that reason's further members. A profile that maintains a state version for the Mission adds the version of the transition that committed the termination as its audit reference.¶
The issuer writes termination once, atomically with the transition
to terminated, and MUST NOT change it: an expiry, or any later event,
does not replace the reason or references of a Mission already
terminated.¶
A termination carries every member its reason requires, except as follows.¶
A termination need not carry a member its reason requires when it
was recorded before its reason defined that member, or derived
from such a termination: such a termination exposes only the facts
its record retained and omits a member it has no retained value for,
terminated_at included, rather than inventing one. For expired,
the retained terminated_at is the Mission's expires_at; for
another reason, a retained commit time is its terminated_at only
where that commit was the termination's effect.¶
A consumer that receives such a termination, or a reason it does
not recognize, still treats the Mission as terminated: it stops work
governed by the Mission, follows no absent reference, and infers no
cause-specific action.¶
A Mission is revoked when the AS receives a revocation for it from a
party the deployment's policy authorizes to revoke it, or when that
policy itself terminates the Mission; either way, its termination
reason is revoked. The Subject, the Approver, and an administrator
are parties that policy can authorize; none is authorized by its role
alone. A Mission Issuer MUST accept, through an authenticated means
independent of possession of any token, a revocation by mission_id
from a party the deployment's policy authorizes (so a Mission can be
stopped even when no refresh token is held).¶
The wire shape of that revocation is out of scope for this document. A deployment-defined surface that authenticates the revoking party independent of possession of any token satisfies this requirement.¶
When the AS establishes that the principal identified by a Mission's
recorded subject (Section 6.2.3) has been
deprovisioned, it SHOULD terminate that Mission with termination
reason revoked. The rule reaches every Mission not yet terminated,
including one a companion profile has suspended, and identifies the
Subject by its recorded iss and sub. Temporary disablement, a
source outage, or an unavailable lookup does not by itself establish
deprovisioning. The departure or disablement of an Approver, an
accountable owner, or a client triggers the rule only when that
principal is the recorded Subject; an organizational Mission records
the organizational principal as its Subject (Section 6.1.4),
so an approving officer's departure does not terminate it under this
rule. A deployment that does not follow this rule documents why; that
exception cannot bypass a continuing dependency the deployment
requires or rewrite the recorded Subject. Termination stops further
issuance (Section 7.1.1) but does not itself recall tokens
already issued; an earlier execution cutoff depends on the
deployment's enforcement mechanism.¶
Revoking a token does not by itself revoke a Mission. Section 2.1 of [RFC7009] lets an authorization server's revocation policy extend a token's revocation to related tokens and the underlying grant; a deployment's revocation policy can likewise treat revoking a Mission's refresh token as revoking the Mission; a deployment that couples token revocation to Mission revocation documents that behavior.¶
Token validity and Mission validity are distinct: a consumer that enforces from the token alone can honor an issued access token until it expires (Section 7.1.3), and one that checks Mission state refuses it when that check reports a non-active state, under the mechanism's freshness rules. A deployment whose consumers rely on Mission state beyond a token's lifetime offers token introspection (Section 9.2) or Mission Status ([I-D.draft-mcguinness-oauth-mission-status]), so they read current state rather than infer it from token validity.¶
This document reuses standard OAuth errors and challenges, selected by parameter ownership and processing stage. The following tables are the normative statement of the base OAuth error for each failure they list. Every rule elsewhere in this document that names one of these codes applies this mapping.¶
An AS that performs an applicable check early, at PAR, responds with the same error class the check would yield at the authorization or token endpoint. Section 2.3 of [RFC9126] permits an authorization-request error at PAR, and returning it there does not change which row applies.¶
Where a token request fails more than one check, this document
defines no general precedence among the resulting errors; as under
[RFC6749], which defines none, the AS returns any applicable one.
The orders this document does state still apply: a submission's
processing order (Section 4.5), and the Mission-governed
refusal, which applies only to an otherwise processable request
(Section 4.3.3). The choice relaxes neither client
authentication nor any rule that limits who receives a detail, such
as mission_error (Section 7.1.2).¶
The tables are grouped by surface. The first table holds each failure whose rule is not confined to the surface of one of the other three tables (PAR and the authorization endpoint, Token Exchange, or a protected resource); each failure appears once. Token Exchange is a token-endpoint operation: a row of the first table that names the token endpoint or a token request covers an exchange, alongside the exchange rows of the third table.¶
| Surface / failing input | Base OAuth error and optional detail |
|---|---|
| PAR, or a companion's token-endpoint submission: a presented evidence entry of an unsupported type, or failing its type's validation or verification (Section 4.4), or a required evidence type absent (Section 4.5) |
invalid_mission_intent_evidence (Section 4.4). Detail: safe error_description
|
Authorization or token request: invalid, unknown, or malformed actual RFC 8707 resource parameter, or a token-endpoint resource outside the Mission's Authority Set (Section 7.3) |
invalid_target (Section 2 of [RFC8707]). Detail: safe error_description
|
Token request: the requested audience is approved for none of the entries the token would carry, the request's authorization_details names an entry not approved for its audience, or the audiences it names are approved for different entries (Section 7.3) |
invalid_target (Section 2 of [RFC8707]). Detail: safe error_description
|
Authorization or token request: the target's scope-projection mapping is unknown, ambiguous, or stale, whether or not the request names a scope value, or the target is scope-only and no safe projection exists for the applicable entries when the request names no scope value (Section 7.7); or the AS has not established a delegated Mission-bound token's audience as a Mission-aware Resource Server that also processes the act chain (Section 9.1.2) |
invalid_target (Section 2 of [RFC8707]). Detail: safe error_description
|
Authorization or token request: an explicitly requested scope value the issuance cannot grant under a scope-projection mapping the AS trusts (Section 7.7) |
invalid_scope (Section 4.1.2.1 of [RFC6749], Section 5.2 of [RFC6749]). Detail: safe error_description
|
| Profile-defined operation that lets a client present a Mission Identifier alongside a credential (Section 6.4.1): the identifier does not match the Mission the credential resolves to |
invalid_grant (Section 5.2 of [RFC6749]). Detail: safe error_description
|
Token endpoint: the Mission is terminated (revoked, expired, superseded, or another termination reason), or in another state that is not active, such as one a companion profile defines |
invalid_request on a Token Exchange (Section 2.2.2 of [RFC8693]), invalid_grant (Section 5.2 of [RFC6749]) on any other grant, or the code a Token Exchange profile assigns (Section 7.1.1). Detail: mission_error (Section 20), or a value the companion profile defines for its state (Section 7.1.2) |
| Token endpoint (Section 5.4, Section 7.4): the requested RAR subset exceeds the Mission's granted authority, or, on refresh, the presented refresh grant |
invalid_authorization_details (Section 6 of [RFC9396]). Detail: safe error_description
|
| Token endpoint (Section 5.4): the comparison cannot establish that a requested RAR entry is a subset (an unrecognized member, an incomparable value) |
invalid_authorization_details (Section 6 of [RFC9396]). Detail: safe error_description
|
| Surface / failing input | Base OAuth error and optional detail |
|---|---|
| PAR: malformed Submission envelope or Intent (schema, unknown member, invalid value), including a structurally invalid evidence entry (Section 4.2.1, Section 4.4) |
invalid_request (Section 5.2 of [RFC6749]). Detail: safe error_description
|
PAR or authorization: malformed or unsupported actual RAR object (an entry of a submitted authorization_details proposal) (Section 4.3.1) |
invalid_authorization_details (Section 5 of [RFC9396]). Detail: RAR-defined detail |
PAR: a proposed entry, valid for its type, whose resource is not among the Intent's target_resources (Section 4.3.1) |
invalid_request (Section 5.2 of [RFC6749]). Detail: safe error_description
|
PAR or authorization request from a client registered as Mission-governed: authorization_details without mission_intent (Section 4.3.3) |
invalid_request (Section 4.1.2.1 of [RFC6749], Section 5.2 of [RFC6749]). Detail: safe error_description
|
| Token request, any grant type: an audience the token would carry, named or inferred, is a Mission-governed resource, and the request has no qualifying Mission binding (Section 4.3.3) |
invalid_target (Section 2 of [RFC8707]). Detail: safe error_description
|
Authorization request: scope includes openid and the Approver is not the Subject (Section 6.1.2.2) |
invalid_scope (Section 4.1.2.1 of [RFC6749]). Detail: safe error_description
|
Authorization decision (Section 6.1.1, Section 6.1.2, Section 5.1, Section 6.1.1.2): the Approver declines, approval authentication fails the floor or a requested acr_values or max_age, a well-formed request (including configured-mapping mode) is refused by AS policy, or the commit finds the effective expiry not later than the creation instant |
access_denied (Section 4.1.2.1 of [RFC6749]). Detail: for a configured-mapping refusal, a safe error_description can say whether no mapping matched or policy narrowed the candidates to nothing; for an expiry at the commit, a safe error_description can say that the requested expiry has passed; otherwise none unless a defined extension applies |
| Surface / failing input | Base OAuth error and optional detail |
|---|---|
Token exchange: a subject_token or actor_token that is invalid, whose sender constraint is not proven, or that is unacceptable for the exchange |
invalid_request (Section 2.2.2 of [RFC8693]), unless a Token Exchange profile assigns the failure its own code. Detail: safe error_description
|
| Token exchange: a required DPoP proof that is missing, or a DPoP proof that fails its own validation |
invalid_dpop_proof (Section 5 of [RFC9449]): the failure is not an unproven sender constraint, so the row above does not apply. Detail: safe error_description
|
| Token exchange: a DPoP proof lacking the current DPoP nonce, where the authorization server requires one |
use_dpop_nonce with a DPoP-Nonce header (Section 8 of [RFC9449]), not invalid_dpop_proof. Detail: safe error_description
|
| Token exchange with no actor (Section 7.5): the authenticated client is not the Mission's approved agent |
invalid_request (Section 2.2.2 of [RFC8693]). Detail: safe error_description
|
| Token exchange with no actor (Section 7.5) at an AS that does not support self-exchange |
unsupported_grant_type (Section 5.2 of [RFC6749]) if the AS does not support the Token Exchange grant type; otherwise invalid_request (Section 2.2.2 of [RFC8693]) |
| Delegated token exchange (Section 8.2): the AS does not authenticate the requesting client by a method it relies on to identify the client, which no public client meets |
invalid_client (Section 5.2 of [RFC6749]). Detail: safe error_description
|
Delegated token exchange (Section 8.2): the AS has authenticated the requesting client, and the request carries an actor_token
|
invalid_request (Section 2.2.2 of [RFC8693]). Detail: safe error_description
|
Delegated token exchange (Section 8.2): the subject_token is not a designation this AS issued naming the authenticated requesting client |
invalid_request (Section 2.2.2 of [RFC8693]). Detail: safe error_description
|
| Designation (Section 8.1): the AS cannot establish that no resource server accepts the named client's identifier as an audience for its access tokens, including an alias it never issues |
invalid_target (Section 2.2.2 of [RFC8693]). Detail: safe error_description
|
| Delegated token exchange (Section 8.4): narrowing leaves no entries for the delegate |
invalid_target (Section 2.2.2 of [RFC8693]). Detail: safe error_description
|
| Token exchange using Section 8.3: required Client Attestation fails validation |
invalid_client_attestation. Detail: no instance-identity disclosure |
| Token exchange using Section 8.3: required instance-to-delegate or output-key association cannot be established |
invalid_request (Section 2.2.2 of [RFC8693]). Detail: no instance-identity disclosure |
| Surface / failing input | Base OAuth error and optional detail |
|---|---|
Protected resource: a token lacking the mission claim, where the resource requires it (Section 9.1) |
invalid_token (Section 3.1 of [RFC6750]). Detail: none |
| Protected resource: weak or stale authentication of the token's Subject, where the deployment conveys it (Section 9.1) |
insufficient_user_authentication (Section 3 of [RFC9470]). Detail: acr_values or max_age
|
| Protected resource: DPoP proof missing, invalid, or mismatched (Section 9.1) |
DPoP invalid_token challenge (Section 7.1 of [RFC9449]). Detail: none |
| Protected resource: DPoP nonce required, missing, or stale (Section 9.1.4) |
DPoP use_dpop_nonce challenge (Section 9 of [RFC9449]). Detail: fresh nonce |
| Protected resource: certificate-bound token's presented certificate mismatch (Section 9.1) | Bearer invalid_token challenge (Section 3.1 of [RFC6750], per Section 3 of [RFC8705]). Detail: none |
| Protected resource: an opaque Mission-bound token that its introspection response or issuer-local resolution reports inactive (Section 9.2.4) |
invalid_token (Section 3.1 of [RFC6750]), in the DPoP scheme for a DPoP-bound token (Section 7.1 of [RFC9449]). Detail: none |
| Protected resource: introspection or issuer-local resolution of an opaque Mission-bound token cannot be completed (Section 9.2.4) | No error code reporting the token invalid: HTTP 503 (Section 15.6.4 of [RFC9110]), with Retry-After where a retry time is meaningful. Detail: none |
| Protected resource: insufficient carried authority, or an unenforceable constraint (Section 9.1.4) |
insufficient_scope (Section 3.1 of [RFC6750]) or the RAR-remediation challenge (Section 9.1.5). Detail: mission_denial (Section 9.1), minimized |
In these tables, invalid_client_attestation is the error code that
Section 5.2 of [I-D.draft-mcguinness-oauth-client-instance-id]
specifies.¶
This document defines the following authorization server metadata parameter [RFC8414]:¶
mission_bound_authorization_supported:OPTIONAL boolean. When true, the AS supports the core Mission
Issuer surfaces of this document (Section 15): the
mission_intent authorization request parameter through PAR
(Section 4), Authority Set derivation yielding
authorization_details entries of its supported types
(Section 5,
Section 5.5), Mission-bound access tokens
(Section 7), and the mission JWT claim
(Section 7.8). It asserts Mission Issuer support only; it
makes no claim about any resource server or about the optional
capabilities, whose discovery is described below. If omitted, the
default value is false.¶
A deployment can instead arrange Mission-bound authorization,
including its supported types and schemas, out of band. A client
holding a Mission Intent MUST NOT submit the same authority as bare
scope or authorization_details to an AS whose Mission support is
neither advertised nor otherwise established; it surfaces the
inability instead (Section 17.1.2).¶
A client performing a task under a Mission MUST NOT present, for that task, a credential that is not Mission-bound, such as an ordinary access token it already holds, unless a deployment-defined, trusted enforcement path establishes that Mission for the request and applies the Mission's authority and lifecycle controls to it. Neither a Mission Identifier the client supplies nor documentation alone establishes the Mission for a request, and the path confers no authority beyond the Mission's. The rule does not restrict the client's workflows unrelated to the Mission (Section 17.1.2).¶
An AS that advertises support for this document MUST include at least
one AS-supported type in its authorization_details_types_supported
metadata ([RFC9396]). Where mission_resource_access is among them,
the Mission Resource Access Profile
([I-D.draft-mcguinness-oauth-mission-resource-access]), not
out-of-band documentation, is that type's normative definition.¶
An AS that advertises mission_bound_authorization_supported: true
MUST also publish pushed_authorization_request_endpoint
([RFC9126]), since the authorization-code path accepts a Mission
Intent only through PAR (Section 4.2.2).¶
An AS that advertises mission_bound_authorization_supported: true
SHOULD also advertise authorization_details_types_metadata_endpoint
[I-D.draft-ietf-oauth-rar-metadata-remediation] where it implements
that endpoint. Implementing that endpoint is optional, and the rules
below bind only an AS that advertises it:¶
its response's key set is the source of truth for which types the AS supports;¶
authorization_details_types_supported mirrors those keys and MUST NOT list a type absent from them; and¶
the AS MUST publish, within that response, an entry for every supported type whose schema validates that type's documented object shape.¶
The optional capabilities are discovered first through existing OAuth
metadata ([RFC8414]): introspection_endpoint for introspection,
and grant_types_supported containing
urn:ietf:params:oauth:grant-type:token-exchange for self-exchange,
for delegation, and for the companion's cross-domain grant issuance.
Advertising that grant type does not by itself establish support for
every exchange variant, such as self-exchange or delegation. Absent such
a signal, a capability is discovered out of band or by
attempt: a Token Exchange, a cross-domain grant issuance, or an
introspection request fails if the issuer does not support it.¶
This document defines the following protected resource metadata parameter [RFC9728]:¶
mission_bound_authorization_required:OPTIONAL boolean. When true, the protected resource accepts only
Mission-bound tokens: a token that lacks the mission claim
(Section 7.8) is rejected (Section 9.1). If omitted, the
default value is false. An AS that has authenticated this metadata
treats a true value as making the resource Mission-governed
(Section 4.3.3); false or omission does not clear a
deployment's classification.¶
A type-defined authorization_details member may define its own
constraint-discovery surface.¶
A protected resource can list the authorization_details types it
accepts in the authorization_details_types_supported parameter
(Section 2 of [RFC9728]), so a client can propose entries of a
type its target accepts.¶
Other specifications can extend this document. Extensions build alongside the stable interface below; they MUST NOT redefine it. The following remain stable across revisions of this document:¶
the mission claim members id and issuer (Section 7.8);¶
the authorization_details carriage and its type-agnostic subset
discipline (Section 5.5, Section 5.4); and¶
the act delegation chain (Section 8.2).¶
Each extension point states what its specification supplies and what an AS without the extension does. The requirements of Section 14.3 and Section 14.4 bind a specification that uses them and each party that implements it.¶
This document's extension points are:¶
Authority types. The Authority Set is open to any AS-supported
authorization_details type (Section 5.5); the Mission
apparatus (commitment, gating, delegation) is type-agnostic, subject
to the delegation and projection limits in Section 5.5, and an
entry of a type the AS does not support is refused
(Section 4.3.1). A type's
specification supplies what the apparatus relies on for its entries:¶
the definition a proposed entry is validated against, alongside any schema advertised for the type or established out of band (Section 4.5);¶
the enforcement semantics a resource server applies to an entry (Section 9.1.1);¶
the subset relation, which the AS applies only where it declares
narrowing for the type; otherwise an entry is carried as approved
(Section 5.4, Section 5.5.1);¶
the delegation policy, which the AS applies only where it declares
delegation; an entry with no type-defined policy is non-delegable
(Section 8.4);¶
when a scope-projection mapping is safe for the type's entries,
which the AS relies on only where it declares projection
(Section 7.7); and¶
any normalization a comparison of its members uses; without one, URI-valued members compare byte for byte (Section 6.3.2).¶
Intent Submission Evidence types. The evidence array of the
Submission envelope is open to evidence types defined by companion
profiles: each type is a collision-resistant name whose owning
specification defines the entry's closed schema, verification, and
verified output facts
([I-D.draft-mcguinness-oauth-mission-submission-evidence]), and
an AS refuses an entry of a type it does not support rather than
ignoring it. A verified entry is policy input, never authority
(Section 4.4).¶
Mission Intent members. The Mission Intent's top level (Section 4) is open to members a companion profile defines, under a short name it registers in the Mission Intent Members registry (Section 20.9) before use, or under a collision-resistant name. The owning specification defines, produces, and enforces each such member, and a recognized member never grants or widens authority beyond what that specification states. Closed-top-level validation (Section 4.2.1) refuses any top-level member that neither this document nor an implemented companion profile defines, and the AS ignores none it recognizes. Registration settles which specification owns a short name, not whether an AS implements, recognizes, or trusts any member.¶
Integrity anchors. Additional committed objects use the same
domain-separated, issuer-bound envelope with a new typ
(Section 6.3.1, Section 14.4). A profile that
commits an evidence or disclosure object MUST commit it with this
envelope and a typ that meets Section 6.3.1 and
Section 14.4, not by
hashing the bare object, so the domain separation and issuer binding
hold uniformly. A mission descriptor embedded in such an object
uses the mission claim shape (Section 7.8), optionally
extended with collision-resistantly named members, and is never
authority-bearing on its own. An AS without such a profile produces
and verifies none of its commitments.¶
The mission claim. It is an open object: additional,
collision-resistantly named members can be carried in it, under the
consumer rules of Section 7.8.¶
Mission Record members. The Mission Record is open to additional members set at creation, under short names a companion profile coordinates with this document or under collision-resistant names, as Section 6.2 states.¶
Lifecycle state and termination reason. The lifecycle state
space (Section 10) is open to additional states that companion
profiles register in the Mission Lifecycle States registry
(Section 20.7) for lifecycles they introduce. The
termination reasons (Section 10.1) are likewise open to reasons
that companion profiles register in the Mission Termination Reasons
registry (Section 20.8). Under the
forward-compatibility rule of Section 10, only active permits
issuance. A companion interface changing Mission state leaves
Section 10.2 in force; a terminated Mission stays terminal.¶
Approval bases. The approval_basis.type value space
(Section 6.2.3) is open to standing-consent bases
that companion profiles define under Section 14.3.¶
Approval-event sequencing. The approval-event steps, their
order, and the atomicity of record creation with the approval decision
are fixed by Section 6.1.1; the coupling of that
decision to authorization-code issuance belongs to the direct flow.
A companion profile MAY relocate the approval event relative to code
issuance (for example, deferring the decision beyond the
authorization response, as
[I-D.draft-mcguinness-oauth-mission-approval] does), and a
back-channel carriage profile
(Section 4.2.3) MAY instead couple the approval
decision to establishing the Mission grant binding and activating for
redemption a grant the profile defines, the Mission then binding to
that profile-defined reusable grant (Section 6.4.1),
provided in either case the steps and their atomicity with the
approval decision hold unchanged and no Mission reference exists
before the record is active.¶
Grants and issuance paths. A companion profile can define a
further grant lineage or a profile-defined grant. Its
specification states when the AS establishes the binding and how it
resolves the Mission, and every derivation through the grant passes
Section 7.1 (Section 6.4.1). Neither a
returned access token nor a per-request runtime join is a grant
lineage (Section 6.4). Without such a profile, the AS
resolves a Mission only from the authorization-code lineage and a
Mission-bound subject_token.¶
This document defines no capability-negotiation mechanism or profile-version field; an extension declares its own identifiers and, where it needs discovery, its own metadata. Section 14.2 states the general rule these extension points follow.¶
This document's extensible namespaces follow one of three postures:¶
Registry-backed. A namespace whose values determine fail-closed behavior and span multiple documents is backed by an IANA registry. This document creates the Mission Lifecycle States (Section 20.7), Mission Termination Reasons (Section 20.8), and Mission Intent Members (Section 20.9) registries and seeds each with the values it defines; every further document that defines a value requests that value's registration, carrying any Internet-Draft reference as a publication dependency under the registry's policy.¶
Specification-defined. A namespace with a defined fail-safe for
unknown values and no registry, such as the mission claim members
(Section 7.8), the Mission Record members (Section 6.2)
and the approval_basis.type values (Section 6.2.3),
is specification-defined: the defining documents are its value space.¶
Collision-resistant. Deployment-defined names are collision-resistant names (Section 4.2 of [RFC7519]) and are never registered.¶
A typ inside a JCS commitment envelope (Section 6.3.1) names
a hash domain, not a representation crossing a protocol boundary, and
is not a media type.¶
The direct path of Section 6 is the one this document defines in full. A companion profile creates Missions on another path in one of two ways, which stay distinct:¶
Relocating the direct ceremony. A profile that defers the
approval decision, or carries the submission over a back channel,
keeps the direct approval: the basis stays direct, and
Approval-event sequencing (Section 14.1) states what the
relocation keeps unchanged.¶
Activating under standing consent. A profile can define a named
standing-consent basis, under which a template or policy activates
Mission instances against an accountable human's earlier approval,
with no fresh human approval per instance; each instance is still
created at its own approval event (Section 6.1). A companion
profile that defines a standing-consent basis MUST specify its
approval_basis.type value and its activation semantics: what
activates an instance, and the shape of the instance's activation.
An issuer that activates a Mission under such a basis MUST record the
instance's activation, activation_actor, root_commitment, and
approved_at, as Section 6.2.3 defines them for a
standing-consent basis. Neither requirement binds a deployment that
creates Missions only on the direct path. The basis's
approval_basis.type values form a specification-defined namespace
with no registry (Section 14.2).¶
When a human approves a standing consent's consented root (the template version, the ceiling, or the activation policy), the issuer that records that approval MUST:¶
authenticate the consenting principal (step 1 of Section 6.1.1);¶
establish that principal's authorization over the root's permitted Subjects and authority sources (steps 2 and 3);¶
obtain that principal's consent to the root's authority, its limits, and its activation policy (step 5); and¶
record that principal as the consent_principal of every instance
the root activates.¶
A future instance's Subject need not be known when the root is approved; each instance falls within what the root authorized. An already approved parent's delegation authority can supply the root, with no fresh human ceremony for each activation.¶
Each instance's creation still meets the rules of this document that bind it: the Subject is never taken from unauthenticated client input and is mapped injectively (step 2, Section 6.1.3); the authority source and its ceiling (Section 6.1.4); the effective expiry and its creation-commit check (steps 4 and 7); the integrity anchors (step 6); and atomic creation, deduplicated as Section 16.1 states.¶
An unrecognized type or adjudication.kind is handled as
Section 6.2.3 states for every record consumer.¶
The companion profiles that define standing-consent bases for this document adopt the Approval Basis Contract of [I-D.draft-mcguinness-mission-approval-governance]; a profile defined elsewhere can meet this section's requirements by another mechanism.¶
This document's default prefixed construction commits to bytes in three forms, called species, and a specification defining a prefixed commitment classifies it as one of them:¶
Envelope anchor: the domain-separated, issuer-bound envelope of
Section 6.3.1 (intent_hash, proposal_hash,
authority_hash, and commitments produced with companion-defined
typ values).¶
Canonical-object digest: sha-256: over the JCS serialization
of a normalized JSON object without the envelope, where protocol
context already fixes what is committed.¶
Raw-octet digest: sha-256: over an exact,
specification-defined octet sequence, with no canonicalization: a
whole artifact as exchanged, or the UTF-8 encoding of a defined
scalar value.¶
The prefix and agility rules of Section 6.3.3 bind all three
species. Its I-JSON rule binds the two JSON species. The envelope and
typ discipline of Section 6.3.1, with the typ naming rule
below, binds envelope anchors alone. The rules of Section 6.3.3 bind a prefixed digest of any
species when its defining specification classifies it under this
taxonomy and imports this section normatively; this document so
classifies every anchor it defines.¶
This document's anchors and digest rules (Section 6.3.1, Section 6.3.3), with this taxonomy, instantiate the default commitment construction of [I-D.draft-mcguinness-mission-substrate]. A commitment outside this construction (a native content address, a member-named digest whose member name fixes the algorithm) is permitted; its defining specification states its own algorithm identification and agility behavior.¶
This document defines no registry of typ values; each committing
specification defines its own and relies on the typ domain
separation. To keep that domain separation safe without a registry, a
new typ value MUST be a collision-resistant name (for example, a
short name prefixed within a namespace the defining profile controls,
following the Collision-Resistant Name guidance of
Section 2 of [RFC7519]). Values with the mission- prefix, used by
this document and the profiles that extend it, form a namespace
coordinated through this document's change controller.¶
This document defines no transition mechanism: every commitment a current carrier defines is a single prefixed string, and no carrier defines a location for a second one. A specification that introduces a new prefix MUST define:¶
the carrier and schema of any parallel commitment;¶
the binding that proves the old and new values commit to the same object;¶
producer behavior during the transition;¶
verifier selection and downgrade behavior when recognition sets differ; and¶
the transition procedure itself.¶
Such a specification MUST NOT change a commitment already made,
including the implied value of an anchor a Mission Record omits,
which stays the sha-256 construction of Section 6.3.1.¶
This document also defines the Authority Set entry commitment, the
envelope of Section 6.3.1 with typ
mission-authority-entry, iss the Mission issuer, and value a
single Authority Set entry object exactly as recorded
(Appendix D). A companion that cites an
entry by digest (a decision record naming the entry it evaluated,
containment or completion state keyed to an entry) computes it this
way.¶
Entries whose canonical commitment envelopes are identical produce the same digest, and within one Mission Record every recorded entry resolving to the same digest forms one selector equivalence class; the class is defined by the canonical bytes, not by pre-canonical source text the record does not preserve.¶
The commitment is not a globally unique entry identifier: the
envelope binds the issuer, not the Mission, so a protocol that uses
it to select or cite an entry MUST bind it to the Mission issuer
and Mission Identifier whose recorded Authority Set is searched,
directly or through an enclosing object whose integrity protection
binds them.¶
The smallest useful conforming deployment is a Mission Issuer that:¶
derives in narrowing mode from the client's authority proposal (Section 5);¶
supports one AS-supported authorization_details type and emits
only that type's specification-defined vocabulary; and¶
implements none of the optional capabilities.¶
A Mission Issuer can instead start from configured-mapping mode (Section 5), which is equally conforming. Neither starting point is a conformance class, and neither removes a surface: the Mission Issuer still implements every surface its role lists (Section 15.1), the evidence dispatch and refusal rules included even when it supports no evidence type.¶
An implementation conforms in one of three roles.¶
A Mission Issuer (the authorization server) implements the core issuance surfaces:¶
submission of a Mission Intent, in the Submission envelope, via PAR (Section 4.2), with the Intent Submission Evidence dispatch and refusal rules (Section 4.4);¶
Authority Set derivation yielding authorization_details entries
of its supported types (Section 5,
Section 5.5);¶
the approval event with its integrity anchors and its recorded
approval_basis and authority_source (Section 6.1,
Section 6.2);¶
issuance of Mission-bound access tokens carrying the mission claim
(Section 7), as the RFC 9068 JWT or as an opaque
reference token under the introspected consumption mode
(Section 9.2.4);¶
the subset rule (Section 5.4);¶
gating of issuance on Mission state (Section 7.1); and¶
acceptance of a revocation by mission_id through an authenticated
means independent of possession of any token (Section 10.2).¶
An AS can conform as a Mission Issuer without supporting any Intent
Submission Evidence type. Such an AS refuses every presented entry
under the dispatch and refusal rules (Section 4.4):
a structurally invalid entry with the invalid_request error code, and
any other entry, as an unsupported type, with the
invalid_mission_intent_evidence error code.¶
A Mission-aware Resource Server implements resource server enforcement (Section 9.1). It enforces a JWT from the token's own claims, needing no Mission-state store and no call to the AS. Under the introspected consumption mode, it instead enforces the token from the token-specific inputs of its active introspection response or issuer-local resolution (Section 9.2.4).¶
In either form, it enforces each applicable entry its tokens carry under that entry's type, work a plain [RFC9068] resource server does not do. Conformance in this role implies support for no particular type: an entry of a type the resource server does not implement provides no authority there (Section 9.1.1), so interoperable enforcement needs a type that both the AS and the resource server implement.¶
A Mission Client implements the client surfaces:¶
submission of the Mission Intent via PAR on the authorization-code
path (Section 4.2), proposing concrete authority, where it
does, on the authorization_details parameter pushed alongside
mission_intent (Section 4.3);¶
reading its granted authority from the token-response
authorization_details echo, and assuming none absent from it
(Section 7.3); and¶
obtaining mission_id from the mission_id token-response parameter
(Section 7.3.1), never from the access token,
treating it as a reference, not a credential.¶
Beyond these mandatory roles, an implementation can additionally claim four OPTIONAL capabilities. Each is independent, and an implementation that supports none of them is still conformant:¶
Delegation (Section 8): issuing designations
(Section 8.1) and the derived tokens that carry the act
delegation chain, and consuming those tokens. Only a
sender-constrained token can be designated, so Delegation requires
sender-constrained non-delegated Mission-bound access tokens.¶
Self-Exchange (Section 7.5): narrowing an agent's own Mission-bound token by a Token Exchange that names no actor. Supporting Delegation does not require Self-Exchange, and supporting Self-Exchange does not require Delegation.¶
Introspection (Section 9.2): reporting Mission state through
the mission token introspection response member. Required where
the AS issues opaque Mission-bound tokens to a resource server that
does not use issuer-local resolution (Section 9.2.4).
Issuer-local resolution does not by itself support a claim of this
capability.¶
Cross-Domain: projecting a Mission so it is honored by an authorization server in another trust domain. An implementation claiming this capability preserves, across the hop:¶
the Mission reference (mission.id, mission.issuer) and the
authority_hash the projection carries, intact;¶
authority that only narrows (Section 5.4);¶
projection performed only by, or under the authorization of, the
Mission issuer, gated on the Mission's active state
(Section 10, Section 7.1);¶
projected credential lifetimes capped by the Mission's
expires_at (Section 7.6);¶
projected credentials sender-constrained to their presenter (Section 7.2), never bearer credentials, each recipient verifying the proof of possession and refusing a credential whose binding is absent or invalid (Section 9.1); and¶
renewal only through the Mission issuer: a projected grant is
redeemable once, and the other trust domain issues no renewal
authority on it, so a further credential there needs a new
projection.¶
This bar is self-contained in this document. The companion Mission Cross-Domain Projection profile ([I-D.draft-mcguinness-oauth-mission-cross-domain]) specifies the interoperable mechanism that satisfies it.¶
A conforming implementation names the optional capabilities it supports (for example, "Mission Issuer with Delegation and Cross-Domain"); each capability's defining section or document states its detailed requirements.¶
Emitting the mission claim is not, by itself, conformance: the claim
is reserved for conforming issuance (Section 7.8.1).
Conformance as a Mission Issuer requires the gates:
authority derived from the approved Intent and committed by the
anchors (Section 6.1), issuance bounded by the subset rule
(Section 5.4), and derivation gated on Mission state
(Section 7.1). An implementation that carries Mission metadata
without these gates conforms to no role in this document and does not
implement it: in particular, it MUST NOT advertise
mission_bound_authorization_supported as true (Section 12),
the machine-checkable form of that claim.¶
The Mission Binding Properties vector of
[I-D.draft-mcguinness-mission-architecture] names what these gates
supply as its credential-mission-bound property, informatively;
these gates remain authoritative for conformance to this document
regardless.¶
This document makes no Mission Substrate conformance claim and takes no requirement from the substrate contract ([I-D.draft-mcguinness-mission-substrate]), which is informative.¶
This section states two requirements, approval idempotency and the retention of the Mission Record, and how an issuer locates a Mission's grant bindings.¶
The record's approval_event_id (Section 6.2.4) is
the approval idempotency key: a retried or duplicate delivery of the
same approval decision (a replayed callback, a double-submitted
consent form, a retried standing-consent activation) MUST NOT create
a second Mission, and the AS deduplicates on this identifier. Each
creation path answers such a delivery in its own way, with the
committed Mission, a denial or a credential delivery; none creates a
second Mission.¶
The AS MUST allocate approval_event_id, unique among its Missions,
and MUST NOT derive it from a value that a client supplies and can
reuse. At a direct approval event the AS MUST allocate it before the
decision commits and bind it to the authorization interaction, never
to a request_uri or another client-supplied value. The identifier
is immutable and is retained with the record (Section 16.2).¶
Each decision is bound to the interaction, deferral or activation that it decides, which has its own lifetime. A delivery of the decision after that lifetime MUST NOT create a Mission, and the AS MUST retain the identifier for at least that lifetime, so a retired record never turns an old delivery into fresh authorization.¶
Some creation paths recognize a retry by a request key that the
client supplies. The profile defining such a key MUST state its
retention contract: when the retry horizon starts and ends; that a
reservation whose operation is still pending when the horizon ends
is retained until that operation ends; that a published horizon is
never shortened for a key already recorded; and that a reuse of the
key after its reservation has expired under that contract, never
while its operation is pending, is a new operation, which meets
every check a new request meets, including authorization, policy,
ceiling, expiry and accounting, and receives a new
approval_event_id. Expiry of a key never lets an earlier decision
create another Mission.¶
The audit horizon is the deployment-declared retention window for
the Mission Record and its evidence: at least the Mission's lifetime
plus a declared post-expiry period. A deployment retains a
terminated Mission's record for its audit horizon.¶
An issuer that needs to cascade a lifecycle operation, or to enumerate a Mission's bound grant lineages and credentials, maintains its own issuer-side index from the Mission to each binding.¶
The security considerations of OAuth 2.0 (Section 10 of [RFC6749]), the OAuth 2.0 Security Best Current Practice [RFC9700], Rich Authorization Requests (Section 12 of [RFC9396]), Pushed Authorization Requests (Section 7 of [RFC9126]), and JWT access tokens (Section 5 of [RFC9068]) apply to this document. Those of Token Exchange (Section 5 of [RFC8693]) apply to delegation, and those of DPoP (Section 11 of [RFC9449]) and mutual TLS (Section 7 of [RFC8705]) apply where a token is sender-constrained.¶
The security goal of this document is that a user's approval of a task
bounds every token derived for it. The Mission's authority_hash
commits the exact Authority Set the Approver consented to
(Section 6.2). The goal rests on the AS deriving
only subsets of that set and signing every token accordingly, and on
the resource server verifying the AS's token signature and enforcing
the carried authority, not on every token carrying the commitment
(Section 7.8).¶
A derived token can carry a narrowed subset, so a resource server
cannot in general recompute authority_hash from the token, and the
hash supplies no subset proof. A resource server that does not verify
against the complete set relies on the signed token as the AS's
assertion that the carried authority was correctly projected
(Section 9.1).¶
A deployment that needs assurance independent of the token signature verifies the carried authority against the complete approved set. What that verification provides depends on when the issuer is compromised.¶
Retrieving the complete set under the same trust root as the token adds nothing against an issuer malicious at approval time: that issuer can approve and commit arbitrary authority, and no containment mechanism changes that. The same checks do defend against projection implementation errors, against corruption of the record after an independently anchored approval commitment, and against post-approval signing-key compromise where the original commitment is pinned outside the issuer.¶
The intent_hash anchor extends the same protection to the task: it
commits the approved Mission Intent, so an auditor holding a value
captured at approval can detect a later alteration of the recorded
task. No anchor substitutes for another.¶
Recording an anchor is optional (Section 6.2.2). A
recorded anchor lets a verifier detect a later change to the
retained intent, authority_set, or proposed_authority against
the record itself, which detects only partial corruption: whoever can
change the record can change both. An omitted anchor gives up that
check, and detection rests on a value captured outside the record
before the change, such as a pinned commitment, a signed carrier, or
an audit record. Recomputing both sides from the changed record
detects nothing.
The authority_hash anchor is computed over the Authority Set alone
(Section 6.3.1), what a resource server enforces and a
cross-domain projection carries, so it can be checked without the
Intent.
The intent_hash anchor stays tamper-evident audit material even
where the authority is projected without the Intent.¶
The anchors do not commit the rendered consent disclosure: none binds the locale, disclosure-template version, or material notices the Approver was shown. A buggy or malicious rendering layer could therefore show a narrower or different task than the committed Authority Set without a committed trace.¶
The approval event commits the Mission Intent and Authority Set the AS records as approved. Those commitments establish neither that the AS rendered them faithfully nor that the Approver understood them. Step 5 of Section 6.1.1 requires human-meaningful rendering; comprehension cannot be inferred from an approval or its integrity anchors.¶
A deployment whose Missions carry high-risk authority can retain presentation-level audit evidence from which the disclosure shown can be reconstructed and audited, such as a commitment over a structured consent-disclosure object (Section 14). Such a commitment binds the structured disclosure the AS records, not the presentation itself; it narrows this gap for audit but does not close it.¶
The anchors do not commit the approval basis either: who consented,
who activated the Mission, and under which basis (Section 6.2).
The record's immutability protects it, and only the AS enforces that.
A deployment that needs the approval basis checkable outside the AS can
commit it under a profile's own anchor typ (Section 6.3.1,
Section 14) in a signed or externally registered artifact.¶
A token bearing equivalent authorization_details but no mission
claim is governed by no Mission state, revocation, or consent
commitment. Section 4.3.3, Section 12, and
Section 9.1 address this downgrade at issuance, at the client,
and at enforcement.¶
A held ordinary credential needs no request to the AS, and neither an AS nor a resource server can generally tell that a request made with one serves a Mission. An unmediated ordinary workflow at a resource that is not Mission-governed therefore remains a residual that only the client's own conformance closes; the Mission Security Model ([I-D.draft-mcguinness-mission-security-model]) analyzes that path and where mediation closes it.¶
The integrity of the mission_bound_authorization_supported
(Section 12) and mission_bound_authorization_required
(Section 13) metadata rests on the retrieval
protections of [RFC8414] and [RFC9728], whose security
considerations apply.¶
The AS is trusted to derive authority no broader than the Mission
Intent. Both Authority Set derivation modes
(Section 5), a proposal narrowed to policy and a
configured mapping, are mechanical rather than free-form inference.
Where recorded, policy_version makes each Authority Set derivation
auditable by naming the policy it ran under.¶
This document assumes that an agent reading attacker-influenceable
content can be prompt-injected. Authority is fixed at the approval
event, so injected text cannot expand an approved Mission. The
purpose member supplies candidate authority only as a lookup key of
the pre-approval Authority Set derivation whose result the Approver
reads and consents to, and otherwise can only refuse or tighten;
goal and task_bounds bound it only through that disclosure
(Section 4, Section 5).¶
Within an approved Authority Set, an injected agent can still read what the Mission permits and write to a sink the Mission permits: a Mission governs actions, not the content that flows within an authorized action. The Mission Security Model ([I-D.draft-mcguinness-mission-security-model]) analyzes that residual; constraining it is the runtime layer's role (Section 17.3.1), and even there it is bounded, not closed: preventing misuse of data within the authorized scope needs an information-flow layer this document does not define.¶
Issuance gating bounds escalation by token acquisition (Section 7.1, Section 5.4), and the same bound holds for information: an agent can inherit another agent's knowledge, but not its authority. A work product of one Mission is input, not authority, to an agent under another Mission, which acts on it only under its own Authority Set. Independent Missions communicating through shared state can still compose individually acceptable actions into behavior no single Mission authorized; the Mission Security Model ([I-D.draft-mcguinness-mission-security-model]) analyzes that coordination.¶
This document governs Authority Set derivation and the issuance of authority: it bounds what authority a Mission yields, binds it to the Approver's consent, and gates every issuance on Mission state. It does not evaluate individual runtime actions. In particular, it does not:¶
evaluate a request's parameters against the Mission at the point of use;¶
produce runtime enforcement evidence for each consequential action;¶
bind tool or function identities to the Mission; or¶
re-evaluate at execution time to close the approval-to-execution (time-of-check to time-of-use) gap.¶
Within a token's lifetime, an active Mission can therefore become ambient authority for individual consequential actions. Short token lifetimes and narrow authority bound this exposure but do not eliminate it.¶
A deployment can use Missions for issuance alone. A runtime layer ([I-D.draft-mcguinness-mission-runtime]), out of scope for this document, evaluates each consequential action against the Mission, with parameter binding, and records evidence for the actions it covers. A deployment adds one for an action class that needs any of the following, which issuance-time bounds alone do not provide:¶
per-action evaluation or evidence;¶
approval bound to a single action; or¶
a bound the receiving resource server cannot enforce.¶
Where the resource server or a composing runtime layer matches an
operation target against a prefix entry, the Resource Boundary
Canonicalization analysis of the Mission Resource Access Profile
([I-D.draft-mcguinness-oauth-mission-resource-access]) gives the
single-normalization rule for that match, for a deployment that
supports that type.¶
Short-lived access tokens are this document's issuance-only recommendation: with no runtime layer, token lifetime is the revocation-latency bound at unmodified resource servers. Where a runtime layer covers the high-consequence classes with an active freshness source, the point-of-use decision is the revocation cutoff, and lifetimes can be sized by action class without losing that cutoff ([I-D.draft-mcguinness-mission-runtime]).¶
An extended lifetime is appropriate only for a token whose carried
entries are all on runtime-gated paths. Classes attach to entries
while exp attaches to the token, so a single ungated entry takes the
extended lifetime as its revocation latency. Narrowed, single-audience
tokens (Section 5.4) keep gated and ungated authority from sharing one
long-lived token.¶
The mission_denial attribute and the [RFC9470]
insufficient_user_authentication challenge (Section 9.1) each
tell a caller which path a denial leads into, and so reveal
authorization shape. An insufficient_user_authentication challenge
confirms to the presenting party that the authority exists and only the
Subject's authentication is weak or stale, while
mission_denial: insufficient_authority denies that the authority
exists.¶
Introspection guards the same class of fact behind caller
authorization (Section 9.2.1), and
Section 9.1 limits the attribute to a token holder that the
deployment permits to learn the distinction. Of the two values,
insufficient_authority reveals least, and omitting the attribute
reveals nothing.¶
Derived tokens are sender-constrained (DPoP [RFC9449] or mTLS [RFC8705]) where Section 7 and Section 8.2 require it. A designation (Section 8.1) carries no confirmation key: like an authorization code issued to a client that authenticates, it is bound to the client that redeems it, which authenticates to do so (Section 8.2), and it authorizes no resource access. A stolen designation is therefore useless without that client's credentials. A stolen token is bounded by the Authority Set and the Mission lifetime regardless, but sender-constraint prevents replay by a different party.¶
Delegation (Section 8) widens the set of parties holding
Mission-derived authority. Because authority only narrows down the
chain, a compromised actor can act only within its narrowed
authorization_details, for the lifetime of the token it holds. The
following limit this exposure:¶
The per-entry delegation constraints (delegability, max_depth, and
allowed_delegates, Section 8.4) bound it at approval
time. The max_depth constraint bounds the length of a delegation
chain, not its breadth: only allowed_delegates bounds fan-out to
many distinct depth-1 delegates.¶
Binding each delegated token to the delegate's own key (Section 8.2) confines a compromised delegate to its own credential.¶
Short derived-token lifetimes (Section 7.1.3), and marking delegable only the entries that need delegation, keep it small.¶
Audience replay into the exchange is a distinct path: a Mission-bound
token obtained by or issued to one party, presented as a
subject_token, could be exchanged for a fresh delegated credential
bound to the presenter. The following gates bound it:¶
the exchange is a derivation gated on Mission state;¶
the AS applies delegation-authorization policy at every exchange (Section 8.4);¶
the result is bound to the authenticated delegate's own key and narrowed by the subset rule; and¶
a no-actor exchange is accepted only from the Mission's approved agent (Section 7.5).¶
Designation (Section 8.1) closes the remaining gap: a delegated exchange accepts only a designation naming the authenticated requesting client, which only the token's holder obtains, by proving possession of the token's key, so a token obtained from an audience is refused there. Sender-constraining a non-delegated Mission-bound access token (Section 7.2) likewise keeps a stolen token from being designated or self-exchanged.¶
Delegation depth (Section 8.4) resets at each cross-domain hop ([I-D.draft-mcguinness-oauth-mission-cross-domain]) and in each Mission created from an existing Mission's authority (Section 6.4.2), so the authority a Mission's descendants can reach can exceed what a single approval appears to bound at consent time. Where that apparent bound must hold in practice, a deployment can impose a global cap out of band; the Mission Security Model ([I-D.draft-mcguinness-mission-security-model]) analyzes the composition.¶
Because this document keeps the ordinary [RFC9068] meaning of the
client_id claim (Appendix C.3), a generic [RFC9068]
resource server, or a logging, SIEM, or audit pipeline, that keys
attribution on client_id attributes a Mission-derived token,
delegated or not, to the correct requesting client. Such a component
cannot see the delegation lineage in the act chain
(Section 8.2) or the Mission's originally-approved agent,
which is recorded in the Mission Record (Section 6.2), not in
client_id.¶
An existing component that authorizes or logs solely from client_id
needs review for this gap before it receives delegated Mission-bound
tokens; Section 9.1 states what a resource server may not infer
or route on client_id.¶
The mission claim and authorization_details are covered by the
AS's signature on the [RFC9068] JWT, so their integrity reduces to
the AS's signing key, whose publication and rotation
Section 7.2 specifies.¶
Verification for audit outlives validity: keeping a key resolvable for the audit horizon (Section 16.2) of every Mission whose tokens it signed lets an auditor verify those tokens later. A companion that anchors a longer-lived artifact to the same keys states its own retention bound.¶
Revocation for a known or suspected compromise is distinct from routine retirement: the issuer publishes the compromised key as revoked, or marks it with a compromise time, rather than only rotating it out.¶
A compromised issuer signing key voids every guarantee the signature carries. Holding issuer signing keys in non-exportable, HSM- or KMS-grade custody with dual-controlled generation reduces that risk.¶
Segmenting keys by artifact class under distinct kid values within
the one jwks_uri lets high-value, low-volume signing (long-lived
evidence and portable artifacts) sit under stricter custody than
high-volume token signing. Verification is kid-indexed, so this needs
no wire change.¶
The privacy considerations of Section 13 of [RFC9396], Section 8 of [RFC9126], and Section 6 of [RFC9068] apply to this document, as do those of Section 5 of [RFC7662] for introspection and Section 6 of [RFC8693] for delegation.¶
A Mission Identifier is a correlation handle. A deployment limits exposure by:¶
giving stable Mission Identifiers only to parties that enforce, audit, or observe that Mission;¶
preferring audience-scoped projections of authority where possible; and¶
minimizing status and introspection disclosures to authorized callers (Section 9.2.1).¶
This document carries a single canonical Mission Identifier on every
derived token. Any party that observes credentials for the
same Mission, whether a resource server, a Resource AS, or an auditor
spanning audiences, can correlate that activity by the Mission
Identifier, and mission.issuer further identifies the issuing AS.¶
That stable anchor lets a resource server, a cross-domain Resource AS, and an auditor bind credentials and evidence to one approved Mission. This document does not provide cross-audience unlinkability (Appendix C.2).¶
Audience-pairwise (or request-pairwise) Mission references, in which the issuer projects a distinct opaque identifier per audience and resolves them server-side, are the fuller mechanism for unlinkability; they work against the stable anchor, and this document does not define them. A deployment that carries the canonical Mission Identifier on the wire accepts this correlation.¶
The carried constraints and a multi-resource Authority Set disclose
the shape of the task and its business bounds (for example, an amount
ceiling) to every holder and every audience of a derived token.
Single-audience tokens, one per resource server, minimize this: each
carries only the entries the consuming resource server needs, as
Section 2.3 of [RFC9700] recommends (Section 7.3).¶
The Mission Record's Intent members (goal, task_bounds) are
personal-data sinks: they carry whatever task description the user
supplied, and their retention and erasure follow Section 18.5.¶
The integrity anchors are unsalted commitments: a party holding a
candidate Intent can confirm it against intent_hash, and a candidate
proposal against proposal_hash. Over low-entropy or guessable content
each anchor is therefore a disclosure channel, and deployments treat it
as one when the Intent itself is sensitive.¶
A task can be about a person who holds no Mission role: in a background check, the employer's agent queries a registrar about a candidate who is neither Subject nor Approver nor resource owner.¶
Mission approval records the accountable Approver's authorization of the undertaking (Section 6.1). It is not, by itself, evidence of such a person's consent to disclosure or of any other legal basis a disclosure requires. Whether a basis is required, and what satisfies it, is deployment and legal policy out of scope for this document.¶
Where the resource domain requires data-subject consent or another basis, that domain's own lane (the resource server, a gateway, a policy decision point, or an authorization server acting for the domain) evaluates it through its own mechanisms, such as claims gathering or a resource-domain consent artifact. That lane refuses access while required evidence is absent or invalid, and Mission authority does not override the refusal.¶
Mission authority is not the data subject's consent either. A Mission
Record can retain a verified consent reference or facts as
submission_evidence (Section 6.2); those facts are provenance
and policy input only, which the resource domain validates
independently under its current disclosure policy.¶
Third-party personal data can enter through any Intent, proposal, authority, or recorded-evidence member:¶
the prose members (goal, task_bounds) and purpose;¶
target_resources and any explicit member a companion profile
defines;¶
any type-owned member of a proposed entry, and the derived Authority Set entries that reach tokens (Section 7); and¶
submission_evidence facts, including a consent reference.¶
Whatever the member, it:¶
persists on the Mission Record for its audit horizon (Section 16.2);¶
concentrates at the AS with the record (Section 18.5); and¶
if committed, is confirmable through the unsalted anchors by any party holding a candidate value (Section 18.3).¶
Referencing a third party through resource-scoped or pseudonymous identifiers, rather than identifying prose, minimizes this exposure. An opaque identifier is minimization, not anonymity, and personal-data obligations follow it.¶
The Mission Record concentrates the task, its authority, and its principals at the AS. Every evidence artifact joins on the Mission Identifier, so the join is a correlation surface equal to the identifier itself.¶
Tokens carry references and authority, not the record: this document
puts no goal, task_bounds, or other Intent content in a credential.
An Intent Submission Evidence artifact can carry personal data (an
originator identity, a consent reference); PAR keeps it off the front
channel, and the record retains the verified facts selected for
recording under the same access governance as the rest of the
Mission's evidence.¶
Access to the record and to Mission evidence is policy-governed and auditable: reading a Mission's evidence is a privileged operation, not a byproduct of holding a Mission reference. Retention and erasure are deployment policy, bounded below by the audit horizon (Section 16.2).¶
Mission Intent prose (goal, task_bounds) is human-readable
disclosure. The goal_lang member (Section 4) declares the
language of that prose as a BCP 47 language tag [RFC5646], so an
approval surface can render, translate, or route it without guessing the
language.¶
Three rules apply to the declaration:¶
goal_lang is a syntactic declaration: the AS checks only its
well-formedness (Section 4), not that the prose is in the
declared language, so the tag is not a verified property of the text.¶
Rendering to the Approver follows the rendering rules of
Section 6.1.5 unchanged: client prose stays inert text in
any language and any script, including bidirectional text. Where the
approval surface presents a translation, the rendered disclosure is
what the deployment's consent evidence records; goal_lang declares
the source's language and is not a record of what was rendered.¶
Authority Set entries carry machine-facing identifiers (URIs, action strings, structured constraints), not prose, and this document adds no language-tagged display fields to them. Localizing how authority is explained is the approval surface's duty under Section 6.1, not a property of the committed set.¶
This document requests registration of the following in the "OAuth Parameters" registry:¶
Parameter name: mission_intent¶
Parameter usage location: authorization request¶
Change controller: IETF¶
Specification document(s): this document, Section 4.2¶
Parameter name: mission_id¶
Parameter usage location: token response¶
Change controller: IETF¶
Specification document(s): this document, Section 7.3.1¶
Parameter name: mission_error¶
Parameter usage location: token response¶
Change controller: IETF¶
Specification document(s): this document, Section 7.1.2¶
Parameter name: mission_expires_at¶
Parameter usage location: token response¶
Change controller: IETF¶
Specification document(s): this document, Section 7.3.1¶
PAR [RFC9126] carries authorization-request parameters without a
distinct usage location, so the pushed submission of mission_intent
needs no separate registration.¶
The mission_error member is carried in the token-endpoint error
response, for which "token response" is the registry's applicable usage
location. It uses the error response's JSON extensibility rather than
defining a new error code.¶
The mission_denial attribute uses the extensible auth-param space of
the WWW-Authenticate scheme ([RFC6750], Section 9.1), for
which no IANA registry exists; no action is required for it.¶
This document requests registration of the following in the "OAuth Extensions Error" registry [RFC6749]:¶
Error name: invalid_mission_intent_evidence¶
Error usage location: authorization code grant error response, token error response¶
Related protocol extension: Intent Submission Evidence (Section 4.4)¶
Change controller: IETF¶
Specification document(s): this document, Section 4.4¶
A code distinct from invalid_request lets a client tell a malformed
submission from missing or untrusted evidence, and remedy each
differently.¶
This document requests registration of the following in the "JSON Web Token Claims" registry:¶
Claim Name: mission¶
Claim Description: Reference to the Mission a token was derived under.¶
Change Controller: IETF¶
Specification Document(s): this document, Section 7.8¶
The mission claim (Section 7.8) references a Mission, the
authorization object this document defines. It is distinct from
AAuth's mission_s256 claim ([I-D.draft-hardt-oauth-aauth-protocol]),
the SHA-256 digest that identifies an AAuth mission, and from the
agent's mission that [I-D.draft-ietf-wimse-aims] names, the purpose
this document translates into authorization. The two claim names do
not collide in that registry.¶
This document requests registration of the following in the "OAuth Token Introspection Response" registry ([RFC7662]):¶
Name: mission¶
Description: The Mission a token was derived under, with its current lifecycle state when returned by the Mission's issuer (Section 9.2).¶
Change Controller: IETF¶
Specification Document(s): this document, Section 9.2¶
This document requests registration of the following in the "OAuth Protected Resource Metadata" registry ([RFC9728]):¶
Metadata Name: mission_bound_authorization_required¶
Metadata Description: Boolean indicating that the protected resource accepts only Mission-bound tokens.¶
Change Controller: IETF¶
Specification Document(s): this document, Section 13¶
IANA is requested to create the "Mission Lifecycle States" registry. The registration policy is Specification Required [RFC8126].¶
A Designated Expert reviews a submission for the discipline Section 10 requires:¶
a Value matching ^[a-z][a-z0-9_]*$ not already registered;¶
a Terminal value of no, consistent with the transitions
the registrant's specification defines (a no state admits a
further transition; terminated is the one terminal state, and a
further way for a Mission to end is a termination reason,
Section 20.8); and¶
a Semantics sentence precise enough to distinguish the state from
every registered state.¶
Whether a Mission in any state is available for reliance is fixed by the governing rule below, never per row.¶
Only the exact value active permits token derivation or continued
reliance; a consumer treats every other value, including one it does
not recognize, as non-active and never widens on it (Section 10).
A Designated Expert MUST reject a registration whose governing
specification attempts to redefine this interaction rather than adding
a new value bound by it.¶
Each registration records:¶
Value: the lifecycle state's string value.¶
Terminal: yes if the state admits no further transition, no
otherwise.¶
Semantics: one sentence stating what the state means and, for a non-terminal state, what a Mission in that state cannot do.¶
Change Controller: IETF, or the registrant for any other registration.¶
Reference: the specification defining the state.¶
This document seeds the registry with the states it defines:¶
| Value | Terminal | Semantics | Change Controller | Reference |
|---|---|---|---|---|
active
|
no | The only state from which tokens are derived. | IETF | this document, Section 10 |
terminated
|
yes | The Mission has ended; its termination gives the reason. |
IETF | this document, Section 10, Section 10.1 |
Each further document that defines a lifecycle state requests that state's registration in its own IANA considerations. A Designated Expert MUST reject a further state registered as terminal: a further way for a Mission to end is a termination reason (Section 20.8).¶
IANA is requested to create the "Mission Termination Reasons" registry. The registration policy is Specification Required [RFC8126].¶
A Designated Expert reviews a submission for:¶
a Value matching ^[a-z][a-z0-9_]*$ not already registered;¶
a Semantics sentence precise enough to distinguish the reason
from every registered reason; and¶
a Members list naming each further termination member the
reason defines (Section 10.1) with its presence (REQUIRED,
CONDITIONAL, or OPTIONAL).¶
A reason never makes a Mission available for reliance: every
terminated Mission is non-active, whatever its reason
(Section 10).¶
Each registration records:¶
Value: the termination reason's string value.¶
Semantics: one sentence stating how the Mission ended.¶
Members: the further termination members, or "none".¶
Change Controller: IETF, or the registrant for any other registration.¶
Reference: the specification defining the reason.¶
This document seeds the registry with the reasons it defines:¶
| Value | Semantics | Members | Change Controller | Reference |
|---|---|---|---|---|
revoked
|
An authorized party revoked the Mission, or the deployment's policy terminated it (Section 10.2). | none | IETF | this document, Section 10.1 |
expired
|
The Mission's expires_at passed; terminated_at equals it. |
none | IETF | this document, Section 10.1 |
Each further document that defines a termination reason requests that reason's registration in its own IANA considerations.¶
IANA is requested to create the "Mission Intent Members" registry. The registration policy is Specification Required [RFC8126].¶
A Designated Expert reviews a submission for:¶
a Name not already registered by a different owning
specification; and¶
a Semantics sentence naming what the member means and which
specification defines its schema, production, and enforcement in
full.¶
The registry resolves ownership of a short top-level name, so that two independently implemented specifications cannot assign it incompatible schemas. Registration defines no member semantics and confers no authority (Section 14). A companion profile can instead use a collision-resistant name without registering it.¶
Each registration records:¶
Name: the member's top-level key in the Mission Intent.¶
Status: stable or experimental. An experimental entry's
owning specification has not completed that specification's own
promotion criteria for the member. A Designated Expert MUST NOT
register a member as stable without confirming that its owning
specification's promotion criteria are met, and MUST NOT treat
registration itself as a promotion event for an experimental
member.¶
Semantics: one sentence stating what the member means and pointing to the section that fully defines it.¶
Change Controller: IETF, or the registrant for any other registration.¶
Reference: the specification defining the member.¶
This document seeds the registry with the members it defines itself:¶
| Name | Status | Semantics | Change Controller | Reference |
|---|---|---|---|---|
goal
|
stable | The Mission's plain-language objective. | IETF | this document, Section 4 |
goal_lang
|
stable | BCP 47 language tag for goal. |
IETF | this document, Section 4 |
target_resources
|
stable | Client-requested derivation ceiling and configured-mapping lookup key. | IETF | this document, Section 4 |
task_bounds
|
stable | Non-machine-readable prose bounds on the task. | IETF | this document, Section 4 |
purpose
|
stable | URI identifying the task's purpose. | IETF | this document, Section 4 |
expires_at
|
stable | Requested Mission expiry ceiling. | IETF | this document, Section 4 |
Each further document that defines a Mission Intent member requests that member's registration in its own IANA considerations.¶
This appendix follows one Mission in a single trust domain through Mission creation, token issuance, resource server enforcement, a refusal, and revocation. It is illustrative and adds no requirements. The OAuth steps follow this document. Identifiers are illustrative; the hash values are computed over the displayed objects (Section 6.3.1).¶
The OAuth flow of Stages 1 to 4, and the revocation in Stage 5, use
only this document and the mission_resource_access type
([I-D.draft-mcguinness-oauth-mission-resource-access]): the
baseline issuance path, with enforcement from the token alone,
bounded by token lifetime.¶
Scenario: agent s6BhdRkqt3, acting for alice
(user_3p2q8mN1a0kV7tR), reconciles Q3 invoices in the home ERP
under Mission msn_8RfX2Lqv9TqMv4z7sA2bN1k0YpEdHc9-.¶
The following example shows the Submission envelope the agent pushes through PAR (Section 4.2), carrying the Mission Intent and no evidence:¶
=============== NOTE: '\' line wrapping per RFC 8792 ===============
{
"intent": {
"goal": "Reconcile Q3 invoices and post adjustments of at most \
USD 500 per journal entry.",
"target_resources": ["https://erp.example.com"],
"task_bounds": [
"Read only invoices issued in 2026-Q3.",
"Post journal entries of at most USD 500 each."
],
"purpose": "urn:example:purpose:reconcile",
"expires_at": "2026-12-31T23:59:59Z"
}
}
¶
In the same push, the agent proposes concrete authority on the
authorization_details parameter (Section 4.3):¶
[
{ "type": "mission_resource_access",
"resource": "https://erp.example.com",
"actions": ["invoices.*"],
"constraints": {
"resource_issued_after": "2026-07-01T00:00:00Z",
"resource_issued_before": "2026-09-30T23:59:59Z"
},
"delegation": {
"max_depth": 2,
"allowed_delegates": [{ "sub_profile": "ai_agent" }]
} },
{ "type": "mission_resource_access",
"resource": "https://erp.example.com",
"actions": ["journal-entries.write"],
"constraints": {
"max_amount": { "amount": "500.00", "currency": "USD" }
} }
]
¶
Both are parameters of one pushed authorization request ([RFC9126]), with PKCE ([RFC7636]); client authentication is omitted, and extra line breaks are for display purposes only:¶
POST /par HTTP/1.1 Host: as.example.com Content-Type: application/x-www-form-urlencoded response_type=code &client_id=s6BhdRkqt3 &redirect_uri=https%3A%2F%2Fagent.example.com%2Fcb &code_challenge=E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM &code_challenge_method=S256 &mission_intent=%7B%22intent%22%3A%7B%22goal%22%3A%22Reconcile... &authorization_details=%5B%7B%22type%22%3A%22mission_resource_acc...¶
The AS returns a request_uri:¶
HTTP/1.1 201 Created
Content-Type: application/json
Cache-Control: no-store
{
"request_uri": "urn:ietf:params:oauth:request_uri:6esc_11ACC5bwc",
"expires_in": 60
}
¶
and the agent sends alice's user agent to the authorization
endpoint with it:¶
GET /authorize?client_id=s6BhdRkqt3&request_uri=urn%3Aietf%3Aparams %3Aoauth%3Arequest_uri%3A6esc_11ACC5bwc HTTP/1.1 Host: as.example.com¶
The AS (as.example.com) validates both, derives this Authority Set
under a declared narrowing capability (each entry a same-type subset
of a proposed entry, Section 4.3.2,
Section 5.5.1), and renders it for alice's
consent:¶
[
{ "type": "mission_resource_access",
"resource": "https://erp.example.com",
"actions": ["invoices.read"],
"constraints": {
"resource_issued_after": "2026-07-01T00:00:00Z",
"resource_issued_before": "2026-09-30T23:59:59Z"
},
"delegation": {
"max_depth": 2,
"allowed_delegates": [{ "sub_profile": "ai_agent" }]
} },
{ "type": "mission_resource_access",
"resource": "https://erp.example.com",
"actions": ["journal-entries.write"],
"constraints": {
"max_amount": { "amount": "500.00", "currency": "USD" }
} }
]
¶
The user alice approves at 08:00:00 UTC on 2026-11-02, and the AS
records Mission msn_8RfX2Lqv9TqMv4z7sA2bN1k0YpEdHc9- in the active
state with authority_hash
sha-256:hjXlwWBY64-RPs1Z-E_gbyklNcViI5c9jiyMbE4KvFM,
intent_hash
sha-256:6T-7s_f-mNW9UpfrrZh3r0HRJmU4My_EsNAf1C1U4r0, and
proposal_hash
sha-256:p-s-EzdNQTn6RoPHXESkwVtGdk8yL1PxryNyMwroKGo.¶
At 08:00:05 the agent redeems the authorization code with its PKCE verifier and a DPoP proof ([RFC9449]):¶
POST /token HTTP/1.1 Host: as.example.com Content-Type: application/x-www-form-urlencoded DPoP: eyJ0eXAiOiJkcG9wK2p3dCIsImFsZyI6IkVTMjU2Iiwi... grant_type=authorization_code &code=SplxlOBeZQQYbYS6WxSbIA &redirect_uri=https%3A%2F%2Fagent.example.com%2Fcb &code_verifier=dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk¶
The AS resolves the Mission from the grant
(Section 6.4.1), checks that it is active
(Section 7.1), and issues a Mission-bound access token for the
ERP and a refresh token. The token response carries the granted
authorization_details echo (Section 7.3) and the
mission_id and mission_expires_at response parameters
(Section 7.3.1):¶
{
"access_token": "eyJhbGciOiJFUzI1NiIsInR5cCI6ImF0K2p3dCJ9...",
"token_type": "DPoP",
"expires_in": 300,
"refresh_token": "rt_4mN8qV2xP7sL1tY9zB3k",
"mission_id": "msn_8RfX2Lqv9TqMv4z7sA2bN1k0YpEdHc9-",
"mission_expires_at": "2026-12-31T23:59:59Z",
"authorization_details": [
{ "type": "mission_resource_access",
"resource": "https://erp.example.com",
"actions": ["invoices.read"],
"constraints": {
"resource_issued_after": "2026-07-01T00:00:00Z",
"resource_issued_before": "2026-09-30T23:59:59Z"
},
"delegation": {
"max_depth": 2,
"allowed_delegates": [{ "sub_profile": "ai_agent" }]
} },
{ "type": "mission_resource_access",
"resource": "https://erp.example.com",
"actions": ["journal-entries.write"],
"constraints": {
"max_amount": { "amount": "500.00", "currency": "USD" }
} }
]
}
¶
The following is an example of the decoded access token payload:¶
{
"iss": "https://as.example.com",
"sub": "user_3p2q8mN1a0kV7tR",
"aud": "https://erp.example.com",
"client_id": "s6BhdRkqt3",
"iat": 1793606405,
"exp": 1793606705,
"jti": "at_9Kp2vN7sR1tY8mZ3qX5b",
"authorization_details": [
{ "type": "mission_resource_access",
"resource": "https://erp.example.com",
"actions": ["invoices.read"],
"constraints": {
"resource_issued_after": "2026-07-01T00:00:00Z",
"resource_issued_before": "2026-09-30T23:59:59Z"
},
"delegation": {
"max_depth": 2,
"allowed_delegates": [{ "sub_profile": "ai_agent" }]
} },
{ "type": "mission_resource_access",
"resource": "https://erp.example.com",
"actions": ["journal-entries.write"],
"constraints": {
"max_amount": { "amount": "500.00", "currency": "USD" }
} }
],
"cnf": { "jkt": "0ZcOCORZNYy-DWpqq30jZyJGHTN0d2HglBV3uiguA4I" },
"mission": {
"id": "msn_8RfX2Lqv9TqMv4z7sA2bN1k0YpEdHc9-",
"issuer": "https://as.example.com"
}
}
¶
The token's authorization_details claim carries the same two entries
as the token response's echo. The token carries everything enforcement
needs: the audience, the sender constraint (the cnf claim), the
authority with its constraints, and the mission claim naming the
Mission it was derived under. Its 300-second lifetime ends well
before the Mission's expires_at. Revoking the Mission stops further
derivation, but this token remains valid until its own exp
(Section 10.2).¶
The agent calls the ERP resource server (erp.example.com) with that
token. The resource server:¶
validates the JWT and verifies the request's DPoP proof against the
key identified by the token's cnf claim;¶
enforces the authorization_details entries whose resource
matches the operation target, https://erp.example.com,
permitting invoices.read within the Q3 issuance window and
journal-entries.write up to the max_amount ceiling of 500.00
USD (Section 9.1); and¶
treats the mission claim as audit and correlation context, making
no call to the AS.¶
With enforcement from the token alone, the consequential
journal-entries.write is bounded only by token lifetime and the
carried constraints.¶
At 08:14:00 the agent refreshes for a write-only token, narrowed to
the journal-entries.write entry, as the refresh example in
Section 7.3 narrows to the read entry.¶
The agent then asks the ERP to post a 780.00 USD adjustment with the
same write-only token. The amount exceeds the entry's max_amount of
500.00 USD, so the ERP refuses it from the token alone as outside the
carried authority (Section 9.1). This deployment accepts the
agent learning that more authority needs a new approval or an
expansion (Section 17.3.2), so the challenge carries
mission_denial:¶
HTTP/1.1 403 Forbidden WWW-Authenticate: DPoP error="insufficient_scope", mission_denial="insufficient_authority"¶
A fresh token from the same Mission does not help: every token it derives is a subset of the same Authority Set (Section 5.4).¶
At 08:50:00 the agent refreshes for the read-only token of the refresh example in Section 7.3, which expires at 08:55:00.¶
At 08:53:20 the Mission is revoked, and the AS commits terminated
with reason revoked. Revocation stops the Mission at the issuer
(Section 10.2). A later refresh is refused with the mission_error
diagnostic (Section 7.1.2):¶
HTTP/1.1 400 Bad Request
Content-Type: application/json
Cache-Control: no-store
{
"error": "invalid_grant",
"mission_error": "revoked"
}
¶
Introspection reports the 08:50:00 token inactive with the Mission's termination, although the token has not expired (Section 9.2.5, Section 9.2.2).¶
Revocation does not recall the token already issued. The ERP,
enforcing from the token alone, can honor the read-only token until
its exp at 08:55:00. A resource server that introspects at the
issuer on every request stops honoring it on its next request.¶
The following table lists the choices this document leaves to a deployment, who makes each, and, for each party that needs to learn it, the existing signal, if any, from which that party learns it. A signal serves only the party entitled to read it: a client treats an access token as opaque (Section 6 of [RFC9068]), so a token's header and claims are resource-server signals. Where no signal exists, the table says so, and the party relies on the deployment's documentation or configuration. The cited sections govern.¶
| Choice point | Decided by | Who learns it, and how |
|---|---|---|
| Access-token format: JWT or opaque reference token (Section 7) | AS | Resource server: a JWT's typ header parameter value at+jwt (Section 7.2, Section 4 of [RFC9068]); no in-band signal marks an opaque token, which it resolves as its deployment arranges (Section 9.2.4). Client: none; it treats every access token as opaque |
| Introspection, and issuer-local resolution of an opaque token (Section 9.2, Section 9.2.4) | AS | Resource server: the introspection_endpoint AS metadata ([RFC8414]); for issuer-local resolution, none, since the AS authorizes each reader inside its trusted implementation boundary |
| Sender constraint: bearer, DPoP, or mTLS (Section 7.2) | AS, on the client's proof, if any | Resource server: the token's cnf claim, or the cnf member of an active introspection response (Section 9.1, Section 9.2.4). Client: for DPoP, the binding applied to the issued token, from token_type DPoP in the token response (Section 5 of [RFC9449]); for mTLS, the AS's mTLS metadata (Section 3.3 of [RFC8705]) states only that the AS supports certificate-bound tokens, and no token-response member says a given token is bound. A resource's DPoP requirement or mTLS support comes from its protected resource metadata ([RFC9728]), which also states support, not the binding of a given token. Settled for delegation: a designation is requested with a sender-constrained token, and a delegated token is bound to the delegate's own key (Section 8.1, Section 8.2) |
Authorization-code binding: PKCE S256 or a DPoP-bound code (Section 6.1.7) |
Client, among the methods the AS accepts | AS: the request's code_challenge ([RFC7636]), or its dpop_jkt parameter or DPoP proof (Section 10 of [RFC9449]). Client: the code_challenge_methods_supported ([RFC8414]) and dpop_signing_alg_values_supported (Section 5.1 of [RFC9449]) AS metadata |
| Refresh-token binding: client authentication, sender constraint, or rotation (Section 7.4) | AS | Client: under rotation, a new refresh token in each refresh response (Section 6 of [RFC6749]); for a DPoP binding, none beyond its own proof when it obtained the refresh token (Section 5 of [RFC9449]) |
| Mission support (Section 12) | AS | Client: the mission_bound_authorization_supported AS metadata; otherwise, out of band |
| Supported types and their schemas (Section 5.5) | AS; each resource server, for the types it accepts | Client: the AS's authorization_details_types_supported metadata ([RFC9396]) and, where advertised, its types metadata endpoint (Section 12); a resource server's authorization_details_types_supported metadata (Section 13) |
| Derivation mode: authority proposal or configured mapping (Section 5.1) | Client, by proposing or not; deployment, by configuring mappings | Client: no metadata signal; the deployment publishes its mapping space as deployment documentation |
Transformation capabilities per type: narrowing, delegation, projection (Section 5.5.1) |
AS operator, per type | Client, in order of preference: a mission_transformation_capabilities member in the type's entry at the types metadata endpoint, an equivalently shaped member of supported-type documentation, or deployment documentation. Resource server: none needed; it enforces entries as carried (Section 8.4). Settled: the first carrier that declares a member governs, and a declared narrowing also governs Authority Set derivation |
| Each entry's audience (Section 5.5.1) | Deployment | AS: a trusted entry-to-audience mapping, such as authenticated configuration or protected resource metadata ([RFC9728]). Client: none; it requests an audience with resource and reads the granted entries from the token response (Section 7.3) |
| Scope projection for a target (Section 7.7) | Deployment, per target | AS: the target's protected resource metadata ([RFC9728]) or authenticated out-of-band configuration |
| Mission-governed resources (Section 4.3.3) | Deployment, or the resource through its metadata | AS and client: the mission_bound_authorization_required protected resource metadata (Section 13), which the AS authenticates; a deployment's own classification has no signal, and false or omission does not clear it. Resource server: its own configuration (Section 9.1.1) |
| Delegation support (Section 8) | AS | Delegating party and delegate: grant_types_supported listing the Token Exchange grant type (Section 12); otherwise, out of band or by attempt. Settled: a delegate is identified by its client authentication, an actor_token is refused, and a public client is not a delegate (Section 8.2) |
Audiences that process the act chain (Section 9.1.2) |
Deployment | AS: no protocol signal; neither parsing act nor mission_bound_authorization_required establishes it, and the AS establishes it by deployment means, for example its configuration |
| Designated-client separation (Section 8.1) | Deployment | AS: no protocol signal; the AS establishes by deployment means, for example its configuration, that no resource server accepts the client's identifier as an audience |
| Designation redemption count (Section 8.1) | AS | Delegate: no protocol signal; the AS's policy governs, and deployment documentation may describe it. An attempt reveals only its own outcome, not the permitted count |
| Subject-authentication conveyance (Section 9.1.4) | Deployment | Resource server: the acr, amr, and auth_time claims (Section 7.6), or introspection (Section 6 of [RFC9470]); where no Subject authentication applies, they are absent |
| Revocation means (Section 10.2) | Mission Issuer, for the means; the deployment's policy, for who may revoke | A party authorized to revoke: none in this document; a deployment-defined surface |
This appendix records what this document leaves to other work and explains one design choice: how a delegated token identifies its client.¶
This document is self-contained: it binds Missions to OAuth 2.0 and depends normatively only on the specifications listed as its normative references.¶
Its reference to the OAuth Actor Profile
([I-D.draft-mcguinness-oauth-actor-profile]), for the act chain
shape the optional Delegation capability uses, is normative and binds
only a deployment that claims Delegation, so the mandatory
single-domain core does not depend on it.¶
The companion Mission Cross-Domain Projection profile [I-D.draft-mcguinness-oauth-mission-cross-domain] specifies cross-domain projection, a single hop that lets an authorization server in another trust domain honor a Mission, and carries the identity-chaining and Identity Assertion JWT Authorization Grant (ID-JAG) dependencies. The Cross-Domain capability's conformance bar is self-contained in this document (Section 15), so that companion is not a normative dependency.¶
This document defines no mechanism that pins a Mission to an approved agent deployment class or version, and reserves no Intent member for one. Such a pin needs two objects, not one Intent member: a committed approval-context pin, and presenter-instance evidence checked at every derivation (for example, using [I-D.draft-mcguinness-oauth-client-instance-id] and [I-D.draft-mcguinness-oauth-client-attesters]). A profile that defines the pin also defines:¶
its request carriage and resolution to an approved deployment identifier;¶
its Mission Record extension and approval rendering; and¶
its fail-closed behavior when the client cannot prove the pin.¶
This document defines no cumulative consumption bounds (for example, a budget, call-count, or activity-duration cap). An experimental companion ([I-D.draft-mcguinness-mission-metering]) defines them as explicit Mission Intent extension members, together with the runtime metering that enforces them.¶
The following are out of scope for this document:¶
Semantic / intent verification. This document does not evaluate
whether a runtime action serves the Mission's purpose beyond
matching the approved authorization_details and constraints;
per-action evaluation is the runtime layer's role
(Section 17.3.1). Verifying an agent's declared reasoning
against the task is a further attestation problem outside both
layers.¶
Joint outcome and cross-resource effects. Whether the actions
taken under a Mission jointly accomplish its task is out of scope,
as are the ordering, timing, atomicity, and compensation of their
effects across resource servers. The mission claim joins requests
to an approval for issuance and audit; it does not identify a
business transaction.¶
Approval-free authorization upgrade. The Authority Set is committed at approval, and this document defines no mid-stream widening that bypasses consent. Widening requires a new approval (Section 5.4).¶
Lifecycle event distribution. A resource server learns Mission state from the token lifetime or optional introspection (Section 9.2); this document defines no push-based notification of Mission state changes.¶
Human-in-the-loop suspension. The base lifecycle is active and
terminated (Section 10). A pending-human-approval state and a
holding-token pause-and-resume protocol are future lifecycle work.¶
Multi-hop cross-domain projection. Re-projecting a Mission from one Resource AS into a further domain is future work.¶
Decentralized agent identity. Agent identity and credentialing are out of scope ([I-D.draft-ietf-wimse-aims] and the WIMSE architecture, [I-D.draft-ietf-wimse-arch]); this document governs the approved-task artifact those identities act within, not the identities themselves.¶
Cross-audience unlinkability. A single canonical Mission
Identifier lets any party holding a token correlate a Mission's
activity across audiences and resources. The authority_hash anchor
is not part of that baseline correlation surface: it stays on the
Mission Record and the audit and profile surfaces that carry it by
disclosure privilege (Section 7.8,
Section 9.2.1), not on every token by
default. Pairwise or unlinkable presentation of Mission-bound
authority works against the identifier and is therefore future work
(Section 18.1).¶
This document keeps the registered meaning of the client_id claim,
stated normatively in Section 7.2 and enforced in
Section 9.1: the OAuth client that requested the token, on
every issued or derived token, a delegated one included. Downstream
delegates are named in the act chain (Section 8.2), and the
Mission's originally-approved agent remains recorded in the Mission
Record (Section 6.2).¶
The alternative, fixing client_id to the approved agent on every
derived token, would lead a generic [RFC9068] resource server or
logging pipeline to misattribute a delegate's action to the approved
agent, with no error to surface the mismatch. It would be safe only
where every resource server already processes the act chain, and
Mission awareness alone does not establish that
(Section 9.1.2).¶
The routing rule of Section 9.1 does not depend on this
choice. The mission claim's presence signals that a token may carry
an act chain a consumer needs to process. A Mission-unaware
resource server cannot opt into that processing, so routing a
delegated token to one is forbidden.¶
These non-normative vectors let an implementation verify its anchor
computation (Section 6.3.1, Section 6.3.2) byte for
byte. All use the issuer https://as.example.com.¶
Each canonical-bytes block is the exact JCS [RFC8785] output: a single line of UTF-8 with no whitespace outside string values. It is wrapped here for layout only; removing the line breaks, and adding no characters, recovers the canonical form.¶
JCS sorts object member names and preserves array order. In these
vectors, iss precedes typ precedes value; within an entry,
actions precedes constraints precedes resource precedes type;
and within max_amount, amount precedes currency.¶
intent_hash, over this Mission Intent as the envelope value with
typ mission-intent:¶
{
"goal": "Reconcile Q3 invoices",
"target_resources": ["https://erp.example.com"],
"expires_at": "2026-12-31T23:59:59Z"
}
¶
Canonical bytes of the envelope:¶
{"iss":"https://as.example.com","typ":"mission-intent","value":{"e
xpires_at":"2026-12-31T23:59:59Z","goal":"Reconcile Q3 invoices","
target_resources":["https://erp.example.com"]}}
¶
intent_hash = sha-256:sE_2V3NaDpGNYM8dH1tLpNJnj-RmaHN3FC6ZcbOLJSw¶
authority_hash, over this Authority Set as the envelope value with
typ mission-authority-set:¶
[
{ "type": "mission_resource_access",
"resource": "https://erp.example.com",
"actions": ["invoices.read"] },
{ "type": "mission_resource_access",
"resource": "https://erp.example.com",
"actions": ["journal-entries.write"],
"constraints": {
"max_amount": { "amount": "500.00", "currency": "USD" }
} }
]
¶
Canonical bytes of the envelope:¶
{"iss":"https://as.example.com","typ":"mission-authority-set","val
ue":[{"actions":["invoices.read"],"resource":"https://erp.example.
com","type":"mission_resource_access"},{"actions":["journal-entrie
s.write"],"constraints":{"max_amount":{"amount":"500.00","currency
":"USD"}},"resource":"https://erp.example.com","type":"mission_res
ource_access"}]}
¶
authority_hash = sha-256:vUCCfjGulit9u0qJ0Z6pQSNerZtXMqRlfJNCr4PzLro¶
The next two vectors exercise an additional flat Intent member beyond
target_resources, and an Authority Set entry whose
delegation.allowed_delegates is an array of matcher objects. JCS
preserves the array's order, so the sub_profile matcher stays
before the sub matcher.¶
intent_hash, over this Mission Intent as the envelope value with
typ mission-intent:¶
{
"goal": "Reconcile Q3 invoices",
"target_resources": ["https://erp.example.com"],
"expires_at": "2026-12-31T23:59:59Z",
"purpose": "urn:example:purpose:reconcile"
}
¶
Canonical bytes of the envelope:¶
{"iss":"https://as.example.com","typ":"mission-intent","value":{"e
xpires_at":"2026-12-31T23:59:59Z","goal":"Reconcile Q3 invoices","
purpose":"urn:example:purpose:reconcile","target_resources":["http
s://erp.example.com"]}}
¶
intent_hash = sha-256:ug7xNsun-TbvBCr-_uFP74-CBEs8pwlPmD-doEyKDu8¶
authority_hash, over this Authority Set as the envelope value
with typ mission-authority-set:¶
[
{ "type": "mission_resource_access",
"resource": "https://erp.example.com",
"actions": ["invoices.read"],
"delegation": {
"max_depth": 2,
"allowed_delegates": [
{ "sub_profile": "ai_agent" },
{ "sub": "s6BhdRkqt3" }
]
} }
]
¶
Canonical bytes of the envelope:¶
{"iss":"https://as.example.com","typ":"mission-authority-set","val
ue":[{"actions":["invoices.read"],"delegation":{"allowed_delegates
":[{"sub_profile":"ai_agent"},{"sub":"s6BhdRkqt3"}],"max_depth":2}
,"resource":"https://erp.example.com","type":"mission_resource_acc
ess"}]}
¶
authority_hash = sha-256:notrA9wZaP3I5Gx8UzN0mfzUjHYPeX4Ri_B3ilh7BbA¶
The next vector exercises the third anchor: proposal_hash, over
this submitted authorization_details proposal as the envelope
value with typ mission-proposed-authority
(Section 4.3):¶
[
{ "type": "mission_resource_access",
"resource": "https://erp.example.com",
"actions": ["invoices.*"] },
{ "type": "mission_resource_access",
"resource": "https://erp.example.com",
"actions": ["journal-entries.write"],
"constraints": {
"max_amount": { "amount": "1000.00", "currency": "USD" }
} }
]
¶
Canonical bytes of the envelope:¶
{"iss":"https://as.example.com","typ":"mission-proposed-authority"
,"value":[{"actions":["invoices.*"],"resource":"https://erp.exampl
e.com","type":"mission_resource_access"},{"actions":["journal-entr
ies.write"],"constraints":{"max_amount":{"amount":"1000.00","curre
ncy":"USD"}},"resource":"https://erp.example.com","type":"mission_
resource_access"}]}
¶
proposal_hash = sha-256:udzftXYQy0pvYNxz4KgtmyL_EV8ry4DhIbBFfwILEBA¶
The last vector is the entry commitment (Section 14.4.1), computed over one immutable Mission-record Authority Set entry, not an issued or narrowed token projection.¶
The entry commitment, over this entry as the envelope value with
typ mission-authority-entry:¶
{
"type": "mission_resource_access",
"resource": "https://erp.example.com",
"actions": ["invoices.read"],
"constraints": {
"resource_issued_after": "2026-07-01T00:00:00Z",
"resource_issued_before": "2026-09-30T23:59:59Z"
},
"delegation": {
"max_depth": 2,
"allowed_delegates": [{ "sub_profile": "ai_agent" }]
}
}
¶
Canonical bytes of the envelope:¶
{"iss":"https://as.example.com","typ":"mission-authority-entry","v
alue":{"actions":["invoices.read"],"constraints":{"resource_issued
_after":"2026-07-01T00:00:00Z","resource_issued_before":"2026-09-
30T23:59:59Z"},"delegation":{"allowed_delegates":[{"sub_profile":"
ai_agent"}],"max_depth":2},"resource":"https://erp.example.com","t
ype":"mission_resource_access"}}
¶
entry_digest = sha-256:OUrwTnuirT29YxQmMSyiJce8W1PfGryvrVViQ1lJCqQ¶
An implementation that canonicalizes the same value under the same
typ and iss, computes SHA-256, and encodes as sha-256: followed by
base64url with no padding (Section 6.3.1) reproduces these
anchors exactly. A divergence indicates a JCS or encoding difference to
resolve before interoperating.¶
[[ To be removed from the final specification ]]¶
-02¶
Behavior changes¶
The legacy Mission-state reading is removed: revoked, expired,
completed, superseded, and cascaded are no longer read as a
state (#1504).¶
An intentional normative relaxation: the -01 standing-consent
requirements (approved_at, policy adjudication, Activation Policy
Commitment, Standing-Consent Recency) move to Approval Governance,
which the profiles defining standing-consent bases adopt;
Mission-Creating Paths keeps the basis type, activation semantics
and recorded activation members (#1915, #1967).¶
Mission Record: its required members are named, policy_version
and the direct activation members become optional, and an omitted
integrity anchor is implied from the retained record (#1912, #1917).¶
Approval: the AS allocates approval_event_id (#1915); a commit past
the effective expiry is refused with access_denied (#1721); the
rendering attributes client text to the client (#1532).¶
Issuance: no token outside a Mission for a Mission-governed resource,
and only entries whose approved audience includes the token's, each
refused with invalid_target (#1503); transformation-capability
precedence and validation (#1377, #1720); mission_id and
mission_expires_at on a new Mission's first response and on a
delegated exchange response (#1719).¶
Delegation: client authentication by a method the AS relies on,
refusing others with invalid_client and an actor_token from an
authenticated client with invalid_request (#1718); delegated tokens
only to resource servers that process act (#1503); unsupported
self-exchange refused (#1892).¶
Token consumption: the mission claim is reserved to Mission-binding
profiles; a JWT access token follows RFC 9068 unless a profile
defines its format (#1760); an unenforceable entry is refused only
with insufficient_scope or the RAR remediation challenge (#1721).¶
Revocation: by mission_id, from a party the deployment's policy
authorizes, independent of possession of any token; a Mission whose
recorded Subject is deprovisioned should be terminated (#830, #1892,
#1895).¶
Structure. Sections follow processing order, with Mission Creation, Mission-Bound Token Issuance, Delegation Within a Mission, Token Consumption, and Mission Lifecycle as chapters (#1723, #1793). Applicability states the baseline. Restated rules become pointers, and existing obligations carry BCP 14 keywords, with no new requirement (#1892). Family material moves to the Architecture, the security analysis to the Mission Security Model, and companion mechanics to their profiles; companion pointers remain only at the hooks they explain (#1794, #2009).¶
References. RFC 9110 is added as normative and the AAuth protocol as informative. No longer cited: FAPI Grant Management, the Cedar RAR draft, SPIFFE client authentication, Transaction Tokens, GNAP, the Attenuating Agent Tokens draft, RFC 8628, RFC 8935, and the Audit, Capability Binding, Child Delegation, Consent Evidence, Containment, Continuation, Cross-Organizational Delegation, Derivation Limits, Device Authorization, Expansion, Management, Mission Authority Server, Progressive, Signals, Template, and Work Products companions.¶
-01¶
Breaking wire changes¶
mission_intent carries the Mission Intent Submission envelope,
intent plus an optional typed evidence array; a bare Intent is
refused, and unsupported, invalid, or missing required evidence is
refused with the new invalid_mission_intent_evidence error code.
PAR carries it on the authorization-code path; other grants need a
companion (#1202). The authority proposal moves from the removed
Intent member proposed_authority to the authorization_details
parameter, committed by the new proposal_hash.¶
Inside a signed Request Object pushed through PAR, the
mission_intent claim is the Submission envelope as a JSON object,
not its serialization; any other value is refused with
invalid_request (#1503).¶
Intent members, with no aliases (#636, #706, #117): resources is
renamed target_resources and constraints task_bounds;
controls is removed, its acr replaced by the acr_values and
max_age parameters and its max_derivations by Derivation Limits'
requested_derivation_limit. success_criteria is removed, and
earlier Missions keep their recorded Intent. goal_lang is new
(#534). The top level admits only defined members, a Mission Intent
Members registry assigns short names, and test vectors are
regenerated.¶
The baseline mission claim carries id, issuer, and an optional
expires_at; authority_hash leaves the claim, and introspection
can disclose it (#702). The Mission Record replaces approver with
approval_basis.consent_principal (#705) and adds approval_basis,
authority_source (#316), termination, proposed_authority,
proposal_hash, and submission_evidence.¶
The lifecycle states are active and terminated; the -00 states
revoked and expired become termination reasons, and a consumer
can read a legacy state that way during a transition (#705). New
registries hold lifecycle states, any further one non-terminal
(#170), and termination reasons.¶
The token endpoint adds mission_expires_at, the effective expiry,
which can precede the requested intent.expires_at, and the
mission_error diagnostic; mission_id is recommended.
Authorization details type metadata can declare
mission_transformation_capabilities, and entry commitments use
mission-authority-entry. Resource server challenges add
mission_denial and use RFC 9470 insufficient_user_authentication.¶
A Token Exchange refuses an inactive Mission (#1154) and an invalid,
unproven, or unacceptable subject or actor token (#1178) with
invalid_request, unless its profile assigns a code; other grants
keep invalid_grant, and DPoP proof failures use
invalid_dpop_proof and use_dpop_nonce. access_denied replaces
invalid_authorization_details where no authorization_details was
submitted; invalid_target covers scope-projection and routing
failures; and invalid_scope covers an ungrantable scope and an
openid request whose Approver is not the Subject (#826).¶
Delegation by designation (#1268): the delegate's subject_token is
a designation, which only the holder of a sender-constrained token
obtains, by Token Exchange naming the delegate as audience.¶
Instance context no longer identifies the instance through act.sub
or act.cnf: the delegate's actor identity is established
separately, the top-level cnf binds the presenting key, and a
deployment can convey optional client_instance context under
[I-D.draft-mcguinness-oauth-client-instance-id]. The
instance-delegate matcher example uses the ai_agent actor type
instead of the retired client_instance actor type.¶
Model changes. Approval separates consent_principal,
activation_actor, and optional adjudication (#701): direct
approval is human (#1185), approval activates only authority its
source holds (#316), and standing-consent bases activate instances at
their own approval events (#1078). Derivation is mechanical.
purpose selects configured mappings; its other uses, and model
output, only refuse or narrow (#1102). Each grant lineage
binds to one Mission, never through consent reuse (#700, #1259).
Authority is type-agnostic, with scope projection; opaque tokens use
introspection or issuer-local resolution (#1203). Submission
processing checks a proposal before evidence, refuses with the earliest
failing step's error, and completes Authority Set derivation before
the rendering (#1411); the Mission-governed client rule reaches only
authorization requests (#1448); delegation policy crosses a
cross-domain projection where that profile's provenance rule keeps it
(#1374). An unrecognized authority_source.type stays opaque
provenance and does not deactivate the Mission, though no Mission is
approved from a source the AS does not recognize, and an
authority_source.policy digest follows the construction and issuer
its policy format defines (#1503).¶
Moved to companions. Resource Access (the mission_resource_access
type, Common Constraints, tool modeling, and
mission_constraints_supported; #637, #645, #698); Intent Submission
Evidence (the verification framework; evidence stays); Approved-Set
Verification; Derivation Limits (with derivations_remaining);
Metering's Intent members; and Approval Governance's assertion rules.¶
Security and privacy. Delegation hardening and no authority from
an entry a resource server cannot fully enforce (#1258); Approver
authentication kept off derived tokens and out of OpenID Connect
results for another Subject (#826); task credentials that are
Mission-bound or covered by a trusted enforcement path (#1205);
refresh tokens bound per client type (#1204);
issuer-checked Mission resolution (#725); third-party data subjects
(#344); key retention to the audit horizon; a resource server accepts
a mission claim only from an issuer it trusts for Mission-bound
authorization, with mission.issuer equal to iss outside an
adopted cross-domain profile; the approval rendering identifies the
receiving client from information the AS trusts; a refresh request
beyond its grant is refused, never trimmed (#1503); and the approval
basis named as outside the integrity anchors, with the profiles that
commit it (#1518).¶
Editorial and structure. The reading path (#910, #1379); readability, placement and consolidation passes (#876, #1409, #1447, #1472, #1479, #1483, #1490, #1501, #1526), with the issuance rules gathered under Mission-Bound Access Tokens, "Mission Lifecycle and Gating" retitled "Mission Lifecycle", resource classification named "Mission-governed resource" (#1503), and one Standing-Consent Bases section; the error-table detail for a configured-mapping refusal aligned with Derivation Modes (#1495); subsections, tables and IANA templates fitted to the text rendering (#1380, #1382, #1401, #1404, #1410, #1418); canonical-Mission examples (#1176); and the Mapping Assessment, moved from the substrate (#708).¶
References. The WIMSE AIMS draft, the RAR metadata remediation draft, and Client Instance ID with Client Attesters replace draft-klrc-aiagent-auth, draft-zehavi-oauth-rar-metadata, and draft-mcguinness-oauth-client-instance-assertion; MCP, ISO 4217, RFC 3986, and draft-mcguinness-oauth-ai-agent-instance are removed; RFC 6750, RFC 9700, Client Instance ID, OpenID Connect Core, the RAR metadata remediation draft and, for Delegation, the OAuth Actor Profile are normative.¶
-00¶
Initial individual draft.¶
This work builds on the OAuth 2.0 Rich Authorization Requests, Pushed Authorization Requests, and JWT access token specifications, and is intended to complement agent-identity work including [I-D.draft-ietf-wimse-aims].¶