Internet-Draft OAuth Mission October 2026
McGuinness Expires 24 April 2027 [Page]
Workgroup:
Web Authorization Protocol
Internet-Draft:
draft-mcguinness-oauth-mission-01
Published:
Intended Status:
Standards Track
Expires:
Author:
K. McGuinness
Independent

Mission-Bound Authorization for OAuth 2.0

Abstract

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.

About This Document

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.

Status of This Memo

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 24 April 2027.

▲

Table of Contents

1. Introduction

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. The authorization server (AS) issues tokens under a Mission only while it is active, each bounded by the approved Authority Set, and resource servers enforce the resulting credentials. Revoking or expiring a Mission stops further issuance and refresh but does not, by itself, invalidate an already-issued access token, which remains valid until it expires (Section 7.2).

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. The agent is an OAuth 2.0 [RFC6749] client identified by client_id, the delegating user is the access token sub, and the agent obtains tokens for the resources its task requires. That work leaves out of scope:

OAuth does not define a task record that links approval of a task to every grant obtained for it. Without that linkage, withdrawing task approval need not stop issuance under those grants.

No existing OAuth object fills that role (Appendix B.1); an authorization_details entry ([RFC9396]), for example, expresses authority but not the task it serves or a lifecycle of its own. A Mission, held by the AS beside the grant, does. It commits the disclosed task with its approved authority and has an identifier and a lifecycle independent of any grant. It can be revoked by that identifier through an authenticated means, independent of possession of any token (Section 7.2), and a token derived from it by Token Exchange identifies the same Mission (Section 8.1).

A Mission is created and used in a single chain:

  1. Submit. The client submits a structured Mission Intent describing the task (goal, target resources, task bounds) instead of requesting raw scopes, optionally proposing concrete authority alongside it as standard authorization_details.

  2. Derive authority. The AS derives authorization details ([RFC9396]), the Authority Set: the concrete authority the task needs.

  3. Approve. At an approval event, the approval rendering shows the Intent's task, and the Approver consents to the derived Authority Set itself, not to the task description alone (Section 6). The AS commits the Mission Intent as intent_hash and the approved Authority Set as authority_hash (Section 15.1). It records a durable Mission whose record associates the disclosed task, the approved authority, and the approval basis (Section 14).

  4. Bind the grant. The AS binds the OAuth grant the approval produces to that Mission, server-side (Section 8.1). Each later issuance operation from that grant lineage, such as a refresh, is a derivation (Section 8.2) and resolves to exactly this Mission; the client never selects or reassigns it. Under a profile, the AS can bind a further grant lineage to the same Mission; each lineage resolves to exactly one Mission.

  5. Issue and enforce. Every derived authority is no broader than the approved Authority Set (Section 5.4). Every access token the agent obtains under the Mission carries the derived authorization details and a mission claim identifying that Mission (id, issuer). A resource server enforces statelessly from the token.

  6. Stop issuance. Token issuance and refresh are gated on Mission state: a Mission that is not active yields no further derivation (Section 8.2), including from any grant lineage bound to it (Section 8.1.3). Revoking or expiring the Mission therefore stops the agent from obtaining further authority.

Steps 3 to 6 state the properties this document provides; Section 19 states the requirements that realize them.

A user thus approves the authority for a task once, and that approval, not a per-request scope grant, bounds and outlives every token the agent derives. The Mission Record commits the consented authority once, as authority_hash; a party holding the complete Authority Set can recompute the commitment and compare the result with authority_hash (Section 20.1.1). Mission Approved-Set Verification ([I-D.draft-mcguinness-oauth-mission-approved-set-verification]) defines how a token that carries only a narrowed subset is checked against the complete set.

This chain is the first of two enforcement layers, and a deployment can run it alone: a resource server need not be Mission-aware unless it receives delegated tokens (Section 9). A Mission-unaware resource server that authorizes only from scope operates within the Mission only where the AS establishes that its scope projection and the resource's independent controls cannot over-grant (Section 8.7). The chain provides task-bound issuance, auditability, and a revocation gate over future derivation.

The chain does not evaluate individual actions, so token lifetime and narrow authority bound the exposure between issuance and use. The second layer, a separately specified runtime layer (Section 20.3.1), adds a per-action check for the action classes whose consequence needs one.

1.1. Implementation Map

The starting path is one client, one authorization server, direct approval, and a single resource audience, with no runtime profile, delegated token, or cross-domain projection; Section 19 states the complete roles and optional capabilities. The worked flow (Section 2.2) follows one Mission along this path with concrete times. Each implementer's duties on the starting path, with the sections that define them:

Mission Client:

Submits an Intent through PAR (Section 4.2), optionally proposes authority (Section 4.3), completes the authorization-code flow, and reads the granted authority and Mission references from the response (Section 8.4, Section 8.1.4). Authorization Server Metadata (Section 17) holds the metadata the client reads before it submits, and the client's rules for an AS whose Mission support is not established and for a credential that is not Mission-bound.

Mission Issuer (AS):

Its duties on the starting path:

Mission-aware Resource Server:

Validates the credential and any sender constraint, enforces the carried authority, and applies any configured Mission requirement (Section 9, Section 11.4).

This document defines no authorization_details type (Section 5.5). Each Authority Set entry is of a type the AS supports, such as mission_resource_access ([I-D.draft-mcguinness-oauth-mission-resource-access]), and a Mission-aware Resource Server enforces each applicable entry its tokens carry under that entry's type (Section 9.1).

The following table summarizes which surfaces apply, to whom, and when; the cited sections govern. Ordinary JWT consumption does not require retrieving the Mission Record or recomputing the complete approved Authority Set.

Table 1: Applicability of this document's surfaces
Surface (role) Applies Defined in
Mission Intent via PAR (client, AS) Mission-creating requests on the authorization-code path; companion-defined back-channel carriage follows its profile Section 4.2
Direct approval (AS); the Mission Record (AS) Every direct approval event; the Mission Record at every approval event Section 6.2, Section 14
Evidence dispatch and refusal (AS) Implemented by every AS, even one that supports no evidence type; applied to each presented entry Section 4.4
Authority proposal (client, AS) Optional for the client; the AS checks one that is submitted Section 4.3
Grant binding (AS) Authorization-code lineages and other profile-defined reusable grants, including their refresh-token families Section 8.1
Issuance gating (AS) Every derivation, refresh and Token Exchange included Section 8.2
Scope projection (AS) Every issuance that emits scope or whose request names a scope value; a scope-only target gets a safe projection or a refusal Section 8.7
Sender constraint, primary and refresh tokens (AS) Recommended for the access token, which may be a bearer token; a public client's refresh token is sender-constrained or rotated Section 8.3, Section 8.5
Sender constraint, delegation and cross-domain (AS, RS) The token presented for a designation is sender-constrained, and the designation carries no cnf; a delegated token is bound to the delegate's own key; across trust domains, as the cross-domain companion requires Section 12.1, Section 12.2, Section 8.3
Revocation means (deployment) An authenticated revocation by mission_id, independent of any token Section 7.2
Enforcement (Mission-aware RS) Every request the resource server serves Section 9
Introspection (AS, RS) Optional; required for opaque tokens served without issuer-local resolution Section 11, Section 11.4
Delegation, Cross-Domain (AS, client, RS) Optional capabilities Section 12, Section 19.2
Standing consent (AS) Only under a companion profile's standing-consent basis Section 13

1.2. Applicability

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.7).

The direct realization creates each Mission at an approval interaction on the authorization endpoint. [I-D.draft-mcguinness-mission-architecture] (Section "Mission Creation Paths") maps the paths where an administrator, or a policy a human consented to, decides without one.

A Mission is intended to cover one concrete task, not an agent's whole lifetime. Narrow Missions, each separately approved and revocable, are preferred over one broad standing Mission that accumulates authority across unrelated tasks.

This preference has a consent cost: many narrow Missions can create approval fatigue, and combining unrelated authority into one broad Mission can make approval difficult to evaluate. A useful boundary is a task whose purpose, authority, and bounds the Approver can evaluate together (Section 6.6).

Optional companions can reduce repeated approvals through standing consent (Section 13): for example, a template, an authority ceiling, or a policy that a human approved once governs later Missions. The template, ceiling, or policy still needs a meaningful human approval, and no such mechanism removes its profile's human-approval requirement for high-consequence authority.

The unit of governance is the action, not the content. A Mission bounds where an agent may act (resources, actions) and how much (constraints and, where metered, cumulative bounds). It does not inspect the content that flows within an authorized action: an approved egress channel carries a status update or an exfiltrated payload with equal authority. Content-level controls (data loss prevention, redaction) are complementary; under mediated execution they fit at the mediating enforcement component (Section 20.3.1).

2. Overview

2.1. Protocol Flow

Besides the agent (the OAuth client) and the Mission Issuer (the AS), the flow involves two principals: the Subject, on whose behalf the Mission is approved, and the Approver, who approves it. Section 3 defines these and the other terms.

The following figure shows the protocol flow between the agent and the Mission Issuer:

 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

After token issuance, resource access and lifecycle management proceed as follows:

(4) The agent calls the resource server with the token. The resource server enforces the authorization_details statelessly and can check the mission claim (Section 9), with no callback to the AS required.

(5) An authorized revocation (Section 7.2), or expires_at passing, moves the Mission to terminated, with reason revoked or expired, after which the AS refuses further issuance and refresh. A deployment can also treat [RFC7009] revocation of the refresh token as revoking the Mission (Section 7.2).

The end-to-end example (Appendix A) walks this flow with concrete messages.

2.2. Introductory Example

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.

  1. 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).

  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.2, Section 8.1.1).

  3. 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 8.4), mission_id, and mission_expires_at; the access token's five-minute lifetime is distinct from the Mission's one-hour lifetime (Section 8.1.4).

  4. 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 19). 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).

  5. 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 8.2). The already-issued access token can still be honored on this stateless path until 12:05; revocation does not undo a completed read (Section 7.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 11.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.

3. Conventions and Terminology

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].

3.1. Terminology

Agent (Client):

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.

Subject:

The user, workload, or organizational principal on whose behalf the Mission is approved (Section 6.7), identified by an (iss, sub) pair and carried in derived tokens' sub claim.

Approver:

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 13). 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.9).

Mission Issuer (authorization server):

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".

Mission Client:

The client conformance role, defined in Section 19.

Mission-aware Resource Server:

The resource server conformance role, defined in Section 19.

Resource AS:

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 companion Mission Cross-Domain Projection profile specifies cross-domain projection ([I-D.draft-mcguinness-oauth-mission-cross-domain]).

Mission Intent:

The structured description of the task the client submits (Section 4).

Mission Intent Submission (Submission envelope):

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).

Intent Submission Evidence:

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).

Authority Proposal:

The authorization_details array a client submits alongside a Mission Intent, a proposal for Authority Set derivation and not authority (Section 4.3).

Authority Set:

The set of authorization_details entries the AS derives from a Mission Intent and the Approver approves (Section 5).

Authority Set derivation:

Computing the Authority Set from a Mission Intent and any authority proposal, in narrowing or configured-mapping mode (Section 5.1).

Derivation:

One issuance operation the issuer AS performs for a single request (Section 8.2): the initial authorization-code exchange, a refresh, a Token Exchange, or a cross-domain grant issuance. Distinct from Authority Set derivation, which some section titles and fixed phrases, such as "derivation policy", also call derivation.

Mission:

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 14), immutable except for its state and termination members, identified by a Mission Identifier (Section 14.5) and, globally, by the pair (issuer, id). A Mission is independent of any OAuth grant (Section 8.1). "The approved task" is shorthand for this binding: the Approver approves the Authority Set, and the task is disclosed and committed beside it.

Mission grant binding (grant binding):

The AS-controlled, functional mapping from one persistent, redeemable grant lineage to exactly one Mission (Section 8.1). Distinct from a Derived token's own mission claim, which every issued credential carries without itself creating a grant binding.

Mission-referenced token:

A token that carries a Mission reference (the mission claim or a mission_id) without Mission-derived authority or any gating guarantee.

Derived token (Mission-derived token):

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 8).

Mission-bound token:

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 19).

3.2. Principal Model

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 13).

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.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. Across trust domains, the cross-domain companion conveys Subject identity through its own subject-resolution claims, not a Mission lookup, and a token minted in another domain preserves the mission claim unchanged ([I-D.draft-mcguinness-oauth-mission-cross-domain]).

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 12.2), not on the Mission Record. This document uses only (iss, sub) pairs, not the subject identifier formats of [RFC9493].

4. Mission Intent

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), in place of scope or alongside a narrowed scope.

Before the approval event (Section 6), 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 14.5) only at activation.

The approved Intent carries no authority members. The task, the proposed authority, and the granted authority are committed separately (Section 15.1):

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 (Appendix B.3). 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). The following summary is informative; the member definitions after it are authoritative.

4.1. Intent Members

Table 2: Mission Intent members at a glance
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. 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). Maximum 4096 characters. Prose here persists on the record and can carry personal data about third parties (Section 21.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 22).

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. It is not RFC 8707 resource carriage: a client separately requests the audience of a given token with the standard resource parameter (Section 8.4).

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.2), 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.2, Section 14).

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.2). 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 8.1.4, Section 14).

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.8).

The Mission Intent's top level is closed to the members above and to those a companion profile the AS implements defines (Section 16, Section 4.2).

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"
}

4.2. Submission via PAR

On the authorization-code path (Section 6), 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. The Submission envelope is a JSON object with exactly these members:

intent:

REQUIRED. The Mission Intent object (Section 4).

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.

intent_hash commits exactly the intent object, not the Submission envelope or its evidence array (Section 15.1).

The AS returns a request_uri as usual, which the client uses to start authorization. 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.

Submission is governed by the following rules:

  • Closed top levels. The AS MUST reject 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 16). A bare Mission Intent submitted as the parameter value fails this rule, since its goal and sibling members are unknown envelope members.

  • Carriage through PAR. On the authorization-code path, the AS accepts the Intent in one of two forms:

    1. the form-encoded mission_intent parameter of the PAR request body; or

    2. 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 reject with invalid_request a claim whose value is a string or any other value that is not a JSON object.

    The AS MUST reject 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.

    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 rejected with invalid_request, strengthening Section 6.3 of [RFC9101], under which the AS would only ignore such a value.

  • Alternative back-channel profiles. 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. Such a profile carries the envelope and any authority proposal in one request that never traverses a user agent, and preserves:

    Support for a grant type or endpoint never establishes such a carriage on its own. The experimental Mission Device Authorization profile ([I-D.draft-mcguinness-oauth-mission-device-authorization]) defines one for a client that cannot complete the authorization-code path, on the device authorization grant [RFC8628].

  • 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 verification-cost bound of [I-D.draft-mcguinness-oauth-mission-submission-evidence] accompanies these.

  • Concrete authority is proposed via authorization_details. 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).

  • 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.

  • A proposal, not authority. 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 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..."
    }
  ]
}

4.3. Authority Proposal

A client MAY propose concrete authority for the task by submitting the standard [RFC9396] authorization_details request parameter, a JSON array of authorization_details objects, alongside mission_intent in the same pushed request (Section 4.2).

The submitted authorization_details is a proposal, not authority (Section 4.2); the AS derives and bounds the Authority Set from it (Section 5).

The AS validates each submitted entry per Section 5 of [RFC9396]: it refuses a request carrying an entry of a type it does not support (Section 5.5, Section 17), or one that fails its type's documented definition, with the invalid_authorization_details error code, and never repairs a failure by omitting the entry. Where a machine-readable JSON Schema for the type is advertised (Section 17) or established out of band, the entry MUST also validate against that schema, and the AS MUST refuse a request carrying an entry that fails it with the invalid_authorization_details error code.

Policy narrowing is distinct. During Authority Set derivation the AS MAY narrow or omit a syntactically valid entry that policy cannot accept (Section 5). The granted authorization_details in the token response reflects every narrowing and omission (Section 8.4).

When a proposal is present, the AS MUST derive each Authority Set entry as a subset (Section 5.4) of some proposed entry of the same type: narrowed under that type's own subset rule where it defines one, or carried through unchanged where it defines none (Section 5.5).

goal and task_bounds then serve as rendering and bounding context over the proposed authority. Each proposed entry that carries a resource member MUST have it among the Intent's target_resources, compared as Section 5 states; the AS refuses a request violating this with the invalid_request error code.

The carriage rules of Section 4.2 apply to the proposal. The AS records the array on the Mission exactly as submitted and commits it by proposal_hash (Section 15.1, Section 14), separately from the task (intent_hash) and the approved Authority Set (authority_hash), so a narrowed approved Authority Set can be audited against the proposal that sought it.

