<?xml version="1.0" encoding="utf-8"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude"
     docName="draft-schrock-ae-challenge-05"
     category="info" ipr="trust200902" submissionType="independent"
     version="3" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="Evidence Challenge">An Authorization Evidence Challenge for High-Risk Agent Actions</title>
    <seriesInfo name="Internet-Draft" value="draft-schrock-ae-challenge-05"/>
    <author fullname="Iman Schrock">
      <organization>EMILIA Protocol, Inc.</organization>
      <address>
        <postal><country>US</country></postal>
        <email>team@emiliaprotocol.ai</email>
      </address>
    </author>
    <date year="2026" month="August" day="9"/>
    <area>sec</area>
    <keyword>AI agents</keyword>
    <keyword>evidence</keyword>
    <keyword>challenge</keyword>
    <keyword>step-up</keyword>
    <abstract>
      <t>When a relying party refuses a consequential agent action because
      authorization evidence is missing, stale, or unverifiable, the agent
      needs a machine-readable description of what remains necessary. This
      document defines a transport-neutral Authorization Evidence Challenge
      data model bound to the relying party's exact action. The challenge
      identifies outstanding evidence requirements, freshness and status
      constraints, acceptable presentation profiles, and retry state. It
      authorizes nothing, transfers no admission ownership, and provides no
      promise that a later request will execute.</t>
      <t>The document also defines an HTTP binding using 403 Forbidden and
      RFC 9457 Problem Details, and describes an informative gateway-handoff
      profile for DMSC-style federation. The gateway profile communicates
      evidence requirements; it does not solve conserved admission or
      double-admission across independently operated gateways.</t>
      <t>A challenge can synchronize corrected retries and amplify load. The
      core therefore defines optional retry timing with per-challenge jitter,
      and the HTTP binding maps its lower bound to Retry-After. Retry timing
      controls presentation attempts only; it does not authorize the action
      or make an uncertain action safe to repeat.</t>
      <t>Single-use processing also places state on the refusal path. The core
      therefore requires bounded outstanding and replay state, fail-closed
      behavior when state cannot be claimed, and retention of live replay
      records until they are no longer security-relevant.</t>
    </abstract>
  </front>
  <middle>
    <section anchor="intro">
      <name>Introduction</name>
      <t>Evidence formats describe artifacts such as receipts, permits,
      attestations, and logs. They do not by themselves define the live
      interaction that follows when a relying party finds the presented
      evidence insufficient. Without a common challenge, each agent protocol
      invents its own vocabulary for missing evidence, acceptable
      presentations, freshness, status checking, and retry.</t>
      <t>This document defines the challenge as an application data model,
      independent of HTTP, a particular agent protocol, and any one evidence
      format. OAuth step-up authentication <xref target="RFC9470"/> lets a
      resource identify stronger authentication requirements. OAuth
      Transaction Authorization Challenge
      <xref target="OAUTH-TXN-CHALLENGE"/> defines a signed, OAuth-specific
      challenge that an authorization server turns into a transaction-bound
      access token after obtaining any required approval. AE-CHALLENGE does
      not replace either mechanism. It describes missing authorization
      evidence for an exact proposed action when an application needs a
      transport-neutral evidence-negotiation object.</t>
      <t>A challenge is a refusal with information. It is not an
      authorization decision, reservation, capability, ownership transfer,
      or promise of execution. Satisfying it causes the relying party to
      evaluate a new presentation under its live local policy.</t>
      <section anchor="oauth-boundary">
        <name>Boundary with OAuth Transaction Authorization</name>
        <t>When the required next step is issuance of a transaction-specific
        OAuth grant, an implementation <bcp14>SHOULD</bcp14> use OAuth
        Transaction Authorization Challenge. It <bcp14>MUST NOT</bcp14>
        substitute an AE-CHALLENGE, its nonce, or a successfully presented
        evidence object for that signed OAuth challenge, its transaction
        identifier, the authorization-server decision, or the resulting
        access token. Satisfying AE-CHALLENGE never satisfies a native OAuth
        grant requirement.</t>
        <t>AE-CHALLENGE remains applicable outside OAuth and when a relying
        party needs evidence that a native authorization protocol does not
        itself negotiate, such as a current status proof, quorum receipt,
        hardware attestation, or separately verified policy artifact. An
        OAuth application profile <bcp14>MAY</bcp14> carry or reference both
        mechanisms, but that profile <bcp14>MUST</bcp14> define their exact
        action and audience join, which challenge is primary for each
        refusal, and how native grant state remains separate from
        AE-CHALLENGE replay state. Without such a profile, the mechanisms are
        separate and neither is silently converted into the other.</t>
        <t>The single-use property in this document applies only to one
        evidence-presentation attempt under an AE-CHALLENGE nonce. It does not
        consume an OAuth transaction, invalidate an access token, reserve an
        action, or establish one-time admission at an executor.</t>
      </section>
      <section anchor="requirements-language">
        <name>Requirements Language</name>
        <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL",
        "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT
        RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be
        interpreted as described in BCP 14 <xref target="RFC2119"/>
        <xref target="RFC8174"/> when, and only when, they appear in all
        capitals, as shown here.</t>
      </section>
      <section anchor="terms">
        <name>Terminology</name>
        <dl>
          <dt>Relying party:</dt>
          <dd>The component that decides whether evidence satisfies its
          requirements for a proposed action.</dd>
          <dt>Presenter:</dt>
          <dd>The agent, gateway, or other component that receives a
          challenge and may later present evidence.</dd>
          <dt>Exact action:</dt>
          <dd>The relying-party-derived material action that would be
          admitted, including every field its selected action profile treats
          as consequential.</dd>
          <dt>Challenge:</dt>
          <dd>A single-use, expiring description of evidence still required
          for one exact action.</dd>
        </dl>
      </section>
    </section>

    <section anchor="core">
      <name>Transport-Neutral Core Data Model</name>
      <t>The AE-CHALLENGE-v1 data model is independent of its carrier. A
      transport binding MUST preserve every member that the relying party
      uses when registering or reconstructing and later consuming the
      challenge. A binding MUST
      also provide authenticated integrity and peer identification, or carry
      the challenge in an authenticated envelope that provides those
      properties.</t>
      <t>The JSON format defined by <xref target="RFC8259"/> is the reference
      serialization of the core model. A non-JSON binding MUST define an
      unambiguous mapping to the same members and value types.</t>
      <sourcecode type="json"><![CDATA[
{
  "@version": "AE-CHALLENGE-v1",
  "challenge_id": "7a3120d1-...",
  "nonce": "<single-use unpredictable value>",
  "action_digest": "sha256:<relying-party-derived digest>",
  "action_profile": "https://example.net/action/payment-v3",
  "audience": "https://gateway-b.example",
  "policy_id": "https://gateway-b.example/policies/high-risk-v4",
  "policy_digest": "sha256:<relying-party policy digest>",
  "required_evidence": [
    {
      "requirement_id": "human-approval",
      "type": "https://example.net/e/authorization-receipt",
      "profiles": ["https://example.net/profiles/receipt-v1"],
      "max_age_sec": 300,
      "status": "current"
    }
  ],
  "present_as": ["https://example.net/p/ep-aec-v1"],
  "obtain_hints": [
    {
      "requirement_id": "human-approval",
      "mechanism": "https://example.net/flows/approval-v1",
      "uri": "https://approver.example/tasks/123"
    }
  ],
  "retry_timing": {
    "not_before": "2026-08-09T23:50:30Z",
    "jitter_sec": 20
  },
  "expires_at": "2026-08-10T00:05:00Z"
}
]]></sourcecode>

      <section anchor="core-binding">
        <name>Action and Policy Binding</name>
        <t><tt>@version</tt> MUST equal <tt>AE-CHALLENGE-v1</tt>. A
        recipient that does not implement this version MUST refuse automated
        processing.</t>
        <t><tt>challenge_id</tt> is an opaque correlation identifier.
        Authorization decisions MUST NOT depend on its global uniqueness.
        <tt>nonce</tt> MUST be unpredictable, non-empty, and single-use.
        Before exposing a challenge, the relying party MUST either register a
        durable record that binds the nonce to the complete challenge body,
        or protect the complete body with an issuer-authenticated,
        self-describing mechanism defined by the applicable profile. The
        latter mechanism MUST let the relying party reconstruct and validate
        the exact body without trusting presenter-supplied fields. A bare
        challenge body carried only under a transport session is not a
        self-describing mechanism after that session ends.</t>
        <t>Self-describing issuance can avoid retaining one record for every
        unanswered challenge. It does not remove single-use state. On the
        first returned presentation, the relying party still MUST atomically
        claim the nonce in its authoritative replay store before evidence
        evaluation.</t>
        <t><tt>action_digest</tt> MUST be computed by the relying party from
        the exact action it would admit. It MUST NOT be copied from the
        presenter or from presented evidence. <tt>action_profile</tt> MUST be
        present, MUST be an absolute URI as defined by
        <xref target="RFC3986"/>, and identifies the canonicalization or
        mapping profile used to derive the digest. It is descriptive to the
        presenter; it does not let the presenter select or weaken that
        profile. If two parties cannot
        establish the same material action under an understood profile, the
        challenge cannot repair the disagreement and the relying party MUST
        refuse automated admission.</t>
        <t><tt>audience</tt> identifies the component that is expected to
        answer the challenge. A binding or authenticated envelope MUST let the
        presenter establish the challenge issuer. A relying party processing
        a returned challenge MUST verify the issuer and audience before using
        any obtain hint or disclosing evidence.</t>
        <t><tt>policy_id</tt> and <tt>policy_digest</tt> identify the local
        policy state from which the requirements were derived. They do not
        transfer policy authority to the presenter. At evaluation time the
        relying party MUST use its authenticated live policy and MUST NOT use
        a policy supplied in the response.</t>
        <t>Delegation, translation, or task rewriting does not preserve one
        action binding across hops. Each receiving relying party MUST
        re-evaluate the action it is asked to admit under its own policy and
        action profile. If that relying party issues a challenge, it MUST
        derive a new <tt>action_digest</tt> and register its own challenge
        binding. A prior hop's challenge or decision record MAY be presented
        as evidence or context, but it MUST NOT substitute for the receiving
        relying party's binding to a rewritten action. A chain of per-hop
        records does not by itself prove that the actions at different hops
        are semantically equivalent.</t>
      </section>

      <section anchor="core-requirements">
        <name>Evidence Requirements and Presentation</name>
        <t>Each <tt>required_evidence</tt> entry MUST contain a
        <tt>requirement_id</tt> and <tt>type</tt>. Requirement identifiers
        are unique within one challenge and correlate requirements with
        acquisition hints and diagnostics. Every evidence <tt>type</tt>,
        evidence <tt>profiles</tt> entry, and <tt>present_as</tt> entry MUST
        be an absolute URI as defined by <xref target="RFC3986"/> so that the
        same identifier has portable meaning across transport protocols and
        conformance corpora. Unless the defining specification says
        otherwise, these identifiers are compared as exact strings. A
        recipient MUST NOT infer security semantics from URI prefixes or
        substring matches; it uses only locally configured semantics for the
        complete identifier.</t>
        <t>An entry MAY contain <tt>profiles</tt>,
        <tt>proof_predicates</tt>, <tt>max_age_sec</tt>, and
        <tt>status</tt>. Profiles are alternatives acceptable for that
        requirement. <tt>max_age_sec</tt> is measured at the relying party's
        evaluation time using the issuance or observation time defined by the
        selected evidence profile. <tt>status</tt> equal to
        <tt>current</tt> requires a separately authenticated status result
        satisfying the relying party's freshness policy; it does not mean
        that absence from an unauthenticated revocation list is sufficient.</t>
        <t><tt>present_as</tt> lists alternative presentation profiles. The
        order expresses the relying party's preference, not a security
        ranking. Supporting a presentation profile does not imply support for
        every evidence type named by the challenge. The presenter selects one
        mutually supported profile and includes enough information for the
        relying party to match every component to a requirement.</t>
        <t><tt>obtain_hints</tt> are untrusted routing hints. Following a
        hint, authenticating to its URI, or receiving an "approved" response
        confers no authority at the relying party. Evidence obtained through
        a hint remains subject to native verification, exact-action matching,
        freshness and status checks, policy evaluation, and one-time
        consumption. Unknown transports MAY omit obtain hints entirely.</t>
        <t>Capability discovery MAY advertise evidence types, presentation
        profiles, or acquisition mechanisms that an implementation supports.
        Such discovery is not an authorization decision and does not establish
        that any advertised choice is sufficient for a particular action.
        The relying party MUST determine sufficiency using its authenticated
        local policy at evaluation time. A cached discovery response, a
        mutually supported profile, or a successful acquisition flow MUST NOT
        waive an unsatisfied local requirement.</t>
      </section>

      <section anchor="core-lifecycle">
        <name>Lifecycle, Replay, and Retry</name>
        <t><tt>expires_at</tt> MUST be an absolute timestamp. The relying
        party MUST refuse an expired challenge before evidence or policy
        evaluation.
        Challenge expiry does not extend the validity of any evidence and
        evidence expiry does not extend the challenge.</t>
        <t>Evaluation is ordered: version and structure; authenticated issuer
        and audience; validation of the registered or self-describing body;
        action agreement; expiry; atomic nonce claim; native evidence
        verification; and local policy evaluation. Malformed input that
        cannot be associated with a registered body or a valid
        issuer-protected self-describing body, or a presentation that does not
        agree with the registered exact action, is refused without claiming a
        nonce. Once structural and action matching succeed, the nonce MUST be
        claimed atomically before evidence evaluation.</t>
        <t>A concurrent duplicate that arrives after another presentation has
        consumed the nonce, whether that first evaluation is still in flight
        or has completed, MUST be refused as a replay. It MUST NOT receive a
        second evidence evaluation, an indeterminate result merely because the
        first evaluation is in flight, or a second admission. An
        implementation MAY distinguish in-flight from completed consumption
        internally for operations and audit, but that distinction does not
        reopen the challenge.</t>
        <t>Every verifier instance that accepts presentations for one
        challenge issuer MUST use the same authoritative replay domain, or a
        deterministic partition in which exactly one authoritative shard owns
        each nonce. A process-local cache or eventually consistent replica
        does not satisfy atomic nonce claim. If the authoritative replay
        domain is unavailable or its result is uncertain, the relying party
        MUST refuse without evidence evaluation or admission; it MUST NOT fall
        back to fresh local state.</t>
        <t>If evidence remains missing, stale, or unverifiable, the relying
        party MAY issue a follow-up challenge. A follow-up MUST use a fresh
        challenge identifier and nonce, MUST remain bound to the same locally
        derived action digest and action profile, and SHOULD list only the
        requirements that remain unsatisfied. It is a new refusal, not a
        continuation of the consumed nonce.</t>
        <t><tt>retry_timing</tt> is OPTIONAL. When present, it MUST contain a
        <tt>not_before</tt> Internet timestamp as defined by
        <xref target="RFC3339"/> and MAY contain a non-negative integer
        <tt>jitter_sec</tt>. A presenter that processes this member MUST NOT
        send the challenge response before <tt>not_before</tt>. When
        <tt>jitter_sec</tt> is greater than zero, the presenter SHOULD add an
        independently selected delay between zero and that many seconds. The
        selected delay SHOULD vary for each challenge and MUST NOT be treated
        as extending <tt>expires_at</tt>. The <tt>not_before</tt> value is only
        the earliest time to present corrected evidence. It is not a promise
        of capacity, evidence sufficiency, admission, or execution. After
        waiting, the presenter can receive the same refusal, a different
        refusal, or an overload response.</t>
        <t>A relying party that expects many correlated refusals SHOULD issue
        recipient-specific or challenge-specific retry schedules rather than
        one common retry instant. It SHOULD provide a jitter interval wide
        enough for its expected population and recovery capacity. A presenter
        remains responsible for its own backoff and rate limits when timing is
        absent. A challenge MUST NOT be issued solely to signal overload when
        the carrying protocol has a distinct overload response. If evidence
        insufficiency and load pressure coexist, retry timing can pace the new
        evidence presentation without changing the refusal semantics. The
        presenter can therefore spend effort acquiring third-party evidence
        and still be refused or shed after the lower bound; timing guidance
        does not assert which constraint will be decisive later.</t>
        <t>Ignoring <tt>retry_timing</tt> does not make evidence sufficient or
        authorize an action, but it can defeat the issuer's load-control goal.
        It does not change the semantic meaning of the challenge and therefore
        MUST NOT appear in <tt>critical</tt>. An issuer that needs to enforce
        pacing uses carrier-level overload handling, admission control, rate
        limiting, or refusal. A presenter that cannot establish whether
        <tt>not_before</tt> has passed MUST NOT infer permission to send early;
        it uses its local backoff policy or declines automated retry.</t>
        <t>Unknown acquisition status, timeout, transport failure, or an
        unverifiable response is indeterminate. It MUST NOT be interpreted as
        evidence satisfaction or permission to retry an action whose effect
        may already have occurred.</t>
      </section>

      <section anchor="state-bounds">
        <name>State Bounds and Exhaustion</name>
        <t>A relying party MUST configure a finite aggregate upper bound on
        challenge state retained in one authoritative replay domain. The
        bound MUST account for outstanding stateful challenges and in-flight
        or consumed replay records. Where a presenter is authenticated before
        challenge issuance, the relying party SHOULD also apply per-presenter
        and per-audience bounds. Multi-tenant deployments SHOULD apply an
        administrative bound per tenant so one tenant cannot consume the
        aggregate allowance.</t>
        <t>Admission control for a stateful challenge MUST occur before the
        challenge is exposed. If the relying party cannot allocate the
        required outstanding record, it MUST NOT issue that challenge. It
        returns a carrier-appropriate overload or generic refusal without an
        authorization-evidence challenge.</t>
        <t>For self-describing issuance, the relying party MUST enforce the
        replay-state bound when the first returned presentation attempts to
        claim the nonce. If it cannot durably and atomically claim replay
        state, it MUST refuse without native evidence verification, policy
        evaluation, or admission. It MUST NOT issue a replacement stateful
        challenge on that path. Self-describing issuance reduces unanswered
        outstanding state; it does not make replay processing stateless.</t>
        <t>A relying party that knows its authoritative replay-state bound is
        currently exhausted MUST NOT issue a self-describing challenge whose
        return cannot be claimed. It uses the carrier's overload or generic
        refusal path until capacity is available.</t>
        <t>An implementation MUST NOT evict a live in-flight or consumed nonce
        record to admit a newer challenge. Such a record MUST remain in the
        authoritative replay domain until the later of <tt>expires_at</tt> and
        completion of the in-flight evaluation. Expired unconsumed records
        MAY be removed. Longer retention for audit or abuse detection is a
        deployment choice.</t>
        <t>Challenge lifetimes SHOULD be no longer than the expected evidence-
        acquisition workflow requires. Rate limiting, authentication where
        available, self-describing issuance, and short lifetimes can reduce
        state pressure, but none permits fail-open nonce handling.</t>
        <section anchor="state-conformance">
          <name>State Exhaustion Conformance Cases</name>
          <t>A conforming implementation demonstrates all of the following:</t>
          <ul>
            <li>At the outstanding-state cap, a stateful issuer returns no new
            challenge and allocates no additional outstanding record.</li>
            <li>At the replay-state cap, a returned self-describing challenge
            receives no evidence evaluation and no admission.</li>
            <li>Two verifier replicas concurrently receiving the same nonce
            produce one successful atomic claim and one replay refusal.</li>
            <li>Allocating a new challenge never evicts an in-flight or
            unexpired consumed nonce.</li>
          </ul>
        </section>
      </section>

      <section anchor="core-extensibility">
        <name>Extensibility</name>
        <t>Recipients MUST ignore an unknown member unless its name appears
        in the optional <tt>critical</tt> array. A recipient that does not
        understand every member named by <tt>critical</tt> MUST refuse
        automated processing. A specification defining an extension MUST
        state whether that extension is safe to ignore and how it is bound to
        the registered challenge body. The core <tt>retry_timing</tt> member
        is safe to ignore for challenge semantics and MUST NOT be named by
        <tt>critical</tt>.</t>
      </section>

      <section anchor="carrier-semantics">
        <name>Carrier Semantics</name>
        <t>A transport binding SHOULD carry a challenge as a structured
        refusal or error payload when the carrying protocol provides such a
        facility. A binding that uses a message part, task-state extension, or
        other carrier MUST preserve the same refusal semantics and scope the
        challenge to the identified attempt. It MUST NOT represent the
        challenge as a successful task result, output artifact, authorization,
        or durable state that silently applies to later attempts. These rules
        constrain carrier semantics without requiring every transport to use
        the same envelope.</t>
      </section>
    </section>

    <section anchor="http-binding">
      <name>HTTP Binding</name>
      <t>This 403 Problem Details binding is not the OAuth transaction-
      authorization response. When a protected resource requires the native
      transaction-specific OAuth grant defined by
      <xref target="OAUTH-TXN-CHALLENGE"/>, it uses that specification's
      <tt>transaction_authorization_required</tt> response and signed
      <tt>transaction_challenge</tt>, normally carried with
      <tt>WWW-Authenticate</tt> and status 401. It <bcp14>MUST NOT</bcp14>
      return only this document's 403 response and then accept AE evidence as
      a substitute for the missing OAuth grant.</t>
      <t>An HTTP origin server that refuses an action because authorization
      evidence is missing, stale, or unverifiable SHOULD return
      <tt>403 Forbidden</tt> as defined by <xref target="RFC9110"/>. The
      response body MUST be an <tt>application/problem+json</tt> Problem
      Details object as defined by <xref target="RFC9457"/>. Status 428 is not
      used: it is defined for requests that the origin server requires to be
      conditional, not for authorization-evidence negotiation.</t>
      <t>If temporary overload is the sole reason for refusal, the origin
      server MUST NOT fabricate an authorization-evidence challenge. It uses
      <tt>503 Service Unavailable</tt>, or another response appropriate to the
      actual failure, and MAY use <tt>Retry-After</tt> as defined by
      <xref target="RFC9110"/>. A 403 AE-CHALLENGE is appropriate when
      evidence is actually insufficient, including when load pressure also
      makes pacing the corrected presentation necessary. If the server cannot
      allocate or claim the state required by Section 2.4, it uses 503 and
      MUST NOT include <tt>evidence_challenge</tt>.</t>
      <sourcecode type="http"><![CDATA[
HTTP/1.1 403 Forbidden
Content-Type: application/problem+json
Cache-Control: no-store
Date: Sun, 09 Aug 2026 23:50:00 GMT
Retry-After: 30

{
"type":"https://iana.org/assignments/http-problem-types#ae-required",
  "title": "Authorization Evidence Required",
  "status": 403,
  "detail": "Required evidence is unavailable.",
  "evidence_challenge": {
    "@version": "AE-CHALLENGE-v1",
    "challenge_id": "7a3120d1-...",
    "nonce": "...",
    "action_digest": "sha256:...",
    "action_profile": "https://example.net/action/payment-v3",
    "audience": "https://agent.example",
    "policy_id": "https://resource.example/policies/high-risk-v4",
    "policy_digest": "sha256:...",
    "required_evidence": [
      { "requirement_id": "human-approval",
        "type": "https://example.net/e/authorization-receipt",
        "max_age_sec": 300,
        "status": "current" }
    ],
    "present_as": ["https://example.net/p/ep-aec-v1"],
    "obtain_hints": [],
    "retry_timing": {
      "not_before": "2026-08-09T23:50:30Z",
      "jitter_sec": 20
    },
    "expires_at": "2026-08-10T00:05:00Z"
  }
}
]]></sourcecode>
      <t>The Problem Details <tt>type</tt> and <tt>title</tt> MUST have the
      values shown above. The HTTP status code and the optional
      <tt>status</tt> member MUST both be 403. The core challenge MUST appear
      in the <tt>evidence_challenge</tt> extension member. Human-readable
      <tt>detail</tt> text is advisory and MUST NOT be parsed for protocol
      semantics.</t>
      <t>The origin server MUST send <tt>Cache-Control: no-store</tt>. A
      generic intermediary can still transform an HTTP response, so a client
      MUST validate the Problem Details object and the authenticated origin
      before acting on hints or presenting evidence.</t>
      <t>When the core challenge contains <tt>retry_timing</tt>, the origin
      server SHOULD send a <tt>Retry-After</tt> field as defined by
      <xref target="RFC9110"/>. Its HTTP-date or delay-seconds value MUST NOT
      permit a follow-up request earlier than <tt>not_before</tt>. If the
      header and core member identify different lower bounds, a client MUST
      use the later bound and then apply <tt>jitter_sec</tt>. Retry-After does
      not carry the jitter value and does not change the challenge expiry,
      authorize the action, promise capacity or acceptance, or make a retry
      safe after an uncertain effect.</t>
      <section anchor="oauth-non-substitution-case">
        <name>OAuth Non-Substitution Conformance Case</name>
        <t>A protected resource requires a transaction-specific OAuth grant.
        The presenter supplies a valid AE-CHALLENGE response but no native
        transaction-bound access token. The protected resource
        <bcp14>MUST</bcp14> refuse the action. It <bcp14>MUST NOT</bcp14> treat
        the AE challenge identifier or nonce as the OAuth transaction
        identifier, and it <bcp14>MUST NOT</bcp14> report the evidence
        presentation as satisfying the native grant requirement. The case
        passes only when the protected resource continues the native OAuth
        flow or refuses.</t>
      </section>
    </section>

    <section anchor="dmsc-profile">
      <name>Informative DMSC Gateway Profile</name>
      <t>Agent gateways can carry the transport-neutral challenge during
      federation or handoff. The receiving gateway is the relying party: it
      derives the exact action, applies its own trust anchors and policy, and
      issues a challenge when evidence is missing, stale, or unverifiable.
      The sending gateway or agent can obtain evidence and return a new
      presentation using a DMSC-defined extension point or error carrier.</t>
      <t>If the receiving gateway's required next step is a native OAuth
      transaction grant, the DMSC carrier preserves that native challenge
      rather than wrapping it as AE-CHALLENGE. A DMSC application profile can
      carry both only under the explicit composition rules in
      <xref target="oauth-boundary"/>.</t>
      <t>If a gateway rewrites or translates the proposed action, the next
      gateway re-evaluates that locally derived action and, when necessary,
      issues its own binding. The prior gateway's action digest does not
      survive the rewrite as the receiving gateway's binding. Any claim that
      the two actions are equivalent requires a separately defined mapping or
      transformation proof.</t>
      <t>When a receiving gateway refuses an action because required
      authorization evidence is missing, stale, or unverifiable, it may
      return a structured evidence challenge identifying the exact action,
      outstanding evidence requirements, applicable freshness or status
      constraints, and supported presentation profiles. The challenge does
      not authorize the action or transfer admission ownership; conserved
      admission across gateway boundaries remains the separate requirement
      described in Section 7.8 of the proposed next revision of
      <xref target="DMSC-GAPS"/>.</t>
      <t>In particular, AE-CHALLENGE does not prevent Gateway A and Gateway B
      from admitting the same single-use right. It does not copy, fence, or
      relinquish consumption state and does not establish which gateway owns
      admission during a partition. The separate handoff property is not a
      race to decide which gateway admitted first; it is an invariant that
      committed capacity is not over-allocated under any interleaving of
      admissions and releases. A DMSC handoff profile MUST solve that property
      separately. If the receiving gateway cannot establish the
      required exclusivity, its safe result is refusal or indeterminate, not
      acceptance based on the challenge.</t>
      <section anchor="dmsc-case">
        <name>Gateway Conformance Case</name>
        <t>Gateway A forwards a proposed action to Gateway B. Gateway B derives
        the exact action under its pinned action profile and refuses because a
        current approval artifact is missing. B returns an AE-CHALLENGE bound
        to B's action digest and local evidence requirement. A obtains and
        presents the artifact. B verifies it under B's trust anchors, matches
        it to the same action, and reevaluates B's policy. The case passes only
        if A never treats the challenge as authorization and B refuses an
        action-digest mismatch, stale status, replayed nonce, or unsupported
        presentation profile.</t>
        <t>A second case attempts concurrent admission of one single-use right
        at both gateways. AE-CHALLENGE alone MUST NOT be reported as passing
        that case. The case passes only when a separate conserved-admission
        mechanism establishes exclusivity, or when the receiving gateway
        refuses or returns indeterminate because exclusivity cannot be
        established.</t>
      </section>
    </section>

    <section anchor="security">
      <name>Security Considerations</name>
      <t><strong>Challenge forgery and evidence exfiltration.</strong> A
      forged challenge cannot authorize an action, but it can redirect a
      presenter, induce unnecessary approval work, or solicit sensitive
      evidence. Presenters MUST authenticate the relying party and audience
      before following obtain hints or disclosing evidence. A bare JSON object
      copied outside its authenticated carrier has no origin authenticity.</t>
      <t><strong>Action substitution.</strong> The relying party computes the
      challenge action digest from the action it would execute and recomputes
      that binding before admission. A digest supplied by the presenter or an
      action profile selected by the presenter defeats the purpose of the
      protocol.</t>
      <t><strong>Replay and state exhaustion.</strong> Stateful issuance binds
      the complete body before exposure; self-describing issuance defers
      storage but still requires an atomic replay claim before evidence
      evaluation. An attacker can provoke refusals cheaply or consume a
      structurally valid challenge. Aggregate and scoped bounds, short
      expiries, authentication where available, and rate limits are therefore
      required operational controls. Exhaustion or replay-store uncertainty
      fails closed. Live replay state is never evicted to make room for new
      work.</t>
      <t><strong>Replica consistency.</strong> Per-process replay caches permit
      two verifier replicas to accept the same nonce. Verifiers for one issuer
      need one atomic replay domain or an exclusive deterministic shard.
      During partition or store failure they refuse rather than create local
      replacement state.</t>
      <t><strong>Retry synchronization and load amplification.</strong> A
      precise challenge tells a presenter how to correct a request, so a
      population receiving similar refusals can retry in a synchronized burst.
      An issuer under pressure SHOULD combine recipient-specific retry timing,
      a non-zero jitter interval, admission control, and rate limiting. A
      presenter SHOULD retain exponential backoff or equivalent local load
      control even when a challenge supplies a lower bound. Timing guidance
      paces only a new evidence presentation and MUST NOT be interpreted as
      evidence satisfaction, authorization, or a promise that capacity or
      admission will exist after <tt>not_before</tt>.</t>
      <t><strong>Information disclosure.</strong> Evidence requirements,
      policy identifiers, action profiles, and obtain hints can reveal
      sensitive policy structure. A relying party SHOULD disclose only the
      minimum information needed for remediation. The HTTP binding requires
      <tt>Cache-Control: no-store</tt>.</t>
      <t><strong>Stale facts and uncertain effects.</strong> A satisfied
      challenge proves only that the relying party's evidence requirement was
      met at evaluation time. It does not prove that external facts remain
      true, that an action executed, or that an uncertain action is safe to
      retry. Status rechecking, execution custody, effect observation, and
      reconciliation remain separate controls.</t>
      <t><strong>Gateway split brain.</strong> An authenticated challenge from
      a receiving gateway does not transfer a single-use authorization or its
      consumption ledger. Implementations MUST NOT claim cross-gateway
      double-admission prevention merely because both gateways implement this
      challenge.</t>
    </section>

    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>IANA is requested to add the following entry to the "HTTP Problem
      Types" registry established by <xref target="RFC9457"/>. That registry
      uses the Specification Required policy defined by
      <xref target="RFC8126"/>; this request does not require IETF Review or
      Standards Action.</t>
      <dl>
        <dt>Type URI:</dt>
        <dd>https://iana.org/assignments/http-problem-types#ae-required</dd>
        <dt>Title:</dt>
        <dd>Authorization Evidence Required</dd>
        <dt>Recommended HTTP status code:</dt>
        <dd>403</dd>
        <dt>Reference:</dt>
        <dd>This document.</dd>
      </dl>
      <t>This revision withdraws the earlier request for a new
      <tt>application/authorization-evidence-challenge+json</tt> media type.
      The HTTP binding reuses the registered
      <tt>application/problem+json</tt> media type. Non-HTTP bindings define
      their own carriage without changing the core data model.</t>
    </section>

    <section anchor="open-questions">
      <name>Interoperability Questions for Review</name>
      <t>This revision resolves the transport layering, HTTP status and media
      type, gateway-ownership boundary, acquisition-protocol coupling, retry
      synchronization, retry criticality, bounded replay state, and per-hop
      binding questions raised through revision -04. Review is requested on
      the following remaining choices:</t>
      <ul>
        <li>Which Agent2Agent and AgentProto error carriers can preserve the
        complete challenge, authenticated issuer, audience, and retry timing,
        and whether either protocol needs an additional attempt identifier.</li>
        <li>Whether a DMSC gateway profile should carry the core object
        directly or reference it by an authenticated, digest-bound URI.</li>
        <li>Which application profiles, if any, need both a native OAuth
        transaction challenge and an AE-CHALLENGE, and how those profiles
        should expose the two independent replay domains.</li>
      </ul>
    </section>

    <section anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>Thanks to Sumit P. Ahuja for identifying synchronized retry and load
      amplification as a consequence of precise challenge guidance, for
      correcting retry criticality and non-promissory timing semantics, and
      for identifying refusal-path state exhaustion. Thanks to Guigui Wang for
      implementation feedback on structured error payloads, per-hop action
      rebinding, and the separation of capability discovery from local
      authority. Thanks to Henri Sirkkavaara for review of replay ordering,
      concurrent-presentation behavior, diagnostic ordering, and portable
      identifier semantics.</t>
    </section>

    <section anchor="changes">
      <name>Changes since -04</name>
      <ul>
        <li>Forbids listing <tt>retry_timing</tt> as critical because it changes
        pacing, not the semantic meaning of the refusal.</li>
        <li>States that <tt>not_before</tt> is a presentation lower bound and
        no promise of capacity, evidence sufficiency, admission, or
        execution.</li>
        <li>Defines bounded aggregate and scoped challenge-state limits, cap
        behavior, and fail-closed handling for replay-store unavailability.</li>
        <li>Permits authenticated self-describing issuance while making clear
        that single-use processing still requires bounded replay state.</li>
        <li>Requires one authoritative atomic replay domain across verifier
        replicas and prohibits eviction of live replay state.</li>
        <li>Adds state-exhaustion and multi-replica conformance cases.</li>
        <li>Separates AE-CHALLENGE from OAuth Transaction Authorization
        Challenge: native transaction-grant flows retain their signed OAuth
        challenge, 401 response, transaction identifier, access token, and
        replay state. Adds an explicit non-substitution conformance case and
        permits composition only through an application profile.</li>
      </ul>
    </section>
  </middle>

  <back>
    <references>
        <name>Normative References</name>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3339.xml"/>
        <reference anchor="RFC3986" target="https://www.rfc-editor.org/info/rfc3986">
          <front>
            <title>Uniform Resource Identifier (URI): Generic Syntax</title>
            <author fullname="Tim Berners-Lee"/>
            <author fullname="Roy T. Fielding"/>
            <author fullname="Larry Masinter"/>
            <date year="2005" month="January"/>
          </front>
          <seriesInfo name="STD" value="66"/>
          <seriesInfo name="RFC" value="3986"/>
          <seriesInfo name="DOI" value="10.17487/RFC3986"/>
        </reference>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8126.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8259.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9110.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9457.xml"/>
    </references>
    <references>
        <name>Informative References</name>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9470.xml"/>
        <reference anchor="OAUTH-TXN-CHALLENGE" target="https://datatracker.ietf.org/doc/draft-rosomakho-oauth-txn-challenge/">
          <front>
            <title>OAuth Transaction Authorization Challenge</title>
            <author fullname="Yaroslav Rosomakho"><organization>Zscaler</organization></author>
            <author fullname="Brian Campbell"><organization>Ping Identity</organization></author>
            <author fullname="Karl McGuinness"><organization>Independent</organization></author>
            <author fullname="Pieter Kasselman"><organization>Defakto Security</organization></author>
            <date year="2026" month="June" day="25"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-rosomakho-oauth-txn-challenge-00"/>
        </reference>
        <reference anchor="KLRC" target="https://datatracker.ietf.org/doc/draft-klrc-aiagent-auth/">
          <front>
            <title>AI Agent Authentication and Authorization</title>
            <author fullname="Pieter Kasselman"/>
            <author fullname="Jean-Francois Lombardo"/>
            <author fullname="Yaroslav Rosomakho"/>
            <author fullname="Brian Campbell"/>
            <author fullname="Nick Steele"/>
            <author fullname="Aaron Parecki"/>
            <date year="2026" month="July" day="9"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-klrc-aiagent-auth-03"/>
        </reference>
        <reference anchor="DMSC-GAPS" target="https://datatracker.ietf.org/doc/draft-dunbar-dmsc-gw-scenarios-gap-analysis/">
          <front>
            <title>Deployment Scenarios and Gap Analysis for AI Agent Gateway</title>
            <author fullname="Linda Dunbar"/>
            <author fullname="YiFei Wang"/>
            <author fullname="Iman Schrock"/>
            <author fullname="Bing Liu"/>
            <date year="2026" month="August"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-dunbar-dmsc-gw-scenarios-gap-analysis-03"/>
        </reference>
        <reference anchor="CAID" target="https://datatracker.ietf.org/doc/draft-schrock-canonical-action-identifier/">
          <front>
            <title>The Canonical Action Identifier (CAID)</title>
            <author fullname="Iman Schrock"/>
            <date year="2026" month="August"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-schrock-canonical-action-identifier-02"/>
        </reference>
        <reference anchor="AEB" target="https://datatracker.ietf.org/doc/draft-schrock-action-evidence-boundary/">
          <front>
            <title>The Action Evidence Boundary for Consequential Agent Effects</title>
            <author fullname="Iman Schrock"/>
            <date year="2026" month="August"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-schrock-action-evidence-boundary-03"/>
        </reference>
        <reference anchor="BCR" target="https://datatracker.ietf.org/doc/draft-schrock-ep-bounded-capability-receipts/">
          <front>
            <title>Bounded Capability Receipts and Durable Spend Control for Agent Actions</title>
            <author fullname="Iman Schrock"/>
            <date year="2026" month="August"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-schrock-ep-bounded-capability-receipts-03"/>
        </reference>
        <reference anchor="AEC" target="https://datatracker.ietf.org/doc/draft-schrock-ep-authorization-evidence-chain/">
          <front>
            <title>Authorization Evidence Chains: Composing Heterogeneous Agent-Action Evidence (EP-AEC)</title>
            <author fullname="Iman Schrock"/>
            <date year="2026" month="August"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-schrock-ep-authorization-evidence-chain-05"/>
        </reference>
        <reference anchor="AUTH-RECEIPTS" target="https://datatracker.ietf.org/doc/draft-schrock-ep-authorization-receipts/">
          <front>
            <title>Authorization Receipts for High-Risk Agent Actions</title>
            <author fullname="Iman Schrock"/>
            <date year="2026" month="August" day="9"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-schrock-ep-authorization-receipts-11"/>
        </reference>
    </references>

    <section anchor="related-work">
      <name>Relationship to Existing Mechanisms</name>
      <t>CAID <xref target="CAID"/> is one mechanism for deriving and mapping
      exact material actions. AEB <xref target="AEB"/> defines executor-side
      evidence verification, refusal, and one-time consumption. Bounded
      Capability Receipts <xref target="BCR"/> define durable single-domain
      reservation and consumption. AEC <xref target="AEC"/> is one possible
      presentation profile. None is required by the core challenge, and the
      challenge does not extend any of them across independently operated
      admission domains.</t>
      <t>OAuth Transaction Authorization Challenge
      <xref target="OAUTH-TXN-CHALLENGE"/> supplies the OAuth-native
      choreography and transaction-bound grant that this document explicitly
      does not define. The KLRC architecture <xref target="KLRC"/> describes
      broader agent authentication and authorization requirements, including
      human-in-the-loop and externalized authorization patterns. Authorization
      Receipts <xref target="AUTH-RECEIPTS"/> are one possible portable human-
      evidence type that an AE-CHALLENGE can request; neither the receipt nor
      AE-CHALLENGE replaces a native OAuth grant or a relying party's final
      policy decision.</t>
    </section>

    <section anchor="impl">
      <name>Implementation Status</name>
      <t>The EMILIA Protocol repository contains a same-team reference
      implementation of the AE-CHALLENGE-v1 core lifecycle, including
      relying-party-derived action binding, policy-derived requirements,
      durable body-bound registration, single-use consumption, expiry,
      follow-up challenges, and action-swap refusal. Revision -03 added a
      serializer and parser for the RFC 9457 HTTP binding and tests that pin
      status 403, <tt>application/problem+json</tt>,
      <tt>Cache-Control: no-store</tt>, and the
      <tt>evidence_challenge</tt> extension.</t>
      <t>Revision -04 specifies retry timing, per-hop rebinding, discovery
      separation, carrier semantics, portable absolute-URI identifiers, and
      action-before-consumption replay ordering. These additions are based in
      part on external implementer review, including experience with structured
      error payloads and per-verifier decision bindings. They are not yet
      implemented by the same-team reference implementation and are not
      claimed as an independent implementation of this specification.</t>
      <t>Revision -05 adds optional self-describing issuance, mandatory state
      bounds and cap behavior, authoritative replay-domain requirements, and
      state-exhaustion conformance cases. The same-team implementation uses
      durable stateful issuance and atomic consumption across workers and
      restarts, but does not yet implement the -05 configurable cap behavior
      or self-describing issuance path. No implementation claim is made for
      those additions.</t>
      <t>The OAuth boundary and non-substitution case in revision -05 are
      normative text and conformance requirements. The same-team reference
      implementation does not convert an AE-CHALLENGE into an OAuth challenge
      or grant, and no such conversion is planned. It does not yet implement a
      composed application profile carrying both mechanisms.</t>
      <t>This is same-team implementation evidence. No independent
      implementation or interoperability is claimed. The implementation does
      not yet provide a DMSC carrier or conserved-admission mechanism. Its
      current local evidence and presentation identifiers are not the absolute
      URIs required by this revision.</t>
    </section>
  </back>
</rfc>
