<?xml version="1.0" encoding="utf-8"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude"
     ipr="trust200902"
     docName="draft-sahu-agent-action-receipts-00"
     category="info"
     submissionType="IETF"
     consensus="true"
     tocInclude="true"
     sortRefs="true"
     symRefs="true"
     version="3">

  <front>
    <title abbrev="Agent Action Receipts">Signed, Hash-Chained Action Receipts for AI Agents</title>
    <seriesInfo name="Internet-Draft" value="draft-sahu-agent-action-receipts-00"/>

    <author fullname="Nancy Sahu" initials="N." surname="Sahu">
      <organization>kriya native</organization>
      <address>
        <postal>
          <country>India</country>
        </postal>
        <email>nancysahu@kriyanative.com</email>
      </address>
    </author>

    <date year="2026" month="August" day="16"/>

    <area>Security</area>
    <keyword>AI agents</keyword>
    <keyword>audit</keyword>
    <keyword>non-repudiation</keyword>
    <keyword>tamper-evidence</keyword>
    <keyword>receipts</keyword>

    <abstract>
      <t>This document specifies a format for action receipts: compact, individually
      signed JSON records that state that a specific AI agent attempted a specific action
      at a specific time, under a specific policy decision, and what the outcome was.
      Receipts are linked into an append-only hash chain so that deletion, insertion,
      reordering, or modification of any previously recorded receipt is detectable by a
      verifier that holds only the records and the signer's public key.</t>

      <t>The format is deliberately small and self-contained. Verification requires no
      network access, no service operated by the producer of the receipts, and no state
      beyond the records themselves and a trust anchor obtained out of band. This document
      specifies the record fields, the canonical byte sequence that is signed, the chain
      linkage rule, the verification procedure, and test vectors.</t>
    </abstract>
  </front>

  <middle>

    <section anchor="introduction">
      <name>Introduction</name>
      <t>Software agents built on large language models now take consequential actions on
      behalf of organizations: they deploy code, modify databases, send messages, install
      dependencies, and initiate payments. Organizations deploying such agents are
      increasingly required to answer, after the fact, a narrow and concrete question:
      what did this agent do, under whose authority, and can that answer be checked by
      someone who does not trust the party providing it.</t>

      <t>Existing telemetry does not answer that question. Application logs, distributed
      traces, and vendor audit consoles are written by, and mutable by, the same operator
      whose conduct is in question. A record that the operator can silently edit is
      evidence of intent, not evidence of fact. Regulatory instruments increasingly assume
      the existence of something stronger: <xref target="EU-AI-ACT"/> requires automatic
      recording of events over the lifetime of high-risk systems, and <xref
      target="ISO24970"/> specifies an information model for AI system logging, but
      neither prescribes an interoperable record format with integrity properties, and
      neither can be satisfied by a format that only its author can check.</t>

      <t>This document specifies such a format. It has three properties, in ascending
      order of what they cost to provide:</t>

      <ol>
        <li>Attributable. Each record carries a detached signature over its own canonical
        bytes, verifiable against a public key.</li>
        <li>Tamper-evident as a sequence. Each record commits to the exact bytes of the
        record before it, so that removing, inserting, reordering, or editing any earlier
        record invalidates the chain at a determinate position.</li>
        <li>Independently verifiable offline. Verification is a pure function of the
        records and a trust anchor. It requires no network, no service, and no cooperation
        from the party that produced the records.</li>
      </ol>

      <t>The third property is the design constraint that shapes the rest of the format.
      Deployments in regulated, disconnected, or air-gapped environments cannot rely on a
      transparency service being reachable, and auditors in adversarial settings cannot
      rely on one being honest. This document therefore specifies a format whose base
      verification is self-contained, and identifies (in <xref target="open-issues"/>) how
      external anchoring composes with it where such anchoring is available.</t>

      <section anchor="prior-art">
        <name>Relationship to Existing Work</name>
        <t>Signed records of agent actions are an active area with a substantial body of
        concurrent independent work. Neither hash-chaining such records, nor signing them
        with Ed25519, nor verifying them offline is novel to this document, and this
        section states plainly what is shared and what is not.</t>

        <t>Records that are individually signed and linked to their predecessor are
        specified in <xref target="I-D.farley-acta-signed-receipts"/> (optionally, as a
        commitment mode) and required in <xref
        target="I-D.marques-asqav-compliance-receipts"/>, which profiles it for regulatory
        use. <xref target="I-D.msebenzi-evidence-action"/> specifies an append-only chained
        evidence record recomputable without trusting the producing runtime, and <xref
        target="I-D.sharif-agent-audit-trail"/> specifies a newline-delimited JSON audit
        record with an equivalent linkage member. <xref
        target="I-D.noa-scitt-ai-agent-receipt"/> and <xref
        target="I-D.mih-scitt-agent-action-capsule"/> specify richer records carried as
        transparency-service statements while retaining an offline verification mode, and
        <xref target="I-D.emirdag-scitt-ai-agent-execution"/> specifies a per-record chain
        with sequence numbers alongside an independent custodian of the log.</t>

        <t>Against that body of work this document is distinguished by one construction and
        one constraint. The construction: the chain link is the digest of the previous
        record <em>as transmitted</em>, over its exact octets including its signature and
        including any member the verifier does not recognize (<xref target="chain"/>). Every
        other linkage cited above digests a re-canonicalization of the previous record, or
        of that record with its signature removed. Digesting the transmitted octets means
        chain verification is independent of agreement about canonicalization, requires no
        canonicalizer at all, and covers extension members that a re-canonicalized digest
        would exclude. The constraint: base verification is specified as a pure function of
        the records and a trust anchor, with no anchor, log, service, or timestamp
        authority anywhere in the required path, because the deployments this format serves
        may have none.</t>

        <t>This document specifies a record format, not an audit architecture. <xref
        target="I-D.kuehlewind-audit-architecture"/> describes an architecture for auditing
        agent delegation and interaction without specifying a wire format; the format here
        is intended to be usable as one concrete realization of records within such an
        architecture.</t>

        <t><xref target="RFC9943"/> specifies an architecture for supply-chain integrity,
        transparency, and trust, including transparency services that issue receipts for
        registered signed statements. That architecture and this format are complementary:
        the records specified here are self-anchored by default, and a transparency
        service can additionally anchor chain heads where one is available and trusted.
        <xref target="open-issues"/> discusses this.</t>
      </section>
    </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>

      <t>The following terms are used:</t>

      <dl>
        <dt>Action:</dt>
        <dd>An operation an agent attempts that a deployment has chosen to record, such as
        executing a command, invoking a tool, or writing a file.</dd>

        <dt>Receipt:</dt>
        <dd>One signed JSON object recording one action, as specified in <xref
        target="receipt-object"/>.</dd>

        <dt>Receipt log:</dt>
        <dd>An ordered sequence of receipts produced by one signer, serialized as
        newline-delimited JSON.</dd>

        <dt>Signer:</dt>
        <dd>The entity holding the private key. In deployments motivated by this document
        the signer is the enforcement point co-located with the agent, not the agent
        itself.</dd>

        <dt>Verifier:</dt>
        <dd>An entity that checks receipts. A verifier holds no private keys and needs no
        network access.</dd>
      </dl>
    </section>

    <section anchor="receipt-object">
      <name>Receipt Object</name>
      <t>A receipt is a JSON object <xref target="RFC8259"/>. The following members are
      defined.</t>

      <table>
        <name>Receipt members</name>
        <thead>
          <tr><th>Member</th><th>Type</th><th>Presence</th><th>Description</th></tr>
        </thead>
        <tbody>
          <tr><td>step_id</td><td>string</td><td>REQUIRED</td><td>Identifier for this action, unique within the log.</td></tr>
          <tr><td>action_id</td><td>string</td><td>REQUIRED</td><td>Identifier for the kind of action, for example a tool name or a namespaced decision identifier.</td></tr>
          <tr><td>params</td><td>any JSON value</td><td>REQUIRED</td><td>Structured detail about the action. See <xref target="privacy"/>.</td></tr>
          <tr><td>success</td><td>boolean</td><td>REQUIRED</td><td>Whether the action succeeded.</td></tr>
          <tr><td>ts_ms</td><td>number</td><td>REQUIRED</td><td>Time of the action as an integer count of milliseconds since 1970-01-01T00:00:00Z, host-asserted.</td></tr>
          <tr><td>actor</td><td>object</td><td>OPTIONAL</td><td>Attribution, with members agent (string) and user (string), in that order.</td></tr>
          <tr><td>prev_hash</td><td>string</td><td>OPTIONAL</td><td>Chain link, as specified in <xref target="chain"/>. Absent on the first receipt of a log.</td></tr>
          <tr><td>public_key</td><td>string</td><td>REQUIRED</td><td>The signer's Ed25519 public key, 32 octets, lowercase base16 <xref target="RFC4648"/>.</td></tr>
          <tr><td>signature</td><td>string</td><td>REQUIRED</td><td>Detached Ed25519 signature, 64 octets, lowercase base16 <xref target="RFC4648"/>.</td></tr>
        </tbody>
      </table>

      <t>A receipt MAY contain additional members. A verifier MUST ignore members it does
      not recognize, and MUST NOT include them in the signed byte sequence. This rule is
      what permits the format to be extended without invalidating deployed verifiers; an
      example extension is given in <xref target="extensions"/>.</t>

      <t>The members public_key and signature are carried in the receipt but are not
      themselves part of the signed byte sequence, for the obvious reason.</t>
    </section>

    <section anchor="canonical">
      <name>Canonical Byte Sequence</name>
      <t>The signature is computed over a canonical byte sequence derived from the
      receipt. The sequence is the UTF-8 encoding of a compact JSON serialization (no
      whitespace between tokens) of an object containing exactly the signed members,
      constructed as follows.</t>

      <t>The signed members appear in this fixed order, which is NOT lexicographic:</t>

      <ol>
        <li>step_id</li>
        <li>action_id</li>
        <li>params</li>
        <li>success</li>
        <li>ts_ms</li>
        <li>actor, omitted entirely if absent</li>
        <li>prev_hash, omitted entirely if absent</li>
      </ol>

      <t>Within params, and recursively within every JSON object nested inside params,
      member names MUST be sorted in ascending order by their Unicode code points. Array
      element order is semantic and MUST be preserved. Within actor, the members appear in
      the fixed order agent, then user; they are NOT sorted.</t>

      <t>Omission is total: an absent actor or prev_hash contributes no member name, no
      value, and no separator. A receipt with no actor therefore signs identically to how
      it would have signed had the member never been defined.</t>

      <t>Numbers MUST be serialized without exponent, without a leading plus sign, and
      without insignificant trailing zeros. Strings MUST be serialized using the shortest
      form permitted by <xref target="RFC8259"/>, escaping only those characters that
      <xref target="RFC8259"/> requires to be escaped, using lowercase hexadecimal in
      \uXXXX escapes.</t>

      <blockquote>
        <t>Note on two constructions. The outer member order above is fixed and
        non-lexicographic, while params is sorted. This asymmetry reflects deployed
        practice rather than aesthetics, and it is stated normatively here so that
        independent implementations agree byte-for-byte. <xref target="open-issues"/>
        records the question of whether a future revision should adopt <xref
        target="RFC8785"/> throughout.</t>
      </blockquote>

      <section anchor="interop">
        <name>Interoperability Constraints</name>
        <t>Implementations that construct or verify the canonical sequence MUST be able to
        reproduce these cases identically, and deployments SHOULD avoid the two
        constructions below until a future revision resolves them:</t>

        <ul>
          <li>Non-ASCII member names inside params. Sorting by Unicode code point and
          sorting by UTF-8 byte sequence agree for all code points; implementations that
          sort by UTF-16 code unit do not agree for code points above U+FFFF.</li>

          <li>Non-integer numbers anywhere in the signed members. Shortest-round-trip
          formatting of binary floating-point values differs between implementations.
          Deployments SHOULD represent quantities as integers in a stated minor unit, or
          as strings.</li>
        </ul>
      </section>
    </section>

    <section anchor="signature">
      <name>Signature</name>
      <t>The signature is a detached Ed25519 signature as specified in <xref
      target="RFC8032"/>, computed over the canonical byte sequence of <xref
      target="canonical"/>, encoded as 128 lowercase base16 characters <xref
      target="RFC4648"/>. The public key is encoded as 64 lowercase base16 characters. A
      verifier MUST reject a receipt whose public_key or signature is not of the exact
      expected length or contains characters outside the set 0-9 and a-f.</t>

      <t>Ed25519 is deterministic, so a receipt signed by any conforming implementation
      produces byte-identical signature octets. A verifier therefore need not know which
      cryptographic module produced a receipt in order to verify it.</t>
    </section>

    <section anchor="chain">
      <name>Chain Linkage</name>
      <t>A receipt log is a sequence of receipts serialized as newline-delimited JSON: one
      receipt per line, no line containing an unescaped newline.</t>

      <t>The first receipt of a log MUST NOT contain prev_hash. Every subsequent receipt
      MUST contain prev_hash, whose value is the SHA-256 digest <xref target="RFC6234"/>
      of the exact octets of the immediately preceding line, excluding its terminating
      newline, encoded as 64 lowercase base16 characters <xref target="RFC4648"/>.</t>

      <t>The digest is computed over the octets as serialized, including public_key and
      signature and including any member a verifier does not recognize. A verifier MUST
      NOT re-serialize, reformat, or normalize a line before computing its digest; doing
      so defeats the check.</t>

      <t>Because prev_hash is part of the canonical byte sequence, each signature
      transitively commits to every earlier line in the log.</t>
    </section>

    <section anchor="verification">
      <name>Verification</name>
      <t>Given a receipt log and a trust anchor, a verifier performs the following. The
      procedure requires no network access and no state beyond its inputs.</t>

      <t>For each line, in order:</t>

      <ol>
        <li>Parse the line as JSON. If parsing fails, record a failure at this position and
        stop treating subsequent prev_hash values as meaningful.</li>
        <li>Check that the required members of <xref target="receipt-object"/> are present
        and of the specified types.</li>
        <li>Reconstruct the canonical byte sequence per <xref target="canonical"/> from the
        parsed members.</li>
        <li>Verify the signature over that sequence using public_key.</li>
        <li>For the first line, check that prev_hash is absent. For every subsequent line,
        check that prev_hash equals the SHA-256 digest of the previous line's octets.</li>
        <li>Check that public_key matches the trust anchor for the expected signer.</li>
      </ol>

      <t>A verifier MUST report a failure at a determinate position rather than discarding
      the offending line, and MUST NOT report an overall success if any line failed. A
      line that is not a well-formed receipt MUST surface as a failure and MUST NOT be
      silently skipped: an unparseable or unsigned line inserted into a log is precisely
      the event the format exists to make visible.</t>

      <t>Step 6 is not optional. Steps 1 through 5 prove that a log is internally
      consistent and was produced by the holder of some key; only step 6 connects that key
      to an identity the verifier cares about. See <xref target="security"/>.</t>
    </section>

    <section anchor="extensions">
      <name>Extensions</name>
      <t>Additional members MAY be added to a receipt. Members that are not in the signed
      set of <xref target="canonical"/> are ignored by verifiers implementing this
      document, which allows deployments to carry correlation identifiers, source labels,
      or transport metadata without coordination.</t>

      <t>A member that must be integrity-protected cannot be added this way; it requires a
      profile that extends the signed set, and such a profile MUST specify its position in
      the canonical order.</t>

      <t>An example of an extension that requires no change to the signed set is a second
      signature over the same canonical bytes using a different algorithm, carried in
      additional members alongside the Ed25519 signature. A verifier that does not
      implement the second algorithm ignores those members and still obtains a correct
      Ed25519 verdict; a verifier that does implement it MUST reject a receipt in which
      those members are present but incomplete or inconsistent, since a partially-present
      second signature is indistinguishable from an attempt to strip it.</t>
    </section>

    <section anchor="security">
      <name>Security Considerations</name>
      <t>This format provides tamper-evidence, not tamper-proofing. The distinction is
      load-bearing and implementers are cautioned against describing it otherwise.</t>

      <t>A compromised signer can produce arbitrary receipts. The private key signs
      whatever it is given. An adversary who obtains the key, or who executes code with
      the signer's privileges, can produce a well-formed log of events that never
      happened, or re-sign an edited history from any point forward. Nothing in this
      document detects that. What the format provides is that such an adversary must
      possess the key: a party who holds only the records cannot alter them
      undetectably.</t>

      <t>Actions that were never recorded leave no trace. The chain proves that no
      recorded receipt was removed. It says nothing about actions the signer declined to
      record, whether by omission, misconfiguration, or suppression before signing. Claims
      of the form "this log shows everything the agent did" are not supported by this
      format; claims of the form "this log has not been altered since it was written"
      are.</t>

      <t>A log can be truncated at its end. Removing the most recent N receipts leaves a
      shorter but internally consistent chain, and no property of the presented records
      reveals the omission. This is a general limit of self-anchored chains rather than a
      property of this format: detecting head truncation requires state outside the log.
      The minimal such state is a signed head assertion carrying at least the chain
      identity, the record count, and the head digest, as described for append-only logs in
      <xref target="I-D.melegassi-opsawg-mvps-logging"/>; it may be counter-signed by an
      independent party, bound to a timestamp token <xref target="RFC3161"/>, committed to
      an external ledger <xref target="I-D.fassbender-scitt-time-anchor"/>, or registered
      with a transparency service <xref target="RFC9943"/>. Deployments that require
      truncation detection MUST provide such an anchor. This document deliberately does not
      require one, because the deployments it targets may have no reachable anchor at all;
      <xref target="open-issues"/> records the head assertion as work for a future
      revision.</t>

      <t>Key binding is out of scope. A valid signature proves the record was signed by the
      holder of the key in public_key, and nothing more. A verifier that omits step 6 of
      <xref target="verification"/> verifies only that an adversary is internally
      consistent. Trust anchors MUST be obtained through a channel independent of the
      log.</t>

      <t>Timestamps are asserted, not attested. The ts_ms member is the signer's clock
      reading. It is not evidence of time and MUST NOT be relied on where an adversary
      controls the host. Where bounded time is required, an external timestamp token <xref
      target="RFC3161"/> over chain heads provides an upper bound.</t>

      <t>One writer per chain. The linkage rule assumes a single writer appending to one
      log. Concurrent writers produce forks that verify individually but break the chain.
      Each signer SHOULD maintain its own log; merging across signers is a verifier-side
      concern and MUST NOT be done by rewriting lines.</t>

      <t>Canonicalization is an attack surface. An implementation that reconstructs the
      canonical sequence differently from the signer will report spurious failures; one
      that is lenient where the signer is strict may accept two distinct receipts as
      equivalent. The constraints in <xref target="canonical"/> exist for this reason and
      implementations SHOULD test against the vectors in <xref target="vectors"/>.</t>
    </section>

    <section anchor="privacy">
      <name>Privacy Considerations</name>
      <t>The params member is the one most likely to carry sensitive content, and
      deployments control what it contains. Receipts are evidence that an action occurred
      and how it was decided; they need not, and generally SHOULD NOT, contain the content
      the action operated on. Deployments SHOULD record identifiers, digests, counts, and
      decisions rather than payloads, prompts, message bodies, file contents, credentials,
      or personal data.</t>

      <t>This is not merely advice about hygiene. Receipts are designed to be retained for
      long periods, exported to auditors, and verified by parties outside the organization
      that produced them, so content placed in params propagates further and lives longer
      than content in ordinary logs. Where a receipt must commit to content, it SHOULD
      carry a digest of that content rather than the content itself.</t>

      <t>Where a deployment must retain a value rather than replace it with a digest, and
      disclose it to some verifiers but not others, a per-field selective-disclosure
      construction such as <xref target="I-D.mih-scitt-agent-action-capsule-sel-disc"/> can
      be applied to the params value. Such a construction changes the value of params and
      not the set of signed members, so it composes with this format without altering the
      signature or the chain: the chain link is computed over the transmitted octets
      whatever those octets contain. Chain linkage members MUST NOT be made concealable by
      any such profile.</t>

      <t>The actor member attributes an action to a named agent and user. Unless bound to
      an external identity system, these values are self-asserted by the signer and
      constitute attribution, not authentication. Deployments SHOULD treat them
      accordingly, and MAY omit actor entirely where attribution is not required.</t>
    </section>

    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>This document requests registration of the following media type in the "Media
      Types" registry.</t>

      <dl>
        <dt>Type name:</dt><dd>application</dd>
        <dt>Subtype name:</dt><dd>agent-receipt+json</dd>
        <dt>Required parameters:</dt><dd>N/A</dd>
        <dt>Optional parameters:</dt><dd>N/A</dd>
        <dt>Encoding considerations:</dt><dd>binary; the content is UTF-8 encoded JSON.</dd>
        <dt>Security considerations:</dt><dd>See <xref target="security"/> of this document.</dd>
        <dt>Interoperability considerations:</dt><dd>See <xref target="canonical"/> of this document.</dd>
        <dt>Published specification:</dt><dd>This document.</dd>
        <dt>Applications that use this media type:</dt><dd>AI agent governance, audit, and compliance tooling.</dd>
        <dt>Fragment identifier considerations:</dt><dd>N/A</dd>
        <dt>Person and email address to contact for further information:</dt><dd>The author of this document.</dd>
        <dt>Intended usage:</dt><dd>COMMON</dd>
        <dt>Author/Change controller:</dt><dd>IETF</dd>
      </dl>

      <t>Whether the action_id member warrants an IANA registry of namespaces is left
      open; see <xref target="open-issues"/>.</t>
    </section>

    <section anchor="impl-status">
      <name>Implementation Status</name>
      <t>This section records the implementation status of the format at the time of
      writing, in the spirit of <xref target="RFC7942"/>. It is intended to be removed
      before publication as an RFC.</t>

      <t>The format is implemented and deployed in commercially available software for
      macOS that records governed agent actions on end-user devices and in enterprise
      fleets. Four independent verifier implementations exist: a compiled implementation
      used by the producing software and by a standalone command-line auditor that holds
      no keys and makes no network calls; a second implementation in TypeScript using
      platform cryptography, used for browser-side verification; a self-contained HTML
      export that re-verifies its own embedded receipts with no network access; and the
      command-line auditor's bundle and range verification modes.</t>

      <t>The vectors in <xref target="vectors"/> were produced by one implementation and
      verified by another.</t>
    </section>

    <section anchor="open-issues">
      <name>Open Issues</name>
      <t>This section is intended to be removed before publication as an RFC.</t>

      <ul>
        <li>Canonicalization. Much concurrent work in this space uses <xref
        target="RFC8785"/>. The construction in <xref target="canonical"/> is what deployed
        implementations sign, and it permits a signer to emit a record in one pass without a
        canonicalizer; a future revision should either state that rationale normatively or
        adopt JCS and accept incompatibility with already-signed records. Note that the
        choice affects only the signature: chain linkage per <xref target="chain"/> is over
        transmitted octets and is unaffected either way.</li>

        <li>Domain separation. The signature is computed over the canonical bytes directly,
        with no protocol-identifying prefix. A future revision should consider a domain
        separation tag so that these bytes cannot be replayed as, or confused with, a
        signature in another protocol.</li>

        <li>Sequence numbers. Linkage alone detects modification, reordering, and removal of
        interior records, but cannot distinguish a gap from a duplicate position, and cannot
        express per-signer ordering independently of the file. Whether to add a monotonic
        sequence member to the signed set is open.</li>

        <li>Head assertions. A signed head object (chain identity, record count, head
        digest) addressing the truncation limit in <xref target="security"/>, together with
        the anchoring transports named there, for deployments that have somewhere to anchor
        it.</li>

        <li>The action_id namespaces. Whether cross-organization interoperability requires
        a registry, or whether unregistered reverse-DNS-style namespacing is sufficient. A
        useful precedent is a Specification Required registry that governs shared meaning
        while requiring verifiers to accept unregistered values, as used in <xref
        target="I-D.mih-scitt-agent-action-capsule"/>.</li>

        <li>Algorithm agility. Whether to specify a general signature-algorithm member
        rather than fixing Ed25519, and how such a member would interact with <xref
        target="canonical"/>.</li>

        <li>Relationship to logging standards. A mapping annex from these fields to the
        information model of <xref target="ISO24970"/>, to make the format usable as an
        implementation of that model. No published work in this space appears to have made
        such a mapping.</li>
      </ul>
    </section>

  </middle>

  <back>

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

      <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119">
        <front>
          <title>Key words for use in RFCs to Indicate Requirement Levels</title>
          <author initials="S." surname="Bradner" fullname="S. Bradner"/>
          <date year="1997" month="March"/>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="2119"/>
      </reference>

      <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174">
        <front>
          <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
          <author initials="B." surname="Leiba" fullname="B. Leiba"/>
          <date year="2017" month="May"/>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="8174"/>
      </reference>

      <reference anchor="RFC8259" target="https://www.rfc-editor.org/info/rfc8259">
        <front>
          <title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
          <author initials="T." surname="Bray" fullname="T. Bray" role="editor"/>
          <date year="2017" month="December"/>
        </front>
        <seriesInfo name="STD" value="90"/>
        <seriesInfo name="RFC" value="8259"/>
      </reference>

      <reference anchor="RFC8032" target="https://www.rfc-editor.org/info/rfc8032">
        <front>
          <title>Edwards-Curve Digital Signature Algorithm (EdDSA)</title>
          <author initials="S." surname="Josefsson" fullname="S. Josefsson"/>
          <author initials="I." surname="Liusvaara" fullname="I. Liusvaara"/>
          <date year="2017" month="January"/>
        </front>
        <seriesInfo name="RFC" value="8032"/>
      </reference>

      <reference anchor="RFC6234" target="https://www.rfc-editor.org/info/rfc6234">
        <front>
          <title>US Secure Hash Algorithms (SHA and SHA-based HMAC and HKDF)</title>
          <author initials="D." surname="Eastlake 3rd" fullname="D. Eastlake 3rd"/>
          <author initials="T." surname="Hansen" fullname="T. Hansen"/>
          <date year="2011" month="May"/>
        </front>
        <seriesInfo name="RFC" value="6234"/>
      </reference>

      <reference anchor="RFC4648" target="https://www.rfc-editor.org/info/rfc4648">
        <front>
          <title>The Base16, Base32, and Base64 Data Encodings</title>
          <author initials="S." surname="Josefsson" fullname="S. Josefsson"/>
          <date year="2006" month="October"/>
        </front>
        <seriesInfo name="RFC" value="4648"/>
      </reference>
    </references>

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

      <reference anchor="RFC8785" target="https://www.rfc-editor.org/info/rfc8785">
        <front>
          <title>JSON Canonicalization Scheme (JCS)</title>
          <author initials="A." surname="Rundgren" fullname="A. Rundgren"/>
          <author initials="B." surname="Jordan" fullname="B. Jordan"/>
          <author initials="S." surname="Erdtman" fullname="S. Erdtman"/>
          <date year="2020" month="June"/>
        </front>
        <seriesInfo name="RFC" value="8785"/>
      </reference>

      <reference anchor="RFC7942" target="https://www.rfc-editor.org/info/rfc7942">
        <front>
          <title>Improving Awareness of Running Code: The Implementation Status Section</title>
          <author initials="Y." surname="Sheffer" fullname="Y. Sheffer"/>
          <author initials="A." surname="Farrel" fullname="A. Farrel"/>
          <date year="2016" month="July"/>
        </front>
        <seriesInfo name="BCP" value="205"/>
        <seriesInfo name="RFC" value="7942"/>
      </reference>

      <reference anchor="RFC3161" target="https://www.rfc-editor.org/info/rfc3161">
        <front>
          <title>Internet X.509 Public Key Infrastructure Time-Stamp Protocol (TSP)</title>
          <author initials="C." surname="Adams" fullname="C. Adams"/>
          <author initials="P." surname="Cain" fullname="P. Cain"/>
          <author initials="D." surname="Pinkas" fullname="D. Pinkas"/>
          <author initials="R." surname="Zuccherato" fullname="R. Zuccherato"/>
          <date year="2001" month="August"/>
        </front>
        <seriesInfo name="RFC" value="3161"/>
      </reference>

      <reference anchor="RFC9943" target="https://www.rfc-editor.org/info/rfc9943">
        <front>
          <title>An Architecture for Trustworthy and Transparent Digital Supply Chains</title>
          <author initials="H." surname="Birkholz" fullname="H. Birkholz"/>
          <author initials="A." surname="Delignat-Lavaud" fullname="A. Delignat-Lavaud"/>
          <author initials="C." surname="Fournet" fullname="C. Fournet"/>
          <author initials="Y." surname="Deshpande" fullname="Y. Deshpande"/>
          <author initials="S." surname="Lasker" fullname="S. Lasker"/>
          <date year="2026" month="June"/>
        </front>
        <seriesInfo name="RFC" value="9943"/>
      </reference>

      <reference anchor="I-D.farley-acta-signed-receipts" target="https://datatracker.ietf.org/doc/draft-farley-acta-signed-receipts/">
        <front>
          <title>Signed Decision Receipts for Machine-to-Machine Access Control</title>
          <author initials="T." surname="Farley" fullname="Tom Farley"/>
          <date year="2026" month="June" day="28"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-farley-acta-signed-receipts-02"/>
      </reference>

      <reference anchor="I-D.marques-asqav-compliance-receipts" target="https://datatracker.ietf.org/doc/draft-marques-asqav-compliance-receipts/">
        <front>
          <title>Compliance Profile of Signed Action Receipts for AI Agents</title>
          <author initials="J. A. G." surname="Marques" fullname="Joao Andre Gomes Marques"/>
          <date year="2026" month="July" day="20"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-marques-asqav-compliance-receipts-07"/>
      </reference>

      <reference anchor="I-D.msebenzi-evidence-action" target="https://datatracker.ietf.org/doc/draft-msebenzi-evidence-action/">
        <front>
          <title>The evidence.* Family: Post-Hoc, Independently Recomputable Evidence Records for AI Agent Actions</title>
          <author initials="M." surname="Msebenzi" fullname="M. Msebenzi"/>
          <date year="2026" month="July" day="28"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-msebenzi-evidence-action-00"/>
      </reference>

      <reference anchor="I-D.sharif-agent-audit-trail" target="https://datatracker.ietf.org/doc/draft-sharif-agent-audit-trail/">
        <front>
          <title>Agent Audit Trail: A Standard Logging Format for Autonomous AI Systems</title>
          <author initials="R." surname="Sharif" fullname="R. Sharif"/>
          <date year="2026" month="March" day="29"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-sharif-agent-audit-trail-00"/>
      </reference>

      <reference anchor="I-D.noa-scitt-ai-agent-receipt" target="https://datatracker.ietf.org/doc/draft-noa-scitt-ai-agent-receipt/">
        <front>
          <title>A SCITT Profile for AI-Agent Action Receipts</title>
          <author initials="T." surname="Toraman" fullname="T. Toraman"/>
          <date year="2026" month="August" day="15"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-noa-scitt-ai-agent-receipt-01"/>
      </reference>

      <reference anchor="I-D.mih-scitt-agent-action-capsule" target="https://datatracker.ietf.org/doc/draft-mih-scitt-agent-action-capsule/">
        <front>
          <title>An Agent Action Capsule Profile for SCITT</title>
          <author initials="S." surname="Mih" fullname="S. Mih"/>
          <date year="2026" month="July" day="6"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-mih-scitt-agent-action-capsule-02"/>
      </reference>

      <reference anchor="I-D.mih-scitt-agent-action-capsule-sel-disc" target="https://datatracker.ietf.org/doc/draft-mih-scitt-agent-action-capsule-sel-disc/">
        <front>
          <title>Selective Disclosure Profile for Agent Action Capsules</title>
          <author initials="S." surname="Mih" fullname="S. Mih"/>
          <date year="2026" month="June" day="19"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-mih-scitt-agent-action-capsule-sel-disc-00"/>
      </reference>

      <reference anchor="I-D.emirdag-scitt-ai-agent-execution" target="https://datatracker.ietf.org/doc/draft-emirdag-scitt-ai-agent-execution/">
        <front>
          <title>AI Agent Execution Profile of SCITT</title>
          <author initials="P." surname="Emirdag" fullname="P. Emirdag"/>
          <date year="2026" month="April" day="13"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-emirdag-scitt-ai-agent-execution-00"/>
      </reference>

      <reference anchor="I-D.kuehlewind-audit-architecture" target="https://datatracker.ietf.org/doc/draft-kuehlewind-audit-architecture/">
        <front>
          <title>An Architecture for Auditing AI Agent Delegation and Interactions</title>
          <author initials="M." surname="Kuehlewind" fullname="M. Kuehlewind"/>
          <author initials="H." surname="Birkholz" fullname="H. Birkholz"/>
          <date year="2026" month="May" day="18"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-kuehlewind-audit-architecture-00"/>
      </reference>

      <reference anchor="I-D.melegassi-opsawg-mvps-logging" target="https://datatracker.ietf.org/doc/draft-melegassi-opsawg-mvps-logging/">
        <front>
          <title>The MVPS Operational Log Format: Append-Only, Hash-Chained, Externally-Anchored Audit Logs</title>
          <author initials="L." surname="Melegassi" fullname="L. Melegassi"/>
          <date year="2026" month="May" day="28"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-melegassi-opsawg-mvps-logging-00"/>
      </reference>

      <reference anchor="I-D.fassbender-scitt-time-anchor" target="https://datatracker.ietf.org/doc/draft-fassbender-scitt-time-anchor/">
        <front>
          <title>Bitcoin-Anchored Temporal Proof for Transparency Services</title>
          <author initials="J." surname="Fassbender" fullname="J. Fassbender"/>
          <date year="2026" month="July" day="24"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-fassbender-scitt-time-anchor-03"/>
      </reference>

      <reference anchor="EU-AI-ACT" target="https://eur-lex.europa.eu/eli/reg/2024/1689/oj">
        <front>
          <title>Regulation (EU) 2024/1689 laying down harmonised rules on artificial intelligence (Artificial Intelligence Act)</title>
          <author><organization>European Parliament and Council of the European Union</organization></author>
          <date year="2024" month="June"/>
        </front>
      </reference>

      <reference anchor="ISO24970" target="https://www.iso.org/standard/88723.html">
        <front>
          <title>Information technology - Artificial intelligence - AI system logging</title>
          <author><organization>ISO/IEC JTC 1/SC 42</organization></author>
          <date year="2026"/>
        </front>
        <seriesInfo name="ISO/IEC" value="FDIS 24970"/>
      </reference>
    </references>

    <section anchor="vectors">
      <name>Test Vectors</name>
      <t>The signing key below is a test key and MUST NOT be used for any other purpose.
      It is a 32-octet Ed25519 seed consisting of the octet 0x01 repeated 32 times.</t>

      <artwork><![CDATA[
seed:
0101010101010101010101010101010101010101010101010101010101010101
public_key:
8a88e3dd7409f195fd52db2d3cba5d72ca6709bf1d94121bf3748801b40f6f5c
]]></artwork>

      <section anchor="vector1">
        <name>Vector 1: Genesis Receipt</name>
        <t>Canonical byte sequence (UTF-8, no trailing newline; line-wrapped here for
        presentation only):</t>

        <artwork><![CDATA[
{"step_id":"01J8Z7QX9K","action_id":"kriya.gate.decision","params"
:{"class":"publish","rule_id":"npm-publish","tier":"approve"},"suc
cess":true,"ts_ms":1755300000000,"actor":{"agent":"claude-code","u
ser":"alice"}}
]]></artwork>

        <t>Note that params appears sorted (class, rule_id, tier) in the canonical sequence
        while the serialized line below carries the members in their original order, and
        that prev_hash is absent entirely.</t>

        <t>Serialized line:</t>

        <artwork><![CDATA[
{"step_id":"01J8Z7QX9K","action_id":"kriya.gate.decision","params"
:{"rule_id":"npm-publish","tier":"approve","class":"publish"},"suc
cess":true,"ts_ms":1755300000000,"actor":{"agent":"claude-code","u
ser":"alice"},"public_key":"8a88e3dd7409f195fd52db2d3cba5d72ca6709
bf1d94121bf3748801b40f6f5c","signature":"ab6afa750440d38f72dc5601f
45b1df918de60049b2accbb438dd909222f42755a534ee67e2eb1397f9d3ca6bd0
bf67f1ec078ecc60c08c92438acd2b7dc5802"}
]]></artwork>

        <t>SHA-256 of that line's octets, which is the prev_hash of vector 2:</t>

        <artwork><![CDATA[
18a2a79ac5e4dcc31172783a0f33efc1518d426c5cf0ccd24982d41c9aa3ee4c
]]></artwork>
      </section>

      <section anchor="vector2">
        <name>Vector 2: Chained Receipt</name>
        <t>Canonical byte sequence:</t>

        <artwork><![CDATA[
{"step_id":"01J8Z7QXB2","action_id":"kriya.gate.approval","params"
:{"approver":"alice","decision":"approved","rule_id":"npm-publish"
},"success":true,"ts_ms":1755300012000,"actor":{"agent":"claude-co
de","user":"alice"},"prev_hash":"18a2a79ac5e4dcc31172783a0f33efc15
18d426c5cf0ccd24982d41c9aa3ee4c"}
]]></artwork>

        <t>Serialized line:</t>

        <artwork><![CDATA[
{"step_id":"01J8Z7QXB2","action_id":"kriya.gate.approval","params"
:{"rule_id":"npm-publish","approver":"alice","decision":"approved"
},"success":true,"ts_ms":1755300012000,"actor":{"agent":"claude-co
de","user":"alice"},"prev_hash":"18a2a79ac5e4dcc31172783a0f33efc15
18d426c5cf0ccd24982d41c9aa3ee4c","public_key":"8a88e3dd7409f195fd5
2db2d3cba5d72ca6709bf1d94121bf3748801b40f6f5c","signature":"891dc8
8a6dc93507faca8d52eceb0baf107f325a1b3bb5c60e3e357cac86d6ccfd2a0bcf
3cee3b7237040483fe1b8c4f049fa72c6a59eb97a22d2c7e97d2cc02"}
]]></artwork>
      </section>

      <section anchor="vector3">
        <name>Vector 3: Detection of Modification</name>
        <t>Replacing the string alice with mallory in the actor.user member of vector 1
        produces a line whose signature verification fails, and whose SHA-256 digest no
        longer equals the prev_hash of vector 2. A conforming verifier reports a signature
        failure at line 1 and a chain break at line 2.</t>
      </section>
    </section>

    <section anchor="acknowledgments" numbered="false">
      <name>Acknowledgments</name>
      <t>A considerable body of concurrent independent work established signed records of
      agent actions as a subject worth specifying, and sharpened the problem statement this
      document responds to. The author thanks the authors of that work, cited throughout
      and surveyed in <xref target="prior-art"/>, and notes that the convergence of several
      unrelated efforts on similar constructions is itself evidence that the requirement is
      real.</t>
    </section>

  </back>
</rfc>
