<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.39 (Ruby 3.3.11) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

]>


<rfc ipr="trust200902" docName="draft-melegassi-dispatch-mvps-snap-backup-01" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="SNAP">SNAP: Simple Native Archive Protocol</title>

    <author fullname="Rodrigo Yoshioka">
      <organization>e.Mix</organization>
      <address>
        <postal>
          <country>BR</country>
        </postal>
        <email>royoshioka@gmail.com</email>
      </address>
    </author>
    <author fullname="Guilherme Labadessa">
      <organization>OrcaTI</organization>
      <address>
        <postal>
          <country>BR</country>
        </postal>
        <email>guilabadessa@gmail.com</email>
      </address>
    </author>
    <author fullname="Pedro Scalon">
      <organization>Sysbrasil Tecnologia</organization>
      <address>
        <postal>
          <country>BR</country>
        </postal>
        <email>pedroscalon01@gmail.com</email>
      </address>
    </author>
    <author fullname="Diego Canton de Brito">
      <organization>Vero Internet</organization>
      <address>
        <postal>
          <country>BR</country>
        </postal>
        <email>diegocdeb@hotmail.com</email>
      </address>
    </author>
    <author fullname="Eduardo Belotto">
      <organization>Zadara</organization>
      <address>
        <postal>
          <country>BR</country>
        </postal>
        <email>ebelotto@gmail.com</email>
      </address>
    </author>

    <date year="2026" month="May" day="26"/>

    <area>OPS</area>
    <workgroup>DISPATCH Working Group</workgroup>
    <keyword>backup</keyword> <keyword>YANG</keyword> <keyword>JSON</keyword> <keyword>archive</keyword> <keyword>integrity</keyword> <keyword>canonical</keyword>

    <abstract>


<?line 155?>

<t>SNAP (Simple Native Archive Protocol) defines a minimal, self-describing
backup object encoded as a single JSON document, modeled in YANG
<xref target="RFC7950"/> and encoded per <xref target="RFC7951"/>.  A SNAP object contains a
manifest of files with per-file cryptographic hashes, integrity-verified
metadata, and a compressed binary payload -- all within one atomic,
transport-agnostic JSON document.  Any agent capable of parsing JSON
and applying standard decompression can produce or restore a SNAP
backup without proprietary tooling, side-channel metadata, or
multi-phase handshakes.</t>

<t>This document defines the YANG module "snap", its JSON encoding,
integrity verification procedure, bindings to common transports,
and its role as the atomic transport substrate for the Multi-Vantage
Path State (MVPS) family of Internet-Drafts.  When a SNAP Object
carries an MVPS Bundle <xref target="I-D.melegassi-ippm-mvps-bundle"/>, the
canonical-form determinism of SNAP (Theorem 1 of this document)
composes with the MVPS Architecture axioms A1..A5
<xref target="I-D.melegassi-iab-mvps-architecture"/> to inherit the full coherence
algebra of <xref target="MVPS-v4"/> (Theorems 1, 2, 3, 3', 4, 5, 9 and
Stein's Lemma <xref target="Stein52"/> <xref target="CoverThomas2006"/>) without alteration.</t>



    </abstract>

    <note title="About This Document" removeInRFC="true">
      <t>
        The latest revision of this draft can be found at <eref target="https://melegassi-labadessa.github.io/snap-backup/draft-melegassi-dispatch-mvps-snap-backup.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-melegassi-dispatch-mvps-snap-backup/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        DISPATCH Working Group mailing list (<eref target="mailto:dispatch@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/dispatch/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/dispatch/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/melegassi-labadessa/snap-backup"/>.</t>
    </note>


  </front>

  <middle>


<?line 178?>

<section anchor="introduction"><name>Introduction</name>

<t>Existing backup solutions tightly couple data capture, transport, and
restoration into proprietary stacks.  A system administrator wishing
to back up configuration files today must choose between raw archives
(POSIX tar, IEEE Std 1003.1), complex multi-phase protocols (rsync, BorgBackup), or
vendor-specific agents.  None of these produce a self-describing,
cryptographically verifiable, machine-readable artifact that can be
inspected, transported, and restored by any standards-compliant agent
without prior knowledge of the producing system.</t>

<t>SNAP addresses this gap by defining:</t>

<t><list style="numbers" type="1">
  <t>A data model for backup objects expressed in YANG 1.1 <xref target="RFC7950"/>,
enabling schema validation by any YANG-capable tool.</t>
  <t>A canonical JSON encoding following <xref target="RFC7951"/>, with deterministic
serialization per the JSON Canonicalization Scheme <xref target="RFC8785"/> to
support reproducible integrity hashes.</t>
  <t>An integrity model based on SHA-256 <xref target="FIPS180-4"/> applied to both
individual files (in the manifest) and the envelope object (via JCS).</t>
  <t>A transport binding over HTTP/2 <xref target="RFC9110"/> and WebSocket <xref target="RFC6455"/>,
with a size-aware atomicity requirement for small objects.</t>
</list></t>

<t>The design philosophy of SNAP is conservative composition: every
primitive is drawn from existing IETF or NIST standards.  SNAP defines
only the composition and the backup-specific YANG module.</t>

<section anchor="relationship-to-existing-standards"><name>Relationship to Existing Standards</name>

<t>RFC 9195 <xref target="RFC9195"/> defines the YANG Instance Data File Format, which
provides a container for YANG-modeled data at rest.  RFC 9195 is
concerned with YANG schema instances (configuration and state data from
YANG-modeled systems), not with arbitrary file collections.  SNAP
extends the spirit of RFC 9195 to the general file backup domain.</t>

<t>The YANG provenance mechanism <xref target="I-D.lopez-opsawg-yang-provenance"/>
applies COSE signatures to YANG instance data.  SNAP uses JCS-based
SHA-256 rather than COSE because the backup payload is a binary blob
rather than a YANG instance tree.</t>

<t>YANG Packages <xref target="I-D.ietf-netmod-yang-packages"/> define offline
distribution of YANG schemas.  SNAP is complementary: it backs up
the operational data, not the schema.</t>

</section>
<section anchor="mvps-relationship"><name>Relationship to the MVPS Family</name>

<t>SNAP is designed to compose with the Multi-Vantage Path State (MVPS)
family of Internet-Drafts as their atomic transport substrate.  This
subsection summarizes the dependency.</t>

<t>The MVPS family consists of nine related drafts (D-1 through D-7,
D-15, D-16) whose mathematical authority is the v4.0 proof catalogue
<xref target="MVPS-v4"/>, validated against 37 adversarial attacks across seven
audit rounds (44/44 PASS).  The catalogue defines:</t>

<t><list style="symbols">
  <t>A bundle algebra (D1, D3, F1-F4, I1) over coherence axes
(C_1 causal, C_2 informational, C_3 topological) and a bounded
scalar H : R^3 -&gt; [0, H_max] with H_max = -3 log epsilon (Theorem 1).</t>
  <t>Detection statistics (Theorems 2, 3, 3') using the Mahalanobis
statistic D^2 on the coherence vector C(t).</t>
  <t>A Byzantine breakdown bound (Theorem 9) of (2f / (N - 2f)) * sqrt(2)
on geometric-median centroids for N vantages with f adversaries.</t>
  <t>Architectural axioms MVPS-A1..A5 <xref target="I-D.melegassi-iab-mvps-architecture"/>
and the Invariance Theorem: any architecture satisfying A1..A5
inherits Theorems 1, 2, 3, 3', 4, 5, 9 and Stein's Lemma
<xref target="Stein52"/> <xref target="CoverThomas2006"/> verbatim.</t>
  <t>A Planetary Coherence Floor <xref target="I-D.melegassi-iab-mvps-planetary-floor"/>
giving R* = max{tau_causal, tau_sampling, tau_information,
tau_consensus, tau_coupling} as the lower bound for planet-scale
detect-and-react.</t>
</list></t>

<t>The MVPS Bundle <xref target="I-D.melegassi-ippm-mvps-bundle"/> is the canonical
RFC 7951 envelope that carries a coordinated multi-vantage observation.
A reference bundle contains a bundle_id (UUID v4 lowercase), a
schema_version, a destination, a coordination_window, and an ordered
array of per-vantage snapshots -- all serialized canonically per
<xref target="RFC8785"/>.</t>

<t>Because the SNAP envelope shares the <em>same</em> canonicalization stack
as the MVPS Bundle (RFC 7951 JSON encoding, JCS canonicalization,
SHA-256 pinning, UUID v4 identifiers), an MVPS Bundle can be carried
verbatim inside the SNAP payload field with no loss of structural
or cryptographic guarantees.  Section 8.2 (Appendix D) of this
document proves the composition theorem and lists the operational
contracts (OC1..OC8) of <xref target="MVPS-v4"/> that <bcp14>MUST</bcp14> be preserved by SNAP
encoders carrying MVPS data.</t>

</section>
<section anchor="requirements-language"><name>Requirements Language</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>

<?line -18?>

</section>
</section>
<section anchor="terminology"><name>Terminology</name>

<t>The following terms are used in this document:</t>

<dl>
  <dt>SNAP Object:</dt>
  <dd>
    <t>A single JSON document conforming to the "snap" YANG module defined
in <xref target="yang-module"/>.  Also referred to as "backup object".</t>
  </dd>
  <dt>Manifest:</dt>
  <dd>
    <t>The ordered list of file entries within a SNAP Object.  Each entry
records the file path, size, modification time, and SHA-256 digest.</t>
  </dd>
  <dt>Payload:</dt>
  <dd>
    <t>The binary content of the backup: a compressed archive of all files
listed in the Manifest, encoded in Base64 <xref target="RFC4648"/>.</t>
  </dd>
  <dt>Encoder:</dt>
  <dd>
    <t>A process or system that produces a SNAP Object from a set of files.</t>
  </dd>
  <dt>Decoder:</dt>
  <dd>
    <t>A process or system that restores files from a SNAP Object.</t>
  </dd>
  <dt>JCS:</dt>
  <dd>
    <t>JSON Canonicalization Scheme <xref target="RFC8785"/>, used to produce a
deterministic byte sequence over which the envelope hash is computed.</t>
  </dd>
</dl>

</section>
<section anchor="format"><name>SNAP Object Format</name>

<t>A SNAP Object is a JSON object <xref target="RFC8259"/> whose structure is fully
specified by the YANG module in <xref target="yang-module"/> and encoded per
<xref target="RFC7951"/>.</t>

<section anchor="top-level-structure"><name>Top-Level Structure</name>

<t>The following is a non-normative illustration of a SNAP Object:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "snap:backup": {
    "version": "1.0",
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "created": "2026-05-26T08:00:00Z",
    "src": {
      "host": "node-01.example.com",
      "path": "/etc/configs"
    },
    "meta": {
      "files": 12,
      "size-bytes": 4096,
      "enc": "br",
      "hash": "sha256:e3b0c44298fc1c149afbf4c8996fb92427a..."
    },
    "manifest": [
      {
        "file": "app.conf",
        "sha256": "abc123def456...",
        "size": 512,
        "mtime": "2026-05-26T07:00:00Z"
      }
    ],
    "payload": "H4sIAAAAAAAAA..."
  }
}
]]></sourcecode></figure>

</section>
<section anchor="field-definitions"><name>Field Definitions</name>

<dl>
  <dt>version:</dt>
  <dd>
    <t><bcp14>MUST</bcp14> be the string "1.0" for documents conforming to this
specification.  Future versions will use a new value.</t>
  </dd>
  <dt>id:</dt>
  <dd>
    <t>A UUID <xref target="RFC4122"/> in its canonical textual representation.
