<?xml version="1.0" encoding="utf-8"?>
<!-- name="GENERATOR" content="github.com/mmarkdown/mmark Mmark Markdown Processor - mmark.miek.nl" -->
<rfc version="3" ipr="trust200902" docName="draft-noa-scitt-ai-agent-receipt-00" submissionType="IETF" category="info" xml:lang="en" xmlns:xi="http://www.w3.org/2001/XInclude" indexInclude="true">

<front>
<title abbrev="SCITT AI-Agent Action Receipts">A SCITT Profile for AI-Agent Action Receipts</title><seriesInfo value="draft-noa-scitt-ai-agent-receipt-00" stream="IETF" status="informational" name="Internet-Draft"></seriesInfo>
<author initials="T." surname="Toraman" fullname="Tora Toraman"><organization>NordenSoft</organization><address><postal><street></street>
</postal><email>hello@ordeliya.com</email>
</address></author><date/>
<area>Security</area>
<workgroup>SCITT</workgroup>
<keyword>SCITT</keyword>
<keyword>COSE</keyword>
<keyword>AI agent</keyword>
<keyword>receipt</keyword>
<keyword>provenance</keyword>
<keyword>policy</keyword>
<keyword>attestation</keyword>
<keyword>accountability</keyword>

<abstract>
<t>This document profiles the IETF SCITT (Supply Chain Integrity, Transparency, and Trust)
architecture for <strong>AI-agent action receipts</strong>: tamper-evident, signed, offline-verifiable
records of what an autonomous agent did, for which principal, under which policy, with what
verdict. Each receipt is a COSE_Sign1 Signed Statement (RFC 9052) over a canonical (RFC 8785 /
JCS) payload, hash-chained for ordering, and registrable in any SCITT Transparency Service to
obtain non-equivocation and tail-truncation properties a self-signed chain cannot provide
alone. The profile makes a deliberately NARROW, checkable claim — &quot;this is a tamper-evident,
signature-verifiable record of the action, principal, policy identity, and recorded verdict&quot; —
and explicitly does NOT claim that the agent was correct, safe, or wise, that the recorded
inputs were true or complete, or that any real-world outcome followed. A deterministic offline
policy-REPLAY capability (re-deriving the verdict from the recorded inputs) is named here as a
non-goal of this revision and is left to a separate companion profile.</t>
</abstract>

</front>

<middle>

<section anchor="introduction"><name>Introduction</name>
<t>Agent connectivity and orchestration standards (MCP, A2A) and agent runtimes leave the
<em>accountability</em> layer — a standardized, tamper-evident, non-repudiable record of an agent's
actions — open. OWASP classifies &quot;Lack of Audit and Telemetry&quot; (MCP08:2025) as CRITICAL, and
A2A explicitly states it &quot;does not address non-repudiation.&quot; Several recent efforts emit signed
PERMIT/DENY <em>decision</em> receipts for agent actions; what is missing is a single, SCITT-native,
COSE-based profile for <strong>per-action</strong> receipts that is (a) registrable in a Transparency
Service and (b) honest about exactly what a receipt does and does not prove.</t>
<t>This profile does NOT invent a new wire format. A receipt is a SCITT Signed Statement
(COSE_Sign1), so it verifies in any conforming COSE implementation and composes with any SCITT
Transparency Service.</t>

<section anchor="scope-and-the-adjacent-slot"><name>Scope and the adjacent slot</name>
<t>Two related SCITT-AI drafts occupy <em>different</em> slots: a EU AI Act Article 50 <em>disclosure</em>
profile (what content was generated and disclosed) and a <em>session-archive</em> format (a portable
bundle of a whole agent session). This profile is orthogonal to both: it defines the
<strong>per-action signed receipt</strong> — one COSE_Sign1 Signed Statement per agent action, carrying the
action, the principal, the policy identity, and the recorded verdict.</t>
</section>

<section anchor="relationship-to-other-work"><name>Relationship to other work</name>

