<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.43 (Ruby 3.3.8) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-holmgren-at-repository-04" category="std" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.35.0 -->
  <front>
    <title abbrev="AT Repo">Authenticated Transfer: Repository and Synchronization</title>
    <seriesInfo name="Internet-Draft" value="draft-holmgren-at-repository-04"/>
    <author fullname="Daniel Holmgren">
      <organization>Bluesky Social</organization>
      <address>
        <email>daniel@blueskyweb.xyz</email>
      </address>
    </author>
    <author fullname="Bryan Newbold">
      <organization>Bluesky Social</organization>
      <address>
        <email>bryan@blueskyweb.xyz</email>
      </address>
    </author>
    <date year="2026" month="November" day="02"/>
    <area>Applications and Real-Time Area</area>
    <workgroup>Authenticated Transfer</workgroup>
    <abstract>
      <?line 90?>

<t>This document specifies a repository data structure and synchronization mechanisms for public data as part of the Authenticated Transfer Protocol (ATP). It describes encoding formats for both individual data records and entire repositories. The repository data structure is content-addressable and cryptographically authenticated. For synchronization, it specifies both a low-latency streaming protocol over WebSocket, and a full-repository fetch mechanism over HTTP.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-holmgren-at-repository/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Authenticated Transfer Working Group mailing list (<eref target="mailto:atp@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/atp/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/atp/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/ietf-wg-atp/drafts"/>.</t>
    </note>
  </front>
  <middle>
    <?line 94?>

<section anchor="intro">
      <name>Introduction</name>
      <t>The Authenticated Transfer Protocol (ATP) enables the creation of decentralized networks for publication of self-certifying data. An introduction to the overall protocol architecture is given in <xref target="AT-ARCH"/>.</t>
      <t>User accounts publish structured data records to the network by including them in their public repository. Records within a repository are identified by a unique path and current content version (hash). Records can be created, updated, and deleted at any time. Repositories contain the complete set of current records for the account, and do not include or reveal the existence of previous content.</t>
      <t>The repository structure includes the account's persistent identifier, and the overall repository structure is cryptographically signed. The authenticity of the entire repository can be verified by resolving the account identifier to the current public key. Data records are not signed individually. Details of account identifier systems and their resolution process are out of scope for this document.</t>
      <t>Large binary data such as images and media files are not stored directly within repositories. Instead, such data is stored externally and referenced in records by a content hash link.</t>
      <t>The protocol provides efficient synchronization mechanisms for propagating public repository state changes across the network, supporting both low-latency streaming updates and bulk synchronization scenarios. Synchronization can take place between any two parties, from an upstream publisher to a downstream consumer. Intermediate parties can redistribute ("relay") data, and consumers can cryptographically verify the integrity and authenticity of received repository data. This allows for flexibility in network topology to improve overall network resilience and efficiency.</t>
      <t>Consumers can confirm the integrity of the entire repository to detect dropped or withheld updates. The protocol allows consumers to maintain partial replicas (eg, of only specific record types). It is also possible to request verifiable "inclusion proofs" for individual records on demand.</t>
      <t>This document describes two synchronization mechanisms. Complete serialized repositories can be fetched over HTTP as a snapshot. Updates to one or more repositories can be distributed as a stream of messages. This document describes both a generic structure and semantics for streaming messages, and a specific WebSocket transport and message encoding scheme.</t>
      <t>This document describes version <tt>3</tt> of the repository format.</t>
    </section>
    <section anchor="repo-semantics">
      <name>Repository Semantics</name>
      <t>Records within a repository are discrete units of structured data, identified by a unique path and versioned by content hash. Records conform to a generic data model, but the content, schema, and semantics of records are varied and application-specific. Records are grouped by type under "collections".</t>
      <t>The current state of a repository is summarized in a signed "commit". Any change to the contents of the repository updates the current commit. Commits for an individual account's repository are serialized using a monotonically increasing "revision" identifier.</t>
      <t>Updates to repositories may include operations on multiple records in a batch mutation that results in a single signed commit. Implementations should apply practical limits on batch sizes to support efficient processing and distribution of repository changes.</t>
      <section anchor="account-ids">
        <name>Account Identifiers</name>
        <t>Repository commit objects (<xref target="commits"/>) contain a persistent account identifier, which indicates the publisher of the repository. This account identifier can be resolved to obtain the current cryptographic public keys for the account, and those keys can be used to verify the authenticity of the repository and the records it contains.</t>
        <t>The keys associated with an account may be rotated over time. The most recent commit must always be verifiable using the currently resolvable signing key. When rotating signing keys, a new repository commit must be created, even if the contents and structure of the repository remain unchanged.</t>
        <t>This document does not include details or recommendations on account identifier systems.</t>
      </section>
      <section anchor="revs">
        <name>Revisions</name>
        <t>Repository commits include a revision field (<tt>rev</tt>) that acts as a logical clock for updates to the repository over time. The revision string is a Timestamp Identifier (TID) as described in <xref target="tid"/>.</t>
        <t>Revisions may be used when comparing two versions of a repository to determine which is more recent. This is particularly relevant when synchronizing repositories indirectly, or from multiple sources over time.</t>
        <t>If a commit TID value corresponds to a timestamp in the future (beyond a short period to accommodate clock drift), the commit SHOULD be ignored. This is to ensure that a newly published commit (with a TID corresponding to the current time) will reliably be accepted as current by the entire network.</t>
      </section>
    </section>
    <section anchor="repo-structure">
      <name>Repository Structure</name>
      <t>Repositories are structured as a Merkle Search Tree (<xref target="mst"/>) with a cryptographically signed commit object referencing the tree root.</t>
      <t>The MST structure provides several fundamental properties for repository operations. As a content-addressed structure, it enables efficient verification of data. The MST maintains lexicographic key ordering, enabling structural sharing of intermediate tree nodes for related records. It is probabilistically self-balancing, offering consistent performance characteristics. Additionally, the MST exhibits unicity, meaning that any given set of keys and values will always produce the same tree structure and root hash regardless of insertion order.</t>
      <t>Repository contents are encoded using deterministic CBOR serialization and organized as a directed acyclic graph where data objects reference each other through content hashes. These hash-identified data objects, referred to as "blocks," include three distinct types: commit objects, MST internal nodes, and data records.</t>
      <section anchor="repo-path">
        <name>Record Paths</name>
        <t>Records within a repository are identified by a non-empty case-sensitive ASCII string called the "path". Records are stored sorted lexicographically by path, and the efficiency of some repository operations is impacted by sort order.</t>
        <t>A path string is the combination of a collection type name and a record key, joined by a single forward slash character: <tt>&lt;collection&gt;/&lt;record-key&gt;</tt>. A path MUST consist of exactly two segments separated by <tt>/</tt>, with no leading or trailing slash.</t>
        <t>Collection names use the Namespaced Identifier (NSID) syntax described in <xref target="nsid"/>. They have a prefix-ordered namespace structure, which means that records of the same collection are stored adjacently, and that collections under the same authority are grouped together. When included in record paths, NSIDs must have normalized casing, and paths with non-normalized casing MUST be rejected.</t>
        <t>Record keys uniquely identify records within a collection. Record keys are case-sensitive and MUST satisfy the following syntax:</t>
        <ul spacing="normal">
          <li>
            <t>Allowed characters are ASCII alphanumerics (<tt>A-Z</tt>, <tt>a-z</tt>, <tt>0-9</tt>), period (<tt>.</tt>), hyphen (<tt>-</tt>), underscore (<tt>_</tt>), colon (<tt>:</tt>), and tilde (<tt>~</tt>)</t>
          </li>
          <li>
            <t>Length between 1 and 512 characters (inclusive)</t>
          </li>
          <li>
            <t>The literal values <tt>.</tt> and <tt>..</tt> are prohibited</t>
          </li>
        </ul>
        <t>The syntax of record keys may be constrained further on a per-collection basis at the application layer. A common choice is to use the Timestamp Identifier (TID) (<xref target="tid"/>) syntax, which results in lexicographic sorting by time within a collection. This means that "new" records are all grouped together within a given collection.</t>
        <t>Note that both the NSID and record key string syntaxes are valid path components as defined in Section 3.3 of <xref target="RFC3986"/>. It is important to maintain this property.</t>
      </section>
      <section anchor="commits">
        <name>Commit Objects</name>
        <t>Commit objects serve as the authoritative root of each repository, establishing cryptographic ownership and providing a verifiable reference to the state of a repository at a particular point in time. Each commit is digitally signed by the repository account owner and contains metadata necessary for verification.</t>
        <t>A commit object contains the following data fields:</t>
        <ul spacing="normal">
          <li>
            <t><strong><tt>did</tt></strong> (string, required): The resolvable account identifier associated with the repository as described in <xref target="account-ids"/></t>
          </li>
          <li>
            <t><strong><tt>version</tt></strong> (integer, required): Repository format version, fixed value of <strong><tt>3</tt></strong> for the current specification</t>
          </li>
          <li>
            <t><strong><tt>data</tt></strong> (CID link, required): Content hash link to the root of the repository's MST structure</t>
          </li>
          <li>
            <t><strong><tt>rev</tt></strong> (string, required): Repository revision identifier that functions as a logical clock and must increase monotonically (see <xref target="revs"/>). Syntax MUST match <xref target="tid"/>.</t>
          </li>
          <li>
            <t><strong><tt>prev</tt></strong> (CID link, optional and nullable): Optional content hash link to the previous commit object in the repository's history chain. While included for backward compatibility with version 2 repositories, this field is typically <tt>null</tt> in version 3 implementations</t>
          </li>
          <li>
            <t><strong><tt>sig</tt></strong> (byte array, required): Cryptographic signature over the commit contents.</t>
          </li>
        </ul>
        <t>Commit objects are signed by the key declared by the repository owner's resolvable identifier. Neither the signature nor the signed commit object contains information about the curve type or specific public key used for signing. This information must be obtained by resolving the account identifier as described in <xref target="account-ids"/>.</t>
        <t>The procedure for signing commit objects:</t>
        <ol spacing="normal" type="1"><li>
            <t>Encode the unsigned commit object (with <tt>sig</tt> field entirely absent) as CBOR</t>
          </li>
          <li>
            <t>Sign the encoded bytes as described in <xref target="crypto"/></t>
          </li>
          <li>
            <t>Include the signature bytes in the <tt>sig</tt> field</t>
          </li>
        </ol>
        <t>To verify the signature, remove the <tt>sig</tt> field and encode the unsigned commit object as CBOR. Then verify the signature against those encoded bytes.</t>
      </section>
      <section anchor="records">
        <name>Records</name>
        <t>Records stored within a repository are always objects (or "maps") encoded as CBOR, following the data model and encoding rules described in <xref target="data-model"/>. Each record must include a top-level field named <tt>$type</tt> with a string value matching the collection type name (NSID) of the path that the record is stored at. NSIDs in this context must have normalized casing, and records with non-normalized NSID in <tt>$type</tt> must be rejected.</t>
        <t>Invalid or corrupt data in individual records should not impact processing of the overall repository data structure, or the processing of other valid records in the same repository.</t>
      </section>
    </section>
    <section anchor="mst">
      <name>Merkle Search Tree</name>
      <t>The Merkle Search Tree (MST) structure is deterministically reproducible from any given key-value mapping, where keys are non-empty byte strings (corresponding to a path) and values are content hash link references to records. This deterministic construction ensures that identical input sets always produce the same root hash regardless of insertion order.</t>
      <t>The tree's structural organization depends solely on the keys present, not on the record values they reference. When a record value changes, the new content hash propagates up through the tree nodes to the root, but the tree's shape and node organization remain unchanged.</t>
      <t>The MST data structure was first published in <xref target="MSTPAPER"/>.</t>
      <section anchor="mst-structure">
        <name>Tree Structure</name>
        <t>Each MST node contains a list of key-value entries and references to child subtrees. Entries and subtree links are maintained in lexicographic order, with all keys in a linked subtree falling within the range corresponding to that link's position. The ordering proceeds from left (lexicographically first) to right (lexicographically last). Unlike the CBOR encoding map key sorting order (described in <xref target="cbor-encoding"/>), tree keys are not sorted length-first.</t>
        <t>Keys are assigned to tree levels based on a layer value computed from the key itself. Nodes at each level only contain keys with the corresponding layer value, while subtree links point to nodes containing keys that fall within specific lexicographic ranges but have lower layer values. Adjacent keys may appear within the same node, but adjacent subtrees must be separated by at least one key entry to prevent structural ambiguity.</t>
      </section>
      <section anchor="mst-layer">
        <name>Layer Calculation</name>
        <t>The layer for a given key is calculated using SHA-256 with a 2-bit grouping scheme that provides an average fanout of 4:</t>
        <ol spacing="normal" type="1"><li>
            <t>Compute the SHA-256 hash of the key (byte string) with binary output</t>
          </li>
          <li>
            <t>Count the number of leading binary zeros in the hash</t>
          </li>
          <li>
            <t>Divide by 2, rounding down to the nearest integer</t>
          </li>
        </ol>
        <t>Examples of layer calculation:</t>
        <ul spacing="normal">
          <li>
            <t><tt>key1</tt>: SHA-256 begins <tt>100000010111...</tt> → layer 0</t>
          </li>
          <li>
            <t><tt>key7</tt>: SHA-256 begins <tt>000111100011...</tt> → layer 1</t>
          </li>
          <li>
            <t><tt>key515</tt>: SHA-256 begins <tt>000000000111...</tt> → layer 4</t>
          </li>
        </ul>
        <t>When processing the MST structure, implementations must verify the layer assignment and ordering of keys. While this verification is most essential for untrusted inputs, implementations should perform these checks consistently regardless of data source. Additional validation of node size limits and other structural parameters is required to prevent resource exhaustion attacks, as detailed in Security Considerations (<xref target="security"/>).</t>
      </section>
      <section anchor="mst-example">
        <name>MST Construction Example</name>
        <t>The following is a Merkle Search Tree containing 9 records with keys A-I. Each key would include a pointer to some record hash, though that hash is irrelevant to the construction of the tree. Each asterisk (<tt>*</tt>) represents a content hash link to the subtree under it.</t>
        <t>For the sake of illustration, assume the following layer calculations:</t>
        <ul spacing="normal">
          <li>
            <t><tt>layer(D) = 2</tt></t>
          </li>
          <li>
            <t><tt>layer(A|E|I) = 1</tt></t>
          </li>
          <li>
            <t><tt>layer(B|C|F|G|H) = 0</tt></t>
          </li>
        </ul>
        <figure anchor="f-mst-example">
          <name>Example MST Structure</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="240" width="168" viewBox="0 0 168 240" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px">
                <path d="M 24,80 L 24,120" fill="none" stroke="black"/>
                <path d="M 40,144 L 40,184" fill="none" stroke="black"/>
                <path d="M 80,32 L 80,56" fill="none" stroke="black"/>
                <path d="M 136,80 L 136,120" fill="none" stroke="black"/>
                <path d="M 136,136 L 136,184" fill="none" stroke="black"/>
                <path d="M 32,64 L 128,64" fill="none" stroke="black"/>
                <path d="M 16,128 L 32,128" fill="none" stroke="black"/>
                <path d="M 120,128 L 152,128" fill="none" stroke="black"/>
                <path d="M 32,192 L 48,192" fill="none" stroke="black"/>
                <path d="M 120,192 L 152,192" fill="none" stroke="black"/>
                <circle cx="24" cy="96" r="6" class="closeddot" fill="black"/>
                <circle cx="40" cy="160" r="6" class="closeddot" fill="black"/>
                <circle cx="80" cy="32" r="6" class="closeddot" fill="black"/>
                <circle cx="136" cy="96" r="6" class="closeddot" fill="black"/>
                <circle cx="136" cy="160" r="6" class="closeddot" fill="black"/>
                <g class="text">
                  <text x="80" y="84">|</text>
                  <text x="80" y="100">D</text>
                  <text x="8" y="148">|</text>
                  <text x="112" y="148">|</text>
                  <text x="160" y="148">|</text>
                  <text x="8" y="164">A</text>
                  <text x="112" y="164">E</text>
                  <text x="160" y="164">I</text>
                  <text x="24" y="212">|</text>
                  <text x="56" y="212">|</text>
                  <text x="112" y="212">|</text>
                  <text x="136" y="212">|</text>
                  <text x="160" y="212">|</text>
                  <text x="24" y="228">B</text>
                  <text x="56" y="228">C</text>
                  <text x="112" y="228">F</text>
                  <text x="136" y="228">G</text>
                  <text x="160" y="228">H</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
         *
         |
   -------------
  |      |      |
  *      D      *
  |             |
 ---          -----
|   |        |  |  |
A   *        E  *  I
    |           |
   ---        -----
  |   |      |  |  |
  B   C      F  G  H
]]></artwork>
          </artset>
        </figure>
      </section>
      <section anchor="mst-empty-nodes">
        <name>Empty Nodes</name>
        <t>An empty repository containing no records is represented as a single MST node with no entries (leaves or subtree links). This is the only case where an entirely empty node is permitted.</t>
        <t>Nodes that contain no key/value entries but do contain a subtree link are sometimes necessary at intermediate positions, and are allowed provided those subtrees eventually contain one or more key entries. However, such nodes MUST NOT appear at the root position — the root MUST either contain key entries or be the special case of a completely empty repository. Similarly, nodes without key entries MUST NOT appear at leaf positions except for the empty repository case.</t>
        <t>This structure ensures that nodes lacking key-value entries are pruned from the top and bottom of the tree while preserving intermediate nodes that maintain proper height relationships and prevent subtree links from skipping layers.</t>
      </section>
      <section anchor="mst-nodes">
        <name>MST Node Schema</name>
        <t>Given their prevalence throughout the repository structure, MST nodes require a compact binary representation for storage efficiency. Keys within each node use prefix compression, where each entry specifies the number of bytes it shares with the preceding key in the array. The first entry in each node contains the complete key with a prefix length of zero. This compression applies only within individual nodes and does not extend across node boundaries. The compression scheme is mandatory to ensure deterministic MST structure across all implementations.</t>
        <t>MST nodes contain the following fields:</t>
        <ul spacing="normal">
          <li>
            <t><tt>l</tt> (CID link, required but nullable): Reference to a subtree node at a lower layer containing keys that sort lexicographically before all keys in the current node</t>
          </li>
          <li>
            <t><tt>e</tt> (array, required): Ordered array of entry objects, each containing:
            </t>
            <ul spacing="normal">
              <li>
                <t><tt>p</tt> (integer, required): Number of bytes shared with the previous entry in this node</t>
              </li>
              <li>
                <t><tt>k</tt> (byte string, required): Key suffix remaining after removing the shared prefix bytes</t>
              </li>
              <li>
                <t><tt>v</tt> (CID link, required): Reference to the record data for this entry</t>
              </li>
              <li>
                <t><tt>t</tt> (CID link, required but nullable): Reference to a subtree node at a lower layer containing keys that sort after this entry's key but before the next entry's key in the current node</t>
              </li>
            </ul>
          </li>
        </ul>
        <t>Content hash links appearing within an MST node — the <tt>l</tt> and <tt>t</tt> subtree links, and the <tt>v</tt> record link — MUST use the constrained format defined in <xref target="cid-link"/> for referencing CBOR encoded data.</t>
      </section>
      <section anchor="mst-node-example">
        <name>MST Node Example</name>
        <t>The following example shows an MST node at layer 1 containing two subtree pointers and two key-value entries. The node contents in order are:</t>
        <ul spacing="normal">
          <li>
            <t>Left subtree: content hash link <tt>0x01711220643b9326...</tt></t>
          </li>
          <li>
            <t>Entry: <tt>key10</tt> → record content hash link <tt>0x017112202d9aa87e...</tt></t>
          </li>
          <li>
            <t>Right subtree: content hash link <tt>0x0171122047e2886f...</tt></t>
          </li>
          <li>
            <t>Entry: <tt>key7</tt> → record content hash link <tt>0x0171122010b6da2c...</tt></t>
          </li>
        </ul>
        <t>This node would be encoded as follows:</t>
        <artwork><![CDATA[
{
  l: 0x01711220643b9326...
  e: [
    {
      p: 0,
      k: "key10",
      v: 0x017112202d9aa87e...
      t: 0x0171122047e2886f...
    },
    {
      p: 3,
      k: "7",
      v: 0x0171122010b6da2c...
      t: null
    }
  ]
}
]]></artwork>
      </section>
    </section>
    <section anchor="serialization">
      <name>Repository Serialization Format</name>
      <t>Repositories are serialized for transmission and storage as a concatenated sequence of block data, where blocks represent the CBOR-encoded records, MST nodes, and commit objects that comprise the repository structure. The serialization is prefixed with a header that references the repository's commit object as the "root" block.</t>
      <t>Serialized repositories may contain partial repository state, such as when transmitting cryptographic proofs for specific records. In these situations, they may not include unrelated MST nodes or records outside the proof path.</t>
      <t>For historical reasons, the recommended Media Type for this serialization format is <tt>application/vnd.ipld.car</tt>.</t>
      <t>The block-and-header layout described here is compatible with Content-Addressable archive (CAR) formats such as <xref target="DASL-CAR"/>.</t>
      <section anchor="serialization-header">
        <name>Header Format</name>
        <t>The header is constructed by CBOR-encoding an object with the following fields:</t>
        <ul spacing="normal">
          <li>
            <t><tt>version</tt> (integer, required): Fixed value of <tt>1</tt></t>
          </li>
          <li>
            <t><tt>roots</tt> (CID link array, required): Single-element array containing the content hash link of the commit block</t>
          </li>
        </ul>
        <t>The CBOR-encoded header is prefixed with its byte length encoded as an unsigned LEB128 integer as described in Section 5.2.2 of <xref target="WEBASSEMBLY"/>.</t>
      </section>
      <section anchor="serialization-blocks">
        <name>Block Format</name>
        <t>Following the header, each repository block is serialized by concatenating:</t>
        <ol spacing="normal" type="1"><li>
            <t>The combined byte length of the following two components, encoded as an unsigned LEB128 integer</t>
          </li>
          <li>
            <t>The block's content hash in binary encoding as specified in <xref target="cid-link"/> (always 36 bytes)</t>
          </li>
          <li>
            <t>The CBOR-encoded block data</t>
          </li>
        </ol>
        <figure anchor="f-serialization">
          <name>Repository Serialization Layout</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="64" width="600" viewBox="0 0 600 64" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px">
                <path d="M 16,32 L 64,32" fill="none" stroke="black"/>
                <path d="M 136,32 L 184,32" fill="none" stroke="black"/>
                <path d="M 216,32 L 376,32" fill="none" stroke="black"/>
                <path d="M 432,32 L 584,32" fill="none" stroke="black"/>
                <g class="text">
                  <text x="8" y="36">|</text>
                  <text x="100" y="36">Header</text>
                  <text x="192" y="36">|</text>
                  <text x="208" y="36">|</text>
                  <text x="404" y="36">Data</text>
                  <text x="592" y="36">|</text>
                  <text x="16" y="52">[</text>
                  <text x="40" y="52">len</text>
                  <text x="64" y="52">|</text>
                  <text x="100" y="52">header</text>
                  <text x="152" y="52">block</text>
                  <text x="184" y="52">]</text>
                  <text x="216" y="52">[</text>
                  <text x="240" y="52">len</text>
                  <text x="264" y="52">|</text>
                  <text x="292" y="52">hash</text>
                  <text x="320" y="52">|</text>
                  <text x="352" y="52">block</text>
                  <text x="384" y="52">]</text>
                  <text x="400" y="52">[</text>
                  <text x="424" y="52">len</text>
                  <text x="448" y="52">|</text>
                  <text x="476" y="52">hash</text>
                  <text x="504" y="52">|</text>
                  <text x="536" y="52">block</text>
                  <text x="568" y="52">]</text>
                  <text x="584" y="52">…</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
