<?xml version="1.0" encoding="utf-8"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude"
     docName="draft-schrock-ep-bounded-capability-receipts-00"
     category="exp" ipr="trust200902"
     version="3" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="EP Bounded Capabilities">Bounded Capability Receipts and Durable Spend Control for Agent Actions</title>
    <seriesInfo name="Internet-Draft" value="draft-schrock-ep-bounded-capability-receipts-00"/>
    <author fullname="Iman Schrock">
      <organization>EMILIA Protocol, Inc.</organization>
      <address>
        <postal><country>US</country></postal>
        <email>team@emiliaprotocol.ai</email>
      </address>
    </author>
    <date year="2026" month="July" day="19"/>
    <area>Security</area>
    <keyword>agent authorization</keyword>
    <keyword>capability</keyword>
    <keyword>spend control</keyword>
    <keyword>delegation</keyword>
    <abstract>
      <t>Agents sometimes need bounded authority to perform more than one
      consequential action without obtaining a new human approval for every
      operation. A signed token alone cannot enforce a shared budget across
      replicas, survive retries safely, or distinguish an operation that never
      crossed an effect boundary from one whose outcome is unknown.</t>
      <t>This document defines a bounded capability receipt and a durable
      reserve-execute-commit protocol. The receipt binds an issuance
      authorization, a closed action scope, a budget with explicit units, a
      holder proof, an expiry, and any parent capability. The state protocol
      atomically refuses overspend and replay, fences concurrent owners, and
      charges an indeterminate operation when an external effect may have
      occurred. It also defines narrowing-only delegation and evidence
      interfaces. It does not make a bearer token into human approval, does
      not provide offline global double-spend prevention, and does not claim
      that an authorized action was safe, lawful, or successfully executed.</t>
    </abstract>
  </front>

  <middle>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>A single-action authorization receipt is intentionally narrow: it
      records approval of one exact action and can be accepted at most once
      within its atomic consumption domain. Some agent
      deployments also need a different primitive. For example, an operator
      may authorize an agent to purchase a bounded class of supplies, subject
      to an aggregate monetary ceiling and an expiry, without asking a human
      to approve each conforming purchase.</t>
      <t>That primitive has two inseparable parts:</t>
      <ol spacing="normal">
        <li>a signed capability receipt that states the immutable authority
        boundary; and</li>
        <li>a shared, durable state machine that serializes reservations and
        committed consumption across retries, processes, replicas, and
        restarts.</li>
      </ol>
      <t>The signed object without the state machine is replayable budget
      metadata. The state machine without a signed, scoped grant has no
      portable statement of authority. This document specifies their
      composition.</t>

      <section anchor="requirements-language">
        <name>Requirements Language</name>
        <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL",
        "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT
        RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be
        interpreted as described in BCP 14 <xref target="RFC2119"/>
        <xref target="RFC8174"/> when, and only when, they appear in all
        capitals, as shown here.</t>
      </section>

      <section anchor="scope">
        <name>Scope and Non-Goals</name>
        <t>This document defines issuance binding, action-scope evaluation,
        budget accounting, holder proof, durable reservation and commitment,
        and narrowing delegation. It does not define user authentication,
        human-approval presentation, general policy syntax, payment clearing,
        settlement, currency conversion, revocation distribution, or the
        external effect adapter.</t>
        <t>A capability receipt is machine authority evidence. It is not,
        merely by being signed, evidence that a human reviewed each later
        action. Deployments that require per-action human authorization
        continue to require a per-action authorization artifact.</t>
      </section>
    </section>

    <section anchor="terminology">
      <name>Terminology</name>
      <dl newline="false" spacing="normal">
        <dt>Issuance authorization:</dt>
        <dd>An independently verified authorization artifact for the exact
        act of creating a bounded capability.</dd>
        <dt>Capability receipt:</dt>
        <dd>The signed immutable grant defined by this document.</dd>
        <dt>Capability issuer:</dt>
        <dd>The principal whose pinned key signs a capability receipt.</dd>
        <dt>Holder proof:</dt>
        <dd>Proof that the requester controls the secret or key named by the
        capability receipt. Holder proof is not proof that a requested action
        is in scope.</dd>
        <dt>Scope verifier:</dt>
        <dd>A verifier for a named scope profile, selected and configured by
        the relying party.</dd>
        <dt>Capability store:</dt>
        <dd>The authoritative shared transactional state for registration,
        reservation, and committed consumption.</dd>
        <dt>Operation ID:</dt>
        <dd>A globally unique identifier for one attempted capability-funded
        operation within a capability-store domain.</dd>
        <dt>Reservation token:</dt>
        <dd>An unguessable owner-fencing value returned by a successful
        reservation and required for its commitment.</dd>
        <dt>Effect boundary:</dt>
        <dd>The point after which an external effect may have occurred and
        therefore budget cannot safely be restored merely because the caller
        did not receive a successful response.</dd>
        <dt>Indeterminate outcome:</dt>
        <dd>An operation for which the executor cannot prove that no effect
        occurred and cannot prove a successful expected effect.</dd>
      </dl>
    </section>

    <section anchor="trust-model">
      <name>Trust Model</name>
      <t>The relying party selects capability-issuer keys, accepted issuance
      authorization profiles, scope profiles, state-store domain, and local
      authorization policy. A key embedded in a presented capability receipt
      <bcp14>MUST NOT</bcp14>, by itself, become a trust anchor. An empty trust
      configuration <bcp14>MUST</bcp14> fail closed.</t>
      <t>The capability store is trusted to serialize state transitions and
      retain committed operation records. The effect adapter is trusted to
      place the effect boundary correctly and to report outcomes honestly.
      This protocol makes those trust dependencies explicit; it does not
      remove them.</t>
      <t>All capability-store participants that can authorize the same
      capability <bcp14>MUST</bcp14> use one shared atomic state domain.
      Independent stores cannot prevent each other from accepting the same
      remaining budget.</t>
    </section>

    <section anchor="receipt">
      <name>The Bounded Capability Receipt</name>
      <t>The receipt is a JSON object serialized using the JSON
      Canonicalization Scheme (JCS) <xref target="RFC8785"/> before signing.
      The following is illustrative:</t>
      <sourcecode type="json"><![CDATA[
{
  "@version": "EP-BOUNDED-CAPABILITY-v1",
  "capability": {
    "capability_id": "cap_01J...",
    "issuer": "https://operator.example",
    "subject": "agent:procurement-7",
    "authorization": {
      "receipt_id": "rcpt_01J...",
      "receipt_digest": "sha256:4c..."
    },
    "scope": {
      "profile": "urn:emilia:scope:caid-set-v1",
      "value": {
        "caids": ["caid1:sha256:..."]
      },
      "digest": "sha256:8a..."
    },
    "budget": {
      "amount": 250000,
      "unit": "iso4217:USD",
      "scale": 2
    },
    "holder": {
      "method": "sha-256-preimage",
      "commitment": "sha256:91..."
    },
    "threshold": {"m": 2, "n": 3},
    "parent": null,
    "not_before": "2026-07-18T20:00:00Z",
    "expires_at": "2026-07-19T20:00:00Z"
  },
  "capability_signature": {
    "algorithm": "Ed25519",
    "public_key": "base64url...",
    "value": "base64url..."
  }
}
]]></sourcecode>

      <section anchor="required-fields">
        <name>Required Fields</name>
        <dl newline="false" spacing="normal">
          <dt><tt>@version</tt>:</dt>
          <dd><tt>EP-BOUNDED-CAPABILITY-v1</tt>.</dd>
          <dt><tt>capability_id</tt>:</dt>
          <dd>A globally unique, opaque identifier. Uniqueness is not used as
          a substitute for cryptographic binding.</dd>
          <dt><tt>issuer</tt>:</dt>
          <dd>The issuer identifier used to select a relying-party-pinned
          verification key.</dd>
          <dt><tt>subject</tt>:</dt>
          <dd>The intended holder or workload identifier. This identifier
          does not replace holder proof or live workload authentication.</dd>
          <dt><tt>authorization</tt>:</dt>
          <dd>The identifier and SHA-256 digest of the complete issuance
          authorization artifact. The digest <bcp14>MUST</bcp14> cover the
          exact bytes accepted by that artifact's native verifier.</dd>
          <dt><tt>scope</tt>:</dt>
          <dd>A named scope profile, its value, and the SHA-256 digest of the
          JCS serialization of <tt>profile</tt> and <tt>value</tt>.</dd>
          <dt><tt>budget</tt>:</dt>
          <dd>A non-negative integer amount no greater than
          9007199254740991, an explicit unit, and a decimal scale from 0
          through 18. For <tt>iso4217:USD</tt> with scale 2, an amount of
          250000 denotes USD 2500.00. Implementations <bcp14>MUST NOT</bcp14>
          infer a scale from display conventions.</dd>
          <dt><tt>holder</tt>:</dt>
          <dd>A recognized holder-proof method and commitment.</dd>
          <dt><tt>threshold</tt>:</dt>
          <dd>Integers <tt>m</tt> and <tt>n</tt> satisfying
          1 &lt;= m &lt;= n &lt;= 255. This field describes custody of the
          holder credential; it does not assert approval by distinct humans.</dd>
          <dt><tt>parent</tt>:</dt>
          <dd><tt>null</tt> for a root capability. For a child capability,
          an object containing the parent capability ID, the digest of the
          complete signed parent receipt, and the identifier of an
          authenticated parent delegation operation. That operation
          <bcp14>MUST</bcp14> bind the child receipt digest and the delegated
          amount, unit, scale, scope, and validity interval. A parent
          identifier without digest-bound parent and delegation evidence is
          insufficient.</dd>
          <dt><tt>not_before</tt> and <tt>expires_at</tt>:</dt>
          <dd>UTC timestamps in Internet Date/Time format
          <xref target="RFC3339"/> using the canonical string form selected by
          the deployment profile. Expiry is exclusive. Numeric epochs,
          implementation-specific date strings, and values that do not
          round-trip to the canonical form <bcp14>MUST</bcp14> be rejected.</dd>
        </dl>
      </section>

      <section anchor="signature-input">
        <name>Signature Input and Receipt Digest</name>
        <t>The issuer signature input is the JCS serialization of the object
        containing exactly <tt>@version</tt> and <tt>capability</tt>. The
        signature algorithm for this version is Ed25519
        <xref target="RFC8032"/>. The receipt digest is:</t>
        <sourcecode type="text"><![CDATA[
SHA-256(JCS({
  "@version": receipt["@version"],
  "capability": receipt.capability,
  "capability_signature": receipt.capability_signature
}))
]]></sourcecode>
        <t>The issuance authorization is bound by both its identifier and
        digest. Binding only a caller-selected receipt identifier is
        insufficient because two different artifacts can carry the same
        identifier.</t>
      </section>

      <section anchor="verification">
        <name>Receipt Verification</name>
        <t>A verifier <bcp14>MUST</bcp14> perform all of the following and
        fail closed on any error:</t>
        <ol spacing="normal">
          <li>apply bounded parsing and reject duplicate JSON member names,
          unknown critical versions, malformed encodings, and out-of-range
          values;</li>
          <li>select the issuer key from relying-party configuration, not from
          the presented object alone;</li>
          <li>verify the issuer signature over the exact signature input;</li>
          <li>natively verify the issuance authorization under its own pinned
          trust inputs and compare both receipt identifier and digest;</li>
          <li>verify that the authorized action is issuance of this exact
          capability object, or of a digest that commits to it;</li>
          <li>verify the scope digest and require a recognized,
          relying-party-enabled scope profile;</li>
          <li>verify the validity interval and, for a child, resolve and
          verify the digest-bound parent lineage to a root capability or a
          locally trusted, previously validated lineage checkpoint. Reject an
          unresolved, truncated, reordered, or substituted link; a repeated
          capability ID or receipt digest; the leaf appearing among its
          ancestors; or a path exceeding deployment policy. At every hop,
          verify that the child amount does not exceed the authenticated
          delegated amount, unit and scale are unchanged, validity is
          contained by the parent, and scope is no broader than the parent
          scope; and</li>
          <li>compute the capability receipt digest used for store
          registration.</li>
        </ol>
        <t>Receipt verification returns <tt>VERIFIED</tt>. It does not return
        <tt>AUTHORIZED</tt>, prove remaining budget, or prove that a proposed
        operation is in scope.</t>
      </section>
    </section>

    <section anchor="issuance">
      <name>Issuance Authorization</name>
      <t>The issuance authorization <bcp14>MUST</bcp14> authorize the act of
      creating the capability, including the immutable digest of its subject,
      scope, budget, holder commitment, parent, and validity interval. It
      <bcp14>MUST NOT</bcp14> be reused as though it were a per-operation
      authorization for later spends.</t>
      <t>When the issuance artifact is an EMILIA Authorization Receipt, its
      exact action is capability issuance and its one-time consumption occurs
      when the capability is registered. Later capability-funded operations
      are governed by this document's scope and durable state protocol.</t>
    </section>

    <section anchor="scope-evaluation">
      <name>Action Scope</name>
      <t>Before reserving budget, the enforcement point <bcp14>MUST</bcp14>
      compute the proposed material action independently of presenter-supplied
      labels and invoke the pinned verifier for <tt>scope.profile</tt>. A
      missing profile, unknown action representation, lossy mapping, or
      indeterminate comparison <bcp14>MUST</bcp14> refuse.</t>
      <t>The mandatory-to-implement
      <tt>urn:emilia:scope:caid-set-v1</tt> profile contains a non-empty,
      duplicate-free array of Canonical Action IDentifiers. It matches only
      exact identifier equality. Possession of a CAID authorizes nothing
      outside this verified capability context.</t>
      <t>Application profiles can define closed constraints over typed action
      fields. Such a profile <bcp14>MUST</bcp14> specify canonicalization,
      comparison, unknown-field handling, numerical units, and an algorithm
      for proving that a delegated scope is no broader than its parent.
      Profiles that cannot decide either action membership or attenuation
      <bcp14>MUST</bcp14> return <tt>INDETERMINATE</tt>.</t>
    </section>

    <section anchor="holder-proof">
      <name>Holder Proof and Threshold Custody</name>
      <t>The mandatory-to-implement holder method is
      <tt>sha-256-preimage</tt>. The holder presents exactly 32 bytes over a
      confidential, integrity-protected channel, and the enforcement point
      compares <tt>SHA-256(preimage)</tt> with the signed commitment using a
      constant-time comparison. The preimage <bcp14>MUST NOT</bcp14> be
      logged, stored with the receipt, or included in portable evidence.</t>
      <t>The preimage may be divided using a threshold secret-sharing scheme
      before presentation. Share format, participant authentication,
      confidentiality, recovery, and distribution are outside this document.
      Reconstructing <tt>m</tt> shares proves control of the holder secret; it
      does not prove that <tt>m</tt> distinct humans reviewed or approved the
      action. Human multi-party approval requires a protocol such as
      <xref target="EP-QUORUM"/>.</t>
    </section>

    <section anchor="registration">
      <name>Registration</name>
      <t>After receipt verification and one-time consumption of the issuance
      authorization, the issuer registers the capability in the authoritative
      store. Registration <bcp14>MUST</bcp14> atomically create immutable
      fields for capability ID, receipt digest, unit, scale, total budget,
      scope digest, validity interval, and parent. It
      <bcp14>MUST</bcp14> initialize <tt>consumed</tt> and
      <tt>reserved</tt> to zero.</t>
      <t>A second registration of the same capability ID
      <bcp14>MUST</bcp14> succeed only when every immutable field and receipt
      digest is identical. Any mismatch is a collision and
      <bcp14>MUST</bcp14> refuse.</t>
      <t>Mutable counters in a presented receipt are not authoritative.
      Remaining budget is computed only from the shared store:</t>
      <sourcecode type="text"><![CDATA[
remaining = total - consumed - reserved
]]></sourcecode>
    </section>

    <section anchor="state-machine">
      <name>Reserve, Execute, and Commit</name>
      <section anchor="reserve">
        <name>Reserve</name>
        <t>A reservation request contains the capability ID, capability
        receipt digest, globally unique operation ID, the immutable canonical
        exercise-action digest and CAID where used, positive integer amount,
        unit, scale, and authenticated holder proof. The same immutable action
        snapshot <bcp14>MUST</bcp14> be used for scope evaluation,
        authorization, reservation accounting, and the effect callback; a
        mutable caller object <bcp14>MUST NOT</bcp14> cross those boundaries.
        In one serializable transaction, or while holding an equivalent row
        lock, the store <bcp14>MUST</bcp14>:</t>
        <ol spacing="normal">
          <li>load the registered capability and compare the receipt digest;</li>
          <li>reject an unknown, not-yet-valid, expired, or revoked capability;</li>
          <li>reject a unit or scale mismatch;</li>
          <li>reject any already-seen operation ID, regardless of its previous
          capability or outcome;</li>
          <li>verify that the amount is positive and no greater than
          <tt>total - consumed - reserved</tt>;</li>
          <li>increase <tt>reserved</tt> by the amount; and</li>
          <li>create an operation in state <tt>reserved</tt> with an
          unguessable reservation token, exercise-action digest, and amount,
          and return that token only to the owner.</li>
        </ol>
        <t>Scope evaluation and local authorization policy
        <bcp14>MUST</bcp14> succeed before the effect adapter is entered.
        Deployments <bcp14>SHOULD</bcp14> perform them before reserving to
        reduce abandoned reservations.</t>
      </section>

      <section anchor="execute">
        <name>Effect Boundary</name>
        <t>The enforcement point enters the effect adapter only after a
        successful reservation. It <bcp14>MUST NOT</bcp14> expose an alternate
        path to the same effect that bypasses capability enforcement when the
        action requires this profile.</t>
      </section>

      <section anchor="commit">
        <name>Commit</name>
        <t>A commit request contains the operation ID, reservation token, and
        one of three outcomes: <tt>executed</tt>, <tt>indeterminate</tt>, or
        <tt>delegated</tt>. In one atomic transaction, the store
        <bcp14>MUST</bcp14> verify ownership and reserved state, decrease
        <tt>reserved</tt>, increase <tt>consumed</tt> by the same amount, and
        make the operation terminal.</t>
        <t>A repeated commit, wrong reservation token, or commit against a
        non-reserved operation <bcp14>MUST</bcp14> refuse. A caller timeout
        does not justify retrying with a new operation ID; the caller
        <bcp14>MUST</bcp14> query the original operation or reconcile it.</t>
        <t>If the executor cannot prove that the effect boundary was not
        crossed, it <bcp14>MUST</bcp14> commit
        <tt>indeterminate</tt> and charge the budget. Availability loss is
        safer than allowing the same authority to be spent again after an
        unobserved external effect.</t>
      </section>

      <section anchor="reconciliation">
        <name>Crash Recovery and Reconciliation</name>
        <t>Reservations survive process and replica failure. A deployment
        <bcp14>MUST</bcp14> define a reconciler for non-terminal operations.
        The reconciler may commit <tt>executed</tt> only with authenticated
        effect evidence. It may restore budget only when it can prove the
        effect boundary was never crossed. In every other case it
        <bcp14>MUST</bcp14> commit <tt>indeterminate</tt>.</t>
      </section>
    </section>

    <section anchor="delegation">
      <name>Narrowing Delegation</name>
      <t>A child capability <bcp14>MUST NOT</bcp14> outlive its parent,
      exceed the authenticated amount delegated from the parent, change unit
      or scale, or broaden the parent's scope. Its delegation chain
      <bcp14>MUST</bcp14> be bounded by deployment policy and
      <bcp14>MUST</bcp14> include the parent receipt digest.</t>
      <t>Before registering a child, the verifier <bcp14>MUST</bcp14>
      validate complete digest-linked ancestry to a trusted root within the
      configured depth bound, or enforce equivalent authenticated parent-edge
      constraints in one authoritative store. The verified lineage
      <bcp14>MUST</bcp14> form a simple path. The verifier
      <bcp14>MUST</bcp14> reject a repeated capability identifier or receipt
      digest, a missing or inconsistent parent, a substituted or reordered
      edge, or a chain whose trusted root cannot be established. A cycle,
      truncated lineage, or over-depth chain <bcp14>MUST</bcp14> fail closed.
      Per-receipt identifier uniqueness or a self-declared list of ancestors
      does not establish graph-wide acyclicity. An implementation
      <bcp14>MUST NOT</bcp14> infer acyclicity merely because its ordinary
      issuance path constructs children from known parents; verification
      applies the same check to imported and reconstructed chains.</t>
      <t>Creating a child is itself a parent-funded operation. The issuer
      reserves and commits the delegated amount from the parent with outcome
      <tt>delegated</tt>. The authenticated terminal operation record
      <bcp14>MUST</bcp14> bind the exact child receipt digest, delegated
      amount, unit, scale, scope, and validity interval before the child is
      registered; otherwise a valid parent spend could be paired with a
      different child. A shared store
      <bcp14>SHOULD</bcp14> perform parent commitment and child registration
      atomically. If that is impossible and child registration fails after
      the parent is committed, the parent budget remains consumed and the
      orphaned delegation <bcp14>MUST</bcp14> be retained for reconciliation.
      The system <bcp14>MUST NOT</bcp14> silently refund it.</t>
    </section>

    <section anchor="evidence">
      <name>Evidence and Decision Vocabulary</name>
      <t>A capability receipt can be <tt>VERIFIED</tt>. A scope verifier can
      return the profile-local result <tt>IN_SCOPE</tt>,
      <tt>OUT_OF_SCOPE</tt>, or <tt>INDETERMINATE</tt>. This containment
      result is not the architecture's <tt>MATCH</tt> state, which is reserved
      for correlation of exact material actions. A relying-party evidence
      requirement can be <tt>SATISFIED</tt>. Successful local policy and an
      atomic reservation together can establish <tt>AUTHORIZED</tt> for one
      exercise. Separately authenticated effect evidence can establish
      <tt>EXECUTED</tt>. No earlier state implies a later one.</t>
      <t>Portable evidence for a capability-funded operation
      <bcp14>SHOULD</bcp14> include the capability receipt digest, issuance
      authorization digest, scope profile and digest, operation ID, the exact
      exercise action digest and CAID where used, amount, unit, scale,
      reservation timestamp, terminal outcome, and any authenticated effect
      statement. The integrity-protected operation record
      <bcp14>MUST</bcp14> bind the exercise action and the capability receipt
      digest. Holder secrets and reservation tokens <bcp14>MUST NOT</bcp14> be
      included.</t>
      <t>An Authorization Evidence Chain may carry that operation record as a
      native component whose verifier recursively verifies the capability
      receipt, issuance authorization, scope result, and operation-record
      integrity. The static grant is not a same-action component for every
      later exercise. Evidence satisfaction does not query or reserve current
      budget; that state transition remains at the enforcement point.</t>
    </section>

    <section anchor="failure-codes">
      <name>Failure Codes</name>
      <t>Implementations <bcp14>SHOULD</bcp14> expose stable,
      non-authorizing failure codes including:</t>
      <ul spacing="normal">
        <li><tt>capability_untrusted_issuer</tt></li>
        <li><tt>capability_authorization_mismatch</tt></li>
        <li><tt>capability_scope_mismatch</tt></li>
        <li><tt>capability_scope_indeterminate</tt></li>
        <li><tt>capability_holder_proof_invalid</tt></li>
        <li><tt>capability_not_active</tt></li>
        <li><tt>capability_expired</tt></li>
        <li><tt>capability_revoked</tt></li>
        <li><tt>capability_budget_exceeded</tt></li>
        <li><tt>capability_delegation_lineage_invalid</tt></li>
        <li><tt>capability_delegation_not_narrowed</tt></li>
        <li><tt>capability_operation_replay</tt></li>
        <li><tt>capability_reservation_owner_mismatch</tt></li>
        <li><tt>capability_commit_indeterminate</tt></li>
      </ul>
      <t>A failure code is diagnostic output, not an authorization artifact.
      Responses <bcp14>SHOULD</bcp14> avoid revealing secret, budget, or scope
      details to an unauthenticated caller.</t>
    </section>

    <section anchor="conformance">
      <name>Conformance</name>
      <t>A conforming implementation <bcp14>MUST</bcp14> pass positive and
      adversarial vectors for receipt canonicalization and signature,
      authorization-digest substitution, untrusted issuer, unknown scope
      profile, action mismatch, holder-proof failure, duplicate registration,
      concurrent overspend, operation replay, wrong reservation token,
      double commit, expiry, a cycle spread across separately signed receipts,
      repeated ancestors, leaf-as-ancestor, missing or truncated lineage,
      reordered or substituted parent links, parent-receipt and
      delegation-operation substitution, a single-hop child exceeding the
      authenticated delegated amount, unit or scale changes, scope or validity
      widening at every hop, over-depth chains, parent over-allocation, crash
      recovery, and indeterminate-effect charging.</t>
      <t>A wire-format implementation that does not implement one shared
      atomic store is a receipt verifier, not a conforming spend-control
      implementation. A store implementation that accepts a capability without
      pinned issuer verification, issuance authorization, and scope matching
      is not conforming.</t>
    </section>

    <section anchor="relationship">
      <name>Relationship to Other Work</name>
      <t>Rich Authorization Requests <xref target="RFC9396"/> carries
      fine-grained authorization details but deliberately leaves comparison
      semantics for arbitrary detail types to their specifications. This
      document defines an executor-side durable spend state machine and
      requires a named closed scope profile.</t>
      <t>OAuth Transaction Tokens <xref target="TXN-TOKENS"/> propagate
      transaction-specific authorization context through a call chain.
      Bounded Capability Receipts instead address an aggregate budget shared
      across multiple operations and the reserve/commit boundary at the
      executor. A deployment can use both.</t>
      <t>The Delegation Receipt Protocol <xref target="DRP"/> records
      delegation and narrowing. This document requires narrowing for child
      capabilities and additionally accounts delegated budget as a terminal
      parent spend.</t>
      <t>OAuth Attenuating Tokens for Agentic AI
      <xref target="ATTENUATING"/> describes constrained, attenuable agent
      tokens. This document's distinct contribution is not the existence of
      constrained tokens; it is the composition of a signed grant with shared
      reservation ownership, committed budget accounting, and conservative
      treatment of indeterminate external effects.</t>
    </section>

    <section anchor="security">
      <name>Security Considerations</name>
      <t><strong>Identifier substitution.</strong> Capability signatures bind
      the full issuance authorization digest, not only an identifier. Scope,
      budget units, parent, holder commitment, and validity are all inside the
      issuer signature.</t>
      <t><strong>State forks.</strong> Two stores accepting the same
      capability can each spend its full budget. Global offline double-spend
      prevention is therefore not provided. Deployments that cannot name one
      authoritative state domain <bcp14>MUST NOT</bcp14> claim an aggregate
      budget is enforced.</t>
      <t><strong>Crash ambiguity.</strong> Restoring budget after a timeout can
      authorize duplicate external effects. Once the effect boundary may have
      been crossed, uncertainty is charged as <tt>indeterminate</tt>.</t>
      <t><strong>Bearer and share theft.</strong> A raw holder secret or enough
      unauthenticated shares can authorize possession. Secret shares require
      confidential distribution, authenticated participants, compromise
      response, and rate limiting. Threshold custody is not human quorum.</t>
      <t><strong>Revocation.</strong> Expiry and exhausted budget are not
      revocation. A deployment that requires early invalidation
      <bcp14>MUST</bcp14> consult a separately authenticated revocation or
      status source before reservation and define its freshness policy.</t>
      <t><strong>Units and arithmetic.</strong> All accounting uses integers
      with signed unit and scale. Floating-point arithmetic, implicit currency
      conversion, and caller-selected rounding <bcp14>MUST NOT</bcp14> occur
      in the authoritative budget path.</t>
      <t><strong>Database authority.</strong> The capability tables contain
      authorization state. Deployments <bcp14>MUST</bcp14> restrict writes to
      the enforcement service, use least-privilege credentials, protect
      backups, and audit administrative changes.</t>
      <t><strong>Delegation lineage.</strong> Local uniqueness checks over one
      presented receipt do not establish graph-wide acyclicity or complete
      ancestry. Separately presented receipts can omit links, substitute a
      parent operation, or form a cycle unless each parent edge is
      authenticated and resolved by digest, or an authoritative store
      enforces equivalent edge constraints. Implementations
      <bcp14>MUST</bcp14> fail closed on incomplete, cyclic, substituted, or
      non-narrowing lineage. Verifiers apply the complete traversal and
      refusal rules in <xref target="delegation"/> to imported chains and
      chains reconstructed from storage.</t>
      <t><strong>Semantic limits.</strong> A valid capability does not prove
      that an action is safe, lawful, beneficial, or correctly executed.
      Local policy and domain controls remain necessary.</t>
      <t><strong>Cryptographic scope.</strong> This version uses SHA-256 and
      Ed25519. It does not provide a post-quantum signature profile or a
      zero-knowledge receipt. Algorithm agility and long-term preservation are
      separate concerns.</t>
    </section>

    <section anchor="privacy">
      <name>Privacy Considerations</name>
      <t>Capability receipts and operation records can reveal spending limits,
      organizational roles, intended action classes, counterparties, and
      timing. Profiles <bcp14>SHOULD</bcp14> minimize identifiers, separate
      portable evidence from operational secrets, and define retention and
      access controls. Hashing a low-entropy scope or identifier does not make
      it confidential.</t>
    </section>

    <section anchor="implementation">
      <name>Implementation Status</name>
      <t>The main branch of an Apache-2.0 JavaScript implementation includes a
      signed pre-standard capability envelope, holder-secret commitment,
      optional threshold secret reconstruction, and a durable PostgreSQL
      reservation and commitment store. Its issuer-controlled delegation API,
      when used with one shared capability store, reserves and commits a child
      amount from the immediate parent before registering the child.
      The store has adversarial tests for overspend, replay, ownership fencing,
      expiry, and terminal commitment. Production Gate guard-path enforcement
      using this store remains on a public review branch and is not represented
      as part of the repository's main branch.</t>
      <t>The prototype wire format predates this document and does not yet
      implement all mandatory fields in this version, including full issuance
      authorization digest binding, an explicit action-scope profile, and
      explicit budget unit scale, digest-linked parent lineage, authenticated
      parent-delegation binding, <tt>not_before</tt>, and complete ingest-time
      cycle validation. It is therefore implementation experience, not a claim
      of conformance. There is no independent implementation, interoperability
      event, production transaction history, post-quantum profile, or
      zero-knowledge implementation.</t>
      <t>The main implementation does reject repeated delegation identifiers,
      repeated parent capability identifiers, a leaf named as its own parent,
      and increasing amounts within the delegation chain presented at mint or
      verification time. Those checks provide local simple-path and monotonic
      amount enforcement. They do not discover omitted parents or establish the
      digest-linked, graph-wide lineage required by <xref target="delegation"/>,
      so they do not close the remaining conformance gap.</t>
      <t>The public repository also contains a CI-gated TLA+ model of
      capability registration, reservation, commitment, revocation,
      delegation, replay refusal, and budget conservation. In the checked
      configuration, three capability identifiers, two operation identifiers,
      amounts from zero through two, delegation depth two, and a three-value
      clock produced 6,033 distinct states; TLC found no counterexample to ten
      configured state invariants and four transition properties. This is
      bounded evidence about the model, not a refinement proof of the
      JavaScript, SQL, transaction adapter, cryptography, lineage verification,
      or complete protocol defined here. A separate repository witness module
      contains five reachability checks but is not executed by the CI workflow
      and is not represented as proving every assertion non-vacuous. The model
      obtains delegation acyclicity through its construction rules; arbitrary
      implementation inputs still require the explicit runtime traversal and
      refusal rules in <xref target="delegation"/>.</t>
      <t>The main branch also runs a fixed-seed adversarial harness in
      per-push CI over the actual JavaScript in-memory capability and
      consumption stores. It includes a true-concurrency
      <tt>Promise.all</tt> race target and a deliberately non-atomic
      comparison store that demonstrates the race detector can expose
      over-commitment. Additional targets exercise accounting and ownership
      invariants at whole-method boundaries. This is regression evidence for
      those in-process stores, not complete protocol conformance: it does not
      fuzz the PostgreSQL capability transaction path, the atomic handshake
      RPC, replica or connection failures, and no deeper nightly sweep is
      scheduled.</t>
    </section>

    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions. A future revision may request a
      media type and registries for receipt versions, scope profiles, holder
      methods, and failure codes after implementation experience stabilizes
      the protocol.</t>
    </section>
  </middle>

  <back>
    <references>
      <name>Normative References</name>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3339.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8032.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.8785.xml"/>
      <reference anchor="EP-QUORUM" target="https://datatracker.ietf.org/doc/draft-schrock-ep-quorum/">
        <front>
          <title>Multi-Party Authorization (Quorum) for the EMILIA Protocol</title>
          <author fullname="Iman Schrock"/>
          <date year="2026"/>
        </front>
      </reference>
    </references>
    <references>
      <name>Informative References</name>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9396.xml"/>
      <reference anchor="TXN-TOKENS" target="https://datatracker.ietf.org/doc/draft-ietf-oauth-transaction-tokens/">
        <front>
          <title>Transaction Tokens</title>
          <author fullname="George Fletcher"/>
          <date year="2026"/>
        </front>
      </reference>
      <reference anchor="DRP" target="https://datatracker.ietf.org/doc/draft-nelson-agent-delegation-receipts/">
        <front>
          <title>Delegation Receipt Protocol</title>
          <author fullname="Andrew Nelson"/>
          <date year="2026"/>
        </front>
      </reference>
      <reference anchor="ATTENUATING" target="https://datatracker.ietf.org/doc/draft-niyikiza-oauth-attenuating-agent-tokens/">
        <front>
          <title>OAuth Attenuating Tokens for Agentic AI</title>
          <author fullname="Eric Niyikiza"/>
          <date year="2026"/>
        </front>
      </reference>
    </references>
  </back>
</rfc>