<ul spacing="compact">
<li><strong>SCITT Architecture</strong> (draft-ietf-scitt-architecture): this is a Signed Statement profile;
it adds AI-agent-action semantics, not new transparency machinery.</li>
<li><strong>ACTA signed receipts</strong> (draft-farley-acta-signed-receipts): a custom-JSON receipt field
catalogue. {{equivalence}} gives a field-by-field mapping; this profile is SCITT-native
(COSE_Sign1) where ACTA requires an adapter to register.</li>
<li><strong>draft-dawkins-scitt-ai-article50</strong>, <strong>draft-stone-aivs</strong>, <strong>draft-marques-asqav</strong>,
<strong>draft-nivalto-agentroa</strong>: complementary; they target regulatory disclosure, session
archives, compliance-mapping, or route authorization respectively, not a per-action SCITT
receipt profile.</li>
<li><strong>draft-kamimura-scitt-vcp</strong>: a domain SCITT profile (algorithmic-trading audit) whose
structure this document follows.</li>
</ul>
</section>

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

<section anchor="terminology"><name>Terminology</name>

<ul spacing="compact">
<li><strong>Action receipt:</strong> a COSE_Sign1 Signed Statement attesting one agent action.</li>
<li><strong>Principal:</strong> the authority on whose behalf the action occurred (HUMAN, SERVICE, POLICY, or a
sandbox simulation marker).</li>
<li><strong>Policy:</strong> a deterministic, side-effect-free decision rule set with a stable content hash
(<tt>policyHash</tt>) used as its published identity.</li>
<li><strong>Identity manifest:</strong> an out-of-band, operator-vouched binding of <tt>agent.id</tt> to its
authorized key identifier(s) (<tt>kid</tt>), used to authenticate <em>which agent</em> acted, not merely
that a trusted key signed.</li>
<li><strong>Genesis-bound chain:</strong> a per-scope hash chain whose checkpoint authority is bound to the
key that opened the chain (sequence 0), so a re-heading attacker cannot substitute a foreign
checkpoint.</li>
<li><strong>Transparency Service (TS):</strong> as defined by the SCITT Architecture.</li>
</ul>
</section>

<section anchor="payload"><name>Receipt structure (payload)</name>
<t>The COSE_Sign1 payload is the RFC 8785 (JCS) canonical serialization of a JSON object. All
numbers MUST be integers (no floating-point); all strings MUST be Unicode NFC. The fields:</t>

<artwork><![CDATA[{
  "spec":   "noa.receipt/0.1",
  "id":     "<receipt id>",
  "ts":     "<RFC 3339 UTC timestamp>",
  "scope":  { "tenant": "<id>", "chain": "<chain id>" },
  "agent":  { "id": "<agent id>", "model": "<vendor/model|null>",
              "principal": "HUMAN|SERVICE|POLICY|SANDBOX_SIM" },
  "action": { "id": "<tool/action id>", "canonical": "<risk-table key>",
              "riskClass": "LOW|MEDIUM|HIGH|CRITICAL|IRREVERSIBLE",
              "paramsHash": "sha256:<hex>|hmac-sha256:<hex>",
              "reversible": <bool>, "rollbackRef": "<id|null>" },
  "governance": { "mode": "<governance mode>", "verdict": "<terminal verdict>",
                  "ruleId": "<id>",
                  "approval": { "by": "<approver>", "at": "<RFC 3339 UTC>" }|null,
                  "sandboxed": <bool> },
  "chain":  { "seq": <int>, "prevHash": "sha256:<hex>|null", "hash": "sha256:<hex>" }
}
]]></artwork>
<t>Receipts carry <strong>only hashes</strong> of action parameters and policy inputs, never raw prompts, tool
arguments, secrets, or other sensitive parameters (this aligns with the ACTA &quot;MUST NOT include
raw inputs&quot; rule). <tt>paramsHash</tt> MAY be <tt>hmac-sha256:&lt;hex&gt;</tt> with a tenant-scoped key where a
plain SHA-256 over a low-entropy value (an amount, an id, a boolean) would be guessable.</t>
<t><tt>chain.hash</tt> is computed as <tt>&quot;sha256:&quot; + SHA-256( JCS( receipt WITHOUT chain.hash AND WITHOUT
sig.value ) )</tt>. Receipts in one scope are linked by <tt>prevHash</tt>; <tt>prevHash</tt> is <tt>null</tt> only at the
genesis receipt (<tt>seq == 0</tt>).</t>
</section>