|------- Header -------| |--------------------- Data --------------------|
 [ len | header block ]   [ len | hash | block ] [ len | hash | block ] …
]]></artwork>
          </artset>
        </figure>
        <t>The block content hash MUST match the block data.</t>
      </section>
      <section anchor="serialization-ordering">
        <name>Block Ordering</name>
        <t>Producers SHOULD emit blocks in pre-order traversal of the included repository portion: header, commit object, root MST node, then a recursive depth-first interleaving of subtree nodes and the records they reference.</t>
        <t>Preorder traversal enables streaming verification of repositories, allowing parsers to walk the MST structure and output key-to-record mappings while maintaining minimal MST state in memory. This approach supports efficient stream processing of large repositories without requiring complete buffering of the serialized data.</t>
        <t>Parsers MUST tolerate other block orderings, duplicate occurrences of the same block, and additional unrelated blocks. Specifically:</t>
        <ul spacing="normal">
          <li>
            <t>Duplicate blocks SHOULD be deduplicated rather than treated as an error.</t>
          </li>
          <li>
            <t>Dangling references — for example, content hash links pointing to records or blobs that are not present in the serialized data — MAY be present and unresolvable; this is not an error in itself.</t>
          </li>
          <li>
            <t>Unrelated blocks not referenced by the repository structure SHOULD be ignored. Excessive quantities of such blocks MAY be treated as a form of resource abuse; see <xref target="security"/>.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="accounts">
      <name>Account Hosting</name>
      <t>Each node in the network that synchronizes, stores, and distributes repository data maintains hosting status for each account. The status indicates whether the account is "active" in the network, or has been temporarily or permanently removed, in which case repository data should not be synchronized further. Hosting status can be set by the account holder themselves or their canonical hosting provider, and changes propagate to downstream consumers throughout the network. Each downstream service or node in the network may set a local inactive hosting status, declining to distribute that account's repository data.</t>
      <t>Each account has a persistent identifier that can be resolved to both a public key and a canonical hosting location. Account identifier systems and their resolution mechanisms are out of scope for this document. Account hosting status is maintained and transmitted over the synchronization protocol, separate from the lifecycle of account identifiers.</t>
      <t>The account hosting status itself may always be redistributed, even for inactive accounts.</t>
      <section anchor="account-status">
        <name>Hosting Status</name>
        <t>Account hosting status at any point in time can be summarized as the boolean state of being "active" or not. If the account hosting status is not active, repository data for that account MUST NOT be redistributed. Additional context may be provided using a "status" vocabulary, represented as a string. Account status is represented and transmitted as an <tt>active</tt> boolean (required) and a <tt>status</tt> string (optional) together.</t>
        <t>The defined status values and their meanings are:</t>
        <ul spacing="normal">
          <li>
            <t><tt>deleted</tt> (<tt>active</tt> is false): the user or host has deleted the account. Account data SHOULD be removed from the service's infrastructure within a reasonable time frame. Implied to be permanent, but MAY be reverted.</t>
          </li>
          <li>
            <t><tt>deactivated</tt> (<tt>active</tt> is false): the user has temporarily paused the account. Account data MUST NOT be redistributed but does not need to be deleted from infrastructure. Implied time-limited.</t>
          </li>
          <li>
            <t><tt>takendown</tt> (<tt>active</tt> is false): the host or service has taken down the account. Implied to be indefinite in duration, but MAY be reverted.</t>
          </li>
          <li>
            <t><tt>suspended</tt> (<tt>active</tt> is false): the host or service has temporarily paused the account. Implied time-limited.</t>
          </li>
        </ul>
        <t>Two additional status values are relevant to the synchronization process itself, and do not imply that the overall hosting status is inactive:</t>
        <ul spacing="normal">
          <li>
            <t><tt>desynchronized</tt> (<tt>active</tt> MAY be true): the service has detected a problem synchronizing the account's repository and may be missing content.</t>
          </li>
          <li>
            <t><tt>throttled</tt> (<tt>active</tt> MAY be true): the service has paused processing of new content for this account because a rate limit has been exceeded.</t>
          </li>
        </ul>
        <t>There are no defined status strings to represent generic active status (<tt>active</tt> is true) or generic inactive status. The status string MAY be omitted.</t>
        <t>New status values may be defined in the future. Producers MAY emit <tt>status</tt> strings not listed above, and consumers MUST tolerate unrecognized values. Consumers MUST use the <tt>active</tt> boolean as the authoritative indicator of overall account visibility, treating the <tt>status</tt> string as clarification that may inform more specific behavior (for example, whether to delete cached data versus retain it pending reactivation).</t>
        <t>Producers expose an HTTPS request-response operation that, given an account identifier, returns the producer's current hosting status for that account. This allows consumers to query the present state of an account without subscribing to the message stream — for example, when establishing initial state for an account they have not seen before, or when reconciling diverging upstream reports.</t>
        <t>The details of the HTTPS request endpoint, the URL path, and the response media type are not specified by this document.</t>
      </section>
      <section anchor="account-status-propagation">
        <name>Status Propagation</name>
        <t>Account hosting status is not cryptographically authenticated. Status propagates hop-by-hop via streaming synchronization (<xref target="stream-sync"/>): each node emits an <tt>#account</tt> message (<xref target="msg-account"/>) to downstream consumers when the hosting status for an account changes. For intermediate synchronization nodes, this includes changes driven by an <tt>#account</tt> message received from an upstream.</t>
        <t>Intermediaries MAY override their upstream's status. For example, a relaying node may take down an account that an upstream still reports as active. Such overrides are propagated downstream as <tt>#account</tt> messages from the intermediary.</t>
        <t>When an upstream service is unreachable, downstream services SHOULD retain the previously reported status for some implementation-defined period rather than immediately changing the account to an inactive state. This preserves availability across short upstream outages, and increases resiliency of the network.</t>
        <t>When account status reported by different upstreams diverges (for example, due to differing moderation policies, or a transient network partition between an upstream and its own upstream), services apply their own policies to reconcile. Querying the account's current authoritative hosting service directly is one way to resolve such ambiguity.</t>
      </section>
    </section>
    <section anchor="snapshot-sync">
      <name>Snapshot Sync</name>
      <t>Consumers can retrieve a full serialized snapshot of an account's current repository at any point in time. This can be used to initialize synchronization state for the account during a bootstrap or backfill phase, or to re-synchronize (<xref target="resync"/>) and reconcile after any discontinuity in the streaming synchronization mechanism. It is also an option for applications and use cases that do not require continuous updates or synchronization over time.</t>
      <t>A full repository snapshot must include the commit object, all MST nodes, and all records. It does not include blob files (<xref target="blob"/>).</t>
      <t>Producers expose an HTTP API endpoint which takes an account identifier as a parameter, and returns the serialized repository as the response body. If the account hosting status at the producer is not "active", this is indicated in an error response.</t>
      <t>A producer MAY redirect the request to another producer that holds the requested data — for example, a relaying service redirecting to the account's canonical host, or to a mirroring service with the content cached. Consumers SHOULD follow such HTTP redirects when re-synchronizing per <xref target="resync"/>.</t>
    </section>
    <section anchor="stream-sync">
      <name>Streaming Sync</name>
      <t>This section describes a low-latency streaming synchronization mechanism which allows consumers to receive repository updates with minimal latency through a WebSocket <xref target="RFC6455"/> connection that they initiate. Streams can contain updates from many distinct account repositories, even aggregating all updates in the network. In addition to repository updates, they include updates to account hosting status and network identities. Whether encompassing the full network or any subset of it, a stream is often referred to as a "firehose".</t>
      <t>To ensure reliable delivery, each message on a given stream is given a monotonically-increasing sequence number. Consumers can track their progress on processing messages and reconnect to the stream using the last-processed sequence number as a cursor value as needed. Producers can maintain a "backfill window" of recently transmitted messages. All consumers receive the same messages in the same order with the same sequence numbers.</t>
      <t>The duration of the backfill window is configured by service providers and should balance value to consumers, resource consumption for producers, and exposure of stale or deleted data. The recommended duration is 72 hours, to allow consumer recovery after a two-day weekend outage.</t>
      <t>The stream synchronization mechanism allows consumers to maintain complete indices of authenticated repository contents without needing to store complete copies of the repository MST structure. This significantly reduces storage overhead.</t>
      <section anchor="diffs">
        <name>Repository Diffs</name>
        <t>A repository diff carries the data that changed between two repository revisions: the new commit, any new MST nodes, and any created or updated record blocks. Applying a diff to a copy of the prior repository state results in the complete repository at the new revision. Repository diffs are used in the streaming synchronization mechanism.</t>
        <t>The commits within diffs are signed. Receiving parties can always verify those signatures, and the integrity of the blocks in the diff itself. But unless the receiving party has a full copy of the repository just prior to the diff, it cannot verify the overall integrity of the diff or the final state of the repository. In particular, if record deletion operations were included in the diff, the receiving party cannot enumerate or verify which records were impacted just from the diff.</t>
        <t>This section describes an "operation inversion" mechanism which allows receiving parties to verify the integrity of diffs when combined with metadata about the record-level operations encapsulated by the diff.</t>
        <section anchor="diff-format">
          <name>Diff Serialization Format</name>
          <t>Diffs use the same serialization format as complete repositories (described in <xref target="serialization"/>), with the commit block serving as the root. A diff MUST include:</t>
          <ul spacing="normal">
            <li>
              <t>The new commit block.</t>
            </li>
            <li>
              <t>All created and updated record blocks.</t>
            </li>
            <li>
              <t>All MST nodes in the current repository that did not exist in the prior revision.</t>
            </li>
          </ul>
          <t>Required blocks MUST be included in the diff regardless of their presence in earlier repository history. For example, if an MST node was previously present in the repository, then deleted, and subsequently reintroduced during the range that the diff represents, the diff MUST include that block.</t>
          <t>Deleted records and prior versions of updated records are excluded from diffs, unless the exact same record value has been included under a different repo path.</t>
          <t>A diff MAY include additional MST node blocks or padding blocks; receivers SHOULD ignore them.</t>
        </section>
        <section anchor="operation-inversion">
          <name>Operation Inversion</name>
          <t>A diff can be accompanied by an explicit operation list declaring the record-level creates, updates, and deletes it represents, along with a claimed previous repository tree root hash. Operation inversion verifies that this declared list is accurate and complete.</t>
          <t>To invert a diff against its declared operations:
