<?xml version="1.0" encoding="UTF-8"?>
<rfc category="std" docName="draft-liu-agent-action-confirmation-00"
     ipr="trust200902" submissionType="IETF" version="3" xml:lang="en">
  <front>
    <title>Agent Action Confirmation Protocol (AACP)</title>

    <seriesInfo name="Internet-Draft"
                value="draft-liu-agent-action-confirmation-00"/>

    <author fullname="Meihui Liu" initials="M." surname="Liu">
      <organization>China Mobile</organization>

      <address>
        <email>liumeihui@chinamobile.com</email>
      </address>
    </author>

    <date day="2" month="November" year="2026"/>

    <workgroup>Individual submission</workgroup>

    <abstract>
      <t>AI agents invoke operations with side effects: writes to resources,
      creation of durable records, financial transactions, and delegated
      actions on remote systems. Existing requirement documents in the
      agentproto working group establish that such operations require
      confirmation by the human user, that this confirmation must occur
      outside of LLM prompt inference, and that in multi-agent delegation the
      receiving agent must be able to verify that a presented confirmation
      actually originated from the user and is not fabricated by an
      intermediate agent. No document in the current document set defines a
      protocol, message format, or evidence format that satisfies these
      requirements. This document defines the Agent Action Confirmation
      Protocol (AACP): an action descriptor format derived from OAuth 2.0 Rich
      Authorization Requests (RFC 9396), a confirmation request format, a
      signed confirmation evidence format, and verifier-side processing rules
      with a distinct-outcome failure model. The design is transport-neutral
      and profiled here for JSON over HTTP with JWS signatures; a CBOR/COSE
      mapping is defined. A requirement traceability matrix maps each
      mechanism to its source requirement in the agentproto document set.</t>

      <t>This document is informed by, and positions itself relative to, two
      prior individual submissions that addressed user confirmation of agent
      actions and have since expired: CHEQ <xref
      target="I-D.rosenberg-aiproto-cheq"/> and the Agent Operation
      Authorization framework <xref
      target="I-D.liu-agent-operation-authorization"/>. The differences are
      summarized in Section 1.4.</t>
    </abstract>
  </front>

  <middle>
    <section anchor="sec-intro" title="Introduction">
      <section anchor="sec-background" title="Background and Motivation">
        <t>AI agents are software applications that utilize Large Language
        Models (LLMs) to perform tasks, and they invoke operations with side
        effects on external systems: creating bookings, updating records,
        initiating payments, executing delegated administrative actions. Two
        properties of current agent architectures make unconfirmed
        side-effecting operations hazardous:</t>

        <ol>
          <li>
            <t>Fallible inference. An agent may invoke the wrong operation, or
            the right operation with wrong parameters, as a direct consequence
            of model error. Read operations are recoverable; side-effecting
            operations may not be.</t>
          </li>

          <li>
            <t>Untrustworthy intermediaries. In multi-agent delegation, a
            chain of agents conveys context and instructions between the user
            and the agent that ultimately acts. An intermediate agent may
            fabricate the claim "the user approved this" — whether through
            hallucination or compromise — and nothing in current agent
            communication protocols lets the acting agent distinguish a real
            user decision from a fabricated one.</t>
          </li>
        </ol>

        <t>The agentproto working group's requirement documents address both
        properties but deliberately stop at the requirements level.</t>

        <t><xref target="I-D.rosenberg-agentproto-usecases"/> Section 3.2.3
        requires that confirmation for side-effecting operations happen
        "programatically, outside of the LLM prompt inference", that APIs be
        annotated with which operations require confirmation, and that the
        annotation carry user-visible names and descriptions of the attributes
        that require confirmation, together with their mapping into the
        operation's JSON payload. Section 3.3.6 extends the requirement to
        inter-agent communication: "How can the invoked AI agent trust that
        the confirmation actually came from the end user, and is not instead a
        hallucination generated by the invoking AI Agent? This will also
        require protocol machinery to provider cryptographic assurances."</t>

        <t>The security-focused documents in the document set define
        requirement models for the evidence that would answer this question,
        while explicitly declining to define the evidence format. <xref
        target="I-D.bu-agentproto-security-principal-binding"/> separates
        claims including "action evidence" (claim C-005) from other
        security-relevant claims, and defines row-outcome and
        dependency-closure rules so that a verification result cannot be
        stronger than its inputs. <xref
        target="I-D.he-agentproto-verifier-evidence"/> requires that a
        verification result report whether a check has been "exercised into
        its declared rejecting and unverifiable outcomes"; that document
        "defines no wire format, encoding, token, claim vocabulary, test
        harness, or registry". <xref
        target="I-D.konda-agentproto-evaluation-state"/> requires that the
        facts "the input was established and evaluated negatively" and "the
        input could not be established at all" remain distinct across a
        protocol boundary, and notes that its test cases have "a
        machine-readable form published separately". <xref
        target="I-D.wadkins-agentproto-action-determinability"/> requires that
        a claimed agent transition remain "independently determinable after
        the original interaction has ended".</t>

        <t>This document defines the missing piece: a wire-level protocol and
        evidence format that satisfies those requirements. It is deliberately
        positioned as a profile-ready building block rather than a new
        architecture: AACP defines what must be confirmed, how the
        confirmation is bound to the action, and how a verifier processes and
        reports the result. It does not define new transport, discovery, or
        agent identity mechanisms, and composes with the candidate transports
        under discussion in the working group.</t>
      </section>

      <section anchor="sec-req-relationship"
               title="Relationship to agentproto Requirement Documents">
        <t>This document takes requirements from, and is intended to be
        citable by, the following documents in the working group's document
        set:</t>

        <table anchor="tab-requirements">
          <thead>
            <tr>
              <th>Source document</th>

              <th>Requirement taken</th>
            </tr>
          </thead>

          <tbody>
            <tr>
              <td>
                <xref target="I-D.rosenberg-agentproto-usecases"/>
              </td>

              <td>Programmatic confirmation outside LLM inference; API
              annotation of confirmation requirements; user-visible attribute
              mapping (Sec 3.2.3); cryptographic assurance that confirmation
              originates from the user in inter-agent flows (Sec 3.3.6)</td>
            </tr>

            <tr>
              <td>
                <xref target="I-D.bu-agentproto-security-principal-binding"/>
              </td>

              <td>Claim separation (C-005 action evidence, C-007 evidence
              provenance, C-008 freshness); row-outcome semantics; failure
              handling (C-009)</td>
            </tr>

            <tr>
              <td>
                <xref target="I-D.he-agentproto-verifier-evidence"/>
              </td>

              <td>Exercise evidence: a result must report whether checks have
              been exercised into rejecting and unverifiable outcomes</td>
            </tr>

            <tr>
              <td>
                <xref target="I-D.konda-agentproto-evaluation-state"/>
              </td>

              <td>Evaluation state preservation: denied vs unobtainable vs
              stale are distinct facts with distinct protocol outcomes</td>
            </tr>

            <tr>
              <td>
                <xref target="I-D.wadkins-agentproto-action-determinability"/>
              </td>

              <td>Post-session determinability: evidence remains verifiable
              after sessions, credentials, and agent instances are gone</td>
            </tr>

            <tr>
              <td>
                <xref target="I-D.agentic-ai-usecases-requirements"/>
              </td>

              <td>CMN-12: a participant must be able to verify that a change
              is authorized at the time it happens, and must be able to
              determine whether a check failed or could not be completed</td>
            </tr>

            <tr>
              <td>
                <xref target="I-D.srivastava-agentproto-handoff-context"/>
              </td>

              <td>Handoff chain: offers named by hash (chain binding of
              confirmation to delegation path)</td>
            </tr>

            <tr>
              <td>
                <xref target="I-D.okutomi-session-bound-agent-identity"/>
              </td>

              <td>Context diversion: evidence must not be acceptable for a
              different actor, task, or authority boundary</td>
            </tr>

            <tr>
              <td>
                <xref target="I-D.howe-agentproto-contact-center-usecases"/>
              </td>

              <td>Cross-channel confirmation and dialog resumption semantics
              for out-of-band confirmation (CC3-1, CC3-4)</td>
            </tr>
          </tbody>
        </table>

        <t><xref target="appendix-traceability"/> contains the full
        traceability matrix from mechanism to requirement.</t>
      </section>

      <section anchor="sec-scope" title="Scope and Non-Goals">
        <t>In scope:</t>

        <ul>
          <li>
            <t>A JSON <xref target="RFC8259"/> action descriptor format,
            derived from and aligned with the "authorization_details"
            structure of OAuth 2.0 Rich Authorization Requests <xref
            target="RFC9396"/>, extended with confirmation-specific
            metadata.</t>
          </li>

          <li>
            <t>A confirmation request format and a signed confirmation
            evidence format, including binding rules, freshness rules, and an
            authentication context.</t>
          </li>

          <li>
            <t>Verifier-side processing rules with a distinct-outcome failure
            model, suitable for enforcement at API gateways and at acting
            agents.</t>
          </li>

          <li>
            <t>A CBOR <xref target="RFC8949"/> / COSE <xref target="RFC9052"/>
            mapping.</t>
          </li>
        </ul>

        <t>Out of scope (non-goals):</t>

        <ul>
          <li>
            <t>Agent discovery, routing, session establishment, or transport
            selection. AACP rides on existing or emerging agent communication
            protocols and API invocation mechanisms.</t>
          </li>

          <li>
            <t>Agent identity, agent-to-agent authentication, or token
            issuance. AACP binds confirmations to actions and users; it
            presumes agent authentication is solved by the surrounding
            protocol, and requires only that identifiers be nameable.</t>
          </li>

          <li>
            <t>How users authenticate to the Confirmation Service. AACP
            carries an authentication context describing how the user
            authenticated, not the authentication mechanism itself.</t>
          </li>

          <li>
            <t>Prompt injection defenses in general. AACP reduces the blast
            radius of prompt injection by moving irreversible decisions out of
            LLM inference, but does not detect or prevent injection
            attacks.</t>
          </li>

          <li>
            <t>General-purpose audit systems and transparency services. AACP
            evidence is designed to be referenceable by such systems (e.g., by
            digest), not to replace them.</t>
          </li>
        </ul>

        <t>The scope boundary above is aligned with the agentproto working
        group charter <xref target="CHARTER"/>. The charter places "the design
        of human to agent user interfaces, client application UX, or the
        rendering of agent outputs on end-user devices" and "audit data
        structures and their production, validation, or consumption" outside
        the working group's scope. AACP addresses neither: its rendering
        requirements are constraints on API metadata and on programmatic
        processing of that metadata (which fields must be confirmed and how
        their values are named for display), not user interface design; and
        its evidence is an authorization input, not an audit data structure.
        The distinct-outcome signals of <xref target="sec-outcomes"/> are
        protocol errors, which the charter places in scope.</t>
      </section>

      <section anchor="sec-prior"
               title="Relationship to Prior Individual Submissions">
        <t>Two prior individual Internet-Drafts addressed user confirmation of
        agent actions and have since expired without renewal:</t>

        <t>CHEQ <xref target="I-D.rosenberg-aiproto-cheq"/> proposed a signed
        object memorializing a human decision, with collection outside the
        LLM, embeddable in MCP, A2A, and N-ACT. Its core concern — that
        hallucinated decisions must not produce unwanted actions, and that a
        signature by an identity provider authenticating the user is the
        assurance mechanism — is shared by AACP. AACP differs in three ways.
        First, CHEQ is transport-embedded but verifier-implicit: it does not
        define a verifier-side processing model, so the question of what a
        relying party does with a malformed, stale, or redirected CHEQ is left
        open; AACP's row-outcome model (<xref target="sec-verification"/>)
        makes that processing normative. Second, CHEQ was written before the
        agentproto document set existed and therefore does not trace to its
        requirements; AACP aligns with the claim separation (C-005, C-007,
        C-008), row-outcome, and dependency-closure models of <xref
        target="I-D.bu-agentproto-security-principal-binding"/>, the exercise
        requirements of <xref target="I-D.he-agentproto-verifier-evidence"/>,
        and the evaluation-state requirements of <xref
        target="I-D.konda-agentproto-evaluation-state"/>. Third, CHEQ couples
        confirmation with privacy-protected information collection; AACP
        separates concerns and defines only the confirmation exchange.</t>

        <t>The Agent Operation Authorization framework <xref
        target="I-D.liu-agent-operation-authorization"/> proposed a two-phase
        JWT model: an agent_operation_proposal conveyed via OAuth Pushed
        Authorization Requests, and an Agent Operation Authorization Token
        recording confirmed authorization. Its insight — that a structured
        operation proposal, presented to the user through the authorization
        server rather than through the agent, prevents unauthorized or
        hallucinated actions — is likewise shared. AACP differs in that it is
        not bound to the OAuth authorization code/PAR flow: it defines an
        independent confirmation exchange that composes with agent-to-agent
        delegation (<xref target="sec-multi-agent"/>), where the user is not
        the OAuth resource owner vis-a-vis the acting agent, and where the
        delegated flow's hallucination problem (Section 3.3.6 of <xref
        target="I-D.rosenberg-agentproto-usecases"/>) is not solved by a token
        issued to the agent. AACP's evidence is verified at action time
        against the operation's parameters (action digest), not presented as a
        bearer credential.</t>

        <t>The user-mediated credential delivery proposal <xref
        target="I-D.emerson-oauth-user-mediated-delivery"/>, currently active
        in the OAuth working group's problem space, includes per-action
        confirmation by introspection with a user-verified authenticator. AACP
        is complementary: that work places authorization decisions and
        credential delivery in the user's trusted context at the OAuth grant
        layer; AACP defines the confirmation object, its binding rules, and
        its verification semantics for the agent communication layer, and can
        carry evidence produced by such a flow in its auth-context.</t>
      </section>
    </section>

    <section anchor="sec-terminology" title="Terminology">
      <t>The terms "agent", "user", and "agent communication protocol" are
      used as in <xref target="I-D.rosenberg-agentproto-usecases"/>.</t>

      <dl spacing="compact">
        <dt>Acting Agent (AA)</dt>

        <dd>
          <t>The agent that will invoke a side-effecting operation (an API
          call or a delegated sub-task) and that must present evidence that
          the operation was confirmed. In the terminology of <xref
          target="I-D.rosenberg-agentproto-usecases"/>, typically the "invoked
          agent"; in tool-calling deployments, the agent holding the tool.</t>
        </dd>

        <dt>Requesting Agent (RA)</dt>

        <dd>
          <t>The agent in whose dialog with the user the confirmation is
          collected; typically the "invoking agent". In single-agent flows, RA
          and AA are the same entity.</t>
        </dd>

        <dt>Confirming User (U)</dt>

        <dd>
          <t>The human whose decision the evidence records.</t>
        </dd>

        <dt>Confirmation Service (CS)</dt>

        <dd>
          <t>The component that renders an action descriptor to the user
          through a non-LLM programmatic path, collects the user's decision,
          and signs the confirmation evidence. The CS is the trust anchor of
          this protocol.</t>
        </dd>

        <dt>Action Descriptor (AD)</dt>

        <dd>
          <t>The typed, self-contained description of the operation to be
          confirmed, as defined in <xref target="sec-ad"/>.</t>
        </dd>

        <dt>Confirmation Request (CR)</dt>

        <dd>
          <t>The message from AA to CS asking for confirmation of a specific
          action, as defined in <xref target="sec-cr"/>.</t>
        </dd>

        <dt>Confirmation Evidence (CE)</dt>

        <dd>
          <t>The signed record of the user's decision, as defined in <xref
          target="sec-ce"/>.</t>
        </dd>

        <dt>Verification</dt>

        <dd>
          <t>The procedure by which a verifier checks a CE against the
          operation it accompanies (<xref target="sec-verification"/>).</t>
        </dd>

        <dt>Row outcome</dt>

        <dd>
          <t>As in <xref
          target="I-D.bu-agentproto-security-principal-binding"/>: the
          verified status of a single claim row after verification processing,
          distinct from specification or implementation status.</t>
        </dd>
      </dl>
    </section>

    <section anchor="sec-requirements-language" title="Requirements Language">
      <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>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>
    </section>

    <section anchor="sec-architecture" title="Architecture">
      <section anchor="sec-roles" title="Roles">
        <t>AACP involves four roles:</t>

        <t>U (Confirming User) — CS (Confirmation Service) — AA (Acting Agent)
        — [optional RA (Requesting Agent)] — target operation</t>

        <t>The Acting Agent constructs the Action Descriptor and the
        Confirmation Request. The Confirmation Service renders the descriptor
        to the user, obtains the decision, and produces signed Confirmation
        Evidence. The Acting Agent (or the API it invokes) verifies the
        evidence at action time; any later verifier can re-verify the evidence
        after the fact.</t>

        <t>The Confirmation Service is the only role that holds a signature
        key in the base protocol. This is a deliberate design decision: it
        isolates the trust question "did the user really decide this?" into a
        component whose key management, user interface, and authentication
        quality can be audited independently of any agent implementation. The
        CS is frequently a component of the user's client application, the
        enterprise's authorization infrastructure, or a dedicated confirmation
        application on a user device.</t>
      </section>

      <section anchor="sec-cs" title="The Confirmation Service">
        <t>A conforming Confirmation Service:</t>

        <ul>
          <li>
            <t><bcp14>MUST</bcp14> render confirmation requests to the user
            through a programmatic interface, not by embedding the request in
            an LLM prompt. This is the requirement of <xref
            target="I-D.rosenberg-agentproto-usecases"/> Section 3.2.3. A CS
            that forwards the confirmation decision through an LLM inference
            step does not conform.</t>
          </li>

          <li>
            <t><bcp14>MUST</bcp14> render every parameter marked "confirm":
            true in the action descriptor, with its user-visible label, before
            presenting the decision control.</t>
          </li>

          <li>
            <t><bcp14>MUST</bcp14> sign evidence with a key bound to an
            identifier that verifiers can discover and validate (<xref
            target="sec-signature"/>).</t>
          </li>

          <li>
            <t><bcp14>MUST NOT</bcp14> sign evidence for a decision it did not
            itself render and collect.</t>
          </li>

          <li>
            <t><bcp14>SHOULD</bcp14> bind the rendering it produced to the
            evidence it signs (via the rendering digest, <xref
            target="sec-binding"/>).</t>
          </li>

          <li>
            <t><bcp14>MUST</bcp14> maintain replay state for the lifetime of
            each request (<xref target="sec-replay"/>).</t>
          </li>
        </ul>
      </section>

      <section anchor="sec-trust" title="Trust Model">
        <t>The trust model answers three questions:</t>

        <ol spacing="compact">
          <li>
            <t>Does the verifier trust the CS to have actually interacted with
            the user? Established by CS key validation and by local policy (a
            verifier may accept a restricted set of CSes, e.g., those operated
            by the same enterprise as the verifier).</t>
          </li>

          <li>
            <t>Does the evidence concern THIS action? Established by the
            action digest: the verifier recomputes the digest over the
            operation it is about to execute. A CE that confirms a different
            action, or an action with different parameters, will not match
            (<xref target="sec-binding"/>).</t>
          </li>

          <li>
            <t>Is the evidence current? Established by the challenge
            (AA-generated nonce), the confirmed-at time, and the lifetime
            (<xref target="sec-lifetime"/>).</t>
          </li>
        </ol>

        <t>A fourth property, aligned with <xref
        target="I-D.okutomi-session-bound-agent-identity"/>, is audience
        binding in delegated flows: a CE names the acting agent for which it
        was issued, so evidence obtained for one delegation is not acceptable
        for another (<xref target="sec-multi-agent"/>).</t>

        <t>The model deliberately does NOT require the verifier to trust the
        requesting agent, the agent communication protocol, or any
        intermediate agent. This is the property that answers the
        hallucination concern of <xref
        target="I-D.rosenberg-agentproto-usecases"/> Section 3.3.6: a
        fabricated confirmation cannot be produced without the CS key, and a
        real confirmation cannot be redirected to a different action or
        actor.</t>
      </section>

      <section anchor="sec-flows" title="Confirmation Flows">
        <t>Three flows are supported.</t>

        <t>Variant A — Tool call, single agent (RA == AA):</t>

        <ol spacing="compact">
          <li>
            <t>AA determines the operation requires confirmation (from API
            metadata, <xref target="sec-api"/>).</t>
          </li>

          <li>
            <t>AA constructs the AD (<xref target="sec-ad"/>) and CR (<xref
            target="sec-cr"/>).</t>
          </li>

          <li>
            <t>CS renders, collects the decision, signs the CE.</t>
          </li>

          <li>
            <t>AA invokes the operation presenting the CE.</t>
          </li>

          <li>
            <t>The API (or AA's enforcement point) verifies per <xref
            target="sec-verification"/>.</t>
          </li>
        </ol>

        <t>Variant B — Delegated action (RA != AA):</t>

        <ol spacing="compact">
          <li>
            <t>AA (the invoked agent) constructs the AD and CR for its own
            operation, including its own challenge and itself as audience.</t>
          </li>

          <li>
            <t>AA sends the CR to RA over the agent communication
            protocol.</t>
          </li>

          <li>
            <t>RA relays the CR to its CS. RA <bcp14>MUST NOT</bcp14> alter
            the AD or challenge; the digest and challenge make alteration
            detectable.</t>
          </li>

          <li>
            <t>CS renders to the user (RA's user is the confirming user if the
            delegation carries user authority; see <xref
            target="sec-multi-agent"/>).</t>
          </li>

          <li>
            <t>CS signs the CE; RA relays it back to AA.</t>
          </li>

          <li>
            <t>AA verifies the CE (<xref target="sec-verification"/>) before
            executing.</t>
          </li>
        </ol>

        <t>Variant C — Out-of-band confirmation:</t>

        <t>When the user is not reachable on the current channel, the CR
        carries channel requirements (<xref target="sec-cr"/>); the CS
        delivers the confirmation prompt through a pre-registered side channel
        (device push, SMS, email), collects the decision out of band, and the
        result is returned asynchronously. This variant addresses the
        reconnection and channel-negotiation requirements discussed in <xref
        target="I-D.feng-agentproto-session-requirements"/> and the resumption
        semantics of <xref
        target="I-D.howe-agentproto-contact-center-usecases"/> (CC3-1, CC3-4):
        an unobtainable confirmation is reported as a status outcome, not as a
        denial (<xref target="sec-distinct"/>).</t>
      </section>
    </section>

    <section anchor="sec-ad" title="Action Descriptor">
      <t>The Action Descriptor is the object the user actually confirms. It is
      a JSON object conforming to the "authorization_details" entry format of
      <xref target="RFC9396"/> Section 2, with the extensions defined in this
      section. Reuse of the RAR structure is deliberate: it gives the protocol
      a field-tested typed-descriptor model, an existing body of deployment
      practice in open banking, and a documented set of pitfalls (type design,
      consent-screen sanitization) that this profile inherits and
      addresses.</t>

      <section anchor="sec-ad-fields" title="Fields">
        <dl spacing="compact">
          <dt>type (string, REQUIRED)</dt>

          <dd>
            <t>An identifier for the action type, as in <xref
            target="RFC9396"/> Section 2.1. The value determines the allowable
            contents of the descriptor. For interoperability across domains,
            the value <bcp14>SHOULD</bcp14> be a URI under the control of the
            API provider, following the collision-resistant namespace guidance
            of <xref target="RFC9396"/>.</t>
          </dd>

          <dt>actions (array of strings, REQUIRED)</dt>

          <dd>
            <t>The kinds of action requested, e.g., "initiate", "update",
            "cancel".</t>
          </dd>

          <dt>locations (array of strings, OPTIONAL)</dt>

          <dd>
            <t>The resource servers or endpoints where the action will be
            executed, as in <xref target="RFC9396"/> Section 2.2.</t>
          </dd>

          <dt>parameters (object, OPTIONAL)</dt>

          <dd>
            <t>A map from field name to a parameter object:</t>

            <dl spacing="compact">
              <dt>value (any, REQUIRED)</dt>

              <dd>
                <t>The actual value for the operation invocation.</t>
              </dd>

              <dt>confirm (boolean, OPTIONAL, default false)</dt>

              <dd>
                <t>If true, this parameter <bcp14>MUST</bcp14> be rendered to
                the user as part of the confirmation. API metadata determines
                which parameters carry confirm=true (<xref
                target="sec-api"/>).</t>
              </dd>

              <dt>render (object, OPTIONAL)</dt>

              <dd>
                <t>User-visible rendering metadata for the parameter: "label"
                (a short human-readable name), "value-label" (a pre-formatted
                human rendering of the value), "format" (a rendering hint such
                as "currency" or "date"), and "sensitive" (if true, verifiers
                and logs <bcp14>SHOULD</bcp14> mask this parameter's value,
                <xref target="sec-privacy"/>).</t>
              </dd>
            </dl>
          </dd>

          <dt>effect (string, OPTIONAL)</dt>

          <dd>
            <t>One of "create", "update", "delete", "transfer",
            "communication". Classifies the effect class of the operation;
            used by policy. This field operationalizes the distinction between
            an action and its effect identified by <xref
            target="I-D.wadkins-agentproto-action-determinability"/>.</t>
          </dd>

          <dt>reversible (boolean, OPTIONAL)</dt>

          <dd>
            <t>Whether the operation's effect can be undone by the same
            authority. When false or absent, implementations
            <bcp14>SHOULD</bcp14> treat the operation as irreversible for
            policy purposes.</t>
          </dd>

          <dt>expires (time, OPTIONAL)</dt>

          <dd>
            <t>RFC 3339 timestamp after which the descriptor itself is stale
            and a new confirmation is required (e.g., fare validity).</t>
          </dd>
        </dl>

        <t>Further fields <bcp14>MAY</bcp14> be added by action type
        definitions, as in <xref target="RFC9396"/>. Unknown fields
        <bcp14>MUST</bcp14> be preserved by intermediaries and included in
        digest computations.</t>
      </section>

      <section anchor="sec-rendering" title="Rendering Requirements">
        <t>A conforming renderer (the CS) <bcp14>MUST</bcp14> construct the
        user-visible confirmation from the AD as follows:</t>

        <ul>
          <li>
            <t>Every parameter with confirm=true <bcp14>MUST</bcp14> be
            displayed, with its render.label (or the field name if no label),
            and either its render.value-label or a programmatic formatting of
            value under render.format.</t>
          </li>

          <li>
            <t>The rendering set — the ordered sequence of (field, label,
            rendered value) pairs actually displayed — is the input to the
            rendering digest (<xref target="sec-binding"/>).</t>
          </li>

          <li>
            <t>Rendering <bcp14>MUST</bcp14> occur in a non-LLM programmatic
            component. The AD, its labels, and its values are untrusted
            display input: the renderer <bcp14>MUST</bcp14> treat them as
            data, not markup, and <bcp14>MUST NOT</bcp14> interpret
            formatting, links, or instructions within them. This mirrors the
            consent-screen sanitization requirement noted in <xref
            target="RFC9396"/> Section 2.1 and the rendering requirements of
            <xref target="I-D.rosenberg-agentproto-usecases"/> Section
            3.2.3.</t>
          </li>

          <li>
            <t>The renderer <bcp14>MUST</bcp14> present an explicit accept and
            reject control, and <bcp14>MUST NOT</bcp14> default to
            acceptance.</t>
          </li>
        </ul>
      </section>

      <section anchor="sec-digest" title="Action Digest Computation">
        <t>The action digest binds evidence to the exact action. To
        compute:</t>

        <ol spacing="compact">
          <li>
            <t>Construct the AD as a JSON object. The object
            <bcp14>MUST</bcp14> conform to I-JSON <xref target="RFC7493"/> (no
            duplicate member names, no numbers that lose precision).</t>
          </li>

          <li>
            <t>Canonicalize using the JSON Canonicalization Scheme <xref
            target="RFC8785"/> (JCS).</t>
          </li>

          <li>
            <t>Compute SHA-256 <xref target="FIPS180-4"/> over the canonical
            form. The digest is carried in binary in CBOR and
            base64url-encoded without padding in JSON.</t>
          </li>
        </ol>

        <t>Verifiers <bcp14>MUST</bcp14> recompute this digest over the
        operation they are asked to execute. To make recomputation
        deterministic, the operation-to-AD mapping for each action type
        <bcp14>MUST</bcp14> be defined by the action type's specification (how
        each API request field maps into AD parameters). <xref
        target="sec-api"/> defines how API metadata carries this mapping.</t>
      </section>

      <section anchor="sec-cddl" title="CDDL Definition">
        <t>The CDDL <xref target="RFC8610"/> definition of the action
        descriptor (JSON form):</t>

        <sourcecode type="cddl"> ; See Appendix A for the complete grammar
        aacp-action-descriptor = { type: uri actions: [1* text] ? locations:
        [1* uri] ? parameters: { * text =&gt; aacp-parameter } ? effect:
        aacp-effect ? reversible: bool ? expires: time * $$aacp-ad-extension }
        aacp-parameter = { value: any ? confirm: bool ? render: { ? label:
        text ? value-label: text ? format: text ? sensitive: bool } }
        aacp-effect = "create" / "update" / "delete" / "transfer" /
        "communication" </sourcecode>
      </section>
    </section>

    <section anchor="sec-cr" title="Confirmation Request">
      <t>The Confirmation Request is constructed by the Acting Agent.</t>

      <sourcecode> { "v": 1, "request-id": "&lt;UUIDv4 [RFC9562]&gt;",
      "action-digest": "&lt;base64url(SHA-256(JCS(AD)))&gt;", "challenge":
      "&lt;base64url(16+ random octets)&gt;", "lifetime": 300, "audience":
      "&lt;identifier of the Acting Agent&gt;", "subject": "&lt;identifier of
      the Confirming User, if known&gt;", ? "channel": { "min-loa": 2,
      "modes": ["device-push", "sms"] }, ? "handoff": [ "&lt;digest of signed
      handoff offer&gt;" ], ? "rendering-hint": { ... } } </sourcecode>

      <t>Semantics:</t>

      <dl spacing="compact">
        <dt>request-id</dt>

        <dd>
          <t>Unique identifier for this confirmation request, generated as a
          UUID <xref target="RFC9562"/>. Used for replay tracking (<xref
          target="sec-replay"/>).</t>
        </dd>

        <dt>action-digest</dt>

        <dd>
          <t>The digest defined in <xref target="sec-digest"/>. The CR
          <bcp14>SHOULD</bcp14> also carry the full AD so the CS can render
          without an additional round-trip; the digest is authoritative.</t>
        </dd>

        <dt>challenge</dt>

        <dd>
          <t>AA-generated random value, at least 128 bits. The CS
          <bcp14>MUST</bcp14> include it in the signed evidence. This gives
          the AA a freshness proof it controls: evidence for a stale or
          transplanted challenge is detectable without any shared state
          between AA and CS.</t>
        </dd>

        <dt>lifetime</dt>

        <dd>
          <t>Maximum age, in seconds, of an acceptable confirmation measured
          from confirmed-at.</t>
        </dd>

        <dt>audience</dt>

        <dd>
          <t>The identifier of the Acting Agent for which this evidence is
          valid. Prevents context diversion per <xref
          target="I-D.okutomi-session-bound-agent-identity"/>: evidence issued
          for one delegation must not be usable for another.</t>
        </dd>

        <dt>subject</dt>

        <dd>
          <t>The user whose confirmation is sought, when known to AA. Binding
          of user identifiers is out of scope (<xref target="sec-scope"/>),
          but the field <bcp14>MUST</bcp14> be carried into the evidence when
          present.</t>
        </dd>

        <dt>channel</dt>

        <dd>
          <t>Channel requirements for Variant C: minimum level of assurance
          and acceptable out-of-band modes.</t>
        </dd>

        <dt>handoff</dt>

        <dd>
          <t>Digests referencing the signed handoff offers through which the
          task reached this agent, when the action flows from a delegation
          chain <xref target="I-D.srivastava-agentproto-handoff-context"/>.
          See <xref target="sec-handoff"/>.</t>
        </dd>
      </dl>
    </section>

    <section anchor="sec-ce" title="Confirmation Evidence">
      <section anchor="sec-ce-structure" title="Structure">
        <t>The Confirmation Evidence records the user's decision:</t>

        <sourcecode> { "v": 1, "request-id": "&lt;same as CR&gt;",
        "action-digest": "&lt;same as CR&gt;", "challenge": "&lt;same as
        CR&gt;", "decision": "confirmed" / "denied", "audience": "&lt;same as
        CR&gt;", ? "subject": "&lt;same as CR&gt;", "confirmed-at": "&lt;RFC
        3339 timestamp&gt;", "auth-context": { "method": "&lt;how the user
        authenticated to the CS&gt;", "loa": &lt;integer 0..5&gt;, ? "as":
        "&lt;authorization server identifier, if OAuth-bound&gt;" }, ?
        "rendering-digest": "&lt;digest of rendered confirmation set&gt;", ?
        "handoff": [ "&lt;same as CR&gt;" ], ? "extensions": { ... } }
        </sourcecode>

        <dl spacing="compact">
          <dt>decision</dt>

          <dd>
            <t>"confirmed" or "denied". Both are signed. A denied decision
            <bcp14>MUST</bcp14> produce evidence, not silence: preserving
            negative outcomes is the exercise requirement of <xref
            target="I-D.he-agentproto-verifier-evidence"/> and the
            evaluation-state requirement of <xref
            target="I-D.konda-agentproto-evaluation-state"/>. Absence of
            evidence, in contrast, means no collection was attempted or
            completed, and is reported by the separate status object of <xref
            target="sec-distinct"/>.</t>
          </dd>

          <dt>auth-context</dt>

          <dd>
            <t>How the user authenticated to the CS at confirmation time:
            "method" (e.g., "passkey", "device-unlock", "knowledge-proof",
            "oauth-session"), "loa" (a coarse level of assurance, 0-5, scale
            defined by deployment policy), and optionally "as" (the identity
            of the authorization server when the CS operates as part of an
            OAuth deployment). This carries the authentication-assurance
            notion discussed in <xref
            target="I-D.rosenberg-agentproto-usecases"/> Section 3.2.2.2:
            verifiers can enforce that irreversible actions require, e.g., a
            fresh device authentication rather than a remembered session.</t>
          </dd>

          <dt>rendering-digest</dt>

          <dd>
            <t>SHA-256 over the JCS-canonicalized rendering set actually
            displayed (<xref target="sec-rendering"/>). Binds "what the user
            saw" to the signed record, enabling a verifier to check that the
            fields requiring confirmation were actually exercised (<xref
            target="appendix-traceability"/>, HE-1).</t>
          </dd>
        </dl>
      </section>

      <section anchor="sec-signature" title="Signature and Canonicalization">
        <t>The CE is a JWS <xref target="RFC7515"/> with compact
        serialization:</t>

        <ul>
          <li>
            <t>Payload: the UTF-8 JCS <xref target="RFC8785"/>
            canonicalization of the CE JSON object. JCS canonicalization makes
            the signature deterministic across JSON serializers.</t>
          </li>

          <li>
            <t>Signing algorithms: ES256 or EdDSA (Ed25519) <xref
            target="RFC8032"/> <bcp14>MUST</bcp14> be supported; RS256
            <bcp14>MAY</bcp14> be supported. Algorithms <bcp14>MUST
            NOT</bcp14> be negotiated by the signer; the CS key's registered
            algorithm set is authoritative.</t>
          </li>

          <li>
            <t>The "kid" header parameter identifies the CS key; verifiers
            resolve it through the CS's published key set (e.g., a JWK Set at
            a well-known location, or enterprise key distribution). Key
            discovery is deployment profile; this document requires only that
            a verifier can resolve a CS key to a CS identifier and check its
            freshness.</t>
          </li>

          <li>
            <t>Detached payload (RFC 7515 Appendix F) <bcp14>MAY</bcp14> be
            used when the CE is conveyed alongside the already-known CR.</t>
          </li>
        </ul>

        <t>CBOR mapping: <xref target="appendix-cddl"/> defines the CBOR form;
        signatures in the CBOR profile use COSE_Sign1 <xref target="RFC9052"/>
        with the same payload semantics.</t>

        <t>Key rotation: a CS <bcp14>MUST</bcp14> overlap old and new keys for
        at least the maximum evidence lifetime it issues; verifiers
        <bcp14>MUST</bcp14> accept keys valid at confirmed-at time, not only
        at verification time, to preserve post-session verifiability (the
        <xref target="I-D.wadkins-agentproto-action-determinability"/>
        requirement).</t>
      </section>

      <section anchor="sec-auth-context" title="Authentication Context">
        <t>The auth-context is an honest report by the CS of how the user
        authenticated when the decision was collected. It is not a proof of
        authentication; it is a claim by the CS, covered by the CS signature.
        Verifiers apply policy to it:</t>

        <ul>
          <li>
            <t>An operation classified irreversible by policy
            <bcp14>SHOULD</bcp14> require a fresh method (device
            authentication, passkey with user verification) rather than a
            carried session.</t>
          </li>

          <li>
            <t>A verifier <bcp14>MUST NOT</bcp14> infer more assurance than
            the auth-context states: a "knowledge-proof" method with loa 1
            records exactly that, and policy for high-value actions may reject
            it. This mirrors the verifier-side acceptance discipline of <xref
            target="I-D.okutomi-session-bound-agent-identity"/>: what is
            accepted is what was actually verified, no more.</t>
          </li>
        </ul>
      </section>

      <section anchor="sec-binding" title="Binding Rules">
        <t>A CE is bound to:</t>

        <ol spacing="compact">
          <li>
            <t>The action, by action-digest. A verifier recomputes the digest
            over the operation at hand (<xref
            target="sec-verification-steps"/>, step 3). Mismatch invalidates
            the evidence for that operation. This prevents confirmation
            swapping: evidence for booking flight X cannot be replayed against
            booking flight Y even if all other fields agree.</t>
          </li>

          <li>
            <t>The requesting session, by challenge. The AA generates the
            challenge; only a CS that processed this CR signs a CE with this
            challenge. The AA therefore knows the evidence was produced for
            its current request, not retrieved from storage.</t>
          </li>

          <li>
            <t>The acting agent, by audience. In delegated flows, evidence
            names its consumer; other agents cannot use it.</t>
          </li>

          <li>
            <t>The rendering, by rendering-digest, when present.</t>
          </li>

          <li>
            <t>The delegation path, by handoff digests, when present (<xref
            target="sec-handoff"/>).</t>
          </li>
        </ol>

        <t>The dependency-closure discipline of <xref
        target="I-D.bu-agentproto-security-principal-binding"/> applies: a
        composed verification result is no stronger than its weakest verified
        input. A CE with an unresolvable key, an unknown method, or an
        unverifiable digest yields an unverifiable row outcome, not a failure
        elsewhere to be papered over by an otherwise-valid signature.</t>
      </section>

      <section anchor="sec-lifetime" title="Lifetime and Freshness">
        <t>Evidence is current when verified within "lifetime" seconds of
        confirmed-at. Verifiers <bcp14>MAY</bcp14> additionally bound the age
        of the whole chain (CR construction to verification) per local
        policy.</t>

        <t>Freshness is anchored at the AA's challenge, not at CS clocks: the
        AA does not need to trust CS time, only its own clock and its own
        randomness. CS clock skew affects only the lifetime computation, for
        which a conservative verifier margin is
        <bcp14>RECOMMENDED</bcp14>.</t>
      </section>
    </section>

    <section anchor="sec-verification" title="Verification Procedure">
      <section anchor="sec-verification-steps" title="Verification Steps">
        <t>A verifier (API gateway, enforcement point at AA, or later auditor)
        processes a presented CE as follows. Steps are ordered; each produces
        a row outcome (<xref target="sec-outcomes"/>).</t>

        <ol spacing="compact">
          <li>
            <t>Presence. If the operation requires confirmation (per <xref
            target="sec-api"/> metadata) and no CE is presented, outcome is
            "absent".</t>
          </li>

          <li>
            <t>Signature. Validate the JWS against a resolvable CS key.
            Invalid signature or unresolvable key: outcome "invalid" or
            "unverifiable" respectively.</t>
          </li>

          <li>
            <t>Action digest. Recompute the digest over the operation being
            executed, using the operation-to-AD mapping from the action type
            specification. Compare with CE action-digest. Mismatch: outcome
            "mismatched".</t>
          </li>

          <li>
            <t>Audience. The CE audience <bcp14>MUST</bcp14> equal the
            verifier's agent identity (for AA) or the accepting party's
            identity. Mismatch: "diverted".</t>
          </li>

          <li>
            <t>Decision. decision <bcp14>MUST</bcp14> be "confirmed".
            "denied": outcome "denied".</t>
          </li>

          <li>
            <t>Freshness. Challenge <bcp14>MUST</bcp14> equal the challenge
            the verifier issued (if the verifier is the AA); confirmed-at plus
            lifetime <bcp14>MUST</bcp14> not be in the past; request-id
            <bcp14>MUST NOT</bcp14> have been seen (<xref
            target="sec-replay"/>). Violations: "stale" or "replay".</t>
          </li>

          <li>
            <t>Policy. auth-context <bcp14>MUST</bcp14> satisfy the verifier's
            policy for the effect class (<xref target="sec-auth-context"/>).
            Violation: "insufficient-assurance".</t>
          </li>

          <li>
            <t>Exercise (optional, <bcp14>RECOMMENDED</bcp14> for irreversible
            actions). If the action type specification defines the required
            rendering set, recompute the rendering digest and compare with CE
            rendering-digest. Absent rendering-digest: the verifier cannot
            establish that the user saw the required fields; outcome
            "unexercised" if policy requires it.</t>
          </li>
        </ol>

        <t>All outcomes other than full success are terminal for the presented
        CE. The verifier <bcp14>MUST NOT</bcp14> partially accept.</t>
      </section>

      <section anchor="sec-outcomes" title="Outcome Matrix and Error Codes">
        <t>Each row outcome maps to a distinct error signal. This
        distinct-outcome model is the protocol-level realization of the
        requirements in <xref target="I-D.konda-agentproto-evaluation-state"/>
        and CMN-12 of <xref target="I-D.agentic-ai-usecases-requirements"/>: a
        verifier must be able to determine whether a check failed or could not
        be completed, and the two cases must produce different signals.</t>

        <table anchor="tab-outcomes">
          <thead>
            <tr>
              <th>Row outcome</th>

              <th>HTTP API error</th>

              <th>Retry semantics</th>
            </tr>
          </thead>

          <tbody>
            <tr>
              <td>absent</td>

              <td>confirmation_required</td>

              <td>Obtain a confirmation</td>
            </tr>

            <tr>
              <td>invalid</td>

              <td>confirmation_invalid</td>

              <td>Do not retry unchanged; alert</td>
            </tr>

            <tr>
              <td>unverifiable</td>

              <td>confirmation_unavailable</td>

              <td>Retry after key or CS recovery</td>
            </tr>

            <tr>
              <td>mismatched</td>

              <td>confirmation_mismatch</td>

              <td>Regenerate: the action differs</td>
            </tr>

            <tr>
              <td>diverted</td>

              <td>confirmation_diverted</td>

              <td>Evidence not issued for this verifier</td>
            </tr>

            <tr>
              <td>denied</td>

              <td>confirmation_denied</td>

              <td>Only user-initiated retry</td>
            </tr>

            <tr>
              <td>stale</td>

              <td>confirmation_stale</td>

              <td>Re-request</td>
            </tr>

            <tr>
              <td>replay</td>

              <td>confirmation_replay</td>

              <td>Investigate; do not auto-retry</td>
            </tr>

            <tr>
              <td>insufficient-assurance</td>

              <td>confirmation_low_assurance</td>

              <td>Re-authenticate at higher LoA</td>
            </tr>

            <tr>
              <td>unexercised</td>

              <td>confirmation_unexercised</td>

              <td>Re-render with required fields</td>
            </tr>

            <tr>
              <td>success</td>

              <td>(accepted)</td>

              <td>Execute</td>
            </tr>
          </tbody>
        </table>

        <t>Conflating these outcomes — for example, reporting "denied" for
        "unobtainable", or "invalid" for "stale" — is a protocol violation.
        Retry storms, alert misrouting, and audit ambiguity are precisely the
        costs that motivated the evaluation-state requirements; the error
        taxonomy exists to prevent them.</t>
      </section>

      <section anchor="sec-replay" title="Replay Prevention">
        <t>Replay state is keyed by request-id. The verifying party (AA or
        API) <bcp14>MUST</bcp14> retain request-ids of accepted CEs for at
        least the CR lifetime plus a margin. Because request-id is carried
        inside the signed payload, an attacker cannot mint a fresh id for an
        old decision without the CS key.</t>

        <t>Challenge gives AA-side freshness without shared state: for the AA
        verifier, step 6's challenge check subsumes replay checking for
        cross-session transplants; request-id state additionally catches
        same-session replay.</t>
      </section>
    </section>

    <section anchor="sec-multi-agent" title="Multi-Agent Confirmation">
      <section anchor="sec-delegated" title="Delegated Flow">
        <t>In Variant B, the acting agent AA cannot reach the user; the
        requesting agent RA holds the user dialog. The flow of <xref
        target="sec-flows"/> applies. Security properties:</t>

        <ul>
          <li>
            <t>RA cannot fabricate evidence (no CS key).</t>
          </li>

          <li>
            <t>RA cannot alter the action: the AD digest is fixed by AA before
            RA ever sees the request; alteration is detected by the CS (which
            renders the AD it received and signs the digest) and by AA at
            verification.</t>
          </li>

          <li>
            <t>RA cannot replay evidence: AA's challenge is fresh per
            request.</t>
          </li>

          <li>
            <t>RA cannot redirect evidence: audience binding names AA.</t>
          </li>

          <li>
            <t>RA cannot suppress a denial undetectably: a denial is signed
            evidence; if RA returns nothing, AA sees "absent", which is
            distinct from "denied" (<xref target="sec-distinct"/>). RA can,
            however, drop the interaction entirely; the denial-signal property
            holds only for interactions that complete. This residual risk is
            noted in <xref target="sec-security"/>.</t>
          </li>
        </ul>
      </section>

      <section anchor="sec-handoff" title="Handoff Chain Binding">
        <t>When the task reached AA through a signed handoff chain <xref
        target="I-D.srivastava-agentproto-handoff-context"/>, the CR and CE
        carry the digest(s) of the handoff offer chain. This binds the
        confirmation to the delegation path, not merely to the final
        operation: a CE names the chain of delegated authority under which the
        action will execute. Verifiers with delegation policy (e.g., "this
        action may only execute under a delegation chain rooted at enterprise
        X") check the chain digest against their policy. The chain itself is
        carried by the handoff protocol, not by AACP; AACP references it only
        by digest, keeping this document's formats opaque to the transparency
        or logging service behind the chain — the same opacity discipline as
        <xref target="I-D.srivastava-agentproto-handoff-context"/>, whose
        prior context is named by digest only.</t>
      </section>

      <section anchor="sec-distinct"
               title="Denied, Unobtainable, and Stale Are Different Facts">
        <t>AACP distinguishes:</t>

        <ul>
          <li>
            <t>denied: the user decided against the action. Signed evidence
            exists with decision "denied". This is a first-class fact; agents
            <bcp14>SHOULD</bcp14> record it and <bcp14>MUST NOT</bcp14>
            silently retry.</t>
          </li>

          <li>
            <t>unobtainable: the confirmation could not be collected (user
            unreachable on all channels, CS failure, dialog lifetime expired
            before collection). Reported by the CS as an unsigned status
            object:</t>

            <sourcecode> { "request-id": "...", "outcome": "unobtainable",
            "reason": "channel-unreachable" / "dialog-expired" / "cs-error" /
            "user-unreachable", "reported-at": "..." } </sourcecode>

            <t>An unsigned status is deliberately weaker than evidence: it is
            a report, not a decision. It maps to the
            "confirmation_unavailable" error and to retry-after-recovery
            semantics. This separation is exactly the konda requirement:
            collapsing "denied" and "could not be asked" into one value
            corrupts retry behavior and audit interpretation.</t>
          </li>

          <li>
            <t>stale: the user confirmed, but the evidence aged out before
            execution. Maps to "confirmation_stale"; re-request is
            appropriate. The dialog-interruption semantics of CC3-4 in <xref
            target="I-D.howe-agentproto-contact-center-usecases"/>
            (distinguish an interrupted dialog from a terminated one) are
            preserved here: an interrupted confirmation flow yields
            "unobtainable" with reason "dialog-expired", not a denial.</t>
          </li>
        </ul>
      </section>
    </section>

    <section anchor="sec-api" title="API Integration">
      <t>APIs declare which operations require confirmation, and how their
      request fields map to confirmable parameters, through metadata. For
      OpenAPI-described APIs, this document defines the "x-aacp" extension
      object:</t>

      <sourcecode type="json"> "x-aacp": { "type":
      "https://api.airlines.example.com/actions/flight_booking", "actions":
      ["book"], "confirm-parameters": ["flight_number", "fare_class",
      "total_price"], "render": { "flight_number": { "label": "Flight" },
      "fare_class": { "label": "Cabin", "value-map": { "economy": "Economy",
      "business": "Business" } }, "total_price": { "label": "Total price",
      "format": "currency" } } } </sourcecode>

      <t>The extension carries: the action type (URI), the action verbs, the
      list of request parameters that <bcp14>MUST</bcp14> be confirmed, and
      rendering metadata per parameter. This is the API annotation machinery
      required by <xref target="I-D.rosenberg-agentproto-usecases"/> Section
      3.2.3: the API owner — the only party able to judge the risk of the
      operation — decides what requires confirmation and how it is
      presented.</t>

      <t>Enforcement: an API whose metadata declares confirmation for an
      operation <bcp14>MUST</bcp14> reject the operation with
      "confirmation_required" when no valid CE accompanies it. The API is the
      last-line verifier; agent-side enforcement alone <bcp14>MUST NOT</bcp14>
      be relied upon (an agent may be compromised or hallucinating — which is
      the threat this protocol exists to contain).</t>

      <t>The API <bcp14>SHOULD</bcp14> also define its operation-to-AD mapping
      (which request fields become which AD parameters, and their canonical
      serialization) so that verifiers can recompute the action digest
      deterministically. For REST APIs, the default mapping is: one AD per API
      request; parameters map from request body fields by name; locations maps
      from the endpoint URI.</t>
    </section>

    <section anchor="sec-security" title="Security Considerations">
      <section anchor="sec-threats" title="Threat Model">
        <t>The protocol defends against:</t>

        <dl spacing="compact">
          <dt>Fabricated confirmation</dt>

          <dd>
            <t>An intermediate or acting agent claims user approval it never
            obtained. Defeated by the CS signature: fabrication requires the
            CS key. Residual: CS compromise (<xref target="sec-keys"/>).</t>
          </dd>

          <dt>Confirmation swapping</dt>

          <dd>
            <t>Real evidence for action A is applied to action B. Defeated by
            the action digest; the verifier recomputes over the operation at
            hand.</t>
          </dd>

          <dt>Replay</dt>

          <dd>
            <t>Old evidence is re-presented. Defeated by challenge (AA-side
            freshness), request-id tracking, and lifetime.</t>
          </dd>

          <dt>Diversion</dt>

          <dd>
            <t>Evidence issued for one delegation is used for another.
            Defeated by audience binding.</t>
          </dd>

          <dt>Downgrade / silent skip</dt>

          <dd>
            <t>An agent bypasses confirmation for a confirmation-required
            operation. Defeated by API-side enforcement with fail-closed
            behavior.</t>
          </dd>

          <dt>Rendering attacks</dt>

          <dd>
            <t>Malicious content in AD labels or values attacks the
            confirmation UI (homoglyphs, crafted formatting, injection into
            mark-up-capable renderers). Mitigated by the data-not-markup
            rendering rule (<xref target="sec-rendering"/>), consistent with
            the consent-sanitization guidance in <xref target="RFC9396"/>.
            Renderers <bcp14>MUST</bcp14> escape or reject non-conforming
            content; homoglyph attacks on labels are mitigated by recommending
            ASCII labels where practical and by value-label pre-formatting for
            critical fields.</t>
          </dd>

          <dt>Prompt injection</dt>

          <dd>
            <t>Injected instructions can still cause an agent to CONSTRUCT an
            undesirable action descriptor; AACP does not prevent this. What
            AACP guarantees is that the constructed action, whatever it is, is
            shown to the user for an explicit, non-LLM decision before
            irreversible execution. This bounds prompt-injection blast radius
            to actions the user can see and reject. This addresses the
            containment aspect (not the detection aspect) of the
            prompt-injection discussion in <xref
            target="I-D.rosenberg-agentproto-usecases"/> Section 3.3.7.</t>
          </dd>
        </dl>
      </section>

      <section anchor="sec-residual" title="Residual Risks">
        <dl spacing="compact">
          <dt>RA interaction dropping</dt>

          <dd>
            <t>In Variant B, RA can refuse to relay the CR or the CE. AA sees
            "absent"/timeout and must not execute. The user is not informed of
            the dropped interaction by AACP itself; surfacing it is the
            surrounding dialog protocol's responsibility.</t>
          </dd>

          <dt>CS compromise</dt>

          <dd>
            <t>A compromised CS can sign fabricated confirmations for any
            action it is asked to confirm. Mitigations: CS keys
            <bcp14>SHOULD</bcp14> be held in hardware or isolated confirmation
            UIs; deployment profiles <bcp14>SHOULD</bcp14> scope CS acceptance
            (verifiers accept only CSes they have policy reasons to trust);
            the auth-context records the method, so fabricated "passkey"
            claims require attacking that infrastructure too. CS compromise is
            a catastrophic failure mode and is not further mitigated by this
            protocol.</t>
          </dd>

          <dt>User rubber-stamping</dt>

          <dd>
            <t>Confirmation fatigue leads users to approve without reading. A
            protocol cannot fix this; rendering requirements (explicit
            controls, no defaults) are the available mitigation. Action type
            specifications <bcp14>SHOULD</bcp14> minimize the confirmable
            parameter set to what matters.</t>
          </dd>

          <dt>Time shifting</dt>

          <dd>
            <t>CS clock skew can extend or shorten effective evidence lifetime
            by the skew amount. Verifier margins are
            <bcp14>RECOMMENDED</bcp14>.</t>
          </dd>
        </dl>
      </section>

      <section anchor="sec-agility" title="Algorithm Agility">
        <t>This document fixes the digest (SHA-256) and requires ES256 or
        EdDSA signatures. New algorithms enter through a CS key registration
        update, not through protocol negotiation; signers <bcp14>MUST
        NOT</bcp14> offer downgrade choices. If SHA-256 requires replacement
        in the future, the version field "v" governs a revised digest profile;
        verifiers <bcp14>MUST</bcp14> reject unknown versions.</t>
      </section>

      <section anchor="sec-keys" title="Key Management">
        <t>CS keys <bcp14>MUST</bcp14> rotate with overlap exceeding the
        maximum evidence lifetime (<xref target="sec-signature"/>). Verifiers
        <bcp14>MUST</bcp14> retain retired keys (or a transparency record of
        them) at least as long as they must verify past evidence — the
        post-session determinability requirement of <xref
        target="I-D.wadkins-agentproto-action-determinability"/>. Long-horizon
        verifiers (auditors) <bcp14>SHOULD</bcp14> anchor key history in an
        append-only record, e.g., a SCITT-style transparency service <xref
        target="I-D.ietf-scitt-architecture"/>.</t>
      </section>
    </section>

    <section anchor="sec-privacy" title="Privacy Considerations">
      <t>Confirmation evidence records that a specific user (subject) approved
      a specific action (descriptor digest) at a time. This is intentionally
      disclosure-capable information. Considerations:</t>

      <ul>
        <li>
          <t>The CE carries digests, not the descriptor itself. Third parties
          cannot learn action parameters from a CE without the corresponding
          AD. Entities that held both (the AA, the CS) already knew the
          parameters.</t>
        </li>

        <li>
          <t>Parameters marked render.sensitive=true <bcp14>SHOULD</bcp14> be
          masked in logs and <bcp14>SHOULD NOT</bcp14> be included in the
          rendering set stored alongside evidence (the rendering digest
          commits to them without retaining them).</t>
        </li>

        <li>
          <t>The auth-context describes method and assurance level, not
          credentials; it carries no secrets.</t>
        </li>

        <li>
          <t>Variant C side-channel delivery necessarily reveals the
          confirmation's existence and its label to the side-channel provider;
          CR construction <bcp14>SHOULD</bcp14> minimize descriptor content on
          such channels.</t>
        </li>

        <li>
          <t>Data minimization: verifiers <bcp14>SHOULD</bcp14> discard
          evidence after their verification horizon unless retention is
          required for the action's accountability period; retention policy is
          deployment-scoped.</t>
        </li>
      </ul>
    </section>

    <section anchor="sec-iana" title="IANA Considerations">
      <section anchor="sec-media-types" title="Media Types">
        <t>This document requests registration of:</t>

        <dl spacing="compact">
          <dt>application/aacp-confirmation-request+json</dt>

          <dd>
            <t>Structure: <xref target="sec-cr"/>; encoding: UTF-8 JSON.</t>
          </dd>

          <dt>application/aacp-confirmation-evidence+json</dt>

          <dd>
            <t>Structure: <xref target="sec-ce"/>; encoding: UTF-8 JSON; a JWS
            (RFC 7515) compact serialization whose payload is the
            JCS-canonicalized CE object.</t>
          </dd>

          <dt>application/aacp-confirmation-status+json</dt>

          <dd>
            <t>Structure: <xref target="sec-distinct"/>; encoding: UTF-8
            JSON.</t>
          </dd>
        </dl>

        <t>A CBOR media type (application/aacp+cbor) is requested for the CBOR
        profile of <xref target="appendix-cddl"/>, content-format TBD.</t>
      </section>

      <section anchor="sec-outcome-registry"
               title="Confirmation Outcome Values Registry">
        <t>IANA is asked to create a registry "AACP Row Outcomes" with the
        values of <xref target="sec-outcomes"/> (absent, invalid,
        unverifiable, mismatched, diverted, denied, stale, replay,
        insufficient-assurance, unexercised, success). New values require
        Specification Required <xref target="RFC8126"/>.</t>
      </section>

      <section anchor="sec-error-registry" title="Error Code Allocation">
        <t>The HTTP API error codes of <xref target="sec-outcomes"/>
        (confirmation_required, confirmation_invalid, ...) are registered in a
        subregistry with the same policy. Profiles that map outcomes to
        transport-specific errors <bcp14>MUST</bcp14> preserve their
        distinctness.</t>
      </section>
    </section>
  </middle>

  <back>
    <references>
      <name>References</name>

      <references>
        <name>Normative References</name>

        <reference anchor="RFC2119"
                   target="https://www.rfc-editor.org/info/rfc2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement
            Levels</title>

            <author initials="S." surname="Bradner"/>

            <date month="March" year="1997"/>
          </front>

          <seriesInfo name="BCP" value="14"/>

          <seriesInfo name="RFC" value="2119"/>
        </reference>

        <reference anchor="RFC8174"
                   target="https://www.rfc-editor.org/info/rfc8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key
            Words</title>

            <author initials="B." surname="Leiba"/>

            <date month="May" year="2017"/>
          </front>

          <seriesInfo name="BCP" value="14"/>

          <seriesInfo name="RFC" value="8174"/>
        </reference>

        <reference anchor="RFC7493"
                   target="https://www.rfc-editor.org/info/rfc7493">
          <front>
            <title>The I-JSON Message Format</title>

            <author initials="T." role="editor" surname="Bray"/>

            <date month="March" year="2015"/>
          </front>

          <seriesInfo name="RFC" value="7493"/>
        </reference>

        <reference anchor="RFC8259"
                   target="https://www.rfc-editor.org/info/rfc8259">
          <front>
            <title>The JavaScript Object Notation (JSON) Data Interchange
            Format</title>

            <author initials="T." role="editor" surname="Bray"/>

            <date month="December" year="2017"/>
          </front>

          <seriesInfo name="RFC" value="8259"/>
        </reference>

        <reference anchor="RFC8785"
                   target="https://www.rfc-editor.org/info/rfc8785">
          <front>
            <title>JSON Canonicalization Scheme (JCS)</title>

            <author initials="A." surname="Rundgren"/>

            <author initials="S." surname="Weber"/>

            <author initials="D." surname="Johansson"/>

            <date month="June" year="2020"/>
          </front>

          <seriesInfo name="RFC" value="8785"/>
        </reference>

        <reference anchor="RFC8610"
                   target="https://www.rfc-editor.org/info/rfc8610">
          <front>
            <title>Concise Data Definition Language (CDDL): A Notational
            Language to Express CBOR and JSON Data Structures</title>

            <author initials="H." surname="Birkholz"/>

            <author initials="C." surname="Vigano"/>

            <author initials="C." surname="Bormann"/>

            <date month="June" year="2019"/>
          </front>

          <seriesInfo name="RFC" value="8610"/>
        </reference>

        <reference anchor="RFC8949"
                   target="https://www.rfc-editor.org/info/rfc8949">
          <front>
            <title>Concise Binary Object Representation (CBOR)</title>

            <author initials="C." surname="Bormann"/>

            <author initials="P." surname="Hoffman"/>

            <date month="December" year="2020"/>
          </front>

          <seriesInfo name="STD" value="94"/>

          <seriesInfo name="RFC" value="8949"/>
        </reference>

        <reference anchor="RFC7515"
                   target="https://www.rfc-editor.org/info/rfc7515">
          <front>
            <title>JSON Web Signature (JWS)</title>

            <author initials="M." surname="Jones"/>

            <author initials="J." surname="Bradley"/>

            <author initials="N." surname="Sakimura"/>

            <date month="May" year="2015"/>
          </front>

          <seriesInfo name="RFC" value="7515"/>
        </reference>

        <reference anchor="RFC9052"
                   target="https://www.rfc-editor.org/info/rfc9052">
          <front>
            <title>CBOR Object Signing and Encryption (COSE): Structures and
            Process</title>

            <author initials="J." surname="Schaad"/>

            <date month="August" year="2022"/>
          </front>

          <seriesInfo name="STD" value="96"/>

          <seriesInfo name="RFC" value="9052"/>
        </reference>

        <reference anchor="RFC9396"
                   target="https://www.rfc-editor.org/info/rfc9396">
          <front>
            <title>OAuth 2.0 Rich Authorization Requests</title>

            <author initials="T." surname="Lodderstedt"/>

            <author initials="J." surname="Richer"/>

            <author initials="B." surname="Campbell"/>

            <date month="May" year="2023"/>
          </front>

          <seriesInfo name="RFC" value="9396"/>
        </reference>

        <reference anchor="RFC9562"
                   target="https://www.rfc-editor.org/info/rfc9562">
          <front>
            <title>Universally Unique IDentifiers (UUIDs)</title>

            <author initials="K." surname="Davis"/>

            <author initials="B." surname="Peabody"/>

            <author initials="P." surname="Leach"/>

            <date month="May" year="2024"/>
          </front>

          <seriesInfo name="RFC" value="9562"/>
        </reference>

        <reference anchor="RFC3339"
                   target="https://www.rfc-editor.org/info/rfc3339">
          <front>
            <title>Date and Time on the Internet: Timestamps</title>

            <author initials="G." surname="Klyne"/>

            <author initials="C." surname="Newman"/>

            <date month="July" year="2002"/>
          </front>

          <seriesInfo name="RFC" value="3339"/>
        </reference>

        <reference anchor="FIPS180-4">
          <front>
            <title>Secure Hash Standard</title>

            <author>
              <organization>NIST</organization>
            </author>

            <date month="August" year="2015"/>
          </front>

          <seriesInfo name="FIPS PUB" value="180-4"/>
        </reference>

        <reference anchor="RFC8032"
                   target="https://www.rfc-editor.org/info/rfc8032">
          <front>
            <title>Edwards-Curve Digital Signature Algorithm (EdDSA)</title>

            <author initials="S." surname="Josefsson"/>

            <author initials="I." surname="Liusvaara"/>

            <date month="January" year="2017"/>
          </front>

          <seriesInfo name="RFC" value="8032"/>
        </reference>
      </references>

      <references>
        <name>Informative References</name>

        <reference anchor="I-D.rosenberg-agentproto-usecases">
          <front>
            <title>Framework, Use Cases and Requirements for AI Agent
            Protocols</title>

            <author initials="J." surname="Rosenberg"/>

            <author initials="C." surname="Jennings"/>

            <date day="4" month="July" year="2026"/>
          </front>

          <seriesInfo name="Internet-Draft"
                      value="draft-rosenberg-agentproto-usecases-00"/>

          <annotation>Work in Progress.</annotation>
        </reference>

        <reference anchor="I-D.bu-agentproto-security-principal-binding">
          <front>
            <title>Security Principal and Verifier Binding for Agent
            Communication Protocols</title>

            <author initials="S." surname="Bu"/>

            <date day="13" month="October" year="2026"/>
          </front>

          <seriesInfo name="Internet-Draft"
                      value="draft-bu-agentproto-security-principal-binding-08"/>

          <annotation>Work in Progress.</annotation>
        </reference>

        <reference anchor="I-D.he-agentproto-verifier-evidence">
          <front>
            <title>Exercise and Completeness Evidence for Agent Protocol
            Verifier Results</title>

            <author initials="J. S." surname="He"/>

            <date day="18" month="October" year="2026"/>
          </front>

          <seriesInfo name="Internet-Draft"
                      value="draft-he-agentproto-verifier-evidence-01"/>

          <annotation>Work in Progress.</annotation>
        </reference>

        <reference anchor="I-D.konda-agentproto-evaluation-state">
          <front>
            <title>Preserving Evaluation State in Agent Protocol
            Decisions</title>

            <author initials="G." surname="Konda"/>

            <date day="19" month="October" year="2026"/>
          </front>

          <seriesInfo name="Internet-Draft"
                      value="draft-konda-agentproto-evaluation-state-02"/>

          <annotation>Work in Progress.</annotation>
        </reference>

        <reference anchor="I-D.wadkins-agentproto-action-determinability">
          <front>
            <title>Determinability of Agent Actions</title>

            <author initials="D." surname="Wadkins"/>

            <date day="10" month="September" year="2026"/>
          </front>

          <seriesInfo name="Internet-Draft"
                      value="draft-wadkins-agentproto-action-determinability-00"/>

          <annotation>Work in Progress.</annotation>
        </reference>

        <reference anchor="I-D.okutomi-session-bound-agent-identity">
          <front>
            <title>A Verifier-Side Acceptance Profile for Channel-Bound Agent
            Identity and Authorization</title>

            <author initials="A." surname="Okutomi"/>

            <date day="30" month="July" year="2026"/>
          </front>

          <seriesInfo name="Internet-Draft"
                      value="draft-okutomi-session-bound-agent-identity-06"/>

          <annotation>Work in Progress.</annotation>
        </reference>

        <reference anchor="I-D.agentic-ai-usecases-requirements">
          <front>
            <title>Agentic AI Use Cases and Requirements</title>

            <author initials="T." surname="Reddy"/>

            <author initials="Z." surname="Sarker"/>

            <author initials="K." surname="Yao"/>

            <date day="27" month="October" year="2026"/>
          </front>

          <seriesInfo name="Internet-Draft"
                      value="draft-agentic-ai-usecases-requirements-05"/>

          <annotation>Work in Progress.</annotation>
        </reference>

        <reference anchor="I-D.srivastava-agentproto-handoff-context">
          <front>
            <title>Signed Handoff Context for Agentic Dialogs</title>

            <author initials="K." surname="Srivastava"/>

            <date day="26" month="October" year="2026"/>
          </front>

          <seriesInfo name="Internet-Draft"
                      value="draft-srivastava-agentproto-handoff-context-00"/>

          <annotation>Work in Progress.</annotation>
        </reference>

        <reference anchor="I-D.feng-agentproto-session-requirements">
          <front>
            <title>Requirements for Agent Session Establishment, Capability
            Negotiation, and Sessionless Interaction</title>

            <author initials="C." surname="Feng"/>

            <date day="20" month="August" year="2026"/>
          </front>

          <seriesInfo name="Internet-Draft"
                      value="draft-feng-agentproto-session-requirements-02"/>

          <annotation>Work in Progress.</annotation>
        </reference>

        <reference anchor="I-D.howe-agentproto-contact-center-usecases">
          <front>
            <title>Contact Center Use Cases and Requirements for Agentic
            Dialogs</title>

            <author initials="T." surname="Howe"/>

            <date day="25" month="October" year="2026"/>
          </front>

          <seriesInfo name="Internet-Draft"
                      value="draft-howe-agentproto-contact-center-usecases-00"/>

          <annotation>Work in Progress.</annotation>
        </reference>

        <reference anchor="I-D.ietf-scitt-architecture"
                   target="https://datatracker.ietf.org/doc/draft-ietf-scitt-architecture/">
          <front>
            <title>An Architecture for Trust Services with Strict Data
            Integrity</title>

            <author initials="H." surname="Birkholz"/>
          </front>

          <seriesInfo name="Internet-Draft"
                      value="draft-ietf-scitt-architecture"/>

          <annotation>Work in Progress.</annotation>
        </reference>

        <reference anchor="I-D.rosenberg-aiproto-cheq"
                   target="https://datatracker.ietf.org/doc/draft-rosenberg-aiproto-cheq/">
          <front>
            <title>Confirmation with Human in the Loop (HITL) Exchange of
            Quotations (CHEQ)</title>

            <author initials="J." surname="Rosenberg"/>

            <author initials="P." surname="White"/>

            <author initials="C." surname="Jennings"/>

            <date day="19" month="October" year="2025"/>
          </front>

          <seriesInfo name="Internet-Draft"
                      value="draft-rosenberg-aiproto-cheq-00"/>

          <annotation>Work in Progress. Expired April 2026.</annotation>
        </reference>

        <reference anchor="I-D.liu-agent-operation-authorization"
                   target="https://datatracker.ietf.org/doc/draft-liu-agent-operation-authorization/">
          <front>
            <title>Agent Operation Authorization</title>

            <author initials="D." surname="Liu"/>

            <author initials="J." surname="Zhu"/>

            <author initials="S." surname="Krishnan"/>

            <date day="15" month="March" year="2026"/>
          </front>

          <seriesInfo name="Internet-Draft"
                      value="draft-liu-agent-operation-authorization-02"/>

          <annotation>Work in Progress. Expired September 2026.</annotation>
        </reference>

        <reference anchor="I-D.emerson-oauth-user-mediated-delivery"
                   target="https://datatracker.ietf.org/doc/draft-emerson-oauth-user-mediated-delivery/">
          <front>
            <title>User-Mediated Credential Delivery as a Complementary
            Authorization Primitive for AI Agents</title>

            <author initials="C." surname="Emerson"/>

            <date day="26" month="October" year="2026"/>
          </front>

          <seriesInfo name="Internet-Draft"
                      value="draft-emerson-oauth-user-mediated-delivery-01"/>

          <annotation>Work in Progress.</annotation>
        </reference>

        <reference anchor="CHARTER"
                   target="https://datatracker.ietf.org/wg/agentproto/charter/">
          <front>
            <title>Agent Communication Protocols (agentproto) Charter</title>

            <author>
              <organization>IETF</organization>
            </author>

            <date day="8" month="October" year="2026"/>
          </front>

          <annotation>Approved 8 October 2026.</annotation>
        </reference>

        <reference anchor="CIBA"
                   target="https://openid.net/specs/openid-connect-client-initiated-backchannel-authentication-core-1_0.html">
          <front>
            <title>OpenID Connect Client Initiated Backchannel Authentication
            Flow - Core 1.0</title>

            <author>
              <organization>OpenID Foundation</organization>
            </author>
          </front>
        </reference>

        <reference anchor="WebAuthn"
                   target="https://www.w3.org/TR/webauthn-2/">
          <front>
            <title>Web Authentication: An API for accessing Public Key
            Credentials, Level 2</title>

            <author>
              <organization>World Wide Web Consortium</organization>
            </author>
          </front>

          <annotation>W3C Recommendation.</annotation>
        </reference>

        <reference anchor="RFC8126"
                   target="https://www.rfc-editor.org/info/rfc8126">
          <front>
            <title>Guidelines for Writing an IANA Considerations Section in
            RFCs</title>

            <author initials="M." surname="Cotton"/>

            <author initials="B." surname="Leiba"/>

            <author initials="T." surname="Narten"/>

            <date month="June" year="2017"/>
          </front>

          <seriesInfo name="BCP" value="26"/>

          <seriesInfo name="RFC" value="8126"/>
        </reference>
      </references>
    </references>

    <section anchor="appendix-cddl" title="Complete CDDL Definition">
      <t>The complete CDDL grammar for the three objects, in their CBOR forms
      (the JSON forms differ only in encoding of binary values and map key
      types; the JSON form uses base64url without padding and string
      keys):</t>

      <sourcecode type="cddl"> start = aacp-confirmation-request /
      aacp-confirmation-evidence / aacp-confirmation-status
      aacp-action-descriptor = { type: uri actions: [1* text] ? locations: [1*
      uri] ? parameters: { * text =&gt; aacp-parameter } ? effect: aacp-effect
      ? reversible: bool ? expires: time * $$aacp-ad-extension }
      aacp-parameter = { value: any ? confirm: bool ? render: { ? label: text
      ? value-label: text ? format: text ? sensitive: bool } } aacp-effect =
      "create" / "update" / "delete" / "transfer" / "communication"
      aacp-confirmation-request = { v: 1 request-id: uuid-type action-digest:
      digest challenge: bstr .size 16 lifetime: uint audience: text ? subject:
      text ? channel: { ? min-loa: uint .le 5 ? modes: [1* text] } ? handoff:
      [1* digest] * $$aacp-cr-extension } aacp-confirmation-evidence = { v: 1
      request-id: uuid-type action-digest: digest challenge: bstr .size 16
      decision: "confirmed" / "denied" audience: text ? subject: text
      confirmed-at: time auth-context: { method: text loa: uint .le 5 ? as:
      uri } ? rendering-digest: digest ? handoff: [1* digest] *
      $$aacp-ce-extension } aacp-confirmation-status = { request-id: uuid-type
      outcome: "unobtainable" reason: "channel-unreachable" / "dialog-expired"
      / "cs-error" / "user-unreachable" reported-at: time } digest = bstr
      .size 32 ; SHA-256 uuid-type = bstr .size 16 ; RFC 9562 UUID, binary
      form ; Extension points use CDDL sockets: $$aacp-ad-extension //= (?
      aacp-ad-ext: any) $$aacp-cr-extension //= (? aacp-cr-ext: any)
      $$aacp-ce-extension //= (? aacp-ce-ext: any) </sourcecode>
    </section>

    <section anchor="appendix-examples" title="Examples">
      <section anchor="appendix-examples-ad"
               title="Action Descriptor (flight booking)">
        <sourcecode type="json"> { "type":
        "https://api.airlines.example.com/actions/flight_booking", "actions":
        ["book"], "locations": ["https://api.airlines.example.com/bookings"],
        "parameters": { "flight_number": { "value": "UA123", "confirm": true,
        "render": { "label": "Flight", "value-label": "United 123, New York
        JFK to Los Angeles LAX" } }, "departure_date": { "value":
        "2026-11-20", "confirm": true, "render": { "label": "Departure",
        "value-label": "20 November 2026, 09:00 EST" } }, "passenger_name": {
        "value": "A. Example", "confirm": true, "render": { "label":
        "Passenger" } }, "fare_class": { "value": "economy", "confirm": true,
        "render": { "label": "Cabin", "value-label": "Economy" } },
        "total_price": { "value": { "currency": "USD", "amount": "412.00" },
        "confirm": true, "render": { "label": "Total price", "format":
        "currency" } }, "seat_preference": { "value": "window" } }, "effect":
        "create", "reversible": false, "expires": "2026-10-31T12:00:00Z" }
        </sourcecode>

        <t>Parameters with confirm=true (flight, date, passenger, cabin,
        price) form the rendering set; seat_preference is part of the action
        digest but not the confirmation display.</t>
      </section>

      <section anchor="appendix-examples-cr" title="Confirmation Request">
        <sourcecode type="json"> { "v": 1, "request-id":
        "f47ac10b-58cc-4372-a567-0e02b2c3d479", "action-digest":
        "base64url(SHA-256(JCS(descriptor)))", "challenge": "base64url(16
        random octets)", "lifetime": 300, "audience":
        "agent:booking.airlines.example.com", "subject":
        "user:alice@example.com" } </sourcecode>
      </section>

      <section anchor="appendix-examples-ce"
               title="Confirmation Evidence (payload before JCS and signing)">
        <sourcecode type="json"> { "v": 1, "request-id":
        "f47ac10b-58cc-4372-a567-0e02b2c3d479", "action-digest":
        "base64url(SHA-256(JCS(descriptor)))", "challenge": "base64url(16
        random octets)", "decision": "confirmed", "audience":
        "agent:booking.airlines.example.com", "subject":
        "user:alice@example.com", "confirmed-at": "2026-10-31T11:03:17Z",
        "auth-context": { "method": "passkey", "loa": 4 }, "rendering-digest":
        "base64url(SHA-256(JCS(rendering-set)))" } </sourcecode>
      </section>

      <section anchor="appendix-examples-denied" title="Denied Evidence">
        <t>The same structure with "decision": "denied" and the matching
        confirmed-at. The acting agent <bcp14>MUST</bcp14> treat denial as a
        terminal outcome for the request-id and <bcp14>MUST NOT</bcp14>
        re-request confirmation for the same action-digest without a new
        user-initiated dialog turn.</t>
      </section>

      <section anchor="appendix-examples-status" title="Unobtainable Status">
        <sourcecode type="json"> { "request-id":
        "f47ac10b-58cc-4372-a567-0e02b2c3d479", "outcome": "unobtainable",
        "reason": "dialog-expired", "reported-at": "2026-10-31T11:59:02Z" }
        </sourcecode>
      </section>
    </section>

    <section anchor="appendix-traceability"
             title="Requirement Traceability Matrix">
      <t>Each mechanism in this document traces to at least one requirement in
      the agentproto document set or an external standard:</t>

      <table anchor="tab-traceability">
        <thead>
          <tr>
            <th>ID</th>

            <th>Mechanism (section)</th>

            <th>Src</th>
          </tr>
        </thead>

        <tbody>
          <tr>
            <td>RR-1</td>

            <td>Programmatic, non-LLM rendering requirement for the CS (Sec
            4.2, 5.2)</td>

            <td>1</td>
          </tr>

          <tr>
            <td>RR-2</td>

            <td>API annotation of confirmation-required operations and
            field-level confirm flags (Sec 5.1, 10)</td>

            <td>1</td>
          </tr>

          <tr>
            <td>RR-3</td>

            <td>User-visible rendering metadata (render labels, value labels,
            formats) (Sec 5.1, 10)</td>

            <td>1</td>
          </tr>

          <tr>
            <td>RR-4</td>

            <td>Cryptographic assurance that confirmation originates from the
            user, in delegated flows (Sec 4.4, 7, 9)</td>

            <td>1</td>
          </tr>

          <tr>
            <td>BU-1</td>

            <td>Action evidence as a separated, digest-bound claim (Sec 7.1,
            7.4)</td>

            <td>2</td>
          </tr>

          <tr>
            <td>BU-2</td>

            <td>Evidence provenance via CS key identity and auth-context (Sec
            7.2, 7.3)</td>

            <td>2</td>
          </tr>

          <tr>
            <td>BU-3</td>

            <td>Freshness rules and lifetime bounds (Sec 7.5)</td>

            <td>2</td>
          </tr>

          <tr>
            <td>BU-4</td>

            <td>Distinct row outcomes with terminal processing, no partial
            acceptance (Sec 8)</td>

            <td>2</td>
          </tr>

          <tr>
            <td>BU-5</td>

            <td>Dependency closure: unresolvable inputs yield unverifiable,
            never inflated outcomes (Sec 7.4, 8.2)</td>

            <td>2</td>
          </tr>

          <tr>
            <td>HE-1</td>

            <td>Exercise evidence: rendering-digest commits to the
            confirmation display the user actually saw (Sec 5.2, 7.4, 8.1 step
            8)</td>

            <td>3</td>
          </tr>

          <tr>
            <td>HE-2</td>

            <td>Denied decisions produce signed evidence, not silence (Sec
            7.1, 9.3)</td>

            <td>3,4</td>
          </tr>

          <tr>
            <td>KO-1</td>

            <td>denied / unobtainable / stale as distinct outcomes with
            distinct errors (Sec 8.2, 9.3)</td>

            <td>4</td>
          </tr>

          <tr>
            <td>WA-1</td>

            <td>Post-session verifiability: detached signatures, key-history
            retention rules (Sec 7.2, 11.4)</td>

            <td>5</td>
          </tr>

          <tr>
            <td>WA-2</td>

            <td>Effect classification (effect, reversible) (Sec 5.1)</td>

            <td>5</td>
          </tr>

          <tr>
            <td>CM-1</td>

            <td>Verify-at-the-time-authorized and
            distinguish-failed-vs-incomplete (CMN-12) (Sec 8.2)</td>

            <td>6</td>
          </tr>

          <tr>
            <td>SV-1</td>

            <td>Handoff chain binding by digest (Sec 9.2)</td>

            <td>7</td>
          </tr>

          <tr>
            <td>OK-1</td>

            <td>Audience binding against context diversion (Sec 7.1, 8.1 step
            4)</td>

            <td>8</td>
          </tr>

          <tr>
            <td>HO-1</td>

            <td>Out-of-band confirmation with dialog-interruption semantics
            (Sec 4.4 Variant C, 9.3)</td>

            <td>9</td>
          </tr>

          <tr>
            <td>FE-1</td>

            <td>Channel requirements in the CR, async reconnection-compatible
            confirmation (Sec 6)</td>

            <td>10</td>
          </tr>

          <tr>
            <td>RAR-1</td>

            <td>Descriptor structure derived from authorization_details (Sec
            5.1)</td>

            <td>11</td>
          </tr>

          <tr>
            <td>RAR-2</td>

            <td>Consent-display sanitization inherited (Sec 5.2, 11.1)</td>

            <td>11</td>
          </tr>
        </tbody>
      </table>

      <t>Sources:</t>

      <ol spacing="compact">
        <li>
          <t><xref target="I-D.rosenberg-agentproto-usecases"/> Sections
          3.2.3, 3.3.6</t>
        </li>

        <li>
          <t><xref target="I-D.bu-agentproto-security-principal-binding"/>
          claims C-005, C-007, C-008, C-009; row-outcome and closure rules</t>
        </li>

        <li>
          <t>
            <xref target="I-D.he-agentproto-verifier-evidence"/>
          </t>
        </li>

        <li>
          <t>
            <xref target="I-D.konda-agentproto-evaluation-state"/>
          </t>
        </li>

        <li>
          <t>
            <xref target="I-D.wadkins-agentproto-action-determinability"/>
          </t>
        </li>

        <li>
          <t><xref target="I-D.agentic-ai-usecases-requirements"/> CMN-12</t>
        </li>

        <li>
          <t>
            <xref target="I-D.srivastava-agentproto-handoff-context"/>
          </t>
        </li>

        <li>
          <t>
            <xref target="I-D.okutomi-session-bound-agent-identity"/>
          </t>
        </li>

        <li>
          <t><xref target="I-D.howe-agentproto-contact-center-usecases"/>
          CC3-1, CC3-4</t>
        </li>

        <li>
          <t>
            <xref target="I-D.feng-agentproto-session-requirements"/>
          </t>
        </li>

        <li>
          <t>
            <xref target="RFC9396"/>
          </t>
        </li>
      </ol>
    </section>

    <section anchor="appendix-ack" title="Acknowledgments">
      <t>The requirement structure of this document is drawn from the
      agentproto working group's document set; the author acknowledges the
      authors of those documents for the analysis this protocol builds on. The
      action descriptor design reuses the Rich Authorization Requests
      structure of RFC 9396, whose authors' deployment experience informed
      several profile decisions.</t>
    </section>
  </back>
</rfc>