<section anchor="cose"><name>COSE Signed Statement profile</name>

<section anchor="protected-header"><name>Protected header</name>
<t>A receipt is a COSE_Sign1 (CBOR tag 18) Signed Statement. The protected header MUST contain:</t>

<ul spacing="compact">
<li><strong><tt>alg</tt> (label 1) = <tt>-19</tt> (Ed25519)</strong> as registered in the IANA COSE Algorithms registry by
[RFC9864], Section 2.2 (the fully-specified Ed25519 identifier; RFC 8032 Section 5.1
parameter set). Issuers MUST use <tt>-19</tt>. Verifiers MUST reject any other <tt>alg</tt> value
(algorithm-confusion defense), and SHOULD reject the now-deprecated polymorphic <tt>EdDSA</tt>
identifier <tt>-8</tt> ([RFC9053]) unless a legacy-compatibility mode has been explicitly negotiated
out of band. The signing key MUST be an OKP key with <tt>crv = 6</tt> (Ed25519). [RFC9864] makes
<tt>alg = -19</tt> self-disambiguating, so a verifier MUST NOT rely on the key's <tt>crv</tt> alone to
determine the algorithm.</li>
<li>A key identifier sufficient to resolve the verification key: <tt>kid</tt> (label 4), or a
certificate reference (<tt>x5t</tt> label 34 / <tt>x5chain</tt> label 33) where a PKI is used.</li>
</ul>
<t>The protected header SHOULD contain the <strong>CWT_Claims</strong> header parameter (label 15, [RFC9597])
carrying at least <tt>iss</tt> (issuer / the receipt-emitting authority) and <tt>sub</tt> (subject / the
<tt>scope.chain</tt> identifier), so that SCITT registration policies can be expressed over standard
CWT claims.</t>
<t>The protected header MUST use deterministic CBOR ([RFC8949], Section 4.2): shortest-form
integer encodings and sorted, unique map keys. Verifiers MUST reject non-canonical encodings.</t>
</section>

<section anchor="payload-binding"><name>Payload binding</name>
<t>The payload is the JCS serialization from {{payload}}, carried as the COSE_Sign1 payload (it
MAY be detached and conveyed out of band, in which case its SHA-256 is bound via the receipt's
<tt>chain.hash</tt>). The receipt's own signature is computed over a domain-separated preimage rather
than the bare payload digest, so a receipt signature cannot be replayed as a signature for any
other NOA object class; the domain tag is part of the reference construction.</t>
</section>
</section>

<section anchor="hash-chaining-and-completeness"><name>Hash-chaining and completeness</name>
<t>Each receipt carries a monotonic <tt>chain.seq</tt> (genesis = 0) and <tt>prevHash</tt>. A verifier checking a
range of receipts MUST verify: each <tt>prevHash</tt> equals the prior receipt's <tt>chain.hash</tt>; the
genesis receipt has <tt>prevHash == null</tt>; and, when a signed checkpoint is present, the checkpoint
authority is bound to the genesis key (the key authorized at <tt>seq == 0</tt>), so a foreign
checkpoint produced by a re-heading attacker is rejected. This profile detects in-band tampering
and tail truncation <em>within</em> a presented chain; it does NOT, by itself, detect <strong>equivocation</strong>
(an issuer signing two divergent chains) — that requires registration in a SCITT Transparency
Service or an equivalent external witness.</t>
</section>

<section anchor="identity-binding"><name>Identity binding</name>
<t><tt>agent.id</tt> is a signer-asserted label. To authenticate WHICH agent acted (not merely that a
trusted key signed), a verifier MAY be supplied an identity manifest binding <tt>agent.id</tt> to its
authorized <tt>kid</tt>(s). When a manifest is present, a receipt or checkpoint whose <tt>(agent.id,
sig.kid)</tt> pairing is not authorized MUST be rejected as UNTRUSTED. Without a manifest, attribution
is key-level only, and implementations MUST surface that limitation to the relying party.</t>
</section>

