<?xml version="1.0" encoding="UTF-8"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude"
     ipr="trust200902"
     category="info"
     submissionType="independent"
     docName="draft-elkhatabi-verifiable-telemetry-ledgers-09"
     version="3">
  <front>
    <title abbrev="VTL">Verifiable Telemetry Ledgers</title>
    <seriesInfo name="Internet-Draft" value="draft-elkhatabi-verifiable-telemetry-ledgers-09"/>

    <author fullname="Bilal El Khatabi" initials="B." surname="El Khatabi">
      <organization>Independent</organization>
      <address>
        <postal>
          <country>Morocco</country>
        </postal>
        <email>elkhatabibilal@gmail.com</email>
      </address>
    </author>

    <area>General</area>
    <keyword>telemetry</keyword>
    <keyword>merkle</keyword>
    <keyword>timestamping</keyword>
    <keyword>iot</keyword>

    <abstract>
      <t>
        This document profiles a verifiable-telemetry ledger. Its interoperability boundary begins
        with exact canonical-record byte strings that an upstream system has
        already produced. The profile fixes admission and assignment of those
        byte strings to serial-numbered segments, deterministic commitment-tree
        calculation, an authoritative segment artifact encoded in Concise
        Binary Object Representation (CBOR), a producer manifest, three
        disclosure classes, and
        binding of the authoritative segment artifact digest to external timestamp channels.
        Transport framing, decryption, anti-replay processing, payload
        interpretation, and source-telemetry-to-record mapping are outside this
        profile. Segment closure uses a deployment-configured elapsed-time
        interval and does not depend on calendar dates from either the source
        or the ledger producer.
        Every baseline producer selects the RFC 3161 timestamp channel, as
        updated by RFC 5816 and profiled by this document, for every emitted
        segment. OpenTimestamps (OTS) can be selected only as an additive,
        deployment-specific timestamp profile; peer signatures are optional
        attestations.
      </t>
      <t>
        The profile enables independent recomputation and audit of disclosed
        evidence from the admitted canonical-record bytes onward. It does not
        verify how source telemetry was authenticated, interpreted, or mapped
        to those bytes, and it does not cover device onboarding, end-to-end
        security of sensor values, or safety decisions.
      </t>
    </abstract>
  </front>

  <middle>
    <section numbered="true" toc="include" anchor="introduction">
      <name>Introduction</name>
      <t>
        Verifiable Telemetry Ledgers (VTL) support long-lived telemetry
        deployments that need evidence that record bytes disclosed later are
        the same bytes a ledger producer committed when they were admitted,
        even when upstream delivery is intermittent and verification happens
        later.
      </t>
      <t>
        Two trust questions must be distinguished. The first is whether a
        source was genuine, authorized, and mapped correctly. The second is
        whether, after exact record bytes were selected for commitment, a later
        verifier can determine that those bytes, the ledger artifact, and
        external evidence still agree. This profile standardizes the second
        question.
      </t>
      <t>
        This memo is an Independent Submission. It is not an Internet
        Standard and has not been evaluated as having IETF community
        consensus.
      </t>
      <t><strong>Protocol at a Glance</strong></t>
      <t>
        The following informative summary provides a reading path through the
        normative requirements that follow:
      </t>
      <ol>
        <li>Admission. The ledger producer validates the byte-level
        profile and admits the unchanged canonical-record bytes into the
        logical interval open at the admission linearization point. Each
        admission is one record occurrence, including when two admitted
        occurrences have identical bytes.</li>
        <li>Commitment. The producer computes each leaf as
        <tt>SHA-256(0x00 || record)</tt>, sorts the leaf hashes, and calculates
        <tt>segment_root</tt> over the complete sorted list using the
        domain-separated tree construction in <xref target="merkle-policy"/>.
        It partitions the same list deterministically into the batch objects
        embedded in the authoritative segment artifact. Batch roots describe their respective
        batches; they are not combined to calculate <tt>segment_root</tt>.</li>
        <li>Sealing. The producer encodes the authoritative segment
        artifact using deterministic CBOR. The artifact carries the commitment
        profile identifier, ledger and segment identity, closure claim,
        predecessor-artifact digest, batch objects, and segment root.</li>
        <li>External evidence. The producer computes SHA-256 over the
        exact authoritative segment artifact bytes and submits that digest to the
        <xref target="RFC3161"/> channel for every emitted segment. OTS can be
        selected as an additive deployment-specific channel. Peer signatures
        are optional attestations over the same digest and do not by themselves
        satisfy the timestamping requirement.</li>
        <li>Verification. A verifier starts from the authoritative
        segment artifact and performs the validations supported by the disclosed
        bundle. Class A supports public record-level recomputation. Class B
        supports controlled audit when some record material is withheld. Class
        C provides segment-level commitment and timestamp evidence without
        record preimages and does not support record-level or batch
        recomputation. The verifier reports the exercised scope, segment-chain
        status, channel status, and overall outcome; it claims validated chain
        adjacency only when the predecessor artifact is disclosed.</li>
      </ol>
      <t>
        Segment intervals are ledger batching rules, not source-reporting
        periods or civil-time claims. The producer assigns each admitted
        record to the logical interval open at its admission linearization
        point and uses a non-decreasing elapsed-time source for interval
        closure. Source arrival time, upstream processing time,
        <tt>ingest_time</tt>, <tt>device_time</tt>, and UTC do not select
        segment membership. Segment identity is
        <tt>(ledger_id, segment_number)</tt>, and a sealed segment is not
        reopened. <xref target="segment-formation"/> specifies boundary
        ordering, empty intervals, size-triggered closure, policy changes, and
        recovery behavior.
      </t>
      <figure anchor="arch-flow">
        <name>Evidence Path and Interoperability Boundary</name>
        <artwork type="ascii-art"><![CDATA[

Source telemetry
      |
      v
+----------------------------+       OUTSIDE THIS PROFILE
| Upstream admission system  |
| auth / replay / projection |
+----------------------------+
      | exact canonical-record bytes
======|================================================ boundary
      v
+----------------------------+ --> authoritative segment
| Ledger producer            |     artifact ----------> Verifier
| admit / assign / commit    | --> artifact digest
| seal / chain               |          |
+----------------------------+          +--> timestamp channel
                                        +--> peer attestation
]]></artwork>
      </figure>
      <t>
        The boundary is admission of an already-formed canonical-record byte
        string. From that point, the ledger producer is responsible for
        byte preservation, segment assignment, durable state, artifact
        construction, and timestamp submission. Verification establishes
        consistency of disclosed post-admission evidence, not source
        authenticity, dataset completeness, or physical truth.
      </t>
      <t><strong>Document Roadmap.</strong> <xref target="terminology"/> and
        <xref target="roles"/> define the common terminology and system roles.
        Producer implementers should focus on <xref target="data-model"/>,
        <xref target="artifacts"/>, <xref target="anchoring-verification"/>,
        <xref target="versioning"/>, and <xref target="conformance-vectors"/>.
        Verifier implementers should additionally read
        <xref target="disclosure-bundles"/> and Appendices A through C.
        Operators should also read <xref target="operations"/> and
        <xref target="security"/>.
      </t>

    </section>

    <section numbered="true" toc="include" anchor="terminology">
      <name>Conventions and Terminology</name>
      <t>
        The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>",
        "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>",
        "<bcp14>SHALL NOT</bcp14>", "<bcp14>SHOULD</bcp14>",
        "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>",
        "<bcp14>NOT RECOMMENDED</bcp14>", "<bcp14>MAY</bcp14>", and
        "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
        described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/>
        when, and only when, they appear in all capitals, as shown here.
      </t>
      <t>Terms:</t>
      <ul>
        <li>Upstream admission system: A component outside this profile that authenticates, filters, decrypts, de-duplicates, interprets, or maps source telemetry and produces a canonical-record byte string. It can be colocated with the ledger producer.</li>
        <li>Canonical-record byte string: The exact deterministic-CBOR byte string presented at the interoperability boundary and admitted as one commitment input. "Canonical" describes its byte-level encoding under the commitment profile; it does not assert physical truth or correct derivation from source telemetry.</li>
        <li>Commitment profile: One immutable set of normative rules for validating canonical-record byte strings and deterministically constructing and verifying commitment outputs. These rules include canonical-record syntax and encoding constraints, hash and Merkle tree construction, leaf ordering and occurrence handling, deterministic batching, authoritative segment artifact construction and chaining, and the applicable recomputation semantics.</li>
        <li>Commitment profile identifier (<tt>commitment_profile_id</tt>): The opaque text value that selects exactly one commitment profile. This document defines one profile, informally named "VTL Canonical CBOR v2", and assigns it the UUIDv4 <tt>ad4a543a-4977-4632-af4d-a0df0301e0cf</tt> under <xref target="RFC9562"/>. The identifier uses the RFC 9562 lowercase hex-and-dash representation; the informal name is descriptive and is not an identifier. Producers MUST emit exactly that UUID value. Verifiers MUST compare it by exact string equality and reject an absent or unequal value. Implementations MUST NOT infer profile semantics from a schema version, media type, filename, producer manifest, proof sidecar, the informal name, or by parsing the identifier. The UUID MUST NOT be reused for rules that can produce different commitment bytes or verifier conclusions.</li>
        <li>Commitment contract: The full interoperable behavior defined by this profile, including byte-preserving canonical-record admission, segment assignment, commitment encoding, authoritative segment artifact structure, producer manifests, disclosure classes, and verification rules.</li>
        <li>Ledger: One ordered chain of authoritative segment artifacts identified by a fresh unpredictable 128-bit <tt>ledger_id</tt>, rendered as 32 lowercase hexadecimal characters. Segment serial numbers are scoped to this identifier.</li>
        <li>Ledger epoch: The lifetime of one ledger sequence under a single <tt>ledger_id</tt>. The epoch segment is segment zero and carries the zero predecessor value.</li>
        <li>Segment: The multiset of admitted canonical-record byte strings assigned to one emitted ledger interval. Depending on <tt>empty_mode</tt>, a segment can be empty. Segment membership is selected by the admission linearization point and a non-decreasing elapsed-time close rule, not by record timestamps.</li>
        <li>Authoritative segment artifact: The deterministic-CBOR record for one emitted segment and the cryptographic source of truth for verification. The producer manifest member <tt>artifacts.segment_cbor</tt> references the exact bytes of this object and does not name a separate protocol object. Its storage path and filename are not protocol fields.</li>
        <li>Segment closure policy: The committed policy snapshot containing its version, interval, batch limit, optional record and size limits, and empty mode. It is a configuration claim, not proof that the producer observed the claimed elapsed duration.</li>
        <li>Authoritative: Used for exact canonical-record byte strings and the authoritative segment artifact that verifiers MUST treat as cryptographic sources of truth.</li>
        <li>Projection: A non-authoritative representation (for example JSON) derived from an authoritative segment artifact.</li>
        <li>Producer manifest: A non-authoritative JSON object supplied by the producer that claims a disclosure class and identifies disclosed artifacts, their digests, and selected channel states.</li>
        <li>Verifier result: The verifier-authored output that reports the exercised scope, any segment-chain conclusion, per-channel status, overall outcome, and failure reasons when verification fails. It reports externally meaningful conclusions rather than an implementation trace. It is not a commitment input or a producer claim.</li>
        <li>Batch metadata: The batch objects embedded in the authoritative segment artifact, including their identity fields, counts, sorted leaf hashes, and batch roots. It is commitment material, not a storage-layout convention.</li>
        <li>OTS metadata sidecar: An optional, deployment-specific, non-authoritative metadata file associated with an OTS proof and authoritative segment artifact, linking the artifact digest to the proof path. It is not a commitment input.</li>
        <li>Anchor evidence: The proof artifacts and binding metadata disclosed for an external timestamping or attestation channel.</li>
        <li>Timestamp Authority (TSA): An authority operating under <xref target="RFC3161"/> that issues timestamp responses.</li>
        <li><tt>TimeStampResp</tt>: The RFC 3161 protocol response containing status information and, on success, a timestamp token.</li>
        <li>TSR artifact: The exact encoded <tt>TimeStampResp</tt> stored or disclosed by a VTL bundle. The <tt>.tsr</tt> suffix is an illustrative storage convention.</li>
        <li>Timestamp token: The signed CMS object carried inside a successful <tt>TimeStampResp</tt>.</li>
        <li>Peer signature quorum: A deployment-defined set or threshold of peer signatures over the same authoritative segment artifact digest, treated as one optional parallel attestation channel.</li>
        <li>Verification scope: The disclosure level and claim boundaries that a verifier actually exercised and asserts in a verifier result.</li>
        <li>Admission linearization point: The ledger-producer-local instant at which one exact canonical-record byte string is accepted as a commitment input and assigned to the currently open segment. Implementations MUST serialize boundary closure and admission so that each admitted input has exactly one segment assignment.</li>
        <li>Disclosure class: The level of artifact disclosure associated with a verification claim.</li>
      </ul>
      <t>
        The following JSON excerpt is illustrative; the authoritative segment
        artifact is CBOR and contains additional required fields:
      </t>
      <sourcecode type="json"><![CDATA[
{
  "commitment_profile_id": "ad4a543a-4977-4632-af4d-a0df0301e0cf",
  "ledger_id": "0123456789abcdef0123456789abcdef",
  "segment_number": 42
}
]]></sourcecode>
      <t>
        The profile identifier has that same fixed value wherever this
        document carries the field. <tt>ledger_id</tt> and
        <tt>segment_number</tt> identify a particular ledger and segment and
        therefore vary.
      </t>
    </section>

    <section numbered="true" toc="include" anchor="roles">
      <name>System Roles</name>
      <t>
        In this document, optional parallel attestation channels are not
        required for baseline conformance. A baseline producer MUST select and
        initiate the <xref target="RFC3161"/> channel for every emitted
        segment. OTS (<xref target="OTS"/>) can be selected as an additive
        deployment-specific channel, and peer signatures are optional; when
        selected, they MUST bind to the same authoritative segment artifact
        digest and verifiers MUST report their results separately.
      </t>
      <ul>
        <li>Upstream admission system: Produces canonical-record byte strings after applying deployment-specific source validation and mapping. This role is outside the profile.</li>
        <li>Ledger producer: Accepts exact canonical-record byte strings at the profile boundary, assigns them to serial-numbered segments, constructs authoritative segment artifacts, and anchors their digests. A physical gateway can implement both the upstream and ledger-producer roles, but conformance under this document begins only at the byte-level handoff.</li>
        <li>Verifier: Recomputes commitments and validates proofs from disclosed artifacts.</li>
        <li>Deployment-specific timestamp service: Provides proofs over authoritative segment artifact hashes under an explicitly identified profile; OTS calendars are one example.</li>
        <li>Timestamp Authority (TSA): Issues RFC 3161 timestamp responses over authoritative segment artifact digests for the channel selected by baseline producers for every emitted segment.</li>
        <li>Peers: Co-sign authoritative segment artifact digests for short-term provenance, when that optional channel is used.</li>
      </ul>
    </section>

    <section numbered="true" toc="include" anchor="data-model">
      <name>Data and Commitment Model</name>
      <t>
        The normative input to this section is an exact canonical-record byte
        string that has already been produced by an upstream admission system.
        The interoperable core begins at that byte-level handoff and covers
        record admission, segment assignment, deterministic hashing and tree
        calculation, authoritative segment artifacts, disclosure, and verification. No
        source transport, decryption, anti-replay, payload interpretation, or
        source-to-record projection is defined by this document.
      </t>

      <section numbered="true" toc="include" anchor="canonical-record-input">
        <name>Canonical-Record Input Boundary</name>
        <t>
          The protocol input defined by this document is one exact
          canonical-record byte string. The byte string MUST encode exactly one
          CBOR data item using the record shape below and the deterministic
          encoding constraints in <xref target="cbor-profile"/>. A ledger
          producer MUST reject a proposed input that does not satisfy those
          byte-level constraints.
        </t>
        <t>
          Once admitted, the exact supplied octets are authoritative. The
          ledger producer MUST use those octets, without modification, as the
          leaf preimage under <xref target="merkle-policy"/>. It MUST NOT decode
          and re-encode, normalize, enrich, remove, reorder, or otherwise
          substitute a different byte string for commitment. Each admission
          event contributes one record occurrence, including when two admitted
          occurrences have identical byte strings.
        </t>
        <t>
          Source transport, framing, authentication, decryption, anti-replay
          processing, duplicate-submission policy, device-identifier mapping,
          message-type mapping, payload interpretation, and construction of the
          canonical-record byte string are upstream of this boundary and are
          not specified or verified here. A physical gateway MAY perform those
          functions and ledger production in one implementation, but its
          interoperability claim under this document begins only with the exact
          byte string passed across this logical boundary.
        </t>
        <t>
          Under the commitment profile defined by this document, each
          canonical-record byte string encodes the following fixed
          seven-element CBOR array:
        </t>
        <sourcecode type="cddl"><![CDATA[
canonical-record-v1 = [
  version: 1,
  device_id: bstr .size 8,
  fc: uint,
  ingest_time: uint,
  device_time: uint / nil,
  kind: uint,
  payload: restricted-cbor-item
]

restricted-cbor-item =
  int / bstr / tstr / bool / nil / finite-float /
  [* restricted-cbor-item] /
  { * tstr => restricted-cbor-item }

finite-float = float
]]></sourcecode>
        <t>
          The positional labels are conventional names for inspecting disclosed
          records; they do not move source-to-record mapping into this profile.
          Their byte-level requirements are:
        </t>
        <ul>
          <li><tt>version</tt> is the unsigned integer <tt>1</tt>.</li>
          <li><tt>device_id</tt> is an opaque 8-octet identifier assigned upstream. This document defines no mapping from a transport or deployment alias to this value.</li>
          <li><tt>fc</tt> is an unsigned upstream-supplied sequence value. This document defines no replay or duplicate-suppression semantics for it.</li>
          <li><tt>ingest_time</tt> is an unsigned count of whole non-leap seconds since <tt>1970-01-01T00:00:00Z</tt>. Its assignment and accuracy are upstream responsibilities, and it MUST NOT select segment membership.</li>
          <li><tt>device_time</tt> is an unsigned application timestamp or <tt>null</tt>. Its epoch and unit are upstream semantics, and it MUST NOT select segment membership.</li>
          <li><tt>kind</tt> is an unsigned application discriminator. This document defines no message-type or payload-family mapping for it.</li>
          <li><tt>payload</tt> is one recursively restricted CBOR data item of the type above. Its schema and meaning are outside this profile.</li>
        </ul>
        <t>
          A different record array shape or different byte-level field type is
          a different commitment profile and requires a distinct
          <tt>commitment_profile_id</tt>. Application schemas MAY separately
          define the meanings of <tt>device_id</tt>, <tt>fc</tt>,
          <tt>device_time</tt>, <tt>kind</tt>, and <tt>payload</tt>, but
          successful verification under this document does not validate those
          external semantics.
        </t>
        <t>
          Class A recomputation starts with the disclosed canonical-record byte
          strings. It demonstrates that those exact bytes produce the disclosed
          leaf digests, roots, and authoritative segment artifact. It does not
          reconstruct the bytes from source telemetry. Conformance vectors for
          this profile therefore MUST begin with exact canonical-record byte
          strings; transport messages and upstream projection fixtures, if
          supplied, are informative and are not inputs to baseline conformance.
        </t>
      </section>
      <section numbered="true" toc="include" anchor="cbor-profile">
        <name>Deterministic CBOR Commitment Encoding</name>
        <t>
          Commitment bytes MUST satisfy the general deterministic-encoding
          requirements of Section 4.2.1 and the length-first core
          deterministic-encoding requirements of Section 4.2.3 of
          <xref target="RFC8949"/>. Items MUST use definite-length encoding;
          integers and finite floating-point values MUST use their shortest
          exact encodings. Accordingly, shorter encoded map keys sort first;
          encoded map keys of equal length sort in bytewise lexical order.
        </t>
        <t>
          Map keys MUST be CBOR text strings. Duplicate map keys and invalid
          UTF-8 text strings MUST be rejected. CBOR tags, NaN, positive
          infinity, and negative infinity MUST NOT appear. Permitted values
          are integers, byte strings, text strings, arrays, maps, booleans,
          null, and finite deterministic floating-point values.
        </t>
        <t>
          JSON projections are optional and non-authoritative and MUST NOT be
          commitment inputs. Implementations can use
          <xref target="RFC8785"/> when stable JSON projection octets are
          useful. Once a canonical-record byte string is admitted, its exact
          octets MUST be committed without re-encoding.
        </t>
      </section>

      <section numbered="true" toc="include" anchor="merkle-policy">
        <name>Deterministic Commitment Tree Calculation</name>
        <t>
          For a given segment <tt>S</tt>, the current commitment profile
          computes <tt>segment_root</tt> from canonical-record bytes using the
          domain-separated tree shape of Section 2.1.1 of
          <xref target="RFC9162"/>, specialized to SHA-256 and to the multiset
          ordering below. SHA-256 is defined by <xref target="RFC6234"/>.
        </t>
        <t>
          For each exact canonical-record byte string <tt>record</tt>, compute
          <tt>leaf_hash = SHA-256(0x00 || record)</tt>. Sort the resulting raw
          32-octet leaf hashes in ascending byte order. Lowercase hexadecimal
          is only their artifact representation; sorting those fixed-width
          lowercase strings is equivalent to sorting the raw bytes.
        </t>
        <t>
          Let <tt>MTH(L)</tt> operate on the sorted list of already-computed
          leaf hashes. <tt>MTH({}) = SHA-256("")</tt> and
          <tt>MTH({x}) = x</tt>. For a list of <tt>n &gt; 1</tt> hashes, let
          <tt>k</tt> be the largest power of two strictly less than <tt>n</tt>,
          and compute
          <tt>MTH(L) = SHA-256(0x01 || MTH(L[0:k]) || MTH(L[k:n]))</tt>.
          Implementations MUST NOT duplicate an unpaired final hash. The
          prefixes <tt>0x00</tt> and <tt>0x01</tt> provide leaf/parent domain
          separation, and the recursive split gives every leaf count a unique
          tree shape.
        </t>
        <t>
          For an emitted empty segment, <tt>batches</tt> MUST be an empty array
          and <tt>segment_root</tt> MUST equal <tt>MTH({})</tt>, the SHA-256 digest of zero bytes:
          <tt>e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855</tt>.
          Its <tt>closure_policy.empty_mode</tt> MUST be <tt>emit</tt>; an empty
          artifact under <tt>suppress</tt> mode is invalid.
          For a non-empty segment, <tt>batches</tt> MUST contain at least one
          non-empty batch. The resulting <tt>segment_root</tt> is deterministic
          for the multiset of committed canonical records. Because leaf
          digests are sorted before reduction, the root does not commit to
          admission order. Admission order selects segment membership at the
          boundary but is not itself a verifier-visible total-order claim.
        </t>
        <t>
          Any future change to this calculation that alters commitment bytes
          MUST use a new
          <tt>commitment_profile_id</tt>.
        </t>
      </section>

      <section numbered="true" toc="include" anchor="segment-formation">
        <name>Segment Formation and Closure</name>
        <t><em>Normal Interval Timing and Admission</em></t>
        <t>
          Segment formation uses an elapsed-time source maintained by the
          ledger producer. That source MUST be non-decreasing and MUST progress
          during normal operation while an interval is open. Its resolution
          MUST be no greater than the configured
          <tt>closure_policy.interval_ms</tt> value. That field is a positive
          uint64 number of milliseconds and specifies a fixed elapsed duration.
          It is not a civil-time duration and MUST NOT be aligned by local midnight, UTC
          midnight, time zone, daylight-saving transition, or leap second.
          The first logical interval of an epoch opens when the ledger is activated.
          Each normal or early closure other than <tt>shutdown</tt> immediately
          opens the next logical interval. Logical intervals continue across
          idle periods in both empty modes; <tt>suppress</tt> changes artifact
          emission and serial consumption, not the elapsed-time schedule.
        </t>
        <t>
          The producer MUST serialize the interval-boundary transition with the
          admission linearization point. For an interval whose elapsed-time
          deadline is <tt>T</tt>:
        </t>
        <ul>
          <li>A record whose acceptance linearizes before <tt>T</tt> belongs to the current logical interval.</li>
          <li>At <tt>T</tt> or later, the producer MUST process the boundary before another acceptance can linearize.</li>
          <li>Upstream processing can begin before <tt>T</tt>, but if canonical-record admission linearizes at or after <tt>T</tt>, the record belongs to the next logical interval.</li>
          <li>Source arrival time, upstream validation or record-construction time, <tt>device_time</tt>, and <tt>ingest_time</tt> MUST NOT override this assignment.</li>
        </ul>
        <t>
          The producer MUST determine deadline expiry by checked elapsed-time
          subtraction; it MUST NOT add
          <tt>closure_policy.interval_ms</tt> to an absolute counter in a way
          that can wrap. If elapsed time cannot be represented or compared
          safely, the producer MUST enter the recovery procedure below before
          accepting another record.
        </t>
        <t><em>Policy Changes and Early Closure</em></t>
        <t>
          The producer snapshots <tt>closure_policy</tt> when a logical interval
          opens. That snapshot MUST remain unchanged through closure. A normal
          configuration update becomes effective for the next logical
          interval. An immediate update MUST first close the current logical
          interval under the old snapshot. It emits an artifact with
          <tt>close_reason</tt> equal to <tt>reconfigure</tt> unless the interval
          is empty under <tt>suppress</tt> mode, in which case it emits no
          artifact and consumes no segment number.
        </t>
        <t>
          Early closure is permitted only for a condition represented by the
          committed <tt>close_reason</tt>. A producer MUST NOT place a record
          whose acceptance linearizes after the interval deadline into the
          expired interval merely because closure processing was late. Late
          closure is an operational fault and SHOULD generate an alarm.
        </t>
        <t>
          A <tt>manual</tt> closure occurs when a deployment-authorized
          administrative action requests immediate closure for a reason not
          represented by another <tt>close_reason</tt>. The producer MUST
          serialize that action with admission, close the current logical
          interval under its existing policy snapshot, and immediately open
          the next logical interval. A <tt>shutdown</tt> closure occurs when
          the producer closes the current logical interval as part of an
          orderly cessation of ledger operation. It MUST NOT open another
          logical interval until the ledger is reactivated. Artifact emission
          and serial consumption for an empty manual or shutdown interval
          follow the committed <tt>empty_mode</tt>.
        </t>
        <t><em>Limits and Close-Reason Selection</em></t>
        <t>
          <tt>closure_policy.record_limit</tt>, when non-null, is the maximum
          number of admitted records in one logical interval. The interval
          closes immediately after the acceptance that makes the record count
          equal to <tt>record_limit</tt>.
        </t>
        <t>
          <tt>closure_policy.size_limit_bytes</tt>, when non-null, is a close
          threshold for the sum of the lengths of the exact admitted
          canonical-record byte strings. After an acceptance has linearized, if
          the resulting byte total is greater than or equal to
          <tt>size_limit_bytes</tt>, the producer MUST close that logical
          interval before another acceptance can linearize. The triggering
          record remains assigned to the interval because segment assignment is
          final at the admission linearization point. Consequently,
          <tt>size_limit_bytes</tt> is not a hard pre-admission maximum and an
          emitted segment can exceed the threshold by the contribution of its
          final admitted record. If a single record admitted to an empty
          interval exceeds <tt>size_limit_bytes</tt>, that record forms a
          one-record interval, which MUST close before another acceptance can
          linearize. Threshold comparisons and byte-count updates MUST use
          checked arithmetic; the producer MUST enter recovery or stop
          acceptance before acknowledging a record if the new total cannot be
          represented safely.
        </t>
        <t>
          If multiple close conditions are simultaneously true, the committed
          <tt>close_reason</tt> MUST be selected by this precedence, from
          highest to lowest: <tt>recovery</tt>, <tt>shutdown</tt>,
          <tt>reconfigure</tt>, <tt>size_limit</tt>, <tt>record_limit</tt>,
          <tt>interval</tt>, then <tt>manual</tt>. The selected reason does not
          change which acceptances already linearized into the interval.
        </t>
        <t><em>Empty Intervals and Timer Continuity</em></t>
        <t>
          While elapsed-timer continuity is maintained, in <tt>emit</tt> mode
          every logical interval produces an artifact;
          an empty interval uses the empty construction in
          <xref target="merkle-policy"/>. In <tt>suppress</tt> mode, an empty
          logical interval produces no artifact and consumes no segment number.
          The next emitted artifact uses the next contiguous number. A
          suppressed interval makes neither a completeness claim nor a claim
          that no event occurred.
        </t>
        <t>
          Suspend time counts toward <tt>closure_policy.interval_ms</tt> when
          the selected elapsed-time source advances across suspend. If it does
          not, or if its continuity is uncertain, the producer MUST apply the
          recovery procedure before accepting another record.
        </t>
        <t><em>Recovery and Durable State</em></t>
        <t>
          After restart or failover, the producer MUST recover the active
          <tt>ledger_id</tt>, next segment number, policy snapshot, and any open
          interval state before accepting more telemetry. If elapsed-time or
          open-interval state is uncertain, the producer MUST NOT infer the
          boundary from a possibly regressed wall clock. It MUST either stop
          acceptance or seal recoverable material with <tt>close_reason</tt>
          equal to <tt>recovery</tt> before accepting into a new interval. It
          MUST NOT synthesize historical empty artifacts and represent them as
          having been sealed at missed deadlines.
        </t>
        <t>
          The admission linearization point is a durable transaction boundary.
          Before acknowledging acceptance, the producer MUST make the exact
          canonical-record octets, their membership in the open interval, the
          interval record count and byte count, and the corresponding recovery
          state atomically durable or recoverable. After a crash, an acceptance
          MUST be recovered exactly once in the same logical interval, or it
          MUST be treated as never having completed. Segment sealing MUST
          atomically persist the authoritative segment artifact, its digest, the next
          serial allocation, and the new open-interval state before admission
          resumes.
        </t>
        <t><em>Deterministic Batch Partitioning</em></t>
        <t>
          For a non-empty interval, compute the complete sorted leaf-hash list
          defined in <xref target="merkle-policy"/>. Partition that list into
          consecutive batches of at most
          <tt>closure_policy.batch_record_limit</tt> hashes. Batch zero contains
          the first hashes, batch one the next hashes, and so on; only the last
          batch can contain fewer than the limit. This rule is the sole
          baseline batch partitioning rule and is independent of storage flushes,
          worker scheduling, or input-file layout.
        </t>
      </section>

      <section numbered="true" toc="include" anchor="segment-artifact-schema">
        <name>Authoritative Segment Artifact Schema</name>
        <t>
          The authoritative segment artifact is a deterministic CBOR-encoded
          segment record produced under <xref target="cbor-profile"/>. It is the
          stable segment-scoped object of commitment verification. It commits
          to one record multiset, its ledger identity, serial number, closure
          policy and reason, and predecessor artifact. It is not a transport
          envelope, publication statement, or complete verification claim.
        </t>
        <t>
          An authoritative segment artifact is interpreted only under its in-band
          <tt>commitment_profile_id</tt>. Because that identifier is inside the
          authoritative segment artifact bytes, every proof over its digest
          binds the commitment semantics. A producer manifest MUST
          repeat the same value and verifiers MUST reject a mismatch. Verifiers
          MUST NOT infer the commitment profile from the filename, media type,
          segment-record <tt>version</tt>, or proof sidecar alone.
        </t>
        <t>The segment record contains exactly these fields:</t>
        <ul>
          <li><tt>version</tt> (uint): segment-record schema version, exactly <tt>2</tt>.</li>
          <li><tt>commitment_profile_id</tt> (tstr): exactly the profile UUID defined in <xref target="terminology"/>.</li>
          <li><tt>ledger_id</tt> (tstr): stable ledger identifier consisting of exactly 32 lowercase hexadecimal characters.</li>
          <li><tt>site_id</tt> (tstr): non-empty site identifier.</li>
          <li><tt>segment_number</tt> (uint): serial number in the range 0..(2^64-1).</li>
          <li><tt>closure_policy</tt> (map): immutable policy snapshot for this logical interval, containing exactly <tt>version</tt> equal to <tt>1</tt>; positive uint64 <tt>interval_ms</tt> and <tt>batch_record_limit</tt>; <tt>record_limit</tt> and <tt>size_limit_bytes</tt>, each a positive uint64 or null; and <tt>empty_mode</tt> equal to <tt>emit</tt> or <tt>suppress</tt>.</li>
          <li><tt>close_reason</tt> (tstr): exactly one of <tt>interval</tt>, <tt>reconfigure</tt>, <tt>record_limit</tt>, <tt>size_limit</tt>, <tt>shutdown</tt>, <tt>recovery</tt>, or <tt>manual</tt>.</li>
          <li><tt>prev_segment_sha256</tt> (tstr): SHA-256 digest of the exact bytes of the previous authoritative segment artifact, as 64 lowercase hexadecimal characters, or the epoch predecessor value defined in <xref target="segment-chaining"/>.</li>
          <li><tt>batches</tt> (array): authoritative batch objects sorted by <tt>batch_number</tt>; exactly empty for an empty emitted segment.</li>
          <li><tt>segment_root</tt> (tstr): deterministic segment root as 64 lowercase hexadecimal characters.</li>
        </ul>
        <t>Each batch object contains exactly these fields:</t>
        <ul>
          <li><tt>version</tt> (uint): batch-record schema version, exactly <tt>2</tt>.</li>
          <li><tt>ledger_id</tt> (tstr): the containing segment's <tt>ledger_id</tt>.</li>
          <li><tt>site_id</tt> (tstr): the containing segment's <tt>site_id</tt>.</li>
          <li><tt>segment_number</tt> (uint): the containing segment's <tt>segment_number</tt>.</li>
          <li><tt>batch_number</tt> (uint): batch serial in the range 0..(2^64-1), unique within the segment.</li>
          <li><tt>merkle_root</tt> (tstr): batch Merkle root as 64 lowercase hexadecimal characters.</li>
          <li><tt>count</tt> (uint): positive number of committed canonical records in the batch.</li>
          <li><tt>leaf_hashes</tt> (non-empty array of tstr): leaf hashes sorted as lowercase hexadecimal strings.</li>
        </ul>
        <t>
          The batch objects embedded in the authoritative segment artifact are authoritative
          batch metadata. For a non-empty segment, batch objects MUST be sorted
          by ascending <tt>batch_number</tt>, and batch numbers MUST be unique
          and contiguous starting at zero. Their leaf lists MUST be the
          consecutive partitions of the complete sorted segment leaf list
          required by <xref target="segment-formation"/>.
        </t>
        <ul>
          <li>For each batch, <tt>ledger_id</tt>, <tt>site_id</tt>, and <tt>segment_number</tt> MUST equal the containing segment fields.</li>
          <li>For each batch, <tt>count</tt> MUST equal the length of <tt>leaf_hashes</tt> and MUST be greater than zero.</li>
          <li>For each batch, <tt>merkle_root</tt> MUST equal the Merkle reduction of that batch's <tt>leaf_hashes</tt> under <xref target="merkle-policy"/>.</li>
          <li>The multiset union of all batch <tt>leaf_hashes</tt> MUST equal the segment leaf-digest multiset from which <tt>segment_root</tt> is computed.</li>
        </ul>
        <t>
          The deterministic-CBOR object is the authoritative segment artifact. A JSON
          projection, filename, and storage path are non-authoritative. A
          verifier MUST compare the decoded <tt>segment_number</tt> with the
          producer manifest claim rather than trusting a path or filename.
        </t>
      </section>

      <section numbered="true" toc="include" anchor="segment-chaining">
        <name>Segment Chaining</name>
        <t>
          Segment identity and chaining are defined within one stable
          <tt>ledger_id</tt>. They do not depend on UTC dates or elapsed idle
          time.
        </t>
        <ul>
          <li>The epoch segment MUST have <tt>segment_number</tt> equal to <tt>0</tt> and <tt>prev_segment_sha256</tt> equal to 64 zero characters, representing 32 zero bytes.</li>
          <li>Every non-epoch segment MUST have a serial number exactly one greater than its predecessor, MUST retain the same <tt>ledger_id</tt> and <tt>site_id</tt>, and MUST set <tt>prev_segment_sha256</tt> to <tt>SHA-256</tt> over the exact bytes of the predecessor's authoritative segment artifact.</li>
          <li>A producer MUST NOT reuse, skip, or wrap <tt>segment_number</tt>. Before serial exhaustion, it MUST stop the ledger and start a new ledger with a new <tt>ledger_id</tt>.</li>
          <li>A closure-policy change MUST take effect only in a newly opened logical interval. It does not reset <tt>segment_number</tt> or <tt>ledger_id</tt>.</li>
        </ul>
        <t>
          When a new epoch begins, the producer MUST generate <tt>ledger_id</tt> from a
          cryptographically strong random source. If durable sequence state
          cannot be recovered unambiguously, a producer MUST stop acceptance or
          begin a new ledger with a fresh identifier; it MUST NOT reset the
          serial under the old identifier. Redundant producer instances MUST
          use single-writer fencing or an atomic shared allocator so that they
          cannot emit different artifacts for the same
          <tt>(ledger_id, segment_number)</tt>.
        </t>
        <t>
          A verifier given adjacent authoritative segment artifacts MUST validate serial
          continuity and predecessor-digest linkage. A partial disclosure that
          omits the predecessor can still support validation of the disclosed
          artifact and its external proof, but the verifier MUST report
          <tt>chain_status</tt> as <tt>predecessor_not_disclosed</tt>.
        </t>
      </section>
    </section>

    <section numbered="true" toc="include" anchor="artifacts">
      <name>Artifacts and Verification Bundles</name>
      <t>
        A deployment can store canonical records, authoritative segment
        artifacts, producer manifests, verifier results, and timestamp evidence in any suitable
        layout. Filenames and layouts are non-authoritative. Each disclosed
        record artifact MUST contain the exact admitted canonical-record octets
        without a wrapper or re-encoding.
      </t>
      <t>
        Every verification bundle that claims a disclosure class under this
        document MUST disclose the authoritative segment artifact and a
        producer manifest.
      </t>

      <section numbered="true" toc="include" anchor="producer-manifest">
        <name>Producer Manifest</name>
        <t>
          The artifact's in-band <tt>commitment_profile_id</tt> is the
          cryptographically bound profile identifier. The producer manifest
          repeats the ledger identity, segment number, commitment profile,
          claimed disclosure class, artifact digests, and claimed channel
          state. It MUST NOT contain a segment-chain validation conclusion,
          per-channel verifier status, failure reasons, or an overall
          verification outcome.
        </t>
        <t>
          Each entry in <tt>artifacts.records</tt> represents one admitted
          record occurrence. Duplicate entries are permitted and MUST be
          counted separately. When two or more occurrences have identical
          canonical-record bytes, their entries MAY reference the same
          disclosed artifact; a Class A verifier MUST hash its exact octets
          once for each listed occurrence. Artifact-reference order does not
          assert admission order.
        </t>
        <t>
          Producer channel state is limited to <tt>present</tt> when the
          corresponding evidence artifact is disclosed and <tt>pending</tt>
          when the channel was selected but evidence is not yet available. An
          unselected channel is omitted. Producer manifests MUST NOT use
          verifier states such as <tt>verified</tt> or <tt>failed</tt>.
        </t>
        <t>
          A <tt>pending</tt> channel MAY omit its evidence artifact. A
          <tt>present</tt> TSA channel MUST reference <tt>tsa_tsr</tt>. A
          <tt>present</tt> OTS channel MUST reference <tt>segment_ots</tt> and
          MUST include the sidecar reference and binding required by the
          applicable deployment-specific OTS profile. A <tt>present</tt> peer
          channel MUST reference <tt>peer_attest</tt> and the applicable
          binding metadata.
        </t>
        <t>
          The producer manifest is the primary disclosure surface for
          verifier-visible producer claims. Its schema is defined in
          <xref target="appendix-b"/>. Deployment-specific data can be carried
          only in explicit extension containers and MUST preserve the
          semantics defined here.
        </t>
      </section>

      <section numbered="true" toc="include" anchor="verifier-result">
        <name>Verifier Result</name>
        <t>
          Verification under <xref target="verify"/> produces a logical
          verifier result. Only that verifier-authored result states the
          exercised scope, any segment-chain conclusion, per-channel validation
          status, verifier-policy identifier when applicable, overall
          outcome, and failure reasons. The result reports conclusions needed
          by a relying party; local step-by-step diagnostics and execution
          traces are implementation-specific. A producer manifest and a
          verifier result MUST NOT be represented as the same object.
        </t>
        <t>
          A verifier MAY serialize its result as JSON. A serialized result that
          claims conformance with this document MUST use the schema in
          <xref target="appendix-b"/> and the <tt>application/json</tt> media
          type. This document does not request a specialized media type for
          verifier results.
        </t>
      </section>

      <section numbered="true" toc="include" anchor="portable-artifact-references">
        <name>Portable Artifact References and Binding</name>
        <t>
          Every path-bearing object consumed during verification, including a
          producer manifest artifact reference, a deployment-specific sidecar,
          or an extension object, MUST satisfy the requirements in this
          subsection. Each path is a UTF-8 string interpreted relative to the
          disclosed evidence bundle root, using
          <tt>/</tt> as the only separator. A path MUST be non-empty; MUST NOT
          begin with <tt>/</tt>, <tt>\</tt>, or a drive-letter prefix; MUST NOT
          contain <tt>\</tt>, a colon, a control character in the ranges U+0000
          through U+001F or U+007F, an empty path component, or a component
          equal to <tt>.</tt> or <tt>..</tt>; and after resolution MUST remain
          below the bundle root. Verifiers MUST reject a symbolic link, reparse
          point, or equivalent filesystem indirection, or MUST use a
          containment-enforcing open operation that prevents such indirection
          from changing the target between validation and access.
        </t>
        <t>
          For every such consumed path, path validation and file opening MUST be one race-resistant
          operation; a check-then-open sequence that permits target substitution
          is nonconformant. These checks are semantic requirements and do not
          depend on a regular-expression dialect. Every artifact listed in the
          producer manifest MUST carry a lowercase hexadecimal SHA-256 digest entry.
        </t>
        <t>
          The producer manifest binds claim semantics to the authoritative
          segment artifact. The producer manifest's <tt>ledger_id</tt>, <tt>site_id</tt>,
          <tt>segment_number</tt>, and <tt>commitment_profile_id</tt> MUST match
          the corresponding fields in the authoritative segment artifact. A
          verifier obtains the applicable profile identifier from the artifact
          itself rather than from a path or filename.
        </t>
      </section>

      <section numbered="true" toc="include" anchor="deployment-sidecars">
        <name>Deployment-Specific Sidecars</name>
        <t>
          A deployment-specific OTS profile that uses a sidecar MUST bind at
          least:
        </t>
        <ul>
          <li><tt>artifact</tt>,</li>
          <li><tt>artifact_sha256</tt>, and</li>
          <li><tt>ots_proof</tt>.</li>
        </ul>
        <t>
          Any path-valued <tt>artifact</tt> or <tt>ots_proof</tt> member, and
          any other path-bearing member consumed from a deployment-specific
          sidecar, MUST satisfy <xref target="portable-artifact-references"/>.
          Verifiers MUST recompute the authoritative segment artifact digest
          and compare it with the sidecar before accepting any proof validation
          result.
        </t>
      </section>
    </section>

    <section numbered="true" toc="include" anchor="anchoring-verification">
      <name>Anchoring and Verification</name>

      <section numbered="true" toc="include" anchor="baseline-conformance">
        <name>Baseline Conformance</name>
        <t>
          For every emitted segment, a baseline producer MUST select and
          initiate the <xref target="RFC3161"/> channel. Its RFC 3161 evidence
          MAY remain <tt>pending</tt> while issuance is incomplete, but a
          baseline <tt>success</tt> result requires verified RFC 3161 evidence.
        </t>
        <t>
          OTS and peer channels are additive. A baseline verifier MAY report
          either channel as <tt>skipped</tt> without preventing
          <tt>success</tt>. If validation of selected optional evidence is
          attempted and fails, that failure prevents <tt>success</tt> and
          produces <tt>failure</tt> when verifier policy requires the channel;
          otherwise it produces <tt>partial</tt>. A selected optional channel
          whose evidence is <tt>pending</tt> or <tt>missing</tt> produces
          <tt>partial</tt> unless verifier policy requires <tt>failure</tt>.
        </t>
      </section>

      <section numbered="true" toc="include" anchor="anchoring-contract">
        <name>Anchoring Contract</name>
        <t>
          The generic anchoring contract is simple: a producer computes the
          SHA-256 digest of the authoritative segment artifact and submits that
          digest to one or more external timestamping channels. Verifiers MUST
          first recompute the authoritative segment artifact digest locally; proof validation
          occurs only after digest binding validation succeeds.
        </t>
        <t>
          A timestamp or attestation over the authoritative segment artifact digest binds the
          complete artifact bytes, including the in-band
          <tt>commitment_profile_id</tt>. It does not bind a disclosure class,
          producer manifest, verifier policy, or verifier result.
        </t>
        <t>
          For each emitted segment, a baseline producer MUST select and
          initiate the RFC 3161 timestamping channel over the authoritative segment artifact
          digest. The producer MUST seal and durably write the authoritative
          authoritative segment artifact without waiting for timestamp proof completion.
          A deployment MAY also select a deployment-specific timestamp channel,
          such as OTS (<xref target="OTS"/>), under an explicitly identified
          deployment profile. Such a channel is additive and is not a baseline
          interoperable timestamp profile under this document. Peer signatures
          are optional attestations and do not by themselves satisfy the
          timestamping-channel requirement.
        </t>
      </section>

      <section numbered="true" toc="include" anchor="rfc3161-profile">
        <name>RFC 3161 Timestamp Channel</name>
        <t>
          Baseline producers MUST select this channel for every emitted
          segment, and baseline verifiers MUST implement it.
        </t>
        <t>
          When this channel is used, the producer MUST set
          <tt>TimeStampReq.messageImprint.hashAlgorithm</tt> to SHA-256 and its
          <tt>hashedMessage</tt> to the exact 32-octet result of SHA-256 over
          the authoritative segment artifact bytes. The producer MUST NOT hash
          that 32-octet result again. The producer MUST set
          <tt>TimeStampReq.certReq</tt> to <tt>TRUE</tt>.
        </t>
        <t>
          The <tt>TimeStampReq</tt>, <tt>TimeStampResp</tt>, and timestamp
          token MUST conform to <xref target="RFC3161"/>, as updated by
          <xref target="RFC5816"/> and restricted by this section. The token
          MUST contain exactly one CMS
          <tt>SignerInfo</tt> as defined by <xref target="RFC5652"/>.
        </t>
        <t>
          A successful <tt>TimeStampResp.status.status</tt> MUST be
          <tt>granted (0)</tt>. A verifier MUST reject
          <tt>grantedWithMods (1)</tt> under this profile.
        </t>
        <t>
          The <tt>SignerInfo</tt> signed attributes MUST contain exactly one
          <tt>SigningCertificateV2</tt> attribute with exactly one attribute
          value, as defined by <xref target="RFC5035"/>. The first
          <tt>ESSCertIDv2.certHash</tt> MUST equal SHA-256 over the complete
          DER encoding of the selected signer certificate. If
          <tt>hashAlgorithm</tt> is present, it MUST identify SHA-256;
          omission denotes the SHA-256 default. If <tt>issuerSerial</tt> is
          present, it MUST identify that same certificate. The signed
          attributes MUST NOT contain a legacy
          <tt>SigningCertificate</tt> attribute.
        </t>
        <t>
          Because this profile requires
          <tt>TimeStampReq.certReq=TRUE</tt>,
          <tt>SignedData.certificates</tt> MUST contain exactly one X.509
          certificate that matches both <tt>SignerInfo.sid</tt> and the first
          <tt>ESSCertIDv2</tt>; zero or multiple matching certificates are a
          verification failure. The set MAY also contain unrelated
          certificates or certification-path certificates.
        </t>
        <t>
          A deployment using this channel MUST define accepted TSA trust
          anchors, accepted TSA policy identifiers, certificate-revocation
          policy, acceptable signature and certificate algorithms, and any
          constraints applied to the token's generation time. When operators
          control the TSA, responses SHOULD include necessary intermediates
          and SHOULD omit an already provisioned trust anchor.
          A verifier MUST NOT rewrite a received response or reject it merely
          because it contains additional nonmatching certificates.
        </t>
        <t>
          A verifier evaluating disclosed RFC 3161 evidence MUST recompute the
          authoritative segment artifact digest and validate the
          <tt>TimeStampResp</tt> and token under <xref target="RFC3161"/>, as
          updated by <xref target="RFC5816"/>. Validation MUST include a
          response status of <tt>granted (0)</tt> and required token presence;
          the CMS
          <tt>id-signedData</tt> content type and <tt>id-ct-TSTInfo</tt>
          encapsulated content type; exact SHA-256 message-imprint equality;
          the CMS signature and signed attributes; unambiguous
          signer-certificate binding; the signer certificate's single
          critical extended-key-usage extension containing only
          <tt>id-kp-timeStamping</tt>; certification-path validation under
          <xref target="RFC5280"/> and configured trust anchors; configured
          TSA policy and certificate-validation constraints; and nonce
          equality when the corresponding original request is evaluated and
          contained a nonce. Any failure is a timestamp-channel verification
          failure. The corresponding TSA channel status in a verifier result
          MUST be <tt>verified</tt> on success and <tt>failed</tt> on failure.
        </t>
      </section>

      <section numbered="true" toc="include" anchor="ots-profile">
        <name>Optional Deployment-Specific OTS Channel</name>
        <t>
          When <xref target="OTS"/> is used, the producer stamps
          the SHA-256 digest of the exact authoritative segment artifact bytes
          and stores an OTS proof plus its binding metadata.
        </t>
        <t>
          OpenTimestamps is referenced here as a deployed public timestamping
          ecosystem rather than an IETF-standardized proof format. This
          document does not define an OTS wire format, calendar trust model,
          accepted attestation set, upgrade procedure, or validation
          algorithm. A deployment claiming OTS interoperability MUST define
          those items, identify the profile and verifier policy in use, and
          specify the exact binding metadata. Baseline VTL implementations are
          not required to implement OTS.
        </t>
        <t>
          A verifier reports OTS validation under a distinct OTS channel. The
          channel result MUST identify the collision-resistant deployment-
          specific validation profile in use, for example
          <tt>com.example.ots-verification</tt>; it MUST NOT report an OTS
          proof as an RFC 3161 TSA channel.
        </t>

        <section numbered="true" toc="include" anchor="delayed-anchoring">
          <name>Handling Delayed or Failed Anchoring</name>
          <t>
            If OTS submission fails, times out, or yields only an incomplete
            proof, the producer MUST still write the authoritative segment
            artifact and MUST treat OTS as a separate channel whose state is
            not yet complete. Any later replacement or upgrade of the OTS proof
            MUST continue to bind to the same authoritative segment artifact
            digest.
            Operator handling and verifier reporting for pending or absent
            proofs are described in <xref target="ops-health"/>,
            <xref target="ops-config"/>, and
            <xref target="ops-fault-results"/>.
          </t>
        </section>

        <section numbered="true" toc="include" anchor="proof-status-vocabulary">
          <name>Proof Status Vocabulary</name>
          <t>
            Verifier results SHOULD use the following status vocabulary for
            timestamp and optional parallel attestation channels:
          </t>
          <ul>
            <li><tt>verified</tt>: proof validation succeeded for the disclosed artifact binding.</li>
            <li><tt>pending</tt>: the channel was selected but its evidence is incomplete, not yet available, or awaiting upgrade; this is not equivalent to invalid.</li>
            <li><tt>missing</tt>: an expected proof or channel artifact is absent without a valid pending producer state.</li>
            <li><tt>failed</tt>: validation was attempted and did not succeed.</li>
            <li><tt>skipped</tt>: validation was not attempted because of disclosure class, verifier configuration, or local policy.</li>
          </ul>
          <t>
            The outcome effects of <tt>missing</tt>, <tt>pending</tt>, and
            <tt>skipped</tt> are defined in
            <xref target="baseline-conformance"/> and
            <xref target="overall-outcome"/>.
          </t>
        </section>
      </section>

      <section numbered="true" toc="include" anchor="parallel-attestation">
        <name>Optional Parallel Attestation</name>
        <t>
          Deployments MAY also produce a deployment-specific peer signature
          quorum over the same authoritative segment artifact digest.
        </t>
        <t>
          This document does not define an interoperable peer-signature
          validation profile. A peer channel result MUST identify the
          collision-resistant deployment-specific validation profile in use,
          for example <tt>com.example.peer-quorum-verification</tt>. A future
          specification can define interoperable peer-signature semantics.
        </t>
        <t>
          When multiple channels are present, verifiers SHOULD validate all
          available channels independently and report per-channel results.
        </t>
        <t>
          Failure of a peer-attestation channel is fatal only when local
          verifier policy makes that channel required. Otherwise, an attempted
          peer-attestation failure prevents <tt>success</tt> but permits
          <tt>partial</tt>.
        </t>
      </section>

      <section numbered="true" toc="include" anchor="verify">
        <name>Verification</name>
        <section numbered="true" toc="include" anchor="verification-inputs-scope">
          <name>Inputs and Scope</name>
        <t>
          Verifiers MUST first decode the authoritative segment artifact and
          determine the applicable <tt>commitment_profile_id</tt> from its
          in-band field. An absent or unsupported value prevents a successful
          verification claim. When the field can be decoded as a text string,
          the verifier result's optional <tt>commitment_profile_id</tt> MUST
          echo its exact artifact value, including when that value is
          unsupported. The producer manifest's <tt>ledger_id</tt>,
          <tt>site_id</tt>, <tt>segment_number</tt>, and
          <tt>commitment_profile_id</tt> MUST exactly match the corresponding
          artifact fields whenever those fields can be decoded.
        </t>
        <t>
          The verifier MUST treat <tt>commitment_profile_id</tt> as the semantic
          key for interpreting the authoritative segment artifact. A structurally
          well-formed authoritative segment artifact and a valid timestamp proof are insufficient
          for semantic verification if the applicable
          <tt>commitment_profile_id</tt> is absent or unsupported. A producer
          manifest mismatch is a verification failure even when the artifact and
          timestamp are otherwise valid.
        </t>
        <t>
          The producer manifest's <tt>disclosure_class</tt> is the producer-claimed
          class. The result's <tt>claimed_disclosure_class</tt> MUST repeat
          that value. The result's <tt>verification_scope</tt> identifies the
          scope actually exercised: <tt>public_recompute</tt> corresponds to
          Class A, <tt>partial_verification</tt> to Class B, and
          <tt>anchor_only</tt> to Class C. A scope is weaker in the order A,
          B, C. If the verifier intentionally exercises a weaker scope than
          the disclosed inputs support, the overall result MUST be
          <tt>failure</tt> with <tt>scope_not_exercised</tt>. If the disclosed
          inputs are genuinely inadequate for the claimed class or asserted
          scope, the result instead uses <tt>insufficient_disclosure</tt>.
          Exercising a stronger scope does not rewrite the producer-claimed
          class.
        </t>
        <t>
          Verifiers MUST determine the applicable verification scope from the
          disclosed artifacts, the claimed disclosure class, and local
          verifier policy. Reported outcomes MUST NOT claim assurances outside
          the scope actually exercised.
        </t>
        <t>
          The result's <tt>manifest_sha256</tt> MUST equal SHA-256 over the
          exact UTF-8 octets of the producer manifest that was validated. The verifier
          MUST NOT reserialize or otherwise normalize the JSON before
          calculating this value. This field identifies the validated input;
          it does not authenticate the verifier result.
        </t>
        <t>
          The verifier MUST always compute SHA-256 over the exact referenced
          bytes of <tt>artifacts.segment_cbor</tt> and compare it with
          <tt>artifacts.segment_cbor.sha256</tt>. That value checks producer
          manifest self-consistency only; it is not external timestamp evidence
          and MUST NOT be counted as a timestamp-channel binding.
        </t>
        <t>
          For every producer manifest artifact reference consumed during verification,
          the verifier MUST compute SHA-256 over the exact referenced file
          bytes and compare it with the reference's <tt>sha256</tt> value. A
          mismatch is a verification failure. A verifier MAY reuse one
          successful file-digest computation for repeated references to the
          same bytes. Duplicate record occurrences nevertheless contribute
          once per listed occurrence to record-level and multiset
          computations.
        </t>
        </section>
        <section numbered="true" toc="include" anchor="verification-procedure">
          <name>Verification Procedure</name>
        <t>
          Verifiers SHOULD apply the following validation steps in fail-fast
          order, subject to the exercised verification scope:
        </t>
        <ol>
          <li>Validate that disclosed artifacts are sufficient for the claimed disclosure class.</li>
          <li>Validate the authoritative segment artifact and the producer manifest, including their repeated identity fields. Always validate <tt>artifacts.segment_cbor.sha256</tt>, and validate the digest of every other producer manifest artifact reference consumed during the remaining steps. Do not count the producer manifest digest as external timestamp evidence.</li>
          <li>For an epoch segment, validate serial zero and the zero predecessor value and set <tt>chain_status</tt> to <tt>epoch</tt>. For a non-epoch segment whose predecessor is disclosed, validate ledger and site identity, contiguous serials, and <tt>prev_segment_sha256</tt>; set <tt>chain_status</tt> to <tt>validated</tt> on success or <tt>failed</tt> on failure. When the predecessor is unavailable, set <tt>chain_status</tt> to <tt>predecessor_not_disclosed</tt>.</li>
          <li>For <tt>public_recompute</tt>, validate each disclosed canonical-record CBOR artifact, hash its exact disclosed octets without re-encoding, validate the batch metadata contract, and recompute <tt>segment_root</tt>. Compare the recomputed result to the authoritative <tt>segment_root</tt>. Do not attempt to reconstruct a record from source telemetry.</li>
          <li>For <tt>partial_verification</tt>, validate the complete batch objects embedded in the authoritative segment artifact as specified in <xref target="batch-metadata-checks"/>. Withheld-material validation beyond those batch objects is deployment-specific and MAY be summarized in the result's <tt>extensions</tt> member.</li>
          <li>For <tt>anchor_only</tt>, do not claim record-level or batch recomputation.</li>
          <li>Separately compare the recomputed authoritative segment artifact digest with every applicable external binding value: an RFC 3161 <tt>messageImprint.hashedMessage</tt>, an OTS sidecar <tt>artifact_sha256</tt>, or deployment-specific peer-attestation binding metadata. A mismatch in any consumed binding is a verification failure. A selected channel that is <tt>pending</tt> can lack an external binding and yields <tt>partial</tt> unless verifier policy requires <tt>failure</tt>. A channel claimed <tt>present</tt> without a usable external binding is a verification failure.</li>
          <li>Validate an <xref target="RFC3161"/> timestamp response when present or required by verifier policy and report its status in the TSA channel result.</li>
          <li>Validate deployment-specific timestamp proofs or peer attestations as configured and report each through its distinct channel result and collision-resistant <tt>validation_profile</tt> value.</li>
        </ol>
        </section>
        <section numbered="true" toc="include" anchor="batch-metadata-checks">
          <name>Batch-Metadata Validation</name>
        <t>
          When batch metadata is within the exercised verification scope,
          verifiers MUST apply the following validations before accepting a result:
        </t>
        <ul>
          <li>each batch <tt>count</tt> equals the length of its <tt>leaf_hashes</tt>;</li>
          <li>each batch repeats the containing <tt>ledger_id</tt>, <tt>site_id</tt>, and <tt>segment_number</tt> exactly;</li>
          <li>batch numbers are unique, contiguous from zero, and ordered numerically;</li>
          <li>concatenating the batch leaf lists in batch-number order produces one globally sorted segment leaf list, and the batches are its consecutive partitions under the committed <tt>batch_record_limit</tt>;</li>
          <li>each batch <tt>merkle_root</tt> equals the Merkle reduction of its <tt>leaf_hashes</tt>;</li>
          <li>the Merkle reduction of the complete concatenated segment leaf list equals the authoritative <tt>segment_root</tt>; for an empty emitted segment, the empty-list root defined in <xref target="merkle-policy"/> applies; and</li>
          <li>the union multiset of batch <tt>leaf_hashes</tt> equals the leaf digest multiset derived from disclosed canonical records when canonical-record artifacts are available.</li>
        </ul>
        </section>
        <section numbered="true" toc="include" anchor="failure-reasons">
          <name>Failure Reasons</name>
        <t>
          A verifier result whose <tt>overall</tt> value is <tt>failure</tt>
          MUST contain one or more machine-usable <tt>failure_reasons</tt>.
          This profile defines the following baseline categories:
        </t>
        <dl newline="true" spacing="normal">
          <dt><tt>unsupported_commitment_profile</tt></dt>
          <dd>The in-band profile identifier is present but unsupported.</dd>
          <dt><tt>commitment_mismatch</tt></dt>
          <dd>Commitment material, including a record digest, batch, Merkle root, artifact digest, or consumed digest binding, does not validate.</dd>
          <dt><tt>segment_chain_mismatch</tt></dt>
          <dd>A disclosed predecessor fails ledger or site identity, serial-continuity, or predecessor-digest validation.</dd>
          <dt><tt>channel_failure</tt></dt>
          <dd>A required timestamp or attestation channel is missing, invalid, or otherwise unacceptable under verifier policy.</dd>
          <dt><tt>insufficient_disclosure</tt></dt>
          <dd>The disclosed artifacts do not support the producer-claimed disclosure class or the asserted verification scope.</dd>
          <dt><tt>scope_not_exercised</tt></dt>
          <dd>The disclosed inputs support the claimed scope, but the verifier intentionally exercised a weaker scope.</dd>
          <dt><tt>verifier_policy_rejection</tt></dt>
          <dd>The inputs do not satisfy an applicable local verifier policy for a reason not more specifically represented above.</dd>
        </dl>
        <t>
          A conforming result MUST use only those baseline categories in
          <tt>failure_reasons</tt>. Deployment-specific detail belongs in the
          result's <tt>extensions</tt> member; this document creates no
          extension namespace for failure-reason values. Failure reasons are
          conclusions, not a trace of internal verifier steps. A category MUST
          NOT occur more than once in one result. Failure reasons MUST be
          absent when <tt>overall</tt> is <tt>success</tt> or <tt>partial</tt>;
          channel status explains a partial outcome.
        </t>
        <t>
          Verifier output states the claimed disclosure class, the
          verification scope actually exercised, any segment-chain conclusion,
          per-channel proof status, failure reasons when applicable, and
          whether the resulting claim is public recompute, partial
          verification, or anchor-only evidence.
        </t>
        </section>
        <section numbered="true" toc="include" anchor="overall-outcome">
          <name>Overall Outcome</name>
        <t>
          Overall outcome is determined after applying the validations
          required by the claimed disclosure class, exercised scope, and
          verifier policy and after determining channel applicability. A
          <tt>chain_status</tt> of <tt>predecessor_not_disclosed</tt> does not
          by itself degrade the outcome; it makes no chain-adjacency claim.
          A <tt>chain_status</tt> of <tt>failed</tt> makes the overall outcome
          <tt>failure</tt>.
        </t>
        <ul>
          <li><tt>success</tt>: RFC 3161 evidence was successfully verified;
          every validation and channel required by the disclosure class,
          exercised verification scope, and verifier policy succeeded; and no
          selected optional channel failed, remains pending, or is missing.
          An additive OTS or peer channel that was not selected or that a
          baseline verifier skipped does not degrade the outcome.</li>
          <li><tt>partial</tt>: the disclosed artifacts satisfy the claimed
          disclosure class and no required validation or channel failed, but no
          timestamp channel has yet been verified because qualifying timestamp
          evidence remains pending and verifier policy permits that condition;
          or at least one selected non-required channel failed, is pending, or
          is missing, and verifier policy permits that condition.</li>
          <li><tt>failure</tt>: a required validation or channel failed or
          could not execute, a consumed artifact or binding digest mismatched,
          a channel claimed <tt>present</tt> lacked a usable external binding,
          every completed timestamp-channel validation failed and no qualifying
          timestamp-channel validation remains pending, or the claimed
          disclosure class was not otherwise satisfied.</li>
        </ul>
        <t>
          When local verifier policy affects validation or channel applicability or
          any validation outcome, the result MUST include
          <tt>verifier_policy_id</tt>. This includes policy inputs to
          RFC 3161 validation, such as trust anchors, accepted TSA policy
          identifiers, revocation policy, algorithm constraints, and
          generation-time constraints. A result MAY include
          <tt>verifier_policy_sha256</tt> only when the corresponding policy
          artifact is available to the verifier or otherwise discoverable. If
          <tt>verifier_policy_sha256</tt> is present,
          <tt>verifier_policy_id</tt> MUST also be present, and the digest MUST
          be SHA-256 over the exact policy-artifact bytes. A bare policy digest
          is not sufficient policy identification.
        </t>
        <t>
          Verifier output MUST NOT be represented as proving more than the
          exercised verification scope. In particular, a successful result does
          not by itself establish dataset completeness, physical truth of
          measurements, or suitability for autonomous actuation or sanctions.
        </t>
        </section>
      </section>
    </section>

    <section numbered="true" toc="include" anchor="disclosure-bundles">
      <name>Disclosure Classes</name>
      <t>
        Verification claims depend on what artifacts are disclosed. This
        profile defines three disclosure classes.
      </t>
      <ul>
        <li><strong>Class A (Public Recompute)</strong>: sufficient material for independent record-level recomputation.</li>
        <li><strong>Class B (Partner Audit)</strong>: controlled disclosure with redacted or partitioned record material.</li>
        <li><strong>Class C (Anchor-Only)</strong>: segment-level commitment and timestamp evidence without record preimages.</li>
      </ul>
      <t>
        The producer claims one disclosure class in the producer manifest. The verifier
        independently reports the scope it actually exercised as specified in
        <xref target="verify"/>. A verifier claim MUST be limited to the
        disclosed artifacts and validation scope actually exercised and MUST NOT be
        represented as proving dataset completeness, physical truth of
        measurements, omitted device lifecycle state, omitted external
        channels, or suitability for autonomous actuation or sanctions.
      </t>
      <t>
        A bundle whose only timestamp evidence uses a deployment-specific
        channel is interoperable only with verifiers that implement the
        identified deployment profile. A verifier that does not support that
        profile MUST NOT report successful timestamp-bearing verification.
      </t>
      <t>
        A producer manifest claiming Class A, B, or C MUST contain at least one
        selected timestamp channel in <tt>anchoring</tt>; a peer channel alone
        is insufficient. A selected channel in <tt>pending</tt> state MAY omit
        its evidence artifact. A <tt>present</tt> TSA channel requires
        <tt>tsa_tsr</tt>; a <tt>present</tt> OTS channel requires
        <tt>segment_ots</tt> and the applicable sidecar binding. Baseline
        conformance additionally requires selection of the TSA channel as
        specified in <xref target="baseline-conformance"/>.
      </t>

      <section numbered="true" toc="include" anchor="class-a">
        <name>Class A (Public Recompute)</name>
      <t>
        Class A is appropriate when public recomputation from disclosed
        canonical records and authoritative segment artifacts is required. A Class A
        bundle MUST include all canonical-record artifacts required to
        recompute the claimed segment root, the authoritative segment artifact including
        its batch objects, the producer manifest, and the selected timestamp-
        channel states required above. For each channel claimed
        <tt>present</tt>, the bundle MUST include its required evidence artifact
        and binding metadata. A peer attestation does not satisfy the timestamp-
        channel selection requirement. The authoritative segment artifact records the
        <tt>commitment_profile_id</tt>.
      </t>
      <t>
        A Class A verifier can perform record-level recomputation,
        batch-metadata validation, segment-root recomputation, authoritative segment artifact digest
        validation, producer manifest artifact-digest validation, and enabled anchor or
        external-evidence validation when the corresponding artifacts are
        disclosed. A successful <tt>public_recompute</tt> result asserts that
        those required validations succeeded. A public-recompute claim is
        invalid if required record artifacts are missing, root recomputation
        was not performed, the in-band profile is absent or unsupported, or a
        required digest validation fails.
      </t>
      </section>

      <section numbered="true" toc="include" anchor="class-b">
        <name>Class B (Partner Audit)</name>
      <t>
        Class B is appropriate for controlled disclosure where some record
        material is withheld while commitment and anchor evidence remain
        auditable. Class B outputs MUST NOT be represented as publicly
        recomputable. A Class B bundle MUST include the authoritative segment
        artifact, the producer manifest, and the selected timestamp-channel
        states required above. For each channel claimed <tt>present</tt>, it
        MUST include the timestamp proof and binding metadata. It MAY include commitments covering
        withheld material, and a policy artifact describing withheld or
        partitioned material.
      </t>
      <t>
        Class B validation includes the complete batch metadata embedded in the
        authoritative segment artifact. The verifier MUST validate that
        metadata, including recomputation of
        <tt>segment_root</tt> from the complete batch leaf list, even when
        record preimages are withheld. Validation can additionally cover
        disclosed withheld-material commitments, auditor-supplied material,
        and timestamp channels present in the bundle. The
        <tt>partial_verification</tt> scope states that public record-level
        recomputation was not performed and that the result is not publicly
        recomputable. Deployment-specific withheld-material conclusions MAY
        be carried in the result's <tt>extensions</tt> member using
        collision-resistant names.
      </t>
      </section>

      <section numbered="true" toc="include" anchor="class-c">
        <name>Class C (Anchor-Only)</name>
      <t>
        Class C provides segment-level commitment and timestamp evidence
        without record preimages. A Class C disclosure MUST be labeled as such
        and MUST NOT claim record-level reproducibility. A Class C bundle MUST
        include the authoritative segment artifact, the producer manifest, and
        the selected timestamp-channel states required above. For each channel
        claimed <tt>present</tt>, it MUST include the timestamp proof artifact
        plus the metadata needed to bind it to the authoritative segment artifact digest. The in-band
        <tt>commitment_profile_id</tt> supplies the profile identity.
      </t>
      <t>
        A verifier exercising <tt>anchor_only</tt> can validate
        authoritative segment artifact digest binding, producer manifest digests, chain or anchor
        existence, and timestamp-channel status when the relevant artifacts
        are present. It MUST report the <tt>anchor_only</tt> scope and MUST NOT
        claim record-level or batch recomputation. For a non-epoch segment
        whose predecessor artifact is not disclosed, it MUST report
        <tt>chain_status</tt> as <tt>predecessor_not_disclosed</tt> rather than
        <tt>validated</tt>.
      </t>
      </section>

      <section numbered="true" toc="include" anchor="disclosure-result-summary">
        <name>Producer Manifest and Verifier Result Summary</name>
      <t>
        The producer manifest MUST include:
      </t>
      <ul>
        <li><tt>ledger_id</tt>, <tt>site_id</tt>, and <tt>segment_number</tt>,</li>
        <li><tt>disclosure_class</tt>,</li>
        <li><tt>commitment_profile_id</tt>,</li>
        <li>artifact path and digest entries,</li>
        <li>claimed per-channel anchor status.</li>
      </ul>
      <t>
        A separate verifier result MUST identify the authoritative segment
        artifact and producer manifest digests, the commitment profile evaluated, the producer-claimed
        disclosure class, the verification scope exercised, segment-chain
        status when a chain conclusion can be made, per-channel validation
        results, verifier-policy identifier when policy affects applicability
        or a validation outcome, overall
        outcome, and failure reasons when the outcome is <tt>failure</tt>. The
        <tt>channels</tt> object MUST be present and non-empty, including when
        the selected timestamp channel is missing, pending, skipped, or
        failed.
      </t>
      </section>
    </section>

    <section numbered="true" toc="include" anchor="versioning">
      <name>Versioning</name>
      <t>
        Document revisions are editorial and do not alter commitment output by
        themselves. Schema <tt>version</tt> fields identify individual object
        shapes; neither a document revision nor a schema version substitutes
        for the <tt>commitment_profile_id</tt> defined in
        <xref target="terminology"/>.
      </t>
      <t>
        The name <tt>canonical-record-v1</tt> identifies the stable version 1
        canonical-record array used as input by this commitment profile. The
        segment-record <tt>version</tt> value <tt>2</tt> identifies its object
        shape; it does not rename the unchanged record-array schema or select
        the commitment rules. A verifier that encounters an unsupported
        <tt>commitment_profile_id</tt> MUST reject the verification claim
        rather than applying fallback semantics.
      </t>
      <t>
        This document defines exactly one <tt>commitment_profile_id</tt>. The
        profile UUID assigned in <xref target="terminology"/> is a randomly
        generated UUIDv4 under <xref target="RFC9562"/> and is bound
        exclusively to the commitment profile specified by this document.
        This document defines no general or private-use namespace for
        additional values. Reusing the UUID for different rules is
        nonconformant and creates ambiguous verifier semantics even though the
        identifier remains bound into the authoritative segment artifact digest. A verifier
        that encounters a conflicting semantic binding for the UUID MUST
        reject the verification claim.
      </t>
      <t>
        A future commitment profile MUST use a distinct UUID defined by a
        separate specification. Existing sealed artifacts retain their
        original identifier and semantics. Changing the UUID in a sealed
        artifact changes its exact bytes and digest and forces corresponding
        predecessor-link changes through the chain of successor artifacts.
        Such artifacts therefore MUST NOT be renamed or reinterpreted in place.
      </t>
      <t>
        A deployment that introduces a future commitment profile SHOULD use a
        backward-compatible rollout that preserves verification support for
        artifacts sealed under this profile. A producer rollback affects only
        subsequently formed artifacts; it MUST NOT relabel or re-encode sealed
        artifacts, reuse segment numbers, or create an unreported predecessor
        discontinuity.
      </t>
    </section>

    <section numbered="true" toc="include" anchor="conformance-vectors">
      <name>Conformance Vectors</name>
      <t>
        The deterministic rules in this profile can be exercised with
        machine-readable conformance vectors. Vector suites SHOULD cover the
        positive and negative cases below.
      </t>
      <t>Positive coverage should include:</t>
      <ul>
        <li>exact canonical-record byte strings with fixed decoded field types and values,</li>
        <li>an epoch segment and a normal successor linked by the predecessor artifact digest,</li>
        <li>an empty emitted interval and an empty suppressed interval,</li>
        <li>a single canonical record,</li>
        <li>odd leaf count,</li>
        <li>power-of-two leaf count,</li>
        <li>duplicate leaf hashes,</li>
        <li>three and four identical record occurrences producing distinct roots,</li>
        <li>a record immediately before and exactly at an elapsed-time boundary,</li>
        <li>device and UTC timestamp changes that do not alter segment membership,</li>
        <li>a closure-policy update that becomes effective only in the next interval,</li>
        <li>restart recovery without serial reuse,</li>
        <li>multi-batch ordering and aggregation,</li>
        <li>a full Class A disclosure example,</li>
        <li>signer-only and full-chain RFC 3161 responses that select the same signer certificate with a SHA-256 <tt>ESSCertIDv2</tt>,</li>
        <li>an RFC 3161 request and response containing the same nonce,</li>
        <li>an RFC 3161 response containing additional unrelated certificates.</li>
      </ul>
      <t>Negative coverage should include:</t>
      <ul>
        <li>missing, negative, non-integer, or overflowing segment numbers and interval values,</li>
        <li>duplicate CBOR map keys, invalid UTF-8, non-shortest encodings, and pure-bytewise rather than length-first map ordering,</li>
        <li>serial reuse, decrease, gap, wrap, and conflicting writers for one ledger and serial,</li>
        <li>a nonzero epoch predecessor and an incorrect non-epoch predecessor artifact digest,</li>
        <li>a predecessor from a different ledger or site,</li>
        <li>assignment based on source arrival, upstream validation or record-construction time, <tt>device_time</tt>, or <tt>ingest_time</tt>,</li>
        <li>placing an exactly-at-deadline acceptance into the expired interval or reopening a sealed segment,</li>
        <li>unsupported empty mode, in-place policy mutation, and an inaccurate close reason,</li>
        <li>duplicate-last reduction, missing leaf or parent domain prefix, or an incorrect recursive split,</li>
        <li>batch identity, number, count, deterministic partition, ordering, root, or leaf-union mismatch,</li>
        <li>a profile mismatch between the producer manifest and authoritative segment artifact, unsafe or racy producer manifest path resolution, and a producer manifest containing verifier conclusions,</li>
        <li>a proof over <tt>segment_root</tt> instead of the authoritative segment artifact digest,</li>
        <li>reporting <tt>chain_status</tt> as <tt>validated</tt> without the required predecessor,</li>
        <li>an RFC 3161 imprint made by hashing the artifact digest a second time,</li>
        <li>a missing token or multiple CMS signers,</li>
        <li>a missing, duplicate, empty, non-SHA-256, or mismatched <tt>SigningCertificateV2</tt> attribute or value,</li>
        <li>a legacy <tt>SigningCertificate</tt> attribute or a mismatched <tt>ESSCertIDv2.issuerSerial</tt>,</li>
        <li>an RFC 3161 request nonce omitted from or unequal to the response nonce,</li>
        <li>zero or multiple embedded certificates matching the RFC 3161 signer, and</li>
        <li>a TSA signer certificate without the required critical timestamping-only extended key usage.</li>
      </ul>
      <t>
        Cross-implementation checks SHOULD verify byte-for-byte parity across
        at least two independent implementations. Interval tests MUST use a
        controllable fake elapsed-time source and restart tests MUST inject
        failures at persistence boundaries; conformance tests SHOULD NOT wait for
        real elapsed time. The canonical-record bytes are test inputs, not
        outputs reconstructed from transport fixtures. Any mismatch in leaf
        digests, artifact bytes, artifact digests, roots, assignments, or
        expected failures is a conformance failure.
      </t>
      <t>
        Vector bundles SHOULD include the
        <tt>commitment_profile_id</tt>.
      </t>
    </section>

    <section numbered="true" toc="include" anchor="operations">
      <name>Operational Considerations</name>
      <t>
        This section consolidates deployment guidance for operators and
        follows the operational topics described in
        <xref target="I-D.ietf-opsawg-rfc5706bis"/>. It does not make
        operator policy part of the cryptographic commitment output, but it
        identifies the state and configuration that determine whether the
        committed evidence remains useful and verifiable.
      </t>
      <t>
        Consistent with <xref target="I-D.ietf-opsawg-rfc5706bis"/>,
        deployments SHOULD expose admission, sealing, timestamp submission,
        proof completion, retention, and verification as distinct operational
        states so that a delayed external channel is not confused with a
        malformed authoritative segment artifact.
      </t>
      <section numbered="true" toc="include" anchor="ops-health">
        <name>Health and Fault Management</name>
        <t>
          Operators SHOULD monitor at least the following signals:
        </t>
        <ul>
          <li>canonical-record handoff, validation, admission, and durable-persistence failures,</li>
          <li>ledger-identity and segment-sequence persistence, writer fencing, and serial-conflict events,</li>
          <li>elapsed-timer health, closure delay, closure reason, and closure-policy revision,</li>
          <li>invalid canonical-record encoding and oversize-input rejection rates,</li>
          <li>authoritative segment artifact write success, digest production, and segment-root calculation,</li>
          <li>anchoring backlog, service reachability, and proof-upgrade lag for deployment-specific timestamp channels,</li>
          <li>status of the <xref target="RFC3161"/> channel for every emitted segment and of additive OTS or peer-signature channels when selected, and</li>
          <li>local storage pressure for retained record artifacts, authoritative segment artifacts, proof artifacts, and producer manifests.</li>
        </ul>
        <t>
          An operator-visible fault state SHOULD distinguish an invalid
          authoritative segment artifact from a delayed or failed external anchoring
          channel. A delayed OTS proof, for example, is not by itself evidence
          that the authoritative segment artifact is malformed.
        </t>
        <t>
          Management integrations SHOULD expose these events in a structured,
          machine-readable form with a stable event code, event time, severity,
          state transition, and, when known, the affected site, ledger, and
          segment number. They SHOULD include correlation data sufficient to
          reconstruct admission, sealing, anchoring, and verification activity
          during troubleshooting or digital-forensics review. Human-readable
          text can supplement, but does not replace, those stable fields.
        </t>
      </section>

      <section numbered="true" toc="include" anchor="ops-config">
        <name>Configuration Management</name>
        <t>
          Deployments SHOULD document the maximum canonical-record byte length,
          admission backpressure and durable-write behavior,
          <tt>closure_policy</tt>, record and size limits, permitted early-close
          triggers, artifact and proof retention periods, OTS calendars,
          optional TSA identities, anchoring policy, verifier strictness for
          optional channels, and any peer-signature quorum threshold and
          identity set. These settings are distinct and MUST NOT be silently
          substituted for one another.
        </t>
        <t>
          An implementation SHOULD expose the effective value of each
          operationally significant setting and whether that value is an
          implementation default or an operator override. Deployment
          documentation SHOULD explain the rationale for defaults and identify
          defaults expected to change as capacity, algorithms, or external
          services evolve.
        </t>
        <t>
          Transport, decryption, anti-replay, source buffering, source identity,
          and source-to-record mapping configuration are upstream of this
          profile. When one implementation contains both upstream and ledger
          functions, operator documentation SHOULD still identify the
          byte-level handoff and distinguish upstream failures from ledger
          admission or commitment failures.
        </t>
        <t>
          When a deployment-specific OTS profile is used, its calendar
          selection, redundancy, trust assumptions, finality criteria, and
          retention policy MUST be documented. Producers SHOULD retain
          disclosed proof artifacts for at least as long as the corresponding
          authoritative segment artifacts remain available for verification.
        </t>
        <t>
          Coordinated configuration changes SHOULD be validated for
          compatibility before activation, applied atomically where the
          deployment permits, and accompanied by a documented rollback plan.
          A rollback MUST follow the interval-transition rules in
          <xref target="segment-formation"/> and MUST NOT mutate sealed
          artifacts, reuse a segment number, or conceal a chain discontinuity.
        </t>
      </section>

      <section numbered="true" toc="include" anchor="ops-performance">
        <name>Performance and Capacity Management</name>
        <t>
          Producers SHOULD expose cumulative counters, high-water marks, and
          time-in-state measurements for admission and rejection, durable-write
          and sealing latency, anchoring backlog, proof-completion latency,
          retained-artifact storage, and verification duration. Counter
          definitions SHOULD state what is included, their reset behavior, and
          how wrap or discontinuity is reported. Reporting time spent in a
          delayed or failed state is generally more useful than a current-state
          snapshot alone.
        </t>
        <t>
          Monitoring interfaces SHOULD support bounded, change-driven
          collection where practical and MUST NOT permit polling or automated
          queries to silently bypass admission, durability, or closure rules.
          Deployments SHOULD test behavior at record, storage, anchoring, and
          verifier capacity limits and document the resulting backpressure,
          rejection, and recovery behavior.
        </t>
      </section>

      <section numbered="true" toc="include" anchor="ops-fault-results">
        <name>Fault-to-Verifier-Result Mapping</name>
        <t>
          Operational faults do not all have the same verifier meaning. Verifier
          output MUST distinguish at least the following cases when the
          condition is visible from disclosed artifacts or local verifier
          policy:
        </t>
        <dl newline="true" spacing="normal">
          <dt>Selected OTS evidence is incomplete, not yet available, or awaiting upgrade</dt>
          <dd>
            Report the OTS channel as <tt>pending</tt>, identify its
            deployment-specific <tt>validation_profile</tt>, and use
            <tt>pending_proof</tt> as the channel reason unless validation was
            attempted and failed.
            The outcome is <tt>partial</tt> when policy permits pending OTS
            evidence and <tt>failure</tt> when policy requires completion.
          </dd>
          <dt><xref target="RFC3161"/> timestamp response is absent</dt>
          <dd>
            If the producer manifest reports <tt>tsa</tt> as
            <tt>pending</tt>, report the TSA channel as <tt>pending</tt> and
            use <tt>pending_proof</tt> unless a more specific human-readable
            diagnostic is needed. The outcome is <tt>partial</tt> unless
            verifier policy requires <tt>failure</tt>. Otherwise report the
            selected TSA channel as <tt>missing</tt>; a channel claimed
            <tt>present</tt> without <tt>tsa_tsr</tt> is a verification
            failure. A baseline result cannot treat the TSA channel as
            unselected or inapplicable.
          </dd>
          <dt>Canonical-record handoff or admission durability is reported as uncertain</dt>
          <dd>
            Report the operational continuity condition and do not claim input
            completeness. Verification of a disclosed sealed segment can still
            succeed when its artifacts are internally consistent, but that
            success does not establish which upstream records should have been
            admitted.
          </dd>
          <dt>Segment sequence or elapsed-time state is lost</dt>
          <dd>
            Report a continuity break and any recovery closure. Do not report
            <tt>chain_status</tt> as <tt>validated</tt> across an unknown
            predecessor or serial conflict; a newly created ledger reports
            <tt>epoch</tt> only after the epoch-segment requirements succeed.
          </dd>
        </dl>
      </section>

      <section numbered="true" toc="include" anchor="ops-verifying">
        <name>Verifying Correct Operation</name>
        <t>
          Operators SHOULD periodically run an independent verifier against a
          recent bundle using the disclosure class expected by consumers.
          Operators SHOULD alert on verification failures, proofs pending
          beyond policy, or admission, timer, serial, fencing, and
          artifact-write faults.
        </t>
        <t>
          Deployments that must preserve verifiability beyond the useful life
          of a timestamp certificate or current algorithms can define a
          separate archival-evidence profile using the timestamp-renewal or
          hash-tree-renewal mechanisms described in <xref target="RFC4998"/>.
          Such renewal evidence is outside the baseline VTL bundle.
        </t>
      </section>
    </section>

    <section numbered="true" toc="include" anchor="security">
      <name>Security Considerations</name>
      <t>
        This profile does not introduce new cryptographic primitives. Its
        security depends on a byte-preserving canonical-record handoff,
        deterministic commitment encoding, trustworthy ledger admission and
        elapsed-time handling, accurate verifier reporting, and disciplined
        artifact and proof handling. The threats below are stated in the
        threat-and-remediation style described by <xref target="RFC3552"/>.
        Unless explicitly stated otherwise, a successful verifier result
        establishes only that the disclosed artifacts are internally
        consistent with this profile and with any validated proof channels.
      </t>

      <section numbered="true" toc="include" anchor="security-object-paths">
        <name>Bundle Paths and Object Authentication</name>
      <t>
        The authoritative segment artifact, producer manifest, and verifier
        result formats contain no
        executable content and define no intrinsic compression, but they
        provide no confidentiality. A producer manifest directs a verifier to open
        bundle-relative paths, creating path-traversal, symbolic-link or
        reparse-point substitution, and check-then-open race risks; verifiers
        MUST apply the containment and race-resistant access rules in
        <xref target="artifacts"/>. A timestamp over the authoritative segment artifact does
        not authenticate the producer manifest or verifier result. The baseline
        does not otherwise authenticate either object. When their
        provenance matters, those objects require separate authentication or
        the relying party must rerun verification from authenticated inputs.
      </t>
      </section>

      <section numbered="true" toc="include" anchor="security-producer-compromise">
        <name>Ledger Producer Compromise and Pre-Commit Omission</name>
      <t>
        An attacker can compromise the ledger producer or its canonical-record
        handoff and then fabricate byte strings, suppress proposed inputs before
        commitment, substitute different bytes, or assign a record to the wrong
        segment. This profile does not by itself detect a malicious producer; it
        makes outputs tamper-evident only after commitment, as described in
        <xref target="introduction"/>. Operational guidance for
        admission persistence, elapsed time, health, and verification procedures is
        consolidated in <xref target="operations"/>.
      </t>
      </section>

      <section numbered="true" toc="include" anchor="security-sequence">
        <name>Segment Sequence Rollback, Fork, and Truncation</name>
      <t>
        An attacker or failed multi-writer deployment can reuse or roll back a
        segment number, emit conflicting artifacts for one ledger and serial,
        substitute a predecessor from another ledger, or disclose only a chain
        prefix or suffix. Fresh ledger identity, single-writer fencing,
        contiguous serials, and full predecessor-artifact digest validation
        detect conflicts when the relevant artifacts are disclosed. They do
        not prove global completeness to an isolated verifier: a producer can
        still withhold undisclosed segments or a chain suffix. Verifier output
        MUST therefore distinguish validated adjacency from a completeness
        claim.
      </t>
      <t>
        Ledger-identifier generation is security sensitive. The random-source
        requirement in <xref target="segment-chaining"/> reduces accidental
        identifier collision but does not replace durable state or writer
        fencing. Operators SHOULD audit random-source initialization and
        failures, record each new-epoch allocation, and alert on any observed
        reuse of a <tt>ledger_id</tt> or conflicting use of a
        <tt>(ledger_id, segment_number)</tt> pair.
      </t>
      </section>

      <section numbered="true" toc="include" anchor="security-upstream">
        <name>Upstream Admission and Semantic Substitution</name>
      <t>
        An attacker can exploit an upstream transport, replay mechanism,
        credential system, decryption path, identifier mapping, or payload
        parser so that incorrect, duplicated, or misattributed record bytes are
        presented at the profile boundary. Those controls are outside this
        document. This profile neither prevents nor detects such an attack once
        the resulting byte string has been admitted. A separate upstream
        specification is needed for claims about source authentication,
        anti-replay, confidentiality, or source-to-record semantics, and a
        successful ledger verification MUST NOT be reported as validation of
        those claims.
      </t>
      </section>

      <section numbered="true" toc="include" anchor="security-profile-confusion">
        <name>Canonicalization, Profile, and Metadata Confusion</name>
      <t>
        An attacker can exploit differences in CBOR validation, re-encoding,
        record occurrence handling, hash composition, or non-authoritative
        metadata handling while implementations still claim the same
        <tt>commitment_profile_id</tt>. An attacker can also present a
        producer manifest or OTS sidecar that does not match the
        authoritative segment artifact in the hope that a
        verifier will treat convenience metadata as authoritative. The
        mitigation is that this profile fixes the canonical-record byte syntax,
        deterministic encoding, and hash rules; requires producers and
        verifiers to hash the exact authoritative record bytes without
        re-encoding; treats the authoritative segment artifact as the
        cryptographic source of truth; requires verifiers to recompute
        commitment material from authoritative segment artifacts; requires the applicable
        <tt>commitment_profile_id</tt> to be disclosed and bound to the same
        authoritative segment artifact digest, and requires non-authoritative metadata and
        sidecars to match the authoritative segment artifact. Any future semantic or
        hash-composition change MUST use a new UUID as its
        <tt>commitment_profile_id</tt>.
      </t>
      </section>

      <section numbered="true" toc="include" anchor="security-proof-substitution">
        <name>Artifact Mutation and Proof Substitution</name>
      <t>
        An attacker can modify a committed authoritative segment artifact after disclosure, or
        can present a valid proof over the wrong artifact digest. The
        mitigation is that verifiers recompute the authoritative segment artifact
        digest independently and compare it with the disclosed binding
        metadata before accepting any proof result. Mutation or substitution
        therefore changes the digest or its binding and causes verification to
        fail.
      </t>
      </section>

      <section numbered="true" toc="include" anchor="security-timestamp-meaning">
        <name>Timestamp Meaning and Attribution</name>
        <t>
          Successful RFC 3161 validation proves that the bytes bound by the
          validated message imprint existed no later than the TSA-asserted
          time, under the configured TSA trust and validation policy. It does
          not prove the ledger producer's identity, the source of the
          telemetry, or attribution of those bytes to a particular producer,
          device, site, or physical event.
        </t>
      </section>

      <section numbered="true" toc="include" anchor="security-channel-downgrade">
        <name>Calendar Withholding and Optional-Channel Downgrade</name>
      <t>
        An attacker can operate or compromise a timestamping or attestation
        service so that proof issuance is delayed, withheld, or selectively
        unavailable, can present pending or placeholder proofs as if they were
        final attestations, or can exploit verifier policy that silently
        ignores a missing required channel. The channel-status vocabulary is
        defined in <xref target="proof-status-vocabulary"/>, and operational
        reporting for missing or pending channels is described in
        <xref target="ops-fault-results"/>.
      </t>
      </section>

      <section numbered="true" toc="include" anchor="security-utc">
        <name>UTC Timestamp Manipulation</name>
      <t>
        An attacker can alter an upstream UTC source so that canonical records
        carry misleading <tt>ingest_time</tt> or <tt>device_time</tt> values.
        Timestamp assignment and source authentication are outside this
        profile, as described in <xref target="canonical-record-input"/>.
        Verification can
        detect byte or artifact inconsistencies, but it cannot reconstruct true
        real-world time from a false admitted value. UTC changes MUST NOT affect
        segment membership or reopen sealed segments.
      </t>
      </section>

      <section numbered="true" toc="include" anchor="security-segment-policy">
        <name>Segment Policy and Elapsed-Time Manipulation</name>
      <t>
        An attacker can lengthen the closure interval, regress or freeze the
        elapsed-time source, alter an active policy, misstate a close reason, or
        race boundary processing in order to delay anchoring or assign a record
        to a different segment. Committing the policy snapshot and close reason
        makes the producer's claim tamper-evident after sealing, while the
        serialized boundary algorithm and operational monitoring reduce
        accidental races. These controls do not independently prove that the
        producer honestly observed real elapsed time. Likewise, an OTS proof
        validated under an identified deployment profile establishes only the
        time claim defined by that profile; it does not prove when the segment
        opened or that every configured deadline was honored.
      </t>
      </section>

      <section numbered="true" toc="include" anchor="security-resource-exhaustion">
        <name>Resource Exhaustion</name>
      <t>
        An attacker can flood a ledger producer with malformed, oversized, or
        excessive-rate canonical-record inputs in order to exhaust admission
        capacity, artifact storage, or verifier computation. Producers need
        deployment-appropriate input-size limits, rate controls, and
        backpressure at the byte-level handoff; relevant operational signals
        and sizing considerations are described in
        <xref target="ops-health"/>. This
        profile does not define a complete denial-of-service defense.
      </t>
      </section>

      <section numbered="true" toc="include" anchor="security-verification-scope">
        <name>Verification Scope, Completeness, and Disclosure</name>
      <t>
        An attacker can rely on a successful verifier result being
        misread as proof of dataset completeness, physical truth of
        measurements, or authorization for autonomous actuation. An attacker
        can also obtain sensitive information if disclosed bundles expose more
        record material than intended for the chosen disclosure class. This
        profile mitigates those risks only partially: verifier output is
        required to state the exercised verification scope, a successful
        result establishes internal consistency and proof binding for the
        disclosed bundle rather than completeness of all observed or emitted
        telemetry, and disclosure classes constrain what is expected to be
        published. Deployments that need stronger completeness, safety, or
        confidentiality guarantees must add external operational controls,
        independent observation, and access-control and retention policies
        that match the sensitivity of the disclosed artifacts.
      </t>
      </section>

      <section numbered="true" toc="include" anchor="security-withheld-guessing">
        <name>Withheld-Record Guessing and Confidentiality</name>
      <t>
        Leaf hashes are unsalted. If withheld telemetry has low entropy or its
        possible record inputs are enumerable, an observer can hash guesses
        offline and compare them with disclosed leaf hashes. Class B and Class
        C therefore provide limited confidentiality for enumerable record
        inputs. A high-entropy, application-layer nonce included in each record
        can make guessing impractical, but nonce generation and protection are
        outside this profile and do not constitute confidentiality supplied by
        VTL.
      </t>
      <t>
        Even when payloads are withheld, producer manifests, authoritative segment artifacts, proof
        sidecars, and operational summaries can disclose source-activity
        metadata such as record counts, outage windows, and anchoring delay.
        Segment serials, interval values, close reasons, and
        the difference between emitted and suppressed empty intervals can add
        cadence and activity information. Deployments SHOULD account for that
        metadata exposure in disclosure and retention policy.
      </t>
      </section>
    </section>

    <section numbered="true" toc="include" anchor="privacy">
      <name>Privacy Considerations</name>
      <t>
        Telemetry payloads can include sensitive operational data. Operators
        should:
      </t>
      <ul>
        <li>minimize personally identifiable data in committed artifacts,</li>
        <li>separate identity metadata from measurement payload when possible,</li>
        <li>apply retention and access controls, and</li>
        <li>publish only data appropriate for the chosen disclosure class.</li>
      </ul>
      <t>
        Privacy-preserving disclosures remain valid, but they MUST NOT be
        described as publicly recomputable unless Class A conditions are met.
      </t>
      <t>
        Withholding record preimages in Class B or Class C does not by itself
        provide confidentiality. Because VTL leaf hashes are unsalted, an
        observer can test enumerable, low-entropy telemetry values by offline
        guessing. Applications can include a high-entropy record nonce to
        reduce that risk, but this is an application-layer mitigation rather
        than confidentiality provided by VTL; see
        <xref target="security-withheld-guessing"/>.
      </t>
      <t>
        Even when <tt>device_id</tt> is pseudonymous, its repeated disclosure
        can link records across segments or external datasets and can enable
        re-identification when combined with <tt>site_id</tt>, timestamps, or
        payload characteristics. Operators SHOULD avoid publishing stable
        identifiers beyond the intended disclosure scope and SHOULD assess
        linkability before releasing Class A material.
      </t>
      <t>
        Disclosure of producer manifests, canonical-record artifacts,
        authoritative segment artifacts, proof sidecars, and operational summaries can reveal
        source-activity patterns, outage windows, configured segment duration,
        empty-interval policy, anchoring cadence, and operational incidents
        even when payload values are withheld. Short intervals and
        <tt>suppress</tt> mode can make activity timing especially visible.
        Operators SHOULD treat these artifacts as metadata-bearing evidence
        and apply disclosure, retention, and access-control policy accordingly.
      </t>
    </section>

    <section numbered="true" toc="include" anchor="iana">
      <name>IANA Considerations</name>
      <t>
        This section follows the guidance in <xref target="RFC8126"/> and
        provides the complete instructions for the Internet Assigned
        Numbers Authority (IANA). This document requests exactly two IANA
        actions: registration of
        <tt>application/vnd.verifiable-telemetry-segment+cbor</tt> and
        <tt>application/vnd.verifiable-telemetry-manifest+json</tt> in the
        vendor tree of the Media Types registry. It requests no other IANA
        action: no CBOR tag, no <tt>commitment_profile_id</tt> registry, and no
        CoAP Content-Format allocation.
      </t>

      <section numbered="true" toc="default" anchor="iana-media-type">
        <name>Vendor-Tree Media Type Registration Templates</name>
        <t>
          IANA is requested to register the following media types in the
          vendor tree of the "Media Types" registry in accordance with
          <xref target="RFC6838"/>:
        </t>
        <t>
          These requests allocate values from an existing registry under the
          Expert Review procedure defined by <xref target="RFC6838"/>. They do
          not require IETF Review or Standards Action and are available to an
          Independent Stream document under <xref target="RFC8726"/>.
        </t>

        <section numbered="true" toc="default" anchor="iana-segment-media-type">
          <name>application/vnd.verifiable-telemetry-segment+cbor</name>
        <t>
          The complete registration template is as follows.
        </t>
        <t>
          Type name: <tt>application</tt>
        </t>
        <t>
          Subtype name: <tt>vnd.verifiable-telemetry-segment+cbor</tt>
        </t>
        <t>
          Required parameters: N/A
        </t>
        <t>
          Optional parameters: N/A
        </t>
        <t>
          Encoding considerations: binary
        </t>
        <t>
          Security considerations: see
          <xref target="security-profile-confusion"/>,
          <xref target="security-proof-substitution"/>,
          <xref target="security-timestamp-meaning"/>,
          <xref target="security-verification-scope"/>, and
          <xref target="security-resource-exhaustion"/>.
        </t>
        <t>
          Interoperability considerations: this media type identifies the
          authoritative segment artifact family defined by
          <xref target="cbor-profile"/>, <xref target="merkle-policy"/>,
          <xref target="segment-formation"/>,
          <xref target="segment-artifact-schema"/>, and
          <xref target="segment-chaining"/>, with the structural CDDL in
          <xref target="appendix-c"/>. A recipient uses the artifact's
          in-band <tt>commitment_profile_id</tt> to select canonical CBOR, hash,
          and Merkle semantics for a verification claim.
        </t>
        <t>
          Published specification: this document, especially
          <xref target="cbor-profile"/>, <xref target="merkle-policy"/>,
          <xref target="segment-formation"/>,
          <xref target="segment-artifact-schema"/>, and
          <xref target="segment-chaining"/>, together with
          <xref target="appendix-c"/>.
        </t>
        <t>
          Applications that use this media type: producers, verifiers,
          disclosure tools, and archival or audit systems that exchange or
          retain authoritative segment artifacts.
        </t>
        <t>
          Fragment identifier considerations: no fragment identifier syntax is
          defined by this document for
          <tt>application/vnd.verifiable-telemetry-segment+cbor</tt>.
          Fragment identifiers, if present, are processed according to the
          <tt>+cbor</tt> structured syntax suffix rules in
          <xref target="RFC8949"/>.
        </t>
        <t>
          Additional information:
        </t>
        <ul>
          <li>Deprecated alias names for this type: N/A</li>
          <li>Magic number(s): N/A</li>
          <li>File extension(s): N/A</li>
          <li>Macintosh file type code(s): N/A</li>
        </ul>
        <t>
          Person &amp; email address to contact for further information:
          Bilal El Khatabi &lt;elkhatabibilal@gmail.com&gt;
        </t>
        <t>
          Intended usage: COMMON
        </t>
        <t>
          Restrictions on usage: N/A
        </t>
        <t>
          Author: Bilal El Khatabi
        </t>
        <t>
          Change controller: Bilal El Khatabi
        </t>
        <t>
          Provisional registration: no
        </t>
        </section>

        <section numbered="true" toc="default" anchor="iana-manifest-media-type">
          <name>application/vnd.verifiable-telemetry-manifest+json</name>
        <t>
          The complete registration template is as follows.
        </t>
        <t>
          Type name: <tt>application</tt>
        </t>
        <t>
          Subtype name: <tt>vnd.verifiable-telemetry-manifest+json</tt>
        </t>
        <t>
          Required parameters: N/A
        </t>
        <t>
          Optional parameters: N/A
        </t>
        <t>
          Encoding considerations: binary
        </t>
        <t>
          Security considerations: see
          <xref target="security-object-paths"/>,
          <xref target="security-profile-confusion"/>,
          <xref target="security-proof-substitution"/>,
          <xref target="security-verification-scope"/>, and
          <xref target="security-resource-exhaustion"/>.
        </t>
        <t>
          Interoperability considerations: this media type identifies the
          producer manifest defined by <xref target="artifacts"/>,
          <xref target="verify"/>, and <xref target="appendix-b"/>. The
          producer manifest is a non-authoritative metadata and digest-binding
          surface. A recipient still needs the referenced authoritative
          segment artifact and MUST compare the producer manifest's
          <tt>commitment_profile_id</tt> with the artifact's in-band
          value to interpret and verify a claim. The JSON representation
          conforms to <xref target="RFC8259"/>.
        </t>
        <t>
          Published specification: this document, especially
          <xref target="artifacts"/>, <xref target="verify"/>, and
          <xref target="appendix-b"/>.
        </t>
        <t>
          Applications that use this media type: producers, verifiers,
          disclosure tools, publication services, and archival or audit
          systems that exchange producer manifests.
        </t>
        <t>
          Fragment identifier considerations: no fragment identifier syntax is
          defined by this document for
          <tt>application/vnd.verifiable-telemetry-manifest+json</tt>.
          Fragment identifiers, if present, are processed according to the
          <tt>+json</tt> structured syntax suffix rules in
          <xref target="RFC6839"/>.
        </t>
        <t>
          Additional information:
        </t>
        <ul>
          <li>Deprecated alias names for this type: N/A</li>
          <li>Magic number(s): N/A</li>
          <li>File extension(s): N/A</li>
          <li>Macintosh file type code(s): N/A</li>
        </ul>
        <t>
          Person &amp; email address to contact for further information:
          Bilal El Khatabi &lt;elkhatabibilal@gmail.com&gt;
        </t>
        <t>
          Intended usage: COMMON
        </t>
        <t>
          Restrictions on usage: N/A
        </t>
        <t>
          Author: Bilal El Khatabi
        </t>
        <t>
          Change controller: Bilal El Khatabi
        </t>
        <t>
          Provisional registration: no
        </t>
        </section>
      </section>

      <section numbered="true" toc="default" anchor="iana-no-cbor-tag">
        <name>No CBOR Tag Allocation</name>
        <t>
          This document requests no new CBOR tag allocation. Commitment bytes
          defined by <xref target="cbor-profile"/> forbid CBOR tags, and the
          authoritative segment artifact defined by
          <xref target="segment-artifact-schema"/> does not require
          additional tag semantics for exchange.
        </t>
      </section>

      <section numbered="true" toc="default" anchor="iana-no-profile-registry">
        <name>No Commitment Profile Registry</name>
        <t>
          This document requests no IANA registry for
          <tt>commitment_profile_id</tt>. The two vendor-tree media-type
          registrations in <xref target="iana-media-type"/> are independent
          registration requests under <xref target="RFC6838"/>. Neither
          registration creates a namespace or subregistry for commitment-profile
          identifiers, and this document requests no new IANA registry. This
          document instead assigns the fixed UUIDv4 defined in
          <xref target="terminology"/> as its sole profile identifier. UUID
          generation under <xref target="RFC9562"/> does not
          require a central allocation registry. <xref target="versioning"/>
          specifies the identifier's binding and collision behavior. Any
          future registry requires a separate specification with an
          appropriate publication stream and registration policy.
        </t>
      </section>

      <section numbered="true" toc="default" anchor="iana-no-coap-content-format">
        <name>No CoAP Content-Format Allocation</name>
        <t>
          This document requests no CoAP Content-Format allocation for either
          media type registered by <xref target="iana-media-type"/>.
        </t>
      </section>
    </section>

    <section numbered="true" toc="include" anchor="interop-notes">
      <name>Future Extension Points</name>
      <t>
        Separate specifications can define upstream admission, exported bundle
        media types, SCITT or COSE publication, peer-signature validation,
        withheld-material disclosure, or alternative commitment profiles.
        Such extensions do not change this document's baseline semantics. A
        change to commitment bytes or calculations requires a distinct UUID as
        its <tt>commitment_profile_id</tt>.
      </t>
    </section>
  </middle>

  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
      <reference anchor="RFC2119" target="https://www.rfc-editor.org/rfc/rfc2119">
        <front>
          <title>Key words for use in RFCs to Indicate Requirement Levels</title>
          <author fullname="Scott Bradner" initials="S." surname="Bradner"/>
          <date year="1997" month="March"/>
        </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="Barry Leiba" initials="B." surname="Leiba"/>
          <date year="2017" month="May"/>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="8174"/>
        <seriesInfo name="DOI" value="10.17487/RFC8174"/>
      </reference>
      <reference anchor="RFC8949" target="https://www.rfc-editor.org/rfc/rfc8949">
        <front>
          <title>Concise Binary Object Representation (CBOR)</title>
          <author fullname="Carsten Bormann" initials="C." surname="Bormann"/>
          <author fullname="Paul Hoffman" initials="P." surname="Hoffman"/>
          <date year="2020" month="December"/>
        </front>
        <seriesInfo name="STD" value="94"/>
        <seriesInfo name="RFC" value="8949"/>
        <seriesInfo name="DOI" value="10.17487/RFC8949"/>
      </reference>
      <reference anchor="RFC9562" target="https://www.rfc-editor.org/info/rfc9562">
        <front>
          <title>Universally Unique IDentifiers (UUIDs)</title>
          <author fullname="K. Davis" initials="K." surname="Davis"/>
          <author fullname="B. Peabody" initials="B." surname="Peabody"/>
          <author fullname="P. Leach" initials="P." surname="Leach"/>
          <date year="2024" month="May"/>
        </front>
        <seriesInfo name="RFC" value="9562"/>
        <seriesInfo name="DOI" value="10.17487/RFC9562"/>
      </reference>
      <reference anchor="RFC6838" target="https://www.rfc-editor.org/rfc/rfc6838">
        <front>
          <title>Media Type Specifications and Registration Procedures</title>
          <author fullname="Ned Freed" initials="N." surname="Freed"/>
          <author fullname="John Klensin" initials="J." surname="Klensin"/>
          <author fullname="Tony Hansen" initials="T." surname="Hansen"/>
          <date year="2013" month="January"/>
        </front>
        <seriesInfo name="BCP" value="13"/>
        <seriesInfo name="RFC" value="6838"/>
        <seriesInfo name="DOI" value="10.17487/RFC6838"/>
      </reference>
      <reference anchor="RFC6839" target="https://www.rfc-editor.org/rfc/rfc6839">
        <front>
          <title>Additional Media Type Structured Syntax Suffixes</title>
          <author fullname="Tony Hansen" initials="T." surname="Hansen"/>
          <author fullname="Alexey Melnikov" initials="A." surname="Melnikov"/>
          <date year="2013" month="January"/>
        </front>
        <seriesInfo name="RFC" value="6839"/>
        <seriesInfo name="DOI" value="10.17487/RFC6839"/>
      </reference>
      <reference anchor="RFC8126" target="https://www.rfc-editor.org/rfc/rfc8126">
        <front>
          <title>Guidelines for Writing an IANA Considerations Section in RFCs</title>
          <author fullname="Michelle Cotton" initials="M." surname="Cotton"/>
          <author fullname="Barry Leiba" initials="B." surname="Leiba"/>
          <author fullname="Thomas Narten" initials="T." surname="Narten"/>
          <date year="2017" month="June"/>
        </front>
        <seriesInfo name="BCP" value="26"/>
        <seriesInfo name="RFC" value="8126"/>
        <seriesInfo name="DOI" value="10.17487/RFC8126"/>
      </reference>
      <reference anchor="RFC8726" target="https://www.rfc-editor.org/rfc/rfc8726">
        <front>
          <title>How Requests for IANA Action Will Be Handled on the Independent Stream</title>
          <author fullname="Adrian Farrel" initials="A." surname="Farrel"/>
          <date year="2020" month="December"/>
        </front>
        <seriesInfo name="RFC" value="8726"/>
        <seriesInfo name="DOI" value="10.17487/RFC8726"/>
      </reference>
      <reference anchor="RFC3161" target="https://www.rfc-editor.org/rfc/rfc3161">
        <front>
          <title>Internet X.509 Public Key Infrastructure Time-Stamp Protocol (TSP)</title>
          <author fullname="C. Adams"/>
          <author fullname="P. Cain"/>
          <author fullname="D. Pinkas"/>
          <author fullname="R. Zuccherato"/>
          <date year="2001" month="August"/>
        </front>
        <seriesInfo name="RFC" value="3161"/>
        <seriesInfo name="DOI" value="10.17487/RFC3161"/>
      </reference>
      <reference anchor="RFC5035" target="https://www.rfc-editor.org/rfc/rfc5035">
        <front>
          <title>Enhanced Security Services (ESS) Update: Adding CertID Algorithm Agility</title>
          <author fullname="Jim Schaad" initials="J." surname="Schaad"/>
          <date year="2007" month="August"/>
        </front>
        <seriesInfo name="RFC" value="5035"/>
        <seriesInfo name="DOI" value="10.17487/RFC5035"/>
      </reference>
      <reference anchor="RFC5280" target="https://www.rfc-editor.org/rfc/rfc5280">
        <front>
          <title>Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile</title>
          <author fullname="David Cooper" initials="D." surname="Cooper"/>
          <author fullname="Stefan Santesson" initials="S." surname="Santesson"/>
          <author fullname="Stephen Farrell" initials="S." surname="Farrell"/>
          <author fullname="Sharon Boeyen" initials="S." surname="Boeyen"/>
          <author fullname="Russell Housley" initials="R." surname="Housley"/>
          <author fullname="Tim Polk" initials="T." surname="Polk"/>
          <date year="2008" month="May"/>
        </front>
        <seriesInfo name="RFC" value="5280"/>
        <seriesInfo name="DOI" value="10.17487/RFC5280"/>
      </reference>
      <reference anchor="RFC5652" target="https://www.rfc-editor.org/rfc/rfc5652">
        <front>
          <title>Cryptographic Message Syntax (CMS)</title>
          <author fullname="Russ Housley" initials="R." surname="Housley"/>
          <date year="2009" month="September"/>
        </front>
        <seriesInfo name="STD" value="70"/>
        <seriesInfo name="RFC" value="5652"/>
        <seriesInfo name="DOI" value="10.17487/RFC5652"/>
      </reference>
      <reference anchor="RFC5816" target="https://www.rfc-editor.org/rfc/rfc5816">
        <front>
          <title>ESSCertIDv2 Update for RFC 3161</title>
          <author fullname="Stefan Santesson" initials="S." surname="Santesson"/>
          <author fullname="Nick Pope" initials="N." surname="Pope"/>
          <date year="2010" month="March"/>
        </front>
        <seriesInfo name="RFC" value="5816"/>
        <seriesInfo name="DOI" value="10.17487/RFC5816"/>
      </reference>
      <reference anchor="RFC8610" target="https://www.rfc-editor.org/rfc/rfc8610">
        <front>
          <title>Concise Data Definition Language (CDDL): A Notational Convention to Express CBOR and JSON Data Structures</title>
          <author fullname="Carsten Bormann" initials="C." surname="Bormann"/>
          <author fullname="Paul Hoffman" initials="P." surname="Hoffman"/>
          <date year="2019" month="June"/>
        </front>
        <seriesInfo name="RFC" value="8610"/>
        <seriesInfo name="DOI" value="10.17487/RFC8610"/>
      </reference>
      <reference anchor="RFC9162" target="https://www.rfc-editor.org/rfc/rfc9162">
        <front>
          <title>Certificate Transparency Version 2.0</title>
          <author fullname="B. Laurie"/>
          <author fullname="E. Messeri"/>
          <author fullname="R. Stradling"/>
          <date year="2021" month="December"/>
        </front>
        <seriesInfo name="RFC" value="9162"/>
        <seriesInfo name="DOI" value="10.17487/RFC9162"/>
      </reference>
      <reference anchor="RFC8259" target="https://www.rfc-editor.org/rfc/rfc8259">
        <front>
          <title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
          <author fullname="Tim Bray" initials="T." surname="Bray"/>
          <date year="2017" month="December"/>
        </front>
        <seriesInfo name="STD" value="90"/>
        <seriesInfo name="RFC" value="8259"/>
        <seriesInfo name="DOI" value="10.17487/RFC8259"/>
      </reference>
      <reference anchor="RFC6234" target="https://www.rfc-editor.org/rfc/rfc6234">
        <front>
          <title>US Secure Hash Algorithms (SHA and SHA-based HMAC and HKDF)</title>
          <author fullname="D. Eastlake 3rd"/>
          <author fullname="Tony Hansen" initials="T." surname="Hansen"/>
          <date year="2011" month="May"/>
        </front>
        <seriesInfo name="RFC" value="6234"/>
        <seriesInfo name="DOI" value="10.17487/RFC6234"/>
      </reference>
      </references>

      <references>
        <name>Informative References</name>
      <reference anchor="I-D.ietf-opsawg-rfc5706bis" target="https://datatracker.ietf.org/doc/draft-ietf-opsawg-rfc5706bis/">
        <front>
          <title>Guidelines for Considering Operations and Management in IETF Specifications</title>
          <author fullname="Benoit Claise" initials="B." surname="Claise"/>
          <author fullname="Joe Clarke" initials="J." surname="Clarke"/>
          <author fullname="Adrian Farrel" initials="A." surname="Farrel"/>
          <author fullname="Samier Barguil" initials="S." surname="Barguil"/>
          <author fullname="Carlos Pignataro" initials="C." surname="Pignataro"/>
          <author fullname="Ran Chen" initials="R." surname="Chen"/>
          <date year="2026" month="August" day="12"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-ietf-opsawg-rfc5706bis-06"/>
      </reference>
      <reference anchor="RFC4998" target="https://www.rfc-editor.org/info/rfc4998">
        <front>
          <title>Evidence Record Syntax (ERS)</title>
          <author fullname="T. Gondrom" initials="T." surname="Gondrom"/>
          <author fullname="R. Brandner" initials="R." surname="Brandner"/>
          <author fullname="U. Pordesch" initials="U." surname="Pordesch"/>
          <date month="August" year="2007"/>
        </front>
        <seriesInfo name="RFC" value="4998"/>
        <seriesInfo name="DOI" value="10.17487/RFC4998"/>
      </reference>
      <reference anchor="RFC3552" target="https://www.rfc-editor.org/rfc/rfc3552">
        <front>
          <title>Guidelines for Writing RFC Text on Security Considerations</title>
          <author fullname="Eric Rescorla" initials="E." surname="Rescorla"/>
          <author fullname="B. Korver"/>
          <date year="2003" month="July"/>
        </front>
        <seriesInfo name="BCP" value="72"/>
        <seriesInfo name="RFC" value="3552"/>
        <seriesInfo name="DOI" value="10.17487/RFC3552"/>
      </reference>
      <reference anchor="RFC8785" target="https://www.rfc-editor.org/rfc/rfc8785">
        <front>
          <title>JSON Canonicalization Scheme (JCS)</title>
          <author fullname="Anders Rundgren" initials="A." surname="Rundgren"/>
          <author fullname="B. Jordan"/>
          <author fullname="S. Erdtman"/>
          <date year="2020" month="June"/>
        </front>
        <seriesInfo name="RFC" value="8785"/>
        <seriesInfo name="DOI" value="10.17487/RFC8785"/>
      </reference>
      <reference anchor="OTS" target="https://opentimestamps.org/">
        <front>
          <title>OpenTimestamps Protocol and Tooling</title>
          <author>
            <organization>OpenTimestamps Project</organization>
          </author>
          <date year="2016"/>
        </front>
      </reference>
      </references>
    </references>


    <section numbered="true" toc="include" anchor="appendix-a">
      <name>Compact Commitment Known-Answer Vector</name>
      <t>
        Wrapped hexadecimal values in this appendix are presentation-only; a
        verifier or implementer should concatenate adjacent lines without
        inserting whitespace.
      </t>
      <t>
        The following compact known-answer vector is normative for the profile
        UUID defined in <xref target="terminology"/>. Hexadecimal values are
        lowercase and unprefixed. It encodes the epoch segment: the outer
        segment and both embedded batches use <tt>segment_number = 0</tt>, and
        <tt>prev_segment_sha256</tt> is 32 zero octets. The segment uses
        <tt>batch_record_limit = 2</tt>.
      </t>
      <t>
        <tt>segment_cbor</tt> is 1047 octets and commits three leaves in two
        batches. <tt>segment_sha256</tt> is the transcription checksum over
        those exact <tt>segment_cbor</tt> octets; it is not a separate
        commitment input.
      </t>
      <sourcecode type="text"><![CDATA[
record_1 =
  87014800000000000000010100f600f6
leaf_1 =
  b83bc27f2d8be3a66373af24e6af3eeffff99ff0696ae18c70e379e853796d26
record_2 =
  87014800000000000000020201f600f6
leaf_2 =
  b5227357cf5d0619914971d8dc5218c5a99260bc5d5e1b60cb1083a911a2acaf
record_3 =
  87014800000000000000030302f600f6
leaf_3 =
  4f82e3e7ee90a111774dd951471a31d4582e0908a0bd5fd63c0080c0231f40cc

sorted_leaves =
  4f82e3e7ee90a111774dd951471a31d4582e0908a0bd5fd63c0080c0231f40cc
  b5227357cf5d0619914971d8dc5218c5a99260bc5d5e1b60cb1083a911a2acaf
  b83bc27f2d8be3a66373af24e6af3eeffff99ff0696ae18c70e379e853796d26
batch_0_root =
  554491e4edf28061622396b83a870db4652211557127c664c6be1c4ad66471ff
batch_1_root =
  b83bc27f2d8be3a66373af24e6af3eeffff99ff0696ae18c70e379e853796d26
segment_root =
  bc6502552ed0c515f58d1c632e54db37594042609b59838eb0d5b3d5842aa054

segment_cbor =
  aa676261746368657382a865636f756e740267736974655f696466616e2d3030
  316776657273696f6e02696c65646765725f6964782062376131643565343063
  366634333865396137356462323763393666333161616b6c6561665f68617368
  6573827840346638326533653765653930613131313737346464393531343731
  6133316434353832653039303861306264356664363363303038306330323331
  6634306363784062353232373335376366356430363139393134393731643864
  6335323138633561393932363062633564356531623630636231303833613931
  316132616361666b6d65726b6c655f726f6f7478403535343439316534656466
  3238303631363232333936623833613837306462343635323231313535373132
  3763363634633662653163346164363634373166666c62617463685f6e756d62
  6572006e7365676d656e745f6e756d62657200a865636f756e74016773697465
  5f696466616e2d3030316776657273696f6e02696c65646765725f6964782062
  376131643565343063366634333865396137356462323763393666333161616b
  6c6561665f686173686573817840623833626332376632643862653361363633
  3733616632346536616633656566666666393966663036393661653138633730
  65333739653835333739366432366b6d65726b6c655f726f6f74784062383362
  6332376632643862653361363633373361663234653661663365656666666639
  396666303639366165313863373065333739653835333739366432366c626174
  63685f6e756d626572016e7365676d656e745f6e756d6265720067736974655f
  696466616e2d3030316776657273696f6e02696c65646765725f696478206237
  6131643565343063366634333865396137356462323763393666333161616c63
  6c6f73655f726561736f6e68696e74657276616c6c7365676d656e745f726f6f
  7478406263363530323535326564306335313566353864316336333265353464
  6233373539343034323630396235393833386562306435623364353834326161
  3035346e636c6f737572655f706f6c696379a66776657273696f6e016a656d70
  74795f6d6f64656873757070726573736b696e74657276616c5f6d731a05265c
  006c7265636f72645f6c696d6974f67073697a655f6c696d69745f6279746573
  f67262617463685f7265636f72645f6c696d6974026e7365676d656e745f6e75
  6d6265720073707265765f7365676d656e745f73686132353678403030303030
  3030303030303030303030303030303030303030303030303030303030303030
  30303030303030303030303030303030303030303030303030303075636f6d6d
  69746d656e745f70726f66696c655f6964782461643461353433612d34393737
  2d343633322d616634642d613064663033303165306366
segment_sha256 =
  0f0397186e667db6d8938a2cc3b5b36e349ae85ae290107a1da3a924fa33240b

three_identical_record_1_root =
  05ddc48e556d67534bf7960a70209696ca9eeb6f18d5595358e7f4804ec87701
four_identical_record_1_root =
  d5d26faa3f54d81d8173700a48d9286179c9d35685d464183a99b1e966f1dfd8
]]></sourcecode>
      <t>
        A published machine-readable vector set can carry exact canonical
        bytes, digests, expected roots, and the applicable
        <tt>commitment_profile_id</tt>. The exact known-answer vectors in this
        appendix are normative.
      </t>
    </section>

    <section numbered="true" toc="include" anchor="appendix-b">
      <name>Producer Manifest and Verifier Result CDDL</name>
      <t>
        This appendix defines the Concise Data Definition Language
        (CDDL) (<xref target="RFC8610"/>) shape for the producer manifest and
        the separate verifier result. It captures the
        verification surface described here and
        provides explicit containers for deployment-specific additions.
        Producer manifests and verifier results MUST be UTF-8 JSON texts under
        <xref target="RFC8259"/>. Parsers MUST reject duplicate object member
        names; generators MUST NOT emit them.
      </t>
      <t>
        The producer manifest and verifier result both use version 2 in this
        profile. The producer manifest version is not independently negotiated.
      </t>
      <t>
        Baseline failure reasons are defined in
        <xref target="failure-reasons"/>. Channel validation-profile names
        MUST be collision resistant.
      </t>
      <t>
        The verifier result's <tt>commitment_profile_id</tt> is optional because
        a malformed authoritative segment artifact might not be decodable far
        enough to recover it. When the artifact field is decodable as a text
        string, the result MUST include and exactly echo that value. It is a
        generic <tt>tstr</tt> so that a result can report
        <tt>unsupported_commitment_profile</tt> without replacing the
        unsupported artifact value with this document's UUID.
      </t>
      <t>
        <tt>chain_status</tt> MUST be present whenever the authoritative
        segment artifact can be decoded far enough to make one of the chain
        conclusions defined here. It MUST be absent otherwise, and absence
        makes no chain claim. Its value is <tt>epoch</tt> only after the epoch
        segment's serial and zero predecessor have been validated; <tt>validated</tt>
        only after a disclosed non-epoch predecessor and its linkage have
        been validated; <tt>predecessor_not_disclosed</tt> when that artifact
        is unavailable; and <tt>failed</tt> when an attempted chain validation
        fails. <tt>failure_reasons</tt> MUST be present and non-empty exactly
        when <tt>overall</tt> is <tt>failure</tt>. An OTS or peer channel result
        MUST include the collision-resistant <tt>validation_profile</tt> used;
        the baseline TSA channel MUST omit it because its validation profile is
        defined by <xref target="rfc3161-profile"/>.
      </t>
      <t>
        The <tt>relative-path</tt> rule below is intentionally structural. RFC
        8610 regular expressions use the XML Schema dialect and cannot
        portably express all cross-platform path and filesystem-containment
        checks. Implementations MUST apply the semantic path rules in
        <xref target="portable-artifact-references"/> to every consumed path-
        bearing object, including deployment-specific sidecars and extensions.
        Those rules include backslash, drive-prefix, UNC, colon, control-
        character, dot-component, symbolic-link, reparse-point, containment,
        and race-resistant-open checks.
      </t>
      <t>
        <tt>segment_cbor</tt> is universally required. A Class A producer manifest MUST
        contain <tt>records</tt>. JSON projections, standalone digest files,
        TSA-info projections, and operational summaries are not baseline
        producer manifest fields.
      </t>
      <t>
        For a producer manifest claiming Class A, B, or C, <tt>anchoring</tt> MUST
        contain <tt>tsa</tt> or <tt>ots</tt> to identify a selected timestamp
        channel. <tt>peer</tt> alone is insufficient. The <tt>ots</tt> member
        denotes a deployment-specific profile as described in
        <xref target="ots-profile"/>; its presence does not define baseline
        OTS proof-format interoperability. A baseline producer manifest MUST
        contain <tt>tsa</tt> for every emitted segment.
      </t>
      <t>
        A channel in <tt>pending</tt> state MAY lack its evidence artifact. For
        <tt>present</tt>, <tt>tsa</tt> requires <tt>tsa_tsr</tt>, <tt>ots</tt>
        requires <tt>segment_ots</tt> and, when the deployment profile uses a
        sidecar, the applicable <tt>segment_ots_meta</tt> binding; and
        <tt>peer</tt> requires
        <tt>peer_attest</tt> and its applicable binding metadata.
      </t>
      <t>
        The fixed <tt>channels</tt> keys are <tt>tsa</tt>, <tt>ots</tt>, and
        <tt>peer</tt>. Any extension channel key MUST be a collision-resistant
        name and MUST NOT equal a fixed key. The <tt>channels</tt> map MUST be
        non-empty. A channel <tt>reason</tt> is human-readable diagnostic text,
        except where this document explicitly specifies a token such as
        <tt>pending_proof</tt>.
      </t>
      <t>
        <tt>segment_number</tt> is a JSON string containing the shortest
        unsigned base-10 representation of a uint64: <tt>0</tt>, or a digit
        from <tt>1</tt> through <tt>9</tt> followed by zero or more digits. Its
        numeric value MUST NOT exceed 18446744073709551615. This avoids loss
        of precision in JSON implementations whose exact integer range ends at
        2^53-1. The lexical rules for <tt>relative-path</tt>,
        <tt>uint64-decimal</tt>, <tt>hex32</tt>, <tt>hex64</tt>, and
        collision-resistant extension names are normative prose constraints
        in addition to the structural CDDL. <tt>hex32</tt> is exactly 32
        lowercase hexadecimal characters, and <tt>hex64</tt> is exactly 64
        lowercase hexadecimal characters.
      </t>
      <sourcecode type="cddl"><![CDATA[
vtl-commitment-profile-id =
  "ad4a543a-4977-4632-af4d-a0df0301e0cf"

producer-manifest-v2 = {
  "version": 2,
  "ledger_id": hex32,
  "site_id": tstr,
  "segment_number": uint64-decimal,
  "commitment_profile_id": vtl-commitment-profile-id,
  "disclosure_class": disclosure-class,
  "artifacts": artifacts,
  "anchoring": anchoring,
  ? "extensions": { * tstr => json-data },
}

artifacts = {
  "segment_cbor": artifact-ref,
  ? "predecessor_segment_cbor": artifact-ref,
  ? "records": [* artifact-ref],
  ? "segment_ots": artifact-ref,
  ? "segment_ots_meta": artifact-ref,
  ? "peer_attest": artifact-ref,
  ? "tsa_tsr": artifact-ref,
  ? "extensions": { * tstr => artifact-ref }
}

artifact-ref = {
  "path": relative-path,
  "sha256": hex64
}

anchoring = {
  ? "tsa": producer-channel-state,
  ? "ots": producer-channel-state,
  ? "peer": producer-channel-state
}

producer-channel-state = {
  "status": "present" / "pending"
}

verifier-result-v2 = {
  "version": 2,
  "artifact_sha256": hex64,
  "manifest_sha256": hex64,
  ? "commitment_profile_id": tstr,
  "claimed_disclosure_class": disclosure-class,
  "verification_scope":
    "public_recompute" / "partial_verification" / "anchor_only",
  ? "chain_status": chain-status,
  "channels": channels,
  ? "verifier_policy_id": tstr,
  ? "verifier_policy_sha256": hex64,
  "overall": "success" / "partial" / "failure",
  ? "failure_reasons": [+ baseline-failure-reason],
  ? "extensions": { * tstr => json-data }
}

chain-status =
  "epoch" /
  "validated" /
  "predecessor_not_disclosed" /
  "failed"

baseline-failure-reason =
  "unsupported_commitment_profile" /
  "commitment_mismatch" /
  "segment_chain_mismatch" /
  "channel_failure" /
  "insufficient_disclosure" /
  "scope_not_exercised" /
  "verifier_policy_rejection"

channels = {
  ? "tsa": verifier-channel-result,
  ? "ots": verifier-channel-result,
  ? "peer": verifier-channel-result,
  * extension-channel-name => verifier-channel-result
}

extension-channel-name = tstr

verifier-channel-result = {
  "status":
    "verified" / "pending" / "missing" /
    "failed" / "skipped",
  ? "validation_profile": tstr,
  ? "reason": tstr,
  ? "extensions": { * tstr => json-data }
}

disclosure-class = "A" / "B" / "C"
relative-path = tstr
uint64-decimal = tstr
hex32 = (tstr .regexp "[0-9a-f]{32}") .size 32
hex64 = (tstr .regexp "[0-9a-f]{64}") .size 64
json-data =
  nil / bool / int / float / tstr /
  [* json-data] / { * tstr => json-data }
]]></sourcecode>
    </section>

    <section numbered="true" toc="include" anchor="appendix-c">
      <name>Authoritative Segment Artifact CDDL</name>
      <t>
        This appendix gives the structural CDDL for v2 segment and embedded
        batch artifacts. The lexical and cross-field requirements in
        <xref target="segment-artifact-schema"/>, the formation rules in
        <xref target="segment-formation"/>, and the chain rules in
        <xref target="segment-chaining"/> are normative in addition to this
        structural shape.
      </t>
      <t>
        The <tt>tstr</tt> shape for <tt>commitment_profile_id</tt> does not
        relax its exact-value requirement: the field MUST equal the profile
        UUID defined in <xref target="terminology"/>.
      </t>
      <sourcecode type="cddl"><![CDATA[
segment-record-v2 = {
  "version": 2,
  "commitment_profile_id": tstr,
  "ledger_id": hex32,
  "site_id": tstr,
  "segment_number": uint64,
  "closure_policy": segment-closure-policy-v1,
  "close_reason": close-reason,
  "prev_segment_sha256": hex64,
  "batches": [* segment-batch-v2],
  "segment_root": hex64
}

segment-batch-v2 = {
  "version": 2,
  "ledger_id": hex32,
  "site_id": tstr,
  "segment_number": uint64,
  "batch_number": uint64,
  "merkle_root": hex64,
  "count": positive-uint64,
  "leaf_hashes": [+ hex64]
}

segment-closure-policy-v1 = {
  "version": 1,
  "interval_ms": positive-uint64,
  "batch_record_limit": positive-uint64,
  "record_limit": positive-uint64 / nil,
  "size_limit_bytes": positive-uint64 / nil,
  "empty_mode": "emit" / "suppress"
}

close-reason =
  "interval" /
  "reconfigure" /
  "record_limit" /
  "size_limit" /
  "shutdown" /
  "recovery" /
  "manual"

uint64 = 0..18446744073709551615
positive-uint64 = 1..18446744073709551615
hex32 = tstr
hex64 = tstr
]]></sourcecode>
    </section>

    <section numbered="false" toc="include" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>
        The author thanks the OpenTimestamps project for the public calendar
        infrastructure used during validation.
      </t>
      <t>
        The author thanks Joe Clarke for OPSDIR review feedback that improved
        the operational considerations and deployment guidance.
      </t>
    </section>
  </back>
</rfc>
