<?xml version="1.0" encoding="utf-8"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude"
     docName="draft-schrock-ae-challenge-03"
     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-03"/>
    <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="8"/>
    <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>
    </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. The nearest prior art is OAuth step-up authentication
      <xref target="RFC9470"/>, which lets a resource identify stronger
      authentication requirements. AE-CHALLENGE applies the interaction
      shape to authorization evidence about an exact proposed action.</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="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 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": "authorization_receipt",
      "profiles": ["https://example.net/profiles/receipt-v1"],
      "max_age_sec": 300,
      "status": "current"
    }
  ],
  "present_as": ["ep-aec-v1"],
  "obtain_hints": [
    {
      "requirement_id": "human-approval",
      "mechanism": "https://example.net/flows/approval-v1",
      "uri": "https://approver.example/tasks/123"
    }
  ],
  "expires_at": "2026-08-08T23:59: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. The
        relying party MUST bind the complete challenge body to the durable
        nonce record before exposing the challenge.</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 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>
      </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. Type and profile identifiers are
        opaque protocol identifiers; a recipient MUST NOT infer security
        semantics from string prefixes or substring matches.</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>
      </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 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; durable body binding; expiry; action agreement; nonce
        consumption; native evidence verification; and local policy
        evaluation. Malformed input that cannot be associated with a
        registered challenge is refused without consuming a nonce. Once a
        structurally valid presentation has been matched to a registered
        challenge, the nonce MUST be consumed before evidence evaluation so
        concurrent or action-swapped retries cannot reuse it.</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>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="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.</t>
      </section>
    </section>

    <section anchor="http-binding">
      <name>HTTP Binding</name>
      <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>
      <sourcecode type="http"><![CDATA[
HTTP/1.1 403 Forbidden
Content-Type: application/problem+json
Cache-Control: no-store

{
"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": "authorization_receipt",
        "max_age_sec": 300,
        "status": "current" }
    ],
    "present_as": ["ep-aec-v1"],
    "obtain_hints": [],
    "expires_at": "2026-08-08T23:59: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>
    </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>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. A DMSC handoff profile MUST solve those
      properties 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 denial of service.</strong> Durable body-bound
      nonce registration is required before challenge exposure. Consumption
      before evidence evaluation prevents concurrent replays, but an attacker
      who can submit a structurally valid response can consume a challenge.
      Deployments therefore need authenticated presenters, rate limits, short
      expiries, and a cheap path to issue a replacement challenge.</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, and acquisition-protocol coupling in
      revision -02. Review is requested on the following remaining choices:</t>
      <ul>
        <li>Whether evidence type, presentation profile, and action profile
        identifiers should be required to be absolute URIs or may remain
        opaque identifiers governed by the carrying protocol.</li>
        <li>Whether consuming the nonce after structural and action matching
        but before evidence verification is the correct common replay rule
        for both task-oriented and message-oriented agent protocols.</li>
        <li>Which Agent2Agent and AgentProto extension or error carriers can
        preserve the complete challenge, authenticated issuer, and audience
        without treating the challenge as a task result or authorization.</li>
        <li>Whether a DMSC gateway profile should carry the core object
        directly or reference it by an authenticated, digest-bound URI.</li>
      </ul>
    </section>

    <section anchor="changes">
      <name>Changes since -02</name>
      <ul>
        <li>Separates the transport-neutral core model from transport
        bindings.</li>
        <li>Replaces HTTP 428 and the proposed dedicated media type with HTTP
        403 and RFC 9457 <tt>application/problem+json</tt>.</li>
        <li>Requests an HTTP Problem Types registry entry under Specification
        Required rather than a standards-tree media type.</li>
        <li>Removes the protocol-specific EP-APPROVAL acquisition flow from
        the core and defines generic, non-authoritative obtain hints.</li>
        <li>Defines action-profile, requirement-correlation, extension, nonce
        consumption, and authenticated-carriage rules.</li>
        <li>Adds an informative DMSC gateway profile and conformance cases
        while explicitly excluding admission transfer and double-admission
        prevention.</li>
      </ul>
    </section>
  </middle>

  <back>
    <references>
      <name>References</name>
      <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.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="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>
      </references>
    </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>
    </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 adds 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>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, and its
      current local evidence and presentation identifiers do not resolve the
      identifier-governance question in <xref target="open-questions"/>.</t>
    </section>
  </back>
</rfc>