Submitting authorization_details without mission_intent is an ordinary [RFC9396] request that this document does not govern. Two AS-side rules keep a governed task from being downgraded to such a request (Section 17 states the client-side rules and Section 20.1.2 the threat):

  • Where a deployment classifies a resource as Mission-governed (a Mission-governed resource), its AS MUST NOT issue a token for that resource outside a Mission, except under documented policy exceptions.

  • If a client registered as Mission-governed sends an authorization request, through PAR or at the authorization endpoint, that carries authorization_details but no mission_intent, the AS MUST reject the request with the invalid_request error code, so the client cannot drop the Intent from a request that still carries authorization_details. The rule applies to that request until it completes, including when the AS resumes it after an interaction. A request carrying neither is an ordinary request that this rule does not reach; the first rule, for a Mission-governed resource, is what keeps that resource's tokens inside a Mission.

A token request under an existing Mission-bound grant, such as a narrowing refresh, a self-exchange (Section 12.4) or an exchange for a delegation designation (Section 12.1), needs no mission_intent under the second rule. This exception opens no Mission submission carriage, and every other check still applies to the request: Issuance Gating (Section 8.2), the subset rule (Section 5.4), the first rule above, and the grant's binding to its Mission, client and sender.

The following is an example of an authority proposal submitted alongside the example Intent of Section 4. Authority Set derivation narrows invoices.* to invoices.read, keeps the proposed Q3 issuance window and write ceiling, which the Intent's task bounds support, and carries the proposed delegation policy through unchanged (the example Authority Set of Section 5):

[
  { "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" }
    } }
]

4.4. Intent Submission Evidence

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:

  • Reject, 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. 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 23.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), 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 19.1).

Mission Intent Submission Evidence for OAuth 2.0 ([I-D.draft-mcguinness-oauth-mission-submission-evidence]) specifies:

  • the entry convention;

  • required-evidence resolution;

  • the binding of evidence to one Intent and to the presenter;

  • the verification-cost bound;

  • where the error is returned; and

  • evidence on idempotent creation surfaces.

4.5. Submission Processing Order

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.

  1. Parse the Submission envelope and enforce both closed top levels (Section 4.2).

  2. Validate the intent object against the Mission Intent member definitions (Section 4).

  3. 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).

  4. Compute the provisional intent_hash over the intent object (Section 15.1).

  5. 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").

  6. Apply the evidence dispatch and refusal rules, verifying every presented entry under its type's rules (Section 4.4).

  7. 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).

  8. 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).

  9. At activation, record the approved intent, intent_hash, the Authority Set, and the verified evidence facts as submission_evidence (Section 14).

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; and

  • an intent object that fails validation together with a malformed proposal is refused at step 2, 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 14). For example, the consent-evidence companion binds them with a submission_provenance_hash inside its committed disclosure ([I-D.draft-mcguinness-oauth-mission-consent-evidence]).

5. Mission Authority

From the Mission Intent, and from the authority proposal where one was submitted (Section 4.3), the AS derives the Authority Set: one or more [RFC9396] authorization_details entries of an AS-supported type (Section 5.5).

5.1. Derivation Modes

Authority Set derivation is mechanical: one procedure whose candidate entries depend on whether an authority proposal was submitted:

  • Narrowing mode (preferred where the client can author authorization_details): the client submitted an authority proposal (Section 4.3), and the Authority Set is the proposal narrowed to policy. Each derived entry is a same-type subset of a proposed entry (Section 4.3).

  • Configured-mapping mode: no authority proposal was submitted, and a deployment-configured mapping, keyed on the Intent's purpose or target_resources, yields the candidate entries, which are then narrowed to policy.

    The mapping is a lookup, not synthesis. Because no authorization_details object was submitted, the AS refuses an Intent that matches no configured mapping, or whose mapped candidates policy narrows to nothing, with access_denied (Section 10). Its error_description can say whether no mapping matched or policy narrowed the candidates to nothing.

    Either mode is conforming. A deployment publishes its mapping space as deployment documentation. Eligibility can be scoped per Subject and client, and a mapping keyed on Subject attributes resolves at the approval event, where the Subject is established (Section 6.2), so a refusal at PAR time is best-effort over what is checkable without the Subject.

    Every Mission this mode yields takes its own fresh approval; standing consent to a pre-approved ceiling is the separate, experimental Mission Template profile ([I-D.draft-mcguinness-oauth-mission-template]), not this mode.

Authority Set derivation can run provisionally during submission processing, where the inputs it needs are available (Section 4.5). The candidate Authority Set is complete before the approval rendering (Section 6.2), and a change that Section 6.5 covers is recomputed and approved over the changed context. The approved Authority Set is fixed when the Mission Record is created, atomically with the approval decision (Section 6.2), under the derivation policy in force at the approval event.

In both modes the AS bounds every Authority Set entry by the Mission Intent: each entry that carries a resource member MUST have it among the Intent's target_resources values, by exact string equality. This membership check applies to the Authority Set, and to a proposal at submission (Section 4.3).

A later token issuance is bounded by the subset rule against the Authority Set (Section 5.4), not by the target list again. A type whose subset relation admits a narrower resource (for mission_resource_access, a descendant of a prefix entry) can yield a token entry that target_resources does not name, and a candidate outside every Authority Set entry fails that rule.

The Mission records the policy version in force as policy_version (Section 14).

Generative Authority Set derivation is not one of this document's modes. As a local-policy extension, a model's output can be a recorded input to the AS's deterministic derivation policy, together with the model's identifier and version. That input can cause refusal or further narrow the candidate authority the selected mode and policy otherwise permit. The AS MUST NOT let it supply or widen authority. Each type's subset rule (Section 5.4), the Intent bounds, and the prose boundary below still apply.

A target_resources entry the deployment does not recognize is, by deployment policy, either omitted from the Authority Set or refused with the access_denied error code (Section 10).

When an omission or a narrowing leaves the Authority Set short of what was proposed (Section 4.3), Authority Set derivation is partial. The token response states what was granted (Section 8.4).

5.2. Consented Authority Set

The derived Authority Set, not the Mission Intent, is the authority the Approver consents to: the AS renders the Authority Set for approval and commits it as authority_hash (Section 6.2). The Intent's members describe and bound the task but grant no authority by themselves (Section 4): its structured members constrain what the AS can derive mechanically, its prose members bound through disclosure, and none widens.

The goal and task_bounds members are human-readable disclosure and audit context. The AS MUST derive the same Authority Set, under the same policy, for two submissions that differ only in goal, goal_lang, or task_bounds, and MUST NOT gate issuance on those members, whether in Authority Set derivation, in an adjudicating policy, or through a model input to either; translating a user's words into structure is the shaper's job, before admission and outside the trust boundary ([I-D.draft-mcguinness-mission-shaping]).

A client-proposed constraint on an individual Authority Set entry enters through the authorization_details proposal: constraints a supported type's specification defines (for example, the Common Constraints that [I-D.draft-mcguinness-oauth-mission-resource-access] defines for mission_resource_access), and the collision-resistant deployment extensions the AS understands (Section 16).

Authority is further bounded by:

  • the Intent's structured members (target_resources, expires_at);

  • the configured mapping, a lookup over structured values, not an interpretation of prose; and

  • local policy and eligibility.

The approval surface renders the prose beside the derived Authority Set (Section 6.2) as the human check that the structure matches the words, not as a machine enforcement mechanism.

5.3. Derivation Policy and Open-Ended Tasks

Authority Set derivation is governed by local policy and is not a portable algorithm: different authorization servers can derive different Authority Sets from the same Mission Intent, as they can grant different authority for the same [RFC9396] request or the same scope. Interoperability begins at the derived Authority Set, whose structure and vocabulary each supported type defines (Section 5.5), and at its integrity anchors (Section 15.1).

A consumer enforces the derived Authority Set, not the Intent. Audit establishes what was derived, against intent_hash and policy_version, not whether the Authority Set derivation was the right reading of the task. A deployment whose partners reason about its Authority Set derivations can publish a derivation policy identifier and test fixtures that pin Intent-to-Authority-Set outcomes.

For an open-ended task whose concrete objects cannot be enumerated at approval (for example, "reconcile this customer's ledger," where the individual invoices are not yet known), the derived authority is better bounded by constraints that hold as invariants over those objects than by an exhaustive resource enumeration. Such invariants include the owning customer, the tenant, an amount ceiling, read-only except named write actions, and a validity window. The runtime layer (Section 20.3.1) checks each concrete object against the constraint at the point of use.

mission_resource_access is defined by the Mission Resource Access Profile ([I-D.draft-mcguinness-oauth-mission-resource-access]); the Authority Set carries it on the same type-agnostic terms as any supported type (Section 5.5).

The following is an example of an Authority Set. The read entry is delegable to depth 2 and bounded to a Q3 issuance window by the resource_issued_after and resource_issued_before Common Constraints ([I-D.draft-mcguinness-oauth-mission-resource-access]); the write entry carries no delegation and so is non-delegable, because delegation is per 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" }]
    } },
  { "type": "mission_resource_access",
    "resource": "https://erp.example.com",
    "actions": ["journal-entries.write"],
    "constraints": {
      "max_amount": { "amount": "500.00", "currency": "USD" }
    } }
]

5.4. Subset Rule

A derived authorization_details entry is a subset of a reference entry when it is no broader under the subset relation the entry's own type defines; Section 5.5 states the general rule and each supported type defines its own relation (for mission_resource_access, [I-D.draft-mcguinness-oauth-mission-resource-access]). The AS MUST refuse to derive an entry that is not a subset, under its type's relation, of some Mission Authority Set entry.

The AS MUST refuse a request that would widen authority under a Mission after the approval event on any dimension (a new resource, action, actor, delegation path, longer duration, or constraint relaxation); broader authority requires a fresh approval event, either a new Mission or a successor ([I-D.draft-mcguinness-oauth-mission-expansion]).

The comparison is representational, not semantic. A candidate that compares as no broader can still permit effects the parent's purpose never contemplated; semantic narrowing is not a property this rule can provide.

Where the comparison relation cannot decide (an unrecognized member, an incomparable value), the posture is conservative refusal, as each consuming rule of this document states.

An entry equal to its reference entry, byte-identical under the canonical form of Section 15.2, is a subset of it for every type. This is the one case the subset rule decides without the type's own relation, and it is how an AS that has not declared narrowing for a type establishes a subset (Section 5.5).

5.5. Authorization Details Types

The Authority Set MAY include any AS-supported [RFC9396] authorization_details type an audience consumes; this document defines no type itself. ("Supported" here means the AS recognizes and documents the type: it appears in authorization_details_types_supported or, where the AS advertises the schema endpoint, as a key in its authorization_details_types_metadata_endpoint response, then the source of truth for the supported set (Section 17).) The Mission apparatus is type-agnostic toward every supported type:

  • an entry is committed by authority_hash and gated on Mission state the same way regardless of type;

  • narrowing and delegation use the subset and delegation semantics the type defines (Section 5.4, Section 12.5), under the transformation capabilities the AS declares for the type (below); and

  • evaluating the entry against a concrete request is the runtime layer's responsibility (Section 20.3.1), not the AS's.

5.5.1. Declared Transformation Capabilities

The subset rule is fully defined only for a type whose specification defines it. For every supported type, the AS declares three independent transformation capabilities; understanding one establishes none of the others:

  • narrowing: the AS understands the type's subset relation;

  • delegation: the AS understands the type's delegation semantics; and

  • projection: the AS establishes a safe scope projection for the type (Section 8.7).

The AS MUST NOT narrow, delegate, or project to scope an entry of a type for which it has not declared the corresponding capability; on an undeclared capability the entry is carried as approved.

Issuing an entry to an audience other than its original approved audience, including audience projection to a Resource AS ([I-D.draft-mcguinness-oauth-mission-cross-domain]), counts as narrowing and needs narrowing, not projection. Without narrowing, the AS MUST NOT issue an entry to any audience other than its original approved audience, or, except as scope under a declared projection, in any form other than exactly as approved, since it cannot prove that a transformed copy is still a subset of what was approved.

A type that declares delegation without narrowing 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 12.5). 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 AS declares the capabilities through these carriers, in order of preference:

  1. a mission_transformation_capabilities member in the type's entry in the authorization_details_types_metadata_endpoint response, where the AS advertises that endpoint (Section 17);

  2. an equivalently shaped member of its supported-type documentation; or

  3. deployment documentation naming the type as supported (Section 17).

Deployment documentation is always a sufficient carrier; a machine-readable carrier is additive. A mission_transformation_capabilities value is a JSON object with three OPTIONAL boolean members, narrowing, delegation, and projection; an absent member leaves that capability undeclared by this carrier, falling through to the next carrier in the order above.

5.5.2. Policy-Language Types

Type-agnosticism lets policy-language profiles compose without this document defining them: for example, an entry carrying a Cedar policy set ([I-D.draft-cecchetti-oauth-rar-cedar]), or an analogous AuthZEN policy entry, for an audience that evaluates it, alongside a general-purpose type such as mission_resource_access ([I-D.draft-mcguinness-oauth-mission-resource-access]).

The AS derives such an entry from the Mission Intent and bounds it by the Intent like any other, but does not interpret the carried policy beyond its type's declared capabilities; the resource server or policy decision point (PDP) evaluates it at request time.

The following is an example of an Authority Set with a Cedar policy entry for a finance audience that consumes Cedar, alongside a mission_resource_access entry for a calendar audience that does not. The Cedar policySet is abbreviated:

[
  {
    "type": "account_information",
    "rarFormat": "cedar",
    "policySet": "permit(principal, action, resource) when {...};"
  },
  {
    "type": "mission_resource_access",
    "resource": "https://calendar.example.com",
    "actions": ["events.read"],
    "constraints": { "window_days": 30 }
  }
]

Both entries are committed by the one authority_hash and bound to the Mission. The Cedar entry is evaluated by the finance audience's PDP; the mission_resource_access entry is enforced as in Section 8.

Because the Cedar profile defines no subset or delegation rule over policy sets, the AS carries the Cedar entry as approved, so it does not appear in a delegated token or cross-domain grant. Delegation controls on other entries, such as the mission_resource_access entry, apply to those entries only.

Invoking a Model Context Protocol tool or a function call is modeled as a mission_resource_access entry with no separate type; the mapping is specified in [I-D.draft-mcguinness-oauth-mission-resource-access].

6. Mission Approval

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 14) and its adjudication, not the event alone, determine whether a human decides at that event or an earlier standing consent authorizes the instance:

6.1. Authorization Code Protection

The direct realization runs as an OAuth 2.0 [RFC6749] authorization-code flow initiated from the PAR-issued request_uri (Section 4.2). Because the authorization code is the artifact the Mission grant binds to (Section 8.1.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.

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]).

6.2. Direct Approval Steps

Steps 1 to 3 establish the Approver, the Subject and the authority source, and check the derived Authority Set against that source. Step 4 establishes the effective expiry. Step 5 renders the derived Authority Set for consent, and Section 6.5 covers a change before the decision. Steps 6 and 7 compute the integrity anchors over the approved context and create the Mission atomically with the decision.

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.2.1), and steps 6 and 7, which continue the same procedure, commit the Mission (Section 6.2.2).

The steps of this section define the direct approval basis (approval_basis, Section 14); a companion profile that relocates a direct approval keeps them unchanged (Section 16).

Refusals follow Section 10.

6.2.1. Preparing the Approval

  1. Authenticate the Approver, subject to the approval-authentication floor and any client-requested strength (Section 6.8). 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.

  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 8.3). The Subject can be a workload or organizational principal (Section 6.7), established and mapped the same way.

    • Self-approval. When the Approver is the Subject, the Subject is the authenticated Approver.

    • Another principal or an external Subject. The rules of Section 6.3 apply at this step.

  3. Establish the authority source: whose authority the approval draws on, recorded as the Mission's authority_source (Section 6.7, Section 14). The AS MUST establish it from trusted configuration or authenticated governance state, never from client assertion. The AS MUST verify the Approver is authorized under local policy to activate the established source, and MUST verify the derived Authority Set lies within that source's authority (for organizational, within the governed policy identified by authority_source.policy). These are distinct checks: an organizational owner may be authorized to activate policy without personally holding every operational permission. The AS MUST refuse when either relationship cannot be established.

  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 14) and is rechecked at the creation commit (step 7).

  5. 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:

    • The consent object is the derived Authority Set, what the agent may do, not the goal or Mission Intent: 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.

    • 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.

    • Mission Capability Binding ([I-D.draft-mcguinness-mission-capability-binding]) states what the rendering presents about the source binding of a catalog-sourced action.

6.2.2. Committing the Mission