<section anchor="registration-in-a-transparency-service"><name>Registration in a Transparency Service</name>
<t>A receipt is a SCITT Signed Statement and MAY be submitted to a Transparency Service. The
Registration Policy for this profile is: the TS MUST verify the COSE_Sign1 signature; MUST verify
the protected header conforms to {{cose}} (an <tt>alg</tt> of <tt>-19</tt>, deterministic CBOR, a resolvable
key identifier); and SHOULD verify the <tt>CWT_Claims</tt> <tt>iss</tt>/<tt>sub</tt> against the registering
identity. On success the TS returns a Transparency Receipt that provides the non-equivocation and
inclusion properties a self-signed chain cannot provide alone.</t>
</section>

<section anchor="equivalence"><name>Relationship to ACTA signed receipts (equivalence)</name>
<t>draft-farley-acta-signed-receipts catalogues receipt fields in a custom JSON envelope (not
COSE_Sign1). The mapping to this SCITT-native profile:</t>
<table>
<thead>
<tr>
<th>ACTA field</th>
<th>This profile</th>
</tr>
</thead>

<tbody>
<tr>
<td><tt>type</tt></td>
<td><tt>action.canonical</tt> + <tt>governance.mode</tt></td>
</tr>

<tr>
<td><tt>issued_at</tt></td>
<td><tt>ts</tt></td>
</tr>

<tr>
<td><tt>issuer_id</tt></td>
<td>protected <tt>iss</tt> / <tt>agent.id</tt></td>
</tr>

<tr>
<td><tt>tool_name</tt></td>
<td><tt>action.id</tt></td>
</tr>

<tr>
<td><tt>decision</tt></td>
<td><tt>governance.verdict</tt></td>
</tr>

<tr>
<td><tt>reason</tt>/<tt>ruleId</tt></td>
<td><tt>governance.ruleId</tt></td>
</tr>

<tr>
<td><tt>policy_digest</tt></td>
<td>(reserved — defined in the companion replay profile)</td>
</tr>

<tr>
<td><tt>session_id</tt></td>
<td><tt>scope.chain</tt></td>
</tr>

<tr>
<td><tt>action_ref</tt></td>
<td><tt>action.paramsHash</tt></td>
</tr>

<tr>
<td><tt>sandbox_state</tt></td>
<td><tt>agent.principal</tt> (<tt>SANDBOX_SIM</tt>) + <tt>governance.sandboxed</tt></td>
</tr>

<tr>
<td>(raw inputs)</td>
<td><strong>prohibited</strong> — hash-only, identical stance</td>
</tr>
</tbody>
</table><t>ACTA receipts can be registered as SCITT Signed Statements only via an adapter; receipts in this
profile are COSE_Sign1 natively.</t>
</section>

<section anchor="policy-replay-is-out-of-scope-for-this-revision"><name>Policy-replay is OUT OF SCOPE for this revision</name>
<t>A deterministic, offline <strong>policy-REPLAY</strong> capability — a verifier re-running the in-force
policy over the recorded inputs to re-derive the recorded verdict, with no access to the agent,
model, or any service — is a distinct capability that this revision deliberately does NOT
specify. A separate companion profile will define the policy-commitment field(s) needed to
enable such a check; this revision does not carry them. The replay <em>construction</em> (the
deterministic evaluation grammar, operator set, evaluation order, input-commitment scheme, and
conformance vectors) is left to that separate companion profile and is not normative here.
Implementations MUST NOT represent a receipt under this profile as carrying a re-derivable
verdict.</t>
</section>

<section anchor="security-considerations"><name>Security Considerations</name>
<t>This profile attests exactly two things: (1) the record is tamper-evident and
signature-verifiable under the issuer's key; and (2) the recorded fields (action, principal,
policy identity, verdict) are bound into that signature. It does NOT attest that the recorded
inputs are true, complete, or timely (no capture-completeness); that the policy was adequate;
that no action occurred outside the instrumented boundary; that the agent was correct, safe, or
wise; or any real-world outcome. These non-goals are NORMATIVE: implementations and relying
parties MUST NOT imply the stronger claims from a receipt.</t>
<t>Equivocation, fork, and cross-chain tail-truncation are detectable only with an external witness
or a SCITT Transparency Service. Identity attribution above key level requires the out-of-band
identity manifest. Algorithm-confusion and key-confusion attacks are mitigated by the strict
<tt>alg = -19</tt> and pinned-curve requirements of {{cose}}. Raw prompts, tool arguments, and secrets
MUST NOT appear on a receipt; only hashes (optionally HMAC for low-entropy values) are carried.</t>
</section>

