<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.35 (Ruby 3.2.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-farley-acta-signed-receipts-03" category="info" version="3" submissionType="independent">
  <!-- xml2rfc v2v3 conversion 3.33.0 -->
  <front>
    <title abbrev="Acta Signed Receipts">Signed Decision Receipts for Machine-to-Machine Access Control</title>
    <seriesInfo name="Internet-Draft" value="draft-farley-acta-signed-receipts-03"/>
    <author initials="T." surname="Farley" fullname="Tom Farley">
      <organization>ScopeBlind (Veritas Acta)</organization>
      <address>
        <email>tom@scopeblind.com</email>
      </address>
    </author>
    <date year="2026" month="August" day="29"/>
    <area>Security</area>
    <workgroup>Independent</workgroup>
    <keyword>MCP</keyword>
    <keyword>receipts</keyword>
    <keyword>Ed25519</keyword>
    <keyword>access-control</keyword>
    <keyword>AI agents</keyword>
    <abstract>
      <?line 41?>

<t>This document defines a portable, cryptographically signed receipt
format for recording machine-to-machine access control decisions.
Each receipt captures the identity of the decision maker, the tool
or resource being accessed, the policy evaluation result, and a
timestamp. All of these are signed with Ed25519 <xref target="RFC8032"/> and serialized using
deterministic JSON canonicalization <xref target="RFC8785"/>.</t>
      <t>The format is designed for environments where AI agents invoke tools
on behalf of human operators, particularly the Model Context Protocol
(MCP) ecosystem. Receipts are independently verifiable without
contacting the issuer, enabling offline audit, regulatory compliance,
and cross-organizational trust federation.</t>
    </abstract>
  </front>
  <middle>
    <?line 56?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>As AI agents increasingly act autonomously (invoking tools, accessing
APIs, and modifying state), there is a growing need for cryptographic
evidence of what decisions were made, by whom, and under what policy.</t>
      <t>Current approaches rely on centralized logging (e.g., CloudWatch, SIEM
ingestion), which requires trust in the log operator and provides no
independent verifiability. A compromised or malicious operator can
silently alter or omit log entries.</t>
      <t>This specification defines a <strong>Signed Decision Receipt</strong> format that
provides:</t>
      <ol spacing="normal" type="1"><li>
          <t><strong>Portable evidence</strong>: Receipts are self-contained JSON objects
that can be stored, transmitted, and verified independently.</t>
        </li>
        <li>
          <t><strong>Cryptographic integrity</strong>: Each receipt is signed using Ed25519
(RFC 8032), ensuring tamper detection without PKI infrastructure.</t>
        </li>
        <li>
          <t><strong>Offline verification</strong>: Any party with the issuer's public key
can verify a receipt without network access or API calls.</t>
        </li>
        <li>
          <t><strong>Minimal disclosure</strong>: Receipts capture the decision metadata
(tool name, decision, tier, timestamp) without logging raw request
payloads, prompts, or sensitive parameters.</t>
        </li>
      </ol>
      <section anchor="relationship-to-mcp">
        <name>Relationship to MCP</name>
        <t>The Model Context Protocol <xref target="MCP"/> defines a JSON-RPC transport for
AI tool invocation but provides no built-in access control, auditing,
or accountability mechanism. This specification is designed to be
deployed at the MCP transport layer (typically as a stdio proxy)
without modifications to the MCP protocol itself.</t>
        <t>This specification is complementary to <xref target="I-D.serra-mcp-discovery-uri"/>,
which defines the mcp:// URI scheme and server discovery mechanism.
Discovery (how an agent finds a server) and accountability (what gets
recorded after the agent uses it) are independently deployable layers.
A server's discovery manifest MAY declare a trust_class that informs
receipt-generating proxies of the server's operating context
(e.g., "regulated"), enabling jurisdiction-aware policy evaluation
without encoding legal regime information in the receipt itself.</t>
      </section>
      <section anchor="terminology">
        <name>Terminology</name>
        <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
"OPTIONAL" in this document are to be interpreted as described in
BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they appear in all
capitals, as shown here.</t>
      </section>
    </section>
    <section anchor="receipt-structure">
      <name>Receipt Structure</name>
      <t>A Signed Decision Receipt is a JSON object with two top-level fields:
<tt>payload</tt> and <tt>signature</tt>.</t>
      <section anchor="signed-envelope">
        <name>Signed Envelope</name>
        <artwork><![CDATA[
{
  "payload": { ... },
  "signature": {
    "alg": "EdDSA",
    "kid": "<issuer-identifier>",
    "sig": "<hex-encoded-ed25519-signature>"
  }
}
]]></artwork>
      <t>This is the envelope shape, and it is the shape new implementations
<bcp14>SHOULD</bcp14> emit. A second, flat shape carries the payload fields
at the top level alongside a <tt>signature</tt> member that is a hexadecimal
string. It predates the envelope and remains in use. The two shapes are
signed over different byte strings, and an implementation
<bcp14>MUST</bcp14> determine which shape it is handling before computing or
checking a signature; see <xref target="signature-scope"/>. Except where a
shape is named explicitly, the remainder of this document describes the
envelope shape.</t>
        <section anchor="signature-object">
          <name>Signature Object</name>
          <dl>
            <dt>alg (REQUIRED):</dt>
            <dd>
              <t>The signature algorithm. The mandatory-to-implement
algorithm is "EdDSA" for Ed25519 as defined in <xref target="RFC8032"/>.
Implementations <bcp14>MAY</bcp14> additionally support "ES256" (ECDSA
with P-256 and SHA-256) to accommodate systems that use P-256 keys
natively. Verifiers <bcp14>MUST</bcp14> support "EdDSA" and
<bcp14>SHOULD</bcp14> support "ES256". This list is not closed; see
<xref target="algorithm-agility"/> for registered values and
for the algorithms recommended for new deployments.</t>
            </dd>
            <dt>kid (REQUIRED):</dt>
            <dd>
              <t>The key identifier of the signing key. This is an opaque string
that SHOULD resolve to a public key via a well-known endpoint
or out-of-band distribution. The RECOMMENDED format is
<tt>sb:issuer:&lt;base58-fingerprint&gt;</tt> where the fingerprint is the
first 12 characters of the Base58-encoded Ed25519 public key.</t>
            </dd>
            <dt>sig (REQUIRED):</dt>
            <dd>
              <t>The signature over the signing input defined in
<xref target="signature-scope"/>, encoded as a lowercase hexadecimal
string. The encoded length is determined by the algorithm named in
<tt>alg</tt> and is not fixed by this document: Ed25519 produces 64
bytes and therefore 128 hexadecimal characters, while other registered
algorithms produce other lengths. Verifiers <bcp14>MUST NOT</bcp14>
reject a signature on encoded length alone.</t>
            </dd>
          </dl>
        </section>
      </section>
      <section anchor="payload">
        <name>Payload</name>
        <t>The payload is a JSON object whose schema depends on the receipt
type. This section lists the members common to all payload types. Members
specific to one receipt type are defined with that type in
<xref target="receipt-types"/>. A member defined elsewhere in this document
that may appear in any payload type is listed here.</t>
        <dl>
          <dt>type (REQUIRED):</dt>
          <dd>
            <t>A namespaced string identifying the receipt type.
Examples: <tt>"protectmcp:decision"</tt>, <tt>"protectmcp:restraint"</tt>,
<tt>"blindllm:arena-battle"</tt>.</t>
          </dd>
          <dt>issued_at (REQUIRED):</dt>
          <dd>
            <t>ISO 8601 timestamp <xref target="RFC3339"/> of when the receipt was created.
MUST include timezone designator (typically "Z" for UTC).</t>
          </dd>
          <dt>issuer_id (REQUIRED):</dt>
          <dd>
            <t>The identifier of the entity that issued and signed the receipt.
MUST match the <tt>kid</tt> field in the signature object.</t>
          </dd>
          <dt>previousReceiptHash (OPTIONAL):</dt>
          <dd>
            <t>A link to the immediately preceding receipt in a receipt chain,
present at most once. When present it <bcp14>MUST</bcp14> be a member of
the payload object, not of the enclosing receipt object, and its value
<bcp14>MUST</bcp14> be computed as specified in
<xref target="chain-hash-scope"/>.</t>
            <t>The first receipt in a chain <bcp14>MUST</bcp14> omit the member
entirely rather than carrying <tt>null</tt> or an empty string, which
would produce different JCS output and therefore a different signature.
A receipt that omits it is either a chain genesis or an unchained
receipt; the format does not distinguish these, and a verifier
<bcp14>MUST NOT</bcp14> infer chain membership from its absence.</t>
          </dd>
          <dt>evidence (OPTIONAL):</dt>
          <dd>
            <t>The evidentiary basis the decision rested on, as defined in
<xref target="evidence-predicate"/>. When present it <bcp14>MUST</bcp14> be an
array. A verifier that does not implement the predicate
<bcp14>MUST</bcp14> still verify the receipt signature and chain, and
<bcp14>MUST</bcp14> ignore this member otherwise.</t>
          </dd>
          <dt>committed_fields_root (OPTIONAL):</dt>
          <dd>
            <t>The Merkle root committing to selectively disclosable fields, as
defined in <xref target="commitment-mode"/>. Present only in commitment mode.
A verifier that does not implement commitment mode <bcp14>MUST</bcp14> ignore
this member when verifying the signature, though the member remains covered by
that signature.</t>
          </dd>
          <dt>payload_digest (OPTIONAL):</dt>
          <dd>
            <t>A content-addressable hash of associated data (tool input, tool
output, or other large payloads) that is too large to embed in
the receipt. Format: an object containing <tt>hash</tt> (SHA-256 hex
string), <tt>size</tt> (byte count), and optionally <tt>preview</tt> (first
256 characters). Enables integrity verification of associated
data without embedding it in the receipt.</t>
          </dd>
          <dt>hook_latency_ms (OPTIONAL):</dt>
          <dd>
            <t>The time in milliseconds spent evaluating the policy decision.
Enables operators to verify that security middleware adds
negligible overhead (&lt;5ms is RECOMMENDED for synchronous
policy checks).</t>
          </dd>
          <dt>tool_duration_ms (OPTIONAL):</dt>
          <dd>
            <t>The time in milliseconds between the initiation and completion
of the tool invocation. Present only in post-execution receipts.</t>
          </dd>
          <dt>sandbox_state (OPTIONAL):</dt>
          <dd>
            <t>Whether the execution environment had OS-level containment
active at the time of the decision. One of: <tt>"enabled"</tt>,
<tt>"disabled"</tt>, <tt>"unavailable"</tt>. Enables auditors to verify that
agent actions occurred within a sandboxed environment.</t>
          </dd>
          <dt>action_ref (OPTIONAL):</dt>
          <dd>
            <t>A cross-engine correlation anchor: the SHA-256 hash of the
canonical representation of the action being evaluated. When
two or more governance engines evaluate the same action
independently, both receipts carry the same <tt>action_ref</tt>,
enabling bilateral verification without either engine needing
to trust the other.
</t>
            <t>The computation is:</t>
            <artwork><![CDATA[
action_ref = SHA-256(canonicalize({
  agentId,
  actionType,
  scopeRequired,
  timestamp
}))
]]></artwork>
            <t>where <tt>canonicalize</tt> follows RFC 8785 (JCS) and <tt>scopeRequired</tt>
is sorted lexicographically before canonicalization. The
resulting hex string is deterministic: same inputs produce the
same hash regardless of implementation language.</t>
            <t>This field is RECOMMENDED when the receipt will be consumed by
external governance frameworks or cross-engine audit tools.</t>
          </dd>
          <dt>iteration_id (OPTIONAL):</dt>
          <dd>
            <t>A logical iteration grouping identifier for multi-step agent
workflows. When an agent runs in an optimization loop or a
multi-round deliberation, receipts within the same iteration
share the same <tt>iteration_id</tt>. This enables behavioral analysis
tools to group receipts by logical iteration rather than by
receipt count.
</t>
            <t>The value is an opaque string. Hierarchy may be encoded by
convention using dot-separated segments (e.g., "run_7.sub_3"
encodes a nested iteration at depth 2). The field is
agent-declared metadata for grouping purposes, NOT a security
boundary: a malicious agent could set misleading values.
Receipt signatures cover this field (tamper-evident) but do
not vouch for its semantic accuracy.</t>
          </dd>
        </dl>
      </section>
    </section>
    <section anchor="receipt-types">
      <name>Receipt Types</name>
      <t>This specification defines six receipt types. Implementations MAY
define additional types using the namespaced <tt>type</tt> field.</t>
      <section anchor="access-decision-receipt">
        <name>Access Decision Receipt</name>
        <t>Type: <tt>protectmcp:decision</tt></t>
        <t>Records the outcome of a policy evaluation for a tool invocation.</t>
        <artwork><![CDATA[
{
  "type": "protectmcp:decision",
  "tool_name": "delete_database",
  "decision": "deny",
  "reason": "tier_insufficient",
  "agent_tier": "signed-known",
  "required_tier": "privileged",
  "policy_digest": "sha256:a8f3...c91e",
  "session_id": "ses_7f8a2b",
  "issued_at": "2026-03-22T14:32:04.102Z",
  "issuer_id": "sb:issuer:4Kpm7Q3wXx2b"
}
]]></artwork>
        <section anchor="fields">
          <name>Fields</name>
          <dl>
            <dt>tool_name (REQUIRED):</dt>
            <dd>
              <t>The name of the tool being invoked, as declared in the MCP
<tt>tools/list</tt> response.</t>
            </dd>
            <dt>decision (REQUIRED):</dt>
            <dd>
              <t>The policy evaluation result. One of: <tt>"allow"</tt>, <tt>"deny"</tt>,
<tt>"rate_limit"</tt>, <tt>"require_approval"</tt>. The value
<tt>"require_approval"</tt> records that the action was held pending human
approval at decision time; the terminal outcome of the held action, if it
executes, is recorded in a subsequent receipt.</t>
            </dd>
            <dt>reason (OPTIONAL):</dt>
            <dd>
              <t>A machine-readable reason code for the decision.
Examples: <tt>"tier_insufficient"</tt>, <tt>"rate_exceeded"</tt>,
<tt>"policy_block"</tt>, <tt>"agent_refusal"</tt>.</t>
            </dd>
            <dt>agent_tier (OPTIONAL):</dt>
            <dd>
              <t>The trust tier of the requesting agent at the time of the
decision. One of: <tt>"unknown"</tt>, <tt>"signed-known"</tt>,
<tt>"evidenced"</tt>, <tt>"privileged"</tt>.</t>
            </dd>
            <dt>required_tier (OPTIONAL):</dt>
            <dd>
              <t>The minimum trust tier required by the policy for this tool.</t>
            </dd>
            <dt>policy_digest (OPTIONAL):</dt>
            <dd>
              <t>A content-addressable hash of the policy in effect at the
time of the decision. Format: <tt>"sha256:&lt;hex&gt;"</tt>, computed per
<xref target="policy-digest-construction"/>. A digest whose construction is
not published is an opaque label, not a commitment; see
<xref target="policy-publication"/>.</t>
            </dd>
            <dt>session_id (OPTIONAL):</dt>
            <dd>
              <t>An opaque identifier for the MCP session. MUST NOT contain
PII or be correlatable across sessions unless the operator
explicitly configures session binding.</t>
            </dd>
          </dl>
        </section>
      </section>
      <section anchor="restraint-receipt">
        <name>Restraint Receipt</name>
        <t>Type: <tt>protectmcp:restraint</tt></t>
        <t>Records an agent's interaction with a policy boundary, specifically
whether the agent attempted to use a restricted tool and whether the
restriction was enforced by an external policy or self-imposed.</t>
        <artwork><![CDATA[
{
  "type": "protectmcp:restraint",
  "agent_id": "sb:agent:8xKm3Qw2Yb1c",
  "agent_manifest_version": "1.2.0",
  "tool_name": "rm_rf",
  "decision": "deny",
  "denial_type": "policy-block",
  "issued_at": "2026-03-22T14:35:12.441Z",
  "issuer_id": "sb:issuer:4Kpm7Q3wXx2b"
}
]]></artwork>
        <section anchor="fields-1">
          <name>Fields</name>
          <dl>
            <dt>agent_id (REQUIRED):</dt>
            <dd>
              <t>The identifier of the agent whose tool call was evaluated.</t>
            </dd>
            <dt>agent_manifest_version (REQUIRED):</dt>
            <dd>
              <t>The semantic version of the agent's manifest at the time of
the decision.</t>
            </dd>
            <dt>tool_name (REQUIRED):</dt>
            <dd>
              <t>The tool that was called or attempted.</t>
            </dd>
            <dt>decision (REQUIRED):</dt>
            <dd>
              <t>One of: <tt>"allow"</tt>, <tt>"deny"</tt>.</t>
            </dd>
            <dt>denial_type (OPTIONAL):</dt>
            <dd>
              <t>If the decision is <tt>"deny"</tt>, indicates whether the denial was
imposed by external policy (<tt>"policy-block"</tt>) or self-imposed
by the agent (<tt>"agent-refusal"</tt>).</t>
            </dd>
          </dl>
        </section>
      </section>
      <section anchor="arena-battle-receipt">
        <name>Arena Battle Receipt</name>
        <t>Type: <tt>blindllm:arena-battle</tt></t>
        <t>Records the outcome of a competitive evaluation between two AI agents,
as conducted by a neutral arena platform.</t>
        <artwork><![CDATA[
{
  "type": "blindllm:arena-battle",
  "battle_id": "bat_9x8f7a2b",
  "lane_id": "lane_creative_writing",
  "agent_a": {
    "id": "sb:agent:3mK9pQ7wXx2b",
    "manifest_version": "2.1.0"
  },
  "agent_b": {
    "id": "sb:agent:8xKm3Qw2Yb1c",
    "manifest_version": "1.4.0"
  },
  "winner": "A",
  "issued_at": "2026-03-22T15:00:00.000Z",
  "issuer_id": "sb:issuer:4Kpm7Q3wXx2b"
}
]]></artwork>
        <section anchor="fields-2">
          <name>Fields</name>
          <dl>
            <dt>battle_id (REQUIRED):</dt>
            <dd>
              <t>Unique identifier for the battle instance.</t>
            </dd>
            <dt>lane_id (REQUIRED):</dt>
            <dd>
              <t>The evaluation category or "lane" in which the battle occurred.</t>
            </dd>
            <dt>agent_a, agent_b (REQUIRED):</dt>
            <dd>
              <t>Objects identifying each participant, containing:
- <tt>id</tt>: The agent's passport identifier.
- <tt>manifest_version</tt>: The agent's manifest version at battle time.</t>
            </dd>
            <dt>winner (REQUIRED):</dt>
            <dd>
              <t>One of: <tt>"A"</tt>, <tt>"B"</tt>, <tt>"tie"</tt>.</t>
            </dd>
          </dl>
        </section>
      </section>
      <section anchor="agent-lifecycle-receipt">
        <name>Agent Lifecycle Receipt</name>
        <t>Type: <tt>protectmcp:lifecycle</tt></t>
        <t>Records agent lifecycle events in multi-agent orchestration systems
(swarms, coordinator mode, scheduled agents). Enables reconstruction
of the full agent topology from the receipt DAG.</t>
        <artwork><![CDATA[
{
  "type": "protectmcp:lifecycle",
  "lifecycle_event": "subagent_start",
  "agent_id": "worker-a1b",
  "agent_type": "general-purpose",
  "parent_session_id": "ses_7f8a2b",
  "team_name": "backend-ops",
  "sandbox_state": "enabled",
  "issued_at": "2026-04-01T10:15:00.000Z",
  "issuer_id": "sb:issuer:4Kpm7Q3wXx2b"
}
]]></artwork>
        <section anchor="fields-3">
          <name>Fields</name>
          <dl>
            <dt>lifecycle_event (REQUIRED):</dt>
            <dd>
              <t>One of: <tt>"subagent_start"</tt>, <tt>"subagent_stop"</tt>,
<tt>"session_start"</tt>, <tt>"session_end"</tt>, <tt>"task_created"</tt>,
<tt>"task_completed"</tt>, <tt>"teammate_idle"</tt>, <tt>"config_change"</tt>.</t>
            </dd>
            <dt>agent_id (OPTIONAL):</dt>
            <dd>
              <t>The identifier of the agent involved in the lifecycle event.</t>
            </dd>
            <dt>agent_type (OPTIONAL):</dt>
            <dd>
              <t>The type of agent (e.g., <tt>"coordinator"</tt>, <tt>"worker"</tt>,
<tt>"standalone"</tt>, <tt>"general-purpose"</tt>).</t>
            </dd>
            <dt>parent_session_id (OPTIONAL):</dt>
            <dd>
              <t>The session identifier of the parent/coordinator agent.
Creates a verifiable parent-child relationship in the DAG.</t>
            </dd>
            <dt>team_name (OPTIONAL):</dt>
            <dd>
              <t>The team or swarm name, if operating in multi-agent mode.</t>
            </dd>
          </dl>
        </section>
      </section>
      <section anchor="spending-authority-receipt">
        <name>Spending Authority Receipt</name>
        <t>Type: <tt>scopeblind:spending_authority</tt></t>
        <t>Records the outcome of an issuer-blind spending authorization check.
Proves that an agent's purchase is within authorized limits without
revealing organizational identity, budget ceiling, or delegation chain.</t>
        <artwork><![CDATA[
{
  "type": "scopeblind:spending_authority",
  "amount": 99.50,
  "currency": "USD",
  "category": "cloud_compute",
  "utilization_band": "low",
  "decision": "allow",
  "policy_digest": "sha256:a8f3...c91e",
  "issued_at": "2026-04-01T12:00:00.000Z",
  "issuer_id": "sb:issuer:4Kpm7Q3wXx2b"
}
]]></artwork>
        <section anchor="fields-4">
          <name>Fields</name>
          <dl>
            <dt>amount (REQUIRED):</dt>
            <dd>
              <t>The monetary amount of the transaction.</t>
            </dd>
            <dt>currency (REQUIRED):</dt>
            <dd>
              <t>ISO 4217 currency code (e.g., <tt>"USD"</tt>).</t>
            </dd>
            <dt>category (OPTIONAL):</dt>
            <dd>
              <t>A classification of the spending type (e.g.,
<tt>"cloud_compute"</tt>, <tt>"saas_subscription"</tt>, <tt>"api_usage"</tt>).</t>
            </dd>
            <dt>utilization_band (OPTIONAL):</dt>
            <dd>
              <t>A coarse indicator of budget utilization. One of: <tt>"low"</tt>
(&lt;25%), <tt>"medium"</tt> (25-75%), <tt>"high"</tt> (75-100%),
<tt>"exceeded"</tt>. The exact budget ceiling is NOT disclosed, only the
band. This prevents price discrimination while proving budget
compliance.</t>
            </dd>
            <dt>decision (REQUIRED):</dt>
            <dd>
              <t>One of: <tt>"allow"</tt>, <tt>"deny"</tt>.</t>
            </dd>
          </dl>
          <t>The receipt deliberately EXCLUDES: organization name, total budget
ceiling, exact remaining budget, agent identity, and delegation
chain. Verification uses VOPRF (<xref target="RFC9497"/>) to confirm receipt
validity without the verifier learning which organization issued it.</t>
        </section>
      </section>
      <section anchor="formal-debate-receipt">
        <name>Formal Debate Receipt</name>
        <t>Type: <tt>blindllm:formal-debate</tt></t>
        <t>Records the outcome of a structured debate with audience and judge
scoring. Extends the arena battle format with additional governance
fields.</t>
        <artwork><![CDATA[
{
  "type": "blindllm:formal-debate",
  "debate_id": "dbt_4f2a8c",
  "spec_id": "spec_ai_safety_v2",
  "lane_id": "lane_policy",
  "artifact_hash": "sha256:b3c4d5e6...",
  "resolution_hash": "sha256:f7a8b9c0...",
  "pro": {
    "id": "sb:agent:3mK9pQ7wXx2b",
    "manifest_version": "2.1.0"
  },
  "con": {
    "id": "sb:agent:8xKm3Qw2Yb1c",
    "manifest_version": "1.4.0"
  },
  "audience_winner": "pro",
  "judge_winner": "pro",
  "restraint_result": "clean",
  "issued_at": "2026-03-22T16:30:00.000Z",
  "issuer_id": "sb:issuer:4Kpm7Q3wXx2b"
}
]]></artwork>
      </section>
    </section>
    <section anchor="evidence-predicate">
      <name>Evidence Predicate</name>
      <t>An Access Decision Receipt records which decision was made and, via
<tt>policy_digest</tt>, under which policy. For high-stakes actions the
decision's evidentiary basis is itself material: was the action cleared because
data-rights were satisfied, provenance verified, and compliance posture fresh, or
held because one of those failed? The OPTIONAL <tt>evidence</tt> field records
that basis. It is defined here for the Access Decision Receipt; other receipt
types MAY carry it with the same semantics.</t>
      <artwork><![CDATA[
"evidence": [
  { "dimension": "data_rights", "state": "satisfied",
    "source": {
      "authority": "Example Fund Administrator",
      "ref": "sha256:...",
      "kid": "sb:issuer:9admin7Custo",
      "alg": "EdDSA",
    "sig": "<hex signature by the administrator over the claim>" },
    "as_of": "2026-06-30T21:00:00Z" },
  { "dimension": "provenance", "state": "failed",
    "source": { "authority": "runtime:request-origin",
                "ref": "request/origin-header" } }
]
]]></artwork>
      <section anchor="evidence-fields">
        <name>Fields</name>
        <dl>
          <dt>dimension (REQUIRED):</dt>
          <dd>
            <t>The class of evidence. Core values: <tt>"data_rights"</tt>,
<tt>"provenance"</tt>, <tt>"compliance"</tt>, <tt>"freshness"</tt>,
<tt>"consent"</tt>, <tt>"identity"</tt>, <tt>"authorization"</tt>,
<tt>"integrity"</tt>. Implementations MAY define additional dimensions using a
namespaced extension of the form <tt>x-&lt;vendor&gt;:&lt;name&gt;</tt>, where
<tt>&lt;vendor&gt;</tt> matches <tt>[a-z0-9]+</tt> and <tt>&lt;name&gt;</tt>
matches <tt>[a-z0-9_.-]+</tt> (both lowercase).</t>
          </dd>
          <dt>state (REQUIRED):</dt>
          <dd>
            <t>The evaluated state of this dimension at decision time. One of:
<tt>"satisfied"</tt>, <tt>"unverified"</tt>, <tt>"stale"</tt>, <tt>"failed"</tt>,
<tt>"not_applicable"</tt>.</t>
          </dd>
          <dt>source (REQUIRED):</dt>
          <dd>
            <t>The provenance of the evidence, an object with
<tt>authority</tt> (the attesting party; advisory), <tt>ref</tt> (a resolvable
reference or a <tt>"sha256:&lt;hex&gt;"</tt> digest of the attested subject), an
OPTIONAL <tt>kid</tt> (the attesting authority's key id), an OPTIONAL
<tt>alg</tt> (the signature algorithm, taking the same values as the
<tt>alg</tt> member of <xref target="signature-object"/>, and defaulting to
<tt>"EdDSA"</tt> when absent), and an OPTIONAL <tt>sig</tt> (the authority's
signature over the JCS-canonical claim, encoded as a lowercase hexadecimal
string and verifiable under <tt>kid</tt>). As in
<xref target="signature-object"/>, the encoded length of <tt>sig</tt> is
determined by <tt>alg</tt> and is not fixed by this document; a relying party
<bcp14>MUST NOT</bcp14> reject a source signature on encoded length alone.
An attesting authority need not use the same algorithm as the receipt
signer.
See <xref target="evidence-trust-model"/>: a named <tt>authority</tt> or
<tt>kid</tt> is NOT proof of authorship; only a verified <tt>sig</tt> is.</t>
          </dd>
          <dt>as_of (OPTIONAL):</dt>
          <dd>
            <t>An RFC 3339 timestamp of when the evidence was current.
RECOMMENDED for freshness-relevant dimensions.</t>
          </dd>
        </dl>
        <t>The signed <tt>claim</tt> is the JSON object built from the entry's
<tt>dimension</tt>, <tt>state</tt>, and <tt>as_of</tt> together with the source's
<tt>ref</tt>: <tt>{ dimension, ref, state }</tt> plus an <tt>as_of</tt> member when
the entry carries one. When <tt>as_of</tt> is absent the <tt>as_of</tt> member is
OMITTED from the claim; it MUST NOT be encoded as <tt>null</tt>. The producer
canonicalizes this object under JCS and signs the resulting bytes;
<tt>source.sig</tt> is that signature. A relying party reconstructs the same claim
from the entry and verifies <tt>source.sig</tt> over its JCS bytes.</t>
      </section>
      <section anchor="evidence-properties">
        <name>Properties</name>
        <t><tt>evidence</tt> is OPTIONAL and additive. A verifier that does not
understand it MUST still verify the receipt's signature and chain; the field is
covered by the signature (tamper-evident) but requires no verifier action. It is
canonicalized under JCS with the rest of the payload and is therefore signed. It
MUST NOT carry raw evidence content (positions, prompts, tool payloads); it
carries states, references, digests, and timestamps only.</t>
        <t>Evidence entries MAY be committed and selectively disclosed under
<xref target="commitment-mode"/>. When they are, the unit of disclosure
<bcp14>MUST</bcp14> be the whole entry. A producer <bcp14>MUST NOT</bcp14>
disclose an entry's <tt>dimension</tt> and <tt>state</tt> while withholding its
<tt>source</tt>, because a relying party cannot apply
<xref target="evidence-trust-model"/> to an entry whose source it cannot see,
and a disclosed <tt>"satisfied"</tt> with no visible source is precisely the
false assurance <xref target="evidence-false-assurance"/> warns against.
Withholding an entry in full is permitted; a relying party
<bcp14>MUST NOT</bcp14> infer from a disclosed set that no further entries
exist.</t>
      </section>
      <section anchor="evidence-trust-model">
        <name>Trust Model</name>
        <t><tt>evidence</tt> is a set of claims made by the receipt SIGNER.
Every field of every entry, including <tt>source.authority</tt> and
<tt>source.kid</tt>, is inside the payload the signer fully controls; the receipt
signature proves only that the signer ASSERTED them. A present or trusted-looking
<tt>source.kid</tt> is therefore NOT proof that the named authority attested
anything. It is exactly the in-payload, signer-controlled value that
<xref target="key-distribution-and-trust-anchors"/> warns is "strictly worse than
no signature at all, because it provides false assurance."</t>
        <t>A relying party MUST NOT treat any <tt>evidence</tt> dimension as
INDEPENDENT corroboration unless ALL of the following hold: (1) the entry carries
a <tt>source.sig</tt>; (2) the relying party obtains the corresponding public key
OUT OF BAND via the mechanisms in
<xref target="key-distribution-and-trust-anchors"/> (not from the receipt) and
confirms that key's identifier equals <tt>source.kid</tt>; (3) the relying party's
out-of-band trust policy identifies the source key as belonging to a control domain
DISTINCT from the receipt signer. At a minimum, the source public key MUST NOT equal
the key that signed the enclosing receipt; and (4) <tt>source.sig</tt> verifies under
that key over the JCS bytes of the claim.</t>
        <t>Condition 3 is load-bearing: every relying party MUST already pin the
receipt signer's own key out of band, because that is the only way to verify the
receipt at all. Public-key inequality alone is necessary but not sufficient: the
relying party also needs a trust-policy determination that the source key is outside
the receipt signer's control. Without this requirement, a receipt signer could sign
an <tt>evidence</tt> claim with its OWN key, satisfy conditions 1, 2, and 4, and
manufacture "independent" corroboration of itself. An entry whose
<tt>source.kid</tt> resolves to the receipt's signing key, or whose control domain
cannot be established independently, is self-attestation and MUST NOT be counted as
independent corroboration.</t>
        <t>A dimension without a verifiable, independent <tt>source.sig</tt> is
the receipt signer's own claim and MUST NOT raise the assurance a relying party
places in the decision, regardless of the <tt>authority</tt> or <tt>kid</tt> it
names. Producers SHOULD mark a self-attested basis with an <tt>authority</tt> of
<tt>runtime:&lt;component&gt;</tt>, but this labelling is advisory: because the
producer controls it, a relying party MUST identify a non-corroborating dimension
by the ABSENCE of a verifiable, independent <tt>source.sig</tt>, not by trusting
the label.</t>
        <t>A verified <tt>source.sig</tt> proves only that the authority attested
the claim tuple; it does NOT prove the authority observed or endorsed the
enclosing decision. The claim binds nothing from the receipt (no
<tt>session_id</tt>, <tt>policy_digest</tt>, <tt>tool_name</tt>, or
<tt>decision</tt>), so the same signed claim may lawfully appear in many receipts.
A relying party MUST additionally judge whether the claim's <tt>ref</tt> and
<tt>as_of</tt> pertain to the action being decided, and SHOULD bound acceptance by
<tt>as_of</tt>.</t>
      </section>
    </section>
    <section anchor="signing-and-verification">
      <name>Signing and Verification</name>
      <section anchor="signing-process">
        <name>Signing Process</name>
        <ol spacing="normal" type="1"><li>
            <t>Construct the payload object with all required fields.</t>
          </li>
          <li>
            <t>Construct the receipt object carrying that payload as its
<tt>payload</tt> member.</t>
          </li>
          <li>
            <t>Form the signing input for the envelope shape: canonicalize
the <tt>payload</tt> member using JCS <xref target="RFC8785"/>. The canonical
form is a deterministic JSON serialization with sorted keys and no
whitespace. The signing input is the <tt>payload</tt> member alone; it does
not include the enclosing receipt object. For the flat shape the signing
input is the receipt minus its <tt>signature</tt> member. See
<xref target="signature-scope"/>, which an implementation
<bcp14>MUST</bcp14> consult before computing either.</t>
          </li>
          <li>
            <t>Convert the canonical JSON string to a UTF-8 byte sequence.</t>
          </li>
          <li>
            <t>Sign the byte sequence using Ed25519 <xref target="RFC8032"/> with the
issuer's secret key.</t>
          </li>
          <li>
            <t>Encode the signature as a lowercase hexadecimal string.</t>
          </li>
          <li>
            <t>Attach the signature object to the original (non-canonicalized)
receipt as its <tt>signature</tt> member. The transmitted receipt carries the
payload exactly as constructed; canonicalization is performed only to derive
the signing input and its output is not transmitted.</t>
          </li>
        </ol>
      </section>
      <section anchor="verification-process">
        <name>Verification Process</name>
        <ol spacing="normal" type="1"><li>
            <t>Determine the receipt shape as defined in
<xref target="signature-scope"/> and extract the signature. In the envelope
shape the signature is the <tt>signature</tt> member, an object. In the flat
shape it is the <tt>signature</tt> member, a hexadecimal string, and the
algorithm and key identifier are carried as separate members of the
receipt.</t>
          </li>
          <li>
            <t>Reconstruct the signing input for the shape received, as
defined in <xref target="signature-scope"/>: for the envelope shape,
canonicalize the <tt>payload</tt> member as received; for the flat shape,
canonicalize the receipt minus its <tt>signature</tt> member. This reproduces
the byte string the signer formed in <xref target="signing-process"/>.
Applying the wrong shape's rule produces a different byte string and causes
verification of correctly signed receipts to fail.</t>
          </li>
          <li>
            <t>Convert the canonical JSON to a UTF-8 byte sequence.</t>
          </li>
          <li>
            <t>Resolve the public key using the key identifier carried by the
receipt. The RECOMMENDED resolution mechanism is a JWK Set endpoint
<xref target="RFC7517"/> at <tt>/.well-known/acta-keys.json</tt>. The key
<bcp14>MUST</bcp14> be obtained through that mechanism or another
out-of-band trust anchor, never from the receipt itself; see
<xref target="key-distribution-and-trust-anchors"/>.</t>
          </li>
          <li>
            <t>Verify the signature over the canonical bytes using the
resolved public key and the algorithm declared by the receipt, not an
algorithm assumed by the verifier; see
<xref target="algorithm-agility"/>.</t>
          </li>
          <li>
            <t>If verification succeeds, the receipt is authentic and has not
been tampered with. If verification fails, the receipt MUST be
rejected.</t>
          </li>
        </ol>
      </section>
      <section anchor="public-key-distribution">
        <name>Public Key Distribution</name>
        <t>Issuers SHOULD publish their public keys as a JWK Set <xref target="RFC7517"/>
at a well-known endpoint:</t>
        <artwork><![CDATA[
GET /.well-known/acta-keys.json

{
  "keys": [{
    "kty": "OKP",
    "crv": "Ed25519",
    "kid": "sb:issuer:4Kpm7Q3wXx2b",
    "x": "<base64url-encoded-public-key>",
    "use": "sig"
  }]
}
]]></artwork>
        <t>The <tt>x</tt> parameter MUST be the base64url-encoded Ed25519 public key
as specified in <xref target="RFC8037"/>.</t>
        <t>For offline verification, public keys MAY be distributed out-of-band
(e.g., embedded in configuration files, published in DNS TXT records,
or included in agent manifests).</t>
      </section>
    </section>
    <section anchor="commitment-mode">
      <name>Commitment Mode (Optional Extension)</name>
      <t>This section defines an OPTIONAL extension that allows a receipt
to carry cryptographic commitments to its field values in place of (or
alongside) cleartext. Selective disclosure is performed by revealing
inclusion proofs for individual fields. The commitment construction is
SHA-256 over a salt-prefixed canonical leaf, organized into a Merkle
tree following <xref target="RFC6962"/> domain-separation conventions.</t>
      <t>A receipt that uses commitment mode includes a single new field,
<tt>committed_fields_root</tt>, in its payload. Verifiers that do not
recognize this field MUST ignore it when performing signature
verification, as the field is part of the canonical signed payload but
its semantics are scoped to consumers that opt into commitment mode.</t>
      <t>The Merkle tree organization is byte-identical to Certificate
Transparency <xref target="RFC6962"/>, and implementations SHOULD reuse code
from that ecosystem.</t>
      <t>This construction is not SD-JWT. SD-JWT <xref target="RFC9901"/>
achieves selective disclosure with salted hashes placed in an
<tt>_sd</tt> array, with no tree; this extension commits to fields through
an RFC 6962 Merkle tree. The two are different constructions and produce
different bytes. A deployment that needs selective disclosure over JWT
claims, and does not need a tree, SHOULD use SD-JWT rather than this
extension.</t>

      <section anchor="commitment-merkle-construction">
        <name>Merkle Tree Construction</name>
        <t>Implementations MUST use the following RFC 6962-style
construction with explicit one-byte domain separation:</t>
        <artwork><![CDATA[
leaf_hash     = SHA-256(0x00 || canonical_leaf_bytes)
internal_hash = SHA-256(0x01 || left_child_hash || right_child_hash)
]]></artwork>
        <t>For a list of leaf hashes <tt>D</tt> of length <tt>n</tt>:</t>
        <ul>
          <li><t>If <tt>n == 1</tt>, the Merkle root is <tt>D[0]</tt>.</t></li>
          <li><t>Otherwise, let <tt>k</tt> be the largest power of two
strictly less than <tt>n</tt>. The root is
<tt>SHA-256(0x01 || MerkleRoot(D[0..k]) || MerkleRoot(D[k..n]))</tt>.</t></li>
        </ul>
        <t>This construction handles non-power-of-two leaf counts
without padding by recursively splitting on the largest power of two,
matching <xref target="RFC6962"/> Section 2.1.</t>
        <t>The <tt>committed_fields_root</tt> field MUST be the
lowercase hex encoding of the resulting 32-byte Merkle root.</t>
      </section>

      <section anchor="commitment-leaf-layout">
        <name>Canonical Leaf Layout</name>
        <t>Each leaf encodes a single committed field as a JCS
<xref target="RFC8785"/>-canonicalized JSON object:</t>
        <artwork><![CDATA[
canonical_leaf_bytes = JCS({
  "name":  field_name,
  "salt":  base64url_unpadded(salt_bytes),
  "value": field_value
})
]]></artwork>
        <t>The <tt>name</tt> field MUST be the field's identifier
within the receipt payload (e.g., <tt>"principal"</tt>,
<tt>"action"</tt>). Including the field name in the leaf binds the
commitment to a specific field and prevents cross-field substitution
attacks. The <tt>value</tt> field MUST be the cleartext field value,
preserving its original JSON type (string, number, boolean, object, or
array). The <tt>salt</tt> field MUST be the base64url-encoded
(without padding, per <xref target="RFC4648"/> Section 5) byte string
of the salt.</t>
      </section>

      <section anchor="commitment-leaf-order">
        <name>Leaf Sort Order</name>
        <t>Leaves MUST be ordered by the byte-lexicographic order of
the UTF-8 encoded <tt>name</tt> field. Implementations MUST NOT apply
locale-aware collation, case folding, or Unicode normalization. Two
implementations that disagree on sort order will produce different
roots; this rule eliminates that source of interoperability failure.</t>
      </section>

      <section anchor="commitment-salt">
        <name>Salt Construction and Storage</name>
        <t>Each committed field MUST have its own salt. Salts MUST be
at least 16 bytes and SHOULD be 32 bytes. Implementations SHOULD
generate salts using a cryptographically secure random number
generator (e.g., <tt>crypto.getRandomValues</tt> in browsers, or
<tt>os.urandom</tt> on POSIX).</t>
        <t>Implementations MAY derive salts deterministically from a
per-subject master secret, but MUST ensure that erasure of one
subject's master secret cannot affect commitments belonging to other
subjects. The simplest implementation strategy is to use a fresh
random salt per field per receipt; this is the RECOMMENDED default.</t>
        <t>The salt-prefix ordering for the leaf-level hash inside the
canonical leaf JSON object is implementation-internal: the leaf hash
is SHA-256 over the JCS-canonicalized object, not over a raw
concatenation. This sidesteps salt-ordering ambiguity entirely.</t>
        <t>For implementations that emit a separate per-field
commitment value alongside the Merkle leaf (for example, in earlier
draft versions or in a per-field disclosure envelope), the per-field
commitment MUST be computed as <tt>SHA-256(salt || value_bytes)</tt>
where <tt>value_bytes</tt> is the UTF-8 encoding of the JSON-stringified
value. Implementations MUST NOT use the reverse ordering
<tt>SHA-256(value_bytes || salt)</tt>; receipts that do so MUST be
rejected as malformed.</t>
      </section>

      <section anchor="commitment-disclosure">
        <name>Selective Disclosure</name>
        <t>To disclose a single field to a verifier, the discloser
provides:</t>
        <ol spacing="normal" type="1">
          <li><t>The cleartext field <tt>name</tt>, <tt>value</tt>, and
<tt>salt</tt>.</t></li>
          <li><t>A Merkle inclusion proof, consisting of the leaf's
zero-based <tt>index</tt> within the canonically-sorted leaf list, the
total <tt>tree_size</tt>, and the ordered list of <tt>siblings</tt>
(hex-encoded SHA-256 hashes) along the path from the leaf to the
root.</t></li>
        </ol>
        <t>No left/right indicator is carried for each sibling, and none is
needed. Because <xref target="commitment-merkle-construction"/> fixes the
split at the largest power of two strictly less than the node count, the
side of every sibling is determined by <tt>index</tt> and
<tt>tree_size</tt> alone, and a verifier <bcp14>MUST</bcp14> derive it
under that rule. This is deliberate rather than an omission. A verifier
that instead assumes a padded fixed-depth tree, taking the side from the
bits of <tt>index</tt> as is common in implementations that pad the leaf
count up to a power of two, agrees with this construction only when the
leaf count is already a power of two and diverges at every other size. For
<tt>tree_size</tt> 5 and <tt>index</tt> 4 the correct path has one element,
while the padded derivation expects three.</t>
        <t>The verifier reconstructs the leaf hash from the disclosed
<tt>(name, salt, value)</tt> tuple, walks the inclusion proof, and
compares the resulting root to <tt>committed_fields_root</tt> in the
signed receipt. Mismatch MUST cause the disclosure to be rejected.</t>
        <t>A formal Disclosure object with recipient binding,
expiry, custody chain, and revocation handle is OUT OF SCOPE for this
draft and is deferred to a future revision. Implementations MAY use a
minimal disclosure envelope of <tt>{name, value, salt, proof}</tt> in
the interim.</t>
      </section>

      <section anchor="signature-scope">
        <name>Signature Scope (Normative Clarification)</name>
        <t>The signature MUST cover the canonical JCS bytes of the
<em>signing input</em> directly: the UTF-8 byte sequence produced by the
signing process in <xref target="signing-process"/>, used as the message
input to the signature algorithm with no intermediate hash.</t>
        <t>Two receipt shapes are in use, and the signing input differs
between them. An implementation <bcp14>MUST</bcp14> determine the shape
before computing the signing input, and <bcp14>MUST NOT</bcp14> apply one
shape's rule to the other; the two produce different byte strings, and
crossing them causes verification of correctly signed receipts to fail.</t>
        <dl>
          <dt>Envelope shape:</dt>
          <dd>
            <t>The receipt is the object shown in
<xref target="signed-envelope"/>, carrying exactly two members: a
<tt>payload</tt> member and a <tt>signature</tt> member that is an object
with <tt>alg</tt>, <tt>kid</tt>, and <tt>sig</tt>. The signing input is
<tt>JCS(payload)</tt>: the <tt>payload</tt> member canonicalized on its own,
not the enclosing receipt object.</t>
          </dd>
          <dt>Flat shape:</dt>
          <dd>
            <t>The receipt carries its fields at the top level alongside a
<tt>signature</tt> member that is a hexadecimal string. There is no
<tt>payload</tt> member to canonicalize, so the signing input is the receipt
object with the <tt>signature</tt> member removed, canonicalized. This shape
predates the envelope and remains in use; new implementations
<bcp14>SHOULD</bcp14> emit the envelope shape.</t>
          </dd>
        </dl>
        <t>In both shapes the signing input excludes the signature, and in
neither is the signature computed over a receipt that already contains
one.</t>
        <t>In either shape the object canonicalized
<bcp14>MUST NOT</bcp14> contain a <tt>signature</tt> member, and that member
<bcp14>MUST NOT</bcp14> be included as <tt>null</tt> or as the empty string;
these produce different JCS output and break interoperability.</t>
        <t>The <tt>alg</tt> and <tt>kid</tt> members of the signature object
are therefore not covered by the signature. A verifier resolves the key from
<tt>kid</tt> through the mechanisms in
<xref target="key-distribution-and-trust-anchors"/> and verification fails if
either member is altered, so this is not a substitution vector, but a verifier
<bcp14>MUST NOT</bcp14> treat either member as attested content.</t>
        <t>Standard PureEdDSA <xref target="RFC8032"/> hashes the message
internally; implementations <bcp14>MUST NOT</bcp14> pre-hash the
canonical bytes (for example with <tt>SHA-256</tt>) before signing.</t>
      </section>

      <section anchor="chain-hash-scope">
        <name>Chain Hash Scope (Normative Clarification)</name>
        <t>The <tt>previousReceiptHash</tt> field <bcp14>MUST</bcp14> be
the string <tt>"sha256:"</tt> followed by the lowercase hex encoding of
<tt>SHA-256(JCS(receipt))</tt>, where <tt>receipt</tt> is the entire signed
receipt object including the <tt>signature</tt> member. For example:
<tt>"sha256:6699b21fea5819eea4df..."</tt>.</t>
        <t>Two choices here are deliberate.</t>
        <t>The preimage is the whole receipt, not its <tt>payload</tt>
member. Including the signature binds the chain to specific signed bytes, so
re-signing an identical payload, after a key rotation for instance, produces
a distinct chain link and is visible as a chain event. Hashing the payload
alone would make a re-signed receipt indistinguishable from the original,
which is the opposite of what a chain is for.</t>
        <t>The algorithm prefix makes the digest self-describing, matching
the form used by <tt>policy_digest</tt> and by <tt>source.ref</tt> in
<xref target="evidence-predicate"/>. A verifier <bcp14>MUST</bcp14> reject a
<tt>previousReceiptHash</tt> whose prefix names an algorithm it does not
implement, rather than assuming SHA-256 from the length. A bare hex digest
with no prefix is the encoding used by earlier revisions; verifiers
<bcp14>MAY</bcp14> accept it for compatibility but <bcp14>MUST NOT</bcp14>
emit it.</t>
      </section>

      <section anchor="policy-digest-construction">
        <name>Policy Digest Construction (Normative)</name>
        <t>A <tt>policy_digest</tt> is only evidence if a verifier who has
never communicated with the evaluator can recompute it from public bytes
alone. An identifier whose derivation is private relocates the
self-attestation problem from the decision to the policy: the verifier must
trust the evaluator's claim about which policy governed the decision. To
close this, the digest construction is normative.</t>
        <t>The policy digest commits to a manifest of the exact policy
source files:</t>
        <artwork><![CDATA[
M = {
  "construction": "acta-policy-digest-v1",
  "engine": <engine identifier, e.g. "cedar" or "builtin">,
  "files": [
    { "name": <file name>,
      "sha256": <lowercase hex SHA-256 over the file's exact
                 UTF-8 bytes> },
    ...
  ]  // sorted by name, code point order
}

policy_digest = "sha256:" || lowercase_hex(SHA-256(UTF-8(JCS(M))))
]]></artwork>
        <t>Rules:</t>
        <ul>
          <li><t>Each file is hashed individually over its exact bytes.
Implementations MUST NOT concatenate policy sources before hashing:
concatenation cannot distinguish the file sets <tt>["ab","c"]</tt> and
<tt>["a","bc"]</tt>, and a join delimiter only relocates the ambiguity.</t></li>
          <li><t>Entries are sorted by <tt>name</tt> in code point order, so
the digest is independent of directory read order. Names are included in
the manifest, so renames produce a distinct digest.</t></li>
          <li><t>For a policy supplied as a single in-memory source rather
than a file, the entry name MUST be <tt>"policy.&lt;ext&gt;"</tt> for the
engine's conventional extension (for Cedar, <tt>"policy.cedar"</tt>).</t></li>
          <li><t>For policy expressed as structured configuration rather
than source files, the file bytes are the UTF-8 encoding of the JCS
canonical form of the policy object, under the name
<tt>"policy.json"</tt>.</t></li>
        </ul>
        <t>Signature validity and policy freshness remain distinct checks:
a receipt whose <tt>policy_digest</tt> matches a genuinely published policy
can still be stale if that policy is no longer the one in force at
verification time. A conformant verifier that evaluates policy binding
MUST compare the receipt's digest against the policy currently in force,
in addition to verifying the receipt signature.</t>
        <t>Compatibility note: implementations of earlier revisions of this
document (protect-mcp before 0.10.0) emitted engine-specific digest
preimages truncated to 16 hexadecimal characters with no algorithm prefix.
Verifiers SHOULD treat such values as opaque labels rather than
recomputable commitments.</t>

        <section anchor="policy-publication">
          <name>Policy Publication</name>
          <t>An issuer that wants third parties to verify which policy
governed its decisions publishes the policy bytes and the preimage
specification together, addressed by the digest itself:</t>
          <artwork><![CDATA[
https://<issuer-domain>/.well-known/acta-policies/<hex>.json

{
  "schema": "acta.policy-bundle.v1",
  "construction": "acta-policy-digest-v1",
  "engine": "cedar",
  "policy_digest": "sha256:<hex>",
  "files": [
    { "name": <file name>, "sha256": <hex>, "content": <string> },
    ...
  ],
  "generated_at": <RFC 3339 timestamp>
}
]]></artwork>
          <t>where <tt>&lt;hex&gt;</tt> in the path is the digest value
without the <tt>"sha256:"</tt> prefix. A verifier recomputes the bundle
from its own bytes: hash each <tt>content</tt> and compare to its
<tt>sha256</tt>, construct the manifest M from the (name, sha256) pairs,
and compare <tt>"sha256:" || hex(SHA-256(JCS(M)))</tt> to
<tt>policy_digest</tt>. No communication with the issuer beyond fetching
the bundle is required, and the bundle MAY equally be delivered out of
band.</t>
        </section>
      </section>

      <section anchor="algorithm-agility">
        <name>Signature Algorithm Agility</name>
        <t>Receipts MAY be signed with any of the following algorithms,
identified by their JOSE/JWS algorithm names <xref target="RFC7518"/>:</t>
        <ul>
          <li><t><tt>EdDSA</tt> (Ed25519, <xref target="RFC8032"/>):
Mandatory-to-implement (MTI) baseline.</t></li>
          <li><t><tt>ML-DSA-65</tt> (FIPS 204): RECOMMENDED for new
deployments and post-quantum readiness.</t></li>
          <li><t><tt>ES256</tt> (ECDSA over P-256): Permitted for
compatibility with existing credentials, particularly those used in
<xref target="I-D.google-cfrg-libzk"/> ZK proof composition.</t></li>
        </ul>
        <t>The <tt>signature</tt> object MUST contain an
<tt>alg</tt> field carrying the algorithm name as a string. Verifiers
MUST verify each receipt against the algorithm declared in its own
<tt>signature.alg</tt> field. Chains MAY contain receipts signed under
different algorithms; verifiers MUST handle each receipt independently.</t>
        <t>The hash-based constructions in this document degrade gracefully
under quantum attack rather than breaking. Grover's algorithm reduces
SHA-256 pre-image resistance to roughly 2^128 work, which remains
infeasible. Collision resistance is already bounded at 2^128 classically by
the birthday bound, and known quantum collision methods do not improve on
that at any practical memory or time cost. These constructions therefore
need no change. The classical-cryptography component is the outer
signature, which the algorithm agility above allows to be upgraded in
place.</t>
      </section>

      <section anchor="zk-context-binding">
        <name>Context Binding for ZK Proofs</name>
        <t>When a receipt's <tt>principal</tt> (or any committed
field) references a zero-knowledge proof produced under a separate ZK
protocol (e.g., <xref target="I-D.google-cfrg-libzk"/>), the ZK proof
MUST bind to the receipt's <tt>committed_fields_root</tt> as a public
input or context hash. Without this binding, a valid ZK proof is
replayable into a different receipt with a different
<tt>committed_fields_root</tt>.</t>
        <t>The committed-fields root serves double duty: it commits to
the selectively-disclosable receipt content, and it provides a
deterministic, signature-independent context hash that any external
proof system can bind against.</t>
      </section>

      <section anchor="commitment-test-vectors">
        <name>Test Vectors</name>
        <t>An interoperability test suite is published alongside this
draft. The minimum set is:</t>
        <ul>
          <li><t>A cleartext receipt with no <tt>committed_fields_root</tt>
field (signature and JCS output only).</t></li>
          <li><t>A receipt with four committed fields: the expected
Merkle root and an inclusion proof for each field.</t></li>
          <li><t>A chain of three receipts: the expected
<tt>previousReceiptHash</tt> values.</t></li>
          <li><t>A tampered Merkle proof: MUST fail verification.</t></li>
          <li><t>An algorithm-mixed chain (Ed25519 followed by
ML-DSA-65): MUST verify successfully when each receipt is checked
against its own algorithm.</t></li>
          <li><t>A non-power-of-two leaf count (e.g., five committed
fields): exercises the recursive split rule.</t></li>
        </ul>
        <t>Test vectors use fixed (non-random) salts to remain
reproducible across implementations. Production deployments MUST NOT
reuse the test-vector salts and MUST follow the salt construction
guidance in <xref target="commitment-salt"/>.</t>
      </section>
    </section>

    <section anchor="trust-tiers">
      <name>Trust Tiers</name>
      <t>This specification defines a four-level trust hierarchy for agent
identity. Trust tiers are used by policy engines to gate tool access.</t>
      <dl>
        <dt>unknown:</dt>
        <dd>
          <t>No identity presented. Default tier for anonymous connections.</t>
        </dd>
        <dt>signed-known:</dt>
        <dd>
          <t>Agent presents a valid signed manifest with a verifiable
Ed25519 public key. Identity is pseudonymous but consistent.</t>
        </dd>
        <dt>evidenced:</dt>
        <dd>
          <t>Agent has accumulated verifiable evidence receipts (e.g., arena
battle outcomes, successful restraint records) that demonstrate
a track record of trustworthy behavior.</t>
        </dd>
        <dt>privileged:</dt>
        <dd>
          <t>Operator has explicitly granted elevated access. Typically
requires out-of-band verification (e.g., organization membership,
contractual agreement).</t>
        </dd>
      </dl>
      <t>Trust tier transitions are unidirectional within a session but MAY
be re-evaluated across sessions based on accumulated evidence.</t>
    </section>
    <section anchor="agent-identity">
      <name>Agent Identity</name>
      <section anchor="passport-manifest">
        <name>Passport Manifest</name>
        <t>An agent's identity is expressed as a signed manifest:</t>
        <artwork><![CDATA[
{
  "type": "scopeblind:agent-manifest",
  "id": "sb:agent:3mK9pQ7wXx2b",
  "version": "2.1.0",
  "previous_version": "2.0.0",
  "created_at": "2026-03-20T10:00:00Z",
  "public_key": "<base58-ed25519-public-key>"
}
]]></artwork>
        <t>Manifests are IMMUTABLE once signed. Version changes create new
manifests that reference their predecessor via <tt>previous_version</tt>,
forming a verifiable version chain.</t>
      </section>
      <section anchor="dpop-binding-future">
        <name>DPoP Binding (Future)</name>
        <t>For remote MCP transports (HTTP/SSE), agent identity MAY be bound
to per-request proof-of-possession using DPoP <xref target="RFC9449"/>. The
<tt>auth_key_bindings</tt> field in the manifest links the agent's Ed25519
identity key to one or more P-256 DPoP keys.</t>
        <t>This binding creates a verifiable delegation chain:</t>
        <artwork><![CDATA[
Operator -> Agent Identity (Ed25519) -> Request Auth (P-256 DPoP)
]]></artwork>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <section anchor="replay-protection">
        <name>Replay Protection</name>
        <t>Receipts include an <tt>issued_at</tt> timestamp but do not
include a nonce or sequence number.</t>
        <t>This guidance applies to <em>live presentation</em>: a receipt
offered as evidence of a currently effective authorization. In that case
verifiers <bcp14>SHOULD</bcp14> reject receipts whose timestamps are
unreasonably old (implementation-defined; 24 hours is
<bcp14>RECOMMENDED</bcp14> as a default).</t>
        <t>It does not apply to <em>archival verification</em>: examining a
receipt as a record of what was authorized at some past time, which is one
of the purposes stated in <xref target="introduction"/>. Applying a
freshness window there would reject every receipt in an audit older than
the window. A verifier performing archival verification
<bcp14>SHOULD NOT</bcp14> apply one, and <bcp14>SHOULD</bcp14> report the
receipt's age rather than deciding on the caller's behalf.</t>
        <t>For environments requiring stronger replay protection, implementations
MAY add a <tt>nonce</tt> field to the payload.</t>
      </section>
      <section anchor="key-compromise">
        <name>Key Compromise</name>
        <t>If an issuer's signing key is compromised, all receipts signed with
that key become suspect. Issuers SHOULD implement key rotation by
publishing new keys at the well-known endpoint and including a
<tt>valid_from</tt> / <tt>valid_until</tt> window in the JWK metadata.</t>
        <t>Verifiers SHOULD check key validity windows when available.</t>
      </section>
      <section anchor="payload-privacy">
        <name>Payload Privacy</name>
        <t>Receipts are designed to capture decision metadata, NOT request
content. Implementations MUST NOT include raw prompts, tool
arguments, API keys, or other sensitive parameters in receipt
payloads.</t>
        <t>The <tt>tool_name</tt> and <tt>decision</tt> fields are considered non-sensitive.
The <tt>session_id</tt> field SHOULD be an opaque identifier that is not
correlatable across sessions.</t>
      </section>
      <section anchor="canonicalization-attacks">
        <name>Canonicalization Attacks</name>
        <t>The signing process relies on JCS <xref target="RFC8785"/> for deterministic
serialization. Implementations MUST use a conformant JCS
implementation to prevent canonicalization divergence attacks where
the signed bytes differ from the verified bytes.</t>
      </section>
      <section anchor="key-distribution-and-trust-anchors">
        <name>Key Distribution and Trust Anchors</name>
        <t>Receipts are designed to be verified by parties who do not trust the
issuer and did not observe the decision being made. This property
(the "issuer-blind" property) is the basis for the third-party
auditability claim of this document. The property holds only if the
verification key a verifier uses to check a signature is sourced
through a channel outside the signed payload itself.</t>
        <t>Verifiers MUST NOT accept a verification key transported inside the
receipt envelope (including but not limited to fields such as
<tt>public_key</tt>, <tt>verification_key</tt>, <tt>verification_jwk</tt>,
or any equivalent name under the signed payload) unless that key is
independently anchored by an authenticated trust source. An embedded
key is strictly controllable by any party able to produce the rest
of the payload; a signature that verifies under an attacker-chosen
key provides no authenticity guarantee against tampering and is
strictly worse than no signature at all, because it provides false
assurance.</t>
        <t>Conformant verifiers MUST resolve verification keys through one or
more of the following external mechanisms, in order of preference
when multiple are available:</t>
        <ol spacing="normal">
          <li>
            <t>A JWK Set <xref target="RFC7517"/> retrieved from a URL
bound to the issuer by an independently authenticated trust
root (e.g., a server TLS certificate validated via the Web PKI,
or a signed DNS record).</t>
          </li>
          <li>
            <t>A DID Document whose authenticity follows from the DID
method's own verification procedure.</t>
          </li>
          <li>
            <t>A trust anchor configured out-of-band by the verifier
operator (e.g., a pinned Ed25519 public key loaded from a
verifier configuration file).</t>
          </li>
          <li>
            <t>A well-known endpoint of the issuer's domain, as described
in <xref target="public-key-distribution"/>, provided the domain binding
is independently authenticatable.</t>
          </li>
        </ol>
        <t>Verifiers SHOULD expose the externally sourced key provenance to
the caller (e.g., via a <tt>keySource</tt> field in structured output)
so that the caller can distinguish a verification anchored by
<tt>--jwks</tt> from one anchored by a locally configured trust
anchor. This supports defense in depth when an operator layers key
provenance constraints above signature verification.</t>
        <t>Implementations MAY provide a deprecated escape hatch (e.g., a
command-line flag) that allows acceptance of embedded keys during a
migration window. Such an escape hatch MUST be off by default, MUST
emit a visible warning when engaged, and MUST be removed in a
subsequent release. See the reference verifier
<xref target="I-D.verify-reference"/> for one such implementation.</t>
        <t>This section was added in draft-02 in response to a public stress-
test of draft-01 that identified the embedded-key pattern as a
conformance gap. A negative conformance test vector set
(<xref target="I-D.agent-governance-testvectors"/>) exercises the
required rejection behavior across representative envelope shapes
(flat v1, structured v2, Passport-style, full-JWK-embedded).</t>
      </section>
          <section anchor="verification-not-in-receipt">
        <name>Verifier Identity Is Not Receipt Content</name>
        <t>A receipt is signed by its issuer at issue time. Nothing a verifier
learns or computes later can be added to it without invalidating that
signature. A field describing which verifier checked a receipt therefore
cannot be a member of the signed payload, and a prior revision of this
document listed one.</t>
        <t>Where a deployment needs to record which verifier performed a check,
that belongs in a separate verification report that references the receipt by
its hash and is signed by the verifier. Such a report is out of scope for this
document. A verifier <bcp14>MUST NOT</bcp14> add members to a receipt it has
verified, and a consumer <bcp14>MUST NOT</bcp14> treat any member of a receipt
as evidence about the party that verified it.</t>
      </section>
      <section anchor="chain-completeness">
        <name>Chain Completeness and Truncation</name>
        <t>A receipt chain proves that the receipts a verifier holds have not
been altered and have not been reordered. It does not prove that the verifier
holds all of them.</t>
        <t>Removing receipts from the end of a chain leaves every remaining
link and every remaining signature valid. A verifier presented with the
truncated set cannot distinguish it from a complete one, because nothing in
the set commits to how long the set is. This is the omission most worth
guarding against: the receipt an operator would prefer a reviewer not to see
is usually the most recent. Removing receipts from the middle is detectable,
since the next receipt's <tt>previousReceiptHash</tt> will not match, and
that difference is easy to mistake for completeness.</t>
        <t>Detecting truncation requires a commitment, external to the chain,
to the number of receipts and the terminal hash at a given point, signed by
the issuer. A verifier that checks a chain against such a commitment can
detect omission at the end; a verifier given no commitment
<bcp14>MUST NOT</bcp14> report the set as complete, and
<bcp14>SHOULD</bcp14> report that it verified integrity only.</t>
        <t>The commitment is only worth as much as its location. Stored
alongside the receipts it describes, it is deletable by whoever deletes the
receipts, and the truncated set verifies clean again. It constrains an issuer
only once it has reached somewhere that issuer cannot later rewrite. This
document does not specify that destination, which depends on what
infrastructure the deployment already has and what an adversary controls
within it.</t>
        <t>A further property is out of scope here: these mechanisms let one
verifier detect omission from the set it was given, but they do not establish
that every verifier was given the same set. An issuer can maintain divergent
histories and show each verifier a self-consistent one. Detecting that
requires verifiers to compare what they were shown, through a mechanism such
as a witnessed or gossiped log, and no construction in this document provides
it.</t>
      </section>
      <section anchor="decision-versus-execution">
        <name>Decisions Are Not Executions</name>
        <t>An Access Decision Receipt attests that a policy was evaluated and
what it returned. It does not attest that the action then executed, that it
succeeded, or what it returned. An <tt>"allow"</tt> receipt records
permission, not performance, and a verifier
<bcp14>MUST NOT</bcp14> read one as evidence that the tool ran.</t>
        <t>Where a deployment needs the executed fact, that is a separate
post-execution receipt issued after the invocation returns, binding the
decision it acted on to the observed outcome.
<tt>tool_duration_ms</tt> and <tt>sandbox_state</tt>
(<xref target="payload"/>) belong to that second receipt, and their presence
in a receipt is what distinguishes it from a decision-time one. The value
<tt>"require_approval"</tt> makes the same separation explicit for held
actions.</t>
        <t>Conflating the two is a common error in receipt formats, and it
fails in the direction that matters: a reviewer concludes an action occurred
because it was permitted, or that it was blocked because no execution receipt
exists, when the receipt set only ever established the decision.</t>
      </section>
      <section anchor="evidence-false-assurance">
        <name>Evidence Predicate: False Assurance</name>
        <t>The OPTIONAL <tt>evidence</tt> field (<xref target="evidence-predicate"/>)
can make a decision LOOK well-founded without being so: <tt>source.authority</tt>,
<tt>source.kid</tt>, and the dimension states are all under the receipt signer's
control. A relying party MUST derive assurance ONLY from <tt>source.sig</tt> values
it verifies under out-of-band-pinned keys that are DISTINCT from the receipt signer
(see <xref target="evidence-trust-model"/>), never from the presence of
<tt>evidence</tt>, a plausible <tt>authority</tt>, or a matching <tt>kid</tt>. Two
forgeries are defeated by the trust model, each exercised as a negative reference
vector (<xref target="I-D.agent-governance-testvectors"/>) that verifies as a
receipt yet corroborates nothing: a named-key forgery (a trusted <tt>kid</tt>
copied in with no valid <tt>sig</tt>) and self-corroboration (the signer signs the
claim with its own key). An implementation that surfaces <tt>evidence</tt> to a
human or a downstream policy MUST visibly distinguish dimensions carrying an
independent, verified <tt>source.sig</tt> from those that do not.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
      <t>Future versions of this specification MAY request registration of:</t>
      <ul spacing="normal">
        <li>
          <t>A <tt>receipt-type</tt> registry for namespaced receipt type identifiers.</t>
        </li>
        <li>
          <t>A well-known URI suffix for <tt>/.well-known/acta-keys.json</tt>.</t>
        </li>
        <li>
          <t>A media type for the receipt serialization defined in this
document. Receipts are currently exchanged as <tt>application/json</tt>,
which does not let a recipient distinguish a receipt from arbitrary JSON
before parsing it.</t>
        </li>
      </ul>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-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 fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </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 fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>

        <reference anchor="RFC8032" target="https://www.rfc-editor.org/info/rfc8032" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8032.xml">
          <front>
            <title>Edwards-Curve Digital Signature Algorithm (EdDSA)</title>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
            <author fullname="I. Liusvaara" initials="I." surname="Liusvaara"/>
            <date month="January" year="2017"/>
            <abstract>
              <t>This document describes elliptic curve signature scheme Edwards-curve Digital Signature Algorithm (EdDSA). The algorithm is instantiated with recommended parameters for the edwards25519 and edwards448 curves. An example implementation and test vectors are provided.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8032"/>
          <seriesInfo name="DOI" value="10.17487/RFC8032"/>
        </reference>
        <reference anchor="RFC8037" target="https://www.rfc-editor.org/info/rfc8037" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8037.xml">
          <front>
            <title>CFRG Elliptic Curve Diffie-Hellman (ECDH) and Signatures in JSON Object Signing and Encryption (JOSE)</title>
            <author fullname="I. Liusvaara" initials="I." surname="Liusvaara"/>
            <date month="January" year="2017"/>
            <abstract>
              <t>This document defines how to use the Diffie-Hellman algorithms "X25519" and "X448" as well as the signature algorithms "Ed25519" and "Ed448" from the IRTF CFRG elliptic curves work in JSON Object Signing and Encryption (JOSE).</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8037"/>
          <seriesInfo name="DOI" value="10.17487/RFC8037"/>
        </reference>
        <reference anchor="RFC8785" target="https://www.rfc-editor.org/info/rfc8785" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8785.xml">
          <front>
            <title>JSON Canonicalization Scheme (JCS)</title>
            <author fullname="A. Rundgren" initials="A." surname="Rundgren"/>
            <author fullname="B. Jordan" initials="B." surname="Jordan"/>
            <author fullname="S. Erdtman" initials="S." surname="Erdtman"/>
            <date month="June" year="2020"/>
            <abstract>
              <t>Cryptographic operations like hashing and signing need the data to be expressed in an invariant format so that the operations are reliably repeatable. One way to address this is to create a canonical representation of the data. Canonicalization also permits data to be exchanged in its original form on the "wire" while cryptographic operations performed on the canonicalized counterpart of the data in the producer and consumer endpoints generate consistent results.</t>
              <t>This document describes the JSON Canonicalization Scheme (JCS). This specification defines how to create a canonical representation of JSON data by building on the strict serialization methods for JSON primitives defined by ECMAScript, constraining JSON data to the Internet JSON (I-JSON) subset, and by using deterministic property sorting.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8785"/>
          <seriesInfo name="DOI" value="10.17487/RFC8785"/>
        </reference>
        <reference anchor="RFC3339" target="https://www.rfc-editor.org/info/rfc3339" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3339.xml">
          <front>
            <title>Date and Time on the Internet: Timestamps</title>
            <author fullname="G. Klyne" initials="G." surname="Klyne"/>
            <author fullname="C. Newman" initials="C." surname="Newman"/>
            <date month="July" year="2002"/>
            <abstract>
              <t>This document defines a date and time format for use in Internet protocols that is a profile of the ISO 8601 standard for representation of dates and times using the Gregorian calendar.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="3339"/>
          <seriesInfo name="DOI" value="10.17487/RFC3339"/>
        </reference>
        <reference anchor="RFC7517" target="https://www.rfc-editor.org/info/rfc7517" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7517.xml">
          <front>
            <title>JSON Web Key (JWK)</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <date month="May" year="2015"/>
            <abstract>
              <t>A JSON Web Key (JWK) is a JavaScript Object Notation (JSON) data structure that represents a cryptographic key. This specification also defines a JWK Set JSON data structure that represents a set of JWKs. Cryptographic algorithms and identifiers for use with this specification are described in the separate JSON Web Algorithms (JWA) specification and IANA registries established by that specification.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7517"/>
          <seriesInfo name="DOI" value="10.17487/RFC7517"/>
        </reference>
        <reference anchor="RFC9449" target="https://www.rfc-editor.org/info/rfc9449" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9449.xml">
          <front>
            <title>OAuth 2.0 Demonstrating Proof of Possession (DPoP)</title>
            <author fullname="D. Fett" initials="D." surname="Fett"/>
            <author fullname="B. Campbell" initials="B." surname="Campbell"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <author fullname="T. Lodderstedt" initials="T." surname="Lodderstedt"/>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="D. Waite" initials="D." surname="Waite"/>
            <date month="September" year="2023"/>
            <abstract>
              <t>This document describes a mechanism for sender-constraining OAuth 2.0 tokens via a proof-of-possession mechanism on the application level. This mechanism allows for the detection of replay attacks with access and refresh tokens.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9449"/>
          <seriesInfo name="DOI" value="10.17487/RFC9449"/>
        </reference>
        <reference anchor="RFC6962" target="https://www.rfc-editor.org/info/rfc6962">
          <front>
            <title>Certificate Transparency</title>
            <author fullname="B. Laurie" initials="B." surname="Laurie"/>
            <author fullname="A. Langley" initials="A." surname="Langley"/>
            <author fullname="E. Kasper" initials="E." surname="Kasper"/>
            <date month="June" year="2013"/>
          </front>
          <seriesInfo name="RFC" value="6962"/>
          <seriesInfo name="DOI" value="10.17487/RFC6962"/>
        </reference>
        <reference anchor="RFC7518" target="https://www.rfc-editor.org/info/rfc7518">
          <front>
            <title>JSON Web Algorithms (JWA)</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <date month="May" year="2015"/>
          </front>
          <seriesInfo name="RFC" value="7518"/>
          <seriesInfo name="DOI" value="10.17487/RFC7518"/>
        </reference>
        <reference anchor="RFC4648" target="https://www.rfc-editor.org/info/rfc4648">
          <front>
            <title>The Base16, Base32, and Base64 Data Encodings</title>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
            <date month="October" year="2006"/>
          </front>
          <seriesInfo name="RFC" value="4648"/>
          <seriesInfo name="DOI" value="10.17487/RFC4648"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC9497" target="https://www.rfc-editor.org/info/rfc9497">
          <front>
            <title>Oblivious Pseudorandom Functions (OPRFs) Using Prime-Order Groups</title>
            <author fullname="A. Davidson" initials="A." surname="Davidson"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="December" year="2023"/>
          </front>
          <seriesInfo name="RFC" value="9497"/>
          <seriesInfo name="DOI" value="10.17487/RFC9497"/>
        </reference>
        <reference anchor="RFC9901" target="https://www.rfc-editor.org/info/rfc9901">
          <front>
            <title>Selective Disclosure for JSON Web Tokens (SD-JWT)</title>
            <author fullname="D. Fett" initials="D." surname="Fett"/>
            <author fullname="K. Yasuda" initials="K." surname="Yasuda"/>
            <author fullname="B. Campbell" initials="B." surname="Campbell"/>
            <date month="November" year="2025"/>
          </front>
          <seriesInfo name="RFC" value="9901"/>
          <seriesInfo name="DOI" value="10.17487/RFC9901"/>
        </reference>

        <reference anchor="MCP" target="https://modelcontextprotocol.io/specification">
          <front>
            <title>Model Context Protocol Specification</title>
            <author>
              <organization/>
            </author>
            <date year="2025"/>
          </front>
        </reference>
        <reference anchor="I-D.serra-mcp-discovery-uri" target="https://datatracker.ietf.org/doc/draft-serra-mcp-discovery-uri/">
          <front>
            <title>The mcp URI Scheme and MCP Server Discovery Mechanism</title>
            <author initials="M." surname="Serra" fullname="Marco Serra">
              <organization>Mumble Group</organization>
            </author>
            <date year="2026"/>
          </front>
        </reference>
        <reference anchor="I-D.google-cfrg-libzk" target="https://datatracker.ietf.org/doc/draft-google-cfrg-libzk/">
          <front>
            <title>The libzk Library for Zero-Knowledge Proofs of Predicates over Existing Credentials</title>
            <author>
              <organization>Google</organization>
            </author>
            <date year="2026"/>
          </front>
        </reference>
        <reference anchor="I-D.verify-reference" target="https://www.npmjs.com/package/@veritasacta/verify">
          <front>
            <title>Veritas Acta Reference Verifier (@veritasacta/verify)</title>
            <author fullname="T. Farley" initials="T." surname="Farley">
              <organization>ScopeBlind (Veritas Acta)</organization>
            </author>
            <date year="2026"/>
          </front>
        </reference>
        <reference anchor="I-D.agent-governance-testvectors" target="https://github.com/ScopeBlind/agent-governance-testvectors">
          <front>
            <title>Agent Governance Cross-Implementation Test Vectors</title>
            <author fullname="T. Farley" initials="T." surname="Farley">
              <organization>ScopeBlind (Veritas Acta)</organization>
            </author>
            <date year="2026"/>
          </front>
        </reference>
      </references>
    </references>
    <?line 663?>

<section anchor="implementation-status">
      <name>Implementation Status</name>
      <t>This section records the status of known implementations of the
protocol defined by this specification at the time of publication.</t>
      <section anchor="protect-mcp-reference-implementation">
        <name>protect-mcp (Reference Implementation)</name>
        <ul spacing="normal">
          <li>
            <t>Organization: ScopeBlind</t>
          </li>
          <li>
            <t>Implementation: https://www.npmjs.com/package/protect-mcp</t>
          </li>
          <li>
            <t>Description: Security gateway for MCP servers with Cedar WASM
policy evaluation, Ed25519-signed decision receipts, and Claude
Code hook integration. Supports stdio proxy mode, HTTP hook
server mode, shadow mode (log-only), and enforce mode.</t>
          </li>
          <li>
            <t>Coverage: Access Decision Receipts, Restraint Receipts, Agent
Lifecycle Receipts, Spending Authority Receipts.</t>
          </li>
          <li>
            <t>Licensing: MIT.</t>
          </li>
          <li>
            <t>Version: 0.11.1.</t>
          </li>
        </ul>
      </section>
      <section anchor="veritasactaverify-verifier">
        <name>@veritasacta/verify (Verifier)</name>
        <ul spacing="normal">
          <li>
            <t>Organization: Veritas Acta</t>
          </li>
          <li>
            <t>Implementation: https://www.npmjs.com/package/@veritasacta/verify</t>
          </li>
          <li>
            <t>Description: Standalone CLI and library for offline receipt
verification. Zero runtime dependencies on ScopeBlind.</t>
          </li>
          <li>
            <t>Coverage: All receipt types defined in this specification.</t>
          </li>
          <li>
            <t>Licensing: Apache-2.0.</t>
          </li>
        </ul>
      </section>
      <section anchor="scopeblindpassport-identity-sdk">
        <name>@scopeblind/passport (Identity SDK)</name>
        <ul spacing="normal">
          <li>
            <t>Organization: ScopeBlind</t>
          </li>
          <li>
            <t>Implementation: https://www.npmjs.com/package/@scopeblind/passport</t>
          </li>
          <li>
            <t>Description: Agent identity SDK for generating manifests, signing
receipts, and managing trust tier evidence bundles.</t>
          </li>
          <li>
            <t>Coverage: All receipt types, manifest signing, key management.</t>
          </li>
          <li>
            <t>Licensing: Apache-2.0.</t>
          </li>
        </ul>
      </section>
      <section anchor="protect-mcp-adk-google-adk">
        <name>protect-mcp-adk (Google ADK)</name>
        <ul spacing="normal">
          <li>
            <t>Organization: ScopeBlind</t>
          </li>
          <li>
            <t>Implementation: https://pypi.org/project/protect-mcp-adk/</t>
          </li>
          <li>
            <t>Description: Google Agent Development Kit plugin for Ed25519
receipt signing. BasePlugin subclass, wraps tool calls.</t>
          </li>
          <li>
            <t>Coverage: Access Decision Receipts.</t>
          </li>
          <li>
            <t>Licensing: MIT.</t>
          </li>
        </ul>
      </section>
      <section anchor="scopeblind-pydantic-ai-pydantic-ai">
        <name>scopeblind-pydantic-ai (Pydantic AI)</name>
        <ul spacing="normal">
          <li>
            <t>Organization: ScopeBlind</t>
          </li>
          <li>
            <t>Implementation: https://pypi.org/project/scopeblind-pydantic-ai/</t>
          </li>
          <li>
            <t>Description: Pydantic AI Capability for Ed25519 receipt signing.
Uses wrap_tool_execute hook for policy evaluation and signing.</t>
          </li>
          <li>
            <t>Coverage: Access Decision Receipts.</t>
          </li>
          <li>
            <t>Licensing: MIT.</t>
          </li>
        </ul>
      </section>
      <section anchor="scopeblind-llamaindex-llamaindex">
        <name>scopeblind-llamaindex (LlamaIndex)</name>
        <ul spacing="normal">
          <li>
            <t>Organization: ScopeBlind</t>
          </li>
          <li>
            <t>Implementation: https://pypi.org/project/scopeblind-llamaindex/</t>
          </li>
          <li>
            <t>Description: LlamaIndex CallbackHandler for FUNCTION_CALL events.
Signs tool calls via BaseCallbackHandler, composes with other
handlers (Langfuse, Arize, etc.).</t>
          </li>
          <li>
            <t>Coverage: Access Decision Receipts.</t>
          </li>
          <li>
            <t>Licensing: MIT.</t>
          </li>
        </ul>
      </section>
      <section anchor="scopeblindvercel-ai-vercel-ai-sdk">
        <name>@scopeblind/vercel-ai (Vercel AI SDK)</name>
        <ul spacing="normal">
          <li>
            <t>Organization: ScopeBlind</t>
          </li>
          <li>
            <t>Implementation: https://www.npmjs.com/package/@scopeblind/vercel-ai</t>
          </li>
          <li>
            <t>Description: Hooks into Vercel AI SDK's experimental_onToolCallStart
and experimental_onToolCallFinish for per-tool-call receipt signing.</t>
          </li>
          <li>
            <t>Coverage: Access Decision Receipts.</t>
          </li>
          <li>
            <t>Licensing: MIT.</t>
          </li>
        </ul>
      </section>
      <section anchor="scopeblindlangchain-langchain-langgraph">
        <name>@scopeblind/langchain (LangChain + LangGraph)</name>
        <ul spacing="normal">
          <li>
            <t>Organization: ScopeBlind</t>
          </li>
          <li>
            <t>Implementation: https://www.npmjs.com/package/@scopeblind/langchain</t>
          </li>
          <li>
            <t>Description: Evidence wrapper for LangChain tool calls and LangGraph
node transitions. Produces decision/execution/outcome receipt DAGs.</t>
          </li>
          <li>
            <t>Coverage: Access Decision Receipts, graph-level receipts.</t>
          </li>
          <li>
            <t>Licensing: MIT.</t>
          </li>
          <li>
            <t>Version: 0.2.0.</t>
          </li>
        </ul>
      </section>
      <section anchor="microsoft-agent-governance-toolkit-enterprise-consumer">
        <name>Microsoft Agent Governance Toolkit (Enterprise Consumer)</name>
        <ul spacing="normal">
          <li>
            <t>Organization: Microsoft</t>
          </li>
          <li>
            <t>Implementation: https://github.com/microsoft/agent-governance-toolkit</t>
          </li>
          <li>
            <t>Description: Consumes receipts via a Cedar policy bridge (PR #667),
governed examples for software tool calls (PR #1159) and physical
attestation (PR #1168). Not a signing implementation; reads and
validates receipts produced by other implementations.</t>
          </li>
          <li>
            <t>Coverage: Access Decision Receipts (consumer-only).</t>
          </li>
          <li>
            <t>Licensing: MIT.</t>
          </li>
        </ul>
      </section>
      <section anchor="aws-cedar-for-agents-wasm-policy-engine">
        <name>AWS Cedar for Agents (WASM Policy Engine)</name>
        <ul spacing="normal">
          <li>
            <t>Organization: AWS / Cedar Policy</t>
          </li>
          <li>
            <t>Implementation: https://github.com/cedar-policy/cedar-for-agents</t>
          </li>
          <li>
            <t>Description: WASM bindings for Cedar policy evaluation in JS/TS
agent hosts. SchemaGenerator (PR #64, merged) and RequestGenerator
(PR #73) enable Cedar-native policy evaluation that produces the
policy_digest field referenced in receipts.</t>
          </li>
          <li>
            <t>Coverage: Policy evaluation inputs; does not produce receipts directly.</t>
          </li>
          <li>
            <t>Licensing: Apache-2.0.</t>
          </li>
        </ul>
      </section>
      <section anchor="sigstore-rekor-transparency-log-anchor">
        <name>Sigstore Rekor (Transparency Log Anchor)</name>
        <ul spacing="normal">
          <li>
            <t>Organization: Linux Foundation / Sigstore</t>
          </li>
          <li>
            <t>Implementation: https://rekor.sigstore.dev</t>
          </li>
          <li>
            <t>Description: Receipts submitted as DSSE entries to Rekor's public
transparency log. Provides an independent temporal anchor: the
Rekor inclusion proof and signed entry timestamp prove the receipt
existed at a specific time without trusting the receipt operator.
Working proof-of-concept submitted (issue #2798).</t>
          </li>
          <li>
            <t>Coverage: Temporal anchoring of any receipt type.</t>
          </li>
          <li>
            <t>Notes: Uses DSSE envelope with payloadType
"application/vnd.scopeblind.receipt+json". Ed25519ph (prehash
variant) required for the alternative hashedrekord entry type.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="example-complete-verification-flow">
      <name>Example: Complete Verification Flow</name>
      <t>The following example demonstrates end-to-end receipt creation and
verification.</t>
      <section anchor="step-1-generate-issuer-keys">
        <name>Step 1: Generate Issuer Keys</name>
        <artwork><![CDATA[
import { generateIssuerKey } from '@scopeblind/passport';
const issuer = generateIssuerKey();
// issuer.issuerId = "sb:issuer:4Kpm7Q3wXx2b"
]]></artwork>
      </section>
      <section anchor="step-2-sign-a-receipt">
        <name>Step 2: Sign a Receipt</name>
        <artwork><![CDATA[
import { signReceipt } from '@scopeblind/passport';

const receipt = signReceipt(
  {
    type: "protectmcp:decision",
    tool_name: "deploy",
    decision: "allow",
    agent_tier: "privileged",
    policy_digest: "sha256:a8f3...c91e",
    issued_at: "2026-03-22T14:32:06.551Z",
    issuer_id: issuer.issuerId
  },
  issuer.secretKeyHex,
  issuer.issuerId
);
]]></artwork>
      </section>
      <section anchor="step-3-verify-cli">
        <name>Step 3: Verify (CLI)</name>
        <artwork><![CDATA[
$ npx @veritasacta/verify receipt.json --key issuer-public.json
[ok] Signature valid
[ok] Issuer: sb:issuer:4Kpm7Q3wXx2b
[ok] Decision: allow (deploy)
[ok] Issued: 2026-03-22T14:32:06.551Z
]]></artwork>
      </section>
    </section>
    <section anchor="changes-from-02">
      <name>Changes from -02</name>
      <ul>
        <li><t>New normative section <xref target="policy-digest-construction"/>:
the policy digest construction (acta-policy-digest-v1) is specified rather
than implementation-defined, with a per-file-hash manifest that avoids
concatenation ambiguity, and a compatibility note for pre-0.10.0
truncated digests.</t></li>
        <li><t>New section <xref target="policy-publication"/>: the
acta.policy-bundle.v1 publication format at
<tt>.well-known/acta-policies/&lt;hex&gt;.json</tt>, recomputable from the
bundle bytes alone.</t></li>
        <li><t>Access decision receipts: <tt>"require_approval"</tt> added
to the <tt>decision</tt> value set for actions held pending human
approval.</t></li>
        <li><t>New OPTIONAL predicate <xref target="evidence-predicate"/>:
records the evidentiary basis a decision rested on (dimension, state,
source, and an optional <tt>as_of</tt>), additive and ignorable by existing
verifiers. <xref target="evidence-trust-model"/> states the condition under
which a dimension counts as independent corroboration, and
<xref target="evidence-false-assurance"/> records the false-assurance risk:
every field is inside the payload the receipt signer controls, so a named
authority or key id is not proof that the named authority attested
anything.</t></li>
        <li><t><xref target="chain-hash-scope"/>: <tt>previousReceiptHash</tt>
carries an explicit <tt>"sha256:"</tt> prefix, matching
<tt>policy_digest</tt> and <tt>source.ref</tt> rather than being the one bare
digest in the document, and the preimage is stated as the whole receipt with
its signature. Implementations differed on both points: some hashed the
payload alone, which cannot distinguish a re-signed receipt from the
original, and some encoded as base64url. The bare-hex form is accepted for
compatibility and no longer emitted.</t></li>
        <li><t><xref target="payload"/>: <tt>verifier_sigil</tt> is
removed. It described the verifier that checked a receipt but was listed as
a signed payload member, which cannot be produced: the issuer signs the
payload before any verifier sees it. See
<xref target="verification-not-in-receipt"/>.</t></li>
        <li><t><xref target="signed-envelope"/>: names the envelope as the
shape new implementations emit and points at the flat shape, rather than
presenting one shape as the only receipt and introducing the second
later.</t></li>
        <li><t><xref target="verification-process"/>: the procedure no longer
assumes the envelope in the steps around the signing input. It extracted a
<tt>payload</tt> member a flat receipt does not have, read the key identifier
from a signature object a flat receipt does not have, and named Ed25519 in a
document that permits ES256.</t></li>
        <li><t><xref target="commitment-mode"/>: removed a claim that the
leaf construction is byte-identical to SD-JWT. It is not. SD-JWT
(<xref target="RFC9901"/>, which also replaces a citation to an expired
draft) uses salted hashes in an <tt>_sd</tt> array with no tree, while this
builds an RFC 6962 Merkle tree. Deployments that need selective disclosure
over JWT claims and no tree are now pointed at SD-JWT instead.</t></li>
        <li><t><xref target="algorithm-agility"/>: corrected the
post-quantum paragraph, which claimed SHA-256 gives 128-bit security against
quantum collision attacks. Collision resistance is already 128-bit
classically by the birthday bound; Grover applies to pre-image.</t></li>
        <li><t>Corrected the receipt type count, which said four and listed
six; added the missing normative references for <xref target="RFC2119"/>,
<xref target="RFC8174"/> and <xref target="RFC9497"/>; removed a reference to
a <tt>policy_id</tt> field this document does not define.</t></li>
        <li><t>New <xref target="chain-completeness"/>: a chain proves no
alteration and no reordering, not that the verifier holds every receipt.
Truncating the newest receipts leaves all remaining links and signatures
valid, detecting it requires an external commitment to count and terminal
hash, and that commitment constrains an issuer only once it reaches
somewhere the issuer cannot rewrite. Records non-equivocation as out of
scope rather than implied.</t></li>
        <li><t>New <xref target="decision-versus-execution"/>: a decision
receipt attests policy evaluation, not that the action executed. Names the
post-execution receipt as the separate artifact and identifies the fields
that distinguish one from the other, a distinction the prior text carried
only in a single field description.</t></li>
        <li><t><xref target="payload"/>: <tt>evidence</tt> and
<tt>committed_fields_root</tt> are listed in the common payload table.
Both were defined in their own sections and appeared in no field table,
the same omission reported against <tt>previousReceiptHash</tt>. The
table's scope is now stated, so a member defined elsewhere that may
appear in any payload type is listed there.</t></li>
        <li><t><xref target="evidence-fields"/>: <tt>source.sig</tt> is no
longer pinned to Ed25519 at a fixed length. It takes an OPTIONAL
<tt>alg</tt> defaulting to <tt>"EdDSA"</tt>, and its encoded length
derives from that algorithm. The prior text would have excluded an
attesting authority holding P-256 keys, including implementations of the
ES256 profile this document already permits for receipt
signatures.</t></li>
        <li><t><xref target="evidence-properties"/>: specifies how evidence
composes with <xref target="commitment-mode"/>. The unit of selective
disclosure is the whole entry, because disclosing a dimension and state
without its source strips the independence signal the trust model depends
on.</t></li>
        <li><t><xref target="signature-scope"/>,
<xref target="signing-process"/>, and
<xref target="verification-process"/>: the signing input is now named once and
defined in one place. The prior text described the signature as covering
<tt>payload</tt> and then redefined <tt>payload</tt> mid-sentence to mean
the receipt with its signature removed, so the two sections specified
different byte strings. The signing input is the receipt without its
<tt>signature</tt> member. The verification procedure carried the same
defect. Checking the deployed implementations showed the two statements
were not a drafting error but two real receipt shapes described in one
place: an envelope carrying a <tt>payload</tt> member and a structured
signature, signed over <tt>JCS(payload)</tt>, and a flat form carrying its
fields at the top level with a hexadecimal signature, signed over the
receipt minus that member. Both are in use and both verify today.
<xref target="signature-scope"/> now defines the shapes separately and
requires an implementation to determine the shape before computing the
signing input.</t></li>
        <li><t><xref target="payload"/>: <tt>previousReceiptHash</tt> is
listed as an optional payload member with its cardinality and genesis
behaviour, having previously been defined only inside the optional
commitment extension and listed in no field table.</t></li>
        <li><t><xref target="signature-object"/>: the fixed 128-character
signature length is removed and the algorithm list defers to
<xref target="algorithm-agility"/>. The prior text pinned an
Ed25519-sized encoding that the agility section's own recommended
algorithms cannot satisfy.</t></li>
        <li><t><xref target="commitment-disclosure"/>: states that the
sibling side in an inclusion proof is derived from <tt>index</tt> and
<tt>tree_size</tt> under the split rule and is deliberately not carried,
so implementers do not assume a padded fixed-depth tree and diverge on
non-power-of-two trees.</t></li>
        <li><t><xref target="replay-protection"/>: the freshness window is
scoped to live presentation and explicitly does not apply to archival
verification, which it would otherwise have rejected wholesale.</t></li>
        <li><t>Change-log appendices: corrected a crossed anchor and an
appendix that named the wrong source revision.</t></li>
      </ul>
    </section>
    <section anchor="changes-01">
      <name>Changes from -01</name>
      <t>This section summarizes the changes from
draft-farley-acta-signed-receipts-01.</t>
      <dl>
        <dt>action_ref:</dt>
        <dd>
          <t>Added <tt>action_ref</tt> as an OPTIONAL common payload field
(Section 2.2). Provides a normative cross-engine correlation
anchor computed as SHA-256 of the JCS-canonicalized action
inputs. Enables bilateral verification across independent
governance engines evaluating the same action. Motivated by
successful composition testing between ScopeBlind Cedar and
Agent Passport System delegation engines, where 8 receipts
from 2 engines verified against a single action reference.</t>
        </dd>
        <dt>verifier_sigil:</dt>
        <dd>
          <t>Added <tt>verifier_sigil</tt> as an OPTIONAL common payload field
(Section 2.2). Carries the fingerprint of the Sigil commitment
on the verifier that checked the receipt. Enables downstream
consumers to distinguish receipts verified by the canonical
@veritasacta/verify from those verified by forks or modified
copies. Produced at verification time, not at signing time.</t>
        </dd>
        <dt>iteration_id:</dt>
        <dd>
          <t>Added <tt>iteration_id</tt> as an OPTIONAL common payload field
(Section 2.2). Supports behavioral analysis of multi-step
agent workflows by providing a logical grouping identifier.
Designed for optimization loops, multi-round deliberations,
and meta-agent modification chains. Agent-declared, covered
by the receipt signature for tamper evidence but not a
security boundary.</t>
        </dd>
        <dt>ES256 algorithm support:</dt>
        <dd>
          <t>Updated the <tt>alg</tt> field specification (Section 2.1.1) to
permit "ES256" (ECDSA with P-256 and SHA-256) as an
additional supported algorithm alongside the mandatory-to-
implement "EdDSA" (Ed25519). Motivated by ecosystem
providers (compliance risk attestation, multi-attestation
envelopes) that use P-256 keys natively.</t>
        </dd>
        <dt>Transparency log anchoring:</dt>
        <dd>
          <t>Documented Sigstore Rekor as an OPTIONAL temporal anchor for
receipts. Receipts wrapped in DSSE envelopes (payloadType
"application/vnd.scopeblind.receipt+json") can be submitted to
Rekor's public transparency log. The Rekor inclusion proof
provides an independent timestamp from the Linux Foundation's
append-only log, giving receipts a second verification path
beyond the signer's Ed25519 key. Motivated by the need to
prevent operators from backdating receipts.</t>
        </dd>
        <dt>Physical attestation use case:</dt>
        <dd>
          <t>Extended the specification's applicability from software agent
tool calls to physical sensor attestation. A cold chain
attestation sensor (ATECC608B secure element, SHT40 temp,
LIS2DH12 accel, L76K GPS, VEML7700 lux) produces receipts
using the same format, same canonicalization, and same
verification CLI as software agent receipts. Demonstrates
that the receipt format is domain-agnostic: the same envelope
carries software decisions and physical-world observations.</t>
        </dd>
        <dt>SLSA provenance mapping:</dt>
        <dd>
          <t>Documented field-by-field correspondence between receipt payload
fields and SLSA v1.0 provenance predicates. When an AI agent
builds software and protect-mcp generates a signed receipt chain,
the chain constitutes build provenance at SLSA L1/L2. The
<tt>policy_digest</tt> field provides governance metadata that standard SLSA provenance does not carry.</t>
        </dd>
        <dt>Implementation count:</dt>
        <dd>
          <t>Updated from 3 implementations (protect-mcp, verify, passport)
to 11 implementations across 8 frameworks, 4 enterprise
ecosystems (Microsoft AGT, AWS Cedar, Linux Foundation Sigstore,
OWASP DependencyTrack), and 2 registries (npm, PyPI). Combined
monthly downloads exceed 10,000.</t>
        </dd>
      </dl>
    </section>
    <section anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>The Acta receipt format was developed as part of the Veritas Acta
protocol, an infrastructure for verifiable machine decision-making.
The design draws on work in the IETF OAuth and Web Authentication
communities, particularly RFC 9449 (DPoP) for proof-of-possession
patterns and RFC 8785 (JCS) for deterministic serialization.</t>
      <t>The evidence predicate in <xref target="evidence-predicate"/>
originated in a proposal from Seydou Diaby of UseTruth, who identified that a
receipt records which decision was made but not the basis it rested on, and
who contributed the closed value sets and the structured <tt>source</tt>
object. The requirement that the attesting key be independent of the receipt
signer, and the false-assurance analysis that follows from it, were developed
jointly.</t>
      <t>Thanks to Michael Msebenzi for a detailed errata review of the
-02 revision, conducted by building an independent verifier and
recomputing against pinned bytes. That review identified the signing-scope
contradiction between Sections 2.2, 4.1 and 5.6, the unspecified location
and lifecycle of <tt>previousReceiptHash</tt>, the conflict between the
fixed signature length and algorithm agility, the freshness window's
effect on archival verification, the absent note on deriving sibling side
in inclusion proofs, and errors in the change-log appendices. All are
addressed in this revision.</t>
      <t>Thanks to Sam Gardner for identifying an inconsistency in the
signature preimage definition in the -01 revision, where the signature
scope section described signing over SHA-256(JCS(payload)) while the
signature object and the signing and verification procedures signed over
the canonical JCS bytes directly. The signature scope section
(<xref target="signature-scope"/>) was corrected in -02 to match the
signing process (<xref target="signing-process"/>). Sections are named
rather than numbered here because the numbering has changed across
revisions.</t>
      <t>The <tt>action_ref</tt> normative definition was developed in
collaboration with the Agent Passport System project. The
<tt>verifier_sigil</tt> mechanism was motivated by the Sigil visual
commitment primitive. The <tt>iteration_id</tt> field was proposed by
contributors to the HyperAgents safety policy discussion.
Cross-engine composition testing was performed against receipts
from ScopeBlind (Cedar policy), Agent Passport System (delegation
scope), and AgentID (identity verification).</t>
      <t>The Rekor transparency log integration was informed by feedback
from Hayden-IO (Sigstore contributor), who clarified the Ed25519ph
requirement for hashedrekord entries and confirmed DSSE as the
recommended entry type for Ed25519-signed attestations.</t>
      <t>The physical attestation extension was motivated by the Australian
Emerging Technology Commercialisation Fund (ETCF) grant program and
by discussions on Microsoft Agent Governance Toolkit issue #787
(Physical AI agents: OWASP coverage gap for robotic/actuator systems)
with contributions from SINT Protocol (physical constraint
enforcement) and the agent-governance-vocabulary project
(context_dimensions for physical-world policy attributes).</t>
      <t>The SLSA provenance mapping was proposed in collaboration with the
SLSA framework specification community (issue #1606).</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
hqzk6xifht1ubKxk9PLgJaz8/wH6peZeXIAAAA==

-->

</rfc>