1. Extract the diff's MST nodes into a partial tree structure, verifying the integrity of all available nodes and content hash links
2. Verify the operation list against the partial tree: that every "create" and "update" has a record at the indicated repository path with the given content hash, and every path removed by a "delete" is not present
3. For each entry in the operation list, apply the inverse operation to the partial MST: each "create" becomes a "delete", "delete" becomes "create", and "update" reverts the record value to the previous version
4. Compute the root hash of the resulting MST
5. Compare the computed root hash to the claimed previous root hash</t>
          <t>If the hashes match, the operation list is accurate and exhaustive. If they differ, either the operation list is incomplete or the diff is internally inconsistent; in either case the diff MUST be rejected.</t>
          <t>Producers of diffs intended to support operation inversion MUST include, in addition to the blocks required by <xref target="diff-format"/>, the MST nodes for keys directly adjacent (in lexicographic order) to mutated keys. Without these adjacent nodes, the inverse operation cannot be correctly applied to the partial MST. Diffs carried in streaming synchronization messages (<xref target="msg-commit"/>) MUST satisfy this requirement, since stateless consumers rely on operation inversion for verification.</t>
          <t>Receivers can track repository root hash values for each account and verify the claimed root hashes provided with the diff. This fixed-size state is significantly smaller than maintaining full repository data.</t>
        </section>
      </section>
      <section anchor="websocket">
        <name>WebSocket Transport</name>
        <t>A consumer (client) establishes a WebSocket connection <xref target="RFC6455"/> to the producer's (server's) stream endpoint. Secure WebSockets (using TLS) MUST be used for any internet-facing deployment.</t>
        <t>Once the connection is established, the producer sends a sequence of binary WebSocket frames to the consumer. Each frame carries a single message. Servers SHOULD ignore stream messages sent by the consumer: the protocol defined in this document is server-to-client only.</t>
        <t>Servers and clients SHOULD implement a keepalive system using Ping and Pong WebSocket frames.</t>
        <section anchor="frame-format">
          <name>Frame Format</name>
          <t>Each binary WebSocket frame contains two CBOR-encoded objects concatenated together: a header followed by a payload. Both objects MUST follow the deterministic CBOR-encoding rules defined in <xref target="cbor-encoding"/>.</t>
          <t>The header contains:</t>
          <ul spacing="normal">
            <li>
              <t><tt>op</tt> (integer, REQUIRED): the frame operation. The value <tt>1</tt> indicates a normal message; the value <tt>-1</tt> indicates an error.</t>
            </li>
            <li>
              <t><tt>t</tt> (string, REQUIRED when <tt>op = 1</tt>): the message-type name, prefixed with <tt>#</tt>. For example, <tt>#commit</tt> for a commit message.</t>
            </li>
          </ul>
          <t>The payload is a CBOR object whose schema is determined by the message type indicated in the header. Payloads are always CBOR objects, never arrays or scalars.</t>
          <t>Consumers MUST ignore messages with unknown message types (<tt>t</tt> values).</t>
          <t>Producers MAY include additional fields beyond those defined for a given message type, and consumers MUST tolerate unknown fields. Consumers MUST validate message fields and reject messages with invalid data.</t>
          <t>A frame MUST NOT exceed 5 MiB in total size, inclusive of the header, payload, and CBOR encoding overhead.</t>
        </section>
        <section anchor="error-frames">
          <name>Error Frames</name>
          <t>When <tt>op</tt> is <tt>-1</tt>, the frame is an error frame. The payload contains:</t>
          <ul spacing="normal">
            <li>
              <t><tt>error</tt> (string, REQUIRED): a short machine-readable error name.</t>
            </li>
            <li>
              <t><tt>message</tt> (string, OPTIONAL): a human-readable description of the error.</t>
            </li>
          </ul>
          <t>After sending an error frame, the producer MUST close the WebSocket connection.</t>
        </section>
        <section anchor="pre-upgrade-errors">
          <name>Pre-Upgrade HTTP Errors</name>
          <t>If the producer rejects the WebSocket upgrade request itself, it responds with a standard HTTP status code rather than an error frame. Response bodies SHOULD be JSON containing <tt>error</tt> and <tt>message</tt> fields matching the error-frame schema, but consumers MUST tolerate other body content.</t>
        </section>
      </section>
      <section anchor="cursors">
        <name>Cursors and Resumption</name>
        <t>Synchronization streams include per-message sequence numbers to improve transmission reliability. Sequence numbers are positive integers that increase monotonically across the stream. Sequence semantics are flexible, and they may contain arbitrary gaps between consecutive messages.</t>
        <t>Consumers track the last sequence number they successfully processed and can specify this as a cursor when reconnecting to receive any missed messages within the producer's backfill window. Note that this results in the last processed message being retransmitted. Consumers are responsible for managing and persisting cursor state themselves: producers do not maintain consumer-specific state across connections. The scope of a cursor is the (hostname, endpoint) pair: a cursor value is meaningful only when reconnecting to the same host and stream endpoint that issued it.</t>
        <t>Sequence numbers MUST NOT be repeated by producers on the same (hostname, endpoint) pair. If a producer must reset sequence numbers for any reason, it MUST start with a number higher than any previously broadcast.</t>
        <t>Sequence numbers are integers in the range <tt>[1, 2^53)</tt>. The upper bound is chosen so that cursors are exactly representable in 64-bit IEEE-754 floating point.</t>
        <t>Stream behavior depends on the cursor value specified during connection:</t>
        <ul spacing="normal">
          <li>
            <t><strong>No cursor specified</strong>: The producer begins transmitting from the current stream position, providing only new messages generated after the connection is established.</t>
          </li>
          <li>
            <t><strong>Future cursor</strong>: When the requested cursor exceeds the current stream sequence number, the producer sends an error frame (with error name <tt>FutureCursor</tt>) and closes the connection.</t>
          </li>
          <li>
            <t><strong>Cursor within backfill window</strong>: The producer transmits all persisted messages with sequence numbers greater than or equal to the requested cursor, in order, then continues with the stream once caught up.</t>
          </li>
          <li>
            <t><strong>Cursor older than backfill window</strong>: The producer sends an informational message indicating that the requested cursor is too old (<tt>#info</tt> with name <tt>OutdatedCursor</tt>), then begins transmission at the oldest available message, sends the entire backfill window, and continues with the stream.</t>
          </li>
          <li>
            <t><strong>Cursor value of 0</strong>: The producer treats this as a request for the complete available history, starting at the oldest available message, transmitting the entire backfill window, then continuing with the stream.</t>
          </li>
        </ul>
      </section>
      <section anchor="msg-types">
        <name>Message Types</name>
        <t>The repository synchronization stream uses five message types: <tt>#commit</tt>, <tt>#sync</tt>, <tt>#account</tt>, <tt>#identity</tt>, and <tt>#info</tt>. This section describes the schema and semantics of these messages. Some fields are common across most message types.</t>
        <section anchor="msg-common">
          <name>Common Message Fields</name>
          <t>The following fields are common to all message payloads other than <tt>#info</tt>:</t>
          <ul spacing="normal">
            <li>
              <t><tt>seq</tt> (integer, REQUIRED): the sequence number (cursor; see <xref target="cursors"/>) of this message.</t>
            </li>
            <li>
              <t><tt>did</tt> (string, REQUIRED): the account identifier of the repository this message concerns. For historical reasons the <tt>#commit</tt> message uses the field name <tt>repo</tt> rather than <tt>did</tt> for this purpose; the value has the same meaning.</t>
            </li>
            <li>
              <t><tt>time</tt> (string, REQUIRED): an datetime string indicating when the message was emitted. This timestamp is informational and is not authoritative for any verification purpose.</t>
            </li>
          </ul>
          <t>The <tt>time</tt> datetime must indicate the timezone, and must comply with the intersecting requirements of both <xref target="RFC3339"/> and WHATWG HTML datetimes (<xref target="WHATWG-HTML"/>). For example, <tt>2026-10-31T03:16:38.996Z</tt>.</t>
        </section>
        <section anchor="msg-commit">
          <name><tt>#commit</tt> Message</name>
          <t>A <tt>#commit</tt> message represents a repository update, as an atomic set of record operations. The message contains a repository diff combined with supporting metadata.</t>
          <t>The payload contains:</t>
          <ul spacing="normal">
            <li>
              <t><tt>seq</tt> (integer, REQUIRED): see <xref target="msg-common"/>.</t>
            </li>
            <li>
              <t><tt>repo</tt> (string, REQUIRED): the account identifier of the repository (see <xref target="msg-common"/>; this is the historical name of the <tt>did</tt> field). MUST match the <tt>did</tt> field in the commit object enclosed in <tt>blocks</tt>.</t>
            </li>
            <li>
              <t><tt>time</tt> (string, REQUIRED): see <xref target="msg-common"/>.</t>
            </li>
            <li>
              <t><tt>rev</tt> (string, REQUIRED): the new revision identifier of the repository after these modifications. MUST match the <tt>rev</tt> field in the commit object enclosed in <tt>blocks</tt>.</t>
            </li>
            <li>
              <t><tt>since</tt> (string, REQUIRED, nullable): the revision identifier of the repository immediately prior to this commit. May be null only for the first commit of a repository.</t>
            </li>
            <li>
              <t><tt>commit</tt> (CID link, REQUIRED): content hash link reference to the new commit object. MUST match the hash of the commit object enclosed in <tt>blocks</tt>.</t>
            </li>
            <li>
              <t><tt>blocks</tt> (byte string, REQUIRED): the serialized diff (as defined in <xref target="diffs"/>) carrying all blocks required to invert and verify the operations in this message.</t>
            </li>
            <li>
              <t><tt>ops</tt> (array, REQUIRED): the set of record operations encapsulated by this message. Multiple operations on the same record (path) are not allowed within a commit. Each entry is an object containing:
              </t>
              <ul spacing="normal">
                <li>
                  <t><tt>action</tt> (string, REQUIRED): one of <tt>create</tt>, <tt>update</tt>, or <tt>delete</tt>.</t>
                </li>
                <li>
                  <t><tt>path</tt> (string, REQUIRED): the repository path of the record being mutated.</t>
                </li>
                <li>
                  <t><tt>cid</tt> (CID link, REQUIRED, nullable): the content hash link of the new record at this path, or <tt>null</tt> for <tt>delete</tt> actions.</t>
                </li>
                <li>
                  <t><tt>prev</tt> (CID link, OPTIONAL): the content hash link of the prior record at this path. Present (REQUIRED) for <tt>update</tt> and <tt>delete</tt> actions; absent for <tt>create</tt>.</t>
                </li>
              </ul>
            </li>
            <li>
              <t><tt>prevData</tt> (CID link, REQUIRED): the root content hash of the repository's MST in the previous revision (the <tt>data</tt> field in the commit object). Used for operation-inversion validation as described in <xref target="streaming-validation"/>.</t>
            </li>
            <li>
              <t><tt>tooBig</tt> (boolean, REQUIRED): retained for compatibility with earlier versions of this protocol. Producers MUST emit this field with the value <tt>false</tt>. Consumers MUST ignore the field's value.</t>
            </li>
            <li>
              <t><tt>blobs</tt> (array, REQUIRED): retained for compatibility with earlier versions of this protocol. Producers MUST emit this field as an empty array. Consumers MUST ignore the field's contents.</t>
            </li>
          </ul>
          <t>A <tt>#commit</tt> message MUST contain no more than 200 entries in <tt>ops</tt>. The <tt>blocks</tt> field MUST NOT exceed 2 MiB. Any single record block within <tt>blocks</tt> MUST NOT exceed 1 MiB. Repository updates exceeding these limits MUST be communicated through a <tt>#sync</tt> message instead.</t>
          <t>A <tt>#commit</tt> message with an empty <tt>ops</tt> array (e.g., a commit issued solely to advance <tt>rev</tt> after a key rotation) is valid.</t>
          <t>Note that the full message is <em>not</em> cryptographically authenticated end-to-end (from the origin account itself). Only the commit object contained within the <tt>blocks</tt> field is signed, with other blocks covered by proof chains. The <tt>ops</tt> array is <em>not</em> authenticated and must be verified via operation inversion.</t>
        </section>
        <section anchor="msg-sync">
          <name><tt>#sync</tt> Message</name>
          <t>A <tt>#sync</tt> message declares the current state of a repository, regardless of the previous state. Sync messages are emitted when commit-message continuity cannot be maintained: large mutations exceeding the limits in <xref target="msg-commit"/>, recovery from data loss or corruption, or account migration between hosting providers.</t>
          <t>The payload contains:</t>
          <ul spacing="normal">
            <li>
              <t><tt>seq</tt> (integer, REQUIRED): see <xref target="msg-common"/>.</t>
            </li>
            <li>
              <t><tt>did</tt> (string, REQUIRED): see <xref target="msg-common"/>. MUST match the <tt>did</tt> field in the commit object encapsulated in <tt>blocks</tt>.</t>
            </li>
            <li>
              <t><tt>time</tt> (string, REQUIRED): see <xref target="msg-common"/>.</t>
            </li>
            <li>
              <t><tt>rev</tt> (string, REQUIRED): the current revision identifier of the repository. MUST match the <tt>rev</tt> field in the commit object encapsulated in <tt>blocks</tt>.</t>
            </li>
            <li>
              <t><tt>blocks</tt> (byte string, REQUIRED): a serialized stream containing only the current commit object. Receivers reconstruct full repository state by fetching the complete repository as described in <xref target="resync"/>.</t>
            </li>
          </ul>
          <t>A <tt>#sync</tt> message with a <tt>rev</tt> which is lower than or equal to the previously tracked revision for an account would constitute a "rollback" and should be ignored. The commit object signature (within the <tt>blocks</tt> field) must be verified, and the message rejected if validation fails.</t>
        </section>
        <section anchor="msg-account">
          <name><tt>#account</tt> Messages</name>
          <t>An <tt>#account</tt> message indicates a change in hosting status for a specific account. See <xref target="account-status"/> for details and semantics.</t>
          <t>The payload contains:</t>
          <ul spacing="normal">
            <li>
              <t><tt>seq</tt> (integer, REQUIRED): see <xref target="msg-common"/>.</t>
            </li>
            <li>
              <t><tt>did</tt> (string, REQUIRED): see <xref target="msg-common"/>.</t>
            </li>
            <li>
              <t><tt>time</tt> (string, REQUIRED): see <xref target="msg-common"/>.</t>
            </li>
            <li>
              <t><tt>active</tt> (boolean, REQUIRED): whether the account is currently active on the emitting service.</t>
            </li>
            <li>
              <t><tt>status</tt> (string, OPTIONAL): a short status code describing the account state.</t>
            </li>
          </ul>
          <t>Note that account messages are <em>not</em> cryptographically authenticated end-to-end, and that they have hop-by-hop semantics.</t>
        </section>
        <section anchor="msg-identity">
          <name><tt>#identity</tt> Message</name>
          <t>An <tt>#identity</tt> message indicates a possible change to the resolution result of an account identifier.</t>
          <t>Note that identity messages are <em>not</em> cryptographically authenticated end-to-end. Consumers SHOULD invalidate any cached identity metadata for the named account on receipt of this message, and then re-resolve the identifier.</t>
          <t>The payload contains:</t>
          <ul spacing="normal">
            <li>
              <t><tt>seq</tt> (integer, REQUIRED): see <xref target="msg-common"/>.</t>
            </li>
            <li>
              <t><tt>did</tt> (string, REQUIRED): see <xref target="msg-common"/>.</t>
            </li>
            <li>
              <t><tt>time</tt> (string, REQUIRED): see <xref target="msg-common"/>.</t>
            </li>
            <li>
              <t><tt>handle</tt> (string, OPTIONAL): included for historical reasons. Non-authoritative.</t>
            </li>
          </ul>
          <t><tt>#identity</tt> messages are best-effort: producers MAY emit them redundantly when no underlying change has occurred, and MAY fail to emit them when a change has occurred. Consumers SHOULD NOT rely on <tt>#identity</tt> messages as the sole signal of identity change.</t>
        </section>
        <section anchor="msg-info">
          <name><tt>#info</tt> Message</name>
          <t>An <tt>#info</tt> message is used to communicate context about the current event stream. It is not sequenced (contains no <tt>seq</tt> field).</t>
          <t>The payload contains:</t>
          <ul spacing="normal">
            <li>
              <t><tt>name</tt> (string, REQUIRED): a single-word informational message type</t>
            </li>
            <li>
              <t><tt>message</tt> (string, OPTIONAL): longer description</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="streaming-validation">
        <name>Commit Validation</name>
        <t>Validating a <tt>#commit</tt> message establishes both that the message is internally consistent (its declared operations match the diff it carries) and that it matches the prior state of the account's repository from the perspective of the consumer.</t>
        <t>For each <tt>#commit</tt> message received, consumers MUST perform the following steps:</t>
        <ol spacing="normal" type="1"><li>
            <t>Verify wire-level fields: that the frame parses as deterministic CBOR, that the payload satisfies the schema in <xref target="msg-commit"/>, and that the size limits in <xref target="msg-commit"/> are not exceeded. Otherwise the message MUST be rejected.</t>
          </li>
          <li>
            <t>Parse the repository diff from <tt>blocks</tt>, verifying the deterministic CBOR encoding, schema, and syntax of all fields of the commit and MST nodes. All created and updated record blocks must be present, but the content and internal structure of records are not validated at this stage. If the repository diff is invalid, the message MUST be rejected.</t>
          </li>
          <li>
            <t>Apply operation inversion to the repository diff MST using the <tt>ops</tt> array, and match against the message's claimed <tt>prevData</tt>, as per <xref target="operation-inversion"/>. If inversion fails, the message MUST be rejected.</t>
          </li>
          <li>
            <t>Verify the commit signature using the signing key resolved from the account identifier. If the signature is invalid, the message MUST be rejected.</t>
          </li>
          <li>
            <t>Confirm that the message's <tt>rev</tt> is strictly greater than the previously observed <tt>rev</tt> for this account. Otherwise the message MUST be ignored.</t>
          </li>
          <li>
            <t>Cross-check the message's <tt>prevData</tt> field against the consumer's previously seen <tt>data</tt> for this account. If they differ, the consumer has become desynchronized for this account and MUST initiate re-synchronization as defined in <xref target="resync"/>.</t>
          </li>
        </ol>
        <t>A signature failure at step 4 might indicate a recent key rotation rather than a malicious commit. Consumers SHOULD refresh the cached identity for the account and retry verification before rejecting the message.</t>
      </section>
      <section anchor="resync">
        <name>Re-synchronization</name>
        <t>When a consumer detects desynchronization, either through a discontinuity in commit history or a <tt>#sync</tt> message that does not match its local state, it must perform a complete re-synchronization process to restore consistency with the current repository state.</t>
        <t>Re-synchronization requires fetching and processing the full repository structure, though the record contents themselves are optional depending on the consumer's needs. If the repository data is delivered in pre-order traversal, it can be validated incrementally as it is received.</t>
        <t>Parsing the repository structure produces a mapping of keys (repository paths) to record versions (hashes) that represents the complete repository state. This key-to-hash mapping can be compared against existing local state to identify discrepancies and re-establish synchronization. Once validated, this mapping establishes the new repository state against which future commit messages can be applied.</t>
        <t>Consumers SHOULD prefer requesting full repository data from their direct upstream rather than the resolved canonical host for the repository. Direct upstreams MAY coalesce and cache snapshot requests, or redirect consumers to alternative sources where appropriate. This reduces correlated load spikes on canonical hosts caused multiple consumers re-synchronizing at once when a <tt>#sync</tt> message is broadcast.</t>
        <t>During the re-synchronization process, any incoming commit messages for the repository should be buffered rather than processed immediately. Once re-synchronization completes successfully, these buffered commits can be validated and applied in sequence to bring the consumer fully up to date with the current repository state.</t>
      </section>
    </section>
    <section anchor="blob">
      <name>Media Blobs</name>
      <t>Larger binary media files, such as images or video, are not serialized inside repositories or synchronized over the stream mechanism. Instead, they are stored as "blobs" by the account's host, and referenced using a strong hash (CID). The blob file can be fetched out-of-band by any party, and the hash can be used to verify its integrity.</t>
      <t>Blob hosting and lifecycle is tied to a specific account. When an account first creates a new blob, the host places it in temporary storage where it is not publicly available to the network. If the account then creates a record which includes a valid reference to the blob, then the blob becomes accessible to the network. Multiple records for the same account can reference the same blob. If all references to the blob are removed, the blob becomes inaccessible and may be deleted. A blob left lingering in temporary storage may expire and be deleted.</t>
      <t>The hosting and access lifecycle of blobs matches that of the account's public repository data, as described in <xref target="account-status"/>. Blob data should not be served or redistributed for accounts with inactive hosting status.</t>
      <t>The details of the account host HTTP upload and fetch endpoints, including the URL path and query parameters, are not specified by this document.</t>
      <t>Applications SHOULD NOT rely on account hosts to distribute blobs directly to broad audiences. Applications are expected to bear the resource costs of mass distribution themselves, for example using a caching HTTP proxy or Content Delivery Network (CDN).</t>
      <section anchor="blob-refs">
        <name>Blob References</name>
        <t>References to a blob are encoded as a special object within records. The object has a <tt>$type</tt> field with value <tt>blob</tt>, and a fixed set of fields. This pattern can be parsed and extracted from record data of any type. The account identifier is inferred from the repository containing the record and is not included in the reference itself.</t>
        <t>The reference object contains the following fields:</t>
        <ul spacing="normal">
          <li>
            <t><strong><tt>$type</tt></strong> (string, required): Has the fixed value <tt>blob</tt></t>
          </li>
          <li>
            <t><strong><tt>ref</tt></strong> (CID link, required): Hash of the blob file. Uses the raw/arbitrary prefix as described in <xref target="cid-link"/>.</t>
          </li>
          <li>
            <t><strong><tt>mimeType</tt></strong> (string, required): Content type of the blob. MUST NOT be an empty string. Use <tt>application/octet-stream</tt> if content type is not known.</t>
          </li>
          <li>
            <t><strong><tt>size</tt></strong> (integer, required): Size of the blob in bytes. MUST be non-zero and positive.</t>
          </li>
        </ul>
        <t>A blob object containing any additional fields MUST be rejected.</t>
        <t>An example blob reference in JSON encoding:</t>
        <sourcecode type="json"><![CDATA[
{
  "$type": "blob",
  "ref": {
    "$link": "bafkreid4hcizz4ckszgnxn6gw7at2v2y3s4sweiucvfeuhyl5pxuilu5ee"
  },
  "mimeType": "application/octet-stream",
  "size": 837446
}
]]></sourcecode>
      </section>
    </section>
    <section anchor="privacy">
      <name>Privacy Considerations</name>
      <t>This protocol is designed for global public broadcast of authenticated data. It is relatively easy for any party to maintain a complete archive of all network data, including data which was subsequently deleted by the author after the archiving started. Public data is effectively non-repudiable, though this property does not hold if signing keys are leaked or published. It is important that all network participants (and especially end users) are informed and understand this trade-off.</t>
      <t>An intentional feature of this protocol is that accounts can be reused for multiple application types and use cases. In some situations this cross-application linkage may be unwanted or unintentional.</t>
      <t>The ability to redistribute data gives readers more choice when fetching data, while preserving authenticity. This can in theory reduce concentration of surveillance and improve reader privacy. When authenticating data, Care must be taken that account identifier resolution does not reveal reader behavior. Details depend on individual account identifier systems, which are out of scope for this document.</t>
      <section anchor="privacy-deleted">
        <name>Deleted Data</name>
        <t>The protocol provides mechanisms to broadcast both content deletion and account deletion, and the strong expectation ("MUST") is for synchronizing services to stop distributing deleted data. But there is no way to ensure that all network participants have complied.</t>
        <t>Sync streams may include deleted data in their "backfill window" of messages. This is allowed as an implementation choice. Backfill time windows should not have unbounded duration. See <xref target="stream-sync"/> for a recommended duration.</t>
        <t>Content hash links between records can leave traces after data records are deleted.</t>
      </section>
      <section anchor="privacy-author">
        <name>Author Privacy</name>
        <t>This protocol is designed to support pseudonymous publication and consumption of public data records. Accounts which choose to do so should be able to fully participate in the network without being linked to an offline identity. The protocol can not guarantee pseudonymity, and maintaining this property requires care by account holders.</t>
        <t>Time correlation from public metadata can leak information about account holders. Timestamp identifiers (TIDs) record event timestamps in repository commit revisions and in record keys. Event stream messages also include timestamps. Application-specific record types may also include timestamps.</t>
        <t>Media file blobs may include identifying metadata, such as EXIF geolocation metadata included in JPEG image files. Application software should take care to prevent accidental metadata publication by rejecting or redacting such metadata by default.</t>
      </section>
    </section>
    <section anchor="security">
      <name>Security Considerations</name>
      <section anchor="security-data">
        <name>Untrusted Data</name>
        <t>Repositories constitute untrusted input, as account holders have complete control over repository contents and repository hosts control binary encoding. Implementations must handle potential denial-of-service vectors from both malicious actors and accidental conditions such as corrupted data or implementation bugs.</t>
        <t>Generic precautions must be followed when processing CBOR data, including enforcement of maximum serialized object size, maximum recursion depth for nested structures, and memory budget limits for deserialized data. While some CBOR implementations include these protections by default, implementations should verify and configure appropriate limits regardless of library defaults.</t>
        <t>Content-addressed container formats are vulnerable to expansion attacks, where a single data block or sub-tree of nodes is referenced many times. This can result in a relatively small serialized repository unpacking in to a much larger amount of memory, resulting in memory exhaustion. This can be mitigated by requiring referenced blocks to appear multiple times (as the repository serialization format does), and for consumers to verify this requirement when reading files.</t>
      </section>
      <section anchor="security-hosts">
        <name>Untrusted Hosts</name>
        <t>Several aspects of synchronization involve following URLs or host endpoints derived from untrusted input: account-identifier resolution, retrieval of full repository data from a hosting service, and following redirects between hosts. Network clients should take generic precautions with HTTP and WebSocket requests, including response header and body size limits and timeouts.</t>
        <t>Consumers MUST validate URLs derived from untrusted input before issuing requests, including any URLs reached via HTTP redirects. To address Server-Side Request Forgery (SSRF) attacks, requests to internal-network addresses, loopback addresses, and link-local addresses MUST be rejected unless explicitly permitted by configuration.</t>
      </section>
      <section anchor="security-mst">
        <name>MST Structure Attacks</name>
        <t>The efficiency of MST data structures depends on a uniform distribution of key hashes. Since account holders control record keys, they can perform key mining to generate sets of keys with specific layer assignments and sorting characteristics, resulting in inefficient tree structures. Such attacks can cause excessive storage overhead and network amplification during repository transmission.</t>
        <t>To mitigate these attacks, implementations should:</t>
        <ul spacing="normal">
          <li>
            <t>Limit the number of entries per MST node to a statistically reasonable maximum</t>
          </li>
          <li>
            <t>Impose limits on overall repository height</t>
          </li>
          <li>
            <t>Monitor and restrict other structural parameters that could be exploited through sophisticated key mining</t>
          </li>
        </ul>
      </section>
      <section anchor="security-import">
        <name>Repository Import Validation</name>
        <t>When importing repositories, implementations should verify the completeness and integrity of the repository structure. Serialized repositories may contain additional unrelated blocks beyond those required for the repository structure. Care should be taken during storage to avoid resource waste on unreferenced blocks and to prevent potential storage exhaustion attacks.</t>
      </section>
      <section anchor="security-resources">
        <name>Resource Abuse</name>
        <t>A producer that routinely emits <tt>#sync</tt> messages could cause consumers to repeatedly fetch full repository snapshots, which is substantially more expensive than processing <tt>#commit</tt> messages. Similarly, a producer that rapidly updates the same key or issues many small commits can amplify message volume and bandwidth costs on downstream consumers. Consumers should apply rate limits and bandwidth budgets per repository, and may disconnect or deprioritize producers whose message patterns appear abusive.</t>
        <t>A single <tt>#sync</tt> message can result in consumers re-synchronizing an entire repository. Synchronizing services should ensure that record operation rate limits are not bypassed.</t>
      </section>
      <section anchor="security-rewinds">
        <name>Repository Rewinds</name>
        <t>Intermediaries that relay firehose messages can present a consumer with an outdated view of a repository by replaying older commits or declining to forward newer ones. The <tt>rev</tt> field on each commit can help consumers detect this: a received commit whose <tt>rev</tt> is not greater than the most recently observed <tt>rev</tt> for that repository may indicate that the producer is serving a rewound view. In situations such as this, consumers can cross-check the latest observed <tt>rev</tt> against the canonical host for the repository.</t>
      </section>
      <section anchor="security-validation-responsibility">
        <name>Validation Responsibility</name>
        <t>Consumers are responsible for verifying the integrity and authenticity of repository data from the network.</t>
        <t>Intermediaries that relay messages MAY apply some validation checks (for example, signature verification or size enforcement) before relaying. Consumers MUST NOT treat upstream relaying as evidence of validity: every consumer is ultimately responsible for performing the verification rules in <xref target="streaming-validation"/> on each message it processes.</t>
        <t>Clients are responsible for verifying the integrity of blobs they fetch from the network (content hash and size), and for verifying the media type declared in the blob metadata.</t>
      </section>
      <section anchor="security-blobs">
        <name>Blob Hosting</name>
        <t>Serving arbitrary user-uploaded files (media blobs) from a web server raises several web content security issues, including cross-site scripting (XSS) of scripts or SVG content from the same web origin as authenticated web pages. Hosts SHOULD enable a strict Content Security Policy when serving blobs. Hosts MAY use the generic <tt>application/octet-stream</tt> content type header when serving blobs. Applications SHOULD serve media blobs from their own origin (proxy, CDN, etc.) instead of directly linking to the canonical account host.</t>
        <t>Processing untrusted binary media files is a common source of security exploits. Care should be taken when detecting content types or transforming media formats.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC3986">
          <front>
            <title>Uniform Resource Identifier (URI): Generic Syntax</title>
            <author fullname="T. Berners-Lee" initials="T." surname="Berners-Lee"/>
            <author fullname="R. Fielding" initials="R." surname="Fielding"/>
            <author fullname="L. Masinter" initials="L." surname="Masinter"/>
            <date month="January" year="2005"/>
            <abstract>
              <t>A Uniform Resource Identifier (URI) is a compact sequence of characters that identifies an abstract or physical resource. This specification defines the generic URI syntax and a process for resolving URI references that might be in relative form, along with guidelines and security considerations for the use of URIs on the Internet. The URI syntax defines a grammar that is a superset of all valid URIs, allowing an implementation to parse the common components of a URI reference without knowing the scheme-specific requirements of every possible identifier. This specification does not define a generative grammar for URIs; that task is performed by the individual specifications of each URI scheme. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="66"/>
          <seriesInfo name="RFC" value="3986"/>
          <seriesInfo name="DOI" value="10.17487/RFC3986"/>
        </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="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="RFC8949">
          <front>
            <title>Concise Binary Object Representation (CBOR)</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
            <date month="December" year="2020"/>
            <abstract>
              <t>The Concise Binary Object Representation (CBOR) is a data format whose design goals include the possibility of extremely small code size, fairly small message size, and extensibility without the need for version negotiation. These design goals make it different from earlier binary serializations such as ASN.1 and MessagePack.</t>
              <t>This document obsoletes RFC 7049, providing editorial improvements, new details, and errata fixes while keeping full compatibility with the interchange format of RFC 7049. It does not create a new version of the format.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="94"/>
          <seriesInfo name="RFC" value="8949"/>
          <seriesInfo name="DOI" value="10.17487/RFC8949"/>
        </reference>
        <reference anchor="RFC3339">
          <front>
            <title>Date and Time on the Internet: Timestamps</title>
            <author fullname="G. Klyne" initials="G." surname="Klyne"/>
            <author fullname="C. Newman" initials="C." surname="Newman"/>
            <date month="July" year="2002"/>
            <abstract>
              <t>This document defines a date and time format for use in Internet protocols that is a profile of the ISO 8601 standard for representation of dates and times using the Gregorian calendar.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="3339"/>
          <seriesInfo name="DOI" value="10.17487/RFC3339"/>
        </reference>
        <reference anchor="WEBASSEMBLY" target="https://www.w3.org/TR/wasm-core-2">
          <front>
            <title>WebAssembly Core Specification</title>
            <author fullname="Andreas Rossberg">
              <organization/>
            </author>
            <date year="2026" month="March"/>
          </front>
        </reference>
        <reference anchor="SEC2" target="https://www.secg.org/sec2-v2.pdf">
          <front>
            <title>SEC 2: Recommended Elliptic Curve Domain Parameters</title>
            <author>
              <organization>Standards for Efficient Cryptography Group</organization>
            </author>
            <date year="2010" month="January"/>
          </front>
        </reference>
        <reference anchor="WHATWG-HTML" target="https://html.spec.whatwg.org/">
          <front>
            <title>HTML Living Standard</title>
            <author>
              <organization>Web Hypertext Application Technology Working Group</organization>
            </author>
            <date year="2026" month="October"/>
          </front>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC7049">
          <front>
            <title>Concise Binary Object Representation (CBOR)</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
            <date month="October" year="2013"/>
            <abstract>
              <t>The Concise Binary Object Representation (CBOR) is a data format whose design goals include the possibility of extremely small code size, fairly small message size, and extensibility without the need for version negotiation. These design goals make it different from earlier binary serializations such as ASN.1 and MessagePack.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7049"/>
          <seriesInfo name="DOI" value="10.17487/RFC7049"/>
        </reference>
        <reference anchor="MSTPAPER" target="https://inria.hal.science/hal-02303490/document">
          <front>
            <title>Merkle Search Trees: Efficient State-Based CRDTs in Open Networks</title>
            <author fullname="Alex Auvolat">
              <organization/>
            </author>
            <author fullname="François Taïani">
              <organization/>
            </author>
            <date year="2019" month="October"/>
          </front>
        </reference>
        <reference anchor="AT-ARCH" target="https://datatracker.ietf.org/doc/draft-newbold-at-architecture/">
          <front>
            <title>Authenticated Transfer: Architecture Overview</title>
            <author fullname="Bryan Newbold">
              <organization>Bluesky Social</organization>
            </author>
            <author fullname="Daniel Holmgren">
              <organization>Bluesky Social</organization>
            </author>
            <date year="2026" month="March"/>
          </front>
        </reference>
        <reference anchor="DASL-CAR" target="https://dasl.ing/car.html">
          <front>
            <title>DASL: Content Addressable aRchives (CAR)</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="DRISL" target="https://dasl.ing/drisl.html">
          <front>
            <title>DRISL — Deterministic Representation for Interoperable Structures &amp; Links</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
      </references>
    </references>
    <?line 752?>

<section anchor="data-model">
      <name>Data Model</name>
      <t>All components of the repository data structure conform to a limited data model and defined encoding rules. CBOR encoding (following the rules in <xref target="cbor-encoding"/>) is used for consistent hashing of data. A JSON encoding is also defined for record data, with lossless mapping between the CBOR and JSON encodings.</t>
      <t>The data model includes the following types:</t>
      <ul spacing="normal">
        <li>
          <t><strong>null values</strong>: represented as 'null' in JSON, and the null special value (major 7) in CBOR</t>
        </li>
        <li>
          <t><strong>boolean values</strong>: represented as 'true' / 'false' in JSON, and special values (major 7) in CBOR</t>
        </li>
        <li>
          <t><strong>integer values</strong>: with signed 64-bit precision. Represented as numbers in JSON, and Integers (majors 0,1) in CBOR</t>
        </li>
        <li>
          <t><strong>string values</strong>: represented as strings in JSON, and UTF-8 Strings (major 3) in CBOR</t>
        </li>
        <li>
          <t><strong>byte string values</strong>: represented with a special object type in JSON (see <xref target="json-encoding"/>) and as a Byte String (major 2) in CBOR</t>
        </li>
        <li>
          <t><strong>content hash links</strong>: as described in <xref target="cid-link"/>, represented as a special object type in JSON, and as a tag 42 byte string in CBOR</t>
        </li>
        <li>
          <t><strong>arrays</strong>: represented as arrays in JSON, and Arrays (major 4) in CBOR</t>
        </li>
        <li>
          <t><strong>objects</strong>: represented as objects in JSON, and Maps (major 5) in CBOR. Object keys must always be strings.</t>
        </li>
      </ul>
      <t>As a best practice to ensure compatibility with programming languages that represent all numbers in floating point by default, integer values should be limited to 53 bits of precision when possible.</t>
      <section anchor="cid-link">
        <name>Content Identifier (CID) Hashes</name>
        <t>References to data objects by hash occur throughout the repository data structure. They also occur between records at the application layer. A consistent way of computing and encoding these content hash links, named Content Identifier (CID), is described here. In addition to "CID Links" between objects, it is possible to represent CIDs as regular hash strings (without the "link" data model semantics). It is also possible to represent the hash of arbitrary binary data as a CID.</t>
        <t>Data objects to be referenced are first encoded as CBOR. The encoded bytes are hashed using SHA-256, resulting in a 32-byte binary hash value. The hash bytes are prefixed with the 4-byte prefix value <tt>0x01711220</tt>, resulting in a 36-byte binary CID.</t>
        <t>This fixed prefix value is used for historical reasons, and indicates that the referenced data is CBOR encoded. If using a CID to reference arbitrary binary data, use the fixed 4-byte value <tt>0x01551220</tt> instead. No other CID prefixes or types are allowed.</t>
        <t>When representing a CID link in CBOR, the binary CID value has an additional null byte (0x00) prepended, then the 37 bytes are stored as a byte string using the IANA-registered CBOR Tag 42.</t>
        <t>When representing a CID value as a string, the 36-byte binary CID value is encoded using <xref target="RFC4648"/> unpadded lower-case base32, and then the ASCII character 'b' (lower-case B) is prefixed. This results in a 59-character lower-case ASCII string.</t>
        <t>When referencing a CID link in JSON, first compute the string representation as described above. The link is then represented as a JSON object with a single key (<tt>$link</tt>) and the value being the string value. For example:</t>
        <sourcecode type="json"><![CDATA[
{
  "$link": "bafyreidfayvfuwqa7qlnopdjiqrxzs6blmoeu4rujcjtnci5beludirz2a"
}
]]></sourcecode>
      </section>
      <section anchor="cbor-encoding">
        <name>CBOR Encoding</name>
        <t>Repository content requires consistent binary representation across all implementations to ensure identical content hashes and verifiable integrity. All records, MST nodes, and commits must be encoded using Deterministically Encoded CBOR as specified in <xref section="4.2" sectionFormat="of" target="RFC8949"/>.</t>
        <t>The encoding rules that apply in this document are:</t>
        <ul spacing="normal">
          <li>
            <t>Integers are encoded in their shortest form</t>
          </li>
          <li>
            <t>Length metadata must be encoded in shortest form</t>
          </li>
          <li>
            <t>All arrays, maps, and strings are encoded with explicit lengths; CBOR's indefinite-length encoding is not used</t>
          </li>
          <li>
            <t>Floating-point values are not used; this includes NaN and infinity values</t>
          </li>
          <li>
            <t>Map keys MUST be sorted using length-first bytewise lexicographic order of the encoded key</t>
          </li>
          <li>
            <t>Maps MUST NOT contain duplicate keys</t>
          </li>
          <li>
            <t>Map keys MUST have string type</t>
          </li>
          <li>
            <t>Tag 42 (for CID links) is the only extension type supported</t>
          </li>
        </ul>
        <t>Because all map keys are strings encoded with a length prefix, the map sorting order described here is the same as that described by both <xref target="RFC8949"/> Section 4.2.1 and Section 4.2.3, as well as the earlier <xref target="RFC7049"/> Section 3.9.</t>
        <t>The encoding rules described here are compatible with similar deterministic-CBOR profiles such as <xref target="DRISL"/>.</t>
      </section>
      <section anchor="json-encoding">
        <name>JSON Encoding</name>
        <t>The JSON representation of records or other repository data objects does not need to have a deterministic binary encoding.</t>
        <t>Byte strings are represented in JSON using a special object type. The binary data is first string encoded in base64, as described in <xref target="RFC4648"/> Section 4. This variant is not URL-safe, and <tt>=</tt> padding is optional. The special JSON object has a single string key <tt>$bytes</tt>, and the value is the base64-encoded data. For example:</t>
        <sourcecode type="json"><![CDATA[
{
  "$bytes": "nFERjvLLiw9qm45JrqH9QTzyC2Lu1Xb4ne6+sBrCzI0"
}
]]></sourcecode>
        <t>Content hash links (CID links) are represented as special objects as described in <xref target="cid-link"/>.</t>
      </section>
    </section>
    <section anchor="crypto">
      <name>Cryptography</name>
      <t>Implementations must support all of the following elliptic curves and signature algorithms:</t>
      <ul spacing="normal">
        <li>
          <t>NIST P-256 (also known as secp256r1 or p256) <xref target="SEC2"/></t>
        </li>
        <li>
          <t>secp256k1 (also known as k256) <xref target="SEC2"/></t>
        </li>
      </ul>
      <section anchor="crypto-malleable">
        <name>Signature Malleability</name>
        <t>ECDSA signatures exhibit malleability, allowing transformation into distinct but equally valid signatures without access to the private key or original data. While the security impact is limited, signature malleability could enable broadcast of multiple valid versions of the same repository commit with different hashes, potentially causing consumer confusion.</t>
        <t>To prevent such scenarios, ECDSA signatures are required to be canonicalized in low-S form. Specifically, the <tt>s</tt> component of the signature must satisfy <tt>s ≤ n/2</tt>, where <tt>n</tt> is the order of the curve's base point. Receivers MUST reject signatures which are not in this canonicalized form.</t>
      </section>
      <section anchor="crypto-sig">
        <name>Signature Generation</name>
        <t>To compute a signature over CBOR-encoded bytes in the context of this protocol:</t>
        <ol spacing="normal" type="1"><li>
            <t>Compute the SHA-256 hash of the encoded bytes. Do not encode the resulting hash bytes.</t>
          </li>
          <li>
            <t>Sign the hash bytes using the current signing key associated with the account</t>
          </li>
          <li>
            <t>Format the signature bytes as a concatenation of the 32-byte <tt>r</tt> and 32-byte <tt>s</tt> values</t>
          </li>
        </ol>
        <t>Note that SHA-256 hashing is a standard part of most ECDSA implementations. Do not double-hash.</t>
      </section>
    </section>
    <section anchor="tid">
      <name>Timestamp Identifier (TID)</name>
      <t>Timestamp Identifiers (TIDs) are compact string encodings of 64-bit integers, that can be used as logical clocks or locally-unique sorted identifiers. They are not expected to be globally unique. They can be compared and sorted as strings.</t>
      <t>They have the following structure:</t>
      <ul spacing="normal">
        <li>
          <t>64-bit integer with big-endian byte ordering</t>
        </li>
        <li>
          <t>Top bit is always zero, so that the full value range fits in a positive signed 64-bit integer.</t>
        </li>
        <li>
          <t>Base32-sortable encoding using characters <tt>234567abcdefghijklmnopqrstuvwxyz</tt> (the first character is limited to <tt>234567ab</tt>)</t>
        </li>
        <li>
          <t>Fixed 13-character length with no padding (integer zero encodes as <tt>2222222222222</tt>)</t>
        </li>
      </ul>
      <t>The layout of the 64-bit integer is:</t>
      <ul spacing="normal">
        <li>
          <t>The top bit is always 0</t>
        </li>
        <li>
          <t>The next 53 bits represent microseconds since the UNIX epoch. 53 bits was chosen because it is the maximum safe integer precision in a 64-bit floating point number, as used by JavaScript.</t>
        </li>
        <li>
          <t>The final 10 bits are an arbitrary "clock identifier."</t>
        </li>
      </ul>
      <t>When generating a sequence of TIDs in the same context (e.g., for an individual account), care should be taken to ensure that the TID value always increments. If the system clock rolls backwards, or multiple TIDs are generated in the same microsecond, the microsecond component should be incremented past the previously generated value.</t>
    </section>
    <section anchor="nsid">
      <name>Namespaced Identifier (NSID) Syntax</name>
      <t>Collections are identified by a Namespaced Identifier (NSID): an ASCII string in reverse domain-name order followed by an additional name segment. The portion preceding the final segment is the <strong>domain authority</strong>; the final segment is the <strong>name</strong>.</t>
      <t>NSIDs MUST conform to the following syntax:</t>
      <ul spacing="normal">
        <li>
          <t>Overall:
          </t>
          <ul spacing="normal">
            <li>
              <t>MUST contain only ASCII characters</t>
            </li>
            <li>
              <t>MUST separate the domain authority and the name by an ASCII period (<tt>.</tt>)</t>
            </li>
            <li>
              <t>MUST contain at least three segments</t>
            </li>
            <li>
              <t>MUST be at most 317 characters in total length</t>
            </li>
          </ul>
        </li>
        <li>
          <t>Domain authority:
          </t>
          <ul spacing="normal">
            <li>
              <t>Composed of segments separated by ASCII periods (<tt>.</tt>)</t>
            </li>
            <li>
              <t>At most 253 characters in total (including periods), and at least two segments</t>
            </li>
            <li>
              <t>Each segment MUST contain at least 1 and at most 63 characters</t>
            </li>
            <li>
              <t>The allowed characters are ASCII letters (<tt>A-Z</tt>, <tt>a-z</tt>), digits (<tt>0-9</tt>), and hyphens (<tt>-</tt>)</t>
            </li>
            <li>
              <t>Segments MUST NOT start or end with a hyphen</t>
            </li>
            <li>
              <t>The first segment (the top-level domain) MUST NOT start with a digit</t>
            </li>
            <li>
              <t>The domain authority is not case-sensitive and SHOULD be normalized to lowercase</t>
            </li>
          </ul>
        </li>
        <li>
          <t>Name:
          </t>
          <ul spacing="normal">
            <li>
              <t>MUST contain at least 1 and at most 63 characters</t>
            </li>
            <li>
              <t>The allowed characters are ASCII letters and digits only (<tt>A-Z</tt>, <tt>a-z</tt>, <tt>0-9</tt>)</t>
            </li>
            <li>
              <t>Hyphens are not allowed</t>
            </li>
            <li>
              <t>MUST NOT start with a digit</t>
            </li>
            <li>
              <t>Case-sensitive; implementations MUST NOT normalize case</t>
            </li>
          </ul>
        </li>
      </ul>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA9W923IbWZceeM+nyKA6XKQGYEnUoUost8PUqaS/VZJaZHW1
u8MeJIAEmSUgE5WZIIVSqcNXjvDtxDxAX0zMXPod2m/ST+K1vrXW3msnkpL+
9rQnpuKPXyCQuY/rfByPx3td2S2Lk2z/dNNdFlVXzvKumGfnTV61i6I5yd4V
67otu7rZZnk1z8621eyyqavy97wr62p/L59Om+KKBzjHs/t7PMIFPX+Std18
b29ez6p8RVPMm3zRjS/r5eqiKapx3o2bMPb4zv29djNdlW1Lo3bbNT3/8tn5
871qs5rSMvY26zkN257s8T8ne7O6aouq3dAXNPedvbwpcl7Der3kHdAYLZb7
rsiX4/NyVWSn9MT+3nXdvL9o6s36xh3v770vtvTYnEYuqg3NlWVfeiPLZMX7
v9DwZXWR/cgv8PervFzS93m3/vdl0S2O6uaCv74ou8vNlH7gL8fXF3QY629x
Pu3+3l5O09S052xMj2bZYrNcygk+zauyWGYv9AjxK42Y222cZI+Xm6J9v83O
6lmZL/FAIWuY491/P5UHrovp0Yft77tTPG62eZW9Lq6n9XL+Z00w5Tf74+9V
dbOiV69wju+eP7n36PuHJ/ZBvrr/8P73J/ZBvnp4/8GDE/sgX33/6P6jE/ug
Y927J1/xB/rql2ePT8/Onv30+NV/OMHKFLZ/KaanbVuspstt9qRuiuxsXczK
hQIKngRUZT/lzewyO75z/FBez5uLojvJLrtu3Z58++319fXR9T2+w2/P3317
nber8YyGGx/j6XBr+G+s//qzPa3mBIRt9q5uWwLqC3rk7NmT42St+/RNdsxo
N6tXq6KaE6A9Wy7LNUFd9mTTXBXZ05oOvMre5g2N2hVNu++28Ke82uSEq8d3
7t65cRNtMbvANujD8fjq+Gg9X3x2DykMnHWEWnkzb7NF3WTPFnSSJaFF9qTZ
rrv6osnXl1tBAb6UF6fnv/w4fnH+06tko/xF9qq8YnSxAd0+3sy6ms7o5su4
7FbLo5Yu8uj6Mu+uZT9/xiYIKLIXhLVNV3zoMkc4svNidlnVy/pimyX4vLdX
VoseOH93R6GSP9BXP52dvz19++xdeqc/Fc37JYFdAfg6bwoiZO7caPtdMX6c
t3TXT949PW8zut4364LxsGOKldxwPJm7jwZPpqyaMj+6zOl4ePxZ8S19Ht85
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
nM5CZ4wPGvdb0m6CQsWqzlfoUn1FqSJdpFitO7YrtsWYwytK9nRmp2dPXr40
RsbQWog8tM8T7adqi1rPWiLL9E+CVABzmonfinbSaPSANlevimECwFhTErvD
xdIoPEOApVNR7yKvVWrPlkNDfCYepjuJSsXOONWN1XBB0D/Kfq3Lys5EBX7C
umsC5qxdMmQH1DvJJv82Dvrvvv23MsyYhvl3E8JIWdVPP9NtKhbzQooPOWyS
sFIUFytAflsQ6811b5NvJyMhx1VNZ5iDsbB025CIBDrE64CRKOyIN9OybIC9
v+a/6LBoPC9qvD5jWYM4eZd/6MsbtD4WOBjMtwTlVywmrQmeyw9jHDP7TGxU
T3VFoGCq0prGpJaaRaQU7ugdlOTzX/MZRFiDh7xzj7aq9IZRxE0Lk53TkIlZ
FYy4Ku8qpjk7La6BMIh334qAi/0hNEVUzxkUTFkFnrbjr8Y7T8mFQlP5FXTm
yHBNqKcYHFhzlZPfhhMJmBj3aNijhJe21UM+XhEmbAmSW1VYFjUb6wAJuMuT
vb1xdsrf8SoNPGU8wd58uSZJnA17bJg4mJyO/45gbJKPf+d/7owfTUhGUjnq
YHLEf11u13yeB5Mx/4WraDnchb753/kb2gT7gCYn/Aeur1zO+dd/mBzScl4V
1QUdoVmG7+KRB3eP/foO1Ox3VfAbzJSXZQf5QNkPrQTvTY74gwgSYGjFXMQM
heVgaZFzVEmZkY5xhtF5sWlA3WtVaccOJKd0ry07pqAMukiQZb5luDoFgWar
92VdzgoVFA3XPiPVH6gYbzhn2OKMCqnc0ZrVXhxkwxADYdUh3D4JqfuJpYmN
zH30iGMJw3cj7u29rjsVeWFqBAkhbFHXhx2sEVjZTGFWrWUpSAN9pK6Ek7M+
syjFdUQCpxz0vaN7fFUfP2r8F9MbEYiItNPWWdnwZmf4g1Q83ArDExNT9kY5
+MdbZrNgapjYM0hOYPxpg4rPpAOxOyKlMCnOcRnGbkjSo4uEqA9Wl5ga6uuK
QPayXAuRgEAr9iqnnUeBQvWAYaMcVIuoa2VrYjkdlBwokM94WSoTsNJcXtDC
nSSumoIfUPVjLNI8ISLYrkixhtxQFWxTysUwm8jF4KCpeB9eT8kNBoLO3ILm
3L49mZfzye3b//SPBwIcI5j3SQKbH56oJhyMEwNafN9o0t/XjlrsrVmfZAWq
+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
33hz9+V1DTfWmOY7H+7c/e7u3ePjO5PdCR8mE8rOYxvLdCQvDeyWbBmpDdQq
+rj2DeHULC4zCiSInlyEwHwGIVyZBfAOXtMoCMiySt222++DB9hvqN6Yva7V
8Mwz6MGJGChBjmhLBxf6kRqGA9jElaHUqxJIzXwJ5+aKzOeJ/RZiBNZ3QCu7
c8izrxFV5XJ77n3n7jUmcOUJu4h1AVjiHBO6MM7zozjPczCYzyxfVigsSwPL
MfcODMT7NjiWqVEP/v7D+9+TQsse5Pkc2Y3XpNOh9+6U/u/esatkxMOfnj15
+TK6WbJvpt9kB+6lxxAzDZZDFmXo4JRnDx6N4+vuTRlZI9zDtgVydi9NOF6o
kB36KOvhxuY7u4Vq82l9pSgoo7WyvR1JAGKJS+uIbn427R5MEE4+OQwippyz
xIW5tSjKuyr6O3HrLi59y3Hpi3x7tdhc/5Z/99uyqtfzX8vfmg+/tw+ny1Vd
bO43m19nv3Z0LA+mBSvIze/H+X6IK78lAPTMuASxukQTcJE7IcTGRZdF5qMg
1D9LaZzBbL3vVYnCgri6ZxIiE7iTxh+LsUXbIlmyIMqcKHccxfIn1pFFTJ0W
IJMC8lNfewUW/mf6u6gdrcuDgvx3pg1F7h8dM/MgNPj+0f1HoadorwuphI3C
ELbT8ZUQHFpJEL59elCIDUUROO3/wm63V0V10bkQrf62OPO19wqfjsiOHMGz
1nMxtupnlXrD6jzOlpiq/QFH8Q2jILQ4EqfG8lOi5rEZl5kCTfhc5bSxyGkq
k5m1nB+yBgSmsb3OXyvTwARbfYc9h/laJE/zdbO7NlyfrGMsuMy0C4VEBhpm
h16OulMaUgZ3VkNzuc03IlgBV3fXgPgzxU8tRSUEV4yaRmnaQ+uvgEqaxYeu
kPgfaAUapErHtfe4EFcVur3YTEL95YaS28l1z0ontZQLvWZubNluKqHZSiTv
U8EyPkKCauzyIeCcOTg/uou78d/cQ2TedcGQpU2RtEo1xvjuTjLGvaNHw+jR
W2XuVIVlYXotvGdpkaQxkJNUCDEPmc3+48en716evQIyEikDDXakLFUPZUF4
pkelXFkjrmMOYaEvrps4GKLzuRIGEzFAR96r6dQPM6RLj9zcbL2Rg5haG/Kw
d9VKzcR2AiskNUYDBU1HEJgbP7w/lMgauXi8XeG7V3lT5lXIeP753atxmy80
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

-->

</rfc>