<section anchor="iana-considerations"><name>IANA Considerations</name>
<t>This document has no IANA actions in this revision. It uses the existing IANA COSE Algorithms
registry value <tt>-19</tt> (Ed25519) and the existing COSE/CWT header parameters. A future revision
MAY request registration of a media type for the action-receipt payload and/or of CWT or COSE
claims for the payload fields.</t>
</section>

</middle>

<back>

<section anchor="implementation-status"><name>Implementation status</name>
<t>This section is to be removed before publication as an RFC.</t>
<t>A zero-runtime-dependency reference implementation (signer, offline verifier, deterministic
CBOR, COSE_Sign1 profile, JCS canonicalizer, conformance vectors, and a second independent
verifier in another language) is available under the Apache-2.0 license at
<eref target="https://github.com/NordenSoft/noa">https://github.com/NordenSoft/noa</eref>. Two independent VERIFIERS currently agree byte-for-byte on
the receipt-chain conformance vectors; a second independent <em>signer/evaluator</em> and a shared
conformance vector pack are the interoperability bar this profile is working toward.</t>
<t>NOTE (alg migration): the current reference implementation emits the now-deprecated polymorphic
<tt>EdDSA</tt> identifier <tt>-8</tt> ([RFC9053], protected header bytes <tt>a10127</tt>). Migration to the
fully-specified <tt>-19</tt> ([RFC9864], protected header bytes <tt>a10132</tt>), with regenerated
cross-implementation conformance vectors, is in progress and is a precondition for any normative
revision.</t>
</section>

<section anchor="normative-references"><name>Normative References</name>

<artwork><![CDATA[[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119.
[RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words", BCP 14, RFC 8174.
[RFC8032] Josefsson, S. and I. Liusvaara, "Edwards-Curve Digital Signature Algorithm (EdDSA)", RFC 8032.
[RFC8785] Rundgren, A., Jordan, B., and S. Erdtman, "JSON Canonicalization Scheme (JCS)", RFC 8785.
[RFC8949] Bormann, C. and P. Hoffman, "Concise Binary Object Representation (CBOR)", STD 94, RFC 8949.
[RFC9052] Schaad, J., "CBOR Object Signing and Encryption (COSE): Structures and Process", STD 96, RFC 9052.
[RFC9053] Schaad, J., "CBOR Object Signing and Encryption (COSE): Initial Algorithms", RFC 9053.
[RFC9597] Looker, T. and M.B. Jones, "CBOR Web Token (CWT) Claims in COSE Headers", RFC 9597.
[RFC9864] Jones, M.B. and O. Steele, "Fully-Specified Algorithms for JOSE and COSE", RFC 9864.
[SCITT-ARCH] Birkholz, H., et al., "An Architecture for Trustworthy and Transparent Digital Supply Chains", draft-ietf-scitt-architecture.
]]></artwork>
</section>

<section anchor="informative-references"><name>Informative References</name>

<artwork><![CDATA[[ACTA] Farley, T., "ACTA Signed Receipts", draft-farley-acta-signed-receipts.
[SCITT-VCP] Kamimura, T., "A SCITT Profile for Verifiable Audit Trails in Algorithmic Trading", draft-kamimura-scitt-vcp.
[AI-ART50] Dawkins, V., "A SCITT Profile for EU AI Act Article 50 Transparency Receipts", draft-dawkins-scitt-ai-article50.
[AIVS] Stone, B., "AIVS: Agentic Integrity Verification Standard", draft-stone-aivs.
[OWASP-MCP] OWASP, "MCP Top 10 (MCP08:2025 — Lack of Audit and Telemetry)".
]]></artwork>
</section>

</back>

</rfc>