The same procedure continues from step 5:

  1. Compute the integrity anchors (Section 15.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.

  2. Create the Mission Record (Section 14) in the active state atomically with the approval decision and issuance of the authorization code, or, under a back-channel carriage profile (Section 16), 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. A deferred or relocated approval flow (Section 16) 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.

The Mission Record is what approval leaves behind: the approved content and its commitments (the approved Mission Intent, the Authority Set, and the integrity anchors over them); the principals (the Subject, the approved agent's client_id, and the approval_basis naming who consented and how); the authority source; the issuer's provenance (the policy version and the approval event's identifier); and the Mission's expiry and lifecycle state. Section 14 defines each member and when it is present.

6.3. Subject Establishment

These rules apply at step 2 of the direct approval steps (Section 6.2).

  • 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.

6.4. Rendering Safeguards

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, so crafted client text cannot pass as derived authority.

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. The enforcement table (Section 9.5) summarizes which party enforces each bound and what holds when that enforcer is absent. 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.

6.5. Changes Before the Decision

If any of the following changes between approval rendering and the approval decision, the AS MUST recompute the affected values and the anchors the Mission records, 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.7);

  • 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.

6.6. Approval Comprehension

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 (Section 20.1.1). Step 5 of Section 6.2 requires human-meaningful rendering; comprehension cannot be inferred from an approval or its integrity anchors.

A short task can legitimately have a large or varied Authority Set: an erasure request whose proposal or configured lookup (Section 5) yields dozens of delete entries across resources. The consent object remains the complete derived Authority Set. The following non-normative practices can help make it reviewable:

  • Group entries by resource and action, so the Approver reviews kinds of authority rather than a list of entries, while keeping material differences in constraints visible: a group of identical actions still shows an entry whose resource range or consumption bound is much broader than the rest.

  • Summarize with drill-down: a summary covering every resource, action, and bound, with each complete entry one interaction away. A summary is a view of the set, never a substitute for it.

  • Surface high-risk entries: make the irreversible, external-commitment, privileged-administration, and consumption-bounded authority of Section 6.8 prominent in the initial view, distinguishing materially different risks and bounds.

  • Split rather than approve: when the set is too large or varied for one decision, narrower Missions can keep each approval meaningful (Section 1.2).

Mission Consent Evidence ([I-D.draft-mcguinness-oauth-mission-consent-evidence]) defines layered rendering of a committed disclosure, including what its first layer carries, and lets the Approver ask the basis for an entry before deciding.

6.7. Authority Sources

A Mission draws its authority from one of three sources:

  • user-delegated: a delegating person's own authority;

  • service-owned: a workload's own provisioned authority; or

  • organizational: explicitly governed organizational policy with a named accountable owner.

The source names whose authority the approval draws on, recorded immutably as the Mission's authority_source; approval_basis records how drawing on it was activated (Section 14). The two compose: any source may activate under the direct basis or a standing-consent basis a companion defines.

Approval activates only authority the source already holds: the AS establishes the source and verifies the derived Authority Set against it before approval (Section 6.2, Section 13.1).

The subject-representation discipline is the same in every source:

  • The accountable principal is the record's approval_basis.consent_principal in every source; it is never inferred from the token sub.

  • sub carries a delegating person only in the user-delegated source. A service-owned or organizational Mission MUST record the workload or organizational principal as subject and MUST NOT record a human principal in its place. The injective mapping of Section 6.3 applies unchanged: that principal receives its own AS-local sub, denotes itself, and impersonates nobody. It MUST be an authorization subject the AS recognizes as a resource owner in its own right (the sub model of [RFC9068]), not only the task's beneficiary.

  • The actor model does not vary by source: client_id names the Agent, and delegates are carried in the act chain (Section 12).

6.8. Approver Authentication Strength

A deployment publishes 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. High-risk authority means irreversible, external-commitment, or privileged-administration actions under the deployment's classification, or a consumption bound ([I-D.draft-mcguinness-mission-metering]). This document requires no particular serialization.

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.3).

Requesting these parameters implies nothing about the authentication claims of an issued token, which describe the token's Subject, not the Approver (Section 8.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); max_age 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.2, 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.

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, and an AS MUST NOT read it back from, a Mission Intent member.

Where a deployment records Consent Evidence, the achieved values belong in its authentication_context member ([I-D.draft-mcguinness-oauth-mission-consent-evidence]); this document defines no Mission Record member for them.

6.9. Single Accountable Approver

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 14).

Where a deployment needs either, the Approval Governance Record ([I-D.draft-mcguinness-mission-approval-governance]) records it, and Consent Evidence can carry a partial presentation of that record through co_approvals and its approval-governance members ([I-D.draft-mcguinness-oauth-mission-consent-evidence]).

The adjudication.governance_record member (Section 14) marks an approval such a record backs, and Appendix C shows how each scenario assigns the three approval_basis roles.

7. Mission Lifecycle

A Mission is in one of two states:

The transitions are:

Table 3: Mission lifecycle transitions
From Event To Reason
(none) approval event active  
active revoke terminated revoked
active expires_at reached terminated expired

The Mission Lifecycle States registry (Section 23.7) holds these states, and the Mission Termination Reasons registry (Section 23.8) holds the reasons. A companion profile MAY register an additional state for a lifecycle it introduces (for example, a paused state); only active permits issuance. 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.

7.1. Mission Termination

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 23.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 never changes 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.

For a transition period, a consumer of a report that still carries revoked, expired, completed, superseded, or cascaded as a Mission's state MAY read it as terminated with that reason (cascaded as parent_terminated) and the facts the report retained; an emitter never reports those values as a state. That reading is local: the consumer never re-emits or re-signs it, and it verifies a signed artifact over its original bytes, which it retains, before reading it this way.

7.2. Revocation

A Mission is revoked when the AS receives an authorized revocation for it. A deployment MUST provide an authenticated means for the Subject, the Approver, or an administrator to revoke a Mission by mission_id, independent of possession of any token (so a Mission can be stopped even when no refresh token is held).

The wire shape of that operation is out of scope for this document. A deployment-defined authenticated surface satisfies this requirement; Mission Status ([I-D.draft-mcguinness-oauth-mission-status]) defines an interoperable revoke operation, authorized under its own lifecycle authorization policy, which a deployment can serve alone under that document's revoke-only conformance class.

As Section 2.1 of [RFC7009] permits, a deployment's revocation policy can 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: an already-issued access token remains valid until it expires (Section 8.2), so a token can outlive a transition of its Mission by at most the token lifetime.

Token introspection (Section 11) is a state-observable overlay that lets a resource server see Mission state per request and refuse a revoked Mission's token before the token expires; Mission Status specifies another, a status surface keyed by mission_id with signed responses. A deployment whose consumers rely on Mission state beyond a token's lifetime offers one of these, so they read current state rather than infer it from token validity.

8. Mission-Bound Access Tokens

An access token issued under a Mission takes one of two forms:

A deployment whose AS can issue neither deploys a Mission Authority Server ([I-D.draft-mcguinness-mission-authority-server]), which governs ordinary tokens at the enforcement layer.

The first four subsections follow one issuance: resolving the Mission from the presented grant (Section 8.1), the checks every issuance passes (Section 8.2), and the token (Section 8.3) and its response (Section 8.4).

8.1. Binding the Mission to the Grant

A Mission is independent of any OAuth grant: it is identified globally by the pair (issuer, id) (Section 14), 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 8.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 continuation transport establishes later for the same Mission ([I-D.draft-mcguinness-oauth-mission-continuation]).

8.1.1. Establishing and Resolving a Binding

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 16). The binding is server-side and is what "the referenced Mission" in Section 8.2 refers to.

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; or

  • the Mission-bound subject_token on Token Exchange (the actor_token identifies the delegate, Section 12.2).

It then applies the gating of Section 8.2.

A Mission MAY carry zero or more grant bindings. Beyond the authorization-code lineage established at approval, a refresh-token family a continuation transport establishes later (above) is a further binding, 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. The predecessor parameter of [I-D.draft-mcguinness-oauth-mission-expansion] is an example: it selects the Mission a successor is created from and does not reassign an existing binding.

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.

8.1.3. Mission State Across Bindings

Non-active state gates every future derivation across every Mission grant binding (Section 8.2). 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 7.2, Section 11).

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; a Mission Management companion ([I-D.draft-mcguinness-oauth-mission-management]) can standardize that index's wire surface.

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 7), so reprocessing the same timeout changes nothing.

8.1.4. Mission Identifier and Expiry in Responses

A client learns its mission_id from the mission claim's id on each issued token (Section 8.8) or from the token response.

This document defines mission_id as a token-endpoint response parameter: a string carrying the Mission Identifier, returned alongside the issued token. An AS SHOULD return it, because a client need not parse the access token and cannot read the mission claim of a token that is encrypted or opaque to it. It is an informational reference only: presenting it authorizes nothing (Section 8.1.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 14), the common member of every Mission-creating success response, whatever surface completes the creation. The success response that first delivers a newly created Mission's identifier or credential MUST carry it, and a Mission-bound token response SHOULD carry it beside mission_id: expires_in describes the access token's lifetime, not the Mission's, and the effective expiry can be shorter than the requested intent.expires_at.

A creation replay deduplicated under the applicable operation identifier (approval_event_id for direct approval (Section 14), or the identifier a Mission-creating profile defines) returns the committed effective value unchanged. On OAuth token responses the member is additionally registered as a token-endpoint response parameter (Section 23.1). It is informational in the same way: presenting it authorizes nothing.

8.2. Issuance Gating

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 a cross-domain grant issuance ([I-D.draft-mcguinness-oauth-mission-cross-domain]). A companion profile bounds the number of derivations under a Mission ([I-D.draft-mcguinness-oauth-mission-derivation-limits]).

A derivation passes these checks, each stated where cited:

  1. the Mission resolves from the presented grant (Section 8.1.1);

  2. the Mission is active (Section 7, and below);

  3. each emitted entry is a subset of a Mission Authority Set entry (Section 5.4);

  4. any emitted scope meets Section 8.7; and

  5. each token's exp does not exceed the Mission's expires_at (Section 8.6).

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.

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 below, still apply.

The error code alone does not tell a client which gate refused. On a refusal under this section the AS SHOULD include, alongside error, the mission_error token-error-response member (Section 23.1) with one of the values revoked, expired, or superseded (where a companion defines supersession), the Mission's termination reason (Section 7.1).

The mission_error member is diagnostic only: it grants nothing, an unrecognized value is ignored, and it is returned only to the authenticated client presenting the Mission's grant.

Derived tokens SHOULD be short-lived so that a transition to terminated takes effect promptly without per-request revocation checks.

8.3. Token Claims

[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]). In addition to what that profile 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 8.8);

  • sets sub to the AS-local sub the AS maps the Mission's Subject to (Section 6);

  • 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 8.4, Paragraph 1), except that a token the AS issues only for presentation back to itself at a Token Exchange, such as a designation (Section 12.1), names in aud the client that presents it;

  • MAY carry an act claim when the agent has delegated execution (Section 12.2);

  • MAY carry a scope claim, subject to Section 8.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).

The primary access 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 20.4.1).

A delegated token is sender-constrained to the delegate's own key (Section 12.2); the cross-domain companion requires sender-constraint for credentials that cross a trust domain ([I-D.draft-mcguinness-oauth-mission-cross-domain]).

An AS 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.

Every emitted authorization_details entry is a subset of a Mission Authority Set entry (Section 5.4).

8.4. Audience and Token Response

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 (for mission_resource_access, [I-D.draft-mcguinness-oauth-mission-resource-access]). 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.

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). The mission_id response parameter carries the Mission reference beside it (Section 8.1.4).

The following is an example of a refresh request that narrows the canonical ERP Mission (the worked example of Section 14) 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 8.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 8.2). 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 8.1.4). 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" }]
      } }
  ]
}

8.5. Refresh Tokens

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.

8.6. Authentication Claims and Lifetime

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.8). 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 8.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. The cross-domain companion ([I-D.draft-mcguinness-oauth-mission-cross-domain]) specifies how this bound extends transitively to tokens minted in another trust domain.

8.7. Scope Projection

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 (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:

  • aggregates a broader action;

  • spans more resource instances or paths than the entry;

  • carries rights the target's local scope interpretation implies; or

  • arises from the union of several entries.

To emit scope for an entry, the AS:

  1. determines the target resource server or audience for the token;

  2. 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;

  3. 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;

  4. omits scope for an entry where the target's enforcement path consumes authorization_details instead;

  5. 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; and

  6. for a multi-audience token, establishes the condition independently for each audience; a single-audience token (Section 8.4) remains preferred.

Unknown scope semantics, unknown resource server enforcement behavior, or an ambiguous or stale mapping all fail closed under step 5 (Section 10). 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.

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 10), 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 is a step 5 failure 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.

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.

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 (for mission_resource_access, [I-D.draft-mcguinness-oauth-mission-resource-access]).

The runtime profile's enforcement-scope declarations ([I-D.draft-mcguinness-mission-runtime]) can reference the same mapping for the paths it covers; this rule does not depend on that profile.

8.8. Mission Claim

The mission claim is a JSON object:

id:

REQUIRED. A string. The Mission Identifier (Section 14.5).

issuer:

REQUIRED. A string. The Mission's issuer (Section 14). 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 ([I-D.draft-mcguinness-oauth-mission-cross-domain]).

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 14), 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 7).

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); approval_basis.type is provenance, not authority (Section 14). An authorized introspection caller can receive authority_hash and approval_basis.type (Section 11.1).

The mission claim is an open object (Section 16): 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"
  }
}

9. Resource Server Enforcement

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 11.2).

An opaque Mission-bound token is enforced from its active introspection response or issuer-local resolution instead, under the same rules (Section 11.4).

9.1. Enforcement Requirements

A resource server:

  1. MUST treat authorization_details as the authoritative expression of authority and enforce each applicable entry according to that entry's own type specification (for mission_resource_access, [I-D.draft-mcguinness-oauth-mission-resource-access]). Where more than one carried entry applies, entries are alternative grants of authority, not conjunctive filters, unless the entry's type states otherwise.

  2. 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 refuse the request (for example, a 403 with the insufficient_scope error code [RFC6750], or the deployment's usual insufficient-authority error) 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.

  3. 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.

  4. 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 B.6); the approved agent is recorded only in the Mission Record (Section 14) at the issuer.

  5. MUST, when configured to require the mission claim for a Mission-governed resource, reject a token that lacks it with the invalid_token error code. The issuance-side duty that pairs with this rejection is stated in Section 4.3, the downgrade it prevents in Section 20.1.2, and the metadata that advertises the requirement in Section 18.

  6. 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 cross-domain profile it has adopted ([I-D.draft-mcguinness-oauth-mission-cross-domain]) explicitly establishes the permitted relationship between the two. It MUST reject a token that fails either check with the invalid_token error code. 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 11.4).

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 11) to observe Mission state per request.

9.2. Mission-Unaware Resource Servers

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.

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 18); a resource server that serves such a resource is, by that requirement, Mission-aware.

A Mission-unaware resource server that authorizes only from scope operates within the Mission only to the extent the AS established a safe projection for it at issuance (Section 8.7). Constrained authority that no safe projection carries is enforced only where a resource server, or a runtime layer, evaluates authorization_details.

9.3. Carried Authority

An entry whose type-defined enforcement a resource server cannot complete fails closed because a type-defined constraint narrows authority: treating an unenforceable key or member as absent, or reducing it to disclosure-only, would widen the grant.

The baseline token carries no authority_hash (Section 8.8). Where a deployment discloses it to a resource server (through introspection's disclosure privilege, Section 11.1, or a companion profile that carries its own copy), it is an audit correlator, not an enforcement input, and not a cryptographic proof that the carried entries are a subset of the approved set.

That subset relationship is an assertion by the AS, authenticated by the token signature. Mission Approved-Set Verification ([I-D.draft-mcguinness-oauth-mission-approved-set-verification]) defines an independent check for a resource server that needs more than that assertion.

9.4. Denial Responses

A resource server denial falls into one of four cases, each using the OAuth challenge for its own failure class (Section 10 gives the codes):

  1. Weak or stale Subject authentication. Where the deployment conveys the authentication of the token's Subject, through the claims of Section 8.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.8), not a resource server challenge.

  2. 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.

  3. 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.6).

  4. Unenforceable constraint. An applicable entry carries a type-defined member or constraint the resource server cannot enforce, and the request fails closed under 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 or an expansion where that companion is deployed.

constraint_unrecognized:

An applicable entry carries a type-defined member or constraint the resource server cannot enforce, and the request fails closed. 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 20.3.2).

9.5. Enforcement Responsibilities

Every bound this document defines is enforced by a party this document names. The following table summarizes which party enforces each bound a Mission carries and what holds when that enforcer is absent. Where a row names a type specification, it is the one for mission_resource_access ([I-D.draft-mcguinness-oauth-mission-resource-access]):

Table 4: Enforcement of an entry's resource, actions, and constraints
Bound Enforced by When that enforcer is absent
resource and actions any resource server that enforces mission_resource_access per its type specification (Section 9) a scope-only resource server is served only where the AS established a safe scope projection (Section 8.7); the AS refuses issuance to it otherwise
per-entry constraints a resource server that understands and enforces the key, per that type's specification (Section 9) a Mission-aware Resource Server fails closed; a scope-only resource server is served only where the projection independently accounts for the constraint (Section 8.7)