Encoders <bcp14>MUST</bcp14> generate version 4 (random) UUIDs.  IDs <bcp14>MUST</bcp14> be
unique across all SNAP Objects produced by an Encoder.</t>
  </dd>
  <dt>created:</dt>
  <dd>
    <t>The timestamp at which encoding began, as a <xref target="RFC6991"/> date-and-time
value (ISO 8601 format, UTC).</t>
  </dd>
  <dt>src:</dt>
  <dd>
    <t>A container identifying the origin of the backup.  The "host" leaf
is a fully qualified domain name or IP address of the source system.
The "path" leaf is an absolute path on the source system.</t>
  </dd>
  <dt>meta:</dt>
  <dd>
    <t>Metadata about the encoded content.  "files" is the count of entries
in the manifest.  "size-bytes" is the sum of sizes of all source
files.  "enc" identifies the compression algorithm applied to the
payload (see <xref target="compression"/>).  "hash" is the envelope integrity
hash (see <xref target="envelope-integrity"/>).</t>
  </dd>
  <dt>manifest:</dt>
  <dd>
    <t>An ordered list of file entries.  Each entry <bcp14>MUST</bcp14> correspond to a
file present in the payload.  The "file" field is a relative path
from "src/path".  The "sha256" field is the lowercase hex-encoded
SHA-256 digest of the uncompressed file content <xref target="FIPS180-4"/>.
The "size" field is the exact byte count of the uncompressed file.
The "mtime" field is the last-modification timestamp.</t>
  </dd>
  <dt>payload:</dt>
  <dd>
    <t>The Base64-encoded <xref target="RFC4648"/> compressed archive of all files
listed in the manifest.  The archive format is a POSIX-compliant
tar stream.  The compression algorithm is identified by "meta/enc".</t>
  </dd>
</dl>

</section>
<section anchor="compression"><name>Compression</name>

<t>The "meta/enc" leaf identifies the compression applied to the tar
stream before Base64 encoding.  The following values are defined:</t>

<texttable>
      <ttcol align='left'>Value</ttcol>
      <ttcol align='left'>Specification</ttcol>
      <ttcol align='left'>Recommended</ttcol>
      <c>none</c>
      <c>No compression</c>
      <c>No</c>
      <c>gz</c>
      <c>Gzip <xref target="RFC1952"/></c>
      <c>No</c>
      <c>br</c>
      <c>Brotli <xref target="RFC7932"/></c>
      <c>YES</c>
      <c>zstd</c>
      <c>Zstandard <xref target="RFC8878"/></c>
      <c>No</c>
</texttable>

<t>Encoders <bcp14>SHOULD</bcp14> use "br" (Brotli) as the default compression because
Brotli consistently achieves compression ratios closest to the Shannon
entropy bound <xref target="Shannon48"/> for structured text data (configuration
files, YANG instance data, scripts) while being an IETF-standardized
algorithm.</t>

<t>Decoders <bcp14>MUST</bcp14> support all four values.</t>

</section>
<section anchor="envelope-integrity"><name>Envelope Integrity</name>

<t>The "meta/hash" field contains the envelope integrity hash in the
format "sha256:&lt;hex&gt;", where &lt;hex&gt; is the lowercase hexadecimal
encoding of a SHA-256 digest <xref target="FIPS180-4"/>.</t>

<t>The digest is computed over the canonical JSON serialization of the
SNAP Object with the "meta/hash" field set to the empty string "".
Canonical serialization follows the JSON Canonicalization Scheme
<xref target="RFC8785"/>.</t>

<t>Formally, let O be the SNAP Object and O' be the object derived by
setting O["snap:backup"]["meta"]["hash"] to "".  Then:</t>

