<?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.29 (Ruby 2.6.10) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-holmgren-at-repository-01" category="std" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.30.2 -->
  <front>
    <title abbrev="AT Repo and Sync">Authenticated Transfer Repository and Synchronization</title>
    <seriesInfo name="Internet-Draft" value="draft-holmgren-at-repository-01"/>
    <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="March" day="16"/>
    <area>Applications and Real-Time Area</area>
    <abstract>
      <?line 146?>

<t>This document specifies the repository and synchronization semantics for Authenticated Transfer (AT), a protocol for cryptographically-verifiable storage and distribution of structured user-controlled data. It defines the AT repository that serves as the fundamental data storage model. It further specifies synchronization mechanisms that allow efficient distribution of repository changes to interested parties.</t>
      <t>This document specifically deals with the repository and sync protocol. Overall network architecture is described further in <xref target="AT-ARCH"/>.</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>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/bluesky-social/ietf-drafts"/>.</t>
    </note>
  </front>
  <middle>
    <?line 152?>

<section anchor="user-id">
      <name>Introduction</name>
      <t>The Authenticated Transfer (AT) repository and synchronization protocol addresses the challenges of building decentralized applications that require consistent data replication across distributed multi-party infrastructure. Traditional web platforms maintain user data at a single network location, creating vendor lock-in and limiting user agency over their digital identity and published content.</t>
      <t>In the AT model, user data is stored in cryptographically signed repositories that can be hosted, synchronized, and distributed by any compatible server while preserving data authenticity and user ownership. Each repository consists of a set of CBOR-encoded objects called records, organized lexicographically by type. The cryptographic structure allows repository contents to be re-distributed and cached by any network participant without requiring trust in intermediary hosts.</t>
      <t>The synchronization system provides efficient mechanisms for propagating repository state changes across the network, supporting both real-time streaming updates and bulk synchronization scenarios. The protocol can detect dropped or withheld updates and provides cryptographic proofs for all operations, including record deletions, ensuring that consumers can maintain accurate and complete views of repository state.</t>
      <t>This document specifically deals with the repository and sync protocol. Overall network architecture is described further in <xref target="AT-ARCH"/>.</t>
    </section>
    <section anchor="repo">
      <name>Repository</name>
      <t>An AT repository provides a sorted key-value interface where values are CBOR-encoded objects refered to as records. Applications interact with repositories through standard CRUD operations while the underlying Merkle tree structure enables cryptographic verification of all modifications.</t>
      <t>Repository authority is established through Decentralized Identifiers (DIDs). Each repository is associated with exactly one DID, which resolves to the cryptographic key material necessary for verifying repositories.</t>
      <t>The repository structure provides several advantages over individualy signed objects:</t>
      <ul spacing="normal">
        <li>
          <t>Simplified key rotation through a single repository-level signature rather than record-level signatures</t>
        </li>
        <li>
          <t>Cryptographic proofs of record deletion</t>
        </li>
        <li>
          <t>Completeness guarantees that enable observers to detect withheld, missing, or outdated records</t>
        </li>
      </ul>
      <t>This document describes version <tt>3</tt> of the AT repository format. Both previous versions are deprecated, and implementations do not need to support them.</t>
      <section anchor="repo-semantics">
        <name>Repository Semantics</name>
        <t>Records are discrete units of user data, each CBOR-encoded and identified by a unique key within the repository. The repository is schema-agnostic and provides the foundational layer for higher-level data models and application semantics.</t>
        <t>Repositories support individual record operations as well as batch writes that group multiple operations under a single commit, or signed mutation, to the repository. When applying batch operations, implementations should ensure that the resulting changes can be adequately represented within the synchronization system (see <xref target="commit-events"/>).</t>
        <t>By convention, records are organized using a hierarchical two-part key structure consisting of a collection identifier and a record key. Record keys may be derived from timestamps or other monotonically increasing values, ensuring that new records are typically added to the lexicographically rightmost position within their collection.</t>
        <t>Repository efficiency, especially in partial synchronization situations, benefits from grouping related records around lexicographically similar keys. This grouping allows for structural sharing within the repository data structure and reduces cryptographic proof sizes.</t>
      </section>
      <section anchor="repo-structure">
        <name>Repository Structure</name>
        <t>AT repositories are organized as a <eref target="https://inria.hal.science/hal-02303490/document">Merkle Search Tree</eref> (<xref target="MST"/>) with a cryptographically signed commit referencing the tree root.</t>
        <t>The MST 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 user records.</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 hash link.</t>
      </section>
      <section anchor="user-ids">
        <name>User Identifiers</name>
        <t>Repository authority is established through a resolvable user identifier specified in the repository commit (<xref target="commits"/>). AT employs Decentralized Identifiers (DIDs) as defined in <xref target="DID"/> for this purpose.</t>
        <t>DIDs are globally unique identifiers that resolve to DID Documents containing cryptographic key material and other metadata associated with the identifier. Resolution enables independent verification of repository commits without dependence on centralized authorities.</t>
        <t>Each repository must reference exactly one DID, and each DID may be associated with at most one AT repository.</t>
        <t>The signing key for repository commits is specified within the DID document's <tt>verificationMethod</tt> array. The key entry must have an <tt>id</tt> field ending in <tt>#atproto</tt>. When multiple possible verification methods are present, implementations must use the first valid entry and ignore subsequent ones. The public key must be encoded using the <tt>publicKeyMultibase</tt> format as specified in <xref target="CONTROLLEDID"/>. The signing key must use one of the signing algorithms described in <xref target="sig-curves"/>.</t>
        <t>DID resolution may return supplementary information beyond the signing key, including canonical repository hosting locations, alternative user identifiers, or relevant service endpoints.</t>
        <t>To ensure interoperability, AT restricts support to specific DID methods. Currently supported methods are <tt>did:web</tt> and <tt>did:plc</tt>. The resolution mechanisms and specifications for these methods are described in <xref target="DIDWEB"/> and <xref target="DIDPLC"/>.</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 owner and contains metadata necessary for verification and synchronization.</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 user identifier associated with the repository as described in <xref target="user-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> (hash link, required): Hash pointer 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"/>).</t>
          </li>
          <li>
            <t><strong><tt>prev</tt></strong> (hash link, nullable): Optional pointer 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 signature generation and verification procedures are detailed in <xref target="sig-gen"/>.</t>
      </section>
      <section anchor="mst">
        <name>MST Construction</name>
        <t>The MST structure is deterministically reproducible from any given key-value mapping, where keys are non-empty byte strings and values are 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>
        <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).</t>
          <t>Keys are assigned to tree levels based on a layer value computed from the key itself. Nodes at each level contain all 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 hash pointer 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" stroke-linecap="round">
                  <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. This is the only case where a node without entries is permitted.</t>
          <t>Nodes that contain no key entries but do contain subtree links are allowed at intermediate positions, provided those subtrees eventually contain key entries. However, such nodes are not permitted 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 are not permitted 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 through 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> (hash link, 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> (hash link, required): Reference to the record data for this entry</t>
                </li>
                <li>
                  <t><tt>t</tt> (hash link, 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>
        </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: hash link <tt>0x01711220643b9326...</tt></t>
            </li>
            <li>
              <t>Entry: <tt>key7</tt> → record hash link <tt>0x017112202d9aa87e...</tt></t>
            </li>
            <li>
              <t>Right subtree: hash link <tt>0x0171122047e2886f...</tt></t>
            </li>
            <li>
              <t>Entry: <tt>key10</tt> → record hash link <tt>0x0171122010b6da2c...</tt></t>
            </li>
          </ul>
          <t>This node would be encoded as follows:</t>
          <sourcecode type="json"><![CDATA[
{
        l: 0x01711220643b9326...
        e: [
                {
                        p: 0,
                        k: "key7",
                        v: 0x017112202d9aa87e...
                        t: 0x0171122047e2886f...
                },
                {
                        p: 3,
                        k: "10",
                        v: 0x0171122010b6da2c...
                        t: null
                }
        ]
{
]]></sourcecode>
        </section>
      </section>
      <section anchor="signatures">
        <name>Commit Signatures</name>
        <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 repository's DID as specified in <xref target="user-ids"/>.</t>
        <t>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>
        <section anchor="sig-gen">
          <name>Signature Generation</name>
          <t>To generate a commit signature:</t>
          <ol spacing="normal" type="1"><li>
              <t>Populate all commit data fields except the <tt>sig</tt> field</t>
            </li>
            <li>
              <t>Serialize the unsigned commit using deterministic CBOR encoding (see <xref target="cbor"/>)</t>
            </li>
            <li>
              <t>Compute the SHA-256 hash of the serialized bytes</t>
            </li>
            <li>
              <t>Sign the hash using the current signing key associated with the repository's DID</t>
            </li>
            <li>
              <t>Format the signature as a concatenation of the 32-byte <tt>r</tt> and 32-byte <tt>s</tt> values</t>
            </li>
            <li>
              <t>Add the resulting 64-byte signature to the commit object as the <tt>sig</tt> field</t>
            </li>
          </ol>
        </section>
        <section anchor="sig-curves">
          <name>Supported Curves</name>
          <t>AT implementations must support both 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>
        <section anchor="sig-canonicalization">
          <name>Signature Canonicalization</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 synchronization confusion.</t>
          <t>To prevent such scenarios, AT requires all ECDSA signatures 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.</t>
        </section>
      </section>
      <section anchor="cbor">
        <name>Deterministic 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="CBOR"/>, with map key ordering following the original specification in <xref section="3.9" sectionFormat="of" target="RFC7049"/> for historical compatibility.</t>
        <t>For interoperability purposes, hash links between repository objects are encoded using a specific format within the CBOR structure. SHA-256 hash links are represented as CBOR byte strings under tag 42, with the byte string containing the 32-byte hash value prefixed by the fixed byte sequence <tt>0x01711220</tt>.</t>
        <t>Hash links that point to arbitrary binary data instead of other repository objects should be encoded similarly though prefixed by the fixed byte sequence <tt>0x01551220</tt>.</t>
      </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 identifies the root block, typically the repository's commit object.</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>
        <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>root</tt> (array, required): Single-element array containing the 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, prefixed with <tt>0x01711220</tt> as specified in <xref target="cbor"/></t>
            </li>
            <li>
              <t>The CBOR-encoded block data</t>
            </li>
          </ol>
          <figure anchor="f-serialization">
            <name>Repo Serialization Layout</name>
            <artset>
              <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="64" width="568" viewBox="0 0 568 64" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                  <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 352,32" fill="none" stroke="black"/>
                  <path d="M 408,32 L 544,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="380" y="36">Data</text>
                    <text x="552" y="36">|</text>
                    <text x="8" y="52">[</text>
                    <text x="32" y="52">int</text>
                    <text x="56" y="52">|</text>
                    <text x="92" y="52">Header</text>
                    <text x="144" y="52">block</text>
                    <text x="176" y="52">]</text>
                    <text x="192" y="52">[</text>
                    <text x="216" y="52">int</text>
                    <text x="240" y="52">|</text>
                    <text x="268" y="52">hash</text>
                    <text x="296" y="52">|</text>
                    <text x="328" y="52">block</text>
                    <text x="360" y="52">]</text>
                    <text x="376" y="52">[</text>
                    <text x="400" y="52">int</text>
                    <text x="424" y="52">|</text>
                    <text x="452" y="52">hash</text>
                    <text x="480" y="52">|</text>
                    <text x="512" y="52">block</text>
                    <text x="544" y="52">]</text>
                    <text x="560" y="52">…</text>
                  </g>
                </svg>
              </artwork>
              <artwork type="ascii-art"><![CDATA[
|------- Header -------| |------------------ Data ------------------|
[ int | Header block ] [ int | hash | block ] [ int | hash | block ] …
]]></artwork>
            </artset>
          </figure>
        </section>
        <section anchor="serialization-ordering">
          <name>Block Ordering</name>
          <t>Block ordering should follow preorder traversal of the included repository portion when possible, though parsers must be tolerant of other or unexpected orderings.</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 processing of large repositories without requiring complete buffering of the serialized data.</t>
        </section>
      </section>
    </section>
    <section anchor="sync">
      <name>Synchronization</name>
      <t>The AT synchronization model operates on the principle that any participant can independently verify repository updates. This allows sync to occur between any client and server without requiring that the server is a canonical or trusted host.</t>
      <t>AT supports multiple synchronization patterns: full repository synchronization for complete replicas, partial synchronization for specific record subsets, and proof-only synchronization for cryptographic verification without content retrieval.</t>
      <t>The typical synchronization workflow establishes baseline state through full synchronization, then maintains currency through incremental updates. Full synchronization is performed by fetching a complete serialized repository over HTTPS.</t>
      <section anchor="revs">
        <name>Repository Revisions</name>
        <t>Each repository maintains a <tt>rev</tt> field (short for “revision”) that functions as a logical clock for the progression of the contents of the repository over time. The revision value is a short string value that must increase lexicographically with each new commit.</t>
        <t>Revisions may be used when comparing two repositories, especially when obtained from a non-canonical host, to determine which is more recent.</t>
        <section anchor="tids">
          <name>Timestamp Identifier Format</name>
          <t>The recommended mechanism for generating revision values is the Timestamp Identifier (TID) format.</t>
          <t>TIDs provide a standardized revision format with the following properties:</t>
          <ul spacing="normal">
            <li>
              <t>64-bit integer with big-endian byte ordering</t>
            </li>
            <li>
              <t>Base32-sortable encoding using characters <tt>234567abcdefghijklmnopqrstuvwxyz</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 is chosen as 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 a random "clock identifier."</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="diffs">
        <name>Repository Diffs</name>
        <t>Repository diffs enable efficient synchronization by containing only the data that changed between two repository revisions. A diff includes the commit object, MST nodes, and records that differ between an older baseline revision and the current revision. Applying a diff to the baseline repository reconstructs the complete current repository state.</t>
        <t>Diffs use the same serialization format as complete repositories, 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 baseline 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, then the diff must include that block even though it appeared in prior revisions.</t>
        <t>Deleted records and past versions of updated records are excluded from diffs.</t>
        <t>With the exception of deleted record data, the diff may include additional blocks which receivers should ignore.</t>
      </section>
      <section anchor="diff-limits">
        <name>Diff Verification Limitations</name>
        <t>Repository diffs present verification challenges for consumers who do not maintain complete repository state. These consumers often wish to authenticate repository content and utilize records without persisting the entire repository structure, making diffs an attractive option for lightweight verification.</t>
        <t>Diffs partially support this use case by providing a signed commit and the relevant portions of the Merkle tree, creating a verifiable proof chain for record creations, updates, and deletions. When a recipient possesses both a diff and a corresponding list of operations, they can use the diff contents to cryptographically verify that the operations are authentic.</t>
        <t>However, observers without knowledge of the complete baseline repository state cannot reliably enumerate all operations by examining the diff contents alone. While comprehensive diffs  reveal created or updated records by traversing to the leaf nodes, they provide no information about deletion operations that occurred during the period that the diff represents.</t>
        <t>This means that while diffs enable verification of a known operation list, they cannot be used to exhaustively reconstruct the complete operation list from diff contents alone. However, if a recipient has a complete repository structure from some prior revision and receives a diff representing changes since that revision, they can compute the complete set of operations that occurred between the two versions.</t>
        <t>This asymmetry means diffs alone cannot substitute for complete state tracking when comprehensive operation enumeration is required. An efficient mechanism for cross-verification of a diff and enumerated operation list against the prior repository commit state is described in {#streaming-validation}.</t>
      </section>
    </section>
    <section anchor="realtime">
      <name>Real-time synchronization</name>
      <t>AT supports real-time synchronization, enabling applications to receive repository updates with minimal latency through a pull-based WebSocket connection.</t>
      <t>Real-time streams of repository updates are often referred to as the “firehose”. The firehose delivers events containing repository diffs along with supporting metadata necessary for verification and processing.</t>
      <t>Each event includes a monotonic cursor that establishes a total ordering across all repository changes from a given host. This ordering enables reliable event replay and ensures that consumers can maintain consistent state even when reconnecting after network interruptions.</t>
      <t>AT allows consumers to maintain fully-verified copies of repository records without storing the underlying Merkle tree structure, providing an efficient method for applications that need authenticated content access without the overhead of complete repository replication.</t>
      <section anchor="cursors">
        <name>Cursors</name>
        <t>Real-time synchronization streams include per-message cursors to improve transmission reliability. Cursors are positive integers that increase monotonically across the stream. Cursor semantics are flexible, and they may contain arbitrary gaps between consecutive messages.</t>
        <t>Consumers track the last cursor value they successfully processed and can specify this cursor when reconnecting to receive any missed messages within the provider's rollback window. Providers maintain no persistent consumer state across connections, relying entirely on the cursor values supplied by consumers during reconnection.</t>
        <t>Stream behavior depends on the cursor value specified during connection:</t>
        <ul spacing="normal">
          <li>
            <t><strong>No cursor specified</strong>: The provider 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 cursor, the provider sends an error message and closes the connection.</t>
          </li>
          <li>
            <t><strong>Cursor within rollback window</strong>: The provider transmits all persisted messages with cursor numbers greater than or equal to the requested cursor, then continues with the real-time stream once caught up.</t>
          </li>
          <li>
            <t><strong>Cursor older than rollback window</strong>: The provider sends an informational message indicating that the requested cursor is too old, then begins transmission at the oldest available event, sends the entire rollback window, and continues with the real-time stream.</t>
          </li>
          <li>
            <t><strong>Cursor value of 0</strong>: The provider treats this as a request for the complete available history, starting at the oldest available event, transmitting the entire rollback window, then continuing with the real-time stream.</t>
          </li>
        </ul>
      </section>
      <section anchor="streaming-events">
        <name>Streaming Events</name>
        <t>The real-time stream delivers two types of events: <tt>commit</tt> and <tt>sync</tt>.</t>
        <section anchor="commit-events">
          <name>Commit Events</name>
          <t>Commit events represent an atomic set of repository modifications and consist of a repository diff combined with some supporting metadata.</t>
          <t>The diff MUST include the new commit and all blocks in the Merkle proof chain for any modified key, as well as blocks for keys directly adjacent to the modified keys. The rationale for including adjacent keys is detailed in <xref target="streaming-validation"/>.</t>
          <t>The metadata provides additional context required for processing and verification and includes:</t>
          <ul spacing="normal">
            <li>
              <t>The revision of the repository after the modifications</t>
            </li>
            <li>
              <t>The revision of the repository before the diff</t>
            </li>
            <li>
              <t>The root hash of the repository MST before the diff</t>
            </li>
            <li>
              <t>A description of the operations contained in the diff with each containing
              </t>
              <ul spacing="normal">
                <li>
                  <t>the key</t>
                </li>
                <li>
                  <t>the hash of the new record at the key (in the case of a create/update)</t>
                </li>
                <li>
                  <t>the hash of the old record at the key (in the case of an update/delete)</t>
                </li>
              </ul>
            </li>
          </ul>
          <t>A single commit events must contain no more than 200 repository operations and the full serialized event should be no larger than 2MB. Mutations that do not fit in these limits should instead be communicated through Sync Events.</t>
        </section>
        <section anchor="sync-events">
          <name>Sync Events</name>
          <t>Sync events declare the current state of a repository, regardless of the previous state.</t>
          <t>Sync events are emitted when commit events cannot adequately describe the transition between repository revisions. This may occur in several scenarios:</t>
          <ul spacing="normal">
            <li>
              <t>Large mutations that exceed the practical size limits for commit events</t>
            </li>
            <li>
              <t>Data loss or corruption that breaks the continuity of commit history</t>
            </li>
            <li>
              <t>Account migration between different infrastructure providers</t>
            </li>
          </ul>
          <t>In these cases, a sync event provides a reset point that encourages consumers to resynchronize against the current authoritative state without requiring knowledge of the intervening changes.</t>
        </section>
      </section>
      <section anchor="streaming-validation">
        <name>Commit Validation</name>
        <t>Commit validation occurs through a two-step process that ensures both the validity of the repository transition and the consumer's resulting synchronization state.</t>
        <t>First, the consumer validates that the commit represents a valid transition from a previous repository revision (<tt>revA</tt>) to the new revision (<tt>revB</tt>). Second, the consumer confirms that they last observed the repository at <tt>revA</tt>. Together, these steps establish that the repository is now definitively at <tt>revB</tt>.</t>
        <t>The validation process inverts all operations against the partial MST provided in the diff. That is, each “create” operation will be inverted as a “delete” operation on the same key and applied to the tree. Each “delete” will become a “create” of the same record, and every “update” will be updated back to the previous value.</t>
        <t>If the operation list is complete and accurate, applying the inverse operations will reconstruct the tree state as it existed before the commit. The hash of this reconstructed tree must match the previous root hash of the MST as specified in the commit event. If the hashes match then the provided list of operations is accurate and exhaustive.</t>
        <t>Because the previous MST root hash is included in the commit event, commits can be validated for internal consistency independent of any local state. If the operation inversion process fails to produce a tree hash matching the declared previous root, the entire commit event should be treated as invalid.</t>
        <t>If the commit is internally consistent but its declared previous root does not match the previous MST root stored locally, then the consumer has become desynchronized, indicating missed events or a disjunction in the producer’s commit history.</t>
      </section>
      <section anchor="resync">
        <name>Re-synchronization</name>
        <t>When a consumer detects desynchronization, either through a disjunction in commit history or a <tt>sync</tt> event that does not match their local state, they 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 streams in, producing a mapping of keys to record hashes that represents the complete repository state.</t>
        <t>This key-to-hash mapping can be compared against existing local state to identify discrepancies and verify the integrity of the re-synchronization. Once validated, this mapping establishes the new baseline state against which future commit events can be applied.</t>
        <t>During the re-synchronization process, any incoming commit events 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="security">
      <name>Security Considerations</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>
      <section anchor="security-cbor">
        <name>CBOR Processing limits</name>
        <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>
      </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 synchronization.</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>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="CBOR">
          <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="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="DID" target="https://www.w3.org/TR/2022/REC-did-core-20220719/">
          <front>
            <title>Decentralized Identifiers  (DIDs) v1.0</title>
            <author fullname="Manu Sporny">
              <organization>Digital Bazaar</organization>
            </author>
            <author fullname="Dave Longley">
              <organization>Digital Bazaar</organization>
            </author>
            <author fullname="Markus Sabadello">
              <organization>Danube Tech</organization>
            </author>
            <author fullname="Drummond Reed">
              <organization>Evernym/Avast</organization>
            </author>
            <author fullname="Orie Steele">
              <organization>Transmute</organization>
            </author>
            <author fullname="Christopher Allen">
              <organization>Blockchain Commons</organization>
            </author>
            <date year="2022" month="July"/>
          </front>
        </reference>
        <reference anchor="CONTROLLEDID" target="https://www.w3.org/TR/2025/REC-cid-1.0-20250515/">
          <front>
            <title>Controlled Identifiers v1.0</title>
            <author fullname="Dave Longley">
              <organization>Digital Bazaar</organization>
            </author>
            <author fullname="Manu Sporny">
              <organization>Digital Bazaar</organization>
            </author>
            <author fullname="Markus Sabadello">
              <organization>Danube Tech</organization>
            </author>
            <author fullname="Drummond Reed">
              <organization>Evernym/Avast</organization>
            </author>
            <author fullname="Orie Steele">
              <organization>Transmute</organization>
            </author>
            <author fullname="Christopher Allen">
              <organization>Blockchain Commons</organization>
            </author>
            <date year="2025" month="May"/>
          </front>
        </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>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="MST" 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">
          <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="DIDWEB" target="https://w3c-ccg.github.io/did-method-web/">
          <front>
            <title>did:web Method Specification (Draft)</title>
            <author fullname="Christian Gribneau">
              <organization>Ology Newswire, Inc.</organization>
            </author>
            <author fullname="Michael Prorock">
              <organization>mesur.io</organization>
            </author>
            <author fullname="Orie Steele">
              <organization>Transmute</organization>
            </author>
            <author fullname="Oliver Terbu">
              <organization>Consensys</organization>
            </author>
            <author fullname="Mike Xu">
              <organization>Consensys</organization>
            </author>
            <author fullname="Dmitri Zagidulin">
              <organization>Digital Bazaar</organization>
            </author>
            <date year="2024" month="July"/>
          </front>
        </reference>
        <reference anchor="DIDPLC" target="https://web.plc.directory/spec/v0.1/did-plc">
          <front>
            <title>did:plc Method Specification v0.1</title>
            <author fullname="Daniel Holmgren">
              <organization>Bluesky Social</organization>
            </author>
            <date year="2023" month="May"/>
          </front>
        </reference>
      </references>
    </references>
  </back>
  <!-- ##markdown-source:
H4sIAD+IuGkAA+19W48bR5bmO39FQnqwZJBUVUmyrQIG2FJJsjQtWYaqejy7
jQYYzAyS6UpmsjOSVaKlavhpgH3dtwW6gXlYzDzuf5j5J/4le65xySQlzc4M
sA8rGHCRzIyMOHEu37nEyclkMurKrrKn2Z2zbbeydVfmprNFdtma2i1sm72z
m8aVXdPuMlMX2cWuzldtU5e/mK5s6jsjM5+39hrvv6Rr/VV3RjjSEm48zVxX
jEZFk9dmDY8qWrPoJqumWi9bW09MN2n9QyZHRyO3na9L52D4breB6189v3wx
qrfruW1PR9tNAcO60xH+73SUN7WztdvCFzCJo5FprcHJbDYVrgTGcDSjd9ZU
k8tybbMzuOLO6KZpr5Zts92cjq7sDj4VMICttzBkli3LbrWdwzDzamvd1W7i
mrw01YPSdosJzd7dGY0MEKyBGWUTuCXLFtuq4vU9M3Vpq+ylLJB+bdqlUaKd
Zk953OyCxqUL7NqUFdCG7v0v8uAbO5++3/0yfMTTdmfq7Ad7M2+q4t/0gDne
2R9/VDftGm69puWfP3377jR79+L8uyePnsBn+Ovbo0dPTvUP+OrZq2enNKpy
zzObA/O0pip/Ae55VSAnLUrbuiy7Bxe7+9n18fToDt1DO5f97bbaZSdHJyc8
jmmXtjvNVl23cacPHtzc3ExvHk5hVQ8u3z3Ayx68e34+KcpikjetneA3R98e
P3lAd/utoH8T+X9MsDem3mYXm6atd/7XlGTPSth2U2VPzS/GtJ8Y6pm5ttnr
pl5W9t891hvTXm1ddmHmprBV1RwaD2Y/t9mlzVefmli7Xa8bYnZbHBjp+bUF
EqwfnF0b131irLdtabOLztrKHhiJNMR629lPjHK+akvXNZsVKJKzqhJZ2Meu
TX6Vr0xZZ+cNrsEhG7794fLd29evnw+Y7Rw0Q9vAeCmn9TnsjSEGe/xlDPaY
GCwHBoNhkL8eHz0+fvyl/PUfyxT/Ybz6//nrMH/99Pzp2cXF8zdPX//XhL1+
svMz5+x6DvrpHHQNbIXNgcXYnCT81eYr5LBvvoDDboxbi+r6QpY6qwswVS57
1zgHpm8Jl1w8Pz9JRQG+yU5AM9sc1mXrAkTieVWVG7Dj2fm2BaZ81qxx3T+a
FkbtQE4SJQwbb1oUk+Ojg4twNl/SMuCPk8n1yXRTLD65hpT4Fx0YYNMWLls0
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

-->

</rfc>