9.6. Remediation Grains

A denial can carry independent remediation grains: separate remediation mechanisms, each naming a next step without granting anything. The three remediation grains are:

mission_denial:
  • Carriage: WWW-Authenticate attribute

  • Defined by: This document (Section 9.4)

insufficient_authorization with authorization_remediation:
Requestable denial:

A resource server can also respond with the insufficient_authorization error code and the authorization_remediation parameter ([I-D.draft-ietf-oauth-rar-metadata-remediation]), which names what mission_denial: insufficient_authority only points at. 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 8.4), where they derive under this document's ordinary rules (Section 5): of an advertised, schema-valid type (Section 17), 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 8.5), 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), or an expansion where that companion is deployed ([I-D.draft-mcguinness-oauth-mission-expansion]). A client holding no refresh grant that covers the entries proposes them as for a new Mission.

A third grain, the requestable denial of [AuthZEN.ARAP], profiled by [I-D.draft-mcguinness-mission-authzen], routes the same denial into a governed access request rather than a fresh derivation.

The three grains compose: a deployment can offer any subset, and none widens authority beyond what Section 5 derives from the same proposal unremediated.

10. Error and Challenge Mapping

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.

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.

Table 5: Failures not confined to one surface
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 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 8.4) 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 8.7); or, where the AS applies Section 9's delegated-token routing rule at issuance, the delegated token's target is not known to be Mission-aware 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 8.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 8.1.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) 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 8.2). Detail: mission_error (Section 23)
Token endpoint (Section 5.4, Section 8.5): 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
Table 6: PAR and authorization endpoint failures
Surface / failing input Base OAuth error and optional detail
PAR: malformed Submission envelope or Intent (schema, unknown member, invalid value) (Section 4.2) 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) 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) 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) invalid_request (Section 4.1.2.1 of [RFC6749], Section 5.2 of [RFC6749]). Detail: safe error_description
Authorization request: scope includes openid and the Approver is not the Subject (Section 6.8) invalid_scope (Section 4.1.2.1 of [RFC6749]). Detail: safe error_description
Authorization decision (Section 6.2, Section 6.8, Section 5.1): the Approver declines, approval authentication fails the floor or a requested acr_values or max_age, or a well-formed request (including configured-mapping mode) is refused by AS policy 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; otherwise none unless a defined extension applies
Table 7: Token Exchange failures
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 12.4): the authenticated client is not the Mission's approved agent invalid_request (Section 2.2.2 of [RFC8693]). Detail: safe error_description
Delegated token exchange (Section 12.2): the subject_token is not a designation this AS issued naming the requesting client invalid_request (Section 2.2.2 of [RFC8693]). Detail: safe error_description
Designation (Section 12.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 12.5): narrowing leaves no entries for the delegate invalid_target (Section 2.2.2 of [RFC8693]). Detail: safe error_description
Token exchange using Section 12.3: required Client Attestation fails validation invalid_client_attestation. Detail: no instance-identity disclosure
Token exchange using Section 12.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
Table 8: Protected resource challenges
Surface / failing input Base OAuth error and optional detail
Protected resource: a token lacking the mission claim, where the resource requires it (Section 9) 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) insufficient_user_authentication (Section 3 of [RFC9470]). Detail: acr_values or max_age
Protected resource: DPoP proof missing, invalid, or mismatched (Section 9) DPoP invalid_token challenge (Section 7.1 of [RFC9449]). Detail: none
Protected resource: DPoP nonce required, missing, or stale (Section 9.4) DPoP use_dpop_nonce challenge (Section 9 of [RFC9449]). Detail: fresh nonce
Protected resource: certificate-bound token's presented certificate mismatch (Section 9) Bearer invalid_token challenge (Section 3.1 of [RFC6750], per Section 3 of [RFC8705]). Detail: none
Protected resource: insufficient carried authority, or an unenforceable constraint (Section 9.4) insufficient_scope (Section 3.1 of [RFC6750]) or the RAR-remediation challenge (Section 9.6). Detail: mission_denial (Section 9), minimized

In these tables, which evidence types are required follows [I-D.draft-mcguinness-oauth-mission-submission-evidence], and invalid_client_attestation is the error code that Section 5.2 of [I-D.draft-mcguinness-oauth-client-instance-id] specifies.

11. Mission State via Token Introspection

A resource server consults the issuer about a Mission-bound token in one of three cases, with different obligations:

An AS MAY support OAuth 2.0 Token Introspection [RFC7662] for Mission-bound access tokens. When it does, the response for such a token carries, in addition to the standard members, a mission member: a JSON object with the following members:

Only the Mission issuer reports state, termination, proposal_hash, authority_hash, approval_basis, and authority_source (Section 11.3). The last four are audit and correlation signals, not enforcement inputs (Section 9); each is disclosed only as Section 11.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 composite-active rule (Section 11.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]).

11.1. Caller Authorization and Minimization

Strengthening Section 2.1 of [RFC7662], which requires some form of authorization to access the introspection endpoint, the AS:

  • MUST authenticate the calling party.

  • MUST return Mission data only to a caller authorized to receive it, in particular a resource server that is an audience of the token.

  • MUST audience-filter the response, returning the authorization_details entries and Mission data relevant to the caller's audience and not disclosing entries addressed to other audiences (Section 8).

These rules apply equally to the mission member of an active: false response (Section 11.2).

Disclosure is member-scoped as well as caller-scoped. proposal_hash, authority_hash, approval_basis, and authority_source serve audit and correlation consumers, not resource server enforcement, and the AS MUST disclose each only to a caller the deployment has granted that member's disclosure privilege. By default, an audience-authorized resource server receives the audience-filtered enforcement projection above, without them.

A mission member that a companion profile defines for disclosure here follows the same member-scoped rule and is not an enforcement input.

11.2. Composite Active State

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 (Section 12.1) authorizes no resource access: the AS MUST return active: false for one, with no mission member.

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.

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 11.1) govern that deviation.

11.3. Issuer-Only Members

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]).

11.4. Introspected Token Consumption

The RFC 9068 JWT of Section 8 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 12): everything Section 8 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 11.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), the fail-closed duties included.

  • 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 per-use freshness rule of Section 11 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:

  1. 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 11.2), and the token's own authority;

  2. MUST authorize the resource server and minimize disclosure to it as Section 11.1 requires for an introspection caller; and

  3. 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.

11.5. Introspection Response Examples

The following is an example of an introspection response for the canonical ERP token (Section 8.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 11.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"
    }
  }
}

12. Delegation Within a Mission

Delegation is an optional capability (Section 19). 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 12.4), 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:

  1. The delegating party obtains a designation that names the delegate (Section 12.1).

  2. The delegate redeems that designation for a delegated token (Section 12.2).

Delegating party            AS                        Delegate
  | Token Exchange:          |                            |
  | subject_token =          |                            |
  | Mission-bound token,     |                            |
  | audience = delegate ---->|                            |
  |<------ designation ------|                            |
  |---------------------- designation ------------------->|
  |                          |<------ Token Exchange:     |
  |                          |        subject_token =     |
  |                          |        designation         |
  |                          |------- delegated token --->|

12.1. Designation

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 12.5).

A designation the AS issues:

  • carries a subset (Section 5.4) of the presented token's authority, and the same mission claim (Section 8.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 proves its own key in the delegated exchange (Section 12.2), and the delegated token's act renders the AS's accounting (Section 12.5); and

  • MUST expire shortly after it is issued, and no later than the presented token or the Mission's expires_at.

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 12.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 the AS reports one inactive at introspection (Section 11.2).

12.2. Delegated Exchange

A delegate obtains a delegated token by Token Exchange ([RFC8693]), presenting a designation that the delegating party obtained for it (Section 12.1). 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 12.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 an actor_token or by its own client authentication, and the AS asserts the actor itself (Section 12.5).

  • Subject is stable. sub remains the Mission's Subject. The delegate is an actor, not the Subject.

  • client_id keeps its ordinary meaning. A delegated token's client_id is the OAuth client that requested it (Section 4.3 of [RFC8693], Section 2.2 of [RFC9068]). The originally-approved agent remains recorded in the Mission Record (Section 14, Appendix B.6).

  • 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).

  • 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.

  • The mission claim is unchanged. The delegated token carries the delegating token's mission claim (Section 8.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 8.3) 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 8.2). The AS MUST evaluate every redemption of a designation afresh, as a derivation of its own: the credential the designation was derived from, and that credential's grant, are still valid; the Mission is active; and the delegation policy (Section 12.5) and the Mission's current authority admit the result. An earlier redemption establishes none of these.

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 Child Mission ([I-D.draft-mcguinness-oauth-mission-child-delegation]) or an expansion successor ([I-D.draft-mcguinness-oauth-mission-expansion]), 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 12.5 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.

12.3. Instance Context in Delegated Tokens

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 12.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 12.2 and Section 12.5 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 10 gives the error codes for these refusals.

If the exchange issues a refresh token, the grant-continuity rules of Section 5.1 of [I-D.draft-mcguinness-oauth-client-instance-id] apply alongside Section 8.1; 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.

12.4. Self-Exchange Down-Scoping

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 12.1) names a delegate, so it is not a self-exchange, and these rules do not apply to it. A no-actor exchange is subject to the following:

  1. 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 14). A delegate narrows only through a delegated exchange that names it in the act chain.

  2. The result MUST be a subset (Section 5.4) of the presented token's authority; it carries the same mission claim (Section 8.8) and adds no act chain.

  3. The exchange is a derivation, gated on the Mission being active (Section 8.2).

12.5. Delegation Constraints

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, and it is carried with the entries wherever they go, including across a cross-domain projection where that profile's provenance rule keeps it ([I-D.draft-mcguinness-oauth-mission-cross-domain]).

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. A credential projected across a trust domain carries no act chain and enters the target domain at depth 0 ([I-D.draft-mcguinness-oauth-mission-cross-domain]).

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 12.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;

  • a designation (Section 12.1) and a self-exchange (Section 12.4) add none; and

  • a cross-domain projection is the one defined reset.

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:

  1. The entry's type defines a delegation policy for the entry. An entry carrying no type-defined delegation policy is non-delegable, the default.

  2. 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).

12.6. Delegated Token Example

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"
  }
}

sub is still the user. client_id is tool-runner-7, the delegate that authenticated the Token Exchange and requested this token (Appendix B.6); it matches the outermost act only because tool-runner-7 authenticated the exchange itself. client_id does not name s6BhdRkqt3, the originally-approved agent, whose identity remains recoverable from the Mission Record via mission_id (Section 14).

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.

14. Mission Record

A Mission is the durable record created at the approval event; a Mission Identifier (Section 14.5) identifies it. Its members are immutable after creation, except state and the termination member written once when the Mission terminates (Section 7.1).

Record member names omit the mission prefix because the record is the Mission. Prefixed names, such as the mission_intent request parameter and the mission_id response parameter, belong to surfaces that reference a Mission from outside it.

Member names are spelled out (issuer, expires_at, created_at) and spelled identically on every surface. The compact JWT names (iss, exp, iat) describe a signed artifact's own envelope, or identify a party in an {iss, sub} object, not the Mission.

Like the mission claim (Section 8.8), the record is open (Section 16): 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.

The following subsections define the record's members.

14.1. Identity and Lifecycle Members

id:

REQUIRED. A string. The canonical Mission Identifier (Section 14.5).

issuer:

REQUIRED. A string. The issuer URL of the Mission Issuer that approved the Mission. Equals the iss of tokens that AS derives; for cross-domain tokens it remains the issuer AS that approved the Mission even though the issuing iss differs ([I-D.draft-mcguinness-oauth-mission-cross-domain]).

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 7.

termination:

CONDITIONAL. An object, present exactly when state is terminated: the reason and instant the Mission terminated (Section 7.1).

14.2. Approved Content and Commitments

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:

REQUIRED. A string. The authority commitment over the Authority Set (Section 15.1). It is not carried on the baseline mission claim (Section 8.8).

intent_hash:

REQUIRED. A string. The integrity commitment over the approved Mission Intent (Section 15.1), making the recorded task tamper-evident.

proposal_hash:

REQUIRED when proposed_authority is present, absent otherwise. A string. The integrity commitment over the recorded proposed_authority (Section 15.1). It is approval-time provenance, not enforcement input, and is not carried on the mission claim (Section 8.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 15.2). Each element carries exactly these members:

type:

The entry's evidence type.

artifact_hash:

An integrity anchor (Section 15.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.

submission_evidence is provenance, not enforcement input, and is not carried on the mission claim (Section 8.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 21.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 15.1, Section 16).

14.3. Principals and Approval Basis

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 13). 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 13).

An unrecognized type, and likewise an unrecognized adjudication.kind (Section 14), 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). Unlike an unrecognized lifecycle state (Section 7), an unrecognized value here does not by itself invalidate or deactivate the Mission.

consent_principal:

REQUIRED. An object with iss and sub. The accountable human (or human-accountable principal) who consented. MAY equal subject.

activation:

REQUIRED. An object naming what activated this Mission instance, shaped by type. For direct: approval_event_id, mirroring the record's own approval_event_id (below).

activation_actor:

REQUIRED. An object with iss and sub. Who or what triggered this instance. For direct it equals consent_principal: the Approver triggers their own approval.

root_commitment:

REQUIRED. A string. The commitment to the consented root: an integrity anchor where the root is a committed object, otherwise the committed reference that identifies it. For direct, this Mission's own authority_hash.

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 and Section 13). 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. An unrecognized value is handled under the same rule as approval_basis.type (Section 14.3).

governance_record:

OPTIONAL. A boolean. true when an Approval Governance Record is recorded for this approval event ([I-D.draft-mcguinness-mission-approval-governance]), joined by this Mission's own approval_event_id. It never changes kind, which follows the basis (below and Section 13). Approval Governance aligns the record's accountable assertion, where it carries one, with that kind: a governed decision still names its mechanism, and the record supplies the fuller assertion set behind it, including any multi-assertion set, never flattened into it.

For kind: human: no additional kind-specific members; the deciding human is consent_principal.

For kind: policy: policy, a REQUIRED object with id and version identifying the deciding policy or workflow. It decides deterministically over recorded inputs, so re-evaluating that version over them re-checks the decision. A model's output can be one such input, recorded with the model's identifier and version: it can refuse an activation or narrow the authority it activates, and the AS MUST NOT let it supply or widen authority. A model is never itself the deciding policy or workflow.

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 13).

approved_at:

Absent for direct, whose approval event carries its own instant (Section 6); a standing-consent basis carries it (Section 13).

For direct, activation.approval_event_id MUST identify a human approval event (Section 6). Approval Governance states how a record backing a direct approval keeps that human decision as its accountable assertion ([I-D.draft-mcguinness-mission-approval-governance]).

approval_basis is provenance: none of the record's integrity anchors, such as intent_hash, authority_hash or proposal_hash, covers it (Section 15.1); a profile that commits the Mission Record itself covers it under that profile's own anchor. Two optional profiles commit it (Section 20.1.1). Mission Audit Transparency's approval-event registration ([I-D.draft-mcguinness-mission-audit]) covers the record at creation except its state and termination. Approval Governance's Approval Context Commitment ([I-D.draft-mcguinness-mission-approval-governance]) covers a closed manifest of creation facts that includes approval_basis. Its disclosure through introspection follows Section 11.1. It is not carried on the baseline mission claim (Section 8.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.7), established at the approval event (Section 6) and immutable thereafter, like approval_basis. Members:

type:

REQUIRED. A string: user_delegated, service_owned, or organizational. An unrecognized value is handled under the same rule as an unrecognized approval_basis.type (Section 14.3): it is preserved unchanged as opaque provenance and does not by itself invalidate or deactivate the Mission, and only an operation that itself requires recognized source semantics refuses (for example, applying the source's authority ceiling or its governed policy). An AS MUST NOT approve a Mission whose authority source it does not recognize.

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. digest is a prefixed commitment (Section 15.3) whose exact committed input and construction the policy's format specifies: its species and, for an envelope anchor, its typ, iss, and value. The party that produces the reference computes digest; a consumer holding the policy can reproduce it, and one that does not compares it as an opaque value.

authority_source 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.

14.4. Provenance and Expiry

policy_version:

REQUIRED. A string. An opaque audit correlator naming the derivation policy version in effect at the approval event; the policy itself does not travel.

approval_event_id:

REQUIRED. A string. A unique identifier of the approval event, used as the approval idempotency key: a retried or duplicate delivery of the same approval decision (a replayed callback, a double-submitted consent form) MUST NOT create a second Mission, and the AS deduplicates on this identifier.

created_at:

REQUIRED. A string. RFC 3339 timestamp of creation.

expires_at:

REQUIRED. A string. An RFC 3339 date-time: the AS-established effective Mission expiry (Section 7, Section 8.2). It MUST be later than created_at and MUST NOT be later than intent.expires_at, the requested ceiling (Section 4).

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.

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.

14.5. Mission Identifier Format

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 8.1.4).