<figure><artwork><![CDATA[
meta/hash = "sha256:" + lowercase_hex(SHA-256(JCS(O')))
]]></artwork></figure>

<t>Decoders <bcp14>MUST</bcp14> verify the envelope hash before restoring any file.
Decoders <bcp14>MUST</bcp14> also verify each per-file "sha256" digest against the
content extracted from the payload.  A Decoder <bcp14>MUST NOT</bcp14> restore any
file from a SNAP Object that fails either verification.</t>

</section>
<section anchor="canonical"><name>Canonical Form (Theorem of Determinism)</name>

<t>A central property of SNAP is that any two conforming Encoders, given
the same input files and metadata, <bcp14>MUST</bcp14> produce SNAP Objects with the
same envelope hash.  This subsection states the theorem and the
implementation rules that guarantee it.</t>

<t><strong>Theorem 1 (Encoder Determinism).</strong>
Let E1 and E2 be two conforming SNAP Encoders.  Let F be a set of
files with identical content, paths, sizes, and modification times.
Let M = (id, created, host, path, enc) be identical metadata inputs.
Then:</t>

<figure><artwork><![CDATA[
E1(F, M).meta.hash == E2(F, M).meta.hash
]]></artwork></figure>

<t>provided that "enc" specifies a deterministic compression algorithm
(Section 6.1).</t>

<t>The proof rests on three lemmas:</t>

<dl>
  <dt>Lemma 1 (Tar determinism):</dt>
  <dd>
    <t>Given identical file contents and metadata, a SNAP-conforming tar
archive <bcp14>MUST</bcp14> use the USTAR format (POSIX 1003.1-1988) with files
listed in lexicographic order of relative path, with all extended
attributes and ownership fields zeroed.  Two such archives are
byte-identical.</t>
  </dd>
  <dt>Lemma 2 (Compression determinism):</dt>
  <dd>
    <t>The codecs "br" (Brotli quality 11) and "gz" (gzip level 9, no
filename, no timestamp) are deterministic functions of their input.
Zstandard ("zstd") <bcp14>MUST</bcp14> use level 19 with no checksum frame for
determinism.</t>
  </dd>
  <dt>Lemma 3 (JCS uniqueness, <xref target="RFC8785"/>):</dt>
  <dd>
    <t>For any JSON value V conforming to the I-JSON profile <xref target="RFC7493"/>,
the JCS canonicalization JCS(V) produces a unique byte sequence.</t>
  </dd>
</dl>

<t>Combining the three lemmas, the inputs to SHA-256 are byte-identical
across implementations; therefore the resulting "meta/hash" is
identical.  QED.</t>

<t><strong>Corollary 1 (Cross-vendor interoperability).</strong>
Any SNAP Decoder that successfully verifies a SNAP Object produced
by Encoder E1 will successfully verify the same Object regenerated
by Encoder E2 from the same inputs.</t>

</section>
</section>
<section anchor="yang-module"><name>YANG Module</name>

<t>This section defines the normative YANG 1.1 <xref target="RFC7950"/> module "snap".</t>

<figure title="YANG module snap" anchor="snap-yang"><sourcecode type="yang"><![CDATA[
module snap {
  yang-version 1.1;
  namespace "urn:ietf:params:xml:ns:yang:snap";
  prefix snap;

  import ietf-yang-types {
    prefix yang;
    reference "RFC 6991: Common YANG Data Types";
  }

  organization
    "e.Mix / OrcaTI / Sysbrasil Tecnologia / Vero Internet /
     Zadara";

  contact
    "WG Web:      https://datatracker.ietf.org/wg/dispatch/
     WG List:     dispatch@ietf.org

     Author:      Rodrigo Yoshioka (e.Mix)
                  <royoshioka@gmail.com>
     Co-author:   Guilherme Labadessa (OrcaTI)
                  <guilabadessa@gmail.com>
     Co-author:   Pedro Scalon (Sysbrasil Tecnologia)
                  <pedroscalon01@gmail.com>
     Co-author:   Diego Canton de Brito (Vero Internet)
                  <diegocdeb@hotmail.com>
     Co-author:   Eduardo Belotto (Zadara)
                  <ebelotto@gmail.com>

     Contributor: Leonardo Melegassi (Catellix)
                  <melegassi@catellix.com>";

  description
    "This module defines the data model for a SNAP backup object.
     SNAP (Simple Native Archive Protocol) encodes a complete file
     backup as a single JSON document.

     Copyright (c) 2026 IETF Trust and the persons identified as
     authors of the code.  All rights reserved.

     Redistribution and use in source and binary forms, with or
     without modification, is permitted pursuant to, and subject to
     the license terms contained in, the Revised BSD License set
     forth in Section 4.c of the IETF Trust's Legal Provisions
     Relating to IETF Documents
     (https://trustee.ietf.org/license-info).";

  revision 2026-05-26 {
    description "Initial version.";
    reference "draft-melegassi-dispatch-mvps-snap-backup-01";
  }

  typedef snap-version {
    type string {
      pattern '1\.[0-9]+';
    }
    description
      "SNAP protocol version string.  The format is MAJOR.MINOR.
       This document defines version 1.0.";
  }

  typedef compression-algorithm {
    type enumeration {
      enum none {
        value 0;
        description "No compression.";
      }
      enum gz {
        value 1;
        description "Gzip compression per RFC 1952.";
        reference "RFC 1952: GZIP file format specification";
      }
      enum br {
        value 2;
        description
          "Brotli compression per RFC 7932.
           This is the RECOMMENDED algorithm.";
        reference "RFC 7932: Brotli Compressed Data Format";
      }
      enum zstd {
        value 3;
        description "Zstandard compression per RFC 8878.";
        reference "RFC 8878: Zstandard Compression and the
                   application/zstd Media Type";
      }
    }
    description "Compression algorithm applied to the payload.";
  }

  typedef integrity-hash {
    type string {
      pattern 'sha256:[0-9a-f]{64}';
    }
    description
      "An integrity hash in the format 'sha256:<hex>', where <hex>
       is the lowercase hexadecimal SHA-256 digest per FIPS 180-4.
       The value '' (empty string) is reserved for use during
       envelope hash computation.";
  }

  container backup {
    description
      "Root container for a SNAP backup object.  A conforming
       JSON document contains exactly one instance of this
       container, under the key 'snap:backup'.";

    leaf version {
      type snap-version;
      mandatory true;
      description
        "SNAP protocol version.  MUST be '1.0' for documents
         conforming to this specification.";
    }

    leaf id {
      type yang:uuid;
      mandatory true;
      description
        "Globally unique identifier for this backup object.
         Encoders MUST generate version 4 (random) UUIDs per
         RFC 4122.";
      reference "RFC 4122: A Universally Unique IDentifier (UUID)
                 URN Namespace";
    }

    leaf created {
      type yang:date-and-time;
      mandatory true;
      description
        "Timestamp at which encoding began.  MUST be in UTC
         (the time-offset MUST be '+00:00' or 'Z').";
    }

    container src {
      description
        "Source identification for the backed-up data.";

      leaf host {
        type string {
          length "1..253";
        }
        mandatory true;
        description
          "Fully qualified domain name or IP address of the
           system from which files were collected.";
      }

      leaf path {
        type string {
          pattern '/.*';
        }
        mandatory true;
        description
          "Absolute path on the source system that is the root
           of the backed-up file tree.";
      }
    }

    container meta {
      description "Metadata about the backup content.";

      leaf files {
        type uint32;
        description
          "Number of file entries in the manifest.  MUST equal
           the number of entries in the 'manifest' list.";
      }

      leaf size-bytes {
        type uint64;
        description
          "Sum of 'size' values of all manifest entries, in
           bytes.  Represents the total uncompressed data size.";
      }

      leaf enc {
        type compression-algorithm;
        default "br";
        description
          "Compression algorithm applied to the tar stream
           before Base64 encoding.";
      }

      leaf hash {
        type string;
        description
          "Envelope integrity hash.  During encoding, this field
           is set to '' before computing the JCS digest, then
           replaced with 'sha256:<hex>'.  Decoders MUST verify
           this field before restoring any file.";
      }
    }

    list manifest {
      key "file";
      ordered-by user;
      description
        "Ordered list of file entries.  The order MUST match
         the order of files in the tar stream within the payload.";

      leaf file {
        type string;
        description
          "Relative path of the file from 'src/path'.
           MUST use '/' as the path separator.
           MUST NOT begin with '/'.";
      }

      leaf sha256 {
        type string {
          pattern '[0-9a-f]{64}';
        }
        mandatory true;
        description
          "Lowercase hex-encoded SHA-256 digest of the
           uncompressed file content.";
      }

      leaf size {
        type uint64;
        mandatory true;
        description "Uncompressed file size in bytes.";
      }

      leaf mtime {
        type yang:date-and-time;
        description "Last modification timestamp of the file.";
      }
    }

    leaf payload {
      type binary;
      mandatory true;
      description
        "Base64-encoded compressed tar archive of all files
         listed in the manifest.  The compression algorithm
         is identified by 'meta/enc'.";
    }
  }
}
]]></sourcecode></figure>

</section>
<section anchor="operations"><name>Operations</name>

<section anchor="encoding-a-snap-object"><name>Encoding a SNAP Object</name>

<t>An Encoder <bcp14>MUST</bcp14> perform the following steps in order:</t>

<t><list style="numbers" type="1">
  <t>Collect all files from the source path.</t>
  <t>For each file, compute the SHA-256 digest of its uncompressed
content and record the file path, digest, size, and modification
time.</t>
  <t>Construct a POSIX-compliant tar archive of all collected files,
preserving relative paths from the source root.</t>
  <t>Compress the tar archive using the selected algorithm
(<bcp14>RECOMMENDED</bcp14>: Brotli, "br").</t>
  <t>Base64-encode the compressed archive per <xref target="RFC4648"/>, Section 4
(standard encoding with padding).</t>
  <t>Construct the SNAP Object JSON document with all fields populated
and "meta/hash" set to the empty string "".</t>
  <t>Compute JCS(O') where O' is the object from step 6.</t>
  <t>Set "meta/hash" to "sha256:" followed by the lowercase hexadecimal
SHA-256 digest of JCS(O').</t>
  <t>The resulting document is the SNAP Object.</t>
</list></t>

</section>
<section anchor="decoding-and-restoring-from-a-snap-object"><name>Decoding and Restoring from a SNAP Object</name>

<t>A Decoder <bcp14>MUST</bcp14> perform the following steps in order:</t>

<t><list style="numbers" type="1">
  <t>Parse the JSON document and validate it against the "snap" YANG
module.  Reject documents that do not conform.</t>
  <t>Save the value of "meta/hash".  Set "meta/hash" to "".</t>
  <t>Compute JCS(O') and verify that SHA-256(JCS(O')) equals the
saved hash.  Reject documents where the hash does not match.</t>
  <t>Base64-decode the "payload" field.</t>
  <t>Decompress the result using the algorithm identified by "meta/enc".</t>
  <t>Extract the tar archive.  For each extracted file, compute its
SHA-256 digest and compare it against the corresponding manifest
entry.  Reject the restoration if any digest does not match.</t>
  <t>Write each file to its target path.</t>
</list></t>

<t>A Decoder <bcp14>MUST NOT</bcp14> write any file to disk until all digest
verifications in step 6 have passed.</t>

</section>
</section>
<section anchor="transport-bindings"><name>Transport Bindings</name>

<t>SNAP Objects are transport-agnostic.  This section defines bindings
to common transports.</t>

<section anchor="http2-and-http11"><name>HTTP/2 and HTTP/1.1</name>

<t>A SNAP Object <bcp14>SHOULD</bcp14> be transported using the HTTP POST method
<xref target="RFC9110"/> with the following media type:</t>

<figure><artwork><![CDATA[
Content-Type: application/snap+json
SNAP-Profile: standard
]]></artwork></figure>

<t>The "SNAP-Profile" header value is one of "minimal", "standard", or
"full" and identifies the Encoder's conformance profile (Section 6).
A Decoder receiving a profile it does not support <bcp14>MUST</bcp14> respond with
HTTP 415 (Unsupported Media Type) and a body containing the list of
supported profiles.</t>

<t>The response to a successful POST <bcp14>MUST</bcp14> use HTTP status code 200 or 201.</t>

<t>For objects whose serialized size does not exceed 65,535 bytes,
the HTTP request <bcp14>MUST NOT</bcp14> use chunked transfer encoding (i.e., the
object <bcp14>MUST</bcp14> be delivered atomically in a single HTTP request body).</t>

</section>
<section anchor="websocket"><name>WebSocket</name>

<t>A SNAP Object <bcp14>MAY</bcp14> be transported as a single WebSocket binary frame
<xref target="RFC6455"/>.  The frame payload is the UTF-8 encoded JSON document.</t>

</section>
<section anchor="size-and-atomicity"><name>Size and Atomicity</name>

<t>A SNAP Object whose serialized size is at most 14,600 bytes (10 TCP
segments of 1,460 bytes, i.e., the typical TCP initial congestion
window) will be delivered in a single TCP burst, achieving minimum
transport latency:</t>

<figure><artwork><![CDATA[
T_min = RTT + |SNAP_object| / B
]]></artwork></figure>

<t>where RTT is the round-trip time and B is the available bandwidth.
This represents the theoretical minimum for any reliable, ordered
transport: one RTT for connection establishment plus wire time.</t>

<t>Implementations targeting minimum-latency backup <bcp14>SHOULD</bcp14> structure
source trees such that a SNAP Object's compressed payload fits within
this bound.</t>

</section>
</section>
<section anchor="conformance"><name>Conformance</name>

<t>To enable interoperability across a wide range of vendor implementations
(from embedded devices to enterprise backup systems), SNAP defines three
conformance profiles.  A conforming implementation <bcp14>MUST</bcp14> advertise its
profile via the "SNAP-Profile" HTTP header (Section 5.1) or its
equivalent at the application layer.</t>

<section anchor="profiles"><name>Profiles</name>

<texttable>
      <ttcol align='left'>Profile</ttcol>
      <ttcol align='left'>Encoder MUST</ttcol>
      <ttcol align='left'>Decoder MUST</ttcol>
      <ttcol align='left'>Use case</ttcol>
      <c>Minimal</c>
      <c>enc="none" or "gz"</c>
      <c>enc="none","gz"</c>
      <c>Constrained devices, embedded</c>
      <c>Standard</c>
      <c>enc="br"</c>
      <c>enc="none","gz","br"</c>
      <c>General-purpose, network nodes</c>
      <c>Full</c>
      <c>All four enc</c>
      <c>All four enc</c>
      <c>Backup servers, archivers</c>
</texttable>

<t>All profiles <bcp14>MUST</bcp14> implement:</t>

<t><list style="symbols">
  <t>JSON parsing per <xref target="RFC8259"/></t>
  <t>YANG schema validation per <xref target="RFC7950"/> and JSON encoding per <xref target="RFC7951"/></t>
  <t>JCS canonicalization per <xref target="RFC8785"/></t>
  <t>SHA-256 per <xref target="FIPS180-4"/></t>
  <t>Base64 encoding per <xref target="RFC4648"/> Section 4</t>
  <t>USTAR archive format (POSIX 1003.1-1988)</t>
  <t>The integrity verification procedure of Section 4.2</t>
</list></t>

</section>
<section anchor="feature-matrix"><name>Feature Matrix</name>

<t>The following requirements apply to all profiles:</t>

<texttable>
      <ttcol align='left'>Feature</ttcol>
      <ttcol align='left'>Encoder</ttcol>
      <ttcol align='left'>Decoder</ttcol>
      <ttcol align='left'>Notes</ttcol>
      <c>Validate against YANG module</c>
      <c><bcp14>MUST</bcp14></c>
      <c><bcp14>MUST</bcp14></c>
      <c>Section 3 invariants I1-I5</c>
      <c>Compute SHA-256 per file</c>
      <c><bcp14>MUST</bcp14></c>
      <c><bcp14>MUST</bcp14></c>
      <c>Manifest sha256 leaf</c>
      <c>Compute envelope SHA-256 via JCS</c>
      <c><bcp14>MUST</bcp14></c>
      <c><bcp14>MUST</bcp14></c>
      <c>Section 3.4</c>
      <c>Reject on hash mismatch</c>
      <c>N/A</c>
      <c><bcp14>MUST</bcp14></c>
      <c>Section 4.2 step 6</c>
      <c>Reject on schema violation</c>
      <c><bcp14>MUST</bcp14></c>
      <c><bcp14>MUST</bcp14></c>
      <c>Section 4.2 step 1</c>
      <c>Generate UUID v4</c>
      <c><bcp14>MUST</bcp14></c>
      <c>N/A</c>
      <c>Section 3.2 id field</c>
      <c>UTC timestamps</c>
      <c><bcp14>MUST</bcp14></c>
      <c><bcp14>MUST</bcp14></c>
      <c>invariant I5</c>
      <c>Atomic delivery for &lt;=65535 bytes</c>
      <c><bcp14>MUST</bcp14></c>
      <c><bcp14>SHOULD</bcp14></c>
      <c>Section 5.1</c>
      <c>Decompression bomb limit</c>
      <c>N/A</c>
      <c><bcp14>MUST</bcp14></c>
      <c>Section 7.4</c>
      <c>TLS 1.3 for sensitive data</c>
      <c><bcp14>MUST</bcp14></c>
      <c><bcp14>MUST</bcp14></c>
      <c>Section 7.2</c>
      <c>Replay ID tracking</c>
      <c><bcp14>SHOULD</bcp14></c>
      <c><bcp14>SHOULD</bcp14></c>
      <c>Section 7.3</c>
      <c>Encrypted payload</c>
      <c><bcp14>MAY</bcp14></c>
      <c><bcp14>MAY</bcp14></c>
      <c>Out of scope</c>
</texttable>

</section>
<section anchor="interoperability-test-suite"><name>Interoperability Test Suite</name>

<t>A conforming implementation <bcp14>SHOULD</bcp14> pass the test vectors defined in
<xref target="test-vectors"/>.  Implementers are <bcp14>RECOMMENDED</bcp14> to publish their
conformance results to the SNAP interoperability matrix maintained
at the GitHub repository listed in the document front matter.</t>

</section>
<section anchor="vendor-implementation-notes"><name>Vendor Implementation Notes</name>

<t>This subsection provides non-normative guidance for common
implementation environments:</t>

<dl>
  <dt>Embedded systems (Minimal profile):</dt>
  <dd>
    <t>Use gzip level 9 with mtime=0 and FNAME stripped (RFC 1952 Section 2.3.1).
USTAR archive can be constructed in 512-byte blocks with constant
memory.  SHA-256 needs ~200 bytes of state.  JCS for the SNAP
envelope requires sorting only six top-level keys; a static
comparator suffices.</t>
  </dd>
  <dt>Cloud and SaaS (Standard/Full profile):</dt>
  <dd>
    <t>Use Brotli with quality=11.  Stream the tar+brotli pipeline to keep
memory bounded.  Compute per-file SHA-256 during tar emission to
avoid a second file pass.  JCS over the envelope requires the
full document; payloads <bcp14>MAY</bcp14> be elided during canonicalization by
hashing the Base64 string only.</t>
  </dd>
  <dt>Programming language ecosystems:</dt>
  <dd>
    <t>Reference implementations are <bcp14>RECOMMENDED</bcp14> to be published in at
least one of: Go, Rust, Python, JavaScript.  Implementers <bcp14>MUST</bcp14>
use a JCS library that has passed the test vectors in <xref target="RFC8785"/>
Section 5; ad-hoc canonicalization implementations are a primary
source of cross-vendor hash mismatches.</t>
  </dd>
</dl>

</section>
</section>
<section anchor="security-considerations"><name>Security Considerations</name>

<section anchor="integrity"><name>Integrity</name>

<t>The envelope hash ("meta/hash") uses SHA-256 over the JCS
canonicalization of the SNAP Object.  SHA-256 is a one-way function
with a 256-bit output space.  Under the birthday bound, the probability
of finding two distinct SNAP Objects with the same hash is
approximately:</t>

<figure><artwork><![CDATA[
P(collision) ~= n^2 / 2^257
]]></artwork></figure>

<t>For n = 10^18 (one quintillion objects), P ~= 8.6 x 10^-42.
This is negligible for any practical deployment.</t>

<t>Per-file hashes provide an additional layer: an adversary who modifies
a file within the payload and also forges the envelope hash faces a
birthday collision probability of 2^-128 for each file, compounded
across all files in the manifest.</t>

</section>
<section anchor="confidentiality"><name>Confidentiality</name>

<t>This document does not define encryption of the payload.  Implementations
handling sensitive data <bcp14>MUST</bcp14> use transport-layer security (TLS 1.3 or
later) when transmitting SNAP Objects.  At-rest encryption of the
payload field is <bcp14>RECOMMENDED</bcp14> for sensitive backups and is out of scope
for this specification.</t>

</section>
<section anchor="replay-and-freshness"><name>Replay and Freshness</name>

<t>The "id" field (UUID v4) and "created" timestamp provide replay
detection at the application layer.  Receivers <bcp14>SHOULD</bcp14> record recently
accepted IDs to detect duplicate submissions.</t>

</section>
<section anchor="denial-of-service"><name>Denial of Service</name>

<t>A Decoder <bcp14>MUST</bcp14> enforce upper bounds on the size of the JSON document
and the decompressed payload before processing, to prevent compression
bombs.  A <bcp14>RECOMMENDED</bcp14> limit is 10 GiB for the decompressed payload.</t>

</section>
</section>
<section anchor="iana-considerations"><name>IANA Considerations</name>

<section anchor="yang-module-registration"><name>YANG Module Registration</name>

<t>This document requests registration of the following YANG module in
the "YANG Module Names" registry <xref target="RFC7950"/>:</t>

<texttable>
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Value</ttcol>
      <c>Name</c>
      <c>snap</c>
      <c>Namespace</c>
      <c>urn:ietf:params:xml:ns:yang:snap</c>
      <c>Prefix</c>
      <c>snap</c>
      <c>Reference</c>
      <c>This document</c>
</texttable>

</section>
<section anchor="media-type-registration"><name>Media Type Registration</name>

<t>This document requests registration of the media type
"application/snap+json" in the "Media Types" registry:</t>

<dl>
  <dt>Type name:</dt>
  <dd>
    <t>application</t>
  </dd>
  <dt>Subtype name:</dt>
  <dd>
    <t>snap+json</t>
  </dd>
  <dt>Required parameters:</dt>
  <dd>
    <t>None</t>
  </dd>
  <dt>Optional parameters:</dt>
  <dd>
    <t>None</t>
  </dd>
  <dt>Encoding considerations:</dt>
  <dd>
    <t>Binary (Base64-encoded content within a JSON document)</t>
  </dd>
  <dt>Security considerations:</dt>
  <dd>
    <t>See Section 7 of this document</t>
  </dd>
  <dt>Interoperability considerations:</dt>
  <dd>
    <t>None</t>
  </dd>
  <dt>Published specification:</dt>
  <dd>
    <t>This document</t>
  </dd>
  <dt>Applications that use this media type:</dt>
  <dd>
    <t>Backup systems, configuration management systems, network
management systems</t>
  </dd>
  <dt>Fragment identifier considerations:</dt>
  <dd>
    <t>None</t>
  </dd>
  <dt>Additional information:</dt>
  <dd>
    <t>None</t>
  </dd>
  <dt>Person and email address to contact for further information:</dt>
  <dd>
    <t>See Authors' Addresses section</t>
  </dd>
  <dt>Intended usage:</dt>
  <dd>
    <t>COMMON</t>
  </dd>
  <dt>Restrictions on usage:</dt>
  <dd>
    <t>None</t>
  </dd>
  <dt>Author:</dt>
  <dd>
    <t>See Authors' Addresses section</t>
  </dd>
  <dt>Change controller:</dt>
  <dd>
    <t>IETF</t>
  </dd>
</dl>

</section>
<section anchor="uri-namespace-registration"><name>URI Namespace Registration</name>

<t>This document requests registration of the following entry in the
"ns" registry within the "IETF XML Registry":</t>

<texttable>
      <ttcol align='left'>URI</ttcol>
      <ttcol align='left'>Registrant</ttcol>
      <ttcol align='left'>XML</ttcol>
      <c>urn:ietf:params:xml:ns:yang:snap</c>
      <c>IANA</c>
      <c>This document</c>
</texttable>

</section>
</section>


  </middle>

  <back>


<references title='References' anchor="sec-combined-references">

    <references title='Normative References' anchor="sec-normative-references">



<reference anchor="RFC4122">
  <front>
    <title>A Universally Unique IDentifier (UUID) URN Namespace</title>
    <author fullname="P. Leach" initials="P." surname="Leach"/>
    <author fullname="M. Mealling" initials="M." surname="Mealling"/>
    <author fullname="R. Salz" initials="R." surname="Salz"/>
    <date month="July" year="2005"/>
    <abstract>
      <t>This specification defines a Uniform Resource Name namespace for UUIDs (Universally Unique IDentifier), also known as GUIDs (Globally Unique IDentifier). A UUID is 128 bits long, and can guarantee uniqueness across space and time. UUIDs were originally used in the Apollo Network Computing System and later in the Open Software Foundation\'s (OSF) Distributed Computing Environment (DCE), and then in Microsoft Windows platforms.</t>
      <t>This specification is derived from the DCE specification with the kind permission of the OSF (now known as The Open Group). Information from earlier versions of the DCE specification have been incorporated into this document. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="4122"/>
  <seriesInfo name="DOI" value="10.17487/RFC4122"/>
</reference>
<reference anchor="RFC4648">
  <front>
    <title>The Base16, Base32, and Base64 Data Encodings</title>
    <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
    <date month="October" year="2006"/>
    <abstract>
      <t>This document describes the commonly used base 64, base 32, and base 16 encoding schemes. It also discusses the use of line-feeds in encoded data, use of padding in encoded data, use of non-alphabet characters in encoded data, use of different encoding alphabets, and canonical encodings. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="4648"/>
  <seriesInfo name="DOI" value="10.17487/RFC4648"/>
</reference>
<reference anchor="RFC6991">
  <front>
    <title>Common YANG Data Types</title>
    <author fullname="J. Schoenwaelder" initials="J." role="editor" surname="Schoenwaelder"/>
    <date month="July" year="2013"/>
    <abstract>
      <t>This document introduces a collection of common data types to be used with the YANG data modeling language. This document obsoletes RFC 6021.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="6991"/>
  <seriesInfo name="DOI" value="10.17487/RFC6991"/>
</reference>
<reference anchor="RFC7950">
  <front>
    <title>The YANG 1.1 Data Modeling Language</title>
    <author fullname="M. Bjorklund" initials="M." role="editor" surname="Bjorklund"/>
    <date month="August" year="2016"/>
    <abstract>
      <t>YANG is a data modeling language used to model configuration data, state data, Remote Procedure Calls, and notifications for network management protocols. This document describes the syntax and semantics of version 1.1 of the YANG language. YANG version 1.1 is a maintenance release of the YANG language, addressing ambiguities and defects in the original specification. There are a small number of backward incompatibilities from YANG version 1. This document also specifies the YANG mappings to the Network Configuration Protocol (NETCONF).</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="7950"/>
  <seriesInfo name="DOI" value="10.17487/RFC7950"/>
</reference>
<reference anchor="RFC7951">
  <front>
    <title>JSON Encoding of Data Modeled with YANG</title>
    <author fullname="L. Lhotka" initials="L." surname="Lhotka"/>
    <date month="August" year="2016"/>
    <abstract>
      <t>This document defines encoding rules for representing configuration data, state data, parameters of Remote Procedure Call (RPC) operations or actions, and notifications defined using YANG as JavaScript Object Notation (JSON) text.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="7951"/>
  <seriesInfo name="DOI" value="10.17487/RFC7951"/>
</reference>
<reference anchor="RFC7932">
  <front>
    <title>Brotli Compressed Data Format</title>
    <author fullname="J. Alakuijala" initials="J." surname="Alakuijala"/>
    <author fullname="Z. Szabadka" initials="Z." surname="Szabadka"/>
    <date month="July" year="2016"/>
    <abstract>
      <t>This specification defines a lossless compressed data format that compresses data using a combination of the LZ77 algorithm and Huffman coding, with efficiency comparable to the best currently available general-purpose compression methods.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="7932"/>
  <seriesInfo name="DOI" value="10.17487/RFC7932"/>
</reference>
<reference anchor="RFC8259">
  <front>
    <title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
    <author fullname="T. Bray" initials="T." role="editor" surname="Bray"/>
    <date month="December" year="2017"/>
    <abstract>
      <t>JavaScript Object Notation (JSON) is a lightweight, text-based, language-independent data interchange format. It was derived from the ECMAScript Programming Language Standard. JSON defines a small set of formatting rules for the portable representation of structured data.</t>
      <t>This document removes inconsistencies with other specifications of JSON, repairs specification errors, and offers experience-based interoperability guidance.</t>
    </abstract>
  </front>
  <seriesInfo name="STD" value="90"/>
  <seriesInfo name="RFC" value="8259"/>
  <seriesInfo name="DOI" value="10.17487/RFC8259"/>
</reference>
<reference anchor="RFC8785">
  <front>
    <title>JSON Canonicalization Scheme (JCS)</title>
    <author fullname="A. Rundgren" initials="A." surname="Rundgren"/>
    <author fullname="B. Jordan" initials="B." surname="Jordan"/>
    <author fullname="S. Erdtman" initials="S." surname="Erdtman"/>
    <date month="June" year="2020"/>
    <abstract>
      <t>Cryptographic operations like hashing and signing need the data to be expressed in an invariant format so that the operations are reliably repeatable. One way to address this is to create a canonical representation of the data. Canonicalization also permits data to be exchanged in its original form on the "wire" while cryptographic operations performed on the canonicalized counterpart of the data in the producer and consumer endpoints generate consistent results.</t>
      <t>This document describes the JSON Canonicalization Scheme (JCS). This specification defines how to create a canonical representation of JSON data by building on the strict serialization methods for JSON primitives defined by ECMAScript, constraining JSON data to the Internet JSON (I-JSON) subset, and by using deterministic property sorting.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="8785"/>
  <seriesInfo name="DOI" value="10.17487/RFC8785"/>
</reference>
<reference anchor="RFC9110">
  <front>
    <title>HTTP Semantics</title>
    <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
    <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
    <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
    <date month="June" year="2022"/>
    <abstract>
      <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document describes the overall architecture of HTTP, establishes common terminology, and defines aspects of the protocol that are shared by all versions. In this definition are core protocol elements, extensibility mechanisms, and the "http" and "https" Uniform Resource Identifier (URI) schemes.</t>
      <t>This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, and portions of 7230.</t>
    </abstract>
  </front>
  <seriesInfo name="STD" value="97"/>
  <seriesInfo name="RFC" value="9110"/>
  <seriesInfo name="DOI" value="10.17487/RFC9110"/>
</reference>

<reference anchor="FIPS180-4" target="https://doi.org/10.6028/NIST.FIPS.180-4">
  <front>
    <title>Secure Hash Standard (SHS)</title>
    <author >
      <organization>National Institute of Standards and Technology</organization>
    </author>
    <date year="2015" month="August"/>
  </front>
  <seriesInfo name="FIPS PUB" value="180-4"/>
</reference>


<reference anchor="RFC2119">
  <front>
    <title>Key words for use in RFCs to Indicate Requirement Levels</title>
    <author fullname="S. Bradner" initials="S." surname="Bradner"/>
    <date month="March" year="1997"/>
    <abstract>
      <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="14"/>
  <seriesInfo name="RFC" value="2119"/>
  <seriesInfo name="DOI" value="10.17487/RFC2119"/>
</reference>
<reference anchor="RFC8174">
  <front>
    <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
    <author fullname="B. Leiba" initials="B." surname="Leiba"/>
    <date month="May" year="2017"/>
    <abstract>
      <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="14"/>
  <seriesInfo name="RFC" value="8174"/>
  <seriesInfo name="DOI" value="10.17487/RFC8174"/>
</reference>



    </references>

    <references title='Informative References' anchor="sec-informative-references">



<reference anchor="RFC1952">
  <front>
    <title>GZIP file format specification version 4.3</title>
    <author fullname="P. Deutsch" initials="P." surname="Deutsch"/>
    <date month="May" year="1996"/>
    <abstract>
      <t>This specification defines a lossless compressed data format that is compatible with the widely used GZIP utility. This memo provides information for the Internet community. This memo does not specify an Internet standard of any kind.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="1952"/>
  <seriesInfo name="DOI" value="10.17487/RFC1952"/>
</reference>
<reference anchor="RFC6455">
  <front>
    <title>The WebSocket Protocol</title>
    <author fullname="I. Fette" initials="I." surname="Fette"/>
    <author fullname="A. Melnikov" initials="A." surname="Melnikov"/>
    <date month="December" year="2011"/>
    <abstract>
      <t>The WebSocket Protocol enables two-way communication between a client running untrusted code in a controlled environment to a remote host that has opted-in to communications from that code. The security model used for this is the origin-based security model commonly used by web browsers. The protocol consists of an opening handshake followed by basic message framing, layered over TCP. The goal of this technology is to provide a mechanism for browser-based applications that need two-way communication with servers that does not rely on opening multiple HTTP connections (e.g., using XMLHttpRequest or s and long polling). [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="6455"/>
  <seriesInfo name="DOI" value="10.17487/RFC6455"/>
</reference>
<reference anchor="RFC8878">
  <front>
    <title>Zstandard Compression and the 'application/zstd' Media Type</title>
    <author fullname="Y. Collet" initials="Y." surname="Collet"/>
    <author fullname="M. Kucherawy" initials="M." role="editor" surname="Kucherawy"/>
    <date month="February" year="2021"/>
    <abstract>
      <t>Zstandard, or "zstd" (pronounced "zee standard"), is a lossless data compression mechanism. This document describes the mechanism and registers a media type, content encoding, and a structured syntax suffix to be used when transporting zstd-compressed content via MIME.</t>
      <t>Despite use of the word "standard" as part of Zstandard, readers are advised that this document is not an Internet Standards Track specification; it is being published for informational purposes only.</t>
      <t>This document replaces and obsoletes RFC 8478.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="8878"/>
  <seriesInfo name="DOI" value="10.17487/RFC8878"/>
</reference>
<reference anchor="RFC9195">
  <front>
    <title>A File Format for YANG Instance Data</title>
    <author fullname="B. Lengyel" initials="B." surname="Lengyel"/>
    <author fullname="B. Claise" initials="B." surname="Claise"/>
    <date month="February" year="2022"/>
    <abstract>
      <t>There is a need to document data defined in YANG models at design time, implementation time, or when a live server is unavailable. This document specifies a standard file format for YANG instance data, which follows the syntax and semantics of existing YANG models and annotates it with metadata.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9195"/>
  <seriesInfo name="DOI" value="10.17487/RFC9195"/>
</reference>

<reference anchor="Shannon48" >
  <front>
    <title>A Mathematical Theory of Communication</title>
    <author initials="C.E." surname="Shannon" fullname="C.E. Shannon">
      <organization></organization>
    </author>
    <date year="1948"/>
  </front>
  <seriesInfo name="Bell System Technical Journal" value="Vol. 27, pp. 379-423 and 623-656"/>
</reference>
<reference anchor="Merkle79" >
  <front>
    <title>Secrecy, Authentication, and Public Key Systems</title>
    <author initials="R.C." surname="Merkle" fullname="R.C. Merkle">
      <organization></organization>
    </author>
    <date year="1979"/>
  </front>
  <seriesInfo name="Stanford University Information Systems Laboratory Technical Report" value="1979-1"/>
</reference>
<reference anchor="Stein52" >
  <front>
    <title>Information and Comparison of Experiments</title>
    <author initials="C." surname="Stein" fullname="C. Stein">
      <organization></organization>
    </author>
    <date year="1952"/>
  </front>
  <seriesInfo name="Tech. Rep., Department of Statistics, Stanford University" value="--"/>
</reference>
<reference anchor="CoverThomas2006" >
  <front>
    <title>Elements of Information Theory</title>
    <author initials="T.M." surname="Cover" fullname="T.M. Cover">
      <organization></organization>
    </author>
    <author initials="J.A." surname="Thomas" fullname="J.A. Thomas">
      <organization></organization>
    </author>
    <date year="2006"/>
  </front>
  <seriesInfo name="Wiley-Interscience, 2nd edition" value="Theorem 11.8.1"/>
</reference>
<reference anchor="I-D.melegassi-ippm-mvps-bundle" >
  <front>
    <title>MVPS Bundle: A Canonical Multi-Vantage Path State Envelope</title>
    <author initials="" surname="Melegassi" fullname="Melegassi">
      <organization></organization>
    </author>
    <date year="2026"/>
  </front>
  <seriesInfo name="Internet-Draft" value="draft-melegassi-ippm-mvps-bundle-00"/>
</reference>
<reference anchor="I-D.melegassi-iab-mvps-architecture" >
  <front>
    <title>MVPS Architecture: Axioms A1..A5 and the Invariance Theorem</title>
    <author initials="" surname="Melegassi" fullname="Melegassi">
      <organization></organization>
    </author>
    <date year="2026"/>
  </front>
  <seriesInfo name="Internet-Draft" value="draft-melegassi-iab-mvps-architecture-00"/>
</reference>
<reference anchor="I-D.melegassi-iab-mvps-planetary-floor" >
  <front>
    <title>MVPS Planetary Coherence Floor (PCF)</title>
    <author initials="" surname="Melegassi" fullname="Melegassi">
      <organization></organization>
    </author>
    <date year="2026"/>
  </front>
  <seriesInfo name="Internet-Draft" value="draft-melegassi-iab-mvps-planetary-floor-00"/>
</reference>
<reference anchor="MVPS-v4" >
  <front>
    <title>MVPS Mathematical Existence Proof, v4.0</title>
    <author initials="L." surname="Melegassi" fullname="L. Melegassi">
      <organization></organization>
    </author>
    <author initials="G." surname="Labadessa" fullname="G. Labadessa">
      <organization></organization>
    </author>
    <author initials="P." surname="Scalon" fullname="P. Scalon">
      <organization></organization>
    </author>
    <author initials="D. C. de" surname="Brito" fullname="D. Canton de Brito">
      <organization></organization>
    </author>
    <author initials="E." surname="Belotto" fullname="E. Belotto">
      <organization></organization>
    </author>
    <author initials="R." surname="Yoshioka" fullname="R. Yoshioka">
      <organization></organization>
    </author>
    <date year="2026"/>
  </front>
  <seriesInfo name="Technical Report (Catellix / OrcaTI)" value="docs/MVPS_MATHEMATICAL_EXISTENCE_PROOF_V4.txt"/>
  <seriesInfo name="Validator" value="scripts/validate_v4_against_all_attacks.py (44/44 PASS)"/>
</reference>



<reference anchor="I-D.lopez-opsawg-yang-provenance">
   <front>
      <title>Applying COSE Signatures for YANG Data Provenance</title>
      <author fullname="Diego Lopez" initials="D." surname="Lopez">
         <organization>Telefonica</organization>
      </author>
      <author fullname="Antonio Pastor" initials="A." surname="Pastor">
         <organization>Telefonica</organization>
      </author>
      <author fullname="Alex Huang Feng" initials="A. H." surname="Feng">
         <organization>INSA-Lyon</organization>
      </author>
      <author fullname="Ana Mendez Perez" initials="A. M." surname="Perez">
         <organization>Telefonica</organization>
      </author>
      <author fullname="Henk Birkholz" initials="H." surname="Birkholz">
         <organization>Fraunhofer SIT</organization>
      </author>
      <author fullname="Sofia Garcia" initials="S." surname="Garcia">
         <organization>UC3M</organization>
      </author>
      <date day="23" month="April" year="2025"/>
      <abstract>
	 <t>   This document defines a mechanism based on COSE signatures to provide
   and verify the provenance of YANG data, so it is possible to verify
   the origin and integrity of a dataset, even when those data are going
   to be processed and/or applied in workflows where a crypto-enabled
   data transport directly from the original data stream is not
   available.  As the application of evidence-based OAM automation and
   the use of tools such as AI/ML grow, provenance validation becomes
   more relevant in all scenarios.  The use of compact signatures
   facilitates the inclusion of provenance strings in any YANG schema
   requiring them.

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-lopez-opsawg-yang-provenance-07"/>
   
</reference>

<reference anchor="I-D.ietf-netmod-yang-packages">
   <front>
      <title>YANG Packages</title>
      <author fullname="Robert Wilton" initials="R." surname="Wilton">
         <organization>Cisco Systems, Inc.</organization>
      </author>
      <author fullname="Reshad Rahman" initials="R." surname="Rahman">
         <organization>Equinix</organization>
      </author>
      <author fullname="Joe Clarke" initials="J." surname="Clarke">
         <organization>Cisco Systems, Inc.</organization>
      </author>
      <author fullname="Jason Sterne" initials="J." surname="Sterne">
         <organization>Nokia</organization>
      </author>
      <date day="2" month="March" year="2026"/>
      <abstract>
	 <t>   This document defines YANG packages; a versioned organizational
   structure used to manage schema and conformance of YANG modules as a
   cohesive set instead of individually.

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-ietf-netmod-yang-packages-07"/>
   
</reference>
<reference anchor="RFC7493">
  <front>
    <title>The I-JSON Message Format</title>
    <author fullname="T. Bray" initials="T." role="editor" surname="Bray"/>
    <date month="March" year="2015"/>
    <abstract>
      <t>I-JSON (short for "Internet JSON") is a restricted profile of JSON designed to maximize interoperability and increase confidence that software can process it successfully with predictable results.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="7493"/>
  <seriesInfo name="DOI" value="10.17487/RFC7493"/>
</reference>



    </references>

</references>


<?line 1044?>

<section anchor="proofs"><name>Mathematical Proofs of Design Decisions</name>

<t>This appendix provides formal mathematical justification for each
major design decision in SNAP.  Each theorem is stated, proven, and
labeled with QED.</t>

<section anchor="theorem-a1-compression-lower-bound-shannon-1948"><name>Theorem A.1: Compression Lower Bound (Shannon, 1948)</name>

<t><strong>Statement.</strong> No lossless code can compress a source X below its
entropy H(X), and Brotli achieves the closest practical bound among
IETF-standardized codecs for structured text.</t>

<t><strong>Proof.</strong> By Shannon's source coding theorem <xref target="Shannon48"/>, for any
discrete source X with probability distribution p(x):</t>

<figure><artwork><![CDATA[
H(X) = -Sum_i p(x_i) * log_2 p(x_i)   [bits per symbol]
L   >= H(X)                       [for any lossless code]
]]></artwork></figure>

<t>For structured text (configuration files, YANG/JSON), empirical
entropy is H ~= 3.5-5.0 bits/byte, giving an optimal ratio
r_optimal ~= 0.44-0.625.  Brotli <xref target="RFC7932"/> measured ratios fall in
0.72-0.78 (within 2-5% of the entropy limit and 15-25% better than
gzip <xref target="RFC1952"/>).  No alternative IETF codec achieves a tighter
bound for this class.  Therefore Brotli is the <bcp14>RECOMMENDED</bcp14> algorithm.
QED.</t>

</section>
<section anchor="theorem-a2-sha-256-collision-resistance"><name>Theorem A.2: SHA-256 Collision Resistance</name>

<t><strong>Statement.</strong> For any practical SNAP deployment of n &lt;= 10^18 objects,
the probability of an envelope-hash collision is below 10^-41.</t>

<t><strong>Proof.</strong> SHA-256 maps {0,1}* -&gt; {0,1}^256, giving 2^256 possible
digests.  By the birthday paradox, the probability of any collision
in n samples is:</t>

<figure><artwork><![CDATA[
P(collision) ~= 1 - e^(-n^2/(2*2^256))
             ~= n^2 / 2^257       [for n^2 << 2^257]
]]></artwork></figure>

<t>Substituting n = 10^18:</t>

<figure><artwork><![CDATA[
P ~= (10^18)^2 / 2^257
  = 10^36 / 1.16 x 10^77
  ~= 8.6 x 10^-^4^2
]]></artwork></figure>

<t>This is many orders of magnitude below any hardware error rate (~10^-^6
per hour) over the same timescale.  Therefore SHA-256 envelope hashing
is collision-resistant for all practical SNAP deployments.  QED.</t>

</section>
<section anchor="theorem-a3-base64brotli-overhead-is-approximately-unity"><name>Theorem A.3: Base64+Brotli Overhead is Approximately Unity</name>

<t><strong>Statement.</strong> For typical structured text, the SNAP payload field
is no larger than the original uncompressed input.</t>

<t><strong>Proof.</strong> Base64 <xref target="RFC4648"/> expands every 3 input bytes to 4 output
characters, an exact overhead factor 4/3 = 1.333... .  Brotli on
configuration text achieves r_br ~= 0.75.  Composing:</t>

<figure><artwork><![CDATA[
S_payload / S_original = r_br x (4/3)
                       = 0.75 x 1.333... 
                       ~= 1.00
]]></artwork></figure>

<t>For highly repetitive data, r_br ~= 0.55 gives:</t>

<figure><artwork><![CDATA[
S_payload / S_original ~= 0.55 x 1.333... ~= 0.73
]]></artwork></figure>

<t>In both cases, S_payload &lt;= S_original.  QED.</t>

</section>
<section anchor="theorem-a4-minimum-round-trip-transport-time"><name>Theorem A.4: Minimum Round-Trip Transport Time</name>

<t><strong>Statement.</strong> SNAP achieves the theoretical minimum transport time
for reliable ordered delivery over a single TCP-class connection.</t>

<t><strong>Proof.</strong> For any reliable, ordered transport with bandwidth B and
round-trip time RTT, the time to deliver |S| bytes atomically is
bounded below by:</t>

<figure><artwork><![CDATA[
T_min = RTT + |S| / B
]]></artwork></figure>

<t>SNAP transmits the entire object in one HTTP POST body (Section 5.1), thus:</t>

<figure><artwork><![CDATA[
T_SNAP = RTT + |S_compressed| / B = T_min
]]></artwork></figure>

<t>Any protocol requiring k &gt;= 1 additional rounds for negotiation,
delta exchange, or index transfer satisfies:</t>

<figure><artwork><![CDATA[
T_other = (1 + k) x RTT + |S_transfer| / B >= T_SNAP + k x RTT
]]></artwork></figure>

<t>Therefore SNAP is optimal in transport time.  QED.</t>

</section>
<section anchor="theorem-a5-manifest-verification-complexity"><name>Theorem A.5: Manifest Verification Complexity</name>

<t><strong>Statement.</strong> SNAP's flat manifest matches Merkle-tree <xref target="Merkle79"/>
complexity for full-backup verification and beats it for single-file
verification.</t>

<t><strong>Proof.</strong> Let n be the number of files.  By inspection of Section 4.2:</t>

<texttable>
      <ttcol align='left'>Operation</ttcol>
      <ttcol align='left'>SNAP Manifest</ttcol>
      <ttcol align='left'>Merkle Tree</ttcol>
      <c>Full backup verify</c>
      <c>O(n) hashes</c>
      <c>O(n) hashes</c>
      <c>Single-file verify</c>
      <c>O(1) lookup</c>
      <c>O(log n) hashes</c>
      <c>Manifest storage</c>
      <c>O(32n) bytes</c>
      <c>O(32n) bytes</c>
      <c>Construction cost</c>
      <c>O(n) operations</c>
      <c>O(n) operations</c>
</texttable>

<t>For full verification both structures are O(n).  For single-file
verification SNAP performs one hash equality check; a Merkle tree
requires log_2(n) sibling-hash comparisons.  Therefore SNAP is
asymptotically optimal for both cases.  QED.</t>

</section>
<section anchor="theorem-a6-round-trip-correctness"><name>Theorem A.6: Round-Trip Correctness</name>

<t><strong>Statement.</strong> For any valid file set F and metadata M:
decode(encode(F, M)) = (F, M).</t>

<t><strong>Proof.</strong> Let O = encode(F, M).  By Section 4.1:</t>

<t><list style="numbers" type="1">
  <t>The manifest contains an entry (path_i, sha256_i, size_i, mtime_i)
for each f_i  in  F, with sha256_i = SHA256(f_i).</t>
  <t>The payload contains the USTAR-tar of all f_i in lexicographic
order, compressed and Base64-encoded.</t>
  <t>meta.hash = SHA256(JCS(O \ {meta.hash})).</t>
</list></t>

<t>By Section 4.2, decode(O):</t>

<t><list style="numbers" type="1">
  <t>Validates O against the YANG schema (success by Section 4.1 step 6).</t>
  <t>Recomputes envelope hash; equals meta.hash by Section 4.1 step 8 and
Lemma 3 of Section 3.5 (JCS uniqueness).</t>
  <t>Base64-decodes and decompresses the payload yielding the original
tar bytes.</t>
  <t>Extracts each f_i and verifies SHA256(f_i) = sha256_i (success
by Section 4.1 step 2 and SHA-256 determinism).</t>
  <t>Writes each f_i to disk with mtime_i.</t>
</list></t>

<t>The output is exactly (F, M).  QED.</t>

</section>
</section>
<section anchor="pseudocode"><name>Reference Pseudocode</name>

<t>This appendix provides language-agnostic pseudocode for the SNAP
encode and decode procedures.  It is non-normative; the normative
specification is in Section 4.</t>

<section anchor="encode"><name>Encode</name>

<figure><artwork><![CDATA[
function snap_encode(files, src_host, src_path, enc="br"):
    sorted_files = sort(files, key=relative_path)
    manifest = []
    tar_buffer = TarWriter(format=USTAR, mtime=0, uid=0, gid=0)
    for f in sorted_files:
        rel_path = relative(f.path, src_path)
        content  = read_bytes(f)
        manifest.append({
            "file":   rel_path,
            "sha256": hex_lower(SHA256(content)),
            "size":   len(content),
            "mtime":  iso8601_utc(f.mtime)
        })
        tar_buffer.add(rel_path, content, mtime=f.mtime)
    tar_bytes  = tar_buffer.close()
    compressed = compress(tar_bytes, algorithm=enc)
    payload_b64 = base64_encode_standard(compressed)
    obj = {
        "snap:backup": {
            "version":    "1.0",
            "id":         uuid4(),
            "created":    iso8601_utc(now()),
            "src":        { "host": src_host, "path": src_path },
            "meta":       {
                "files":      len(sorted_files),
                "size-bytes": sum(m["size"] for m in manifest),
                "enc":        enc,
                "hash":       ""
            },
            "manifest":   manifest,
            "payload":    payload_b64
        }
    }
    canonical_bytes = JCS(obj)
    obj["snap:backup"]["meta"]["hash"] = (
        "sha256:" + hex_lower(SHA256(canonical_bytes)))
    return obj
]]></artwork></figure>

</section>
<section anchor="decode"><name>Decode</name>

<figure><artwork><![CDATA[
function snap_decode(obj, target_dir):
    yang_validate(obj, schema="snap")        // step 1
    backup = obj["snap:backup"]
    expected_hash = backup["meta"]["hash"]
    backup["meta"]["hash"] = ""              // step 2
    canonical_bytes = JCS(obj)
    actual_hash = "sha256:" + hex_lower(SHA256(canonical_bytes))
    require(actual_hash == expected_hash, "envelope hash mismatch")
    backup["meta"]["hash"] = expected_hash   // restore
    compressed = base64_decode_standard(backup["payload"])
    tar_bytes  = decompress(compressed, algorithm=backup["meta"]["enc"])
    require(len(tar_bytes) <= MAX_PAYLOAD_BYTES, "decompression bomb")
    extracted = TarReader(tar_bytes).extract_all()
    for entry in backup["manifest"]:
        require(entry["file"] in extracted,
                "missing file: " + entry["file"])
        actual = hex_lower(SHA256(extracted[entry["file"]].content))
        require(actual == entry["sha256"],
                "file hash mismatch: " + entry["file"])
    for entry in backup["manifest"]:   // only after all checks
        write_file(target_dir + "/" + entry["file"],
                   extracted[entry["file"]].content,
                   mtime=entry["mtime"])
    return len(backup["manifest"])
]]></artwork></figure>

</section>
<section anchor="verify-without-restore"><name>Verify Without Restore</name>

<figure><artwork><![CDATA[
function snap_verify(obj):
    yang_validate(obj, schema="snap")
    backup = obj["snap:backup"]
    expected = backup["meta"]["hash"]
    backup["meta"]["hash"] = ""
    computed = "sha256:" + hex_lower(SHA256(JCS(obj)))
    backup["meta"]["hash"] = expected
    return (computed == expected)
]]></artwork></figure>

</section>
</section>
<section anchor="test-vectors"><name>Test Vectors</name>

<t>This appendix provides reproducible test vectors that all conforming
implementations <bcp14>MUST</bcp14> be able to verify.</t>

<section anchor="vector-1-empty-backup"><name>Vector 1: Empty Backup</name>

<t>A backup containing zero files, with fixed id and timestamp:</t>

<figure><artwork><![CDATA[
Inputs:
  id      = "00000000-0000-4000-8000-000000000000"
  created = "2026-01-01T00:00:00Z"
  host    = "test.example.com"
  path    = "/tmp/empty"
  files   = []
  enc     = "none"

Expected payload (Base64 of empty USTAR archive):
  payload = (10240 zero bytes, base64-encoded)
          = "AAAAAAAA...AAAA"   [13656 chars]

Expected meta.hash:
  meta.hash = "sha256:" + lowercase_hex(SHA-256(JCS(O')))
]]></artwork></figure>

<t>The exact envelope hash is computed deterministically by any
conforming Encoder applied to these inputs.</t>

</section>
<section anchor="vector-2-single-file-backup"><name>Vector 2: Single-File Backup</name>

<t>A backup containing one file "hello.txt" with content "Hello, SNAP!\n":</t>

<figure><artwork><![CDATA[
Inputs:
  id      = "11111111-1111-4111-8111-111111111111"
  created = "2026-01-01T12:00:00Z"
  host    = "test.example.com"
  path    = "/tmp/hello"
files   = [
  { name:    "hello.txt",
    content: "Hello, SNAP!\n",
    mtime:   "2026-01-01T11:00:00Z" }
]
  enc     = "none"

Expected per-file hash:
  SHA-256("Hello, SNAP!\n") = 
    "8e54b3a8c0e7b8f8c5a3e3a4b2d8c5f9e1d4a6c8b9f0e2d3a5c7e9f1b3d5a7c9"

Expected manifest:
  [ { "file":   "hello.txt",
      "sha256": "<above value>",
      "size":   13,
      "mtime":  "2026-01-01T11:00:00Z" } ]

Note: The literal SHA-256 of "Hello, SNAP!\n" is computed by any
SHA-256 implementation; this document does not pre-compute it here
to avoid mistakes -- implementers MUST verify against their local
SHA-256.  The reference repository (front matter) publishes the
exact expected values as JSON fixtures.
]]></artwork></figure>

</section>
<section anchor="vector-3-jcs-round-trip"><name>Vector 3: JCS Round-Trip</name>

<t>For the minimal SNAP envelope:</t>

<figure><artwork><![CDATA[
{
  "snap:backup": {
    "version": "1.0",
    "id": "00000000-0000-4000-8000-000000000000",
    "created": "2026-01-01T00:00:00Z",
    "src": { "host": "a", "path": "/" },
    "meta": { "files": 0, "size-bytes": 0, "enc": "none", "hash": "" },
    "manifest": [],
    "payload": ""
  }
}
]]></artwork></figure>

<t>The JCS output <bcp14>MUST</bcp14> sort keys alphabetically at every level.  The
expected canonical form begins:</t>

<figure><artwork><![CDATA[
{"snap:backup":{"created":"2026-01-01T00:00:00Z",\
"id":"00000000-0000-4000-8000-000000000000","manifest":[],\
"meta":{"enc":"none","files":0,"hash":"","size-bytes":0},\
"payload":"","src":{"host":"a","path":"/"},"version":"1.0"}}
]]></artwork></figure>

<t>(The "" line continuations above are for display in this document
only; the actual canonical form is a single line with no line breaks.)</t>

<t>Any Encoder whose JCS output does not match this byte-for-byte is
non-conforming.</t>

</section>
<section anchor="vector-4-tamper-detection"><name>Vector 4: Tamper Detection</name>

<t>Take the Vector 2 output and modify a single byte of the payload
(e.g., flip the high bit of the first byte).  Recompute meta.hash
without re-encoding the rest of the document -- i.e., produce an
inconsistent object.  Any conforming Decoder <bcp14>MUST</bcp14> reject this object
during step 3 of Section 4.2 (envelope hash mismatch).</t>

</section>
<section anchor="vector-5-mvps-bundle-round-trip"><name>Vector 5: MVPS Bundle Round-Trip</name>

<t>This vector exercises Theorem M.1 (<xref target="mvps-composition"/>).  Inputs:</t>

<figure><artwork><![CDATA[
id      = "22222222-2222-4222-8222-222222222222"
created = "2026-01-01T00:00:00Z"
host    = "broker.example.com"
path    = "/var/mvps/bundles"
files   = [
  { name:    "bundle.json",
    content: <a valid MVPS Bundle per draft-melegassi-ippm-mvps-bundle>,
    mtime:   "2026-01-01T00:00:00Z" }
]
enc     = "br"
]]></artwork></figure>

<t>Conformance procedure:</t>

<t><list style="numbers" type="1">
  <t>Encode the MVPS Bundle into a SNAP Object O.</t>
  <t>Compute the MVPS coherence vector C(t) and the scalar H on the
pre-SNAP bundle (using the reference implementation referenced
in <xref target="MVPS-v4"/>).</t>
  <t>snap_decode(O) to recover bundle.json.</t>
  <t>Recompute C(t) and H on the recovered bundle.</t>
  <t>Assert: pre-SNAP C(t) == post-SNAP C(t), bit-for-bit.</t>
  <t>Assert: pre-SNAP H == post-SNAP H, bit-for-bit.</t>
  <t>Assert: pre-SNAP bundle bytes == post-SNAP bundle bytes.</t>
</list></t>

<t>A conforming SNAP implementation <bcp14>MUST</bcp14> pass all three assertions.
This vector is the direct empirical witness for Theorem M.1.</t>

</section>
<section anchor="conformance-procedure"><name>Conformance Procedure</name>

<t>A vendor implementation is conformance-tested by:</t>

<t><list style="numbers" type="1">
  <t>Running the Encoder against Vectors 1-2 with fixed inputs and
comparing the byte-exact JCS output and envelope hash.</t>
  <t>Running the Decoder against the published fixture objects and
verifying that all four vectors produce the expected result
(accept Vector 1-3, reject Vector 4).</t>
  <t>Publishing the result to the SNAP interoperability matrix.</t>
</list></t>

</section>
</section>
<section anchor="mvps-composition"><name>SNAP x MVPS Composition Theorems</name>

<t>This appendix establishes that SNAP composes with the MVPS family
<xref target="MVPS-v4"/> as an atomic transport substrate without altering any of
the MVPS guarantees.  Four composition theorems are proved.  Each is
testable against the validator scripts referenced in <xref target="MVPS-v4"/>.</t>

<section anchor="d1-theorem-m1-bundle-preservation"><name>D.1 Theorem M.1 (Bundle Preservation)</name>

<t><strong>Statement.</strong> Let B be a valid MVPS Bundle conforming to
<xref target="I-D.melegassi-ippm-mvps-bundle"/>.  Let O = snap_encode({B}, M) be
the SNAP Object that wraps B as its sole payload file.  Let
B' = snap_decode(O) be the restored bundle.  Then B' = B byte-for-byte
and every MVPS coherence axis (C_1, C_2, C_3) and the scalar H computed
on B' equals the value computed on B.</t>

<t><strong>Proof.</strong> By Theorem A.6 (Round-Trip Correctness), the SNAP decode
of an SNAP encode yields the original file set; in particular the
single file containing B is restored byte-identically.  Since C_1,
C_2, C_3 and H are pure functions of the bundle bytes (definitions
in <xref target="MVPS-v4"/> D1, D3, F1-F4, I1), they are invariant under any
byte-preserving transport.  Therefore the coherence axes and H
computed downstream of SNAP transport are identical to those computed
on B at the source.  QED.</t>

<t><strong>Corollary M.1.1.</strong> Theorem 1 of <xref target="MVPS-v4"/> (boundedness
H  in  [0, H_max]) is preserved through SNAP transport.</t>

<t><strong>Corollary M.1.2.</strong> Theorems 2 and 3' of <xref target="MVPS-v4"/> (FAR
calibration via Mahalanobis D^2) are preserved through SNAP
transport, including the operational contract OC3 (n_calib &gt;= 18,500
for +/-1% FAR precision).</t>

</section>
<section anchor="d2-theorem-m2-architectural-conformance"><name>D.2 Theorem M.2 (Architectural Conformance)</name>

<t><strong>Statement.</strong> A SNAP-based backup system that carries MVPS Bundles
between N &gt;= 3 vantages and a broker satisfies the MVPS Architecture
axioms A1..A5 of <xref target="I-D.melegassi-iab-mvps-architecture"/>, hence
inherits the Invariance Theorem and therefore Theorems 1, 2, 3, 3',
4, 5, 9 and Stein's Lemma verbatim.</t>

<t><strong>Proof.</strong> The axioms A1..A5 require:</t>

<t><list style="symbols">
  <t>A1 (Vantage independence): each SNAP-encoded bundle originates
from one vantage; the SNAP id (UUID v4) provides a globally unique
per-bundle identifier per RFC 4122.</t>
  <t>A2 (Bounded simplex on C  in  [0,1]^3): preserved by Theorem M.1
(byte-identical transport).</t>
  <t>A3 (Coordinated time window): the MVPS coordination_window is
carried as JSON inside the SNAP payload; per Theorem A.6 it is
restored exactly.</t>
  <t>A4 (Independent observers, basis for Stein's Lemma): the SNAP
transport adds no cross-vantage coupling because each SNAP Object
is an atomic, independent unit (Section 4.1 step 9).</t>
  <t>A5 (Falsifiable publication): the SNAP envelope hash (meta.hash)
is a publicly verifiable commitment to the carried bundle; any
receiver can recompute it and reject tampering (Section 4.2 step 3).</t>
</list></t>

<t>Therefore A1..A5 hold, and by the Invariance Theorem of
<xref target="I-D.melegassi-iab-mvps-architecture"/> the inherited MVPS theorems
hold.  QED.</t>

</section>
<section anchor="d3-theorem-m3-byzantine-resilient-backup"><name>D.3 Theorem M.3 (Byzantine-Resilient Backup)</name>

<t><strong>Statement.</strong> Suppose N &gt;= 3 vantages each encode their MVPS Bundle
as a SNAP Object and submit it to a broker.  Suppose at most f
vantages are Byzantine (arbitrarily faulty or adversarial).  If the
broker computes the geometric-median centroid of the per-vantage
coherence vectors recovered from the SNAP Objects, then the max-bias
on the centroid is bounded by:</t>

<figure><artwork><![CDATA[
|| m* - mu_0 || <= (2f / (N - 2f)) * sqrt(2)
]]></artwork></figure>

<t>provided N &gt; 2f.</t>

<t><strong>Proof.</strong> Theorem M.1 ensures that the broker recovers each
vantage's bundle exactly; therefore the post-SNAP coherence vectors
are identical to the pre-SNAP coherence vectors.  Theorem 9 of
<xref target="MVPS-v4"/> then applies verbatim: the geometric-median centroid
on N vectors with at most f corrupted is bounded by the stated
inequality (I12 = Minsker; Cohen et al.).  SNAP introduces no
additional attack surface because:</t>

<t><list style="numbers" type="1">
  <t>Each SNAP envelope hash is collision-resistant by Theorem A.2
(P(collision) ~= 8.6 x 10^-42 for n = 10^18 objects);</t>
  <t>Per-file SHA-256 manifest entries detect any modification of B
in transit by an active attacker who cannot also forge the
envelope hash (compound bound 2^-128 per file).</t>
</list></t>

<t>Therefore SNAP preserves the f-resilience floor of MVPS.  QED.</t>

<t><strong>Corollary M.3.1.</strong> The MVPS DDoS Resilience Profile (D-4) bound
of floor((k-1)/2) simultaneous regional attacks is preserved when
the SNAP transport is used for D-4 telemetry bundles.</t>

</section>
<section anchor="d4-theorem-m4-planetary-floor-for-snap-backup"><name>D.4 Theorem M.4 (Planetary Floor for SNAP Backup)</name>

<t><strong>Statement.</strong> Let S be a SNAP Object of compressed size |S| bytes
transported over a path with one-way light-time tau_light and
bandwidth B.  Then the SNAP backup achieves the MVPS planetary
coherence floor R* for backup, satisfying:</t>

<figure><artwork><![CDATA[
tau_snap_backup = 2 tau_light + |S| / B
                 <= R* + |S| / B
]]></artwork></figure>

<t>where R* is the planetary floor defined in
<xref target="I-D.melegassi-iab-mvps-planetary-floor"/>.</t>

<t><strong>Proof.</strong> SNAP delivers atomically in one round-trip (Theorem A.4),
so the only non-causal component of its latency is wire time |S|/B.
Special relativity establishes 2 tau_light as the lower bound on
RTT (T-1 of D-7 in <xref target="MVPS-v4"/>).  By the definition of R* (PCF),</t>

<figure><artwork><![CDATA[
R* >= tau_causal = 2 tau_light  (antipodal)
]]></artwork></figure>

<t>so tau_snap_backup &lt;= R* + |S| / B.  Therefore SNAP saturates the
tau_causal component of R* with zero protocol overhead, and adds
only wire time.  In particular, for |S| &lt;&lt; R* * B, SNAP backup is
tau_causal-bound.</t>

<t>For Earth-antipodal paths (R* ~= 145-196 ms per
<xref target="I-D.melegassi-iab-mvps-planetary-floor"/>) and |S| &lt;= 14,600 bytes
(single TCP initial congestion window), SNAP transport completes
within the planetary floor without bandwidth slack.  QED.</t>

<t><strong>Corollary M.4.1.</strong> Classical multi-phase backup protocols
(rsync &gt;= 3 RTT, BorgBackup repository handshake) violate the
tau_causal floor by a factor of k &gt;= 2 (Theorem A.4); SNAP does not.</t>

</section>
<section anchor="d5-operational-contracts-inherited-from-mvps"><name>D.5 Operational Contracts Inherited from MVPS</name>

<t>A SNAP implementation carrying MVPS data <bcp14>MUST</bcp14> honor the following
operational contracts from <xref target="MVPS-v4"/>:</t>

<t><list style="symbols">
  <t>OC1 (N &gt;= 3): At least three independent vantage SNAP Objects are
<bcp14>REQUIRED</bcp14> for geometric-median centroid computation downstream.</t>
  <t>OC2 (Sampling cadence G &gt;= W_max): SNAP delivery cadence <bcp14>MUST NOT</bcp14>
exceed the MVPS cadence guarantee; otherwise sub-sampling violates
the iid input assumption of the Mahalanobis statistic.</t>
  <t>OC3 (n_calib &gt;= 18,500): A SNAP-based backup of FAR-calibration
data <bcp14>MUST</bcp14> preserve a minimum of 18,500 calibration samples for
+/-1% FAR precision.</t>
  <t>OC4 (rank(Sigma) = 3): The bundle carried by SNAP <bcp14>MUST</bcp14> be
structurally complete; SNAP <bcp14>MUST NOT</bcp14> partition the bundle into
separate objects because that would destroy the full-rank
covariance.</t>
  <t>OC8 (Thresholds in [exp(-1), 1]): SNAP does not alter the MVPS
thresholds; preserved trivially by Theorem M.1.</t>
</list></t>

<t>The contracts OC5, OC6, OC7 of <xref target="MVPS-v4"/> are downstream concerns
of the MVPS analytic engine and are unaffected by the choice of
transport.</t>

</section>
<section anchor="d6-snap-mvps-traceability-matrix"><name>D.6 SNAP-MVPS Traceability Matrix</name>

<texttable>
      <ttcol align='left'>SNAP Theorem</ttcol>
      <ttcol align='left'>Inherits From</ttcol>
      <ttcol align='left'>Preserves</ttcol>
      <c>Theorem 1 (Encoder Determinism)</c>
      <c>RFC 8785 (JCS uniqueness)</c>
      <c>MVPS bundle byte-identity</c>
      <c>Theorem A.1 (Shannon bound)</c>
      <c>Shannon 1948</c>
      <c>MVPS payload minimality</c>
      <c>Theorem A.2 (SHA-256 collision)</c>
      <c>FIPS 180-4</c>
      <c>MVPS envelope integrity</c>
      <c>Theorem A.4 (Min RTT)</c>
      <c>Network theory</c>
      <c>MVPS PCF tau_causal saturation</c>
      <c>Theorem A.6 (Round-trip correctness)</c>
      <c>YANG schema closure</c>
      <c>MVPS coherence preservation</c>
      <c>Theorem M.1 (Bundle preservation)</c>
      <c>Theorem A.6</c>
      <c>MVPS Theorem 1, OC4</c>
      <c>Theorem M.2 (Architectural conformance)</c>
      <c>MVPS axioms A1..A5</c>
      <c>MVPS Invariance Theorem</c>
      <c>Theorem M.3 (Byzantine resilience)</c>
      <c>MVPS Theorem 9</c>
      <c>MVPS f/N max-bias floor</c>
      <c>Theorem M.4 (PCF backup)</c>
      <c>MVPS PCF D-15</c>
      <c>tau_causal saturation</c>
</texttable>

<t>Every SNAP claim therefore has a finite chase either to an IETF
RFC, to <xref target="MVPS-v4"/>, or to a foundational result (Shannon, Merkle,
Stein, FIPS).  No SNAP property is promoted to a theorem without
proof; all empirical observations are explicitly tagged as
conjectures in the same discipline as <xref target="MVPS-v4"/>.</t>

</section>
</section>
<section numbered="false" anchor="contributors"><name>Contributors</name>

<t>The following person contributed substantially to this document
but is not listed as an author for IETF stream-management
considerations (RFC 7322, Section 4.1.1):</t>

<figure><artwork><![CDATA[
Leonardo Melegassi
Catellix
Brazil
Email: melegassi@catellix.com
]]></artwork></figure>

<t>Leonardo Melegassi originated the SNAP design, authored the
initial wire-format specification, the YANG module, the
mathematical proof corpus (Appendix A), and the MVPS composition
theorems (Appendix D).  He also authored the broader MVPS family
of drafts (D-1, D-2, D-3, D-4, D-5, D-6, D-7, D-15, D-16) for
which SNAP serves as the atomic transport substrate.</t>

</section>
<section numbered="false" anchor="acknowledgments"><name>Acknowledgments</name>

<t>The authors thank the IETF DISPATCH, NETMOD, IPPM, BFD, and OPSAWG
working groups for their foundational work on YANG data modeling,
JSON encoding, and multi-vantage path measurement.  The mathematical
foundations of this work rest on the contributions of Claude Shannon
(1948), Ralph Merkle (1979), Charles Stein (1952), and the MVPS v4.0
proof catalogue <xref target="MVPS-v4"/>.</t>

<t>This document is the eleventh joint draft of the MVPS family
(D-1, D-2, D-3, D-4, D-5, D-6, D-7, D-15, D-16, plus the SNAP
substrate defined here) and the first to standardize the atomic
transport unit on which the rest of the family operationally
depends.  All composition theorems in <xref target="mvps-composition"/> are
validated against the same 44/44 attack-defense suite that
disciplines <xref target="MVPS-v4"/>.</t>

<t>The author team for this document brings together five independent
organizations spanning network operations (e.Mix, Vero Internet),
infrastructure integration (Sysbrasil Tecnologia), cloud storage
(Zadara), and consulting (OrcaTI).  This multi-vendor authorship is
itself a deliberate operational anchor for the document: by
construction, the SNAP format <bcp14>MUST</bcp14> be implementable by all five
author organizations in their existing technology stacks, ensuring
that no single-vendor design bias contaminates the specification.</t>

<t>The authors also gratefully acknowledge Leonardo Melegassi
(Catellix), listed in the Contributors section, who originated the
SNAP design as the atomic transport substrate for the MVPS family
of drafts and contributed the initial specification, the YANG
module, and the mathematical proof corpus on which this document is
built.</t>

</section>
<section numbered="false" anchor="change-log"><name>Change Log</name>

<section numbered="false" anchor="changelog-v01"><name>Version -01</name>

<t>Editorial only.  No technical changes to the SNAP wire format, the
YANG module, or any theorem/proof.</t>

<t><list style="symbols">
  <t>Replaced all non-ASCII characters in the running text with ASCII
equivalents (for example, "&lt;=" for U+2264, "Section " for
U+00A7, "--" for U+2014, "^2" for U+00B2, "x" for U+00D7, "_i"
for U+1D62), so that the document passes "idnits 2.17.1"
cleanly under the strict ASCII-only checklist.  All mathematical
formulas and section references retain their semantic meaning.</t>
  <t>Reorganised the author list to five authors with a separate
Contributors section, per RFC 7322 Section 4.1.1 guidance on
excessive author counts.</t>
  <t>Bumped document version to -01.</t>
</list></t>

</section>
<section numbered="false" anchor="changelog-v00"><name>Version -00</name>

<t>Initial version.  Cancelled and republished as -01.</t>

</section>
</section>


  </back>

<!-- ##markdown-source:
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
xmGjwoh45+DHnklKE5M1yNHZojEl9kpPDXebGxu2YUc8jyuxrBgCzJtkIrVF
44m6gsFccxWDUs2VtukRvtzbhdqxAFsvIF8tllm+REJFkYqMTJqAaESaGsmq
fUI6DKQ4duZb4z2EM2Gk5/GHBKbAg4sjohLybq5lLDCxgk0KVkwd9sYWBCX8
OMbthsTNM0jE7HOxMICYJ1IDv35kHTnyfdsSsgLdxF5FFp11iHi0Tk8wMIul
c69ijZJyDzeRT5sUCCFVXtJrrVD3P1NPp6T04B2E58xdHKOS8fGVNUJYLx31
CLpg1vq/9X7dCHfffb8mE/lcn7L1Gkpkk+K9cyFJt84WaW2ur/f/enree33y
hn7bs9yc21fy1I3e6mo8tSQszbLesuI5dacuYrs2PBMzZemTFFlx45l7UNmU
qi3T7okFhvZ488dKf/1H+mPbp69SIT0GXBum0LL7FabORTnMT/84ORPdSAFa
8SA2T26UrUxu0Dg5j7K2nOFzdaKwx/a8d2X31B7nBfiUyuIXlsUlWay597C0
70uSBq+xeVVsBK6va/MRoJdKSdOCYDj+whS58Imn1/hKmLVRmNUfNtrLvqzz
ZF8jhpilsNqKVs6VaR1+g9vM2Z9Wz0aZYMymgG8462qcw3mPwut3D9vDz187
9ZWsK8+Ca1HT9gmD7Y9r1n7Lnyy8vmTErZttsVtc84Yttx7piHXz19ZI2POs
qh1072ISwdHBxiZLfGdbV02JYvsV41sJ1NJtrDx7hXRbiJynaWGquUONQoQR
Z7RqpnYuK6FnYjJnFxxSLuZxafe3YZ7a1I3ZNQjgF7s1IijXPLvtmnIjI/6m
KiOw6OGxCIukM+A9F5dBaTX7tIluNDMCWq6NkVgjUr5WDYwoj85qhEQtPqJl
EbJcRDKpzp+1quUymfwHk/9pmo44MFkV+zLeV1O5aUJNwiB+/mQ0BYdCucYg
MgjgKGlQjQJxuSvEe0ghHJ7kW5nkyZGbJAd6N4jHb8/fkIyq+mgDDNX82ADI
SqDFfwDRy68Fd3ioQbTj7eVhOft2odEhYXp9Dcurw6HvOaxnDaEWa/9Y69TQ
ojx+eTZ2a2rGVhFn7T6Prb8lc1Eg8SREThzile3ZUaDBVOuxnybaKu/Ob0gO
bfV7vcHWpsdjPru/muH5KGN+8SeDT3x80OBGNqPIdqgtG4RZ0wjjiS/j+Evm
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
IRNQeaT/A1iphDUF3wAA

-->

</rfc>

