<?xml version="1.0" encoding="utf-8"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude"
     docName="draft-schrock-ep-authorization-evidence-chain-03"
     category="info" ipr="trust200902"
     version="3" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="Authorization Evidence Chains">Authorization Evidence Chains: Composing Heterogeneous Agent-Action Evidence (EP-AEC)</title>
    <seriesInfo name="Internet-Draft" value="draft-schrock-ep-authorization-evidence-chain-03"/>
    <author fullname="Iman Schrock">
      <organization>EMILIA Protocol, Inc.</organization>
      <address>
        <postal>
          <country>US</country>
        </postal>
        <email>team@emiliaprotocol.ai</email>
      </address>
    </author>
    <date year="2026" month="July" day="19"/>
    <area>sec</area>
    <keyword>AI agents</keyword>
    <keyword>authorization</keyword>
    <keyword>evidence</keyword>
    <keyword>composition</keyword>
    <keyword>JCS</keyword>
    <abstract>
      <t>Consequential agent actions can produce heterogeneous identity,
      delegation, policy, permit, approval, transparency, and execution
      artifacts. Each artifact can verify under its own specification
      while still referring to a different action or filling a different
      evidentiary role. This document defines the Authorization Evidence
      Chain (EP-AEC): a transport-agnostic composition object and an
      offline verification algorithm that verifies each component under
      relying-party-selected trust inputs, checks material-action binding,
      and evaluates a relying-party-pinned requirement.</t>
      <t>The result is SATISFIED or UNSATISFIED. It states whether the
      presented evidence filled the relying party's named evidence slots;
      it is not a universal authorization decision. An executor makes the
      separate local AUTHORIZED decision. AEC introduces no new component
      receipt type and does not replace any native verifier. Presenter
      labels, keys, requirements, and action identifiers cannot establish
      their own authority.</t>
    </abstract>
  </front>
  <middle>
    <section anchor="intro"><name>Introduction</name>
      <t>As autonomous and semi-autonomous agents begin to take
      irreversible external actions -- moving funds, changing records,
      releasing data, invoking privileged APIs -- relying parties
      increasingly demand a verifiable artifact answering "was this exact
      action authorized, and by whom?" The IETF community has responded
      with a cluster of receipt formats, each answering one facet:</t>
      <ul>
        <li>Identity -- who or what the agent is.</li>
        <li>Delegation -- that the agent was authorized to act for a
        principal (e.g. <xref target="DRP"/>, <xref target="DAAP"/>).</li>
        <li>Policy or permit -- that policy permitted the effect before
        commit (e.g. <xref target="PERMIT"/>,
        <xref target="AGENTROA"/>).</li>
        <li>Decision or compliance -- that a decision or compliance check
        occurred (e.g. <xref target="ACTA"/>,
        <xref target="ASQAV"/>).</li>
        <li>Human authorization -- that a named, accountable human, or a
        quorum of distinct humans, approved the exact action
        (<xref target="EP-RECEIPTS"/>, <xref target="EP-QUORUM"/>).</li>
        <li>Transparency -- that a statement was registered in an
        append-only log (<xref target="SCITT"/>).</li>
      </ul>
      <t>These are complementary layers, not competitors: a single
      high-risk action may warrant a delegation receipt AND a policy
      permit AND a human authorization. Yet each effort defines only its
      own native artifact and trust semantics. Without a composition
      profile, the relying party must correlate heterogeneous artifacts
      itself -- in particular, it must establish that the several artifacts
      concern the same material action rather than different ones spliced
      together (a
      cross-binding attack).</t>
      <t>The Entity Attestation Token <xref target="RFC9711"/> provides a
      CBOR mechanism for composing claims from multiple attesting
      environments. EP-AEC applies a related verifier-dispatch pattern to
      JSON/JCS evidence while adding a relying-party requirement and an
      explicit same-action check. This is a scoped design comparison, not
      a claim that heterogeneous evidence composition is otherwise absent.</t>
      <section anchor="scope"><name>Scope and non-goals</name>
        <t>EP-AEC defines (1) a composition object that references
        component receipts and can record the presenter's descriptive
        requirement over them, and (2)
        an offline verification algorithm. EP-AEC does NOT define any
        component receipt format, does not require any particular
        component to be present, and does not bless any component
        specification. It is deliberately minimal: its central
        normative content is the same-action binding check and the
        relying-party requirement evaluation.</t>
      </section>
    </section>

    <section anchor="terminology"><name>Terminology</name>
      <t>The key words "MUST", "MUST NOT", "SHOULD", and "MAY" 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>Action Object</dt>
        <dd>the canonical representation of the external effect being
        authorized, as defined by <xref target="EP-RECEIPTS"/>
        Section 3.</dd>
        <dt>Canonical action digest</dt>
        <dd>the SHA-256 digest of the JCS <xref target="RFC8785"/>
        serialization of the Action Object, expressed as lowercase
        hexadecimal, optionally prefixed "sha256:". The Action Object MUST
        conform to the I-JSON <xref target="RFC7493"/> profile of
        <xref target="EP-RECEIPTS"/> Section 3 (strings, booleans, null,
        arrays, objects, and safe integers only) so that the digest is
        byte-identical across implementations.</dd>
        <dt>Component</dt>
        <dd>one referenced receipt within a chain, carrying a type, the
        receipt evidence, and an optional human-readable label.</dd>
        <dt>Component verifier</dt>
        <dd>a function that verifies one component and returns both a
        validity result AND the canonical action digest to which the
        integrity-protected native evidence is bound.</dd>
        <dt>Requirement</dt>
        <dd>a Boolean expression over component types that
        determines SATISFIED.</dd>
      </dl>
    </section>

    <section anchor="object"><name>The Authorization Evidence Chain object</name>
      <sourcecode type="json"><![CDATA[
{
  "@version": "EP-AEC-v1",
  "action": { ... Action Object ... },
  "action_digest": "sha256:<hex>",
  "components": [
    { "type": "ep-quorum",
      "label": "two-person human authorization",
      "evidence": { ... EP-QUORUM-v1 object ... } },
    { "type": "policy-permit",
      "label": "machine policy permit",
      "evidence": { ... permit receipt ... } },
    { "type": "delegation",
      "label": "agent delegation",
      "evidence": { ... delegation receipt ... } }
  ],
  "requirement": "ep-quorum AND policy-permit"
}
]]></sourcecode>
      <ul>
        <li>"@version" (string, REQUIRED) -- MUST be "EP-AEC-v1".</li>
        <li>"action" (object, REQUIRED) -- the Action Object to which every
        component must be bound.</li>
        <li>"action_digest" (string, OPTIONAL) -- if present, MUST equal
        the canonical action digest recomputed from "action"; a mismatch
        is a fatal error.</li>
        <li>"components" (array, REQUIRED, non-empty) -- each has "type"
        (string), "evidence" (object), and optional "label" (string).
        Labels are display metadata and MUST NOT satisfy a requirement
        identifier.</li>
        <li>"requirement" (string, OPTIONAL) -- a Boolean expression
        (<xref target="requirement"/>). NOTE (changed in -01): this
        member is PRESENTER-SUPPLIED -- a claim of what the chain
        satisfies, never the relying party's sufficiency bar; see
        <xref target="whose-requirement"/>. Its absence has no effect on
        SATISFIED when the verifier has an out-of-band relying-party
        requirement.</li>
      </ul>
      <t>The chain carries the Action Object once; components reference
      the same action by digest rather than re-embedding it. This is what
      makes the same-action binding check possible and is the heart of the
      format.</t>
    </section>

    <section anchor="acceptance-inputs"><name>Relying-party satisfaction inputs</name>
      <t>Internal agreement among presenter-supplied artifacts does not
      satisfy a relying party's evidence requirement. Before returning
      SATISFIED, the verifier MUST receive the
      following values from relying-party-controlled configuration:</t>
      <ul>
        <li>the requirement expression;</li>
        <li>the expected action digest computed from the action the executor
        is actually about to perform;</li>
        <li>an explicit verification time; and</li>
        <li>for each built-in human component, the acceptance profile described
        in <xref target="human-leg"/>.</li>
      </ul>
      <t>If the expected action digest is absent, malformed, or differs from
      the canonical digest of C.action, the verifier MUST return UNSATISFIED. The
      expected digest MUST NOT be taken from C or any component in C.</t>
    </section>

    <section anchor="verify"><name>Verification algorithm</name>
      <t>A verifier is configured with a set of component verifiers keyed
      by type. Given a chain C, the verifier MUST proceed fail-closed:</t>
      <ol>
        <li>If C is malformed (missing "@version", wrong version, missing
        or non-object "action", or empty "components"), or exceeds the
        implementation's documented
        depth, node, component, expression, or string-byte limits,
        return UNSATISFIED.</li>
        <li>Compute chain_digest = canonical action digest of C.action. If
        C.action_digest is present and does not equal chain_digest, return
        UNSATISFIED.</li>
        <li>Compare chain_digest to the expected action digest supplied by
        the relying party. If the expected digest is absent or differs,
        return UNSATISFIED.</li>
        <li><t>For each component k:</t>
          <ol>
            <li>If no verifier is registered for k.type, mark k
            unsatisfied (reason: no verifier) and continue.</li>
            <li>Invoke the verifier on k.evidence. It returns valid and
            action_digest. Any exception marks k unsatisfied.</li>
            <li>k is eligible iff valid is true AND the returned
            action_digest equals chain_digest. A valid component that
            binds a different action MUST be treated as unsatisfied
            (reason: binds a different action). This is the cross-binding
            defense.</li>
            <li>If eligible, add k.type to the satisfied set. k.label
            MUST NOT be added; it is presenter-controlled display
            metadata.</li>
          </ol>
        </li>
        <li>Evaluate only the requirement supplied by the relying party
        over the satisfied set (<xref target="requirement"/>). If no
        relying-party requirement was supplied, return UNSATISFIED. C.requirement
        MAY be evaluated for descriptive reporting but MUST NOT produce
        SATISFIED. Record requirement_source accordingly.</li>
        <li>Return SATISFIED iff the relying-party requirement evaluates true
        and every acceptance input in <xref target="acceptance-inputs"/>
        passed; otherwise return UNSATISFIED.</li>
        <li>Any unexpected error at any step MUST yield UNSATISFIED.</li>
      </ol>
      <t>The result MUST carry a Boolean "satisfied" member and SHOULD
      include, per component, whether it verified and whether it was bound,
      with a reason for any failure. Existing implementations may retain an
      "allow" compatibility alias, but specifications and new callers MUST
      interpret it only as evidence satisfaction, not local authorization.</t>
    </section>

    <section anchor="matching">
      <name>Material-Action Matching</name>
      <t>EP-AEC-v1 carries one JCS action object and uses its canonical
      digest as the chain join key. A component whose native format uses
      a different action representation is eligible only when its native
      verifier or a separate adapter has established, under an exact
      relying-party-pinned mapping profile, that the integrity-protected
      native payload maps to the chain action. A presenter-supplied label,
      digest, or mapping profile is insufficient.</t>
      <t>The candidate Canonical Action IDentifier specification defines
      a typed action object and the closed mapping verdicts
      EQUIVALENT_UNDER_PROFILE, NOT_EQUIVALENT, and INDETERMINATE. An AEC
      adapter may use that algorithm, but MUST treat NOT_EQUIVALENT and
      INDETERMINATE as unbound. AEC itself does not infer semantic
      equivalence and does not replace the native verifier.</t>
    </section>

    <section anchor="requirement"><name>Requirement expressions</name>
      <t>A requirement is a Boolean expression with the grammar:</t>
      <sourcecode type="abnf"><![CDATA[
expr     = term *(WS operator WS term)
term     = ident / "(" WS expr WS ")"
operator = "AND" / "OR" / "&&" / "||"
ident    = 1*(ALPHA / DIGIT / "." / ":" / "-" / "_")
WS       = *(SP / HTAB / CR / LF)
]]></sourcecode>
      <t>IDENT matches a component type in the satisfied set; an
      unknown identifier evaluates to false. Implementations MUST evaluate
      the expression with a bounded parser and MUST NOT use a
      general-purpose evaluator. AND and OR have EQUAL binding
      strength and are evaluated strictly left to right; implementations
      MUST NOT assume AND binds tighter than OR. Parentheses group
      explicitly and are the only precedence mechanism. Example: "ep-quorum AND (policy-permit
      OR delegation)" requires a human quorum plus either a policy permit
      or a delegation receipt, all bound to the same action.</t>
    </section>

    <section anchor="whose-requirement">
      <name>Whose requirement is it? (changed in -01)</name>
      <t>The chain document's "requirement" member is supplied by the
      PRESENTER of the chain. A presenter must never be able to choose
      its own sufficiency bar: a chain that says "delegation" satisfies
      itself, however weak, if the verifier takes the document's word
      for what suffices. This is the same confused-deputy class as a
      quorum policy read from the object it governs.</t>
      <t>Accordingly: a verifier MUST accept a requirement expression
      supplied out-of-band by the RELYING PARTY. The document's member
      is treated as a recorded claim only and MUST NOT produce SATISFIED. The
      result MUST record which source was evaluated
      (requirement_source: "relying_party" or "presenter"), and SHOULD
      note when a presenter requirement was ignored in favor of a
      pinned one. The document member is OPTIONAL descriptive metadata;
      omission MUST NOT weaken, replace, or prevent evaluation of the
      out-of-band relying-party requirement. If no relying-party
      requirement is supplied, the verifier MUST return UNSATISFIED whether or
      not the document member is present. The reference
      implementations (JavaScript, Python, Go) implement this behavior
      and agree on shared conformance vectors covering both sources,
      including <tt>reject_presenter_weak_bar_rp_bar_unsatisfied</tt> in
      the EP-AEC-ROLE-v1 suite, where the presenter's weak bar would pass
      and the relying party's pinned bar correctly fails.</t>
      <t>The generalization of this principle -- the entire sufficiency
      policy (requirement, freshness, revocation, required bindings)
      supplied by the relying party, with a purpose-relative classified
      verdict -- is specified in
      <xref target="I-D.schrock-ep-action-evidence-graph"/>.</t>
    </section>

    <section anchor="human-leg"><name>The human-authorization leg</name>
      <t>Human-authorization artifacts now exist in more than one
      ecosystem. A relying party that needs the EMILIA receipt or quorum
      guarantee can require the typed "ep-receipt" or "ep-quorum" leg
      explicitly while composing it with identity, delegation, permit, or
      other approval evidence. AEC does not infer that a generic policy
      decision or operator signature represents a named human ceremony.
      The built-in "ep-quorum" and "ep-receipt" verifiers are defined by
      <xref target="EP-QUORUM"/> and <xref target="EP-RECEIPTS"/>;
      all other component types and their trust inputs are supplied by
      the relying party.</t>
      <t>A generic operator signature is not a human ceremony. The
      "ep-receipt" built-in MUST accept only the Trust Receipt of
      <xref target="EP-RECEIPTS"/> Section 6.2 under a relying-party
      profile that pins the approver directory, Class-A key class,
      expected WebAuthn RP ID, an exact allowlist of accepted signed
      WebAuthn client-data origins, policy hash, log key, maximum
      evidence age, verification time, and a fresh registry snapshot. Every
      counted signoff MUST carry WebAuthn user presence and user
      verification and bind the pinned approver identity. A bare
      Ed25519 operator envelope MUST be unsatisfied for this type.</t>
      <t>The "ep-quorum" built-in MUST compare the presented quorum
      policy byte-for-byte to the relying-party-pinned policy and MUST
      pin the RP ID, an exact allowlist of accepted signed WebAuthn
      client-data origins, signed context policy, maximum evidence age,
      and each key-to-approver-to-role mapping. A safety-critical quorum
      profile MUST require at least two distinct humans. Ordered mode
      MUST require the signed predecessor chain defined by
      <xref target="EP-QUORUM"/>. An internally valid quorum under
      presenter-supplied keys or a weaker presenter-supplied policy is
      unsatisfied.</t>
      <t>For both built-ins, the relying-party directory snapshot MUST
      have an authenticated checked-at instant and maximum staleness.
      A key that is inactive, outside its validity window, revoked at
      the verification time, or absent from that fresh snapshot MUST
      be unsatisfied.</t>
    </section>

    <section anchor="bounded-capability-leg"><name>The bounded-capability operation leg</name>
      <t>A static bounded-capability receipt authorizes capability issuance and
      <bcp14>MUST NOT</bcp14> be treated as bound to every later exercise. It
      is therefore not an eligible component of an exercise chain merely
      because the proposed action falls within its scope.</t>
      <t>A <tt>bounded-capability-operation</tt> component is eligible only
      when its integrity-protected operation record binds the chain's exact
      action digest and its native verifier verifies the referenced capability
      receipt, issuance authorization, scope result, and operation record. AEC
      does not query or reserve current budget. A capability component
      <bcp14>MUST NOT</bcp14> satisfy <tt>ep-receipt</tt>,
      <tt>ep-quorum</tt>, or any human-authorization role.</t>
    </section>


    <section anchor="security"><name>Security Considerations</name>
      <t>Presenter-chosen sufficiency (fixed in -01). Prior to this
      revision the requirement was read only from the presented
      document, letting a presenter select the bar its own evidence
      would be judged against. Section
      "<xref target="whose-requirement"/>" closes this:
      relying-party-supplied requirements take precedence and the
      evaluated source is recorded. Deployments of -00 verifiers SHOULD
      upgrade or wrap verification with an out-of-band requirement
      check.</t>
      <t>Presenter-chosen action. Component agreement proves only that
      the components agree with each other. Without an executor-owned
      expected action, a presenter can construct a perfectly consistent
      chain for a different action. The relying party MUST compute the
      expected digest from the action at its own enforcement point and
      verification MUST fail closed when that input is absent.</t>
      <t>Cross-binding (action substitution). The core threat is splicing
      artifacts bound to different actions into one chain. Step 3c of
      <xref target="verify"/> defeats this by requiring every satisfied
      component to return the chain's exact canonical digest from
      integrity-protected native evidence. The strength
      of this defense rests entirely on the canonical digest being
      byte-identical across implementations; the I-JSON profile
      (<xref target="EP-RECEIPTS"/> Section 3) is therefore normative,
      and one restriction in it is load-bearing enough to restate here:
      canonical payloads MUST NOT contain non-integer numbers (amounts
      travel as strings). Within that restriction the reference
      canonicalizers coincide with RFC 8785 output; full RFC 8785
      number serialization (for payloads outside the profile) is an
      open conformance item, and implementations MUST reject payloads
      containing non-integer numbers rather than guess.</t>
      <t>Component verifier trust. A chain is only as sound as its weakest
      registered verifier and the keys it trusts. Relying parties MUST
      configure verifiers and trust anchors explicitly; an unconfigured
      type is unsatisfied, never assumed. Implementations MUST NOT allow
      application-supplied verifiers to replace the reserved
      "ep-receipt" or "ep-quorum" built-ins. An execution service MUST
      pin its custom verifier registry and verifier trust keys before it
      accepts a presented chain. It MUST NOT accept verifier code, trust
      keys, or human-acceptance profiles in the same transaction as
      presenter-controlled evidence; doing so lets the presenter define
      the proof that its own evidence must pass.</t>
      <t>Label and key-role confusion. Component labels are supplied by
      the presenter and MUST remain display-only. Human acceptance MUST
      be derived from the typed built-in verifier and its relying-party
      profile, not from a label, a key named inside the evidence, or a
      key trusted for another component type.</t>
      <t>WebAuthn origin confusion. Matching the authenticator-data RP ID
      hash is necessary but does not constrain the origin carried in the
      signed client data. A built-in human leg MUST decode the signed
      clientDataJSON, require a syntactically valid origin string, and
      compare it for exact membership in a non-empty relying-party
      allowlist. The allowlist MUST NOT be taken from the presented
      receipt or quorum. A missing or mismatched origin is unsatisfied.</t>
      <t>Requirement under-specification. A weak requirement yields a weak
      decision. Requirements SHOULD name every leg the relying party
      depends on, including the human leg where accountability is
      required.</t>
      <t>Freshness and revocation. EP-AEC composes point-in-time evidence;
      it does not by itself prove the absence of a later revocation. An
      SATISFIED decision using either built-in human leg MUST use an explicit
      verification time, a relying-party maximum age, and a fresh
      authenticated registry snapshot. Offline historical verification
      without those inputs MAY report cryptographic validity but MUST NOT
      return SATISFIED.</t>
      <t>One-time execution is stateful. An offline SATISFIED says that the
      evidence satisfied the relying party's inputs at a stated instant;
      it cannot prove that another executor has not already acted on the
      same authorization. A consequential executor MUST place a shared,
      atomic consumption store in the execution path, reserve the stable
      executor-computed action digest before the effect, and commit or
      conservatively freeze that reservation after the effect begins.
      The canonical action MUST therefore include a unique action-instance
      identifier or nonce whenever two otherwise identical effects may be
      independently authorized. Consumption MUST NOT be keyed by a
      presenter-selected component identifier: an invalid decoy component
      or an alternate valid proof could otherwise create a fresh replay key.
      A storage outage, ambiguous commit, or unavailable durable decision
      log MUST refuse or freeze execution; it MUST NOT fall back to an
      in-memory or stateless path. A committed consumption key MUST NOT
      expire while the action could be presented again. A production
      decision log MUST continue one atomically advanced shared head across
      replicas and restarts; a process-local hash chain streamed to a sink
      does not satisfy this requirement because it can fork or restart from
      genesis. A successful append response MUST be followed by immediate
      readback of the exact submitted sequence, predecessor, record identifier,
      and canonical content. The execution service MUST independently recompute
      the returned record hash and compare its non-chain fields exactly to the
      requested decision before acting. A backend
      that reports success without making the record observable creates an
      indeterminate outcome and execution MUST remain refused or frozen.</t>
      <t>Execution binding has a host-language boundary. An executor SHOULD
      clone and make immutable the expected Action Object before the first
      asynchronous storage or logging operation, and SHOULD pass only that
      snapshot to the effect adapter. This closes mutation-after-verification
      races inside the enforcement process. The effect adapter and every path
      to the physical or external effect remain part of the trusted computing
      base; EP-AEC cannot stop a privileged adapter from executing a different
      operation outside the gate.</t>
      <t>No transport assumptions. EP-AEC is a data structure; it inherits
      the confidentiality and integrity properties of whatever conveys it.
      It is fail-closed by construction (<xref target="verify"/>).</t>
    </section>

    <section anchor="relationship"><name>Relationship to Other Work</name>
      <t>EP-AEC is complementary to, and composes, the efforts in
      <xref target="intro"/>. It is the JSON/JCS analogue of the EAT
      <xref target="RFC9711"/> detached-bundle composition model and can
      itself be registered as a SCITT <xref target="SCITT"/> signed
      statement for transparency. It neither extends nor constrains
      <xref target="DRP"/>, <xref target="PERMIT"/>,
      <xref target="ACTA"/>, or <xref target="AGENTROA"/>; each plugs in
      as a component type.</t>
      <t>A Bounded Capability Receipt (<xref target="EP-BOUNDED-CAP"/>) can be
      recursively verified by a native bounded-capability-operation component.
      The static grant itself is not treated as bound to every exercise. EP-AEC
      does not query remaining budget, reserve funds, or promote
      <tt>SATISFIED</tt> to spend authority; those mutable state transitions
      remain at the enforcement point.</t>
    </section>

    <section anchor="iana"><name>IANA Considerations</name>
      <t>This document has no IANA actions. A future revision may request
      a media type (e.g. "application/ep-aec+json") and a registry of
      component type identifiers should the work be adopted.</t>
    </section>

    <section anchor="changes-03"><name>Changes in -03</name>
      <ul>
        <li>Made the relying-party requirement and executor-computed expected
        action mandatory acceptance inputs.</li>
        <li>Made presenter labels display-only and reserved the built-in human
        component verifiers against application override; stateful execution
        pins custom verifier and key registries before transaction input.</li>
        <li>Profiled the human legs as a fresh Class-A Trust Receipt or an exact
        distinct-human quorum under relying-party-pinned policy, audience,
        signed WebAuthn origin allowlist, identity-role directory, and active
        registry snapshot.</li>
        <li>Renamed the chain verdict from ALLOW/DENY to
        SATISFIED/UNSATISFIED and retained "allow" only as a compatibility
        alias in the reference APIs.</li>
        <li>Added profile-bounded material-action matching and removed effect
        and ceremony record definitions that belong in their own component
        specifications.</li>
        <li>Added bounded parsing, canonical-JSON resource limits, and
        fail-closed host-language exception handling requirements.</li>
        <li>Specified action-digest-keyed one-time execution, non-expiring
        committed keys, conservative indeterminate outcomes, immutable action
        snapshots, and atomic shared-head decision logging across replicas and
        restarts with exact successful-append readback and independently checked
        logger acknowledgments.</li>
        <li>Clarified the bounded-capability composition boundary: receipt and
        operation evidence can satisfy slots, while live budget reservation
        remains an executor-side state transition.</li>
      </ul>
    </section>

    <section anchor="impl"><name>Implementation Status</name>
      <t>A reference verifier and a runnable demonstration (composing a
      real EP human quorum with a policy-permit leg, and rejecting both a
      cross-binding attack and a missing human leg;
      examples/authorization-chain.mjs in the repository) are maintained
      as open-source software and are exercised offline, with no network
      dependency, by the reference suite's three language
      implementations (JavaScript, Python, Go), which agree on a shared
      conformance vector set. These are one project's implementations --
      a cross-language consistency check, not independently developed
      implementations; a third party has separately executed and
      verified the published artifacts against a pinned commit, as
      reported to the IETF SECDISPATCH mailing list on 23 June 2026.</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.8174.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7493.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8785.xml"/>
      <reference anchor="EP-RECEIPTS" target="https://datatracker.ietf.org/doc/draft-schrock-ep-authorization-receipts/">
        <front>
          <title>Authorization Receipts for High-Risk Agent Actions (EP)</title>
          <author fullname="Iman Schrock">
            <organization>EMILIA Protocol, Inc.</organization>
          </author>
          <date year="2026" month="July"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-schrock-ep-authorization-receipts-07"/>
      </reference>
      <reference anchor="EP-QUORUM" target="https://datatracker.ietf.org/doc/draft-schrock-ep-quorum/">
        <front>
          <title>Multi-Party Quorum Authorization for High-Risk Agent Actions (EP-QUORUM)</title>
          <author fullname="Iman Schrock">
            <organization>EMILIA Protocol, Inc.</organization>
          </author>
          <date year="2026" month="June"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-schrock-ep-quorum"/>
      </reference>
    </references>
    <references>
      <name>Informative References</name>
      <reference anchor="I-D.schrock-ep-action-evidence-graph" target="https://datatracker.ietf.org/doc/draft-schrock-ep-action-evidence-graph/">
        <front>
          <title>Action Evidence Graphs and Evidence Policy Replay for High-Risk Agent Actions (EP-AEG)</title>
          <author fullname="Iman Schrock"><organization>EMILIA Protocol, Inc.</organization></author>
          <date year="2026" month="July"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-schrock-ep-action-evidence-graph-00"/>
      </reference>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9711.xml"/>
      <reference anchor="SCITT" target="https://datatracker.ietf.org/doc/draft-ietf-scitt-architecture/">
        <front>
          <title>An Architecture for Trustworthy and Transparent Digital Supply Chains</title>
          <author><organization>IETF SCITT WG</organization></author>
          <date year="2026"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-ietf-scitt-architecture"/>
      </reference>
      <reference anchor="DRP" target="https://datatracker.ietf.org/doc/draft-nelson-agent-delegation-receipts/">
        <front>
          <title>Delegation Receipt Protocol for AI Agent Authorization</title>
          <author fullname="R. Nelson"/>
          <date year="2026"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-nelson-agent-delegation-receipts"/>
      </reference>
      <reference anchor="PERMIT" target="https://datatracker.ietf.org/doc/draft-lee-orprg-permit-receipts/">
        <front>
          <title>Permit Receipts for Permit-Before-Commit Authorization of AI-Agent and Workload External Effects</title>
          <author fullname="Y. Lee"/>
          <date year="2026"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-lee-orprg-permit-receipts"/>
      </reference>
      <reference anchor="ACTA" target="https://datatracker.ietf.org/doc/draft-farley-acta-signed-receipts/">
        <front>
          <title>Signed Decision Receipts for Machine-to-Machine Access Control</title>
          <author fullname="A. Farley"/>
          <date year="2026"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-farley-acta-signed-receipts"/>
      </reference>
      <reference anchor="AGENTROA" target="https://datatracker.ietf.org/doc/draft-nivalto-agentroa-route-authorization/">
        <front>
          <title>Agent Route Origin Authorization (AgentROA)</title>
          <author fullname="Nivalto"/>
          <date year="2026"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-nivalto-agentroa-route-authorization"/>
      </reference>
      <reference anchor="DAAP" target="https://datatracker.ietf.org/doc/draft-mishra-oauth-agent-grants/">
        <front>
          <title>Delegated Agent Authorization Protocol (DAAP)</title>
          <author fullname="Mishra"/>
          <date year="2026"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-mishra-oauth-agent-grants"/>
      </reference>
      <reference anchor="ASQAV" target="https://datatracker.ietf.org/doc/draft-marques-asqav-compliance-receipts/">
        <front>
          <title>Compliance Profile of Signed Action Receipts for AI Agents</title>
          <author fullname="J. Marques"/>
          <date year="2026"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-marques-asqav-compliance-receipts"/>
      </reference>
      <reference anchor="EP-BOUNDED-CAP" target="https://datatracker.ietf.org/doc/draft-schrock-ep-bounded-capability-receipts/">
        <front>
          <title>Bounded Capability Receipts and Durable Spend Control for Agent Actions</title>
          <author fullname="Iman Schrock"/>
          <date year="2026" month="July"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-schrock-ep-bounded-capability-receipts-00"/>
      </reference>
    </references>
  </back>
</rfc>