14.6. Mission Record Example

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 15.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.

15. Integrity and Commitments

This section defines how the anchors the Approver consents to at the approval event (Section 6) are constructed, canonicalized, and bound. The Mission Record (Section 14) records them, and the test vectors (Appendix E) pin the construction byte-for-byte.

15.1. Integrity Anchors

Every anchor is computed the same way over a domain-separated, issuer-bound envelope:

  1. Construct the envelope, where typ selects the committed object and value is that object:

    {
      "typ": "<mission-intent | mission-proposed-authority
              | mission-authority-set | mission-activation-policy>",
      "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).

    • For proposal_hash, typ is mission-proposed-authority and value is the submitted authorization_details array exactly as recorded (Section 4.3); the anchor is present 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.

    • For an activation policy reference's digest, typ is mission-activation-policy and value is the policy snapshot object that Section 13.2 defines.

  2. Canonicalize the envelope with JCS [RFC8785].

  3. Compute SHA-256 [RFC6234] over the canonical bytes.

  4. 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 15.3).

The anchors this section lists, and the Authority Set entry commitment below, bind the AS issuer. The digest of an authority_source.policy reference (Section 14.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.

intent_hash and authority_hash 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 (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 16): additional committed objects use this same envelope with a new typ and the canonicalization below.

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]). mission- prefixed values, used by this document and the profiles that extend it, form a namespace coordinated through this document's change controller.

This document also defines the Authority Set entry commitment, the envelope above with typ mission-authority-entry, iss the Mission issuer, and value a single Authority Set entry object exactly as recorded (Appendix E). 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.

authority_hash likewise 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.

15.2. Canonicalization Rules

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 15.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, as mission_resource_access does for its prefix-match resource containment test ([I-D.draft-mcguinness-oauth-mission-resource-access]), it applies to that comparison alone: the default resource equality test remains an exact match, and anchor computation is always byte-exact over the recorded values.

15.3. Commitment Mechanisms

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 15.1 (intent_hash, proposal_hash, authority_hash, an activation policy reference's digest, 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 (for example, a runtime parameter digest).

  • 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 (for example, a work-product artifact digest).

The prefix and agility rules below bind all three species. The I-JSON rule binds the two JSON species. The envelope and typ discipline of Section 15.1 binds envelope anchors alone.

This section instantiates 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.

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, as the Mission Resource Access Profile's Common Constraints do for constraint values ([I-D.draft-mcguinness-oauth-mission-resource-access]).

The security considerations of [RFC8785] apply to every JCS computation.

The algorithm prefix is the agility mechanism. sha-256 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. These rules 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 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:

  1. the carrier and schema of any parallel commitment;

  2. the binding that proves the old and new values commit to the same object;

  3. producer behavior during the transition;

  4. verifier selection and downgrade behavior when recognition sets differ; and

  5. the transition procedure itself.

16. Extensibility

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:

16.1. Extension Points

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.

  • 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 (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 23.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) 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; it does not make an AS implement, recognize, or trust any member.

  • Integrity anchors. Additional committed objects use the same domain-separated, issuer-bound envelope with a new typ (Section 15.1). A consent-disclosure commitment, an instruction-text attestation, or a delegation receipt can be committed this way without changing this document. A profile that commits an evidence or disclosure object MUST commit it with this envelope and a typ that meets Section 15.1, 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 8.8), optionally extended with collision-resistantly named members (for example, an intent_hash for audit), and is never authority-bearing on its own.

  • The mission claim. It is an open object: additional, collision-resistantly named members can be carried in it (for example, a runtime decision reference, a delegation receipt, or an attestation reference), under the consumer rules of Section 8.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 14 states.

  • Lifecycle state and termination reason. The lifecycle state space (Section 7) is open to additional states that companion profiles register in the Mission Lifecycle States registry (Section 23.7) for lifecycles they introduce. The termination reasons (Section 7.1) are likewise open to reasons that companion profiles register in the Mission Termination Reasons registry (Section 23.8). Under the forward-compatibility rule of Section 7, only active permits issuance.

  • Approval-event sequencing. The approval-event steps, their order, and the atomicity of record creation with the approval decision are fixed by Section 6.2; 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), provided the steps and their atomicity hold unchanged and no Mission reference exists before the record is active; the Mission Deferred Approval companion is such a profile ([I-D.draft-mcguinness-oauth-mission-approval]). A back-channel carriage profile (Section 4.2) MAY instead couple the approval decision to establishing the Mission grant binding and activating for redemption a grant the profile defines, such as a device code issued while the request was pending, provided the steps and their atomicity with the approval decision hold unchanged and no Mission reference exists before the record is active; the Mission then binds to that profile-defined reusable grant (Section 8.1.1).

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 16.2 states the general rule these extension points follow.

16.2. Namespace Taxonomy

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 23.7), Mission Termination Reasons (Section 23.8), and Mission Intent Members (Section 23.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 8.8) and the Mission Record members (Section 14), 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 15.1) names a hash domain, not a representation crossing a protocol boundary, and is not a media type.

17. Authorization Server Metadata

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 19): 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 8), and the mission JWT claim (Section 8.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 20.1.2). Where the deployment's AS cannot change, the standalone Mission Authority Server ([I-D.draft-mcguinness-mission-authority-server]) is the governed alternative.

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 20.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]): the approved-set commitment a Mission-aware client relies on. 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).

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:

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 delegation and for the companion's cross-domain grant issuance. 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.

18. Protected Resource Metadata

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 8.8) is rejected (Section 9). If omitted, the default value is false.

A type-defined authorization_details member may define its own constraint-discovery surface; mission_resource_access's is defined by the Mission Resource Access Profile ([I-D.draft-mcguinness-oauth-mission-resource-access]).

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.

19. Conformance

The smallest useful conforming deployment is a Mission Issuer that:

A scope-only resource server is served only where the AS established a safe scope projection for it (Section 8.7). 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 19.1), the evidence dispatch and refusal rules included even when it supports no evidence type, and the deployment still provides the authenticated revocation means of Section 7.2.

19.1. Conformance Roles

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, Section 14);

  • issuance of Mission-bound access tokens carrying the mission claim (Section 8), as the RFC 9068 JWT or as an opaque reference token under the introspected consumption mode (Section 11.4);

  • the subset rule (Section 5.4); and

  • gating of issuance on Mission state (Section 8.2).

An AS can conform as a Mission Issuer without supporting any Intent Submission Evidence type. Such an AS refuses every presented entry as an unsupported type under the dispatch and refusal rules (Section 4.4), with the invalid_mission_intent_evidence error code. It need not implement the evidence framework of [I-D.draft-mcguinness-oauth-mission-submission-evidence] for this configuration. The companion defines conformance for ASs supporting an evidence type, whether its evidence is optional or required.

A Mission-aware Resource Server implements resource server enforcement (Section 9). 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 11.4).

In either form, it enforces each applicable entry its tokens carry under that entry's type, which for mission_resource_access is work a plain [RFC9068] resource server does not do.

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 (Section 8.4); and

  • obtaining mission_id from the mission_id token-response parameter or the mission claim's id (Section 8.1.4), treating it as a reference, not a credential.

19.2. Optional Capabilities

Beyond these mandatory roles, an implementation can additionally claim three OPTIONAL capabilities. Each is independent, and an implementation that supports none of them is still conformant:

  • Delegation (Section 12): issuing designations (Section 12.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 primary tokens.

  • Introspection (Section 11): 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 11.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:

    1. the Mission reference (mission.id, mission.issuer) and the authority_hash the projection carries, intact;

    2. authority that only narrows (Section 5.4);

    3. projection performed only by, or under the authorization of, the Mission issuer, gated on the Mission's active state (Section 7, Section 8.2); and

    4. projected credential lifetimes capped by the Mission's expires_at (Section 8.6).

    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, and implementations that interoperate across the hop implement that companion.

Mission Approved-Set Verification ([I-D.draft-mcguinness-oauth-mission-approved-set-verification]) defines an independent check, by a resource server or policy decision point, that a token's carried authority is a subset of the complete approved Authority Set; conformance to this document does not require it.

19.3. Claiming Conformance

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.

A token carrying a mission claim is not, by itself, Mission-bound authorization. Conformance as a Mission Issuer requires the gates: authority derived from the approved Intent and committed by the anchors (Section 6), issuance bounded by the subset rule (Section 5.4), and derivation gated on Mission state (Section 8.2). 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 17), 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 publishes a Mapping Assessment of how the surfaces above realize the Mission Substrate contract's kernel and capabilities (Appendix F). It is not this document's conformance result: this document makes no substrate-conformance claim, takes no requirement from the substrate, and remains self-contained; its reference to the substrate contract ([I-D.draft-mcguinness-mission-substrate]) is informative.

20. Security Considerations

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.

20.1.2. Downgrade by Omission

A token bearing equivalent authorization_details but no mission claim is governed by no Mission state, revocation, or consent commitment. A deployment can classify a resource as Mission-governed (a Mission-governed resource) or register a client as Mission-governed. Rules on three sides address this downgrade:

  • Issuance. The rules of Section 4.3 keep such a resource's tokens inside a Mission and refuse such a client's authorization request that carries authorization_details but omits the Intent.

  • Client. A client holding a Mission Intent does not fall back to an ordinary request where Mission support is not established, and a client performing a Mission's task does not present an ordinary credential it already holds for that task (Section 17).

  • Enforcement. A resource server for such a resource rejects a token lacking the mission claim and can advertise that requirement (Section 9, Section 18).

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:

  • Classifying a resource as Mission-governed closes this path at that resource.

  • Mandatory mediation closes it where the client's requests must pass through a runtime layer that holds custody of the client's credentials ([I-D.draft-mcguinness-mission-runtime]).

  • A decision-time join of an ordinary credential to the Mission, such as the Mission Join of [I-D.draft-mcguinness-mission-authority-server], is one realization of the enforcement path that Section 17 permits.

  • An unmediated ordinary workflow at a resource that is not Mission-governed remains a residual that only the client's own conformance closes.

The integrity of the mission_bound_authorization_supported (Section 17) and mission_bound_authorization_required (Section 18) metadata rests on the retrieval protections of [RFC8414] and [RFC9728], whose security considerations apply.

20.2. Agent-Specific Threats

20.2.1. Prompt Injection and Data Exfiltration

This document assumes that an agent reading attacker-influenceable content can be prompt-injected, and does not try to make the agent immune. Injection is dangerous when one agent combines access to private data, exposure to untrusted content, and the ability to communicate externally; the Mission Security Model ([I-D.draft-mcguinness-mission-security-model]) analyzes that combination and its architectural defenses.

This document constrains the data-access leg: a Mission narrows authority from everything the agent's standing credentials allow to the resources the approved task needs, and per-task Missions (Section 1.2) further limit the effect of a compromise.

Against the untrusted-content leg, authority is fixed at the approval event, so injected text cannot expand an approved Mission. purpose 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).

This document does not constrain the external-communication leg. It models authority over resources and actions, not how an agent uses authority it holds: within an approved Authority Set, an injected agent can read what the Mission permits and write to a sink the Mission permits.

Constraining exfiltration by a compromised agent is the runtime layer's role (Section 20.3.1), and even there it is bounded, not closed ([I-D.draft-mcguinness-mission-runtime]). Preventing misuse of data within the authorized scope needs a taint or information-flow layer this document does not define.

20.2.2. Authority and Propagated Information

Issuance gating bounds escalation by token acquisition (Section 8.2, Section 5.4): an agent cannot exceed the approved Authority Set by acquiring additional tokens. The same bound holds for information: an agent can inherit another agent's knowledge, but not its authority.

A work product of one Mission (a file, message, memory entry, queue event, or other durable shared artifact) is input, not authority, to an agent under another Mission that reads it. The receiving Mission determines what can be done with the information under its own Authority Set (Section 5.4); the producing Mission's authority does not transfer through the artifact by copying, referencing, embedding, or communicating it.

An agent that needs authority to act on what it read acquires it only through an authorized derivation or delegation bounded by the Mission (Section 12), not from the artifact.

The threat is emergent authority through coordination: independent Missions communicating through shared state, so that individually acceptable actions compose into behavior no single Mission authorized ([I-D.draft-mcguinness-mission-security-model]). Mission Work Products [I-D.draft-mcguinness-oauth-mission-work-products] specifies the mechanism that upholds the invariant across such a carrier (work-product provenance and a non-transitive Mission-to-Mission handoff); this document takes no normative dependency on it.

20.3. Enforcement Boundaries

20.3.1. Issuance Scope and Runtime Enforcement

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 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.

20.3.2. Denial Detail Disclosure

The mission_denial attribute and the [RFC9470] insufficient_user_authentication challenge (Section 9) 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 11.1), and Section 9 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.

20.4. Credentials and Delegation

20.4.1. Token Theft

Derived tokens are sender-constrained (DPoP [RFC9449] or mTLS [RFC8705]) where Section 8 and Section 12.2 require it. A designation (Section 12.1) carries no confirmation key: like an authorization code, it is bound to the client that redeems it, and it authorizes no resource access. A stolen token is bounded by the Authority Set and the Mission lifetime regardless, but sender-constraint prevents replay by a different party.

20.4.2. Delegation and Chain Compromise

Delegation (Section 12) 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 12.5) bound it at approval time. max_depth 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 12.2) confines a compromised delegate to its own credential.

  • Short derived-token lifetimes (Section 8.2), 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 12.5);

  • 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 12.4).

Designation (Section 12.1) closes the remaining gap: a delegated exchange accepts only a designation naming the 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 the primary token (Section 8.3) likewise keeps a stolen token from being designated or self-exchanged.

20.4.3. Client Attribution and Delegation Lineage

Because this document keeps the ordinary [RFC9068] meaning of the client_id claim (Appendix B.6), 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 12.2) or the Mission's originally-approved agent, which is recorded in the Mission Record (Section 14), 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 states what a resource server may not infer or route on client_id.

20.4.4. Signing and Key Rotation

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 8.3 specifies.

Verification for audit outlives validity: keeping a key resolvable for the audit horizon (Section 14.4) 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 (a status assertion, a Mandate, registered evidence) 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.

20.5. Composition and Residual Authority

20.5.1. Compromised or Over-Broad Derivation

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. The recorded policy_version makes each Authority Set derivation auditable by naming the policy it ran under.

20.5.2. Authority Hash and Mission Identity

authority_hash commits the approved Authority Set, not the Mission. Two Missions that approve byte-identical authority (a successor that re-approves the same Authority Set, or an unrelated Mission with the same derived authority) share it while differing in intent_hash, approval_basis.consent_principal, and id. Section 15.1 therefore forbids its use as a Mission Identifier or as a replay or idempotency key.

A consumer that needs to bind to or correlate a specific Mission uses the Mission Identifier. Where a deployment discloses authority_hash to a resource server, it is an audit correlator, not an enforcement input, and not proof that the carried entries are a subset of the approved set.

20.5.3. Composition and the Effective Ceiling

Delegation depth (Section 12.5) resets to 0 at each cross-domain hop ([I-D.draft-mcguinness-oauth-mission-cross-domain]) and, where a deployment runs the child-delegation profile, at each child generation ([I-D.draft-mcguinness-oauth-mission-child-delegation]).

The aggregate surface that a Mission's descendants can reach (the product of delegation depth, the number of trust domains projected into, and the number of child generations, each bounded independently) can therefore exceed what a single approval appears to bound at consent time.

Child Delegation's max_children and max_child_depth limit the descendant Missions live at once, not those created over the root's lifetime: a child that terminates frees its slot ([I-D.draft-mcguinness-oauth-mission-child-delegation]; [I-D.draft-mcguinness-oauth-mission-derivation-limits] works an example).

Cross-domain projection composes separately: a projected grant preserves the Mission's lineage rather than rooting a new one, and the Resource AS's local issuance under it is bounded by that grant's own lifetime and local policy.

At the consent surface, a deployment can disclose the subtree's figures, not only the immediate Mission's, as distinct values rather than one composed total ([I-D.draft-mcguinness-oauth-mission-child-delegation]). Where a single approval's apparent bound must hold in practice, it can impose a global cap out of band.

Bounding aggregate consumption (calls, spend, or activity over the life of a Mission and its descendants) is the metering profile's role ([I-D.draft-mcguinness-mission-metering]).

20.5.4. Authority Materialized Before Containment

Where a deployment runs the Mission Containment profile ([I-D.draft-mcguinness-oauth-mission-containment]), containment narrows the authority available from an entry for later derivations; the approved Authority Set and its commitments remain unchanged. Containment also propagates to Child Missions justified by that entry.

