<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE rfc [
  <!ENTITY nbsp "&#160;">
]>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude"
     docName="draft-cowles-volt-00"
     ipr="trust200902"
     submissionType="independent"
     category="exp"
    
     xml:lang="en"
     version="3">

  <front>
    <title abbrev="VOLT Protocol">Verifiable Operations Ledger and Trace (VOLT) Protocol</title>
    <seriesInfo name="Internet-Draft" value="draft-cowles-volt-00"/>
    <author fullname="Adam Cowles" initials="A." surname="Cowles">
      <organization>Quox Ltd</organization>
      <address>
        <postal>
          <city>London</city>
          <country>United Kingdom</country>
        </postal>
        <email>adam@quox.ai</email>
        <uri>https://quox.ai</uri>
      </address>
    </author>
    <date/>
    <area>Security</area>
    <workgroup>Independent Submission</workgroup>
    <keyword>AI agents</keyword>
    <keyword>cryptographic proof</keyword>
    <keyword>tamper evidence</keyword>
    <keyword>hash chain</keyword>
    <keyword>audit trail</keyword>
    <keyword>evidence bundle</keyword>

    <abstract>
      <t>
        The Verifiable Operations Ledger and Trace (VOLT) protocol defines
        a minimal, interoperable format for producing tamper-evident execution
        traces for agentic AI workflows.  VOLT records are linked via SHA-256
        hash chains and packaged into portable Evidence Bundles that can be
        verified independently by any conformant implementation.
      </t>
      <t>
        VOLT functions as a "flight recorder" for AI agent operations: it
        captures the sequence of events -- messages received, policy
        decisions evaluated, human approvals granted, tools invoked, and
        results returned -- with cryptographic integrity guarantees that
        detect post-hoc modification, deletion, or insertion of records.
      </t>
      <t>
        The protocol is privacy-first by design.  Events carry metadata
        and content-addressed references rather than raw secrets or
        sensitive payloads.  Evidence Bundles support explicit redaction,
        optional Ed25519 signatures for non-repudiation, and both rolling
        and final snapshot modes for long-running workflows.
      </t>
    </abstract>
  </front>

  <middle>

    <!-- ============================================================ -->
    <!-- Section 1: Introduction                                       -->
    <!-- ============================================================ -->
    <section anchor="introduction">
      <name>Introduction</name>
      <t>
        Autonomous and semi-autonomous AI agents are increasingly deployed
        to perform consequential operations: modifying production
        infrastructure, executing financial transactions, managing
        sensitive data, and orchestrating multi-step workflows across
        organizational boundaries.  The operational logs produced by these
        systems are typically mutable, platform-locked, and lack
        cryptographic integrity guarantees.  When an incident occurs --
        an unauthorized change, a policy violation, or an unexpected
        outcome -- operators cannot reliably determine whether the
        recorded trace accurately reflects what happened.
      </t>
      <t>
        VOLT addresses this gap by defining a lightweight protocol for
        producing execution traces where each event is cryptographically
        linked to its predecessor via SHA-256 hash chaining.  This
        creates an append-only integrity chain: any modification,
        deletion, or insertion of events after the fact is detectable
        through recomputation of hashes.  Events are packaged into
        self-describing, portable Evidence Bundles that include a
        manifest, the event chain, content-addressed attachments, and
        optional digital signatures.
      </t>
      <t>
        VOLT is designed as a companion protocol to the Agent Envelope
        Exchange (AEE) <xref target="AEE"/> messaging format and the
        Agent Orchestration Control Layers (AOCL) <xref target="AOCL"/>
        governance framework.  Together, these three protocols provide a
        layered architecture for agentic systems: AEE handles message
        transport, AOCL enforces policies and approval gates, and VOLT
        records a tamper-evident audit trail of everything that occurred.
      </t>
      <t>
        It is important to note that VOLT provides tamper evidence, not
        "truth."  If the execution host is fully compromised, an attacker
        controlling the recorder can emit a consistent but fabricated
        trace.  VOLT detects post-hoc tampering of recorded traces; it
        does not guarantee that the recorder was honest at the time of
        recording.  Optional signatures and planned future attestation
        mechanisms strengthen the non-repudiation properties, but the
        fundamental trust anchor remains the integrity of the recording
        environment.
      </t>
      <t>
        This document specifies VOLT version 0.1, covering event
        recording, hash chaining, Evidence Bundle packaging,
        verification, privacy and redaction rules, and conformance
        levels.  Features such as deterministic replay, a trace query
        language, remote hardware attestation, and blockchain anchoring
        are explicitly out of scope for this version and are noted as
        future work.
      </t>
    </section>

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

    <!-- ============================================================ -->
    <!-- Section 3: Terminology                                        -->
    <!-- ============================================================ -->
    <section anchor="terminology">
      <name>Terminology</name>
      <dl>
        <dt>Run</dt>
        <dd>
          A single end-to-end execution instance, spanning from a user
          request (or system trigger) through to a terminal outcome.
          Each run is identified by a unique <tt>run_id</tt>.
        </dd>

        <dt>Trace</dt>
        <dd>
          The ordered sequence of events for a single run, forming the
          complete audit record of everything that occurred.
        </dd>

        <dt>Event</dt>
        <dd>
          One atomic record describing something that happened during a
          run: a message received, a policy decision, a tool invocation,
          a human approval, a model response, or any other observable
          action.
        </dd>

        <dt>Ledger Chain</dt>
        <dd>
          The sequence of events linked by <tt>prev_hash</tt> references,
          forming an append-only integrity chain.  Each event's hash
          covers the event content, and each event's <tt>prev_hash</tt>
          points to the hash of the immediately preceding event.
        </dd>

        <dt>Evidence Bundle</dt>
        <dd>
          A portable, self-describing package containing the trace
          (as NDJSON), a manifest, optional content-addressed
          attachments, optional signatures, and optional redaction
          metadata.  Bundles are designed for audit, compliance, and
          incident reconstruction.
        </dd>

        <dt>Attachment</dt>
        <dd>
          A content-addressed blob referenced by events via SHA-256
          hash.  Attachments hold tool outputs, generated artifacts,
          or other data that is too large or too detailed to embed in
          event payloads.
        </dd>

        <dt>Commitment</dt>
        <dd>
          A cryptographic hash representing content: an event hash, an
          attachment hash, or a run root hash.  Commitments enable
          integrity verification without requiring access to the
          original content.
        </dd>

        <dt>Attestation</dt>
        <dd>
          A digital signature over one or more commitments, asserting
          that a particular actor or runner observed or executed the
          attested operations.  Attestations are optional in VOLT v0.1
          but the schema reserves fields for them.
        </dd>
      </dl>
    </section>

    <!-- ============================================================ -->
    <!-- Section 4: Design Constraints                                 -->
    <!-- ============================================================ -->
    <section anchor="design-constraints">
      <name>Design Constraints</name>

      <section anchor="privacy-by-default">
        <name>Privacy by Default</name>
        <t>
          VOLT events MUST NOT include secrets such as API keys,
          passwords, raw tokens, or private keys.  Events SHOULD store
          metadata and content-addressed references (hashes) instead of
          raw content.  Sensitive payload fields SHOULD be omitted or
          redacted at source.  VOLT is an evidence protocol, and evidence
          that leaks secrets is a liability rather than an asset.
        </t>
      </section>

      <section anchor="minimal-schema">
        <name>Minimal Schema with Extensible Evolution</name>
        <t>
          Every event MUST include a <tt>volt_version</tt> field.
          Unknown fields MUST be ignored by verifiers to ensure forward
          compatibility.  Breaking changes to the event schema MUST
          increment the <tt>volt_version</tt> value (e.g., from "0.1"
          to "0.2" for compatible additions, or to "1.0" for
          incompatible changes).
        </t>
      </section>

      <section anchor="tamper-evidence">
        <name>Tamper Evidence, Not "Truth"</name>
        <t>
          VOLT guarantees that recorded traces are tamper-evident: any
          modification after the fact is detectable through hash
          verification.  VOLT does not guarantee correctness of the
          recorded data if the host environment is fully compromised at
          the time of recording.  The protocol detects changes to the
          record; it does not attest to the fidelity of what was
          recorded.
        </t>
      </section>
    </section>

    <!-- ============================================================ -->
    <!-- Section 5: Transport and Encoding                             -->
    <!-- ============================================================ -->
    <section anchor="transport-encoding">
      <name>Transport and Encoding</name>
      <t>
        VOLT events are stored as Newline-Delimited JSON (NDJSON): one
        complete JSON <xref target="RFC8259"/> object per line,
        separated by a single newline character (U+000A).  The encoding
        MUST be UTF-8.  Each line MUST be a syntactically complete JSON
        object; partial objects or multi-line pretty-printed JSON MUST
        NOT be used in the events file.
      </t>
      <t>
        The events file is conventionally named <tt>events.ndjson</tt>,
        though an alternative filename MAY be specified in the Evidence
        Bundle manifest via the <tt>events_file</tt> field.  Events
        within the file MUST be ordered by ascending <tt>seq</tt> value.
      </t>
    </section>

    <!-- ============================================================ -->
    <!-- Section 6: Canonicalization                                    -->
    <!-- ============================================================ -->
    <section anchor="canonicalization">
      <name>Canonicalization</name>
      <t>
        To ensure consistent hashing across implementations, VOLT
        defines a Canonical JSON serialization.  An implementation MUST
        produce a canonical byte representation of an event object as
        follows:
      </t>
      <ol>
        <li>
          Serialize as JSON with UTF-8 encoding and no insignificant
          whitespace (no spaces after colons or commas, no newlines or
          indentation).
        </li>
        <li>
          Object keys MUST be sorted lexicographically (byte-wise
          comparison of UTF-8 encoded key strings) at every nesting
          level.
        </li>
        <li>
          Numbers MUST be represented without exponent notation where
          possible, and without a trailing ".0" when the value is
          integral.  For example, the number 100 MUST be serialized as
          <tt>100</tt>, not <tt>1e2</tt> or <tt>100.0</tt>.
        </li>
        <li>
          Strings MUST be Unicode NFC (Normalization Form Composed)
          normalized before serialization.
        </li>
      </ol>
      <t>
        If an implementation's language or standard library does not
        provide a canonical JSON serializer, the implementation MUST
        apply a deterministic key sort and the normalized serialization
        rules above to produce byte-identical output for identical
        input objects.
      </t>
    </section>

    <!-- ============================================================ -->
    <!-- Section 7: Cryptographic Primitives                           -->
    <!-- ============================================================ -->
    <section anchor="crypto-primitives">
      <name>Cryptographic Primitives</name>

      <section anchor="hash-algorithm">
        <name>Hash Algorithm</name>
        <t>
          Event hashing and attachment hashing MUST use SHA-256
          <xref target="RFC6234"/> in VOLT v0.1.  Future versions MAY
          introduce algorithm agility; the <tt>hash_alg</tt> field in
          manifests and attachment references is reserved for this
          purpose.
        </t>
      </section>

      <section anchor="hash-encoding">
        <name>Hash Encoding</name>
        <t>
          Hash values MUST be encoded as lowercase hexadecimal strings
          of exactly 64 characters (representing the 256-bit SHA-256
          digest).  Implementations MAY display a prefixed form such as
          <tt>sha256:2cf24d...</tt> in user interfaces, but the stored
          value in event fields and manifest fields MUST be the pure
          64-character hexadecimal string without prefix.
        </t>
      </section>

      <section anchor="signatures">
        <name>Signatures</name>
        <t>
          Digital signatures are optional in VOLT v0.1 but the event
          and manifest schemas reserve fields for them.  When signatures
          are used:
        </t>
        <ul>
          <li>
            The signature algorithm SHOULD be Ed25519
            <xref target="RFC8032"/>.
          </li>
          <li>
            Public key identifiers SHOULD be stable across sessions,
            using a DID (Decentralized Identifier) or a key fingerprint.
          </li>
          <li>
            Signatures MUST be computed over a clearly defined message
            structure, as specified in <xref target="signature-records"/>.
          </li>
        </ul>
      </section>
    </section>

    <!-- ============================================================ -->
    <!-- Section 8: Identifiers and Time                               -->
    <!-- ============================================================ -->
    <section anchor="identifiers-time">
      <name>Identifiers and Time</name>

      <section anchor="identifiers">
        <name>Identifiers</name>
        <t>
          The <tt>run_id</tt> field MUST be unique per run.  The
          <tt>event_id</tt> field MUST be unique within a run.
          Identifiers SHOULD be UUIDv4 <xref target="RFC4122"/> or ULID
          (Universally Unique Lexicographically Sortable Identifier).
          Other globally unique identifier schemes MAY be used provided
          they satisfy the uniqueness requirements.
        </t>
      </section>

      <section anchor="timestamps">
        <name>Timestamps</name>
        <t>
          The <tt>ts</tt> field MUST be an ISO 8601 timestamp in UTC
          with the "Z" suffix.  Millisecond precision is RECOMMENDED.
          For example: <tt>2026-02-28T19:11:02.123Z</tt>.
          Implementations MUST NOT use local time zone offsets; all
          timestamps MUST be expressed in UTC.
        </t>
      </section>
    </section>

    <!-- ============================================================ -->
    <!-- Section 9: Event Schema                                       -->
    <!-- ============================================================ -->
    <section anchor="event-schema">
      <name>Event Schema</name>
      <t>
        All VOLT events are JSON objects.  Every event MUST contain the
        following top-level fields:
      </t>

      <table anchor="event-fields-table">
        <name>Required Event Fields</name>
        <thead>
          <tr>
            <th>Field</th>
            <th>Type</th>
            <th>Description</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td><tt>volt_version</tt></td>
            <td>string</td>
            <td>Protocol version, e.g., "0.1"</td>
          </tr>
          <tr>
            <td><tt>event_id</tt></td>
            <td>string</td>
            <td>Unique identifier for this event within the run</td>
          </tr>
          <tr>
            <td><tt>run_id</tt></td>
            <td>string</td>
            <td>Unique identifier for the run</td>
          </tr>
          <tr>
            <td><tt>ts</tt></td>
            <td>string</td>
            <td>ISO 8601 UTC timestamp with Z suffix</td>
          </tr>
          <tr>
            <td><tt>seq</tt></td>
            <td>integer</td>
            <td>Monotonically increasing sequence number, starting at 1</td>
          </tr>
          <tr>
            <td><tt>event_type</tt></td>
            <td>string</td>
            <td>Dotted path identifying the event kind</td>
          </tr>
          <tr>
            <td><tt>actor</tt></td>
            <td>object</td>
            <td>Who caused or observed the event</td>
          </tr>
          <tr>
            <td><tt>context</tt></td>
            <td>object</td>
            <td>Correlation and cross-protocol linkage</td>
          </tr>
          <tr>
            <td><tt>payload</tt></td>
            <td>object</td>
            <td>Event-type-specific data (privacy-safe)</td>
          </tr>
          <tr>
            <td><tt>prev_hash</tt></td>
            <td>string</td>
            <td>64-char hex; hash of preceding event (64 zeros for genesis)</td>
          </tr>
          <tr>
            <td><tt>hash</tt></td>
            <td>string</td>
            <td>64-char hex; SHA-256 of canonical event without hash field</td>
          </tr>
        </tbody>
      </table>

      <section anchor="actor-object">
        <name>Actor Object</name>
        <t>
          The <tt>actor</tt> object describes who emitted the event.
          It has the following fields:
        </t>
        <t>
          REQUIRED fields:
        </t>
        <ul>
          <li>
            <tt>actor_type</tt> (string): One of "agent", "human",
            "system", "tool", or "runner".
          </li>
          <li>
            <tt>actor_id</tt> (string): A stable identifier for the
            actor, such as an agent name, user ID, or system component
            identifier.
          </li>
        </ul>
        <t>
          OPTIONAL fields:
        </t>
        <ul>
          <li>
            <tt>display_name</tt> (string): A human-readable name for
            display purposes.
          </li>
          <li>
            <tt>org_id</tt> (string): Organizational identifier.
          </li>
          <li>
            <tt>team_id</tt> (string): Team identifier within the
            organization.
          </li>
          <li>
            <tt>runner_id</tt> (string): Machine or host identity,
            when known, identifying the execution environment.
          </li>
        </ul>
        <t>
          Example:
        </t>
        <artwork type="json"><![CDATA[
{
  "actor_type": "agent",
  "actor_id": "quox.agent.routeros",
  "display_name": "RouterOS Agent",
  "runner_id": "runner:vm-prod-01"
}
]]></artwork>
      </section>

      <section anchor="context-object">
        <name>Context Object</name>
        <t>
          The <tt>context</tt> object links the event to AEE/AOCL and
          other external systems, enabling cross-protocol correlation.
        </t>
        <t>
          REQUIRED fields:
        </t>
        <ul>
          <li>
            <tt>correlation_id</tt> (string): A stable identifier
            spanning the run.  Implementations SHOULD use the AEE
            correlation ID as the primary linkage value.
          </li>
        </ul>
        <t>
          OPTIONAL fields:
        </t>
        <ul>
          <li>
            <tt>parent_event_id</tt> (string): For span-like linkage
            to a parent event within the same run.
          </li>
          <li>
            <tt>aee_envelope_id</tt> (string): AEE envelope identifier.
          </li>
          <li>
            <tt>aee_message_id</tt> (string): AEE message identifier.
          </li>
          <li>
            <tt>aocl_policy_id</tt> (string): AOCL policy identifier
            relevant to this event.
          </li>
          <li>
            <tt>aocl_decision_id</tt> (string): AOCL decision
            identifier for a specific policy evaluation.
          </li>
          <li>
            <tt>workspace_id</tt> (string): Workspace or tenant
            identifier.
          </li>
          <li>
            <tt>project_id</tt> (string): Project identifier.
          </li>
          <li>
            <tt>tags</tt> (array of strings): Freeform tags for
            categorization and filtering.
          </li>
        </ul>
        <t>
          Example:
        </t>
        <artwork type="json"><![CDATA[
{
  "correlation_id": "aee-corr-01HZABC123",
  "aee_envelope_id": "aee-env-456",
  "aocl_policy_id": "policy.prod.write.requires_hitl",
  "tags": ["prod", "write", "hitl"]
}
]]></artwork>
      </section>

      <section anchor="payload-object">
        <name>Payload Object</name>
        <t>
          The <tt>payload</tt> object carries event-type-specific data.
          It MUST be safe by default: implementations MUST include
          metadata (tool names, operation types, timing, status codes)
          rather than secrets or raw sensitive content.  Attachments
          SHOULD be referenced by hash rather than embedded.
        </t>
        <t>
          In VOLT v0.1, payloads are metadata-only.  Examples of
          appropriate payload content include: field names present in the
          original message (<tt>payload_keys</tt>), token counts, tool
          names, exit codes, and duration measurements.  Full-content
          payloads (raw message text, raw tool output) are deferred to
          future versions and will require opt-in redaction support to
          be conformant.
        </t>
      </section>
    </section>

    <!-- ============================================================ -->
    <!-- Section 10: Event Hashing and Chaining                        -->
    <!-- ============================================================ -->
    <section anchor="hashing-chaining">
      <name>Event Hashing and Chaining</name>

      <section anchor="hash-input">
        <name>Hash Computation</name>
        <t>
          The event <tt>hash</tt> is computed as:
        </t>
        <artwork><![CDATA[
hash = SHA-256( CanonicalJSON( EventWithoutHashField ) )
]]></artwork>
        <t>
          Where <tt>EventWithoutHashField</tt> is the complete event
          object with the <tt>hash</tt> field removed.  All other
          fields, including <tt>prev_hash</tt>, are included in the
          hash input.  The result is encoded as a 64-character lowercase
          hexadecimal string.
        </t>
      </section>

      <section anchor="genesis-event">
        <name>Genesis Event</name>
        <t>
          The first event in a run (the genesis event) MUST have:
        </t>
        <ul>
          <li><tt>seq</tt> equal to 1.</li>
          <li>
            <tt>prev_hash</tt> equal to 64 hexadecimal zeros:
            <tt>"0000000000000000000000000000000000000000000000000000000000000000"</tt>.
          </li>
        </ul>
      </section>

      <section anchor="chain-rule">
        <name>Chain Rule</name>
        <t>
          For all events where <tt>seq</tt> is greater than 1, the
          <tt>prev_hash</tt> field MUST equal the <tt>hash</tt> of the
          event with sequence number <tt>seq - 1</tt>.  Verifiers MUST
          reject any trace where the chain rule is violated.
        </t>
      </section>

      <section anchor="chaining-example">
        <name>Chained Events Example</name>
        <t>
          The following example shows three chained events forming a
          minimal trace.  Hashes shown are illustrative abbreviated
          values; real implementations MUST use full 64-character
          hexadecimal SHA-256 digests.
        </t>
        <artwork type="json"><![CDATA[
{"volt_version":"0.1","event_id":"evt-001",
 "run_id":"run-abc-123",
 "ts":"2026-02-28T19:12:00.000Z","seq":1,
 "event_type":"run.started",
 "actor":{"actor_type":"system",
          "actor_id":"quox.core"},
 "context":{"correlation_id":"corr-xyz-789"},
 "payload":{"entrypoint":"api.chat",
            "mode":"orchestrated"},
 "prev_hash":"00000000...00000000",
 "hash":"a1b2c3d4...e5f60718"}

{"volt_version":"0.1","event_id":"evt-002",
 "run_id":"run-abc-123",
 "ts":"2026-02-28T19:12:00.050Z","seq":2,
 "event_type":"aee.envelope.received",
 "actor":{"actor_type":"system",
          "actor_id":"quox.aee.gateway"},
 "context":{"correlation_id":"corr-xyz-789",
            "aee_envelope_id":"aee-env-456"},
 "payload":{"channel":"web","size_bytes":1842},
 "prev_hash":"a1b2c3d4...e5f60718",
 "hash":"b2c3d4e5...f6071829"}

{"volt_version":"0.1","event_id":"evt-003",
 "run_id":"run-abc-123",
 "ts":"2026-02-28T19:12:01.000Z","seq":3,
 "event_type":"tool.call.executed",
 "actor":{"actor_type":"runner",
          "actor_id":"runner:vm-prod-01"},
 "context":{"correlation_id":"corr-xyz-789"},
 "payload":{"tool_name":"shell",
   "status":"success","duration_ms":812,
   "attachment_refs":[
     {"hash_alg":"sha256",
      "hash":"e3b0c442...7852b855",
      "content_type":"text/plain",
      "label":"stdout"}]},
 "prev_hash":"b2c3d4e5...f6071829",
 "hash":"c3d4e5f6...07182930"}
]]></artwork>
        <t>
          In this trace:
        </t>
        <ul>
          <li>
            Event 1 (genesis) has <tt>prev_hash</tt> set to 64 zeros
            and its <tt>hash</tt> computed from its own content.
          </li>
          <li>
            Event 2 has <tt>prev_hash</tt> equal to Event 1's
            <tt>hash</tt>, establishing the chain link.
          </li>
          <li>
            Event 3 has <tt>prev_hash</tt> equal to Event 2's
            <tt>hash</tt>, continuing the chain.  It also references
            an attachment by SHA-256 hash.
          </li>
        </ul>
      </section>
    </section>

    <!-- ============================================================ -->
    <!-- Section 11: Standard Event Types                              -->
    <!-- ============================================================ -->
    <section anchor="event-types">
      <name>Standard Event Types</name>
      <t>
        Implementations MAY introduce custom event types, but the
        following standard types are RECOMMENDED for interoperability.
        The <tt>event_type</tt> field MUST be a lowercase dotted string
        with at least two segments.
      </t>

      <section anchor="run-lifecycle">
        <name>Run Lifecycle Events</name>
        <table>
          <name>Run Lifecycle Event Types</name>
          <thead>
            <tr><th>Event Type</th><th>Description</th></tr>
          </thead>
          <tbody>
            <tr><td><tt>run.started</tt></td><td>Run initialization; first substantive event after genesis</td></tr>
            <tr><td><tt>run.completed</tt></td><td>Run finished successfully</td></tr>
            <tr><td><tt>run.failed</tt></td><td>Run terminated with an error</td></tr>
            <tr><td><tt>run.cancelled</tt></td><td>Run was cancelled by a user or system</td></tr>
          </tbody>
        </table>
      </section>

      <section anchor="aee-events">
        <name>AEE Messaging Events</name>
        <table>
          <name>AEE Event Types</name>
          <thead>
            <tr><th>Event Type</th><th>Description</th></tr>
          </thead>
          <tbody>
            <tr><td><tt>aee.envelope.received</tt></td><td>An AEE envelope was received by the system</td></tr>
            <tr><td><tt>aee.envelope.sent</tt></td><td>An AEE envelope was sent to a recipient</td></tr>
            <tr><td><tt>aee.message.parsed</tt></td><td>An AEE message was successfully parsed</td></tr>
            <tr><td><tt>aee.message.rejected</tt></td><td>An AEE message was rejected (validation failure)</td></tr>
          </tbody>
        </table>
      </section>

      <section anchor="aocl-events">
        <name>AOCL Policy and Control Events</name>
        <table>
          <name>AOCL Event Types</name>
          <thead>
            <tr><th>Event Type</th><th>Description</th></tr>
          </thead>
          <tbody>
            <tr><td><tt>aocl.policy.evaluated</tt></td><td>A policy was evaluated against the current context</td></tr>
            <tr><td><tt>aocl.decision.approved</tt></td><td>A policy evaluation resulted in approval</td></tr>
            <tr><td><tt>aocl.decision.denied</tt></td><td>A policy evaluation resulted in denial</td></tr>
            <tr><td><tt>aocl.hitl.required</tt></td><td>A policy mandated human-in-the-loop approval</td></tr>
          </tbody>
        </table>
      </section>

      <section anchor="tool-events">
        <name>Tool Execution Events</name>
        <table>
          <name>Tool Event Types</name>
          <thead>
            <tr><th>Event Type</th><th>Description</th></tr>
          </thead>
          <tbody>
            <tr><td><tt>tool.call.requested</tt></td><td>A tool invocation was requested by an agent</td></tr>
            <tr><td><tt>tool.call.executed</tt></td><td>A tool invocation completed (success or failure)</td></tr>
            <tr><td><tt>tool.call.failed</tt></td><td>A tool invocation failed with an error</td></tr>
          </tbody>
        </table>
      </section>

      <section anchor="hitl-events">
        <name>Human-in-the-Loop Events</name>
        <table>
          <name>HITL Event Types</name>
          <thead>
            <tr><th>Event Type</th><th>Description</th></tr>
          </thead>
          <tbody>
            <tr><td><tt>hitl.requested</tt></td><td>Human approval was requested</td></tr>
            <tr><td><tt>hitl.approved</tt></td><td>A human approved the requested action</td></tr>
            <tr><td><tt>hitl.denied</tt></td><td>A human denied the requested action</td></tr>
            <tr><td><tt>hitl.timed_out</tt></td><td>A human approval request expired without response</td></tr>
          </tbody>
        </table>
      </section>

      <section anchor="file-net-events">
        <name>File and Network Events</name>
        <table>
          <name>File and Network Event Types</name>
          <thead>
            <tr><th>Event Type</th><th>Description</th></tr>
          </thead>
          <tbody>
            <tr><td><tt>file.read</tt></td><td>A file was read (metadata only: path category, size)</td></tr>
            <tr><td><tt>file.write</tt></td><td>A file was written (metadata only: path category, size)</td></tr>
            <tr><td><tt>net.request</tt></td><td>A network request was made (metadata only: method, status, timing)</td></tr>
          </tbody>
        </table>
      </section>

      <section anchor="model-events">
        <name>Model Activity Events</name>
        <table>
          <name>Model Event Types</name>
          <thead>
            <tr><th>Event Type</th><th>Description</th></tr>
          </thead>
          <tbody>
            <tr><td><tt>model.requested</tt></td><td>An AI model inference was requested (metadata: model name, token count)</td></tr>
            <tr><td><tt>model.responded</tt></td><td>An AI model returned a response (metadata: model name, tokens used)</td></tr>
          </tbody>
        </table>
      </section>

      <section anchor="custom-event-types">
        <name>Custom Event Types</name>
        <t>
          Custom event types MAY be introduced by implementations.
          Custom types MUST NOT conflict with the standard prefixes
          (<tt>run</tt>, <tt>aee</tt>, <tt>aocl</tt>, <tt>tool</tt>,
          <tt>hitl</tt>, <tt>file</tt>, <tt>net</tt>, <tt>model</tt>)
          unless they are extending those namespaces in a compatible
          manner.  Custom types SHOULD use a vendor namespace prefix,
          for example:
        </t>
        <ul>
          <li><tt>quox.marketplace.offer.created</tt></li>
          <li><tt>vendorx.routeros.script.deployed</tt></li>
        </ul>
        <t>
          Verifiers MUST ignore unknown <tt>event_type</tt> values
          provided that all required fields are present and valid.
        </t>
      </section>
    </section>

    <!-- ============================================================ -->
    <!-- Section 12: Attachments                                       -->
    <!-- ============================================================ -->
    <section anchor="attachments">
      <name>Attachments</name>
      <t>
        Attachments are content-addressed blobs referenced by events.
        They hold data that is too large or too detailed for inline
        inclusion in event payloads, such as tool standard output,
        generated configuration files, or sanitized report artifacts.
      </t>

      <section anchor="attachment-hashing">
        <name>Attachment Hashing</name>
        <t>
          Attachment content MUST be hashed with SHA-256 over the raw
          bytes of the attachment file.  The resulting hash is used both
          as the content address (filename) and as the integrity
          reference in event payloads.
        </t>
      </section>

      <section anchor="attachment-reference">
        <name>Attachment References in Payloads</name>
        <t>
          Events that refer to attachments MUST reference them by hash
          within the <tt>payload</tt> object using an
          <tt>attachment_refs</tt> array.  Each entry in the array MUST
          include:
        </t>
        <ul>
          <li><tt>hash_alg</tt> (string): The hash algorithm, "sha256" in v0.1.</li>
          <li><tt>hash</tt> (string): The 64-character hexadecimal hash of the attachment content.</li>
          <li><tt>content_type</tt> (string): The MIME type of the attachment (e.g., "text/plain", "application/json").</li>
          <li><tt>label</tt> (string): A human-readable label (e.g., "stdout", "stderr", "config_backup").</li>
        </ul>
        <t>
          Example:
        </t>
        <artwork type="json"><![CDATA[
{
  "tool_name": "shell",
  "status": "success",
  "duration_ms": 812,
  "attachment_refs": [
    {
      "hash_alg": "sha256",
      "hash": "e3b0c44298fc1c149afbf4c8996fb924...",
      "content_type": "text/plain",
      "label": "stdout"
    },
    {
      "hash_alg": "sha256",
      "hash": "7d865e959b2466918c9863afca942d0f...",
      "content_type": "text/plain",
      "label": "stderr"
    }
  ]
}
]]></artwork>
      </section>

      <section anchor="attachment-storage">
        <name>Storage Layout</name>
        <t>
          Within an Evidence Bundle, attachments SHOULD be stored under
          a two-level directory structure using the first two characters
          of the hash as a prefix directory:
        </t>
        <artwork><![CDATA[
attachments/<first-two-hex-chars>/<full-hash>
]]></artwork>
        <t>
          For example, an attachment with hash
          <tt>e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855</tt>
          would be stored at:
        </t>
        <artwork><![CDATA[
attachments/e3/e3b0c44298fc1c14...7852b855
]]></artwork>
        <t>
          This prefix-based layout prevents file system performance
          degradation when large numbers of attachments are present.
        </t>
      </section>

      <section anchor="attachment-guidance">
        <name>Attachment Content Guidance</name>
        <t>
          Good candidates for attachments include: sanitized tool
          stdout/stderr, JSON tool results with secrets removed,
          generated artifacts (reports, configurations), and policy
          evaluation explanations.
        </t>
        <t>
          The following MUST NOT be stored as attachments by default:
          raw prompts containing secrets, raw HTTP headers or cookies,
          raw database dumps, private keys or tokens, full file contents
          of sensitive system locations, and personal data unless
          explicitly required and approved by policy.
        </t>
        <t>
          Implementations SHOULD support a configurable maximum
          attachment size and truncation with a "truncated" marker in
          the payload when content exceeds the limit.
        </t>
      </section>
    </section>

    <!-- ============================================================ -->
    <!-- Section 13: Evidence Bundles                                   -->
    <!-- ============================================================ -->
    <section anchor="evidence-bundles">
      <name>Evidence Bundles</name>
      <t>
        An Evidence Bundle is a self-contained, portable package that
        enables independent verification of a VOLT trace.  Bundles are
        designed for audit and compliance evidence, incident
        reconstruction, workflow accountability, and cross-system
        portability.
      </t>

      <section anchor="bundle-layout">
        <name>Bundle Layout</name>
        <t>
          A bundle may be represented as a directory on disk or as a ZIP
          archive.  The contents MUST be identical regardless of
          container format.  The recommended layout is:
        </t>
        <artwork><![CDATA[
<bundle_root>/
  manifest.json          # REQUIRED: bundle index and summary
  events.ndjson          # REQUIRED: the event chain

  attachments/           # OPTIONAL: content-addressed blobs
    ab/
      ab12...<hash>
    e3/
      e3b0...<hash>

  signatures/            # OPTIONAL: detached signature files
    sig-1.json

  redactions/            # OPTIONAL: redaction metadata
    redactions.json

  notes/                 # OPTIONAL: human-readable notes
    notes.md
]]></artwork>
      </section>

      <section anchor="manifest-format">
        <name>Manifest Format</name>
        <t>
          The <tt>manifest.json</tt> file MUST be a single JSON object
          encoded as UTF-8.  It serves as the index and summary record
          for the bundle.
        </t>

        <section anchor="manifest-required">
          <name>Required Manifest Fields</name>
          <table anchor="manifest-fields-table">
            <name>Required Manifest Fields</name>
            <thead>
              <tr>
                <th>Field</th>
                <th>Type</th>
                <th>Description</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td><tt>volt_version</tt></td>
                <td>string</td>
                <td>MUST equal the event <tt>volt_version</tt>, e.g., "0.1"</td>
              </tr>
              <tr>
                <td><tt>bundle_id</tt></td>
                <td>string</td>
                <td>Unique identifier for this bundle (UUID or ULID)</td>
              </tr>
              <tr>
                <td><tt>run_id</tt></td>
                <td>string</td>
                <td>The run this bundle covers; ties to event <tt>run_id</tt></td>
              </tr>
              <tr>
                <td><tt>created_ts</tt></td>
                <td>string</td>
                <td>ISO 8601 UTC timestamp of bundle creation</td>
              </tr>
              <tr>
                <td><tt>hash_alg</tt></td>
                <td>string</td>
                <td>Hash algorithm; MUST be "sha256" in v0.1</td>
              </tr>
              <tr>
                <td><tt>events_file</tt></td>
                <td>string</td>
                <td>Filename of the events file, typically "events.ndjson"</td>
              </tr>
              <tr>
                <td><tt>event_count</tt></td>
                <td>integer</td>
                <td>Total number of events in the events file</td>
              </tr>
              <tr>
                <td><tt>first_event_hash</tt></td>
                <td>string</td>
                <td>64-char hex hash of the first event (seq=1)</td>
              </tr>
              <tr>
                <td><tt>last_event_hash</tt></td>
                <td>string</td>
                <td>64-char hex hash of the last event (seq=max)</td>
              </tr>
            </tbody>
          </table>
        </section>

        <section anchor="manifest-recommended">
          <name>Recommended Manifest Fields</name>
          <t>
            The following fields are RECOMMENDED for production bundles:
          </t>
          <ul>
            <li>
              <tt>bundle_mode</tt> (string): Either "rolling" or "final".
            </li>
            <li>
              <tt>cutoff_ts</tt> (string): For rolling bundles, the
              ISO 8601 UTC timestamp of the cutoff point.
            </li>
            <li>
              <tt>correlation_id</tt> (string): The AEE correlation ID
              for cross-protocol linkage.
            </li>
            <li>
              <tt>producer</tt> (object): Information about the system
              that created the bundle, with subfields <tt>name</tt>
              (string), <tt>version</tt> (string), and optionally
              <tt>build</tt> (string, e.g., a git SHA).
            </li>
            <li>
              <tt>integrations</tt> (object): Summary identifiers for
              AEE and AOCL integration, with optional <tt>aee</tt> and
              <tt>aocl</tt> subobjects.
            </li>
            <li>
              <tt>redactions_present</tt> (boolean): Whether any events
              in the bundle contain redacted fields.
            </li>
            <li>
              <tt>attachments_present</tt> (boolean): Whether the bundle
              includes attachment files.
            </li>
            <li>
              <tt>attachments</tt> (array): A summary of included
              attachments, where each entry contains <tt>hash_alg</tt>,
              <tt>hash</tt>, <tt>content_type</tt>, <tt>bytes</tt>
              (integer), and <tt>path</tt> (string).
            </li>
            <li>
              <tt>signatures</tt> (array): Signature records as defined
              in <xref target="signature-records"/>.
            </li>
            <li>
              <tt>notes</tt> (string): Free-text notes about the bundle.
            </li>
          </ul>
        </section>

        <section anchor="manifest-example">
          <name>Manifest Example</name>
          <artwork type="json"><![CDATA[
{
  "volt_version": "0.1",
  "bundle_id": "01HZBUNDLE001",
  "run_id": "01HZRUN001",
  "created_ts": "2026-02-28T19:15:00.000Z",
  "hash_alg": "sha256",
  "events_file": "events.ndjson",
  "event_count": 8,
  "first_event_hash":
    "a1b2c3d4...e5f60718",
  "last_event_hash":
    "c3d4e5f6...07182930",
  "bundle_mode": "final",
  "correlation_id": "aee-corr-01HZABC123",
  "producer": {
    "name": "quox-core",
    "version": "0.9.3",
    "build": "git:8f3a3b1"
  },
  "redactions_present": true,
  "attachments_present": true,
  "attachments": [
    {
      "hash_alg": "sha256",
      "hash":
        "e3b0c442...7852b855",
      "content_type": "text/plain",
      "bytes": 4832,
      "path":
        "attachments/e3/e3b0c442...b855"
    }
  ]
}
]]></artwork>
        </section>
      </section>

      <section anchor="rolling-final">
        <name>Rolling and Final Bundles</name>

        <section anchor="rolling-bundles">
          <name>Rolling Bundles</name>
          <t>
            Rolling bundles provide periodic evidence checkpoints for
            long-running workflows or to reduce data loss if a run
            crashes.  A rolling bundle SHOULD set <tt>bundle_mode</tt>
            to "rolling", include a <tt>cutoff_ts</tt> timestamp, and
            set <tt>last_event_hash</tt> to the hash of the last
            included event at the cutoff point.  Rolling bundles may be
            superseded by later rolling bundles or a final bundle.
          </t>
        </section>

        <section anchor="final-bundles">
          <name>Final Bundles</name>
          <t>
            Final bundles represent the complete record of a run.  A
            final bundle SHOULD set <tt>bundle_mode</tt> to "final" and
            include a terminal event (<tt>run.completed</tt>,
            <tt>run.failed</tt>, or <tt>run.cancelled</tt>) as the
            last event in the chain.  The event chain SHOULD span from
            seq=1 through the terminal event.
          </t>
        </section>
      </section>

      <section anchor="signature-records">
        <name>Signature Records</name>
        <t>
          VOLT v0.1 does not require signing, but defines a standard
          signature record format so that implementations can add
          signatures without breaking interoperability.  Signatures may
          be included inline in <tt>manifest.json</tt> under the
          <tt>signatures</tt> array, or as individual files under the
          <tt>signatures/</tt> directory.
        </t>
        <t>
          Each signature record contains the following REQUIRED fields:
        </t>
        <ul>
          <li><tt>sig_version</tt> (string): "0.1".</li>
          <li>
            <tt>sig_type</tt> (string): The signature algorithm;
            "ed25519" is RECOMMENDED.
          </li>
          <li>
            <tt>key_id</tt> (string): A stable identifier for the
            signing key (DID or key fingerprint).
          </li>
          <li><tt>signed_ts</tt> (string): ISO 8601 UTC timestamp of signing.</li>
          <li><tt>scope</tt> (string): "bundle" in v0.1.</li>
          <li>
            <tt>message</tt> (object): The data that was signed,
            containing <tt>run_id</tt>, <tt>bundle_id</tt>,
            <tt>hash_alg</tt>, <tt>first_event_hash</tt>,
            <tt>last_event_hash</tt>, and <tt>event_count</tt>.
          </li>
          <li><tt>signature</tt> (string): Base64-encoded signature bytes.</li>
        </ul>
        <t>
          Example signature record:
        </t>
        <artwork type="json"><![CDATA[
{
  "sig_version": "0.1",
  "sig_type": "ed25519",
  "key_id":
    "did:key:z6Mkn5Gq...LxXWxabc",
  "signed_ts": "2026-02-28T19:15:05.000Z",
  "scope": "bundle",
  "message": {
    "run_id": "01HZRUN001",
    "bundle_id": "01HZBUNDLE001",
    "hash_alg": "sha256",
    "first_event_hash":
      "a1b2c3d4...e5f60718",
    "last_event_hash":
      "c3d4e5f6...07182930",
    "event_count": 8
  },
  "signature": "MEUCIQDxAbcDefGhIjKlMnOpQrStUvWxYz0123456789..."
}
]]></artwork>
        <t>
          A valid signature indicates that the signer attests the
          bundle's event chain endpoints and count match the signed
          message.  Signatures do not prove that the underlying host was
          uncompromised; they provide non-repudiation and stronger
          chain-of-custody evidence.
        </t>
      </section>
    </section>

    <!-- ============================================================ -->
    <!-- Section 14: Verification                                      -->
    <!-- ============================================================ -->
    <section anchor="verification">
      <name>Verification</name>
      <t>
        Verification is the core value proposition of VOLT: if an
        Evidence Bundle cannot be verified independently, it is not
        evidence.  A successful verification confirms that the trace has
        integrity and the bundle is complete.
      </t>

      <section anchor="verification-guarantees">
        <name>What Verification Guarantees</name>
        <t>
          A successful VOLT verification confirms:
        </t>
        <ul>
          <li>Events are well-formed per this specification.</li>
          <li>Each event hash matches recomputed content.</li>
          <li>Each event links correctly to its predecessor via <tt>prev_hash</tt>.</li>
          <li>The manifest matches the bundle contents (count and endpoint hashes).</li>
          <li>Any referenced attachments exist and their hashes match.</li>
          <li>Any included signatures (if present) validate correctly.</li>
        </ul>
      </section>

      <section anchor="verification-limitations">
        <name>What Verification Does Not Guarantee</name>
        <t>
          Verification does not prove:
        </t>
        <ul>
          <li>The host or runner was uncompromised during execution.</li>
          <li>The tool results are "true" beyond what was recorded.</li>
          <li>The AI model's reasoning was correct.</li>
          <li>The run complied with external laws or policies not recorded as events.</li>
        </ul>
        <t>
          VOLT is a tamper-evidence and chain-of-custody protocol, not
          an oracle.
        </t>
      </section>

      <section anchor="verification-algorithm">
        <name>Verification Algorithm</name>
        <t>
          The following algorithm is normative.  A conformant verifier
          MUST implement all steps unless an optional skip flag is
          specified.
        </t>
        <t>
          <strong>Step 0 -- Load Bundle:</strong> Locate and parse
          <tt>manifest.json</tt> as UTF-8 JSON.  Validate that all
          required manifest fields exist per
          <xref target="manifest-required"/>.  If the manifest is
          missing or unparseable, the result is ERROR.
        </t>
        <t>
          <strong>Step 1 -- Load Events:</strong> Read the events file
          specified by <tt>manifest.events_file</tt> (defaulting to
          <tt>events.ndjson</tt>).  Parse as NDJSON: one JSON object per
          line.  Collect events in file order.  If any line is not valid
          JSON, the result is FAIL with reason INVALID_EVENT_JSON.
        </t>
        <t>
          <strong>Step 2 -- Validate Event Ordering:</strong> Ensure
          events are ordered by <tt>seq</tt> ascending.  In strict mode,
          FAIL if <tt>seq</tt> does not start at 1 (SEQ_GAP), if any
          gap exists (SEQ_GAP), if duplicates are found
          (SEQ_DUPLICATE), or if the sequence is non-monotonic
          (SEQ_NOT_MONOTONIC).  In permissive mode, warn on gaps but
          still FAIL on duplicates or decreasing sequences.
        </t>
        <t>
          <strong>Step 3 -- Validate Required Event Fields:</strong>
          For each event, verify that all required fields from
          <xref target="event-fields-table"/> exist and have the correct
          types.  Missing or invalid fields result in FAIL with reason
          EVENT_SCHEMA_INVALID.
        </t>
        <t>
          <strong>Step 4 -- Validate Version Compatibility:</strong>
          The <tt>volt_version</tt> in <tt>manifest.json</tt> MUST
          match the <tt>volt_version</tt> in every event.  A mismatch
          results in FAIL with reason VERSION_MISMATCH.
        </t>
        <t>
          <strong>Step 5 -- Recompute and Validate Event Hashes:</strong>
          For each event: (a) create a copy of the event object with the
          <tt>hash</tt> field removed; (b) serialize using the Canonical
          JSON rules from <xref target="canonicalization"/>; (c) compute
          the SHA-256 digest of the canonical bytes; (d) compare the
          computed hexadecimal digest to the stored <tt>hash</tt>.  A
          mismatch results in FAIL with reason EVENT_HASH_MISMATCH.
        </t>
        <t>
          <strong>Step 6 -- Validate the Chain:</strong> For the first
          event (seq=1), <tt>prev_hash</tt> MUST be 64 hexadecimal
          zeros.  Failure results in FAIL with reason
          INVALID_GENESIS_PREV_HASH.  For each subsequent event,
          <tt>prev_hash</tt> MUST equal the <tt>hash</tt> of the
          immediately preceding event.  A mismatch results in FAIL with
          reason CHAIN_BROKEN.
        </t>
        <t>
          <strong>Step 7 -- Validate Run ID Consistency:</strong> All
          events MUST have the same <tt>run_id</tt> as the manifest's
          <tt>run_id</tt>.  A mismatch results in FAIL with reason
          RUN_ID_MISMATCH.
        </t>
        <t>
          <strong>Step 8 -- Validate Manifest Counts and Endpoints:</strong>
          (a) Count events in the file; the count MUST equal
          <tt>manifest.event_count</tt>.  (b) Confirm
          <tt>manifest.first_event_hash</tt> equals the hash of the
          first event.  (c) Confirm <tt>manifest.last_event_hash</tt>
          equals the hash of the last event.  Any mismatch results in
          FAIL with reason MANIFEST_MISMATCH.
        </t>
        <t>
          <strong>Step 9 -- Validate Attachments (if enabled):</strong>
          For each event, locate any <tt>payload.attachment_refs</tt>
          entries.  For each referenced attachment: (a) locate the file
          at <tt>attachments/&lt;first2&gt;/&lt;hash&gt;</tt>; (b) read
          the raw bytes; (c) compute SHA-256; (d) compare to the
          referenced hash.  A missing file results in FAIL with reason
          ATTACHMENT_MISSING.  A hash mismatch results in FAIL with
          reason ATTACHMENT_HASH_MISMATCH.  If attachment verification
          is disabled via a flag, the verifier SHOULD set
          <tt>attachments_verified</tt> to false in the report and warn
          if attachment references exist.
        </t>
        <t>
          <strong>Step 10 -- Validate Signatures (if present and
          enabled):</strong> For each signature record in the manifest
          or under <tt>signatures/</tt>: (a) validate the signature
          record schema; (b) reconstruct the <tt>message</tt> object as
          defined in <xref target="signature-records"/>; (c) verify the
          signature bytes using the declared algorithm (Ed25519
          recommended); (d) confirm the scope is supported ("bundle" in
          v0.1).  An invalid signature results in FAIL with reason
          SIGNATURE_INVALID.  If signature verification is disabled, set
          <tt>signatures_verified</tt> to false in the report.
        </t>
      </section>

      <section anchor="verifier-report">
        <name>Verifier Report Format</name>
        <t>
          A verifier MUST output a result.  For interoperability, VOLT
          v0.1 RECOMMENDS a JSON report format.
        </t>
        <t>
          PASS report example:
        </t>
        <artwork type="json"><![CDATA[
{
  "result": "PASS",
  "run_id": "01HZRUN001",
  "bundle_id": "01HZBUNDLE001",
  "volt_version": "0.1",
  "hash_alg": "sha256",
  "event_count": 128,
  "first_event_hash": "a1b2c3d4...90",
  "last_event_hash": "f0e1d2c3...08",
  "attachments_verified": true,
  "signatures_verified": false,
  "warnings": []
}
]]></artwork>
        <t>
          FAIL report example:
        </t>
        <artwork type="json"><![CDATA[
{
  "result": "FAIL",
  "reason": "EVENT_HASH_MISMATCH",
  "details": {
    "seq": 42,
    "event_id": "01HZ-EVT-042",
    "expected_hash": "a1b2c3d4e5f6...",
    "found_hash": "ffee0011aabb..."
  }
}
]]></artwork>
        <t>
          ERROR report example:
        </t>
        <artwork type="json"><![CDATA[
{
  "result": "ERROR",
  "reason": "MANIFEST_UNREADABLE",
  "details": {
    "message": "manifest.json missing or invalid JSON"
  }
}
]]></artwork>
      </section>

      <section anchor="exit-codes">
        <name>Exit Codes</name>
        <t>
          For command-line implementations, the following exit codes are
          RECOMMENDED:
        </t>
        <table>
          <name>Verifier Exit Codes</name>
          <thead>
            <tr><th>Code</th><th>Meaning</th></tr>
          </thead>
          <tbody>
            <tr><td>0</td><td>PASS -- verification succeeded</td></tr>
            <tr><td>1</td><td>FAIL -- verification detected integrity violations</td></tr>
            <tr><td>2</td><td>ERROR -- invalid bundle format or I/O error</td></tr>
          </tbody>
        </table>
      </section>

      <section anchor="failure-reason-codes">
        <name>Standard Failure Reason Codes</name>
        <t>
          Verifiers SHOULD use consistent reason codes to enable
          automated processing of verification results.  The following
          codes are defined:
        </t>
        <table>
          <name>Standard Failure Reason Codes</name>
          <thead>
            <tr><th>Code</th><th>Description</th></tr>
          </thead>
          <tbody>
            <tr><td>MANIFEST_MISSING</td><td>manifest.json not found in bundle</td></tr>
            <tr><td>MANIFEST_UNREADABLE</td><td>manifest.json exists but cannot be parsed</td></tr>
            <tr><td>MANIFEST_SCHEMA_INVALID</td><td>manifest.json missing required fields</td></tr>
            <tr><td>EVENTS_FILE_MISSING</td><td>Events file referenced by manifest not found</td></tr>
            <tr><td>INVALID_EVENT_JSON</td><td>A line in the events file is not valid JSON</td></tr>
            <tr><td>EVENT_SCHEMA_INVALID</td><td>An event is missing required fields or has wrong types</td></tr>
            <tr><td>VERSION_MISMATCH</td><td>Event volt_version does not match manifest</td></tr>
            <tr><td>RUN_ID_MISMATCH</td><td>Event run_id does not match manifest run_id</td></tr>
            <tr><td>SEQ_NOT_MONOTONIC</td><td>Event sequence numbers are not monotonically increasing</td></tr>
            <tr><td>SEQ_DUPLICATE</td><td>Duplicate sequence number found</td></tr>
            <tr><td>SEQ_GAP</td><td>Gap detected in sequence numbers (strict mode)</td></tr>
            <tr><td>EVENT_HASH_MISMATCH</td><td>Recomputed event hash does not match stored hash</td></tr>
            <tr><td>INVALID_GENESIS_PREV_HASH</td><td>First event prev_hash is not 64 hex zeros</td></tr>
            <tr><td>CHAIN_BROKEN</td><td>Event prev_hash does not match preceding event hash</td></tr>
            <tr><td>MANIFEST_MISMATCH</td><td>Manifest counts or endpoint hashes do not match</td></tr>
            <tr><td>ATTACHMENT_MISSING</td><td>Referenced attachment file not found</td></tr>
            <tr><td>ATTACHMENT_HASH_MISMATCH</td><td>Attachment file hash does not match reference</td></tr>
            <tr><td>SIGNATURE_SCHEMA_INVALID</td><td>Signature record is malformed</td></tr>
            <tr><td>SIGNATURE_INVALID</td><td>Signature does not verify</td></tr>
            <tr><td>UNSUPPORTED_SIGNATURE_TYPE</td><td>Signature algorithm not supported by verifier</td></tr>
          </tbody>
        </table>
      </section>
    </section>

    <!-- ============================================================ -->
    <!-- Section 15: Conformance Levels                                -->
    <!-- ============================================================ -->
    <section anchor="conformance-levels">
      <name>Conformance Levels</name>
      <t>
        To keep implementations comparable, VOLT defines three
        conformance targets.  An implementation may conform to one or
        more of these levels.
      </t>

      <section anchor="volt-r">
        <name>VOLT-R (Recorder)</name>
        <t>
          An implementation is VOLT-R conformant if it:
        </t>
        <ul>
          <li>
            Emits events matching the schema defined in
            <xref target="event-schema"/>.
          </li>
          <li>
            Computes <tt>hash</tt> and <tt>prev_hash</tt> correctly
            per <xref target="hashing-chaining"/>.
          </li>
          <li>
            Respects the privacy constraints defined in
            <xref target="design-constraints"/>.
          </li>
          <li>
            Uses the Canonical JSON serialization defined in
            <xref target="canonicalization"/> for hash computation.
          </li>
        </ul>
      </section>

      <section anchor="volt-b">
        <name>VOLT-B (Bundler)</name>
        <t>
          An implementation is VOLT-B conformant if it:
        </t>
        <ul>
          <li>
            Produces a <tt>manifest.json</tt> with all required fields
            per <xref target="manifest-required"/>.
          </li>
          <li>
            Writes <tt>events.ndjson</tt> ordered by ascending
            <tt>seq</tt> per <xref target="transport-encoding"/>.
          </li>
          <li>
            Stores attachments content-addressed per
            <xref target="attachments"/>.
          </li>
          <li>
            Ensures that secrets are excluded from event payloads and
            attachments.
          </li>
        </ul>
      </section>

      <section anchor="volt-v">
        <name>VOLT-V (Verifier)</name>
        <t>
          An implementation is VOLT-V conformant if it:
        </t>
        <ul>
          <li>
            Implements the full verification algorithm defined in
            <xref target="verification-algorithm"/>.
          </li>
          <li>
            Verifies both event hashes and chain integrity.
          </li>
          <li>
            Verifies attachments referenced by events.
          </li>
          <li>
            Produces a report per <xref target="verifier-report"/>.
          </li>
          <li>
            Returns appropriate exit codes per
            <xref target="exit-codes"/>.
          </li>
        </ul>
      </section>
    </section>

    <!-- ============================================================ -->
    <!-- Section 16: Privacy and Redaction                              -->
    <!-- ============================================================ -->
    <section anchor="privacy-redaction">
      <name>Privacy and Redaction</name>
      <t>
        VOLT is an evidence protocol.  Evidence that captures secrets,
        personal data, or sensitive operational content by accident is a
        liability.  This section defines the privacy-first logging rules
        and redaction strategies for VOLT.
      </t>

      <section anchor="non-negotiable-rules">
        <name>Non-Negotiable Rules</name>
        <t>
          VOLT events and attachments MUST NOT contain:
        </t>
        <ul>
          <li>API keys, access tokens, or session cookies.</li>
          <li>Passwords or password hashes.</li>
          <li>Private keys, seed phrases, or recovery codes.</li>
          <li>Database connection strings containing credentials.</li>
          <li>Full authorization headers (e.g., "Authorization: Bearer ...").</li>
          <li>Raw secrets from environment variables.</li>
        </ul>
        <t>
          The rule of thumb: if it can grant access, it MUST NOT be
          recorded.
        </t>
        <t>
          Events MUST default to metadata and references.  Full outputs
          SHOULD be stored as attachments only when safe and useful.
          When in doubt, implementations MUST record a summary and
          content hash rather than raw content.
        </t>
        <t>
          When anything is omitted or sanitized, events MUST indicate
          this explicitly via redaction flags such as
          <tt>payload.redacted</tt>, <tt>payload.inputs_redacted</tt>,
          or <tt>payload.outputs_redacted</tt> set to <tt>true</tt>.
          This prevents silent censorship and keeps audits honest.
        </t>
      </section>

      <section anchor="data-classification">
        <name>Data Classification</name>
        <t>
          Implementations SHOULD classify data into at least the
          following categories:
        </t>
        <table>
          <name>Data Classification Levels</name>
          <thead>
            <tr><th>Level</th><th>Description</th></tr>
          </thead>
          <tbody>
            <tr><td>PUBLIC</td><td>Safe to store and export (rare for operational data)</td></tr>
            <tr><td>INTERNAL</td><td>Safe within the organization; not for public export</td></tr>
            <tr><td>SENSITIVE</td><td>Requires strict redaction controls before storage</td></tr>
            <tr><td>SECRET</td><td>Must never be stored in VOLT events or attachments</td></tr>
            <tr><td>PII</td><td>Personal data; may be subject to regulatory requirements</td></tr>
          </tbody>
        </table>
      </section>

      <section anchor="secret-scanning">
        <name>Secret Scanning</name>
        <t>
          Implementations SHOULD include a guard that runs before events
          and attachments are persisted.  The scanner SHOULD detect:
        </t>
        <ul>
          <li>Token-like strings (JWT patterns, API key prefixes such as <tt>sk-</tt>, <tt>ghp_</tt>, <tt>AKIA</tt>).</li>
          <li>Common credential keys (<tt>password=</tt>, <tt>api_key</tt>, <tt>secret</tt>).</li>
          <li>PEM blocks (<tt>-----BEGIN PRIVATE KEY-----</tt>).</li>
          <li>AWS access key patterns (<tt>AKIA...</tt>).</li>
          <li>Common bearer token and cookie patterns.</li>
        </ul>
        <t>
          When a potential secret is detected, the implementation SHOULD
          strip the value, set <tt>payload.redacted</tt> to true, and
          optionally raise an AOCL policy alert.  Attachments SHOULD be
          scanned and sanitized before storage; if an attachment cannot
          be safely sanitized, it SHOULD be omitted entirely.
        </t>
      </section>

      <section anchor="redaction-flags">
        <name>Redaction Flags and Strategy</name>
        <t>
          In VOLT v0.1, redaction is explicit and simple:
        </t>
        <ul>
          <li>
            Omit sensitive fields entirely from the payload.
          </li>
          <li>
            Replace with boolean flags: <tt>"inputs_redacted": true</tt>
            or <tt>"redacted": true</tt>.
          </li>
          <li>
            Optionally include a summary: <tt>"inputs_summary": "Write
            config file to prod"</tt>.
          </li>
        </ul>
        <t>
          Example redacted payload:
        </t>
        <artwork type="json"><![CDATA[
{
  "tool_name": "shell",
  "operation": "write_file",
  "target": "prod/nginx.conf",
  "inputs_redacted": true,
  "inputs_summary": "Write nginx configuration update"
}
]]></artwork>
      </section>

      <section anchor="redaction-log">
        <name>Redaction Log</name>
        <t>
          If an implementation performs redaction, it MAY include a
          <tt>redactions/redactions.json</tt> file in the Evidence
          Bundle.  This file describes which events had fields redacted
          and the category of redaction.  The format is:
        </t>
        <artwork type="json"><![CDATA[
{
  "volt_version": "0.1",
  "run_id": "01HZRUN001",
  "items": [
    {
      "event_id": "evt-006",
      "fields_removed": ["payload.inputs"],
      "reason": "secret"
    },
    {
      "event_id": "evt-009",
      "fields_removed": ["payload.response_body"],
      "reason": "pii"
    }
  ]
}
]]></artwork>
        <t>
          Note: VOLT v0.1 does not require cryptographic proof of
          redaction correctness.  That is a planned enhancement for
          future versions.
        </t>
      </section>

      <section anchor="export-safety">
        <name>Export Safety Rules</name>
        <t>
          When exporting Evidence Bundles outside the originating system
          (e.g., as a ZIP for audit handoff):
        </t>
        <ul>
          <li>
            INTERNAL and SENSITIVE attachments SHOULD be removed unless
            explicitly included by policy.
          </li>
          <li>
            A summary report of removed items SHOULD be included.
          </li>
          <li>
            A verification report SHOULD be included if requested.
          </li>
          <li>
            Chain integrity MUST be preserved: events MUST NOT be
            rewritten during export, as this would invalidate hashes.
          </li>
        </ul>
        <t>
          If content must be removed after the fact, the export SHOULD
          be labeled as a "redacted bundle" and MUST NOT be presented
          as the original full-fidelity record.
        </t>
      </section>
    </section>

    <!-- ============================================================ -->
    <!-- Section 17: Threat Model                                      -->
    <!-- ============================================================ -->
    <section anchor="threat-model">
      <name>Threat Model</name>
      <t>
        This section describes the threats VOLT is designed to mitigate,
        the threats it cannot fully mitigate, and recommended
        countermeasures.  VOLT is an evidence integrity protocol
        providing tamper-evident traces and portable verification, not
        perfect truth in adversarial environments.
      </t>

      <section anchor="threats-mitigated">
        <name>Threats VOLT Mitigates</name>

        <section anchor="t1">
          <name>T1 -- Post-Hoc Tampering of Events</name>
          <t>
            <strong>Attack:</strong> An adversary modifies an event
            after the run completes (e.g., changing "denied" to
            "approved").
          </t>
          <t>
            <strong>Mitigation:</strong> Event hash validation detects
            the modification (EVENT_HASH_MISMATCH).
          </t>
          <t>
            <strong>Residual risk:</strong> If the adversary re-hashes
            the entire chain and no signatures are present, the
            fabricated chain will appear valid.  Signatures eliminate
            this residual risk.
          </t>
        </section>

        <section anchor="t2">
          <name>T2 -- Deleting Events from the Middle</name>
          <t>
            <strong>Attack:</strong> An adversary removes a tool
            execution event to conceal activity.
          </t>
          <t>
            <strong>Mitigation:</strong> The chain breaks
            (CHAIN_BROKEN) and/or a sequence gap is detected (SEQ_GAP).
          </t>
          <t>
            <strong>Residual risk:</strong> Same as T1 if the adversary
            rebuilds the chain from the deletion point.
          </t>
        </section>

        <section anchor="t3">
          <name>T3 -- Inserting Fake Events</name>
          <t>
            <strong>Attack:</strong> An adversary inserts a fabricated
            <tt>hitl.approved</tt> event to manufacture consent.
          </t>
          <t>
            <strong>Mitigation:</strong> The chain breaks at the
            insertion point unless the adversary re-hashes all
            subsequent events.
          </t>
          <t>
            <strong>Residual risk:</strong> Without trusted signatures,
            a complete re-hash produces a valid fabricated chain.
          </t>
        </section>

        <section anchor="t4">
          <name>T4 -- Attachment Substitution</name>
          <t>
            <strong>Attack:</strong> An adversary replaces a tool output
            attachment with a sanitized or fake version.
          </t>
          <t>
            <strong>Mitigation:</strong> Attachment hash validation
            detects the substitution (ATTACHMENT_HASH_MISMATCH).
          </t>
          <t>
            <strong>Residual risk:</strong> If the adversary also
            modifies the referencing event and re-hashes the chain, see
            T1.
          </t>
        </section>

        <section anchor="t5">
          <name>T5 -- Repudiation of Approvals</name>
          <t>
            <strong>Attack:</strong> An actor claims "that approval
            wasn't mine."
          </t>
          <t>
            <strong>Mitigation:</strong> When actor identity and/or
            digital signatures are used, repudiation becomes
            significantly harder.
          </t>
          <t>
            <strong>Residual risk:</strong> Without signatures or strong
            identity binding, VOLT v0.1 provides sequencing evidence but
            weaker non-repudiation.
          </t>
        </section>

        <section anchor="t6">
          <name>T6 -- Silent Redaction / Deceptive Logging</name>
          <t>
            <strong>Attack:</strong> A recorder omits sensitive tool
            actions silently without leaving any trace of their
            existence.
          </t>
          <t>
            <strong>Mitigation:</strong> VOLT requires explicit
            redaction flags; undisclosed omissions remain a governance
            and detection problem.
          </t>
          <t>
            <strong>Residual risk:</strong> If an event was never
            recorded, its absence cannot be proven by VOLT alone.
            AOCL policies should enforce required event types for
            specific operation classes.
          </t>
        </section>
      </section>

      <section anchor="threats-not-mitigated">
        <name>Threats VOLT Does Not Fully Mitigate</name>

        <section anchor="t7">
          <name>T7 -- Fully Compromised Host or Runner</name>
          <t>
            <strong>Attack:</strong> An attacker controls the runner and
            emits a clean but fabricated VOLT trace.
          </t>
          <t>
            <strong>Why VOLT cannot solve this alone:</strong> The
            recorder runs in the compromised environment.  A compromised
            host can produce any trace it wishes.
          </t>
          <t>
            <strong>Recommended mitigations:</strong> Remote runner
            attestations (planned), secure enclaves or TPM-backed keys,
            cross-signing from both orchestrator and runner, a separate
            logging channel to an append-only store, and strong AOCL
            enforcement with network segmentation.
          </t>
        </section>

        <section anchor="t8">
          <name>T8 -- Signing Key Theft</name>
          <t>
            <strong>Attack:</strong> An attacker steals a signing key
            and can sign forged bundles.
          </t>
          <t>
            <strong>Recommended mitigations:</strong> Store keys in HSM
            or TPM hardware where possible; use short-lived keys with
            regular rotation; maintain key revocation lists; use
            separate keys per environment (development, staging,
            production); consider multi-signature requirements for
            high-risk runs.
          </t>
        </section>

        <section anchor="t9">
          <name>T9 -- Incomplete Evidence (Missing Coverage)</name>
          <t>
            <strong>Attack:</strong> A tool executes without VOLT hooks,
            so the evidence is incomplete.
          </t>
          <t>
            <strong>Recommended mitigations:</strong> Enforce that all
            tool calls pass through instrumented middleware; use AOCL
            policies to deny execution if the VOLT recorder is not
            active; implement CI checks requiring certain event types
            (e.g., production runs must include <tt>hitl.approved</tt>).
          </t>
        </section>

        <section anchor="t10">
          <name>T10 -- Privacy Leakage via Evidence Bundles</name>
          <t>
            <strong>Attack:</strong> Sensitive data leaks because it was
            inadvertently logged or exported without proper controls.
          </t>
          <t>
            <strong>Recommended mitigations:</strong> Enable secret
            scanning before write; enforce strict export controls with
            role-based access; implement configurable retention with
            automatic deletion; provide "export-safe" bundle modes that
            strip sensitive attachments.
          </t>
        </section>
      </section>
    </section>

  


    <!-- ============================================================ -->
    <!-- Security Considerations                                       -->
    <!-- ============================================================ -->
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>
        This section discusses the security properties, limitations, and
        operational considerations of the VOLT protocol.
      </t>
      <t>
        <strong>Hash Chain Integrity Guarantees and Limitations.</strong>
        The SHA-256 hash chain provides strong tamper evidence for
        recorded traces.  Any modification to an event -- changing a
        field value, altering a timestamp, or modifying actor
        information -- changes the event's hash, which in turn
        invalidates the <tt>prev_hash</tt> of every subsequent event.
        This cascade effect means that tampering with any single event
        requires recomputing all subsequent hashes.  However, without
        digital signatures, an adversary with write access to the
        complete bundle can recompute the entire chain and produce a
        new, internally consistent but fabricated trace.  Signatures
        provide the essential binding between the chain and a trusted
        identity.
      </t>
      <t>
        <strong>Genesis Event Trust Anchor.</strong>
        The genesis event (seq=1) uses a well-known <tt>prev_hash</tt>
        of 64 hexadecimal zeros.  The integrity of the entire chain
        depends on the trustworthiness of this starting point.  If an
        adversary can substitute the genesis event and recompute the
        chain, the verification will pass.  Operators SHOULD treat the
        genesis event hash as a trust anchor and SHOULD distribute or
        record it through an out-of-band mechanism when strong assurance
        is required.  Digital signatures over the bundle (covering
        <tt>first_event_hash</tt>) mitigate genesis substitution.
      </t>
      <t>
        <strong>Compromised Host Scenario.</strong>
        VOLT's integrity guarantees assume that the recording host is
        not fully compromised at the time of recording.  A compromised
        host can emit arbitrary events that form a valid chain.  VOLT
        detects post-hoc tampering (changes made after the chain was
        recorded), but it cannot detect fabrication at the source.
        Deployments requiring stronger guarantees SHOULD use remote
        attestation, cross-signing between multiple independent
        components, TPM-backed signing keys, or a separate append-only
        logging channel that is not controlled by the same host.
      </t>
      <t>
        <strong>Key Management for Signatures.</strong>
        When Ed25519 signatures are used, the signing keys become
        high-value targets.  Key compromise allows an adversary to
        produce validly signed forged bundles.  Implementations SHOULD
        store signing keys in hardware security modules (HSMs) or
        Trusted Platform Modules (TPMs) where available.  Keys SHOULD
        be rotated regularly, and separate keys SHOULD be used for
        different environments (development, staging, production).
        Implementors SHOULD maintain a key revocation mechanism and
        SHOULD consider requiring multiple signatures from independent
        signers for high-risk production runs.
      </t>
      <t>
        <strong>Privacy Leakage via Metadata.</strong>
        Even when raw content is properly excluded from events, metadata
        can leak sensitive information.  Timestamps reveal activity
        patterns.  Actor identifiers may expose organizational structure.
        Correlation IDs can be used to link otherwise separate
        activities.  Tool names and operation types may reveal
        infrastructure details.  Implementations SHOULD assess the
        sensitivity of metadata fields in their deployment context and
        apply appropriate access controls to Evidence Bundles.  The
        <xref target="export-safety"/> rules provide baseline guidance
        for cross-boundary transfers.
      </t>
      <t>
        <strong>Bundle Export Safety.</strong>
        Evidence Bundles exported outside the originating organization
        carry operational intelligence.  Even with secrets removed, the
        sequence of events, tool names, timing information, and actor
        identifiers provide substantial insight into operational
        procedures and infrastructure.  Exports MUST be treated as
        sensitive artifacts.  Role-based access controls, audit logging
        of export operations, and data loss prevention policies SHOULD
        be applied.  Redacted bundles MUST be clearly labeled and MUST
        NOT be represented as complete records.
      </t>
      <t>
        <strong>Replay and Preimage Resistance of SHA-256.</strong>
        VOLT relies on the collision resistance and preimage resistance
        of SHA-256 <xref target="RFC6234"/>.  As of the time of writing,
        SHA-256 remains considered secure against practical attacks, with
        no known feasible collision or preimage attacks.  The
        <tt>hash_alg</tt> field in manifests and the versioning
        mechanism in VOLT provide a migration path if SHA-256 is
        deprecated in the future.  Implementations SHOULD monitor
        cryptographic algorithm recommendations from NIST
        <xref target="FIPS180-4"/> and be prepared to transition to
        stronger hash functions if required.
      </t>
      <t>
        <strong>Non-Repudiation with Ed25519.</strong>
        Ed25519 <xref target="RFC8032"/> signatures over bundle
        commitments (covering <tt>run_id</tt>, <tt>bundle_id</tt>,
        <tt>first_event_hash</tt>, <tt>last_event_hash</tt>, and
        <tt>event_count</tt>) provide non-repudiation: a signer cannot
        deny having attested to a specific chain state without claiming
        key compromise.  The strength of non-repudiation depends on the
        key management practices described above.  In VOLT v0.1,
        signatures are optional; deployments requiring strong
        non-repudiation MUST enable signing and MUST implement robust
        key management.  Future versions may introduce per-event
        signatures and multi-party attestation for stronger guarantees.
      </t>
      <t>
        <strong>Denial-of-Service Considerations.</strong>
        VOLT verification requires reading and hashing every event and
        attachment in a bundle.  Maliciously crafted bundles with
        extremely large numbers of events, very large attachments, or
        deeply nested JSON structures could be used to consume excessive
        computational resources on a verifier.  Implementations SHOULD
        impose configurable limits on event count, individual event size,
        attachment size, and total bundle size.  Verifiers SHOULD report
        ERROR rather than attempting to process bundles that exceed
        configured limits.
      </t>
    </section>

    <!-- ============================================================ -->
    <!-- IANA Considerations                                           -->
    <!-- ============================================================ -->
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>
        This document has no IANA actions.
      </t>
    </section>

  </middle>

  <back>

    <references>
      <name>References</name>

      <references>
        <name>Normative References</name>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8259.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6234.xml"/>
      </references>

      <references>
        <name>Informative References</name>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8032.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4122.xml"/>

        <reference anchor="AEE" target="https://github.com/AdaminX/AEE-Agent-Envelope-Exchange">
          <front>
            <title>Agent Envelope Exchange (AEE)</title>
            <author initials="A." surname="Cowles" fullname="Adam Cowles"/>
            <date year="2026"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-cowles-aee-00"/>
        </reference>

        <reference anchor="AOCL" target="https://github.com/AdaminX/AOCL-Agent-Orchestration-Control-Layers-Protocol">
          <front>
            <title>Agent Orchestration Control Layers (AOCL)</title>
            <author initials="A." surname="Cowles" fullname="Adam Cowles"/>
            <date year="2026"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-cowles-aocl-00"/>
        </reference>

        <reference anchor="FIPS180-4" target="https://csrc.nist.gov/publications/detail/fips/180/4/final">
          <front>
            <title>Secure Hash Standard (SHS)</title>
            <author>
              <organization>National Institute of Standards and Technology (NIST)</organization>
            </author>
            <date year="2015" month="August"/>
          </front>
          <seriesInfo name="FIPS" value="180-4"/>
        </reference>
      </references>

    </references>

    <section numbered="false">
      <name>Acknowledgements</name>
      <t>
        The author wishes to thank the early adopters and reviewers of
        the VOLT specification within the Quox ecosystem, whose feedback
        on real-world cryptographic evidence requirements for AI agent
        operations shaped the design of this protocol.
      </t>
    </section>

  </back>

</rfc>