<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE rfc [
  <!ENTITY nbsp "&#160;">
  <!ENTITY zwsp "&#8203;">
  <!ENTITY nbhy "&#8209;">
  <!ENTITY wj "&#8288;">
]>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude"
     category="info"
     docName="draft-watts-oauth-agent-revocation-closure-00"
     ipr="trust200902"
     obsoletes=""
     updates=""
     submissionType="IETF"
     xml:lang="en"
     version="3">
  <front>
    <title abbrev="Agent Revocation Closure">Revocation Closure for Agentic Authorization Systems</title>
    <seriesInfo name="Internet-Draft" value="draft-watts-oauth-agent-revocation-closure-00"/>
    <author fullname="Deonte Watts" initials="D." surname="Watts">
      <organization>Independent Researcher</organization>
      <address>
        <postal>
          <city>San Francisco</city>
          <region>CA</region>
          <country>US</country>
        </postal>
        <email>deonte@goodshyt.fun</email>
        <uri>https://orcid.org/0009-0005-8586-3650</uri>
      </address>
    </author>
    <date year="2026"/>
    <area>Security</area>
    <workgroup>Web Authorization Protocol</workgroup>
    <keyword>agentic authorization</keyword>
    <keyword>revocation</keyword>
    <keyword>delegation</keyword>
    <keyword>OAuth</keyword>
    <keyword>workload identity</keyword>
    <abstract>
      <t>Agentic systems can derive and distribute authority across delegated agents, workloads, credentials, queues, and long-running operations. Existing revocation mechanisms can invalidate a credential or authorization grant, but credential invalidation alone does not establish that every path from revoked authority to a consequential effect has been closed.</t>
      <t>This document defines a protocol-neutral model for revocation closure. It introduces authority graphs, consequential sinks, revocation cut sets, closure states, closure budgets, and closure receipts. The model is intended to complement OAuth 2.0, workload identity, transaction-token, and agent-authorization work. It does not define a new authorization protocol, token format, or AI safety mechanism.</t>
    </abstract>
  </front>

  <middle>
    <section anchor="intro">
      <name>Introduction</name>
      <t>Authorization systems usually answer whether an action is permitted at a point in time. Agentic systems add a second problem: authority can be delegated, transformed, cached, queued, or propagated across multiple workloads before a revocation request arrives. In such systems, revoking one token or one principal may be necessary without being sufficient to stop consequential activity.</t>
      <t><xref target="RFC7009"/> defines OAuth 2.0 token revocation and permits invalidation of a token and, where applicable, related tokens or grants. <xref target="I-D.chen-oauth-agent-revocation"/> explores agent-level cascade revocation. <xref target="I-D.klrc-aiagent-auth"/> describes the use of OAuth and workload identity for agent authentication and authorization. This document addresses a narrower semantic question: when may an implementation claim that revocation is complete?</t>
      <t>The core distinction is:</t>
      <figure>
        <artwork type="ascii-art"><![CDATA[
   revocation request  !=  authorization invalidation  !=  revocation closure
]]></artwork>
      </figure>
      <t>A revocation request is an instruction. Authorization invalidation is a state change affecting one or more grants, tokens, or policy decisions. Revocation closure is the stronger condition that, within a declared enforcement scope, no remaining authority path can produce a new consequential effect on behalf of the revoked authority epoch.</t>

      <section anchor="requirements-language">
        <name>Requirements Language</name>
        <t>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 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they appear in all capitals, as shown here.</t>
      </section>

      <section anchor="non-goals">
        <name>Non-Goals</name>
        <t>This document does not attempt to infer model intent, deception, cognition, or semantic state. It does not specify physical shutdown mechanisms, require a particular identity system, define a new OAuth grant type, or claim closure outside the system boundary declared by an implementation.</t>
      </section>
    </section>

    <section anchor="terminology">
      <name>Terminology</name>
      <dl newline="true">
        <dt>Authority Epoch:</dt>
        <dd>A bounded lifetime of authority rooted in one authorization event or independently reauthorized continuation. A new authorization after closure creates a new authority epoch.</dd>
        <dt>Authority Graph:</dt>
        <dd>A directed graph whose edges represent capabilities or authorization-bearing transitions that can contribute to a consequential effect.</dd>
        <dt>Authorization Invalidation:</dt>
        <dd>A state transition after which a previously valid authorization artifact, grant, policy decision, or derived authority MUST NOT authorize new actions within its defined scope.</dd>
        <dt>Consequential Sink:</dt>
        <dd>A resource or operation whose successful invocation creates an externally relevant effect, including network transmission, persistent state change, credential use, queue execution, financial or resource commitment, or actuator invocation.</dd>
        <dt>Derived Authority:</dt>
        <dd>Authority obtained from, delegated by, exchanged from, or otherwise causally dependent on another authorization artifact or authority epoch.</dd>
        <dt>Pending Effect:</dt>
        <dd>An operation authorized before invalidation but not yet irreversibly committed, such as queued work, delayed execution, or an asynchronous side effect.</dd>
        <dt>Revocation Cut Set:</dt>
        <dd>A set of independently enforceable authority edges such that every declared path from the revoked authority root to every in-scope consequential sink crosses at least one edge in the set.</dd>
        <dt>Revocation Closure:</dt>
        <dd>The condition in which all required cut-set edges have been enforced and no unresolved declared path remains by which the revoked authority epoch can authorize a new consequential effect.</dd>
        <dt>Closure Receipt:</dt>
        <dd>An integrity-protected statement describing the scope, status, evidence, and limitations of a revocation-closure determination.</dd>
      </dl>
    </section>

    <section anchor="principles">
      <name>Design Principles</name>
      <ol>
        <li>Revocation request is not closure. An accepted request MUST NOT by itself be represented as completed closure.</li>
        <li>Credential invalidation is not consequence reversal. Effects already irreversibly committed before closure may remain.</li>
        <li>Derived authority is in scope unless independently reauthorized. An implementation claiming closure MUST account for derived credentials, delegated agents, transaction context, queues, and other authority-bearing descendants identified by its declared model.</li>
        <li>Unknown is not closed. Missing evidence or unresolved authority paths MUST NOT be silently treated as successful closure.</li>
        <li>Closure is bounded by declared coverage. A closure claim MUST identify the enforcement scope to which it applies and MUST NOT imply closure of unknown or out-of-scope systems.</li>
        <li>Fresh authorization creates a new epoch. A closure receipt for one authority epoch MUST NOT be reused as evidence that a later, independently authorized epoch is closed.</li>
      </ol>
    </section>

    <section anchor="graph-model">
      <name>Authority Graph and Closure Condition</name>
      <t>Let G = (V,E) be a directed authority graph. Let C be the root of the authority epoch being revoked, and let Q be the set of consequential sinks in the declared enforcement scope. Each directed path from C to a member of Q represents a modeled way in which that authority epoch can contribute to a new consequential effect.</t>
      <t>A revocation cut set K is valid only if every declared C-to-Q path intersects K. Revocation closure is achieved only after the enforcement point associated with every required member of K is active and no unresolved C-to-Q path remains.</t>
      <figure>
        <name>Example Authority Graph</name>
        <artwork type="ascii-art"><![CDATA[
                     +--> delegated agent --[e2]--> API sink
                    /
   authority root -+----> derived token ----[e4]--> storage sink
                    \
                     +--> work queue -------[e6]--> job sink

   Example revocation cut set K = { e2, e4, e6 }

   Closure requires each declared root-to-sink path to cross an
   enforced cut edge. Revoking only the root credential is insufficient
   if derived authority or already-authorized queued work can still act.
]]></artwork>
      </figure>
      <t>This model does not require implementations to expose their complete internal graph on the wire. Implementations MAY use internal topology, dependency indexes, grant lineage, transaction lineage, or equivalent mechanisms. However, an implementation claiming closure MUST have a deterministic method for establishing that the declared closure condition has been satisfied.</t>

      <section anchor="dynamic-graphs">
        <name>Dynamic Graphs</name>
        <t>Agentic systems can create new delegates and authority edges dynamically. Once invalidation begins, an implementation MUST prevent the revoked authority epoch from creating new authority-bearing edges that bypass the cut set. If the system cannot establish this property, closure status MUST be <tt>UNKNOWN</tt>, <tt>PARTIAL</tt>, or <tt>FAILED</tt>, but not <tt>CLOSED</tt>.</t>
      </section>

      <section anchor="closure-budget">
        <name>Closure Budget</name>
        <t>A deployment MAY define a closure budget Delta measured from acceptance of a revocation request to completed closure. If such a budget is advertised, the implementation MUST distinguish request time from completed-closure time. Cross-system timestamps MUST NOT be compared as if they share a trusted clock unless the deployment has established the required clock properties. Implementations can instead use local monotonic measurements, signed sequencing, or protocol-specific ordering.</t>
      </section>
    </section>

    <section anchor="states">
      <name>Closure State Model</name>
      <t>Implementations that expose closure status SHOULD use semantics equivalent to the following states, even if a protocol uses different labels:</t>
      <dl newline="true">
        <dt>REQUESTED:</dt>
        <dd>A revocation request has been accepted. No closure claim is made.</dd>
        <dt>PROPAGATING:</dt>
        <dd>Invalidation is being enforced across one or more authority paths.</dd>
        <dt>CLOSED:</dt>
        <dd>All required cut-set enforcement has completed for the declared scope and no unresolved modeled path remains.</dd>
        <dt>PARTIAL:</dt>
        <dd>Some paths have been closed, but one or more known paths remain unresolved.</dd>
        <dt>FAILED:</dt>
        <dd>Required enforcement could not be completed or a declared closure budget was exceeded.</dd>
        <dt>UNKNOWN:</dt>
        <dd>Available evidence is insufficient to determine closure.</dd>
      </dl>
      <t><tt>PARTIAL</tt>, <tt>FAILED</tt>, and <tt>UNKNOWN</tt> MUST NOT be interpreted as <tt>CLOSED</tt>. A relying component that requires closure before continuing a sensitive transition SHOULD fail closed when presented with one of those states.</t>
    </section>

    <section anchor="receipt">
      <name>Closure Receipt Model</name>
      <t>A Closure Receipt is a protocol-neutral evidence object. This document does not define its encoding. A future profile could encode it as a signed JWT, a COSE object, an OAuth response object, a transaction-token claim, or another protocol-native structure.</t>
      <t>A closure receipt SHOULD carry sufficient information to answer five questions: what authority epoch was affected, what scope was evaluated, what status was reached, when the status was reached, and what evidence or limitations bound the claim.</t>
      <t>The following is a non-normative JSON example:</t>
      <figure>
        <name>Illustrative Closure Receipt</name>
        <sourcecode type="json" markers="true"><![CDATA[
{
  "version": 1,
  "closure_id": "urn:uuid:3cf0f843-64ef-4ef9-96e3-91bb9542d6f6",
  "authority_epoch": "urn:example:epoch:7f42",
  "authority_root": "sha256:7b7f...",
  "status": "closed",
  "requested_at": "2026-09-12T18:00:00Z",
  "closed_at": "2026-09-12T18:00:00.184Z",
  "coverage": {
    "sink_classes": ["api", "credential", "queue", "storage"],
    "policy_id": "urn:example:policy:agent-revoke-v3"
  },
  "cut_set_digest": "sha256:50d1...",
  "evidence_digest": "sha256:ad27...",
  "unresolved_paths": []
}
]]></sourcecode>
      </figure>
      <t>When a receipt crosses a trust boundary, its integrity and issuer authenticity MUST be protected by the enclosing protocol. A receipt MUST NOT contain bearer secrets or reusable credentials. Implementations SHOULD minimize topology and identity disclosure, using opaque identifiers or digests where detailed graph disclosure is unnecessary.</t>
    </section>

    <section anchor="oauth-mapping">
      <name>Mapping to OAuth and Workload Identity</name>
      <t>This section explains how the closure model relates to existing IETF mechanisms. It does not update those mechanisms.</t>
      <ul>
        <li><xref target="RFC7009"/> can initiate invalidation of OAuth tokens and grants. A successful revocation response does not, by itself, demonstrate that every derived authorization path, queued effect, or independently cached decision has reached closure.</li>
        <li><xref target="RFC8693"/> enables security-token exchange. Where exchanged tokens derive authority from a revoked root, deployments claiming closure need a deterministic policy for invalidating or otherwise cutting those derived paths unless they have been independently reauthorized.</li>
        <li><xref target="RFC9396"/> provides structured authorization details. Such details can help identify the scope or purpose whose authority is being closed, but do not themselves provide closure semantics.</li>
        <li><xref target="I-D.ietf-oauth-transaction-tokens"/> propagates identity, authorization, and request context through a call chain. Transaction-scoped enforcement points can form part of a revocation cut set.</li>
        <li><xref target="I-D.ietf-wimse-arch"/> provides workload-identity architecture useful for identifying enforcement subjects and workloads participating in a closure domain.</li>
        <li><xref target="I-D.chen-oauth-agent-revocation"/> defines explicit agent-level and cascade-revocation mechanisms. The closure model in this document is complementary: it specifies the semantic condition under which a deployment can state that propagation has actually completed.</li>
        <li><xref target="I-D.liu-oauth-authorization-evidence"/> addresses authorization evidence associated with consent and access tokens. A Closure Receipt concerns evidence produced after invalidation and should not be confused with evidence that authority was valid when originally granted.</li>
      </ul>
      <t>OAuth deployments implementing this model SHOULD follow the security guidance in <xref target="RFC9700"/>.</t>
    </section>

    <section anchor="example">
      <name>Worked Example: Delegation plus Queued Work</name>
      <t>A user authorizes Agent A. Agent A obtains authority for Service B and submits a delayed operation to Queue Q. Service B also obtains a derived credential for Resource Server R.</t>
      <t>At time t0, the user revokes Agent A. Invalidating A's access token is not sufficient for closure if the derived credential remains valid or if Q can execute the already-authorized delayed operation after t0.</t>
      <t>One valid cut set for this deployment might include: (1) a gate preventing use of the derived credential at R, and (2) a gate that cancels or blocks the queued operation before the job sink commits an external effect. Only after both enforcement points report success may the deployment produce <tt>CLOSED</tt> for the declared scope.</t>
      <t>If Q is outside the deployment's enforcement domain, the receipt can report <tt>PARTIAL</tt> or identify Q as out of scope. It MUST NOT represent global closure.</t>
    </section>

    <section anchor="operational">
      <name>Operational Considerations</name>
      <t>Implementations need not continuously materialize a full graph. A practical system can derive closure from grant lineage, token-exchange lineage, transaction identifiers, workload identities, queue ownership, policy dependencies, and sink-specific enforcement acknowledgements.</t>
      <t>Closure computation SHOULD be idempotent. Repeated processing of the same revocation event SHOULD converge on the same or a stricter result for a given authority epoch. A component MUST NOT downgrade a known unresolved path into a closed result merely because evidence becomes unavailable.</t>
      <t>Because revocation can create large fan-out, implementations SHOULD defend closure mechanisms against denial-of-service amplification. Rate limits, bounded delegation depth, batched enforcement, and asynchronous status can be used where appropriate, provided they do not cause <tt>PROPAGATING</tt> or <tt>PARTIAL</tt> states to be misrepresented as <tt>CLOSED</tt>.</t>
    </section>

    <section anchor="privacy">
      <name>Privacy Considerations</name>
      <t>Authority graphs can reveal organizational structure, user relationships, delegation topology, resource names, and sensitive operational context. Closure receipts SHOULD disclose only the minimum information necessary for the relying party to evaluate the closure claim.</t>
      <t>Opaque authority-epoch identifiers, hashed cut-set descriptions, scoped evidence digests, and selective disclosure can reduce unnecessary topology exposure. Closure evidence SHOULD NOT become a durable global correlation identifier for a user or agent across unrelated authorization contexts.</t>
    </section>

    <section anchor="security">
      <name>Security Considerations</name>
      <t>A forged <tt>CLOSED</tt> result is security-critical because it can cause a relying party to proceed under the false assumption that revoked authority can no longer create consequences. Closure receipts crossing trust boundaries MUST therefore be integrity protected and authenticated.</t>
      <t>Receipts are vulnerable to replay if not bound to an authority epoch, scope, and freshness context. A relying party MUST reject a receipt that does not correspond to the authority epoch being evaluated.</t>
      <t>An incomplete authority graph creates false closure. Implementations MUST treat known-but-unobservable dependencies conservatively. Unknown external systems, offline actors, cached credentials, pending asynchronous operations, and independently authorized descendants MUST be represented as limitations, unresolved paths, or separate authority epochs as appropriate.</t>
      <t>Revocation is inherently subject to races. A consequential effect may commit while revocation is propagating. Implementations MUST NOT claim that closure reverses effects that became irreversible before closure.</t>
      <t>Closure evidence itself can become a sensitive security artifact. Evidence stores SHOULD be access controlled and SHOULD provide tamper evidence suitable for the deployment's threat model.</t>
    </section>

    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>

  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
      </references>

      <references>
        <name>Informative References</name>
        <reference anchor="RFC7009" target="https://www.rfc-editor.org/info/rfc7009">
          <front>
            <title>OAuth 2.0 Token Revocation</title>
            <author initials="T." surname="Lodderstedt"/>
            <author initials="S." surname="Dronia"/>
            <author initials="M." surname="Scurtescu"/>
            <date month="August" year="2013"/>
          </front>
          <seriesInfo name="RFC" value="7009"/>
          <seriesInfo name="DOI" value="10.17487/RFC7009"/>
        </reference>
        <reference anchor="RFC8693" target="https://www.rfc-editor.org/info/rfc8693">
          <front>
            <title>OAuth 2.0 Token Exchange</title>
            <author initials="M." surname="Jones"/>
            <author initials="A." surname="Nadalin"/>
            <author initials="B." surname="Campbell"/>
            <author initials="J." surname="Bradley"/>
            <author initials="C." surname="Mortimore"/>
            <date month="January" year="2020"/>
          </front>
          <seriesInfo name="RFC" value="8693"/>
          <seriesInfo name="DOI" value="10.17487/RFC8693"/>
        </reference>
        <reference anchor="RFC9396" target="https://www.rfc-editor.org/info/rfc9396">
          <front>
            <title>OAuth 2.0 Rich Authorization Requests</title>
            <author initials="T." surname="Lodderstedt"/>
            <author initials="J." surname="Richer"/>
            <author initials="B." surname="Campbell"/>
            <date month="May" year="2023"/>
          </front>
          <seriesInfo name="RFC" value="9396"/>
          <seriesInfo name="DOI" value="10.17487/RFC9396"/>
        </reference>
        <reference anchor="RFC9700" target="https://www.rfc-editor.org/info/rfc9700">
          <front>
            <title>Best Current Practice for OAuth 2.0 Security</title>
            <author initials="T." surname="Lodderstedt"/>
            <author initials="J." surname="Bradley"/>
            <author initials="A." surname="Labunets"/>
            <author initials="D." surname="Fett"/>
            <date month="January" year="2025"/>
          </front>
          <seriesInfo name="BCP" value="240"/>
          <seriesInfo name="RFC" value="9700"/>
          <seriesInfo name="DOI" value="10.17487/RFC9700"/>
        </reference>

        <reference anchor="I-D.ietf-wimse-arch" target="https://datatracker.ietf.org/doc/draft-ietf-wimse-arch/">
          <front>
            <title>Workload Identity in a Multi System Environment (WIMSE) Architecture</title>
            <author initials="J." surname="Salowey"/>
            <author initials="Y." surname="Rosomakho"/>
            <author initials="H." surname="Tschofenig"/>
            <date month="July" year="2026"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-wimse-arch-08"/>
        </reference>
        <reference anchor="I-D.klrc-aiagent-auth" target="https://datatracker.ietf.org/doc/draft-klrc-aiagent-auth/">
          <front>
            <title>AI Agent Authentication and Authorization</title>
            <author initials="P." surname="Kasselman"/>
            <author initials="J." surname="Lombardo"/>
            <author initials="Y." surname="Rosomakho"/>
            <author initials="B." surname="Campbell"/>
            <author initials="N." surname="Steele"/>
            <author initials="A." surname="Parecki"/>
            <date month="July" year="2026"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-klrc-aiagent-auth-03"/>
        </reference>
        <reference anchor="I-D.ietf-oauth-transaction-tokens" target="https://datatracker.ietf.org/doc/draft-ietf-oauth-transaction-tokens/">
          <front>
            <title>Transaction Tokens</title>
            <author initials="A." surname="Tulshibagwale"/>
            <author initials="G." surname="Fletcher"/>
            <author initials="P." surname="Kasselman"/>
            <date month="July" year="2026"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-oauth-transaction-tokens-11"/>
        </reference>
        <reference anchor="I-D.chen-oauth-agent-revocation" target="https://datatracker.ietf.org/doc/draft-chen-oauth-agent-revocation/">
          <front>
            <title>OAuth 2.0 Agent Authorization Explicit Revocation</title>
            <author initials="M." surname="Chen"/>
            <author initials="L." surname="Su"/>
            <date month="April" year="2026"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-chen-oauth-agent-revocation-00"/>
        </reference>
        <reference anchor="I-D.liu-oauth-authorization-evidence" target="https://datatracker.ietf.org/doc/draft-liu-oauth-authorization-evidence/">
          <front>
            <title>Authorization Evidence and Audit Trail for OAuth 2.0 Access Tokens</title>
            <author initials="D." surname="Liu"/>
            <author initials="H." surname="Zhu"/>
            <author initials="S." surname="Krishnan"/>
            <author initials="A." surname="Parecki"/>
            <date month="June" year="2026"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-liu-oauth-authorization-evidence-01"/>
        </reference>
      </references>
    </references>

    <section anchor="open-issues" numbered="false">
      <name>Open Questions for Further Work</name>
      <t>Future protocol work could determine whether closure receipts require a common encoding, how closure status should be discovered across trust domains, how graph coverage can be proven without disclosing sensitive topology, and how closure evidence should bind to protocol-specific authorization epochs.</t>
    </section>
  </back>
</rfc>