Containment does not reach authority materialized before the containment transition. A cross-domain grant already redeemed at a Resource AS ([I-D.draft-mcguinness-oauth-mission-cross-domain]), or an offline attenuation root already minted and attenuating outside the issuer's reach, operates for its own remaining lifetime, the same residual bound that revocation carries (Section 7.2).

Where containment needs to take effect quickly against already-materialized authority, short cross-domain grant and offline attenuation root lifetimes keep that residual window to one the next lease or re-mint closes.

21. Privacy Considerations

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:

21.1. Mission Identifier Correlation

This document carries a single canonical Mission Identifier on every derived token, and cross-domain projection ([I-D.draft-mcguinness-oauth-mission-cross-domain]) carries it across trust domains unchanged. 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 B.5).

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.

21.2. Token Payload Disclosure

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 8.4).

21.3. Intent Retention and Anchor Disclosure

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 21.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.

21.4. Third-Party Data Subjects

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). 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 14); 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 (for example, the metering companion's consumption bounds, [I-D.draft-mcguinness-mission-metering]);

  • any type-owned member of a proposed entry, and the derived Authority Set entries that reach tokens (Section 8); and

  • submission_evidence facts, including a consent reference.

Whatever the member, it:

  • persists on the Mission Record for its audit horizon (Section 14.4);

  • concentrates at the AS with the record (Section 21.5); and

  • if committed, is confirmable through the unsalted anchors by any party holding a candidate value (Section 21.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.

21.5. Mission Record and Evidence Access

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 14.4).

Where approval-event evidence was registered under the audit transparency profile ([I-D.draft-mcguinness-mission-audit]), its erasure record and data-subject-request basis are the transparency-side mechanism. That mechanism records an erasure but neither performs one nor overrides retention law, and it leaves the operational Mission Record and its audit-horizon retention floor untouched.

22. Internationalization Considerations

Mission Intent prose (goal, task_bounds) is human-readable disclosure. goal_lang (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:

23. IANA Considerations

23.1. OAuth Parameters Registration

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 8.1.4

  • Parameter name: mission_error

  • Parameter usage location: token response

  • Change controller: IETF

  • Specification document(s): this document, Section 8.2

  • Parameter name: mission_expires_at

  • Parameter usage location: token response

  • Change controller: IETF

  • Specification document(s): this document, Section 8.1.4

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), for which no IANA registry exists; no action is required for it.

23.2. OAuth Extensions Error Registration

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.

23.3. JSON Web Token Claims Registration

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 8.8

23.4. OAuth Token Introspection Response Registration

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 11).

  • Change Controller: IETF

  • Specification Document(s): this document, Section 11

23.5. OAuth Authorization Server Metadata Registration

This document requests registration of the following in the "OAuth Authorization Server Metadata" registry ([RFC8414]):

  • Metadata Name: mission_bound_authorization_supported

  • Metadata Description: Boolean indicating that the authorization server supports the Mission Issuer core surfaces of this document.

  • Change Controller: IETF

  • Specification Document(s): this document, Section 17

23.6. OAuth Protected Resource Metadata Registration

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 18

23.7. Mission Lifecycle States Registry

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 7 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 23.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 7). 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:

Table 9: Mission Lifecycle States registry: initial contents
Value Terminal Semantics Change Controller Reference
active no The only state from which tokens are derived. IETF this document, Section 7
terminated yes The Mission has ended; its termination gives the reason. IETF this document, Section 7, Section 7.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 23.8).

23.8. Mission Termination Reasons Registry

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 7.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 7).

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:

Table 10: Mission Termination Reasons registry: initial contents
Value Semantics Members Change Controller Reference
revoked The Subject, Approver, or policy terminated the Mission. none IETF this document, Section 7.1
expired The Mission's expires_at passed; terminated_at equals it. none IETF this document, Section 7.1

Each further document that defines a termination reason requests that reason's registration in its own IANA considerations.

23.9. Mission Intent Members Registry

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 16). 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:

Table 11: Core-defined Mission Intent members
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.

24. References

24.1. Normative References

[I-D.draft-ietf-oauth-rar-metadata-remediation]
Zehavi, Y., "OAuth 2.0 RAR Metadata and Error Remediation", Work in Progress, Internet-Draft, draft-ietf-oauth-rar-metadata-remediation-00, , <https://datatracker.ietf.org/doc/html/draft-ietf-oauth-rar-metadata-remediation-00>.
[I-D.draft-mcguinness-oauth-actor-profile]
McGuinness, K., "OAuth Actor Profile for Delegation", Work in Progress, Internet-Draft, draft-mcguinness-oauth-actor-profile-01, , <https://datatracker.ietf.org/doc/html/draft-mcguinness-oauth-actor-profile-01>.
[I-D.draft-mcguinness-oauth-client-instance-id]
McGuinness, K., "Client Instance Identification for Attestation-Based Client Authentication", Work in Progress, Internet-Draft, draft-mcguinness-oauth-client-instance-id-00, , <https://datatracker.ietf.org/doc/html/draft-mcguinness-oauth-client-instance-id-00>.
[OpenID.Core]
OpenID Foundation, "OpenID Connect Core 1.0 incorporating errata set 2", , <https://openid.net/specs/openid-connect-core-1_0.html>.
[RFC2119]
Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, DOI 10.17487/RFC2119, , <https://www.rfc-editor.org/rfc/rfc2119>.
[RFC3339]
Klyne, G. and C. Newman, "Date and Time on the Internet: Timestamps", RFC 3339, DOI 10.17487/RFC3339, , <https://www.rfc-editor.org/rfc/rfc3339>.
[RFC4648]
Josefsson, S., "The Base16, Base32, and Base64 Data Encodings", RFC 4648, DOI 10.17487/RFC4648, , <https://www.rfc-editor.org/rfc/rfc4648>.
[RFC5646]
Phillips, A., Ed. and M. Davis, Ed., "Tags for Identifying Languages", BCP 47, RFC 5646, DOI 10.17487/RFC5646, , <https://www.rfc-editor.org/rfc/rfc5646>.
[RFC6234]
Eastlake 3rd, D. and T. Hansen, "US Secure Hash Algorithms (SHA and SHA-based HMAC and HKDF)", RFC 6234, DOI 10.17487/RFC6234, , <https://www.rfc-editor.org/rfc/rfc6234>.
[RFC6749]
Hardt, D., Ed., "The OAuth 2.0 Authorization Framework", RFC 6749, DOI 10.17487/RFC6749, , <https://www.rfc-editor.org/rfc/rfc6749>.
[RFC6750]
Jones, M. and D. Hardt, "The OAuth 2.0 Authorization Framework: Bearer Token Usage", RFC 6750, DOI 10.17487/RFC6750, , <https://www.rfc-editor.org/rfc/rfc6750>.
[RFC6920]
Farrell, S., Kutscher, D., Dannewitz, C., Ohlman, B., Keranen, A., and P. Hallam-Baker, "Naming Things with Hashes", RFC 6920, DOI 10.17487/RFC6920, , <https://www.rfc-editor.org/rfc/rfc6920>.
[RFC7493]
Bray, T., Ed., "The I-JSON Message Format", RFC 7493, DOI 10.17487/RFC7493, , <https://www.rfc-editor.org/rfc/rfc7493>.
[RFC7519]
Jones, M., Bradley, J., and N. Sakimura, "JSON Web Token (JWT)", RFC 7519, DOI 10.17487/RFC7519, , <https://www.rfc-editor.org/rfc/rfc7519>.
[RFC7636]
Sakimura, N., Ed., Bradley, J., and N. Agarwal, "Proof Key for Code Exchange by OAuth Public Clients", RFC 7636, DOI 10.17487/RFC7636, , <https://www.rfc-editor.org/rfc/rfc7636>.
[RFC7662]
Richer, J., Ed., "OAuth 2.0 Token Introspection", RFC 7662, DOI 10.17487/RFC7662, , <https://www.rfc-editor.org/rfc/rfc7662>.
[RFC7800]
Jones, M., Bradley, J., and H. Tschofenig, "Proof-of-Possession Key Semantics for JSON Web Tokens (JWTs)", RFC 7800, DOI 10.17487/RFC7800, , <https://www.rfc-editor.org/rfc/rfc7800>.
[RFC8174]
Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, , <https://www.rfc-editor.org/rfc/rfc8174>.
[RFC8259]
Bray, T., Ed., "The JavaScript Object Notation (JSON) Data Interchange Format", STD 90, RFC 8259, DOI 10.17487/RFC8259, , <https://www.rfc-editor.org/rfc/rfc8259>.
[RFC8414]
Jones, M., Sakimura, N., and J. Bradley, "OAuth 2.0 Authorization Server Metadata", RFC 8414, DOI 10.17487/RFC8414, , <https://www.rfc-editor.org/rfc/rfc8414>.
[RFC8693]
Jones, M., Nadalin, A., Campbell, B., Ed., Bradley, J., and C. Mortimore, "OAuth 2.0 Token Exchange", RFC 8693, DOI 10.17487/RFC8693, , <https://www.rfc-editor.org/rfc/rfc8693>.
[RFC8705]
Campbell, B., Bradley, J., Sakimura, N., and T. Lodderstedt, "OAuth 2.0 Mutual-TLS Client Authentication and Certificate-Bound Access Tokens", RFC 8705, DOI 10.17487/RFC8705, , <https://www.rfc-editor.org/rfc/rfc8705>.
[RFC8707]
Campbell, B., Bradley, J., and H. Tschofenig, "Resource Indicators for OAuth 2.0", RFC 8707, DOI 10.17487/RFC8707, , <https://www.rfc-editor.org/rfc/rfc8707>.
[RFC8785]
Rundgren, A., Jordan, B., and S. Erdtman, "JSON Canonicalization Scheme (JCS)", RFC 8785, DOI 10.17487/RFC8785, , <https://www.rfc-editor.org/rfc/rfc8785>.
[RFC9068]
Bertocci, V., "JSON Web Token (JWT) Profile for OAuth 2.0 Access Tokens", RFC 9068, DOI 10.17487/RFC9068, , <https://www.rfc-editor.org/rfc/rfc9068>.
[RFC9101]
Sakimura, N., Bradley, J., and M. Jones, "The OAuth 2.0 Authorization Framework: JWT-Secured Authorization Request (JAR)", RFC 9101, DOI 10.17487/RFC9101, , <https://www.rfc-editor.org/rfc/rfc9101>.
[RFC9126]
Lodderstedt, T., Campbell, B., Sakimura, N., Tonge, D., and F. Skokan, "OAuth 2.0 Pushed Authorization Requests", RFC 9126, DOI 10.17487/RFC9126, , <https://www.rfc-editor.org/rfc/rfc9126>.
[RFC9207]
Meyer zu Selhausen, K. and D. Fett, "OAuth 2.0 Authorization Server Issuer Identification", RFC 9207, DOI 10.17487/RFC9207, , <https://www.rfc-editor.org/rfc/rfc9207>.
[RFC9396]
Lodderstedt, T., Richer, J., and B. Campbell, "OAuth 2.0 Rich Authorization Requests", RFC 9396, DOI 10.17487/RFC9396, , <https://www.rfc-editor.org/rfc/rfc9396>.
[RFC9449]
Fett, D., Campbell, B., Bradley, J., Lodderstedt, T., Jones, M., and D. Waite, "OAuth 2.0 Demonstrating Proof of Possession (DPoP)", RFC 9449, DOI 10.17487/RFC9449, , <https://www.rfc-editor.org/rfc/rfc9449>.
[RFC9470]
Bertocci, V. and B. Campbell, "OAuth 2.0 Step Up Authentication Challenge Protocol", RFC 9470, DOI 10.17487/RFC9470, , <https://www.rfc-editor.org/rfc/rfc9470>.
[RFC9700]
Lodderstedt, T., Bradley, J., Labunets, A., and D. Fett, "Best Current Practice for OAuth 2.0 Security", BCP 240, RFC 9700, DOI 10.17487/RFC9700, , <https://www.rfc-editor.org/rfc/rfc9700>.
[RFC9728]
Jones, M.B., Hunt, P., and A. Parecki, "OAuth 2.0 Protected Resource Metadata", RFC 9728, DOI 10.17487/RFC9728, , <https://www.rfc-editor.org/rfc/rfc9728>.

24.2. Informative References

