<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.31 (Ruby 3.2.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-mishra-oauth-agent-grants-01" category="info" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title abbrev="DAAP">Delegated Agent Authorization Protocol (DAAP)</title>
    <seriesInfo name="Internet-Draft" value="draft-mishra-oauth-agent-grants-01"/>
    <author fullname="Sanjeev Kumar">
      <organization>Grantex</organization>
      <address>
        <email>mishra.sanjeev@gmail.com</email>
        <uri>https://grantex.dev</uri>
      </address>
    </author>
    <date year="2026" month="March" day="02"/>
    <area>Security</area>
    <workgroup>Web Authorization Protocol</workgroup>
    <keyword>AI agents</keyword>
    <keyword>authorization</keyword>
    <keyword>OAuth</keyword>
    <keyword>delegation</keyword>
    <keyword>JWT</keyword>
    <keyword>grant token</keyword>
    <abstract>
      <?line 80?>

<t>Artificial intelligence (AI) agents increasingly take autonomous actions -- submitting forms, initiating payments, and sending communications -- on behalf of human users across third-party services. This document defines the Delegated Agent Authorization Protocol (DAAP), an open, model-neutral, framework-agnostic protocol that specifies: cryptographic agent identity using Decentralized Identifiers (DIDs); a human-consent-based grant authorization flow modelled on OAuth 2.0; a signed JSON Web Token (JWT) grant token format with agent-specific claims; a revocation model with online verification; a hash-chained append-only audit trail; a policy engine for automated authorization decisions; a multi-agent delegation model with cascade revocation; budget controls for spending limits; real-time event streaming; a credential vault for secure secret storage; and external policy backend integration with OPA and Cedar. DAAP fills a gap unaddressed by existing OAuth 2.0 extensions: verifying that a specific human authorized a specific AI agent to perform a specific action, revoking that authorization in real time, and producing a tamper-evident record of what the agent did.</t>
    </abstract>
  </front>
  <middle>
    <?line 84?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Deployed AI agents operate across arbitrary third-party services using credentials and permissions that belong to the human users they serve. Today, no interoperable standard exists for:</t>
      <ol spacing="normal" type="1"><li>
          <t>Verifying that an agent is who it claims to be</t>
        </li>
        <li>
          <t>Confirming that a specific human authorized a specific agent to perform a specific action</t>
        </li>
        <li>
          <t>Revoking that authorization in real time across all active tokens</t>
        </li>
        <li>
          <t>Producing a tamper-evident record of agent activity</t>
        </li>
      </ol>
      <t>OAuth 2.0 <xref target="RFC6749"/> and its extensions address authorization for applications acting on behalf of users, but were not designed for the AI agent use case, which introduces distinct requirements:</t>
      <ul spacing="normal">
        <li>
          <t><strong>Agent identity</strong>: Unlike OAuth clients, AI agents are runtime entities that may be spawned dynamically and must carry a persistent cryptographic identity independent of the authorization server.</t>
        </li>
        <li>
          <t><strong>Multi-agent delegation</strong>: An agent may spawn sub-agents, each of which requires a grant scoped to a subset of the parent's permissions, with the entire delegation tree revocable by the original principal.</t>
        </li>
        <li>
          <t><strong>Tamper-evident audit trail</strong>: Regulated environments require a cryptographically linked record of agent activity that is verifiable without trust in the audit log operator.</t>
        </li>
        <li>
          <t><strong>Policy-driven automation</strong>: High-volume agent deployments require automated authorization decisions (auto-approve, auto-deny) without per-request human interaction, while preserving the human principal's ability to revoke at any time.</t>
        </li>
        <li>
          <t><strong>Budget controls</strong>: Agents acting in financial contexts require per-grant spending limits with atomic debit semantics and threshold alerts.</t>
        </li>
        <li>
          <t><strong>Real-time observability</strong>: Operators require real-time event streams for monitoring agent activity, grant lifecycle events, and budget threshold crossings.</t>
        </li>
      </ul>
      <t>DAAP addresses these requirements as a layered extension to OAuth 2.0 concepts, reusing RFC-standard JWT and JWK primitives wherever possible.</t>
      <section anchor="changes-since-00">
        <name>Changes Since -00</name>
        <t>This revision adds the following extensions:</t>
        <ul spacing="normal">
          <li>
            <t>Budget Controls (<xref target="budget-controls"/>): per-grant spending limits with the <tt>bdg</tt> JWT claim, atomic debit operations, and threshold alerting.</t>
          </li>
          <li>
            <t>Event Streaming (<xref target="event-streaming"/>): SSE and WebSocket endpoints for real-time event delivery.</t>
          </li>
          <li>
            <t>Credential Vault (<xref target="credential-vault"/>): encrypted per-user credential storage with token-to-credential exchange.</t>
          </li>
          <li>
            <t>External Policy Backends (<xref target="external-policy-backends"/>): integration with OPA and Cedar as policy evaluation targets.</t>
          </li>
          <li>
            <t>Implementation Report (Appendix B): conformance results and SDK coverage.</t>
          </li>
          <li>
            <t>Updated Conformance Requirements (<xref target="conformance"/>) with <bcp14>OPTIONAL</bcp14> extensions for Budget, Events, Vault, and Policy Backends.</t>
          </li>
        </ul>
      </section>
      <section anchor="requirements-language">
        <name>Requirements Language</name>
        <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" 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>
        <?line -18?>

</section>
      <section anchor="terminology">
        <name>Terminology</name>
        <t>The following terms are used throughout this document:</t>
        <dl newline="true">
          <dt>Agent:</dt>
          <dd>
            <t>An AI-powered software process that takes autonomous actions on behalf of a Principal. An Agent has a persistent cryptographic identity (DID) and must obtain an explicit grant from its Principal before acting on their behalf.</t>
          </dd>
          <dt>Principal:</dt>
          <dd>
            <t>The human user who authorizes an Agent to act on their behalf. The Principal is the subject (<tt>sub</tt>) of any Grant Token issued by the authorization server.</t>
          </dd>
          <dt>Developer:</dt>
          <dd>
            <t>The organization or individual who built and operates the Agent. The Developer authenticates to the authorization server using an API key.</t>
          </dd>
          <dt>Authorization Server:</dt>
          <dd>
            <t>A server implementing this specification that issues Grant Tokens, maintains the grant registry, and provides the JWKS endpoint for offline verification.</t>
          </dd>
          <dt>Service:</dt>
          <dd>
            <t>Any API or platform that receives requests from an Agent. Services <bcp14>MUST</bcp14> verify Grant Tokens before acting on agent requests.</t>
          </dd>
          <dt>Grant:</dt>
          <dd>
            <t>A persistent record of permission given by a Principal to an Agent for a specific set of Scopes. A Grant is represented to the Agent as a Grant Token.</t>
          </dd>
          <dt>Grant Token:</dt>
          <dd>
            <t>A signed JWT <xref target="RFC7519"/> representing a valid, non-revoked Grant. Grant Tokens are short-lived credentials carrying agent-specific claims defined in <xref target="grant-token-format"/>.</t>
          </dd>
          <dt>Scope:</dt>
          <dd>
            <t>A named permission string following the format <tt>resource:action[:constraint]</tt> as defined in <xref target="scope-format"/>.</t>
          </dd>
          <dt>DID:</dt>
          <dd>
            <t>A Decentralized Identifier <xref target="DID-CORE"/> -- the Agent's cryptographic identity. In DAAP, Agent DIDs take the form <tt>did:grantex:&lt;agent_id&gt;</tt>.</t>
          </dd>
          <dt>Policy:</dt>
          <dd>
            <t>A rule evaluated by the Policy Engine (<xref target="policy-engine"/>) that automatically approves or denies an authorization request before the consent UI is shown to the Principal.</t>
          </dd>
          <dt>Anomaly:</dt>
          <dd>
            <t>A behavioral deviation from an agent's established activity baseline, detected by the runtime monitoring system defined in <xref target="anomaly-detection"/>.</t>
          </dd>
          <dt>Budget Allocation:</dt>
          <dd>
            <t>A per-grant spending limit that constrains the total monetary value of actions an Agent may take under a single Grant.</t>
          </dd>
        </dl>
      </section>
    </section>
    <section anchor="agent-identity">
      <name>Agent Identity</name>
      <section anchor="did-format">
        <name>DID Format</name>
        <t>Every Agent registered with a DAAP-compliant Authorization Server receives a Decentralized Identifier of the form:</t>
        <artwork><![CDATA[
did:grantex:<agent_id>
]]></artwork>
        <t>where <tt>&lt;agent_id&gt;</tt> is a ULID (Universally Unique Lexicographically Sortable Identifier) <xref target="ULID"/> prefixed with <tt>ag_</tt>.</t>
        <t>Example:</t>
        <artwork><![CDATA[
did:grantex:ag_01HXYZ123abcDEF456ghi
]]></artwork>
      </section>
      <section anchor="identity-document">
        <name>Identity Document</name>
        <t>The DID resolves to an identity document at the Authorization Server. The document <bcp14>MUST</bcp14> contain the following fields:</t>
        <sourcecode type="json"><![CDATA[
{
  "@context": "https://grantex.dev/v1/identity",
  "id": "did:grantex:ag_01HXYZ123abcDEF456ghi",
  "developer": "org_yourcompany",
  "name": "travel-booker",
  "description": "Books flights and hotels on behalf of users",
  "declaredScopes": ["calendar:read", "payments:initiate:max_500"],
  "status": "active",
  "createdAt": "2026-02-01T00:00:00Z",
  "verificationMethod": [{
    "id": "did:grantex:ag_01HXYZ123abcDEF456ghi#key-1",
    "type": "JsonWebKey2020",
    "publicKeyJwk": { "..." : "..." }
  }]
}
]]></sourcecode>
      </section>
      <section anchor="key-management">
        <name>Key Management</name>
        <t>Authorization Servers <bcp14>MUST</bcp14> adhere to the following key management requirements:</t>
        <ul spacing="normal">
          <li>
            <t>Authorization Servers <bcp14>MUST</bcp14> use RS256 (RSASSA-PKCS1-v1_5 using SHA-256) <xref target="RFC7518"/> for signing Grant Tokens.</t>
          </li>
          <li>
            <t>Private signing keys <bcp14>MUST</bcp14> never be transmitted or stored outside the Authorization Server's trust boundary.</t>
          </li>
          <li>
            <t>Public keys <bcp14>MUST</bcp14> be published at <tt>/.well-known/jwks.json</tt> as a JWK Set <xref target="RFC7517"/>.</t>
          </li>
          <li>
            <t>Key rotation <bcp14>MUST</bcp14> be supported without changing the Agent's DID or invalidating existing, unexpired Grant Tokens. Rotated keys <bcp14>MUST</bcp14> remain in the JWKS until all tokens signed with them have expired.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="scope-format">
      <name>Scope Format and Registry</name>
      <section anchor="format">
        <name>Format</name>
        <t>Scopes are permission strings of the form:</t>
        <artwork><![CDATA[
resource:action[:constraint]
]]></artwork>
        <t>where:</t>
        <ul spacing="normal">
          <li>
            <t><tt>resource</tt> identifies the data or service being accessed (e.g., <tt>calendar</tt>, <tt>payments</tt>, <tt>email</tt>)</t>
          </li>
          <li>
            <t><tt>action</tt> identifies the operation (e.g., <tt>read</tt>, <tt>write</tt>, <tt>send</tt>, <tt>initiate</tt>, <tt>delete</tt>)</t>
          </li>
          <li>
            <t><tt>constraint</tt> is an optional limiting parameter (e.g., <tt>max_500</tt> for a spending limit)</t>
          </li>
        </ul>
      </section>
      <section anchor="standard-scope-registry">
        <name>Standard Scope Registry</name>
        <t>The following scopes constitute the normative standard registry. Implementations <bcp14>MUST</bcp14> support all standard scopes that are relevant to the resources they expose:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Scope</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>calendar:read</tt></td>
              <td align="left">Read calendar events</td>
            </tr>
            <tr>
              <td align="left">
                <tt>calendar:write</tt></td>
              <td align="left">Create, modify, and delete calendar events</td>
            </tr>
            <tr>
              <td align="left">
                <tt>email:read</tt></td>
              <td align="left">Read email messages</td>
            </tr>
            <tr>
              <td align="left">
                <tt>email:send</tt></td>
              <td align="left">Send emails on the Principal's behalf</td>
            </tr>
            <tr>
              <td align="left">
                <tt>email:delete</tt></td>
              <td align="left">Delete email messages</td>
            </tr>
            <tr>
              <td align="left">
                <tt>files:read</tt></td>
              <td align="left">Read files and documents</td>
            </tr>
            <tr>
              <td align="left">
                <tt>files:write</tt></td>
              <td align="left">Create and modify files</td>
            </tr>
            <tr>
              <td align="left">
                <tt>payments:read</tt></td>
              <td align="left">View payment history and balances</td>
            </tr>
            <tr>
              <td align="left">
                <tt>payments:initiate</tt></td>
              <td align="left">Initiate payments of any amount</td>
            </tr>
            <tr>
              <td align="left">
                <tt>payments:initiate:max_N</tt></td>
              <td align="left">Initiate payments up to N in the account's base currency</td>
            </tr>
            <tr>
              <td align="left">
                <tt>profile:read</tt></td>
              <td align="left">Read profile and identity information</td>
            </tr>
            <tr>
              <td align="left">
                <tt>contacts:read</tt></td>
              <td align="left">Read address book and contacts</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="custom-scopes">
        <name>Custom Scopes</name>
        <t>Services <bcp14>MAY</bcp14> define custom scopes using reverse-domain notation per <xref target="RFC3986"/>:</t>
        <artwork><![CDATA[
com.stripe.charges:create:max_5000
io.github.issues:create
]]></artwork>
        <t>Custom scopes <bcp14>MUST</bcp14> use reverse-domain notation to avoid collisions with the standard registry.</t>
      </section>
      <section anchor="scope-display-requirements">
        <name>Scope Display Requirements</name>
        <t>Authorization Servers <bcp14>MUST</bcp14> maintain a human-readable description for each scope in their registry. Consent UIs <bcp14>MUST</bcp14> display human-readable descriptions to Principals, never raw scope strings.</t>
      </section>
    </section>
    <section anchor="grant-flow">
      <name>Grant Authorization Flow</name>
      <section anchor="overview">
        <name>Overview</name>
        <t>The DAAP grant flow is modelled on the OAuth 2.0 Authorization Code flow <xref target="RFC6749"/> with the following adaptations: the client is always a Developer (identified by an API key), the resource owner is a Principal identified by the Developer's internal user identifier, and the resulting token carries agent-specific claims.</t>
        <artwork type="ascii-art"><![CDATA[
Developer App          Authorization Server       Principal
     |                         |                      |
     | POST /v1/authorize       |                      |
     | {agentId, principalId,  |                      |
     |  scopes, redirectUri}    |                      |
     |------------------------>|                      |
     |                         |                      |
     |<------------------------|                      |
     | {authRequestId,          |                      |
     |  consentUrl}             |                      |
     |                         |                      |
     | redirect user --------------------------------->|
     |                         | consent UI displayed |
     |                         |<---------------------|
     |                         | Principal approves   |
     |                         |                      |
     |<------------------------------------------------|
     | redirectUri?code=AUTH_CODE                      |
     |                         |                      |
     | POST /v1/token           |                      |
     | {code, agentId}          |                      |
     |------------------------>|                      |
     |<------------------------|                      |
     | {grantToken,             |                      |
     |  refreshToken}           |                      |
]]></artwork>
      </section>
      <section anchor="authorization-request">
        <name>Authorization Request</name>
        <t>The Developer initiates the flow by sending:</t>
        <sourcecode type="http"><![CDATA[
POST /v1/authorize
Authorization: Bearer <api_key>
Content-Type: application/json

{
  "agentId": "ag_01HXYZ123abc",
  "principalId": "user_abc123",
  "scopes": ["calendar:read", "payments:initiate:max_500"],
  "expiresIn": "24h",
  "redirectUri": "https://yourapp.com/auth/callback",
  "state": "<csrf_token>",
  "audience": "https://api.targetservice.com"
}
]]></sourcecode>
        <t>The <tt>audience</tt> field is <bcp14>OPTIONAL</bcp14>. When present, it <bcp14>MUST</bcp14> be embedded as the <tt>aud</tt> claim in the issued Grant Token. The <tt>state</tt> parameter is <bcp14>REQUIRED</bcp14> and <bcp14>MUST</bcp14> be validated by the Developer's callback handler to prevent CSRF attacks. The <tt>redirectUri</tt> <bcp14>MUST</bcp14> match a URI pre-registered for the Agent at the Authorization Server.</t>
        <t>Authorization Servers <bcp14>MUST</bcp14> reject requests whose <tt>redirectUri</tt> does not exactly match a pre-registered value for the specified <tt>agentId</tt>.</t>
        <t>Response <tt>200 OK</tt>:</t>
        <sourcecode type="json"><![CDATA[
{
  "authRequestId": "areq_01HXYZ...",
  "consentUrl": "https://consent.example.com/authorize?req=eyJ...",
  "expiresAt": "2026-02-01T00:15:00Z"
}
]]></sourcecode>
      </section>
      <section anchor="consent-ui-requirements">
        <name>Consent UI Requirements</name>
        <t>Authorization Servers <bcp14>MUST</bcp14> render a consent UI to the Principal that displays all of the following before the Principal approves or denies:</t>
        <ol spacing="normal" type="1"><li>
            <t>The Agent's registered name and description</t>
          </li>
          <li>
            <t>The Developer's registered organization name</t>
          </li>
          <li>
            <t>The full list of requested scopes with human-readable descriptions</t>
          </li>
          <li>
            <t>The token expiry period</t>
          </li>
          <li>
            <t>A prominent deny/cancel action that is at least as visually prominent as the approve action</t>
          </li>
        </ol>
      </section>
      <section anchor="token-exchange">
        <name>Token Exchange</name>
        <t>After Principal approval, the Authorization Server calls <tt>redirectUri?code=AUTH_CODE&amp;state=STATE</tt>.</t>
        <sourcecode type="http"><![CDATA[
POST /v1/token
Authorization: Bearer <api_key>
Content-Type: application/json

{
  "code": "AUTH_CODE",
  "agentId": "ag_01HXYZ123abc"
}
]]></sourcecode>
        <t>Response <tt>200 OK</tt>:</t>
        <sourcecode type="json"><![CDATA[
{
  "grantToken": "eyJhbGciOiJSUzI1NiJ9...",
  "refreshToken": "ref_01HXYZ...",
  "grantId": "grnt_01HXYZ...",
  "scopes": ["calendar:read", "payments:initiate:max_500"],
  "expiresAt": "2026-02-02T00:00:00Z"
}
]]></sourcecode>
        <t>Refresh tokens are single-use. The Authorization Server <bcp14>MUST</bcp14> rotate the refresh token on every use. Refresh tokens <bcp14>MUST</bcp14> be invalidated when the underlying Grant is revoked.</t>
      </section>
    </section>
    <section anchor="grant-token-format">
      <name>Grant Token Format</name>
      <section anchor="jose-header">
        <name>JOSE Header</name>
        <sourcecode type="json"><![CDATA[
{
  "alg": "RS256",
  "typ": "JWT",
  "kid": "<key_id>"
}
]]></sourcecode>
        <t>The <tt>alg</tt> field <bcp14>MUST</bcp14> be <tt>RS256</tt>. Authorization Servers <bcp14>MUST NOT</bcp14> issue tokens with any other algorithm. Verifiers <bcp14>MUST</bcp14> explicitly reject tokens with any <tt>alg</tt> value other than <tt>RS256</tt>, including <tt>none</tt> and <tt>HS256</tt>.</t>
      </section>
      <section anchor="jwt-claims">
        <name>JWT Claims</name>
        <sourcecode type="json"><![CDATA[
{
  "iss": "https://as.example.com",
  "sub": "user_abc123",
  "aud": "https://api.targetservice.com",
  "agt": "did:grantex:ag_01HXYZ123abc",
  "dev": "org_yourcompany",
  "grnt": "grnt_01HXYZ...",
  "scp": ["calendar:read", "payments:initiate:max_500"],
  "bdg": 5000,
  "iat": 1709000000,
  "exp": 1709086400,
  "jti": "tok_01HXYZ987xyz"
}
]]></sourcecode>
        <t>The following claims are defined by this specification:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Claim</th>
              <th align="left">Type</th>
              <th align="left">Required</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>iss</tt></td>
              <td align="left">string</td>
              <td align="left">
                <bcp14>REQUIRED</bcp14></td>
              <td align="left">Authorization Server identifier URI</td>
            </tr>
            <tr>
              <td align="left">
                <tt>sub</tt></td>
              <td align="left">string</td>
              <td align="left">
                <bcp14>REQUIRED</bcp14></td>
              <td align="left">Principal identifier</td>
            </tr>
            <tr>
              <td align="left">
                <tt>aud</tt></td>
              <td align="left">string</td>
              <td align="left">
                <bcp14>OPTIONAL</bcp14></td>
              <td align="left">Intended audience (target service URI)</td>
            </tr>
            <tr>
              <td align="left">
                <tt>agt</tt></td>
              <td align="left">string</td>
              <td align="left">
                <bcp14>REQUIRED</bcp14></td>
              <td align="left">Agent DID</td>
            </tr>
            <tr>
              <td align="left">
                <tt>dev</tt></td>
              <td align="left">string</td>
              <td align="left">
                <bcp14>REQUIRED</bcp14></td>
              <td align="left">Developer organization identifier</td>
            </tr>
            <tr>
              <td align="left">
                <tt>grnt</tt></td>
              <td align="left">string</td>
              <td align="left">
                <bcp14>REQUIRED</bcp14></td>
              <td align="left">Grant identifier (used for revocation lookup)</td>
            </tr>
            <tr>
              <td align="left">
                <tt>scp</tt></td>
              <td align="left">string[]</td>
              <td align="left">
                <bcp14>REQUIRED</bcp14></td>
              <td align="left">Array of granted scope strings</td>
            </tr>
            <tr>
              <td align="left">
                <tt>bdg</tt></td>
              <td align="left">number</td>
              <td align="left">
                <bcp14>OPTIONAL</bcp14></td>
              <td align="left">Remaining budget amount (see <xref target="budget-controls"/>)</td>
            </tr>
            <tr>
              <td align="left">
                <tt>iat</tt></td>
              <td align="left">NumericDate</td>
              <td align="left">
                <bcp14>REQUIRED</bcp14></td>
              <td align="left">Issued-at time</td>
            </tr>
            <tr>
              <td align="left">
                <tt>exp</tt></td>
              <td align="left">NumericDate</td>
              <td align="left">
                <bcp14>REQUIRED</bcp14></td>
              <td align="left">Expiration time</td>
            </tr>
            <tr>
              <td align="left">
                <tt>jti</tt></td>
              <td align="left">string</td>
              <td align="left">
                <bcp14>REQUIRED</bcp14></td>
              <td align="left">Unique token identifier (for replay prevention)</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="token-validation">
        <name>Token Validation</name>
        <t>Services receiving a Grant Token <bcp14>MUST</bcp14> verify all of the following:</t>
        <ol spacing="normal" type="1"><li>
            <t>The token signature is valid, verified using the JWK Set published at <tt>{iss}/.well-known/jwks.json</tt>, with the key identified by <tt>kid</tt>.</t>
          </li>
          <li>
            <t>The <tt>alg</tt> header value is <tt>RS256</tt>. Tokens with any other <tt>alg</tt> <bcp14>MUST</bcp14> be rejected.</t>
          </li>
          <li>
            <t>The <tt>exp</tt> claim has not passed (allowing for a reasonable clock skew of no more than 300 seconds).</t>
          </li>
          <li>
            <t>If the service has a registered audience identifier, the <tt>aud</tt> claim matches that identifier.</t>
          </li>
          <li>
            <t>The <tt>scp</tt> array contains all scopes required for the requested operation.</t>
          </li>
          <li>
            <t>If the <tt>bdg</tt> claim is present and the operation has a cost, the <tt>bdg</tt> value is sufficient for the operation.</t>
          </li>
          <li>
            <t>For high-stakes operations (see <xref target="token-lifetime"/>), the token has not been revoked via the online verification endpoint.</t>
          </li>
        </ol>
      </section>
      <section anchor="token-lifetime">
        <name>Token Lifetime Guidance</name>
        <table>
          <thead>
            <tr>
              <th align="left">Use Case</th>
              <th align="left">Recommended Maximum TTL</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">High-stakes actions (<tt>payments:initiate</tt>, <tt>email:send</tt>, <tt>files:write</tt>)</td>
              <td align="left">1 hour</td>
            </tr>
            <tr>
              <td align="left">Standard agent tasks</td>
              <td align="left">8 hours</td>
            </tr>
            <tr>
              <td align="left">Long-running background agents</td>
              <td align="left">24 hours</td>
            </tr>
          </tbody>
        </table>
        <t>Implementations caching revocation state <bcp14>MUST NOT</bcp14> cache for longer than 300 seconds (5 minutes). Services processing high-stakes scopes (<tt>payments:initiate</tt>, <tt>email:send</tt>, <tt>files:write</tt>) <bcp14>SHOULD</bcp14> perform online verification for each token use.</t>
      </section>
    </section>
    <section anchor="revocation">
      <name>Token Revocation</name>
      <section anchor="revoke-a-grant">
        <name>Revoke a Grant</name>
        <sourcecode type="http"><![CDATA[
DELETE /v1/grants/{grantId}
Authorization: Bearer <principal_token>
]]></sourcecode>
        <t>Effect: all active Grant Tokens issued under this Grant are immediately invalidated. The Grant record is marked <tt>revoked</tt> with a timestamp.</t>
      </section>
      <section anchor="revoke-a-specific-token">
        <name>Revoke a Specific Token</name>
        <sourcecode type="http"><![CDATA[
POST /v1/tokens/revoke
Authorization: Bearer <api_key>
Content-Type: application/json

{
  "jti": "tok_01HXYZ987xyz"
}
]]></sourcecode>
        <t>Response: <tt>204 No Content</tt>.</t>
      </section>
      <section anchor="online-verification">
        <name>Online Verification</name>
        <sourcecode type="http"><![CDATA[
POST /v1/tokens/verify
Authorization: Bearer <api_key>
Content-Type: application/json

{
  "token": "eyJhbGciOiJSUzI1NiJ9..."
}
]]></sourcecode>
        <t>Response <tt>200 OK</tt>:</t>
        <sourcecode type="json"><![CDATA[
{
  "valid": true,
  "grantId": "grnt_01HXYZ...",
  "scopes": ["calendar:read"],
  "principal": "user_abc123",
  "agent": "did:grantex:ag_01HXYZ123abc",
  "expiresAt": "2026-02-02T00:00:00Z"
}
]]></sourcecode>
      </section>
      <section anchor="jti-replay-prevention">
        <name>JTI Replay Prevention</name>
        <t>Authorization Servers <bcp14>MUST</bcp14> track all issued <tt>jti</tt> values for the lifetime of the corresponding token. If a <tt>jti</tt> value is presented for verification more than once within its validity window, the Authorization Server <bcp14>MUST</bcp14> return <tt>valid: false</tt> and <bcp14>SHOULD</bcp14> log an anomaly event.</t>
      </section>
    </section>
    <section anchor="audit-trail">
      <name>Audit Trail</name>
      <section anchor="log-entry-schema">
        <name>Log Entry Schema</name>
        <sourcecode type="json"><![CDATA[
{
  "entryId": "alog_01HXYZ...",
  "agentId": "did:grantex:ag_01HXYZ123abc",
  "grantId": "grnt_01HXYZ...",
  "principalId": "user_abc123",
  "developerId": "org_yourcompany",
  "action": "payment.initiated",
  "status": "success",
  "metadata": {
    "amount": 420,
    "currency": "USD",
    "merchant": "Air India"
  },
  "timestamp": "2026-02-01T12:34:56.789Z",
  "hash": "sha256:abc123...",
  "prevHash": "sha256:xyz789..."
}
]]></sourcecode>
        <t><tt>action</tt> values use the format <tt>resource.verb</tt> (e.g., <tt>payment.initiated</tt>, <tt>email.sent</tt>). <tt>status</tt> <bcp14>MUST</bcp14> be one of <tt>success</tt>, <tt>failure</tt>, or <tt>blocked</tt>.</t>
      </section>
      <section anchor="hash-chain">
        <name>Hash Chain</name>
        <t>Each entry's <tt>hash</tt> is computed as a SHA-256 digest <xref target="RFC4648"/> over a canonical representation of the entry:</t>
        <artwork><![CDATA[
hash = SHA-256(canonical_json(entry_without_hash) || prevHash)
]]></artwork>
        <t>where <tt>canonical_json</tt> serializes all fields as a JSON object <xref target="RFC8259"/> with keys sorted alphabetically, and <tt>prevHash</tt> is the <tt>null</tt> string for the first entry in a chain. This construction makes any retrospective modification to a historical entry detectable, as it invalidates all subsequent hashes.</t>
      </section>
      <section anchor="audit-log-requirements">
        <name>Audit Log Requirements</name>
        <ul spacing="normal">
          <li>
            <t>Audit log entries <bcp14>MUST</bcp14> be append-only at the API level. No update or delete endpoints for audit entries are permitted.</t>
          </li>
          <li>
            <t>The Authorization Server <bcp14>MUST</bcp14> reject requests to modify or delete audit entries.</t>
          </li>
          <li>
            <t>The complete audit log for a Grant <bcp14>MUST</bcp14> remain accessible after the Grant is revoked, for a minimum retention period determined by the deployment's compliance requirements.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="delegation">
      <name>Multi-Agent Delegation</name>
      <section anchor="delegation-token-claims">
        <name>Delegation Token Claims</name>
        <t>When Agent A spawns Agent B, B's Grant Token <bcp14>MUST</bcp14> carry delegation claims linking it to the original Principal's authorization:</t>
        <sourcecode type="json"><![CDATA[
{
  "sub": "user_abc123",
  "agt": "did:grantex:ag_B_456",
  "parentAgt": "did:grantex:ag_A_123",
  "parentGrnt": "grnt_parentXYZ",
  "scp": ["email:read"],
  "delegationDepth": 1
}
]]></sourcecode>
        <t>Additional delegation claims:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Claim</th>
              <th align="left">Type</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>parentAgt</tt></td>
              <td align="left">string</td>
              <td align="left">DID of the delegating (parent) Agent</td>
            </tr>
            <tr>
              <td align="left">
                <tt>parentGrnt</tt></td>
              <td align="left">string</td>
              <td align="left">Grant ID of the parent Grant</td>
            </tr>
            <tr>
              <td align="left">
                <tt>delegationDepth</tt></td>
              <td align="left">integer</td>
              <td align="left">Number of hops from the root Grant; 0 for root Grants</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="delegation-rules">
        <name>Delegation Rules</name>
        <ul spacing="normal">
          <li>
            <t>Sub-agent scopes <bcp14>MUST</bcp14> be a strict subset of the parent Grant's <tt>scp</tt> array. Authorization Servers <bcp14>MUST</bcp14> reject delegation requests whose requested scopes are not fully contained in the parent token's <tt>scp</tt> claim.</t>
          </li>
          <li>
            <t><tt>delegationDepth</tt> <bcp14>MUST</bcp14> be incremented by exactly 1 at each hop.</t>
          </li>
          <li>
            <t>Implementations <bcp14>MUST</bcp14> enforce a developer-configurable delegation depth limit. The <bcp14>RECOMMENDED</bcp14> default limit is <strong>3</strong>. Implementations <bcp14>MUST</bcp14> enforce a hard cap of <strong>10</strong> regardless of developer configuration.</t>
          </li>
          <li>
            <t>The expiry of a delegated Grant Token <bcp14>MUST NOT</bcp14> exceed <tt>min(parent_token_exp, now + requested_expires_in)</tt>.</t>
          </li>
        </ul>
      </section>
      <section anchor="delegation-endpoint">
        <name>Delegation Endpoint</name>
        <sourcecode type="http"><![CDATA[
POST /v1/grants/delegate
Authorization: Bearer <api_key>
Content-Type: application/json

{
  "parentGrantToken": "eyJhbGciOiJSUzI1NiJ9...",
  "subAgentId": "ag_01HXYZ_sub",
  "scopes": ["email:read"],
  "expiresIn": "1h"
}
]]></sourcecode>
        <t>The Authorization Server <bcp14>MUST</bcp14>:</t>
        <ol spacing="normal" type="1"><li>
            <t>Validate that the parent Grant has not been revoked.</t>
          </li>
          <li>
            <t>Reject with <tt>400</tt> if any requested scope is not present in the parent token's <tt>scp</tt> claim.</t>
          </li>
          <li>
            <t>Reject with <tt>400</tt> if the resulting <tt>delegationDepth</tt> would exceed the configured limit.</t>
          </li>
          <li>
            <t>Reject with <tt>404</tt> if <tt>subAgentId</tt> does not belong to the authenticated Developer.</t>
          </li>
          <li>
            <t>Compute expiry as <tt>min(parent token exp, now + expiresIn)</tt>.</t>
          </li>
        </ol>
        <t>Response <tt>201 Created</tt>:</t>
        <sourcecode type="json"><![CDATA[
{
  "grantToken": "eyJhbGciOiJSUzI1NiJ9...",
  "grantId": "grnt_01HXYZ_sub",
  "scopes": ["email:read"],
  "expiresAt": "2026-02-01T01:00:00Z"
}
]]></sourcecode>
      </section>
      <section anchor="cascade-revocation">
        <name>Cascade Revocation</name>
        <t>Revoking a Grant via <tt>DELETE /v1/grants/:id</tt> <bcp14>MUST</bcp14> atomically revoke all descendant Grants -- that is, all Grants whose <tt>parent_grant_id</tt> traces back to the revoked Grant at any depth. Authorization Servers <bcp14>SHOULD</bcp14> implement this as a single recursive database transaction to eliminate any window during which descendant tokens remain valid.</t>
      </section>
    </section>
    <section anchor="conformance">
      <name>Conformance Requirements</name>
      <t>A conformant DAAP Authorization Server <bcp14>MUST</bcp14> expose the following endpoints:</t>
      <table>
        <thead>
          <tr>
            <th align="left">Endpoint</th>
            <th align="left">Description</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">
              <tt>POST /v1/agents</tt></td>
            <td align="left">Register an Agent</td>
          </tr>
          <tr>
            <td align="left">
              <tt>POST /v1/authorize</tt></td>
            <td align="left">Initiate the grant authorization flow</td>
          </tr>
          <tr>
            <td align="left">
              <tt>POST /v1/token</tt></td>
            <td align="left">Exchange authorization code for Grant Token</td>
          </tr>
          <tr>
            <td align="left">
              <tt>POST /v1/tokens/verify</tt></td>
            <td align="left">Online token verification</td>
          </tr>
          <tr>
            <td align="left">
              <tt>POST /v1/tokens/revoke</tt></td>
            <td align="left">Revoke a specific token by JTI</td>
          </tr>
          <tr>
            <td align="left">
              <tt>GET /v1/grants</tt></td>
            <td align="left">List a Principal's active Grants</td>
          </tr>
          <tr>
            <td align="left">
              <tt>GET /v1/grants/:id</tt></td>
            <td align="left">Retrieve a single Grant</td>
          </tr>
          <tr>
            <td align="left">
              <tt>DELETE /v1/grants/:id</tt></td>
            <td align="left">Revoke a Grant (cascades to all descendants)</td>
          </tr>
          <tr>
            <td align="left">
              <tt>POST /v1/grants/delegate</tt></td>
            <td align="left">Issue a delegated sub-agent Grant</td>
          </tr>
          <tr>
            <td align="left">
              <tt>POST /v1/audit/log</tt></td>
            <td align="left">Write an audit log entry</td>
          </tr>
          <tr>
            <td align="left">
              <tt>GET /v1/audit/entries</tt></td>
            <td align="left">Query the audit log</td>
          </tr>
          <tr>
            <td align="left">
              <tt>GET /v1/audit/:id</tt></td>
            <td align="left">Retrieve a single audit log entry</td>
          </tr>
          <tr>
            <td align="left">
              <tt>GET /.well-known/jwks.json</tt></td>
            <td align="left">JWK Set for offline token verification</td>
          </tr>
          <tr>
            <td align="left">
              <tt>GET /health</tt></td>
            <td align="left">Health check</td>
          </tr>
        </tbody>
      </table>
      <t>The following endpoints are <bcp14>OPTIONAL</bcp14>. Implementations that choose to support an optional extension <bcp14>MUST</bcp14> implement it as specified in this document:</t>
      <ul spacing="normal">
        <li>
          <t><strong>Policy Engine</strong>: <tt>POST /v1/policies</tt>, <tt>GET /v1/policies</tt>, <tt>GET /v1/policies/:id</tt>, <tt>PATCH /v1/policies/:id</tt>, <tt>DELETE /v1/policies/:id</tt></t>
        </li>
        <li>
          <t><strong>Webhooks</strong>: <tt>POST /v1/webhooks</tt>, <tt>GET /v1/webhooks</tt>, <tt>DELETE /v1/webhooks/:id</tt></t>
        </li>
        <li>
          <t><strong>Anomaly Detection</strong>: <tt>POST /v1/anomalies/detect</tt>, <tt>GET /v1/anomalies</tt>, <tt>PATCH /v1/anomalies/:id/acknowledge</tt></t>
        </li>
        <li>
          <t><strong>Enterprise SCIM 2.0</strong>: <tt>/scim/v2/</tt> endpoints as defined in RFC 7642/7643/7644</t>
        </li>
        <li>
          <t><strong>SSO (OIDC)</strong>: <tt>POST /v1/sso/config</tt>, <tt>GET /sso/login</tt>, <tt>GET /sso/callback</tt></t>
        </li>
        <li>
          <t><strong>Budget Controls</strong>: <tt>POST /v1/budget/allocate</tt>, <tt>POST /v1/budget/debit</tt>, <tt>GET /v1/budget/balance/:grantId</tt>, <tt>GET /v1/budget/transactions/:grantId</tt> (see <xref target="budget-controls"/>)</t>
        </li>
        <li>
          <t><strong>Event Streaming</strong>: <tt>GET /v1/events/stream</tt> (SSE), <tt>GET /v1/events/ws</tt> (WebSocket) (see <xref target="event-streaming"/>)</t>
        </li>
        <li>
          <t><strong>Credential Vault</strong>: <tt>POST /v1/vault/credentials</tt>, <tt>GET /v1/vault/credentials</tt>, <tt>DELETE /v1/vault/credentials/:id</tt>, <tt>POST /v1/vault/exchange</tt> (see <xref target="credential-vault"/>)</t>
        </li>
        <li>
          <t><strong>External Policy Backends</strong>: OPA (<tt>POST /v1/data/grantex/authz</tt>) and Cedar (<tt>POST /v1/is_authorized</tt>) integration (see <xref target="external-policy-backends"/>)</t>
        </li>
      </ul>
    </section>
    <section anchor="budget-controls">
      <name>Budget Controls</name>
      <section anchor="purpose">
        <name>Purpose</name>
        <t>Budget Controls provide per-grant spending limits that constrain the total monetary value of actions an Agent may perform under a single Grant. This extension is critical for agents operating in financial contexts (e.g., <tt>payments:initiate</tt>) where unconstrained spending could cause irreversible harm.</t>
      </section>
      <section anchor="budget-allocation">
        <name>Budget Allocation</name>
        <t>A Developer allocates a budget to a Grant by sending:</t>
        <sourcecode type="http"><![CDATA[
POST /v1/budget/allocate
Authorization: Bearer <api_key>
Content-Type: application/json

{
  "grantId": "grnt_01HXYZ...",
  "amount": 10000,
  "currency": "USD"
}
]]></sourcecode>
        <t>Response <tt>201 Created</tt>:</t>
        <sourcecode type="json"><![CDATA[
{
  "id": "bdgt_01HXYZ...",
  "grantId": "grnt_01HXYZ...",
  "initialBudget": 10000,
  "remainingBudget": 10000,
  "currency": "USD",
  "createdAt": "2026-02-01T00:00:00Z"
}
]]></sourcecode>
        <t>A Grant <bcp14>MUST NOT</bcp14> have more than one active budget allocation. Authorization Servers <bcp14>MUST</bcp14> reject allocation requests for Grants that already have an active allocation.</t>
      </section>
      <section anchor="budget-debit">
        <name>Budget Debit</name>
        <t>Services debit from a Grant's budget using an atomic operation:</t>
        <sourcecode type="http"><![CDATA[
POST /v1/budget/debit
Authorization: Bearer <api_key>
Content-Type: application/json

{
  "grantId": "grnt_01HXYZ...",
  "amount": 250,
  "description": "Flight booking - DEL to BOM",
  "metadata": { "merchant": "Air India" }
}
]]></sourcecode>
        <t>Response <tt>200 OK</tt>:</t>
        <sourcecode type="json"><![CDATA[
{
  "remaining": 9750,
  "transactionId": "btxn_01HXYZ..."
}
]]></sourcecode>
        <t>Authorization Servers <bcp14>MUST</bcp14> implement budget debit as an atomic operation (e.g., <tt>UPDATE ... WHERE remaining &gt;= amount</tt>). If the remaining budget is insufficient, the Authorization Server <bcp14>MUST</bcp14> respond with <tt>402 Payment Required</tt> and the error code <tt>INSUFFICIENT_BUDGET</tt>.</t>
      </section>
      <section anchor="the-bdg-jwt-claim">
        <name>The <tt>bdg</tt> JWT Claim</name>
        <t>When a Grant has an active budget allocation, the Authorization Server <bcp14>SHOULD</bcp14> include the <tt>bdg</tt> claim in issued Grant Tokens. The value <bcp14>MUST</bcp14> be the remaining budget amount at the time of token issuance.</t>
        <t>Services receiving a Grant Token with a <tt>bdg</tt> claim <bcp14>MAY</bcp14> use it for local pre-flight budget checks. However, the <tt>bdg</tt> claim is advisory -- the atomic debit endpoint remains the authoritative mechanism for budget enforcement.</t>
      </section>
      <section anchor="threshold-alerts">
        <name>Threshold Alerts</name>
        <t>Authorization Servers implementing Budget Controls <bcp14>MUST</bcp14> emit events when budget utilization crosses predefined thresholds:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Threshold</th>
              <th align="left">Event Type</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">50% consumed</td>
              <td align="left">
                <tt>budget.threshold</tt></td>
              <td align="left">Warning: half of the budget has been consumed</td>
            </tr>
            <tr>
              <td align="left">80% consumed</td>
              <td align="left">
                <tt>budget.threshold</tt></td>
              <td align="left">Alert: budget is running low</td>
            </tr>
            <tr>
              <td align="left">100% consumed</td>
              <td align="left">
                <tt>budget.exhausted</tt></td>
              <td align="left">Budget fully consumed; subsequent debits will fail</td>
            </tr>
          </tbody>
        </table>
        <t>These events <bcp14>MUST</bcp14> be delivered via the configured webhook endpoints and <bcp14>SHOULD</bcp14> be delivered via the event streaming endpoints (<xref target="event-streaming"/>) if the extension is supported.</t>
      </section>
      <section anchor="budget-balance-and-transaction-history">
        <name>Budget Balance and Transaction History</name>
        <sourcecode type="http"><![CDATA[
GET /v1/budget/balance/{grantId}
Authorization: Bearer <api_key>
]]></sourcecode>
        <t>Returns the current <tt>BudgetAllocation</tt> object.</t>
        <sourcecode type="http"><![CDATA[
GET /v1/budget/transactions/{grantId}
Authorization: Bearer <api_key>
]]></sourcecode>
        <t>Returns a paginated list of all debit transactions for the specified Grant's budget.</t>
      </section>
    </section>
    <section anchor="event-streaming">
      <name>Event Streaming</name>
      <section anchor="purpose-1">
        <name>Purpose</name>
        <t>Event Streaming provides real-time delivery of authorization lifecycle events to connected clients. This extension complements webhooks by offering a persistent connection model suitable for dashboards, monitoring systems, and real-time alerting.</t>
      </section>
      <section anchor="event-types">
        <name>Event Types</name>
        <table>
          <thead>
            <tr>
              <th align="left">Event Type</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>grant.created</tt></td>
              <td align="left">A new Grant has been issued</td>
            </tr>
            <tr>
              <td align="left">
                <tt>grant.revoked</tt></td>
              <td align="left">A Grant has been revoked</td>
            </tr>
            <tr>
              <td align="left">
                <tt>token.issued</tt></td>
              <td align="left">A new Grant Token has been issued</td>
            </tr>
            <tr>
              <td align="left">
                <tt>budget.threshold</tt></td>
              <td align="left">A budget threshold has been crossed</td>
            </tr>
            <tr>
              <td align="left">
                <tt>budget.exhausted</tt></td>
              <td align="left">A budget has been fully consumed</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="sse-endpoint">
        <name>SSE Endpoint</name>
        <sourcecode type="http"><![CDATA[
GET /v1/events/stream
Authorization: Bearer <api_key>
Accept: text/event-stream
]]></sourcecode>
        <t>The Authorization Server <bcp14>MUST</bcp14> implement Server-Sent Events <xref target="SSE"/> delivery. Events are formatted as:</t>
        <artwork><![CDATA[
event: grant.created
data: {"grantId":"grnt_01HXYZ...","agentId":"ag_01HXYZ...","timestamp":"2026-02-01T00:00:00Z"}

event: budget.threshold
data: {"grantId":"grnt_01HXYZ...","threshold":80,"remaining":2000,"timestamp":"2026-02-01T01:00:00Z"}
]]></artwork>
      </section>
      <section anchor="websocket-endpoint">
        <name>WebSocket Endpoint</name>
        <sourcecode type="http"><![CDATA[
GET /v1/events/ws
Upgrade: websocket
Connection: Upgrade
Authorization: Bearer <api_key>
]]></sourcecode>
        <t>WebSocket connections receive the same event payloads as SSE, serialized as JSON messages. The Authorization Server <bcp14>MUST</bcp14> send periodic ping frames (<bcp14>RECOMMENDED</bcp14> interval: 30 seconds) to detect stale connections.</t>
      </section>
      <section anchor="connection-limits">
        <name>Connection Limits</name>
        <t>Authorization Servers <bcp14>MUST</bcp14> enforce a maximum number of concurrent event streaming connections per Developer. The <bcp14>RECOMMENDED</bcp14> limit is <strong>5</strong> concurrent connections. When the limit is exceeded, the Authorization Server <bcp14>MUST</bcp14> reject new connections with <tt>429 Too Many Requests</tt>.</t>
      </section>
      <section anchor="event-delivery-guarantees">
        <name>Event Delivery Guarantees</name>
        <t>Event Streaming provides at-most-once delivery semantics. For guaranteed delivery, Developers <bcp14>SHOULD</bcp14> use webhooks, which provide at-least-once delivery with persistent retry.</t>
      </section>
    </section>
    <section anchor="credential-vault">
      <name>Credential Vault</name>
      <section anchor="purpose-2">
        <name>Purpose</name>
        <t>The Credential Vault provides encrypted per-user credential storage, enabling a token-to-credential exchange pattern where an Agent presents a valid Grant Token and receives the associated service credentials in return. This eliminates the need for Agents to store long-lived secrets directly.</t>
      </section>
      <section anchor="credential-storage">
        <name>Credential Storage</name>
        <sourcecode type="http"><![CDATA[
POST /v1/vault/credentials
Authorization: Bearer <api_key>
Content-Type: application/json

{
  "principalId": "user_abc123",
  "service": "stripe",
  "credentials": {
    "apiKey": "sk_live_...",
    "webhookSecret": "whsec_..."
  },
  "scopes": ["payments:initiate"]
}
]]></sourcecode>
        <t>Credentials <bcp14>MUST</bcp14> be encrypted at rest using AES-256-GCM or an equivalent authenticated encryption algorithm. The encryption key <bcp14>MUST</bcp14> be derived from a key management system (KMS) that is separate from the database storing the ciphertext.</t>
      </section>
      <section anchor="credential-exchange">
        <name>Credential Exchange</name>
        <t>An Agent exchanges a valid Grant Token for the associated credentials:</t>
        <sourcecode type="http"><![CDATA[
POST /v1/vault/exchange
Authorization: Bearer <grant_token>
Content-Type: application/json

{
  "service": "stripe"
}
]]></sourcecode>
        <t>The Authorization Server <bcp14>MUST</bcp14> verify the Grant Token before returning credentials. The response <bcp14>MUST</bcp14> only include credentials whose required scopes are a subset of the Grant Token's <tt>scp</tt> claim.</t>
      </section>
      <section anchor="credential-lifecycle">
        <name>Credential Lifecycle</name>
        <ul spacing="normal">
          <li>
            <t>Credentials <bcp14>MUST</bcp14> be automatically deleted when the associated Principal revokes all Grants for the associated Agent.</t>
          </li>
          <li>
            <t>Developers <bcp14>MAY</bcp14> delete credentials at any time via <tt>DELETE /v1/vault/credentials/:id</tt>.</t>
          </li>
          <li>
            <t>The Authorization Server <bcp14>MUST</bcp14> log all credential access events in the audit trail.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="external-policy-backends">
      <name>External Policy Backends</name>
      <section anchor="purpose-3">
        <name>Purpose</name>
        <t>While the built-in Policy Engine (<xref target="policy-engine"/>) is sufficient for simple allow/deny rules, production deployments often require integration with dedicated policy decision points (PDPs) that support richer policy languages. This extension defines the integration pattern for two external policy backends: Open Policy Agent (OPA) <xref target="OPA"/> and Cedar <xref target="CEDAR"/>.</t>
      </section>
      <section anchor="policy-evaluation-context">
        <name>Policy Evaluation Context</name>
        <t>Authorization Servers <bcp14>MUST</bcp14> construct the following evaluation context and send it to the configured external backend:</t>
        <sourcecode type="json"><![CDATA[
{
  "subject": {
    "type": "agent",
    "id": "did:grantex:ag_01HXYZ123abc",
    "developer": "org_yourcompany"
  },
  "resource": {
    "type": "grant",
    "scopes": ["calendar:read", "payments:initiate:max_500"]
  },
  "action": {
    "name": "authorize"
  },
  "context": {
    "principalId": "user_abc123",
    "timestamp": "2026-02-01T12:00:00Z",
    "ipAddress": "203.0.113.42"
  }
}
]]></sourcecode>
        <t>This evaluation context is intentionally aligned with the OpenID AuthZEN <xref target="AUTHZEN"/> subject/resource/action/context model.</t>
      </section>
      <section anchor="opa-integration">
        <name>OPA Integration</name>
        <t>Authorization Servers supporting OPA <bcp14>MUST</bcp14> send a POST request to the configured OPA endpoint:</t>
        <sourcecode type="http"><![CDATA[
POST {OPA_URL}/v1/data/grantex/authz
Content-Type: application/json

{
  "input": { ... evaluation context ... }
}
]]></sourcecode>
        <t>The OPA response <bcp14>MUST</bcp14> contain:</t>
        <sourcecode type="json"><![CDATA[
{
  "result": {
    "allow": true
  }
}
]]></sourcecode>
        <t>If <tt>result.allow</tt> is <tt>false</tt>, the Authorization Server <bcp14>MUST</bcp14> deny the authorization request. OPA policies are written in Rego.</t>
      </section>
      <section anchor="cedar-integration">
        <name>Cedar Integration</name>
        <t>Authorization Servers supporting Cedar <bcp14>MUST</bcp14> send a POST request to the configured Cedar endpoint:</t>
        <sourcecode type="http"><![CDATA[
POST {CEDAR_URL}/v1/is_authorized
Content-Type: application/json

{
  "principal": "Agent::\"did:grantex:ag_01HXYZ123abc\"",
  "action": "Action::\"authorize\"",
  "resource": "Grant::\"grnt_01HXYZ...\"",
  "context": { ... }
}
]]></sourcecode>
        <t>The Cedar response <bcp14>MUST</bcp14> contain:</t>
        <sourcecode type="json"><![CDATA[
{
  "decision": "Allow"
}
]]></sourcecode>
        <t>If <tt>decision</tt> is <tt>"Deny"</tt>, the Authorization Server <bcp14>MUST</bcp14> deny the authorization request.</t>
      </section>
      <section anchor="timeout-and-fallback">
        <name>Timeout and Fallback</name>
        <t>Authorization Servers <bcp14>MUST</bcp14> enforce a timeout on external policy backend requests. The <bcp14>RECOMMENDED</bcp14> timeout is <strong>5 seconds</strong>. If the backend does not respond within the timeout, the Authorization Server <bcp14>MUST</bcp14> apply a configurable fallback policy:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Fallback Mode</th>
              <th align="left">Behavior</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>deny</tt> (default)</td>
              <td align="left">Deny the authorization request</td>
            </tr>
            <tr>
              <td align="left">
                <tt>allow</tt></td>
              <td align="left">Allow the authorization request (use with caution)</td>
            </tr>
            <tr>
              <td align="left">
                <tt>builtin</tt></td>
              <td align="left">Fall back to the built-in Policy Engine</td>
            </tr>
          </tbody>
        </table>
        <t>The fallback mode <bcp14>MUST</bcp14> be configurable by the Developer. The default <bcp14>MUST</bcp14> be <tt>deny</tt> (fail-closed).</t>
      </section>
    </section>
    <section anchor="policy-engine">
      <name>Policy Engine</name>
      <section anchor="purpose-4">
        <name>Purpose</name>
        <t>The Policy Engine evaluates developer-defined rules against each authorization request before the consent UI is displayed. Policies enable developers to auto-approve routine low-risk requests and auto-deny requests that violate organizational constraints.</t>
      </section>
      <section anchor="effects">
        <name>Effects</name>
        <table>
          <thead>
            <tr>
              <th align="left">Effect</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>auto_approve</tt></td>
              <td align="left">Grant Token issued immediately without showing the consent UI</td>
            </tr>
            <tr>
              <td align="left">
                <tt>auto_deny</tt></td>
              <td align="left">Authorization request rejected immediately with <tt>403 Forbidden</tt></td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="condition-fields">
        <name>Condition Fields</name>
        <table>
          <thead>
            <tr>
              <th align="left">Field</th>
              <th align="left">Type</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>scopes</tt></td>
              <td align="left">string[]</td>
              <td align="left">Matches when the requested scopes are a subset of this list</td>
            </tr>
            <tr>
              <td align="left">
                <tt>principalId</tt></td>
              <td align="left">string</td>
              <td align="left">Matches a specific Principal identifier</td>
            </tr>
            <tr>
              <td align="left">
                <tt>agentId</tt></td>
              <td align="left">string</td>
              <td align="left">Matches a specific Agent identifier</td>
            </tr>
            <tr>
              <td align="left">
                <tt>timeWindow</tt></td>
              <td align="left">object</td>
              <td align="left">Time constraint: <tt>{ "startHour": N, "endHour": N, "days": [1..7] }</tt> where days are ISO weekday integers (1=Monday, 7=Sunday)</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="evaluation-order">
        <name>Evaluation Order</name>
        <t>Policy evaluation <bcp14>MUST</bcp14> follow this order:</t>
        <ol spacing="normal" type="1"><li>
            <t>If an external policy backend (<xref target="external-policy-backends"/>) is configured, the evaluation context is sent to the backend first. If the backend returns a decision, that decision is final.</t>
          </li>
          <li>
            <t><tt>auto_deny</tt> rules are evaluated first. The first matching deny rule wins and the request is rejected immediately.</t>
          </li>
          <li>
            <t><tt>auto_approve</tt> rules are evaluated next. The first matching allow rule causes the Grant Token to be issued.</t>
          </li>
          <li>
            <t>If no rule matches, the consent UI is displayed to the Principal.</t>
          </li>
        </ol>
        <t>This ordering ensures that restrictive policies cannot be bypassed by a conflicting allow rule.</t>
      </section>
    </section>
    <section anchor="anomaly-detection">
      <name>Anomaly Detection</name>
      <section anchor="purpose-5">
        <name>Purpose</name>
        <t>The anomaly detection system monitors Agent behavior at runtime against each Agent's established activity baseline. It identifies behavioral deviations and surfaces them to Developers for review.</t>
      </section>
      <section anchor="non-blocking-requirement">
        <name>Non-Blocking Requirement</name>
        <t>Anomaly detection <bcp14>MUST NOT</bcp14> block token issuance. Detection operates asynchronously as an advisory layer. Authorization Servers <bcp14>MUST NOT</bcp14> delay Grant Token responses pending anomaly analysis.</t>
      </section>
      <section anchor="anomaly-types">
        <name>Anomaly Types</name>
        <table>
          <thead>
            <tr>
              <th align="left">Type</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>unusual_scope_access</tt></td>
              <td align="left">Agent requested scopes outside its established pattern</td>
            </tr>
            <tr>
              <td align="left">
                <tt>high_frequency</tt></td>
              <td align="left">Token issuance rate significantly exceeds the agent's baseline</td>
            </tr>
            <tr>
              <td align="left">
                <tt>off_hours_activity</tt></td>
              <td align="left">Activity detected outside the Principal's normal active hours</td>
            </tr>
            <tr>
              <td align="left">
                <tt>new_principal</tt></td>
              <td align="left">Agent is requesting access for a previously unserved Principal</td>
            </tr>
            <tr>
              <td align="left">
                <tt>cascade_delegation</tt></td>
              <td align="left">Delegation chain depth approaching or exceeding configured limits</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="severity-levels">
        <name>Severity Levels</name>
        <t>Anomaly severity <bcp14>MUST</bcp14> be one of: <tt>low</tt>, <tt>medium</tt>, <tt>high</tt>, <tt>critical</tt>.</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <section anchor="algorithm-restrictions">
        <name>Algorithm Restrictions</name>
        <t>All Grant Tokens <bcp14>MUST</bcp14> be signed with RS256 (RSASSA-PKCS1-v1_5 with SHA-256). Symmetric signing algorithms, including HS256, are NOT PERMITTED. All verifiers <bcp14>MUST</bcp14> explicitly reject tokens presenting <tt>alg: none</tt> or any symmetric algorithm, regardless of library defaults. This prevents algorithm confusion attacks as described in <xref target="RFC8725"/>.</t>
        <t>RSA key moduli <bcp14>MUST</bcp14> be at least 2048 bits. Authorization Servers generating or importing signing keys <bcp14>MUST</bcp14> enforce this minimum.</t>
      </section>
      <section anchor="token-replay-prevention">
        <name>Token Replay Prevention</name>
        <t>Every issued Grant Token carries a unique <tt>jti</tt> claim. Authorization Servers providing online verification <bcp14>MUST</bcp14> track issued <tt>jti</tt> values and reject any verification request presenting a <tt>jti</tt> that has already been used, for the full lifetime of the token.</t>
      </section>
      <section anchor="csrf-and-redirect-uri-security">
        <name>CSRF and Redirect URI Security</name>
        <t>The <tt>state</tt> parameter in the authorization request <bcp14>MUST</bcp14> be a cryptographically random, unpredictable value generated per-request. Developer callback handlers <bcp14>MUST</bcp14> validate the returned <tt>state</tt> value against the value sent in the original request.</t>
        <t>Redirect URIs <bcp14>MUST</bcp14> be pre-registered by the Developer for each Agent. Authorization Servers <bcp14>MUST</bcp14> perform exact-match comparison of the <tt>redirectUri</tt> in each authorization request against the pre-registered set. Prefix matching and wildcard matching are NOT PERMITTED.</t>
      </section>
      <section anchor="scope-reduction-for-delegation">
        <name>Scope Reduction for Delegation</name>
        <t>Delegated Grant Tokens <bcp14>MUST</bcp14> carry a scope set that is a strict subset of the parent Grant's scope set. Authorization Servers <bcp14>MUST</bcp14> enforce this at token issuance time; it <bcp14>MUST NOT</bcp14> be enforced only at verification time.</t>
      </section>
      <section anchor="revocation-propagation">
        <name>Revocation Propagation</name>
        <t>Authorization Servers <bcp14>MUST</bcp14> propagate grant revocation to all descendant grants atomically. The maximum allowable latency between a revocation request and the invalidation of all descendant tokens via the online verification endpoint is implementation-defined, but implementations <bcp14>SHOULD</bcp14> target sub-second propagation.</t>
        <t>Implementations caching revocation state <bcp14>MUST NOT</bcp14> cache for longer than 300 seconds.</t>
      </section>
      <section anchor="consent-ui-integrity">
        <name>Consent UI Integrity</name>
        <t>Consent UIs <bcp14>MUST</bcp14> display the agent name, developer name, all requested scopes with human-readable descriptions, token expiry, and a prominent deny/cancel action. This information <bcp14>MUST</bcp14> be sourced from the Authorization Server's registry, not from the authorization request itself, to prevent a malicious Developer from displaying misleading scope descriptions.</t>
      </section>
      <section anchor="audit-log-integrity">
        <name>Audit Log Integrity</name>
        <t>The hash-chain construction defined in <xref target="audit-trail"/> ensures that any modification to a historical audit entry is detectable. Implementations <bcp14>MUST</bcp14> store audit log entries in an append-only manner and <bcp14>MUST</bcp14> expose no API for modification or deletion of audit entries. Audit log export implementations <bcp14>SHOULD</bcp14> verify the hash chain before serving exports.</t>
      </section>
      <section anchor="enterprise-identity-security">
        <name>Enterprise Identity Security</name>
        <t>SSO callback handlers <bcp14>MUST</bcp14> validate both the <tt>state</tt> (CSRF protection) and <tt>nonce</tt> (replay protection) parameters before establishing a session. ID tokens received in the SSO callback <bcp14>MUST</bcp14> be cryptographically verified against the identity provider's JWKS endpoint before any claims are trusted.</t>
        <t>SCIM provisioning endpoints <bcp14>MUST</bcp14> authenticate via a credential (SCIM Bearer token) that is entirely separate from the Developer API key infrastructure. Compromise of a Developer API key <bcp14>MUST NOT</bcp14> grant access to SCIM provisioning endpoints, and vice versa.</t>
      </section>
      <section anchor="budget-security">
        <name>Budget Security</name>
        <t>Budget debit operations <bcp14>MUST</bcp14> be implemented as atomic database operations (e.g., <tt>UPDATE ... SET remaining = remaining - amount WHERE remaining &gt;= amount</tt>). Non-atomic implementations risk race conditions that could allow spending beyond the allocated budget.</t>
        <t>The <tt>bdg</tt> JWT claim is advisory and <bcp14>MUST NOT</bcp14> be used as the sole mechanism for budget enforcement. Services <bcp14>MUST</bcp14> use the atomic debit endpoint for authoritative budget checks.</t>
      </section>
      <section anchor="credential-vault-security">
        <name>Credential Vault Security</name>
        <t>Credentials stored in the Vault <bcp14>MUST</bcp14> be encrypted at rest using authenticated encryption (AES-256-GCM or equivalent). Encryption keys <bcp14>MUST</bcp14> be managed by a dedicated KMS and <bcp14>MUST NOT</bcp14> be stored alongside the ciphertext.</t>
        <t>All credential access events (store, retrieve, exchange, delete) <bcp14>MUST</bcp14> be logged in the audit trail with the credential identifier but NOT the credential value.</t>
      </section>
    </section>
    <section anchor="iana">
      <name>IANA Considerations</name>
      <section anchor="jwt-claims-registration">
        <name>JWT Claims Registration</name>
        <t>This document requests registration of the following claims in the IANA "JSON Web Token Claims" registry established by <xref target="RFC7519"/>:</t>
        <dl newline="true">
          <dt><tt>agt</tt>:</dt>
          <dd>
            <t>Claim Name: <tt>agt</tt></t>
          </dd>
          <dt/>
          <dd>
            <t>Claim Description: Agent Decentralized Identifier</t>
          </dd>
          <dt/>
          <dd>
            <t>Change Controller: IETF</t>
          </dd>
          <dt/>
          <dd>
            <t>Specification Document: This document, <xref target="grant-token-format"/></t>
          </dd>
          <dt><tt>dev</tt>:</dt>
          <dd>
            <t>Claim Name: <tt>dev</tt></t>
          </dd>
          <dt/>
          <dd>
            <t>Claim Description: Developer organization identifier</t>
          </dd>
          <dt/>
          <dd>
            <t>Change Controller: IETF</t>
          </dd>
          <dt/>
          <dd>
            <t>Specification Document: This document, <xref target="grant-token-format"/></t>
          </dd>
          <dt><tt>grnt</tt>:</dt>
          <dd>
            <t>Claim Name: <tt>grnt</tt></t>
          </dd>
          <dt/>
          <dd>
            <t>Claim Description: Grant identifier for revocation lookup</t>
          </dd>
          <dt/>
          <dd>
            <t>Change Controller: IETF</t>
          </dd>
          <dt/>
          <dd>
            <t>Specification Document: This document, <xref target="grant-token-format"/></t>
          </dd>
          <dt><tt>scp</tt>:</dt>
          <dd>
            <t>Claim Name: <tt>scp</tt></t>
          </dd>
          <dt/>
          <dd>
            <t>Claim Description: Array of granted authorization scope strings</t>
          </dd>
          <dt/>
          <dd>
            <t>Change Controller: IETF</t>
          </dd>
          <dt/>
          <dd>
            <t>Specification Document: This document, <xref target="grant-token-format"/></t>
          </dd>
          <dt><tt>bdg</tt>:</dt>
          <dd>
            <t>Claim Name: <tt>bdg</tt></t>
          </dd>
          <dt/>
          <dd>
            <t>Claim Description: Remaining budget amount for the Grant</t>
          </dd>
          <dt/>
          <dd>
            <t>Change Controller: IETF</t>
          </dd>
          <dt/>
          <dd>
            <t>Specification Document: This document, <xref target="budget-controls"/></t>
          </dd>
          <dt><tt>parentAgt</tt>:</dt>
          <dd>
            <t>Claim Name: <tt>parentAgt</tt></t>
          </dd>
          <dt/>
          <dd>
            <t>Claim Description: DID of the delegating parent Agent</t>
          </dd>
          <dt/>
          <dd>
            <t>Change Controller: IETF</t>
          </dd>
          <dt/>
          <dd>
            <t>Specification Document: This document, <xref target="delegation"/></t>
          </dd>
          <dt><tt>parentGrnt</tt>:</dt>
          <dd>
            <t>Claim Name: <tt>parentGrnt</tt></t>
          </dd>
          <dt/>
          <dd>
            <t>Claim Description: Grant identifier of the parent Grant</t>
          </dd>
          <dt/>
          <dd>
            <t>Change Controller: IETF</t>
          </dd>
          <dt/>
          <dd>
            <t>Specification Document: This document, <xref target="delegation"/></t>
          </dd>
          <dt><tt>delegationDepth</tt>:</dt>
          <dd>
            <t>Claim Name: <tt>delegationDepth</tt></t>
          </dd>
          <dt/>
          <dd>
            <t>Claim Description: Number of delegation hops from the root Grant</t>
          </dd>
          <dt/>
          <dd>
            <t>Change Controller: IETF</t>
          </dd>
          <dt/>
          <dd>
            <t>Specification Document: This document, <xref target="delegation"/></t>
          </dd>
        </dl>
      </section>
      <section anchor="well-known-uri-registration">
        <name>Well-Known URI Registration</name>
        <t>No new Well-Known URIs are defined by this specification. Implementations use the existing <tt>/.well-known/jwks.json</tt> path established by <xref target="RFC8414"/>.</t>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC7519">
          <front>
            <title>JSON Web Token (JWT)</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <author fullname="N. Sakimura" initials="N." surname="Sakimura"/>
            <date month="May" year="2015"/>
            <abstract>
              <t>JSON Web Token (JWT) is a compact, URL-safe means of representing claims to be transferred between two parties. The claims in a JWT are encoded as a JSON object that is used as the payload of a JSON Web Signature (JWS) structure or as the plaintext of a JSON Web Encryption (JWE) structure, enabling the claims to be digitally signed or integrity protected with a Message Authentication Code (MAC) and/or encrypted.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7519"/>
          <seriesInfo name="DOI" value="10.17487/RFC7519"/>
        </reference>
        <reference anchor="RFC7517">
          <front>
            <title>JSON Web Key (JWK)</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <date month="May" year="2015"/>
            <abstract>
              <t>A JSON Web Key (JWK) is a JavaScript Object Notation (JSON) data structure that represents a cryptographic key. This specification also defines a JWK Set JSON data structure that represents a set of JWKs. Cryptographic algorithms and identifiers for use with this specification are described in the separate JSON Web Algorithms (JWA) specification and IANA registries established by that specification.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7517"/>
          <seriesInfo name="DOI" value="10.17487/RFC7517"/>
        </reference>
        <reference anchor="RFC7518">
          <front>
            <title>JSON Web Algorithms (JWA)</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <date month="May" year="2015"/>
            <abstract>
              <t>This specification registers cryptographic algorithms and identifiers to be used with the JSON Web Signature (JWS), JSON Web Encryption (JWE), and JSON Web Key (JWK) specifications. It defines several IANA registries for these identifiers.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7518"/>
          <seriesInfo name="DOI" value="10.17487/RFC7518"/>
        </reference>
        <reference anchor="RFC6749">
          <front>
            <title>The OAuth 2.0 Authorization Framework</title>
            <author fullname="D. Hardt" initials="D." role="editor" surname="Hardt"/>
            <date month="October" year="2012"/>
            <abstract>
              <t>The OAuth 2.0 authorization framework enables a third-party application to obtain limited access to an HTTP service, either on behalf of a resource owner by orchestrating an approval interaction between the resource owner and the HTTP service, or by allowing the third-party application to obtain access on its own behalf. This specification replaces and obsoletes the OAuth 1.0 protocol described in RFC 5849. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6749"/>
          <seriesInfo name="DOI" value="10.17487/RFC6749"/>
        </reference>
        <reference anchor="RFC8414">
          <front>
            <title>OAuth 2.0 Authorization Server Metadata</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="N. Sakimura" initials="N." surname="Sakimura"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <date month="June" year="2018"/>
            <abstract>
              <t>This specification defines a metadata format that an OAuth 2.0 client can use to obtain the information needed to interact with an OAuth 2.0 authorization server, including its endpoint locations and authorization server capabilities.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8414"/>
          <seriesInfo name="DOI" value="10.17487/RFC8414"/>
        </reference>
        <reference anchor="RFC4648">
          <front>
            <title>The Base16, Base32, and Base64 Data Encodings</title>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
            <date month="October" year="2006"/>
            <abstract>
              <t>This document describes the commonly used base 64, base 32, and base 16 encoding schemes. It also discusses the use of line-feeds in encoded data, use of padding in encoded data, use of non-alphabet characters in encoded data, use of different encoding alphabets, and canonical encodings. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4648"/>
          <seriesInfo name="DOI" value="10.17487/RFC4648"/>
        </reference>
        <reference anchor="RFC3986">
          <front>
            <title>Uniform Resource Identifier (URI): Generic Syntax</title>
            <author fullname="T. Berners-Lee" initials="T." surname="Berners-Lee"/>
            <author fullname="R. Fielding" initials="R." surname="Fielding"/>
            <author fullname="L. Masinter" initials="L." surname="Masinter"/>
            <date month="January" year="2005"/>
            <abstract>
              <t>A Uniform Resource Identifier (URI) is a compact sequence of characters that identifies an abstract or physical resource. This specification defines the generic URI syntax and a process for resolving URI references that might be in relative form, along with guidelines and security considerations for the use of URIs on the Internet. The URI syntax defines a grammar that is a superset of all valid URIs, allowing an implementation to parse the common components of a URI reference without knowing the scheme-specific requirements of every possible identifier. This specification does not define a generative grammar for URIs; that task is performed by the individual specifications of each URI scheme. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="66"/>
          <seriesInfo name="RFC" value="3986"/>
          <seriesInfo name="DOI" value="10.17487/RFC3986"/>
        </reference>
        <reference anchor="RFC8259">
          <front>
            <title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
            <author fullname="T. Bray" initials="T." role="editor" surname="Bray"/>
            <date month="December" year="2017"/>
            <abstract>
              <t>JavaScript Object Notation (JSON) is a lightweight, text-based, language-independent data interchange format. It was derived from the ECMAScript Programming Language Standard. JSON defines a small set of formatting rules for the portable representation of structured data.</t>
              <t>This document removes inconsistencies with other specifications of JSON, repairs specification errors, and offers experience-based interoperability guidance.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="90"/>
          <seriesInfo name="RFC" value="8259"/>
          <seriesInfo name="DOI" value="10.17487/RFC8259"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC7662">
          <front>
            <title>OAuth 2.0 Token Introspection</title>
            <author fullname="J. Richer" initials="J." role="editor" surname="Richer"/>
            <date month="October" year="2015"/>
            <abstract>
              <t>This specification defines a method for a protected resource to query an OAuth 2.0 authorization server to determine the active state of an OAuth 2.0 token and to determine meta-information about this token. OAuth 2.0 deployments can use this method to convey information about the authorization context of the token from the authorization server to the protected resource.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7662"/>
          <seriesInfo name="DOI" value="10.17487/RFC7662"/>
        </reference>
        <reference anchor="RFC8693">
          <front>
            <title>OAuth 2.0 Token Exchange</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="A. Nadalin" initials="A." surname="Nadalin"/>
            <author fullname="B. Campbell" initials="B." role="editor" surname="Campbell"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <author fullname="C. Mortimore" initials="C." surname="Mortimore"/>
            <date month="January" year="2020"/>
            <abstract>
              <t>This specification defines a protocol for an HTTP- and JSON-based Security Token Service (STS) by defining how to request and obtain security tokens from OAuth 2.0 authorization servers, including security tokens employing impersonation and delegation.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8693"/>
          <seriesInfo name="DOI" value="10.17487/RFC8693"/>
        </reference>
        <reference anchor="RFC8725">
          <front>
            <title>JSON Web Token Best Current Practices</title>
            <author fullname="Y. Sheffer" initials="Y." surname="Sheffer"/>
            <author fullname="D. Hardt" initials="D." surname="Hardt"/>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <date month="February" year="2020"/>
            <abstract>
              <t>JSON Web Tokens, also known as JWTs, are URL-safe JSON-based security tokens that contain a set of claims that can be signed and/or encrypted. JWTs are being widely used and deployed as a simple security token format in numerous protocols and applications, both in the area of digital identity and in other application areas. This Best Current Practices document updates RFC 7519 to provide actionable guidance leading to secure implementation and deployment of JWTs.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="225"/>
          <seriesInfo name="RFC" value="8725"/>
          <seriesInfo name="DOI" value="10.17487/RFC8725"/>
        </reference>
        <reference anchor="DID-CORE" target="https://www.w3.org/TR/did-core/">
          <front>
            <title>Decentralized Identifiers (DIDs) v1.0</title>
            <author>
              <organization>W3C</organization>
            </author>
            <date year="2022" month="July" day="19"/>
          </front>
        </reference>
        <reference anchor="ULID" target="https://github.com/ulid/spec">
          <front>
            <title>Universally Unique Lexicographically Sortable Identifier</title>
            <author initials="A." surname="Feerasta" fullname="Alizain Feerasta">
              <organization/>
            </author>
            <date year="2016"/>
          </front>
        </reference>
        <reference anchor="SSE" target="https://html.spec.whatwg.org/multipage/server-sent-events.html">
          <front>
            <title>Server-Sent Events</title>
            <author>
              <organization>WHATWG</organization>
            </author>
            <date year="2024"/>
          </front>
        </reference>
        <reference anchor="OPA" target="https://www.openpolicyagent.org/docs/latest/">
          <front>
            <title>Open Policy Agent</title>
            <author>
              <organization>Styra</organization>
            </author>
            <date year="2024"/>
          </front>
        </reference>
        <reference anchor="CEDAR" target="https://www.cedarpolicy.com/">
          <front>
            <title>Cedar Policy Language</title>
            <author>
              <organization>Amazon Web Services</organization>
            </author>
            <date year="2024"/>
          </front>
        </reference>
        <reference anchor="AUTHZEN" target="https://openid.net/specs/openid-authzen-authorization-api-1_0.html">
          <front>
            <title>OpenID AuthZEN Authorization API</title>
            <author>
              <organization>OpenID Foundation</organization>
            </author>
            <date year="2024"/>
          </front>
        </reference>
      </references>
    </references>
    <?line 1122?>

<section anchor="comparison-with-oauth-20-extensions">
      <name>Comparison with OAuth 2.0 Extensions</name>
      <t>DAAP shares OAuth 2.0's fundamental grant model but differs in the following respects:</t>
      <t><strong>versus RFC 6749 (OAuth 2.0):</strong>
OAuth 2.0 defines a general-purpose delegated authorization framework. DAAP specializes this for AI agents by: adding cryptographic agent identity (DID); defining agent-specific JWT claims (<tt>agt</tt>, <tt>dev</tt>, <tt>grnt</tt>, <tt>scp</tt>, <tt>bdg</tt>); mandating RS256 exclusively; and adding the delegation, audit, policy, anomaly detection, budget controls, event streaming, credential vault, and external policy backend subsystems.</t>
      <t><strong>versus RFC 8693 (Token Exchange):</strong>
Token Exchange <xref target="RFC8693"/> enables a client to exchange one token for another, including impersonation and delegation use cases. DAAP's delegation model serves a narrower purpose -- chaining AI agent sub-authorizations back to a human principal -- and adds depth-limiting and cascade revocation semantics not present in RFC 8693.</t>
      <t><strong>versus RFC 7662 (Token Introspection):</strong>
Token Introspection <xref target="RFC7662"/> defines an endpoint for resource servers to query token metadata. DAAP's <tt>/v1/tokens/verify</tt> endpoint serves a similar purpose but returns DAAP-specific fields (<tt>agent</tt>, <tt>principal</tt>, <tt>scopes</tt>) and is used by agent-side SDKs rather than resource servers.</t>
    </section>
    <section anchor="implementation-report">
      <name>Implementation Report</name>
      <t>This appendix documents the conformance status of the reference implementation and SDK coverage as of March 2026. A detailed implementation report is available at <tt>docs/ietf-draft/implementation-report.md</tt> in the Grantex repository.</t>
      <section anchor="reference-authorization-server">
        <name>Reference Authorization Server</name>
        <t>The Grantex authorization server (Fastify + PostgreSQL + Redis) implements all <bcp14>REQUIRED</bcp14> endpoints and the following <bcp14>OPTIONAL</bcp14> extensions:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Extension</th>
              <th align="left">Status</th>
              <th align="left">Notes</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">Policy Engine</td>
              <td align="left">Implemented</td>
              <td align="left">Built-in + OPA + Cedar backends</td>
            </tr>
            <tr>
              <td align="left">Webhooks</td>
              <td align="left">Implemented</td>
              <td align="left">Persistent retry with exponential backoff</td>
            </tr>
            <tr>
              <td align="left">Anomaly Detection</td>
              <td align="left">Implemented</td>
              <td align="left">5 anomaly types, async worker</td>
            </tr>
            <tr>
              <td align="left">SCIM 2.0</td>
              <td align="left">Implemented</td>
              <td align="left">Full RFC 7643 compliance</td>
            </tr>
            <tr>
              <td align="left">SSO (OIDC)</td>
              <td align="left">Implemented</td>
              <td align="left">Authorization Code + PKCE</td>
            </tr>
            <tr>
              <td align="left">Budget Controls</td>
              <td align="left">Implemented</td>
              <td align="left">Atomic debit, threshold alerts</td>
            </tr>
            <tr>
              <td align="left">Event Streaming</td>
              <td align="left">Implemented</td>
              <td align="left">SSE + WebSocket</td>
            </tr>
            <tr>
              <td align="left">Credential Vault</td>
              <td align="left">Implemented</td>
              <td align="left">AES-256-GCM encryption</td>
            </tr>
            <tr>
              <td align="left">External Policy Backends</td>
              <td align="left">Implemented</td>
              <td align="left">OPA + Cedar with timeout/fallback</td>
            </tr>
          </tbody>
        </table>
        <t>~362 automated tests pass across all features.</t>
      </section>
      <section anchor="sdk-coverage">
        <name>SDK Coverage</name>
        <table>
          <thead>
            <tr>
              <th align="left">SDK</th>
              <th align="left">Language</th>
              <th align="left">Version</th>
              <th align="left">Core</th>
              <th align="left">Budget</th>
              <th align="left">Events</th>
              <th align="left">Vault</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>@grantex/sdk</tt></td>
              <td align="left">TypeScript</td>
              <td align="left">0.2.0</td>
              <td align="left">Full</td>
              <td align="left">Full</td>
              <td align="left">Full</td>
              <td align="left">Full</td>
            </tr>
            <tr>
              <td align="left">
                <tt>grantex</tt></td>
              <td align="left">Python</td>
              <td align="left">0.2.0</td>
              <td align="left">Full</td>
              <td align="left">Full</td>
              <td align="left">Full</td>
              <td align="left">Full</td>
            </tr>
            <tr>
              <td align="left">
                <tt>grantex-go</tt></td>
              <td align="left">Go</td>
              <td align="left">0.1.2</td>
              <td align="left">Full</td>
              <td align="left">Full</td>
              <td align="left">Full</td>
              <td align="left">Full</td>
            </tr>
          </tbody>
        </table>
        <t>All SDKs pass the <tt>@grantex/conformance</tt> test suite.</t>
      </section>
    </section>
    <section numbered="false" anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>The authors thank the members of the IETF OAuth Working Group for prior art in delegated authorization, and the W3C Decentralized Identifier Working Group for the DID specification that DAAP builds upon for agent identity.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
