<?xml version="1.0" encoding="utf-8"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude"
     docName="draft-hawkins-scitt-attested-agent-payment-01"
     category="std"
     ipr="trust200902"
     submissionType="IETF"
     tocInclude="true"
     sortRefs="true"
     symRefs="true"
     version="3">

  <front>
    <title abbrev="Attested Agent Payment Authorization">Attested Payment
    Authorization for Autonomous Agents</title>
    <seriesInfo name="Internet-Draft"
                value="draft-hawkins-scitt-attested-agent-payment-01"/>
    <author fullname="Walter D. Hawkins" initials="Walter D."
            surname="Hawkins">
      <organization>Independent</organization>
      <address><email>wdhawkins46@gmail.com</email></address>
    </author>
    <date year="2026" month="August" day="15"/>
    <area>Security</area>
    <keyword>attestation</keyword>
    <keyword>agent</keyword>
    <keyword>payment</keyword>
    <keyword>SCITT</keyword>
    <keyword>RATS</keyword>

    <abstract>
      <t>Autonomous software agents increasingly initiate payments on
      behalf of principals. Existing agent-payment mechanisms
      authenticate the human principal, the operator, or possession of a
      key; none of them establishes that the software authorized to
      spend is the software that was reviewed. A key held by a
      compromised or silently modified agent authenticates exactly as
      well as one held by an honest agent.</t>
      <t>This document defines a payment authorization scope bound to a
      key whose protection properties are attested by hardware, and
      registers the resulting authorization as a Signed Statement on an
      SCITT Transparency Service. The binding reuses the EAT
      confirmation and key-attributes claims without modification; the
      contribution is the authorization scope, the verification
      procedure a payment executor performs before settlement, the
      transparency record that makes the authorization artifact and
      its registration auditable independently of the agent and of the
      executor, and an execution-record mechanism that makes the
      executor's aggregate accounting auditable on challenge. What is
      registered evidences the authorization; it does not evidence
      that the verification procedure was performed for any given
      settlement.</t>
    </abstract>
  </front>

  <middle>
    <section anchor="intro">
      <name>Introduction</name>
      <t>Protocols for agent-initiated payment have converged quickly.
      They differ in mechanism but agree on what they bind: the consent
      of a human principal, the identity of an operator, or possession
      of a private key. What none of them binds is the identity of the
      running program.</t>
      <t>This distinction is not academic. Measurements of deployed
      agent-payment traffic over a 280-day window classify 21.20
      percent of settlements as fictitious and 63.78 percent as
      internal settlement within a linked cluster -- 84.98 percent
      operator-internal in total <xref target="MEASURE"/>. An independent study of the ERC-8004
      agent registries across three chains <xref
      target="ERC8004-STUDY"/> found that only 3% (Ethereum), 4%
      (BSC), and 15% (Base) of registered agents had a registration
      file that resolved, parsed as compliant, and declared at least
      one service endpoint; that reputation feedback was almost
      completely decoupled from economic activity (on Base, 93.8% of
      reviewers had never made a payment yet produced 94.9% of all
      feedback); and that the median cost of moving an agent's
      reputation score was $0.0027, against a median agent payment
      volume of $0.70. Possession of a key is compatible with all of
      these outcomes: it demonstrates that some party controls a
      secret, not that a particular program is running, nor that its
      behavior is the behavior that was authorized.</t>
      <t>The same study reports that the registry standard's own
      Validation Registry -- the component its specification reserves
      for independent attestations, naming stake-secured re-execution,
      zkML proofs, and TEE attestation -- had no confirmed mainnet
      deployment through May 2026. The ecosystem has, in other words,
      already named the place where evidence stronger than
      self-reported feedback belongs, and left it empty. A track
      record answers whether an agent has behaved well and can be
      moved for fractions of a cent; an attestation answers whether
      the running code is the endorsed code, right now, and is
      structural from the first transaction. This document specifies
      the second kind of evidence for the payment-authorization
      decision in particular.</t>
      <t>Meanwhile the primitives needed to close the gap exist and are
      specified. <xref target="I-D.reddy-rats-key-binding"/> binds a
      subject key to an attested execution environment using the EAT
      "cnf" claim <xref target="RFC8747"/> and a "key-attributes" claim
      describing key protection properties.
      <xref target="RFC9943"/> defines a Transparency Service on which
      signed statements about an artifact can be registered and later
      audited. Nothing joins them: no specification makes hardware
      attestation normative for a payment authorization decision, and no
      deployed system consults an attestation before releasing funds.</t>
      <t>This document defines that join. It is deliberately small: it
      adds no new attestation format, no new key binding, and no new
      transparency mechanism. It specifies (1) what an authorization
      scope contains, (2) the verification a payment executor MUST
      perform, and (3) what is registered so that a third party can
      later audit an authorization without trusting either the agent or
      the party that executed the payment.</t>

      <section anchor="nongoals">
        <name>Non-Goals</name>
        <t>This specification does not:</t>
        <ul>
          <li>define agent identity, naming, or discovery;</li>
          <li>define or require any particular payment protocol,
          settlement rail, or currency;</li>
          <li>establish the correctness of the attested software. An
          attestation proves that the running code is the endorsed code;
          it says nothing about whether that code is correct. Presenting
          the former as the latter is the central misuse this document
          warns against (<xref target="security"/>);</li>
          <li>replace principal consent mechanisms. Attested
          authorization composes with them and is not a substitute:
          consent establishes that spending was wanted, attestation
          establishes which program may do the spending.</li>
        </ul>
      </section>

      <section anchor="conventions">
        <name>Conventions and Definitions</name>
        <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
        NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED",
        "MAY", and "OPTIONAL" in this document are to be interpreted as
        described in BCP 14 <xref target="RFC2119"/>
        <xref target="RFC8174"/> when, and only when, they appear in all
        capitals, as shown here.</t>
        <dl>
          <dt>Agent:</dt>
          <dd>An autonomous software instance that initiates payments.</dd>
          <dt>Payment Executor:</dt>
          <dd>The party that performs or submits settlement on an
          agent's instruction. In deployed systems this is typically a
          facilitator, gateway, or custodial service.</dd>
          <dt>Authorization Scope:</dt>
          <dd>The bounded permission to spend, defined in
          <xref target="scope"/>.</dd>
          <dt>Attested Payment Key (APK):</dt>
          <dd>The Subject Key of
          <xref target="I-D.reddy-rats-key-binding"/> when used to
          authorize payments under this specification.</dd>
          <dt>Issuer:</dt>
          <dd>The party that signs the Authorization Scope's Signed
          Statement; the "iss" of <xref target="RFC9943"/>. Registration
          authenticates the Issuer as the party that made the
          statement. It does not by itself establish that the Issuer
          may bind the funds the scope spends; that check is Check 8 of
          <xref target="verify"/>.</dd>
          <dt>Authorization-Time Evidence:</dt>
          <dd>Attestation evidence generated at scope issuance and
          registered with the scope, establishing the APK-to-code
          binding as of registration. This is the evidence the Receipt
          refers to.</dd>
          <dt>Transaction-Time Evidence:</dt>
          <dd>Attestation evidence generated freshly for one payment,
          under a nonce supplied by the executor, establishing that the
          binding still holds at the moment of payment. The two
          evidence classes are distinct artifacts and MUST NOT be
          conflated: registered evidence cannot contain a nonce an
          executor generates later, and fresh evidence is not the
          artifact the Receipt refers to.</dd>
        </dl>
      </section>
    </section>

    <section anchor="overview">
      <name>Overview</name>
      <t>An agent operating in an attested environment generates a key
      pair inside that environment and obtains an Entity Attestation
      Token (EAT) <xref target="RFC9711"/> carrying the "cnf" claim for
      the public key and the "key-attributes" claim describing its
      protection properties, per
      <xref target="I-D.reddy-rats-key-binding"/>.</t>
      <t>The agent's principal (or an operator acting for it) issues an
      Authorization Scope naming that key and the bounds within which it
      may spend. The scope, a reference to the authorization-time
      evidence, and the endorsed software identity are registered
      together as a Signed Statement on a Transparency Service
      <xref target="RFC9943"/>, yielding a Receipt. At payment time the
      executor additionally obtains transaction-time evidence under its
      own nonce; the two evidence classes are defined in
      <xref target="conventions"/> and consumed by different checks of
      <xref target="verify"/>.</t>
      <t>When the agent later instructs a payment, the Payment Executor
      verifies the attestation, verifies that the instruction is signed
      by the APK, verifies that the payment falls within the scope, and
      verifies the Receipt before settling. Each of these is a
      pre-execution check: the authorization decision is made before
      funds move, not reconstructed afterward from logs.</t>
    </section>

    <section anchor="scope">
      <name>The Authorization Scope</name>
      <t>An Authorization Scope is a CBOR map, encoded in the
      deterministic encoding of Section 4.2.1 of <xref
      target="RFC8949"/>; the scope digest is computed over exactly
      those bytes. Determinism here is load-bearing, not hygienic: the
      digest is how a scope is referenced -- in Receipts, in executor
      reports, and in the binding of a held payment to the scope it was
      opened under -- and identical scopes that hash differently across
      encoders would quietly break every one of those references. The
      following members are defined; unknown members not named in
      "crit" MUST be ignored (see "crit" below for why blanket
      ignoring alone would be too permissive for authorization
      constraints).</t>
      <dl>
        <dt>apk (REQUIRED):</dt>
        <dd>The COSE Key Thumbprint <xref target="RFC9679"/> of the
        Attested Payment Key, computed with SHA-256 over the
        required-parameter COSE_Key construction of that document.
        RFC 9679 leaves the hash function to the application; this
        profile fixes SHA-256 so that independently computed
        thumbprints are comparable. This is the key whose "cnf"
        appears in the attestation evidence; the comparison procedure
        is Check 2 of <xref target="verify"/>.</dd>
        <dt>code (REQUIRED):</dt>
        <dd>The endorsed software identity the attestation is expected
        to report, expressed as a structure of three members: "alg",
        the digest algorithm; "artifact", the class of artifact
        measured (for example a confidential-VM launch measurement or
        a container image), drawn from the attestation-technology
        profile in use; and "digest", the expected value. RFC 9711
        deliberately leaves measurement semantics to profiles, so a
        bare digest is not comparable across attesters: naming the
        algorithm and the measured artifact class is what makes the
        Check 4 comparison defined. This is the value that makes the
        authorization specific to a program rather than to a
        deployment.</dd>
        <dt>limits (REQUIRED):</dt>
        <dd>The spending bounds. At minimum a maximum amount per payment
        and a maximum aggregate amount over a stated window, each with
        an explicit unit. Amounts are integer counts of the smallest
        unit of the stated currency, with the scale declared
        explicitly; floating-point amounts MUST NOT be used, because
        there is no safe float-to-integer path once value is on the
        wire. The aggregate window is a rolling window of the stated
        number of seconds ending at evaluation time; calendar-day
        readings, which produce different authorization decisions on
        identical inputs depending on time zone, are not a conforming
        interpretation. A scope with no upper bound MUST NOT be
        registered.</dd>
        <dt>executor (REQUIRED when "limits" carries an aggregate bound):</dt>
        <dd>The identity of the single Payment Executor that serializes
        spending under this scope. An aggregate bound is only an
        aggregate if one party accounts for it: absent this binding, N
        executors each enforce the bound independently and the
        principal's exposure multiplies by N while every party remains
        conformant. An executor presented with an instruction under a
        scope naming a different executor MUST refuse. Scopes whose
        limits contain only a per-payment bound MAY omit this
        member.</dd>
        <dt>expiry (REQUIRED):</dt>
        <dd>The time after which the scope is invalid, expressed as
        epoch seconds, a CBOR unsigned integer. This is the only
        permitted form: a second accepted timestamp shape is an
        encoding divergence, not a convenience. Scopes are short-lived
        by design; see <xref target="revocation"/>.</dd>
        <dt>rails (OPTIONAL):</dt>
        <dd>The settlement systems on which the scope is valid,
        enforced by Check 6 of <xref target="verify"/>. Absence means
        the scope itself imposes no rail restriction; it does not
        override any restriction the relying party's own policy
        imposes. Rail identifiers are opaque strings whose namespace
        is defined by rail profiles.</dd>
        <dt>payees (OPTIONAL):</dt>
        <dd>Constraint on permitted counterparties, enforced by Check 6
        of <xref target="verify"/>. Payee identifiers are opaque
        strings whose namespace is defined by rail profiles.</dd>
        <dt>crit (OPTIONAL):</dt>
        <dd>A list of member names critical to this scope. An executor
        that does not understand every member named in "crit" MUST
        refuse instructions under the scope. This is the repair for a
        conflict the extension rule would otherwise create: a future
        restrictive member -- a payee category, a jurisdiction
        constraint -- ignored by an older executor silently widens the
        effective scope, which is precisely the widening
        <xref target="security"/> warns against, produced by the
        extension rule itself. Blanket rejection of unknown members
        would kill extensibility; criticality marking puts the choice
        with the issuer, who signs the scope.</dd>
        <dt>on_indeterminate (OPTIONAL):</dt>
        <dd>
          <t>Selects the issuer's disposition when the supersession check
          cannot be completed (Check 9 of <xref target="verify"/>). Absent
          this member, the disposition is "refuse": an indeterminate
          supersession result fails closed, because settling on it would
          be proceeding on unknown current authority. The member MAY move
          off that default to one of two named modes.</t>
          <dl>
            <dt>"hold":</dt>
            <dd>with a deadline, suspends the decision until the
            supersession status is determined or the deadline passes,
            whichever comes first. The deadline MUST NOT exceed "expiry"
            and defaults to it. A payment held under "hold" and
            subsequently evaluable MUST be re-checked against the whole of
            <xref target="verify"/> before settlement, including the
            "eat_nonce" freshness check and the Receipt: a hold suspends
            the decision and MUST NOT cache a partial pass. "hold" does
            not settle on an indeterminate result; it waits for a
            determinate one. A hold is bound, by digest, to the scope
            under which it was opened, and a payment MUST NOT settle on
            the basis of a hold opened under a scope other than the one
            in force at settlement: where the scope has been superseded
            or reissued during the hold, the resumed evaluation is a new
            evaluation under the scope then in force, and the prior hold
            confers nothing. Because <xref target="revocation"/> prefers
            reissuance to long lifetimes, a hold spanning a reissuance
            is the common case, not the corner case.</dd>
            <dt>"bounded-fail-open":</dt>
            <dd>settles within "expiry" despite an indeterminate
            supersession result. This is bounded fail-open for revocation
            availability, named as such: it trades revocation-safety for
            liveness, and its exposure -- settling a payment whose current
            authority could not be confirmed -- is stated in
            <xref target="security"/>. It is available only by explicit
            issuer selection and is never the default.</dd>
          </dl>
        </dd>
      </dl>
      <t>The scope is defined by the following CDDL; the prose above
      states intent, this definition is the algorithm's input
      contract:</t>
      <sourcecode type="cddl"><![CDATA[
authorization-scope = {
  "apk": bstr,                    ; RFC 9679 thumbprint, SHA-256
  "code": software-identity,
  "limits": spending-limits,
  "expiry": uint,                 ; epoch seconds
  ? "rails": [+ tstr],            ; namespace: rail profiles
  ? "payees": [+ tstr],           ; namespace: rail profiles
  ? "executor": tstr,             ; REQUIRED with an aggregate bound
  ? "on_indeterminate": on-indeterminate,
  ? "crit": [+ tstr],
  * tstr => any                   ; unknown; refused if named in crit
}

software-identity = {
  "alg": tstr,                    ; e.g. "sha-256", "sha-384"
  "artifact": tstr,               ; measured-artifact class, from the
                                  ; attestation-technology profile
  "digest": bstr
}

spending-limits = {
  "currency": tstr,               ; asset identifier
  "scale": uint,                  ; smallest-unit scale declaration
  "per_payment": uint,            ; integer count of smallest unit
  ? "aggregate": uint,
  ? "window": uint                ; rolling seconds ending at
                                  ; evaluation time; REQUIRED with
                                  ; "aggregate"
}

on-indeterminate = {
  "mode": "hold" / "bounded-fail-open",
  ? "deadline": uint              ; epoch seconds; MUST NOT exceed
                                  ; "expiry"; meaningful for "hold"
}
]]></sourcecode>
      <t>An Authorization Scope MUST NOT be widened by any party other
      than its issuer, and an agent MUST NOT be able to widen its own
      scope by any means, including by presenting a newer attestation.
      Narrowing MAY be performed by the executor.</t>
    </section>

    <section anchor="verify">
      <name>Verification Before Settlement</name>
      <t>Before executing a payment presented under this specification,
      a Payment Executor MUST perform all of the following checks. Checks
      1 through 8 are completeness checks: the executor MUST NOT settle if
      any of them fails or cannot be completed. Check 9 (supersession) is
      a positive-signal check whose distinct semantics are stated in that
      item and in <xref target="revocation"/>.</t>
      <t>This profile uses the combined model of
      <xref target="I-D.reddy-rats-key-binding"/>: a single EAT whose
      "cnf" claim carries the Subject Key. The split model (a PAT
      carrying the KAK and a KAT carrying the Subject Key, with its
      distinct verification sequence) is out of scope at this revision;
      "the evidence" below is therefore unambiguous.</t>
      <ol>
        <li>The transaction-time evidence verifies against the expected
        Attester's trust anchors, including enforcement of the "iat",
        "nbf", and "exp" claims per the dependency's verifier
        requirements, and the freshness value in "eat_nonce" was
        supplied by the verifying party for this transaction. A
        replayed attestation MUST NOT be accepted. The
        authorization-time evidence referenced by the Receipt (Check 8)
        is a distinct artifact and does not satisfy this check.</li>
        <li>The Subject Public Key carried in the evidence's "cnf"
        claim, when used to construct the required-parameter COSE_Key
        of <xref target="RFC9679"/> and hashed with SHA-256, yields a
        thumbprint byte-for-byte equal to the "apk" named in the scope.
        The comparison is over the computed thumbprint, never over
        serialized key encodings -- the dependency's own rule for
        proof-of-possession comparison, applied to the thumbprint
        path.</li>
        <li>The "key-attributes" claim carries "never_extractable"
        true, "extractable" false, and "local" true. The property this
        profile relies on is never-extractability: a key that was
        extractable at any point may already have copies outside the
        environment, so "extractable" false alone is insufficient;
        "local" true establishes the key was generated within the
        attested environment rather than imported into it. Because
        every key-attributes member is optional in the dependency,
        absence of any of these three members is not an assertion of
        anything and MUST be treated as failure of this check.</li>
        <li>The software identity reported by the attestation equals
        the "code" structure in the scope: the same measured-artifact
        class, the same digest algorithm, and a byte-for-byte equal
        digest.</li>
        <li>The payment instruction is signed by the APK, and the
        instruction's terms are covered by that signature. Terms not
        covered by the signature MUST NOT be treated as authorized.
        The instruction MUST identify exactly one Authorization Scope
        by scope digest, and this procedure selects the scope by that
        digest, never by the APK alone: more than one live scope can
        exist for one APK, differing only in rails or payees, and
        selection by key would multiply the principal's exposure
        across all of them. Where more than one live scope could apply
        and the instruction carries no scope digest, the executor MUST
        refuse. The instruction MUST additionally bind, under the same
        signature: a payment intent identifier, the payee, the amount
        with an explicit unit, and the rail. An executor MUST NOT
        settle the same payment intent identifier more than once under
        a scope: "eat_nonce" freshens the attestation, not the
        instruction, so without intent identity a replayed instruction
        composes with fresh evidence and consumes the aggregate
        ceiling in fully conforming steps. Encodings of these fields
        are left to rail profiles; their presence and their coverage
        by the signature are not.</li>
        <li>The payment satisfies every constraint the scope carries:
        it falls within "limits"; where "rails" is present, the
        payment's rail is among them; where "payees" is present, the
        counterparty satisfies that constraint. Constraint members
        that the normative procedure did not evaluate would not be
        constraints. The aggregate bound is evaluated against the
        executor's enumeration of execution digests for this scope
        (<xref target="execrecords"/>): the sum over the enumerated
        payments, plus the payment being evaluated, does not exceed
        the aggregate limit. The evaluation-and-settlement sequence
        MUST be atomic with respect to that enumeration, so that
        concurrent instructions cannot each pass this check against
        the same prior state. On settlement, the payment's execution
        digest joins the enumeration.</li>
        <li>"expiry" has not passed.</li>
        <li>A valid Receipt for the scope's registration is available
        from the Transparency Service, and the executor has
        established, by a rail- or deployment-defined procedure, that
        the scope's Issuer may authorize spending from the account the
        payment draws on. Registration authenticates the party that
        made the statement; it does not establish that this party may
        bind those funds. This document does not define the
        funds-authority procedure -- it is necessarily rail- or
        deployment-specific -- but a conforming executor MUST have
        one, and its absence is failure of this check, not a
        permission.</li>
        <li>No superseding statement for the scope is present on the
        Transparency Service (<xref target="revocation"/>). Unlike checks
        1 through 8, this is a positive-signal check: a superseding
        statement that is found MUST stop settlement, and a determinate
        result showing none present passes. An indeterminate result --
        the executor cannot determine whether a superseding statement
        exists -- is fail-closed by default: the executor MUST NOT settle,
        because settling would proceed on unknown current authority.
        A null or empty answer from the Transparency Service is an
        indeterminate result, and so is an answer that arrives
        unsigned or without a log position where the service
        advertises supersession queries (<xref target="revocation"/>):
        the absence of a verifiable answer is never a determinate
        showing that no superseding statement exists, and
        implementations that treat the two as equivalent will diverge
        exactly where the distinction matters.
        "expiry" bounds how long such exposure could last, not whether
        this payment remains authorized, so it is not a substitute for the
        check. An issuer MAY change the indeterminate disposition per scope
        with "on_indeterminate" (<xref target="scope"/>): "hold" to wait
        for a determinate result, or "bounded-fail-open" to settle within
        "expiry" despite the indeterminate result -- the latter named for
        the revocation-availability exposure it accepts
        (<xref target="security"/>), and available only by explicit issuer
        selection.</li>
      </ol>
      <t>The checks above establish that the reviewed program made the
      payment decision only if signatures by the APK cannot originate
      outside it. All use of the APK for payment signing MUST be
      mediated by the component covered by the "code" measurement,
      such that unmeasured software cannot cause an APK payment
      signature except through the authorization checks performed by
      that measured component. A signing interface inside the attested
      environment that accepts requests from unmeasured software
      defeats the design while passing every per-payment check: the
      signature is valid, the key is never-extractable, the
      attestation verifies, and the payment decision was still not
      made by the reviewed program. Deployments MUST NOT expose such
      an interface, and Registration Policies SHOULD require the
      Issuer to assert this property at registration. Without it, the
      step from key-bound-to-environment to
      payment-decision-bound-to-reviewed-agent -- this document's
      thesis -- is not established.</t>
      <t>An executor MUST distinguish, in whatever it reports to the
      instructing party, between "authorization refused" and
      "authorization could not be evaluated". Collapsing the two allows
      an outage in an attestation or transparency service to be
      indistinguishable from a policy decision, which in practice
      produces pressure to fail open. Where a scope names
      "on_indeterminate" (<xref target="scope"/>), the executor MUST
      record in that report the action taken under it -- refused, held
      until a stated time, or re-evaluated and settled. A hold is a
      policy decision, and the distinction this section requires exists
      precisely so that a policy decision and an outage cannot be
      confused; an unrecorded hold would reintroduce that confusion. The
      executor SHOULD additionally record the disposition in force, so
      that the issuer's intent and the executor's action appear on the
      same record rather than the executor's action alone.</t>
      <t>Executors MUST fail closed. An executor that cannot complete
      checks 1 through 8 MUST NOT settle. An indeterminate supersession
      result (Check 9) is fail-closed by default -- the executor refuses,
      or, where the scope so selects, holds for a determinate result. It
      settles on an indeterminate result only where the scope has
      explicitly selected the "bounded-fail-open" mode of
      "on_indeterminate" (<xref target="scope"/>), which trades
      revocation-safety for liveness within "expiry" and is documented as
      such in <xref target="security"/>. Absent that explicit selection,
      an indeterminate result MUST NOT settle.</t>
    </section>

    <section anchor="transparency">
      <name>Registration on a Transparency Service</name>
      <t>The Authorization Scope, together with a reference to the
      attestation evidence and the endorsed software identity, is
      registered as a Signed Statement per <xref target="RFC9943"/>. The
      resulting Transparent Statement and Receipt make three properties
      available to parties who were not present at authorization
      time:</t>
      <ul>
        <li>that a scope with these bounds existed and was registered
        before the payment, rather than reconstructed afterward;</li>
        <li>that the authorization named a specific software identity,
        which an auditor can compare against a build they can reproduce;
        and</li>
        <li>that the record is held outside both the agent and the
        executor, so the audit trail does not depend on either party's
        own account of events. Neutrality of the Transparency Service
        itself is a deployment goal rather than a property a Receipt
        carries -- <xref target="RFC9943"/> permits a service operated
        by an interested party -- and is made checkable by witnessing
        rather than asserted: see the countersigned-checkpoint
        requirement in <xref target="security"/>; and</li>
        <li>through the execution records of <xref
        target="execrecords"/>, that a specific settled payment was
        counted against this scope, not just plausible under it.</li>
      </ul>
      <t>A Transparency Service accepting these statements records what
      was submitted; it does not adjudicate it. Registration Policy
      SHOULD NOT condition acceptance on the referenced attestation
      evidence verifying, and a service MUST NOT label a registration
      as attested or otherwise vouch for the evidence it references:
      verification is the relying party's act
      (<xref target="verify"/>), and a log that grades what it stores
      has acquired exactly the interest in characterization that the
      bullet above disclaims for it. What Registration Policy SHOULD
      require is well-formedness -- that the statement parses as an
      Authorization Scope per <xref target="scope"/> and that its
      evidence references are digest-bearing.</t>
      <t>Evidence and scopes SHOULD be referenced by digest rather than
      by location alone, so that a later auditor can detect substitution
      of the artifact a Receipt refers to.</t>

      <section anchor="execrecords">
        <name>Execution Records and the Aggregate Bound</name>
        <t>The Receipt proves that a scope predated a payment. It does
        not prove that any specific settled payment was counted against
        the scope's aggregate bound: an executor's private spending
        record is a claim no party outside the executor can check, and
        this document's own position is that such a claim is treated as
        absent. The aggregate bound is therefore made checkable as
        follows.</t>
        <t>For each payment settled under a scope, the executor MUST
        compute an execution digest over the settled payment's fixed
        fields: amount, payee, settlement timestamp, and the scope
        digest under which it was authorized. The execution digest is
        distinct from the scope digest and not derivable from it; any
        party holding the settled payment's terms can recompute it
        without the executor's cooperation.</t>
        <t>The executor MUST maintain, per scope, the enumeration of
        execution digests counted against the scope's aggregate bound,
        and MUST produce that enumeration when challenged by the
        issuer or by an auditor. The sum over the enumerated payments
        is what a challenger compares against the aggregate limit, and
        a settled payment whose execution digest is absent from the
        enumeration is the discoverable failure. Without the
        enumeration requirement, a recomputable digest establishes
        only that a payment could have been counted, which is the same
        self-report one step removed.</t>
        <t>The two digests are deliberately independent: neither is
        derived from the other, and each is discoverable alone. A
        chained construction, in which the execution record embeds the
        digest of the authorization it answers, achieves pairing and is
        deployed in at least one running system <xref
        target="I-D.sirkkavaara-vaara-receipt"/>; this document
        requires independence instead, because a chained second record
        that the executor withholds leaves the first record with no
        visible evidence that an answer was ever owed, whereas an
        independently anchored execution digest can be found by any
        party that holds the settled payment's terms, whether or not
        the executor cooperates.</t>
      </section>
    </section>

    <section anchor="revocation">
      <name>Expiry and Revocation</name>
      <t>Authorization under this specification is short-lived by
      construction. A scope SHOULD have an "expiry" no longer than is
      operationally necessary, and issuers SHOULD prefer reissuance to
      long lifetimes.</t>
      <t>This is a deliberate design choice. Revocation that depends on
      a signal reaching an executor in time is only as reliable as that
      signal; expiry requires no message to arrive, no service to be
      reachable, and no action by the revoking party. An issuer that
      stops reissuing has revoked, and the maximum exposure is bounded
      by the remaining lifetime.</t>
      <t>Where an explicit revocation signal is also available, it MAY be
      registered as a superseding statement on the Transparency Service.
      Executors SHOULD consult it, but MUST NOT rely on its arrival as
      the only bound on exposure. A Transparency Service that
      advertises supersession queries MUST return signed responses
      carrying the log inclusion position or checkpoint they were
      computed against, and an executor MUST treat an unsigned or
      position-less answer as the log not having answered -- which is
      an indeterminate result under Check 9 of <xref
      target="verify"/>, never a determinate absence. Services that do
      not advertise the query are out of scope by construction. The
      requirement is deliberately placed on the party making the
      claim: a weaker recommendation here would reopen the gap it
      closes, since every service that skipped it would return exactly
      the ambiguous silence the executor cannot act on, and a
      determinate "none present" would again have no stated basis.</t>
      <t>Supersession is evaluable only if statements about one scope
      form a sequence, so this profile defines the sequencing. The
      "sub" of the scope's Signed Statement is the scope sequence
      identifier: for a new authorization it is the scope digest of
      the initial scope in the sequence, and it remains constant
      across reissuance, narrowing, and revocation. A superseding or
      revoking statement MUST carry the same ("iss", "sub") pair as
      the statements it joins; a statement under a different pair
      supersedes nothing. Precedence within a sequence is established
      by an explicit monotonic sequence number carried in each Signed
      Statement, never by registration order: <xref target="RFC9943"/>
      warns that order on a ledger cannot be assumed to match issuance
      order absent policy, so position on the log is not authority.
      An executor discovers the current statement of a sequence by
      querying the Transparency Service over the ("iss", "sub") pair,
      and a determinate "no superseding statement" (Check 9) means a
      signed, position-carrying answer showing the scope's own
      statement as the highest sequence number registered for that
      pair. Expiry bounds the duration of exposure;
      it does not establish that a payment remains authorized, since a
      revocation may have occurred that the executor cannot observe. An
      executor that cannot determine whether a superseding statement
      exists therefore fails closed by default (Check 9 of
      <xref target="verify"/>): to settle regardless would be to proceed
      on unknown current authority. An issuer MAY direct a different
      indeterminate disposition per scope through "on_indeterminate"
      (<xref target="scope"/>), including the explicit "bounded-fail-open"
      mode, which accepts that exposure knowingly.</t>
      <t>None of these choices is novel to payments; each restates a
      lesson from network policy control, where the same failure modes
      were worked through in production decades ago. Preferring
      reissuance to long lifetimes is the soft-state discipline of RSVP
      <xref target="RFC2205"/>: authorization that expires unless
      refreshed needs no revocation signal to arrive. Re-running the
      whole of <xref target="verify"/> before a held payment settles is
      per-command re-authorization as practiced by TACACS+
      <xref target="RFC8907"/>, which caches no approval across
      requests. Binding a hold to the scope in force at settlement is
      the revalidation discipline of BGP prefix origin validation
      <xref target="RFC6811"/>, under which acceptance does not survive
      a change in the authorization set it was computed from. And the
      question "on_indeterminate" answers -- what an enforcement point
      does when its decision point cannot be reached -- is the question
      COPS <xref target="RFC2748"/> was chartered to standardize. These
      references are informative; this specification implements none of
      them.</t>
      <t>Implementers are warned that revoking authorization stops
      subsequent authorized payments; it does not by itself reverse or
      cancel obligations already created on a settlement system.
      Documents profiling this specification for a particular rail
      SHOULD state precisely what revocation does and does not undo on
      that rail.</t>
    </section>

    <section anchor="security">
      <name>Security Considerations</name>
      <t><strong>Attestation proves provenance, not correctness.</strong>
      A verified attestation establishes that the running software is
      the endorsed software. It does not establish that the software is
      free of defects, that its authorization logic is sound, or that
      its behavior is desirable. Systems that present attested execution
      as a correctness guarantee will mislead the parties relying on
      them. Where the endorsed code is itself the authorization logic,
      the value of attestation is exactly that the logic cannot be
      silently replaced -- no more.</t>
      <t><strong>Extractable keys void the property.</strong> If the
      private component of the APK can leave the attested environment,
      then a payment signed by it evidences nothing about where it was
      signed. This is why the "key-attributes" check in
      <xref target="verify"/> is mandatory rather than advisory.</t>
      <t><strong>Attestation freshness.</strong> An attestation not
      bound to a freshness value supplied by the verifying party can be
      replayed by any party that has observed it, including after the
      attested environment has stopped running. The "eat_nonce" check is
      not optional.</t>
      <t><strong>Scope inflation.</strong> The most likely deployment
      error is a scope broad enough to be operationally convenient --
      unbounded aggregate, no expiry, no payee constraint -- which
      preserves the appearance of attested authorization while removing
      its effect. Registration Policies SHOULD reject unbounded
      scopes.</t>
      <t><strong>Transparency is not confidentiality.</strong>
      Registering scopes publicly may disclose commercially sensitive
      information about an agent's spending authority. Implementers
      SHOULD register digests rather than plaintext where disclosure is
      a concern, and SHOULD consider that the existence and timing of
      registrations is itself observable.</t>
      <t><strong>Verifier and Transparency Service availability.</strong>
      Because executors MUST fail closed, an unavailable verifier or
      Transparency Service denies service rather than degrading security:
      whenever a check cannot be completed -- for a Transparency Service,
      whenever the Receipt (Check 8) cannot be obtained or the supersession
      status (Check 9) cannot be determined -- the default is refusal.
      Deployments SHOULD plan for this explicitly. Uncontrolled failing
      open under load -- settling because a check could not be completed,
      with no issuer having chosen that behavior -- is worse than denial
      and MUST NOT be implemented. The single exception is the
      "bounded-fail-open" mode of "on_indeterminate"
      (<xref target="scope"/>): an issuer MAY, per scope, direct that an
      indeterminate supersession result settle within "expiry", knowingly
      trading revocation-safety for availability. That mode is bounded (by
      "expiry"), explicit (issuer-selected, never a default), and named for
      the exposure it accepts; it is the only circumstance under which an
      incomplete supersession check settles, and it MUST NOT be applied to
      the completeness checks (1 through 8), which always fail closed.</t>
      <t><strong>The log is not disinterested by assumption.</strong>
      A Transparency Service can be operated by an interested party,
      and nothing in a Receipt evidences otherwise. Deployments SHOULD
      require that the service's checkpoints be countersigned by a
      quorum of independent witnesses, so that a service presenting
      different views to different parties is detectable by comparing
      countersigned checkpoints. An executor SHOULD treat a
      supersession answer (<xref target="revocation"/>) computed
      against an unwitnessed checkpoint as weaker evidence than one
      computed against a witnessed checkpoint, and a Registration
      Policy SHOULD state which witnesses countersign its
      checkpoints.</t>
      <t><strong>Enumeration does not close omission.</strong> The
      execution-digest enumeration of <xref target="execrecords"/>
      makes deletion and reordering of counted payments detectable. It
      does not close omission: a payment that never entered the
      enumeration leaves no gap to find, so an enumeration the
      executor produces remains the executor's word about
      completeness, one layer down. Closing omission requires
      enumerating from a vantage the executor does not control -- for
      example, from the settlement rail itself, with each record bound
      to the settled transaction's own digest, so that a missing leg
      is visible to whichever party holds that leg. Rail-side
      enumeration is out of scope for this document; profiles binding
      this specification to a particular rail SHOULD state whether and
      how the rail's own records can serve that role.</t>
      <t><strong>The Attester is trusted.</strong> This specification
      inherits the trust model of <xref target="RFC9334"/>: relying
      parties trust the Attester's hardware root and its endorsers. A
      compromise of that root compromises every authorization derived
      from it.</t>
    </section>

    <section anchor="privacy">
      <name>Privacy Considerations</name>
      <t>Attestation evidence can be highly identifying, potentially
      including platform and firmware detail beyond what a payment
      decision requires. Deployments SHOULD convey to executors only the
      claims their policy consumes, and Transparency Service
      registrations SHOULD reference evidence by digest rather than
      embedding it.</t>
      <t>Correlation across payments is possible where the same APK is
      reused. Where unlinkability matters, issuers SHOULD scope keys
      narrowly and rotate them, accepting the additional attestation
      cost.</t>
    </section>

    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions at this revision. A future
      revision is expected to request a CBOR tag or media type for the
      Authorization Scope, and registration of any new EAT claims should
      further revisions require them; the present design deliberately
      reuses existing claims.</t>
    </section>

    <section anchor="impl" removeInRFC="true">
      <name>Implementation Status</name>
      <t>Per <xref target="RFC7942"/>. The author operates a payment
      facilitator in which the settlement key is generated inside an
      Intel TDX confidential computing environment and never exists
      outside it; the environment's software identity is endorsed
      on-chain and an open verifier checks the attestation, the
      endorsement, and the key binding before the service is treated as
      attested. A second deployment issues short-lived credentials
      gating access to a permissioned trading venue, where the issuing
      key is likewise generated inside the attested environment and
      credential lifetime is the bound on exposure, as described in
      <xref target="revocation"/>.</t>
      <t>These deployments predate this document and do not implement it
      as written; they are offered as evidence that the pattern is
      operable, not as a conformant implementation.</t>
      <t>Independently of the author, Colin Winter (Markovian Protocol)
      registered an Authorization Scope statement against the -00
      registration flow on a public transparency log (leaf 7235 of
      log.markovianprotocol.com), with verification code published
      alongside it. That exercise surfaced the deterministic-encoding,
      integer-amount, and single-expiry-form requirements now normative
      in <xref target="scope"/>: three ways identical scopes could
      hash differently or diverge across encoders, each found by
      attempting an implementation rather than by review.</t>
    </section>
  </middle>

  <back>
    <references>
      <name>References</name>
      <references anchor="normative">
        <name>Normative References</name>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9711.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8747.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9334.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9943.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8949.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9679.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.reddy-rats-key-binding.xml"/>
      </references>
      <references anchor="informative">
        <name>Informative References</name>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7942.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2205.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2748.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6811.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8907.xml"/>
        <reference anchor="MEASURE" target="https://arxiv.org/abs/2607.12575">
          <front>
            <title>How Agentic Is Agentic Commerce? A Population-Scale
            Measurement of x402 Adoption and Authenticity</title>
            <author surname="Ling"/>
            <author surname="Zhou"/>
            <author surname="Wu"/>
            <author surname="Wang"/>
            <date year="2026" month="July" day="14"/>
          </front>
          <refcontent>arXiv:2607.12575</refcontent>
        </reference>
        <reference anchor="ERC8004-STUDY" target="https://arxiv.org/abs/2606.26028">
          <front>
            <title>Can Trustless Agents Be Trusted? An Empirical Study
            of the ERC-8004 Decentralized AI Agent Ecosystem</title>
            <author surname="Xiong"/>
            <author surname="Li"/>
            <author surname="Wei"/>
            <author surname="Wang"/>
            <author surname="Knottenbelt"/>
            <author surname="Wang"/>
            <date year="2026" month="July" day="8"/>
          </front>
          <refcontent>arXiv:2606.26028, v2</refcontent>
        </reference>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.sirkkavaara-vaara-receipt.xml"/>
      </references>
    </references>

    <section anchor="ack" numbered="false">
      <name>Acknowledgments</name>
      <t>This document exists because two specifications were written and
      not connected. The key binding it depends on is the work of the
      authors of <xref target="I-D.reddy-rats-key-binding"/>, and the
      transparency model is that of <xref target="RFC9943"/>. Reviewers
      in the x402 community materially improved the author's
      understanding of what payment executors can and cannot verify in
      practice.</t>
      <t>Vernon Wharff (Sigilcore) identified that the -00 supersession
      step carried three different normative strengths across Sections 4
      and 6, and that "fail closed" conflates two distinct behaviors --
      terminal refusal and a bounded hold -- that the issuer, who signs
      the scope and chose its expiry, had no way to select between. The
      split of Checks 8 and 9 and the on_indeterminate scope member
      follow from that review. Iman Schrock (EMILIA) identified that the
      resulting fallback default for an indeterminate supersession
      result was bounded fail-open -- settling on unknown current
      authority, with expiry bounding only the duration of exposure --
      and that it contradicted Section 7's own requirements. The
      refuse-by-default repair and the Section 7 realignment follow from
      that correction.</t>
      <t>Tiago Pinto (donttrustverify.pt) reviewed the -00 in full
      against pinned artifacts, together with its normative
      dependencies, and applied the test a profile lives or dies by:
      whether two independent implementations, given the same
      artifacts and inputs, evaluate the same predicates the same way.
      Eight blocking findings from that review -- thumbprint
      comparability, the key-attributes and evidence-class profiles,
      the "code" semantics and the mediation requirement, executor
      binding and atomicity for the aggregate bound, instruction
      identity, constraint enforcement, and supersession sequencing --
      account for most of the normative distance between -00 and this
      revision, and his calibration of the citations corrected both a
      title and a misattributed claim. The narrowing of Section 6's
      signed-answer requirement to a MUST on services that advertise
      supersession queries is likewise his: the requirement sits on
      the party making the claim, which is where load-bearing
      distinctions belong.</t>
      <t>Colin Winter (Markovian Protocol) attempted a registration
      rather than a reading, and the deterministic-encoding, integer-
      amount, and single-expiry-form requirements of Section 3 are the
      result; his registration appears in the Implementation Status.
      Joel Hillier (Certisyn) identified that scope selection by APK
      alone is ambiguous the moment two live scopes share a key, that a
      null Transparency Service answer is indeterminate rather than a
      determinate absence, and that signed, position-carrying answers
      are what make a determinate absence auditable; all three are now
      in the text. Pablo Etcheverry identified that the -00 aggregate
      check was the executor attesting to itself from records nobody
      else sees -- the exact class of claim this document argues should
      be treated as absent -- and the execution-digest construction and
      enumeration requirement of Section 5.1 follow from that finding.
      Henri Sirkkavaara (Vaara) named the limit of that construction,
      recorded in Security Considerations: an executor-produced
      enumeration detects deletion, not omission.</t>
    </section>
  </back>
</rfc>