[AuthZEN.ARAP]
OpenID Foundation, "OpenID AuthZEN Access Request and Approval Profile 1.0", , <https://openid.github.io/authzen/authzen-access-request-approval-profile-1_0.html>.
[FAPI.GrantManagement]
OpenID Foundation, "Grant Management for OAuth 2.0", , <https://openid.net/specs/oauth-v2-grant-management.html>.
[I-D.draft-cecchetti-oauth-rar-cedar]
Cecchetti, S., "Cedar Profile for OAuth 2.0 Rich Authorization Requests", Work in Progress, Internet-Draft, draft-cecchetti-oauth-rar-cedar-02, , <https://datatracker.ietf.org/doc/html/draft-cecchetti-oauth-rar-cedar-02>.
[I-D.draft-ietf-oauth-spiffe-client-auth]
Schwenkschuster, A., Kasselman, P., Rose, S., Thorgersen, S., and N. Cam-Winget, "OAuth SPIFFE Client Authentication", Work in Progress, Internet-Draft, draft-ietf-oauth-spiffe-client-auth-02, , <https://datatracker.ietf.org/doc/html/draft-ietf-oauth-spiffe-client-auth-02>.
[I-D.draft-ietf-oauth-transaction-tokens]
Tulshibagwale, A., Fletcher, G., and P. Kasselman, "Transaction Tokens", Work in Progress, Internet-Draft, draft-ietf-oauth-transaction-tokens-11, , <https://datatracker.ietf.org/doc/html/draft-ietf-oauth-transaction-tokens-11>.
[I-D.draft-ietf-wimse-aims]
Kasselman, P., Lombardo, J., Rosomakho, Y., Campbell, B., Steele, N., and A. Parecki, "AI Identity Management System", Work in Progress, Internet-Draft, draft-ietf-wimse-aims-00, , <https://datatracker.ietf.org/doc/html/draft-ietf-wimse-aims-00>.
[I-D.draft-ietf-wimse-arch]
Salowey, J. A., Rosomakho, Y., and H. Tschofenig, "Workload Identity in a Multi System Environment (WIMSE) Architecture", Work in Progress, Internet-Draft, draft-ietf-wimse-arch-08, , <https://datatracker.ietf.org/doc/html/draft-ietf-wimse-arch-08>.
[I-D.draft-mcguinness-mission-approval-governance]
McGuinness, K., "Mission Approval Governance", , <https://mcguinness.github.io/mission-bound-authorization/draft-mcguinness-mission-approval-governance.html>.
[I-D.draft-mcguinness-mission-architecture]
McGuinness, K., "An Architecture for Mission-Bound Authorization", , <https://mcguinness.github.io/mission-bound-authorization/draft-mcguinness-mission-architecture.html>.
[I-D.draft-mcguinness-mission-audit]
McGuinness, K., "Mission Audit Transparency", , <https://mcguinness.github.io/mission-bound-authorization/draft-mcguinness-mission-audit.html>.
[I-D.draft-mcguinness-mission-authority-server]
McGuinness, K., "Mission Authority Server", , <https://mcguinness.github.io/mission-bound-authorization/draft-mcguinness-mission-authority-server.html>.
[I-D.draft-mcguinness-mission-authzen]
McGuinness, K., "Mission-Bound Runtime Enforcement: AuthZEN Profile", , <https://mcguinness.github.io/mission-bound-authorization/draft-mcguinness-mission-authzen.html>.
[I-D.draft-mcguinness-mission-capability-binding]
McGuinness, K., "Mission Capability Binding", , <https://mcguinness.github.io/mission-bound-authorization/draft-mcguinness-mission-capability-binding.html>.
[I-D.draft-mcguinness-mission-metering]
McGuinness, K., "Mission Consumption Metering", , <https://mcguinness.github.io/mission-bound-authorization/draft-mcguinness-mission-metering.html>.
[I-D.draft-mcguinness-mission-runtime]
McGuinness, K., "Mission-Bound Runtime Enforcement", , <https://mcguinness.github.io/mission-bound-authorization/draft-mcguinness-mission-runtime.html>.
[I-D.draft-mcguinness-mission-security-model]
McGuinness, K., "Mission Security Model", , <https://mcguinness.github.io/mission-bound-authorization/draft-mcguinness-mission-security-model.html>.
[I-D.draft-mcguinness-mission-shaping]
McGuinness, K., "Mission Intent Shaping", , <https://mcguinness.github.io/mission-bound-authorization/draft-mcguinness-mission-shaping.html>.
[I-D.draft-mcguinness-mission-substrate]
McGuinness, K., "Mission Substrate Requirements", , <https://mcguinness.github.io/mission-bound-authorization/draft-mcguinness-mission-substrate.html>.
[I-D.draft-mcguinness-oauth-client-attesters]
McGuinness, K., "OAuth 2.0 Client Attester Endorsement", Work in Progress, Internet-Draft, draft-mcguinness-oauth-client-attesters-00, , <https://datatracker.ietf.org/doc/html/draft-mcguinness-oauth-client-attesters-00>.
[I-D.draft-mcguinness-oauth-mission-approval]
McGuinness, K., "Mission Deferred Approval for OAuth 2.0", , <https://mcguinness.github.io/mission-bound-authorization/draft-mcguinness-oauth-mission-approval.html>.
[I-D.draft-mcguinness-oauth-mission-approved-set-verification]
McGuinness, K., "Mission Approved-Set Verification for OAuth 2.0", , <https://mcguinness.github.io/mission-bound-authorization/draft-mcguinness-oauth-mission-approved-set-verification.html>.
[I-D.draft-mcguinness-oauth-mission-child-delegation]
McGuinness, K., "Mission Child Delegation for OAuth 2.0", , <https://mcguinness.github.io/mission-bound-authorization/draft-mcguinness-oauth-mission-child-delegation.html>.
McGuinness, K., "Mission Consent Evidence for OAuth 2.0", , <https://mcguinness.github.io/mission-bound-authorization/draft-mcguinness-oauth-mission-consent-evidence.html>.
[I-D.draft-mcguinness-oauth-mission-containment]
McGuinness, K., "Mission Containment for OAuth 2.0", , <https://mcguinness.github.io/mission-bound-authorization/draft-mcguinness-oauth-mission-containment.html>.
[I-D.draft-mcguinness-oauth-mission-continuation]
McGuinness, K., "Mission Continuation for OAuth 2.0", , <https://mcguinness.github.io/mission-bound-authorization/draft-mcguinness-oauth-mission-continuation.html>.
[I-D.draft-mcguinness-oauth-mission-cross-domain]
McGuinness, K., "Mission Cross-Domain Projection for OAuth 2.0", , <https://mcguinness.github.io/mission-bound-authorization/draft-mcguinness-oauth-mission-cross-domain.html>.
[I-D.draft-mcguinness-oauth-mission-cross-org-delegation]
McGuinness, K., "Mission Cross-Organizational Delegation for OAuth 2.0", , <https://mcguinness.github.io/mission-bound-authorization/draft-mcguinness-oauth-mission-cross-org-delegation.html>.
[I-D.draft-mcguinness-oauth-mission-derivation-limits]
McGuinness, K., "Mission Derivation Limits for OAuth 2.0", , <https://mcguinness.github.io/mission-bound-authorization/draft-mcguinness-oauth-mission-derivation-limits.html>.
[I-D.draft-mcguinness-oauth-mission-device-authorization]
McGuinness, K., "Mission Device Authorization for OAuth 2.0", , <https://mcguinness.github.io/mission-bound-authorization/draft-mcguinness-oauth-mission-device-authorization.html>.
[I-D.draft-mcguinness-oauth-mission-expansion]
McGuinness, K., "Mission Expansion for OAuth 2.0", , <https://mcguinness.github.io/mission-bound-authorization/draft-mcguinness-oauth-mission-expansion.html>.
[I-D.draft-mcguinness-oauth-mission-management]
McGuinness, K., "Mission Management for OAuth 2.0", , <https://mcguinness.github.io/mission-bound-authorization/draft-mcguinness-oauth-mission-management.html>.
[I-D.draft-mcguinness-oauth-mission-progressive]
McGuinness, K., "Mission Progressive Authorization for OAuth 2.0", , <https://mcguinness.github.io/mission-bound-authorization/draft-mcguinness-oauth-mission-progressive.html>.
[I-D.draft-mcguinness-oauth-mission-resource-access]
McGuinness, K., "Mission Resource Access Profile for OAuth 2.0", , <https://mcguinness.github.io/mission-bound-authorization/draft-mcguinness-oauth-mission-resource-access.html>.
[I-D.draft-mcguinness-oauth-mission-signals]
McGuinness, K., "Mission Lifecycle Signals for OAuth 2.0", , <https://mcguinness.github.io/mission-bound-authorization/draft-mcguinness-oauth-mission-signals.html>.
[I-D.draft-mcguinness-oauth-mission-status]
McGuinness, K., "Mission Status and Lifecycle for OAuth 2.0", , <https://mcguinness.github.io/mission-bound-authorization/draft-mcguinness-oauth-mission-status.html>.
[I-D.draft-mcguinness-oauth-mission-submission-evidence]
McGuinness, K., "Mission Intent Submission Evidence for OAuth 2.0", , <https://mcguinness.github.io/mission-bound-authorization/draft-mcguinness-oauth-mission-submission-evidence.html>.
[I-D.draft-mcguinness-oauth-mission-template]
McGuinness, K., "Mission Template for OAuth 2.0", , <https://mcguinness.github.io/mission-bound-authorization/draft-mcguinness-oauth-mission-template.html>.
[I-D.draft-mcguinness-oauth-mission-work-products]
McGuinness, K., "Mission Work Products for OAuth 2.0", , <https://mcguinness.github.io/mission-bound-authorization/draft-mcguinness-oauth-mission-work-products.html>.
[I-D.draft-niyikiza-oauth-attenuating-agent-tokens]
Aimable, N., "Attenuating Authorization Tokens for Agentic Delegation Chains", Work in Progress, Internet-Draft, draft-niyikiza-oauth-attenuating-agent-tokens-01, , <https://datatracker.ietf.org/doc/html/draft-niyikiza-oauth-attenuating-agent-tokens-01>.
[RFC7009]
Lodderstedt, T., Ed., Dronia, S., and M. Scurtescu, "OAuth 2.0 Token Revocation", RFC 7009, DOI 10.17487/RFC7009, , <https://www.rfc-editor.org/rfc/rfc7009>.
[RFC8126]
Cotton, M., Leiba, B., and T. Narten, "Guidelines for Writing an IANA Considerations Section in RFCs", BCP 26, RFC 8126, DOI 10.17487/RFC8126, , <https://www.rfc-editor.org/rfc/rfc8126>.
[RFC8628]
Denniss, W., Bradley, J., Jones, M., and H. Tschofenig, "OAuth 2.0 Device Authorization Grant", RFC 8628, DOI 10.17487/RFC8628, , <https://www.rfc-editor.org/rfc/rfc8628>.
[RFC8792]
Watsen, K., Auerswald, E., Farrel, A., and Q. Wu, "Handling Long Lines in Content of Internet-Drafts and RFCs", RFC 8792, DOI 10.17487/RFC8792, , <https://www.rfc-editor.org/rfc/rfc8792>.
[RFC8935]
Backman, A., Ed., Jones, M., Ed., Scurtescu, M., Ansari, M., and A. Nadalin, "Push-Based Security Event Token (SET) Delivery Using HTTP", RFC 8935, DOI 10.17487/RFC8935, , <https://www.rfc-editor.org/rfc/rfc8935>.
[RFC9493]
Backman, A., Ed., Scurtescu, M., and P. Jain, "Subject Identifiers for Security Event Tokens", RFC 9493, DOI 10.17487/RFC9493, , <https://www.rfc-editor.org/rfc/rfc9493>.
[RFC9635]
Richer, J., Ed. and F. Imbault, "Grant Negotiation and Authorization Protocol (GNAP)", RFC 9635, DOI 10.17487/RFC9635, , <https://www.rfc-editor.org/rfc/rfc9635>.

Appendix A. End-to-End Example

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; the identity setup follows [I-D.draft-ietf-wimse-aims]. Identifiers are illustrative; the hash values are computed over the displayed objects (Section 15.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. Text marked as a companion variation shows what an optional companion adds to the same Mission, and the timeline (Appendix A.7) lists both.

Scenario: agent s6BhdRkqt3, acting for alice (user_3p2q8mN1a0kV7tR), reconciles Q3 invoices in the home ERP under Mission msn_8RfX2Lqv9TqMv4z7sA2bN1k0YpEdHc9-.

A.1. Stage 0: Agent Identity (by Reference)

The agent is an OAuth client with a workload identity, for example one established using WIMSE [I-D.draft-ietf-wimse-arch] or SPIFFE [I-D.draft-ietf-oauth-spiffe-client-auth]. alice has delegated to it through an ordinary authorization code flow, per [I-D.draft-ietf-wimse-aims]: the client_id claim names the agent, and the sub claim identifies alice. This document adds the Mission layer to that identity; Stage 0 is otherwise unchanged from that specification.

A.2. Stage 1: Mission Creation

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 (each entry a same-type subset of a proposed entry, Section 4.3), 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" }
    } }
]

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.

A.3. Stage 2: Mission-Bound Token Issuance

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 8.1.1), checks that it is active (Section 8.2), and issues a Mission-bound access token for the ERP and a refresh token. The token response carries the granted authorization_details echo (Section 8.4) and the mission_id and mission_expires_at response parameters (Section 8.1.4):

{
  "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 7.2).

A.4. Stage 3: Resource Server Enforcement

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); 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 8.4 narrows to the read entry.

Companion variation (runtime enforcement): where the deployment runs the runtime profile ([I-D.draft-mcguinness-mission-runtime]), the resource server also obtains a point-of-use permit against current Mission state from a policy decision point before executing the write. The AuthZEN profile's worked request ([I-D.draft-mcguinness-mission-authzen]) is that check for a 423.50 USD posting at 08:14:03, made with that write-only token.

Companion variation (cross-domain): the end-to-end example of the Mission Cross-Domain Projection profile ([I-D.draft-mcguinness-oauth-mission-cross-domain]) follows a Mission like this one whose authority also covers a partner ERP in another trust domain.

A.5. Stage 4: Resource Server Refusal

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). This deployment accepts the agent learning that more authority needs a new approval or an expansion (Section 20.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).

A.6. Stage 5: Suspension, Resumption, and Revocation

Suspension and resumption are Mission Status operations, shown in its companion variation below.

At 08:50:00 the agent refreshes for the read-only token of the refresh example in Section 8.4, 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 7.2). A later refresh is refused with the mission_error diagnostic (Section 8.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 11.5, Section 11.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.

Companion variations:

  • Mission Status ([I-D.draft-mcguinness-oauth-mission-status]). The Mission is created at state version 1, suspended at 08:20:00 and resumed at 08:30:00 (state versions 2 and 3) through the profile's lifecycle operations, and the AS derives nothing in between (Section 7). The revocation at 08:53:20 is the agent's own revoke operation, with the reason "Quarterly reconcile completed early", under an explicit lifecycle authorization the deployment grants it for this Mission; its resource tokens and refresh token confer no such authority. The AS commits it as state version 4.

  • Mission Signals ([I-D.draft-mcguinness-oauth-mission-signals]). A receiver learns of the revocation from a Security Event Token.

  • Runtime enforcement ([I-D.draft-mcguinness-mission-runtime]). A resource server that obtains a point-of-use permit stops honoring the token within that deployment's declared freshness and permit bounds, since a permit can rest on a state observation taken before the revocation.

A.7. Timeline

All times are 2026-11-02 UTC. The rows marked with a companion occur only where that companion is deployed.

Table 12: End-to-end example timeline
Time Event Defined by
08:00:00 alice approves; the AS creates the Mission this document
08:00:05 The agent redeems the code; the access token expires at 08:05:05 this document
08:14:00 The agent refreshes for a write-only token this document
08:14:03 A point-of-use permit for a 423.50 USD posting runtime profile (AuthZEN)
08:20:00, 08:30:00 The Mission is suspended, then resumed Mission Status
08:50:00 The agent refreshes for a read-only token that expires at 08:55:00 this document
08:53:20 The Mission is revoked and terminated; later refreshes are refused, and introspection reports the read-only token inactive this document
After revocation; delivery time unspecified A receiver learns of the revocation from a Security Event Token Mission Signals
08:55:00 The read-only token expires; a resource server enforcing from the token alone stops honoring it this document

Appendix B. Design Context and Boundaries

This appendix explains the design choices behind the Mission and records what this document leaves to other work.

B.1. Relationship to Existing OAuth Objects

OAuth already has objects near this need, but none is the approved task:

  • A scope value or an authorization_details entry ([RFC9396]) expresses authority but neither the task it serves nor a lifecycle of its own.

  • An access token is a short-lived projection; its jti claim identifies the token, not the task.

  • A refresh token preserves the ability to obtain further tokens but commits no bounded, approved authority.

  • A consent record proves that an approval event happened; it does not govern the resulting work as it continues.

The Mission is the durable object these project from: the approved task that bounds and outlives them and that every derived token refers back to. It is not another authorization_details type, since Rich Authorization Requests already express authority; it is the approved task with a lifecycle, which an Authority Set is derived for and gated by.

B.2. Relationship to Adjacent Work

A grant, in the sense of FAPI Grant Management [FAPI.GrantManagement], is a durable, queryable, revocable container of consented authorization data, with no task, integrity commitment, or derivation gating. A deployment can surface Mission revocation through a grant-management-style API (Section 7.2).

This document specifies the issuance and governance layer that agent-identity work for OAuth leaves unspecified. [I-D.draft-ietf-wimse-aims] names the agent's mission and leaves its translation into authorization requirements out of scope. This document specifies that translation and reuses its assignments unchanged: the agent is the client, and the delegating principal is the token sub (Section 3.2). An agent authenticated and delegated per that document uses these mechanisms to obtain Mission-bound tokens.

Decision-layer access-request and approval workflows, such as the OpenID AuthZEN Access Request and Approval Profile [AuthZEN.ARAP], manage approval tasks but do not tie an approval to token issuance. This document supplies the issuance-bound object such workflows complete into.

Nearby individual proposals each carry one Mission property without the others:

None combines the durable approved object, state-gated issuance, and integrity anchors this document defines.

The Grant Negotiation and Authorization Protocol [RFC9635] covers much of the same design space: a continuable authorization request, richer client instance identification, and native delegation. Rather than a new grant protocol, endpoints, and client machinery, this document uses deployed OAuth 2.0 surfaces: Pushed Authorization Requests ([RFC9126]), Rich Authorization Requests ([RFC9396]), DPoP ([RFC9449]), and [RFC9068] access tokens. A deployment that runs PAR, RAR, and sender-constrained tokens adopts the Mission model without a GNAP grant endpoint or migrating its clients to GNAP.

The Authority Set's subset rule (Section 5.4) follows capability systems in which a holder narrows what it passes on without contacting an issuer: macaroons' caveat narrowing, Biscuit's offline attenuation blocks, UCAN's delegation chains, SPKI/SDSI's local-name reduction, and object-capability designs generally.

In this document, narrowing applies to a durable, approval-anchored object that its issuer can revoke for the Mission's full lifetime, not a bearer credential bounded only by its caveats. Revoking the Mission therefore still reaches everything derived from it that has not already left the issuer's reach (Section 7.2).

B.3. Missions, Plans, and Execution

The Mission is the durable, AS-held object that commits the approved authority and owns the task's lifecycle. Two related things an agent produces around a task draw on the Mission's authority but carry none of their own and never enlarge it.

The agent's plan (how it decomposes the task, chooses tools, and delegates to sub-agents) is its own strategy and is out of scope. It grants nothing: a sub-agent's authority is carried on its delegated token (Section 12), derived from the Mission and only narrowed from it (Section 5.4).

The agent's execution (the tokens it derives, the calls it makes, and the decisions taken on them) references the Mission but cannot expand it. Revoking the Mission stops further derivation (Section 8.2) but does not undo completed actions. Evaluating each action against the Mission at the point of use is the runtime layer's concern (Section 20.3.1).

How a client produces the Intent (for example, a "Mission Shaper" deriving it from a natural-language instruction) is out of scope.

B.4. Scope and Future Work

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 19), so that companion is not a normative dependency.

Optional companion profiles, not required to implement this document, specify:

Future work includes:

  • the normative carriage of Mission context in Transaction Tokens ([I-D.draft-ietf-oauth-transaction-tokens]), shown only illustratively in the companion's end-to-end example; and

  • an optional Authority Set derivation profile for a vertical that wants cross-vendor agreement on what a task authorizes: a registry of standard task types mapped to authority templates, so that two vendors in that profile derive comparable Authority Sets. This document does not standardize the Authority Set derivation algorithm (Section 5).

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.

B.5. Non-Goals

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 20.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, a successor Mission, as specified by Mission Expansion [I-D.draft-mcguinness-oauth-mission-expansion].

  • Lifecycle event distribution. A resource server learns Mission state from the token lifetime or optional introspection (Section 11); this document defines no push-based notification of Mission state changes. Mission Lifecycle Signals ([I-D.draft-mcguinness-oauth-mission-signals]) specifies a Shared Signals and CAEP profile for Mission lifecycle events, delivered as Security Event Tokens ([RFC8935]).

  • Human-in-the-loop suspension. The base lifecycle is active and terminated (Section 7). Mission Status ([I-D.draft-mcguinness-oauth-mission-status]) defines a suspended state with resume/complete transitions as an optional extension. A pending-human-approval state and a holding-token pause-and-resume protocol are future lifecycle work.

  • Multi-hop cross-domain projection. Cross-Domain Projection ([I-D.draft-mcguinness-oauth-mission-cross-domain]) specifies a single projection hop. Mission Cross-Organizational Delegation ([I-D.draft-mcguinness-oauth-mission-cross-org-delegation]) profiles recursive delegation across organizations; a destination verifies that delegation chain before projecting. 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. authority_hash 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 8.8, Section 11.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 21.1).

B.6. Client Identification in Delegated Tokens

This document keeps the registered meaning of the client_id claim, stated normatively in Section 8.3 and enforced in Section 9: 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 12.2), and the Mission's originally-approved agent remains recorded in the Mission Record (Section 14).

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, as a Mission-aware Resource Server does (Section 9).

The routing rule of Section 9 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.

Appendix C. Role Mapping

approval_basis separates three questions about a Mission's own creation, which a scenario can assign to different principals:

The companion profiles cited below define the scenarios; the list shows how each assigns the three roles: its accountability root (consent_principal), activation actor (activation_actor), and adjudication (where a profile or deployment populates it).

Direct approval:
  • Accountability root: The approving human

  • Activation actor: Equal to consent_principal: the Approver triggers their own approval

  • Adjudication: kind: human; the deciding human is consent_principal itself

Relocated human approval ([I-D.draft-mcguinness-oauth-mission-approval]):
  • Accountability root: The human who completes the relocated approval event

  • Activation actor: Equal to consent_principal, unchanged from the direct case: the instance activates at that human's decision, not at any earlier submission

  • Adjudication: kind: human, as direct

Template dispatch ([I-D.draft-mcguinness-oauth-mission-template]):
  • Accountability root: The template's human approver, fixed at template creation

  • Activation actor: The Dispatcher that requested the Dispatch, distinct from consent_principal

  • Adjudication: kind: policy, policy naming the template's dispatch_policy id and version (already carried in the dispatched Mission's template lineage member), never the Template's own id/template_version nor the Dispatcher

Policy drawdown ([I-D.draft-mcguinness-oauth-mission-child-delegation]):
  • Accountability root: The Parent Mission's human Approver

  • Activation actor: The requesting parent Agent, distinct from consent_principal

  • Adjudication: kind: policy, naming the child-creation policy's id/version where the entry carries one, otherwise the Parent Mission's approved delegation entry; never the requesting parent Agent

Ceiling drawdown ([I-D.draft-mcguinness-oauth-mission-progressive]):
  • Accountability root: The Approver who consented the ceiling

  • Activation actor: The requesting client, distinct from consent_principal

  • Adjudication: kind: policy, naming the drawdown policy's policy_id/policy_version carried in activation; never the requesting client

Governed policy approval ([I-D.draft-mcguinness-mission-approval-governance]):
  • Accountability root: The human who approved the exact policy version the instance activates under

  • Activation actor: The authenticated client that requested the activation, distinct from consent_principal

  • Adjudication: kind: policy, policy naming the deciding policy's id/version (the approved policy itself or the evaluator it commits), with governance_record: true; never the requesting client

AGR-backed direct approval ([I-D.draft-mcguinness-mission-approval-governance]):
  • Accountability root: The approving human, whose own human assertion is the Approval Governance Record's accountable assertion

  • Activation actor: Equal to consent_principal, as for direct approval

  • Adjudication: kind: human, governance_record: true; how other assertions contribute is Approval Governance's

AGR-backed template or drawdown activation ([I-D.draft-mcguinness-mission-approval-governance]):
  • Accountability root: Unchanged from the underlying basis, whose approval_basis stands in for an accountable assertion

  • Activation actor: Unchanged from the underlying basis

  • Adjudication: kind: policy, as the underlying basis assigns it, with governance_record: true; the full assertion set is never collapsed into a single principal

Direct approval is the degenerate case where one human fills every role. Where a profile or deployment does not populate adjudication (Section 14), the list shows the value it would carry.

Appendix D. Derivation Policy

This appendix is illustrative and adds no requirements. It describes an authoring artifact for the contract in Section 5, not a standardized policy language or an alternative subset relation.

D.1. Policy Artifact

A deployment retains a versioned derivation policy with its ceiling, configured mappings, and issuance limits. Its inputs include:

  • a validated Mission Intent;

  • the client's authority proposal in narrowing mode, or configured candidates when there is no proposal;

  • the applicable authority source ceiling;

  • the capability catalog's per-action properties; and

  • any recorded model output.

The output is the Authority Set committed by authority_hash, and policy_version identifies the policy used.

Reproducing an Authority Set derivation requires the same inputs and the retained policy and catalog versions, not just the identifier of a mutable configuration. Replay uses a model's retained output and never reruns the model. Authority Set derivation is mechanical: a model may suggest an Intent or a proposal, or contribute a recorded input that refuses or narrows, but does not make the approval-time narrowing decision.

D.2. Derivation Policy Properties

The five properties below restate, for a policy author, what Section 5 and the rules it cites require.

  • Deterministic. The same Intent, proposal, ceiling, catalog, and recorded model output derive the same Authority Set, so policy_version can serve as an audit correlator (Section 5).

  • Narrowing only. Every derived entry is a subset of some proposed entry of the same type, under that type's own relation (Section 4.3, Section 5.4); in configured-mapping mode the configured candidates supply that comparison input. Retaining fewer JSON fields is not narrowing: dropping a restriction can grant more. Where the relation cannot decide because two bounds are incomparable, the result is conservative refusal (Section 5.4). For mission_resource_access, two amount caps naming different currencies have no intersection, with no implicit conversion and no "ceiling wins" exception; [I-D.draft-mcguinness-oauth-mission-resource-access] defines the Common Constraints and their intersection rules.

  • Refusal over silent drop. An entry of an unsupported type, an entry that fails its schema, and an entry carrying a constraint the engine cannot compare, whether registered or deployment-defined, are refused (Section 4.3, Section 5.4, Section 10). Authority Set derivation does not repair them by omitting the entry or dropping the constraint. An entry the engine compares but policy cannot accept differs: it is narrowed or omitted, and the granted echo reflects that (Section 4.3).

  • Issuer-established members are not client-supplied. The issuer establishes policy_version (Section 5), and authority_source and approval_basis (Section 6.7, Section 14), at the approval event; no proposal member sets them.

  • No member the ceiling never granted. A grant-shaped member absent from the ceiling, such as a per-entry delegation policy, stays absent from the derived entry, so a proposal cannot introduce a capability the policy did not confer. A restriction nested inside an already-granted delegation, such as allowed_delegates, narrows in the ordinary direction. Where the ceiling's eligibility defers to the issuer's delegation policy (no allowed_delegates), a proposed list only restricts that policy's decision and never replaces it ([I-D.draft-mcguinness-oauth-mission-resource-access]).

D.3. Derivation Rule Example

The following example uses a catalog whose read actions supply no amount for a cap to compare against, while a journal write does. The ceiling separates those actions:

[
  { "type": "mission_resource_access",
    "resource": "https://erp.example.com",
    "actions": ["invoices.read", "journal-entries.read"] },
  { "type": "mission_resource_access",
    "resource": "https://erp.example.com",
    "actions": ["journal-entries.write"],
    "constraints": {
      "max_amount": { "amount": "500.00", "currency": "USD" } } }
]

The validated proposal also separates the read from the amount-bound write:

[
  { "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": "900.00", "currency": "USD" } } }
]

The resulting Authority Set contains the proposed invoices.read entry unchanged, and the proposed journal-entries.write entry with max_amount narrowed to 500.00 USD. The ceiling's unrequested journal-entries.read does not appear. Each proposed entry intersects the same-resource ceiling entries; an empty action intersection contributes no authority.

Negative fixtures accompany this positive result; none is a special case that relaxes the type's relation:

  • A single mixed read and write proposal carrying the amount cap is refused at intake: the read supplies no amount for the cap to compare against, and Authority Set derivation does not drop the cap from the read fragment.

  • A write proposal naming a different currency cannot produce the USD intersection shown.

  • A proposal carrying a Common Constraint this deployment does not compare is refused with the invalid_authorization_details error code (Section 10), not derived with the constraint dropped.

D.4. Fixtures and Authoring Discipline

Versioned Intent and proposal fixtures with expected Authority Sets make the optional publication in Section 5 concrete. Reviewing their diffs on every policy change exposes altered grants before approval.

Fixtures cover normal template and narrowing outcomes, empty intersections, unknown constraints, incomparable values, and attempts to introduce delegation. They check each subset against both the proposal and the ceiling.

A further check runs the shipped configuration through intake, Authority Set derivation, and a real decision path, since a configuration that loads does not thereby authorize its intended workload. Applying the same entry checks at configuration load and at client intake keeps those two surfaces from disagreeing.

D.5. Ownership and Operational Signals

Table 13: Ownership and operational signals
Artifact Owner Responsibility
Derivation policy, ceilings, versions and issuance limits Mission Issuer operator Outer bounds and reproducible approval-time Authority Set derivation
Capability catalog and action properties Resource owner or service team Supported operations and the facts their constraints can evaluate
Templates and configured mappings Template author within issuer policy Candidate authority for supported Intent shapes

Templates amortize authoring across Missions and do not bypass the ceilings. The unmapped-resource rate, template-hit rate, and rule-exception rate show an operator where its policy authoring remains incomplete.

Appendix E. Integrity Anchor Test Vectors

These non-normative vectors let an implementation verify its anchor computation (Section 15.1, Section 15.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 15.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 15.1) reproduces these anchors exactly. A divergence indicates a JCS or encoding difference to resolve before interoperating.

Appendix F. OAuth Binding Mapping Assessment

This appendix is this document's Mapping Assessment of itself against the kernel and capabilities of the Mission Substrate contract (the "Mission Substrate Statement" section of [I-D.draft-mcguinness-mission-substrate]). It describes, in the Statement's form, how the surfaces this document defines realize that vocabulary.

The assessment is informative and adds no requirement: Section 19 alone defines conformance to this document. This document publishes no Mission Substrate Statement, makes no substrate-conformance claim, and takes no requirement from the substrate; each document references the other informatively.

The assessment applies to the substrate revision published with this document, in this document's base single-domain mode, with the optional capabilities active as the conditions below state.

For the kernel:

  1. The Mission Reference is mission_id: high-entropy, unambiguous within the issuer namespace, compared by exact string equality together with mission.issuer, never reassigned, retained for the audit horizon, and disclosed beyond the issuer only on this document's authorized surfaces.

  2. The Controller is the Mission Issuer (the authorization server), established through mission.issuer and the deployment's issuer trust (AS metadata and published keys).

  3. The Actor handle is the authenticated OAuth client at approval; the external Subject is fixed by this document's injective mapping; delegates are carried in the act chain; child and successor lineage is recorded through the parent and predecessor members; actor-type classification uses sub_profile and client-instance attestations where deployed.

  4. The Approved Context is the Mission Intent recorded verbatim, the recorded authority proposal where one was submitted, and the derived Authority Set; the immutable boundary is the record's immutable members; commitments are the typed integrity anchors (intent_hash, proposal_hash, authority_hash); a material change obtains a new approval through an expansion successor.

  5. The approval ceremony is this document's approval event (Section 6). Its direct realization, interactive or deferred, authenticates the Approver, establishes the Subject and authority source, renders the derived Authority Set and the effective expiry, and commits the record atomically. Under a standing-consent basis, such as a dispatch, the authorized policy ceremony decides the instance, and consent_principal remains the accountable owner (Section 13).

  6. The active predicate is stored state equal to active with the decision time strictly before the record's effective expires_at, the issuer materializing the resulting terminated transition, reason expired, lazily where it chooses; any other stored value, recognized or not, is non-active; transitions are authenticated lifecycle operations; a non-active Mission refuses issuance and derivation.

  7. The reliance bound is the record's effective expires_at (never later than the requested ceiling), which caps every derived credential's exp; the maximum residual after a Mission becomes non-active is the outstanding credential lifetime (Section 7.2).

  8. The propagation and join surfaces are: the mission claim (artifact issuance under the Mission, authority derivation, and lifecycle-gated issuance); the mission_id and mission_expires_at response members (correlation only); the introspection projection (state as of the response, caller authorization and minimization applying); the Status surfaces (state as of a signed observation with explicit freshness); and the grant binding (the issuer's native association of Mission, Subject, client, and credential).

  9. The governance record is the Mission Record with its approval evidence and lifecycle history, retained for the audit horizon, with integrity resting on record custody and the typed anchors.

The capability list:

Lifecycle-Gated Authorization:

Claim: supplied

Activation: always

Scope and defining sections: State-gated issuance and every derivation gate

Limitations: Outstanding credentials run to their own exp; the residual is bounded, not zero

State-Observable:

Claim: supplied

Activation: Status, introspection, or Signals companion active

Scope and defining sections: Those surfaces

Limitations: Staleness bounded by each surface's declared freshness

Structured Authority:

Claim: supplied

Activation: always

Scope and defining sections: authorization_details of AS-supported types (Section 5.5), each type's own specification defining semantics (for mission_resource_access, the Mission Resource Access Profile's Common Constraints, [I-D.draft-mcguinness-oauth-mission-resource-access])

Limitations: Semantics exist per supported type, not universally

Monotonic Derivation:

Claim: supplied

Activation: always

Scope and defining sections: The subset rule over covered types at every derivation, delegation, and attenuation point

Limitations: Covered transitions are attenuate; a cross-vocabulary transition is decide_anew, never silent attenuation

Credential-Bound:

Claim: supplied

Activation: always

Scope and defining sections: The mission claim on issued tokens

Limitations: Fact semantics: issuance under the Mission, authority derivation, lifecycle-gated issuance; state-as-of only via the State-Observable surfaces

Authorized Context Correlation:

Claim: supplied

Activation: the Delegation capability active (Section 12)

Scope and defining sections: The Token Exchange join at delegated issuance: the AS, as joining authority, joins the Mission and Subject carried by the Mission-bound subject_token with the delegate identity independently established by the actor_token or the delegate's own client authentication, binding both to the newly issued credential

Limitations: The base grant binding at issuance co-establishes its facts and is not a join; cross-authority joins are the Mission Authority Server's machinery, not this binding's

Independently Verifiable:

Claim: supplied

Activation: Mandate, signed Status, or audit companion active

Scope and defining sections: Anchor recomputation and signed artifacts per those profiles

Limitations: Signature verification never establishes current state

Portable Evidence:

Claim: supplied

Activation: Evidence, Mandate, or audit companion active

Scope and defining sections: Per those profiles

Limitations: The governance record is otherwise issuer-local

Temporal elements: every issued credential's exp is capped by the record's effective expires_at; state observations carry their surface's declared freshness; the residual after non-active is the outstanding credential lifetime. Failure behavior: an unknown lifecycle state is non-active; an unresolvable reference, a failed anchor verification, and an unknown authorization_details type fail closed; where an entry's activation condition does not hold, the property is not supplied, and a consumer cannot rely on it.

This document's three optional capabilities (Section 19) are surfaces an implementation may or may not offer, each independent of the others. The capability list above states scoped guarantee claims: properties this document supplies and the conditions under which each is supplied. The entries below relate each optional capability to those claims. Declaring an optional capability never creates a claim beyond the eight already stated above.

Introspection:

Exercises State-Observable. One of State-Observable's three named activation surfaces, alongside Status and Signals; declaring it activates that otherwise-conditional claim.

Delegation:

Exercises Lifecycle-Gated Authorization, Structured Authority, Monotonic Derivation, Credential-Bound, and Authorized Context Correlation (Section 12). The first four are supplied always, and Delegation exercises them rather than creating them. Authorized Context Correlation is activated by this capability; its supplier is the Token Exchange join, which binds the Mission and Subject of the subject_token and the delegate's identity to the delegated credential without creating a new grant binding (Section 8.1). The act chain itself supplies none of these claims: it is attribution, never authority.

Cross-Domain:

Exercises Lifecycle-Gated Authorization, Structured Authority, Monotonic Derivation, and Credential-Bound. Carries these four always-supplied guarantees across the domain hop: the Mission reference and the authority_hash the projection carries, intact, authority that only narrows, and projection gated on active state, while adding an interoperable projection surface the guarantees alone do not provide. It does not become Portable Evidence by crossing a domain: that claim activates only when an Evidence, Mandate, or audit companion is active, and Cross-Domain is not among them.

Appendix G. Document History

[[ To be removed from the final specification ]]

-01

Breaking wire changes

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

Acknowledgments

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].

Author's Address

Karl McGuinness
Independent