Gunnar

nordisk/gunnar

assets/gunnar-znippy-cycle.svg

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1180 1769.5" font-family="'DejaVu Sans', 'Segoe UI', sans-serif">
  <!-- GENERATED. Do not hand-edit: every number here carries a measurement, and
       editing the picture instead of the datum is how a diagram starts lying. -->
  <defs>
    <linearGradient id="board" x1="0" y1="0" x2="0" y2="1">
      <stop offset="0" stop-color="#0b1c2e"/><stop offset="1" stop-color="#06111d"/>
    </linearGradient>
    <linearGradient id="chip" x1="0" y1="0" x2="0" y2="1">
      <stop offset="0" stop-color="#14384f"/><stop offset="1" stop-color="#0e2a3e"/>
    </linearGradient>
    <linearGradient id="rail" x1="0" y1="0" x2="0" y2="1">
      <stop offset="0" stop-color="#173d57"/><stop offset="1" stop-color="#0c2438"/>
    </linearGradient>
    <linearGradient id="slot" x1="0" y1="0" x2="0" y2="1">
      <stop offset="0" stop-color="#123448"/><stop offset="1" stop-color="#0a2032"/>
    </linearGradient>
    <linearGradient id="hot" x1="0" y1="0" x2="0" y2="1">
      <stop offset="0" stop-color="#1c5a3a"/><stop offset="1" stop-color="#0f3a26"/>
    </linearGradient>
    <linearGradient id="cold" x1="0" y1="0" x2="0" y2="1">
      <stop offset="0" stop-color="#3a2320"/><stop offset="1" stop-color="#281414"/>
    </linearGradient>
    <marker id="arrow" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto">
      <path d="M0 0 L10 5 L0 10 z" fill="context-stroke"/>
    </marker>
  </defs>

  <rect x="0" y="0" width="1180" height="1769.5" fill="url(#board)"/>
  <g stroke="#143a52" stroke-width="1">
    <line x1="0" y1="76" x2="1180" y2="76"/>
    <line x1="0" y1="1721.5" x2="1180" y2="1721.5"/>
  </g>
  <g fill="#16415c">
    <circle cx="40" cy="40" r="2"/><circle cx="1140" cy="40" r="2"/>
    <circle cx="40" cy="1741.5" r="2"/><circle cx="1140" cy="1741.5" r="2"/>
  </g>

  <text x="40" y="44" fill="#eaf6ff" font-size="22" font-weight="700">gunnar</text>
  <text x="143.2" y="38" fill="#9fc9e0" font-size="13">the write and read cycle through Arrow IPC and znippy — per git operation, and over time</text>
  <text x="143.2" y="56" fill="#7fa8c4" font-size="10.5">every box and arrow carries the file:line it lives at</text>
  <g font-size="11">
    <line x1="908" y1="30" x2="944" y2="30" stroke="#6fd3f5" stroke-width="3"/>
    <text x="952" y="34" fill="#cfe6f5">verified call edge</text>
    <line x1="908" y1="48" x2="944" y2="48" stroke="#e0a86a" stroke-width="2.5" stroke-dasharray="7 5"/>
    <text x="952" y="52" fill="#cfe6f5">built, nothing reads it</text>
    <line x1="908" y1="66" x2="944" y2="66" stroke="#f0a9a0" stroke-width="2.5" stroke-dasharray="3 4"/>
    <text x="952" y="70" fill="#cfe6f5">never produced on this path</text>
  </g>

  <!-- ==================== -->
  <!-- PANEL 1 - the five reserved sections -->
  <text x="40" y="108" fill="#6fd3f5" font-size="15" text-anchor="start" font-family="'DejaVu Sans Mono', monospace" font-weight="700">1</text>
  <text x="74" y="108" fill="#eaf6ff" font-size="15" text-anchor="start" font-weight="700">The five reserved sections, and whether anything reads them</text>
  <text x="74" y="125" fill="#9fc9e0" font-size="11" text-anchor="start">plugins/native/znippy-plugin-git/src/ · reserved = ordinary list / decompress / iceberg readers skip them</text>
  <line x1="40" y1="134" x2="1140" y2="134" stroke="#143a52" stroke-width="1"/>
  <rect x="40" y="152" width="204" height="224" rx="10" fill="url(#cold)" stroke="#e0a86a" stroke-width="2" stroke-dasharray="7 5"/>
  <text x="142" y="176" fill="#eaf6ff" font-size="13.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">__gunnar_refs__</text>
  <text x="142" y="192" fill="#9fc9e0" font-size="10" text-anchor="middle">Arrow IPC · push log</text>
  <rect x="50" y="204" width="184" height="19" rx="4" fill="url(#slot)" stroke="#4a6f88" stroke-width="1.1"/>
  <text x="56" y="217.5" fill="#bfe6ff" font-size="9.5" text-anchor="start" font-family="'DejaVu Sans Mono', monospace">name</text>
  <text x="228" y="217.5" fill="#86b3cc" font-size="8.5" text-anchor="end" font-family="'DejaVu Sans Mono', monospace">Utf8</text>
  <rect x="50" y="227" width="184" height="19" rx="4" fill="url(#slot)" stroke="#4a6f88" stroke-width="1.1"/>
  <text x="56" y="240.5" fill="#bfe6ff" font-size="9.5" text-anchor="start" font-family="'DejaVu Sans Mono', monospace">target</text>
  <text x="228" y="240.5" fill="#86b3cc" font-size="8.5" text-anchor="end" font-family="'DejaVu Sans Mono', monospace">Utf8? null=del</text>
  <rect x="50" y="250" width="184" height="19" rx="4" fill="url(#slot)" stroke="#4a6f88" stroke-width="1.1"/>
  <text x="56" y="263.5" fill="#bfe6ff" font-size="9.5" text-anchor="start" font-family="'DejaVu Sans Mono', monospace">peeled</text>
  <text x="228" y="263.5" fill="#86b3cc" font-size="8.5" text-anchor="end" font-family="'DejaVu Sans Mono', monospace">Utf8?</text>
  <rect x="50" y="273" width="184" height="19" rx="4" fill="url(#slot)" stroke="#4a6f88" stroke-width="1.1"/>
  <text x="56" y="286.5" fill="#bfe6ff" font-size="9.5" text-anchor="start" font-family="'DejaVu Sans Mono', monospace">symref_target</text>
  <text x="228" y="286.5" fill="#86b3cc" font-size="8.5" text-anchor="end" font-family="'DejaVu Sans Mono', monospace">Utf8?</text>
  <rect x="50" y="296" width="184" height="19" rx="4" fill="url(#slot)" stroke="#4a6f88" stroke-width="1.1"/>
  <text x="56" y="309.5" fill="#bfe6ff" font-size="9.5" text-anchor="start" font-family="'DejaVu Sans Mono', monospace">push_seq</text>
  <text x="228" y="309.5" fill="#86b3cc" font-size="8.5" text-anchor="end" font-family="'DejaVu Sans Mono', monospace">UInt64 order</text>
  <rect x="50" y="319" width="184" height="19" rx="4" fill="url(#slot)" stroke="#4a6f88" stroke-width="1.1"/>
  <text x="56" y="332.5" fill="#bfe6ff" font-size="9.5" text-anchor="start" font-family="'DejaVu Sans Mono', monospace">updated_ms</text>
  <text x="228" y="332.5" fill="#86b3cc" font-size="8.5" text-anchor="end" font-family="'DejaVu Sans Mono', monospace">UInt64 wall</text>
  <text x="40" y="392" fill="#5f8ba6" font-size="8.5" text-anchor="start">built</text>
  <text x="244" y="392" fill="#86b3cc" font-size="8.5" text-anchor="end" font-family="'DejaVu Sans Mono', monospace">src/refs.rs:93</text>
  <text x="40" y="405" fill="#5f8ba6" font-size="8.5" text-anchor="start">writes</text>
  <text x="244" y="405" fill="#f0a9a0" font-size="8.5" text-anchor="end" font-family="'DejaVu Sans Mono', monospace">— none</text>
  <text x="40" y="418" fill="#5f8ba6" font-size="8.5" text-anchor="start">reads</text>
  <text x="244" y="418" fill="#8fe6b8" font-size="8.5" text-anchor="end" font-family="'DejaVu Sans Mono', monospace">src/refs.rs:237</text>
  <text x="40" y="437" fill="#e6b7ad" font-size="8.8" text-anchor="start">read back by znippy's git plugin; nothing in</text>
  <text x="40" y="448" fill="#e6b7ad" font-size="8.8" text-anchor="start">any server build writes this section</text>
  <rect x="264" y="152" width="204" height="224" rx="10" fill="url(#cold)" stroke="#f0a9a0" stroke-width="2" stroke-dasharray="3 4"/>
  <text x="366" y="176" fill="#eaf6ff" font-size="13.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">__gunnar_secrets__</text>
  <text x="366" y="192" fill="#9fc9e0" font-size="10" text-anchor="middle">Arrow IPC · same log</text>
  <rect x="274" y="204" width="184" height="19" rx="4" fill="url(#slot)" stroke="#4a6f88" stroke-width="1.1"/>
  <text x="280" y="217.5" fill="#bfe6ff" font-size="9.5" text-anchor="start" font-family="'DejaVu Sans Mono', monospace">name</text>
  <text x="452" y="217.5" fill="#86b3cc" font-size="8.5" text-anchor="end" font-family="'DejaVu Sans Mono', monospace">Utf8</text>
  <rect x="274" y="227" width="184" height="19" rx="4" fill="url(#slot)" stroke="#4a6f88" stroke-width="1.1"/>
  <text x="280" y="240.5" fill="#bfe6ff" font-size="9.5" text-anchor="start" font-family="'DejaVu Sans Mono', monospace">ciphertext</text>
  <text x="452" y="240.5" fill="#86b3cc" font-size="8.5" text-anchor="end" font-family="'DejaVu Sans Mono', monospace">Binary? sealed</text>
  <rect x="274" y="250" width="184" height="19" rx="4" fill="url(#slot)" stroke="#4a6f88" stroke-width="1.1"/>
  <text x="280" y="263.5" fill="#bfe6ff" font-size="9.5" text-anchor="start" font-family="'DejaVu Sans Mono', monospace">recipient</text>
  <text x="452" y="263.5" fill="#86b3cc" font-size="8.5" text-anchor="end" font-family="'DejaVu Sans Mono', monospace">Utf8? label</text>
  <rect x="274" y="273" width="184" height="19" rx="4" fill="url(#slot)" stroke="#4a6f88" stroke-width="1.1"/>
  <text x="280" y="286.5" fill="#bfe6ff" font-size="9.5" text-anchor="start" font-family="'DejaVu Sans Mono', monospace">push_seq</text>
  <text x="452" y="286.5" fill="#86b3cc" font-size="8.5" text-anchor="end" font-family="'DejaVu Sans Mono', monospace">UInt64</text>
  <rect x="274" y="296" width="184" height="19" rx="4" fill="url(#slot)" stroke="#4a6f88" stroke-width="1.1"/>
  <text x="280" y="309.5" fill="#bfe6ff" font-size="9.5" text-anchor="start" font-family="'DejaVu Sans Mono', monospace">updated_ms</text>
  <text x="452" y="309.5" fill="#86b3cc" font-size="8.5" text-anchor="end" font-family="'DejaVu Sans Mono', monospace">UInt64</text>
  <text x="264" y="392" fill="#5f8ba6" font-size="8.5" text-anchor="start">built</text>
  <text x="468" y="392" fill="#86b3cc" font-size="8.5" text-anchor="end" font-family="'DejaVu Sans Mono', monospace">src/secrets.rs:89</text>
  <text x="264" y="405" fill="#5f8ba6" font-size="8.5" text-anchor="start">writes</text>
  <text x="468" y="405" fill="#f0a9a0" font-size="8.5" text-anchor="end" font-family="'DejaVu Sans Mono', monospace">— none</text>
  <text x="264" y="418" fill="#5f8ba6" font-size="8.5" text-anchor="start">reads</text>
  <text x="468" y="418" fill="#f0a9a0" font-size="8.5" text-anchor="end" font-family="'DejaVu Sans Mono', monospace">— none</text>
  <text x="264" y="437" fill="#e6b7ad" font-size="8.8" text-anchor="start">FoldRequest carries no secrets, so the</text>
  <text x="264" y="448" fill="#e6b7ad" font-size="8.8" text-anchor="start">archive section has no input; the store is</text>
  <text x="264" y="459" fill="#e6b7ad" font-size="8.8" text-anchor="start">sealed separately at stores.rs:279</text>
  <rect x="488" y="152" width="204" height="224" rx="10" fill="url(#cold)" stroke="#f0a9a0" stroke-width="2" stroke-dasharray="3 4"/>
  <text x="590" y="176" fill="#eaf6ff" font-size="13.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">__gunnar_oid__</text>
  <text x="590" y="192" fill="#9fc9e0" font-size="10" text-anchor="middle">raw · stree keyspace</text>
  <rect x="498" y="204" width="184" height="19" rx="4" fill="url(#slot)" stroke="#4a6f88" stroke-width="1.1"/>
  <text x="504" y="217.5" fill="#bfe6ff" font-size="9.5" text-anchor="start" font-family="'DejaVu Sans Mono', monospace">magic/ver</text>
  <text x="676" y="217.5" fill="#86b3cc" font-size="8.5" text-anchor="end" font-family="'DejaVu Sans Mono', monospace">ZNPYGOID v2</text>
  <rect x="498" y="227" width="184" height="19" rx="4" fill="url(#slot)" stroke="#4a6f88" stroke-width="1.1"/>
  <text x="504" y="240.5" fill="#bfe6ff" font-size="9.5" text-anchor="start" font-family="'DejaVu Sans Mono', monospace">keys[n]</text>
  <text x="676" y="240.5" fill="#86b3cc" font-size="8.5" text-anchor="end" font-family="'DejaVu Sans Mono', monospace">i64 oid[..8]</text>
  <rect x="498" y="250" width="184" height="19" rx="4" fill="url(#slot)" stroke="#4a6f88" stroke-width="1.1"/>
  <text x="504" y="263.5" fill="#bfe6ff" font-size="9.5" text-anchor="start" font-family="'DejaVu Sans Mono', monospace">rows[n]</text>
  <text x="676" y="263.5" fill="#86b3cc" font-size="8.5" text-anchor="end" font-family="'DejaVu Sans Mono', monospace">u64 lookup</text>
  <rect x="498" y="273" width="184" height="19" rx="4" fill="url(#slot)" stroke="#4a6f88" stroke-width="1.1"/>
  <text x="504" y="286.5" fill="#bfe6ff" font-size="9.5" text-anchor="start" font-family="'DejaVu Sans Mono', monospace">ords[n]</text>
  <text x="676" y="286.5" fill="#86b3cc" font-size="8.5" text-anchor="end" font-family="'DejaVu Sans Mono', monospace">u32 ordinal</text>
  <rect x="498" y="296" width="184" height="19" rx="4" fill="url(#slot)" stroke="#4a6f88" stroke-width="1.1"/>
  <text x="504" y="309.5" fill="#bfe6ff" font-size="9.5" text-anchor="start" font-family="'DejaVu Sans Mono', monospace">oids[n]</text>
  <text x="676" y="309.5" fill="#86b3cc" font-size="8.5" text-anchor="end" font-family="'DejaVu Sans Mono', monospace">verify step</text>
  <text x="590" y="332" fill="#7fa8c4" font-size="9" text-anchor="middle">8B prefix is a FILTER</text>
  <text x="488" y="392" fill="#5f8ba6" font-size="8.5" text-anchor="start">built</text>
  <text x="692" y="392" fill="#86b3cc" font-size="8.5" text-anchor="end" font-family="'DejaVu Sans Mono', monospace">src/oid_index.rs:79</text>
  <text x="488" y="405" fill="#5f8ba6" font-size="8.5" text-anchor="start">writes</text>
  <text x="692" y="405" fill="#f0a9a0" font-size="8.5" text-anchor="end" font-family="'DejaVu Sans Mono', monospace">— none</text>
  <text x="488" y="418" fill="#5f8ba6" font-size="8.5" text-anchor="start">reads</text>
  <text x="692" y="418" fill="#f0a9a0" font-size="8.5" text-anchor="end" font-family="'DejaVu Sans Mono', monospace">— none</text>
  <text x="488" y="437" fill="#e6b7ad" font-size="8.8" text-anchor="start">pack_tier returns an empty section list; the</text>
  <text x="488" y="448" fill="#e6b7ad" font-size="8.8" text-anchor="start">pack's own .idx is the oid index, O(log n)</text>
  <text x="488" y="459" fill="#e6b7ad" font-size="8.8" text-anchor="start">over a 256-bucket fanout</text>
  <rect x="712" y="152" width="204" height="224" rx="10" fill="url(#cold)" stroke="#f0a9a0" stroke-width="2" stroke-dasharray="3 4"/>
  <text x="814" y="176" fill="#eaf6ff" font-size="13.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">__gunnar_graph__</text>
  <text x="814" y="192" fill="#9fc9e0" font-size="10" text-anchor="middle">Arrow IPC · commit graph</text>
  <rect x="722" y="204" width="184" height="19" rx="4" fill="url(#slot)" stroke="#4a6f88" stroke-width="1.1"/>
  <text x="728" y="217.5" fill="#bfe6ff" font-size="9.5" text-anchor="start" font-family="'DejaVu Sans Mono', monospace">oid</text>
  <text x="900" y="217.5" fill="#86b3cc" font-size="8.5" text-anchor="end" font-family="'DejaVu Sans Mono', monospace">Utf8</text>
  <rect x="722" y="227" width="184" height="19" rx="4" fill="url(#slot)" stroke="#4a6f88" stroke-width="1.1"/>
  <text x="728" y="240.5" fill="#bfe6ff" font-size="9.5" text-anchor="start" font-family="'DejaVu Sans Mono', monospace">parents</text>
  <text x="900" y="240.5" fill="#86b3cc" font-size="8.5" text-anchor="end" font-family="'DejaVu Sans Mono', monospace">List&lt;Utf8&gt;</text>
  <rect x="722" y="250" width="184" height="19" rx="4" fill="url(#slot)" stroke="#4a6f88" stroke-width="1.1"/>
  <text x="728" y="263.5" fill="#bfe6ff" font-size="9.5" text-anchor="start" font-family="'DejaVu Sans Mono', monospace">tree</text>
  <text x="900" y="263.5" fill="#86b3cc" font-size="8.5" text-anchor="end" font-family="'DejaVu Sans Mono', monospace">Utf8?</text>
  <rect x="722" y="273" width="184" height="19" rx="4" fill="url(#slot)" stroke="#4a6f88" stroke-width="1.1"/>
  <text x="728" y="286.5" fill="#bfe6ff" font-size="9.5" text-anchor="start" font-family="'DejaVu Sans Mono', monospace">committer_time</text>
  <text x="900" y="286.5" fill="#86b3cc" font-size="8.5" text-anchor="end" font-family="'DejaVu Sans Mono', monospace">Int64? s</text>
  <rect x="722" y="296" width="184" height="19" rx="4" fill="url(#slot)" stroke="#4a6f88" stroke-width="1.1"/>
  <text x="728" y="309.5" fill="#bfe6ff" font-size="9.5" text-anchor="start" font-family="'DejaVu Sans Mono', monospace">generation</text>
  <text x="900" y="309.5" fill="#86b3cc" font-size="8.5" text-anchor="end" font-family="'DejaVu Sans Mono', monospace">UInt32 gen</text>
  <text x="814" y="332" fill="#7fa8c4" font-size="9" text-anchor="middle">gen = 1 + max(parents)</text>
  <text x="712" y="392" fill="#5f8ba6" font-size="8.5" text-anchor="start">built</text>
  <text x="916" y="392" fill="#86b3cc" font-size="8.5" text-anchor="end" font-family="'DejaVu Sans Mono', monospace">src/graph.rs:47</text>
  <text x="712" y="405" fill="#5f8ba6" font-size="8.5" text-anchor="start">writes</text>
  <text x="916" y="405" fill="#f0a9a0" font-size="8.5" text-anchor="end" font-family="'DejaVu Sans Mono', monospace">— none</text>
  <text x="712" y="418" fill="#5f8ba6" font-size="8.5" text-anchor="start">reads</text>
  <text x="916" y="418" fill="#f0a9a0" font-size="8.5" text-anchor="end" font-family="'DejaVu Sans Mono', monospace">— none</text>
  <text x="712" y="437" fill="#e6b7ad" font-size="8.8" text-anchor="start">gunnar's ancestry walk is O(commits) object</text>
  <text x="712" y="448" fill="#e6b7ad" font-size="8.8" text-anchor="start">reads instead</text>
  <rect x="936" y="152" width="204" height="224" rx="10" fill="url(#cold)" stroke="#f0a9a0" stroke-width="2" stroke-dasharray="3 4"/>
  <text x="1038" y="176" fill="#eaf6ff" font-size="13.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">__gunnar_reach__</text>
  <text x="1038" y="192" fill="#9fc9e0" font-size="10" text-anchor="middle">Arrow IPC · roaring bitmaps</text>
  <rect x="946" y="204" width="184" height="19" rx="4" fill="url(#slot)" stroke="#4a6f88" stroke-width="1.1"/>
  <text x="952" y="217.5" fill="#bfe6ff" font-size="9.5" text-anchor="start" font-family="'DejaVu Sans Mono', monospace">commit_oid</text>
  <text x="1124" y="217.5" fill="#86b3cc" font-size="8.5" text-anchor="end" font-family="'DejaVu Sans Mono', monospace">Utf8</text>
  <rect x="946" y="227" width="184" height="19" rx="4" fill="url(#slot)" stroke="#4a6f88" stroke-width="1.1"/>
  <text x="952" y="240.5" fill="#bfe6ff" font-size="9.5" text-anchor="start" font-family="'DejaVu Sans Mono', monospace">cardinality</text>
  <text x="1124" y="240.5" fill="#86b3cc" font-size="8.5" text-anchor="end" font-family="'DejaVu Sans Mono', monospace">UInt64</text>
  <rect x="946" y="250" width="184" height="19" rx="4" fill="url(#slot)" stroke="#4a6f88" stroke-width="1.1"/>
  <text x="952" y="263.5" fill="#bfe6ff" font-size="9.5" text-anchor="start" font-family="'DejaVu Sans Mono', monospace">bitmap</text>
  <text x="1124" y="263.5" fill="#86b3cc" font-size="8.5" text-anchor="end" font-family="'DejaVu Sans Mono', monospace">Binary  roaring</text>
  <text x="1038" y="286" fill="#7fa8c4" font-size="9" text-anchor="middle">over object ORDINALS</text>
  <text x="1038" y="309" fill="#7fa8c4" font-size="9" text-anchor="middle">want−have = ANDNOT</text>
  <text x="1038" y="332" fill="#7fa8c4" font-size="9" text-anchor="middle">policy: 512 tips + stride</text>
  <text x="936" y="392" fill="#5f8ba6" font-size="8.5" text-anchor="start">built</text>
  <text x="1140" y="392" fill="#86b3cc" font-size="8.5" text-anchor="end" font-family="'DejaVu Sans Mono', monospace">src/reach.rs:65</text>
  <text x="936" y="405" fill="#5f8ba6" font-size="8.5" text-anchor="start">writes</text>
  <text x="1140" y="405" fill="#f0a9a0" font-size="8.5" text-anchor="end" font-family="'DejaVu Sans Mono', monospace">— none</text>
  <text x="936" y="418" fill="#5f8ba6" font-size="8.5" text-anchor="start">reads</text>
  <text x="1140" y="418" fill="#f0a9a0" font-size="8.5" text-anchor="end" font-family="'DejaVu Sans Mono', monospace">— none</text>
  <text x="936" y="437" fill="#e6b7ad" font-size="8.8" text-anchor="start">gunnar answers want−have from a git</text>
  <text x="936" y="448" fill="#e6b7ad" font-size="8.8" text-anchor="start">.bitmap over object ordinals, O(words); this</text>
  <text x="936" y="459" fill="#e6b7ad" font-size="8.8" text-anchor="start">section is a second, unused encoding</text>

  <!-- ==================== -->
  <!-- ENCLOSING FACT - znippy is not in gunnar's resolved graph -->
  <rect x="40" y="499" width="1100" height="77.8" rx="8" fill="url(#cold)" stroke="#f0a9a0" stroke-width="2" stroke-dasharray="3 4"/>
  <text x="56" y="521" fill="#f0a9a0" font-size="13" text-anchor="start" font-weight="700">the five sections sit outside a server build's dependency graph</text>
  <text x="56" y="537" fill="#e6b7ad" font-size="9.6" text-anchor="start">Cargo.toml:55 excludes the old znippy engine crate from the workspace. znippy's codec cmake-builds C and C++ from a downloaded tarball during `cargo build`, and cargo reads a path dependency's manifest at</text>
  <text x="56" y="549.6" fill="#e6b7ad" font-size="9.6" text-anchor="start">resolve time even when the feature is off, so a `znippy` feature would need a sibling checkout on every machine that builds gunnar. gunnar's Cargo.lock holds 0 znippy entries (the desktop 2026-08-04), and</text>
  <text x="56" y="562.2" fill="#e6b7ad" font-size="9.6" text-anchor="start">inside a workspace member the three index sections exist only as comments.</text>

  <!-- ==================== -->
  <!-- PANEL 2 - per git operation, bytes in and bytes out -->
  <text x="40" y="602.8" fill="#6fd3f5" font-size="15" text-anchor="start" font-family="'DejaVu Sans Mono', monospace" font-weight="700">2</text>
  <text x="74" y="602.8" fill="#eaf6ff" font-size="15" text-anchor="start" font-weight="700">Per git operation: where the bytes enter, what touches them, where they leave</text>
  <text x="74" y="619.8" fill="#9fc9e0" font-size="11" text-anchor="start">solid = verified call edge · dashed amber = written and never read · dotted coral = never produced on this path</text>
  <line x1="40" y1="628.8" x2="1140" y2="628.8" stroke="#143a52" stroke-width="1"/>
  <rect x="40" y="646.8" width="1100" height="22" rx="5" fill="url(#rail)" stroke="#3c6a86" stroke-width="1"/>
  <text x="50" y="662.3" fill="#dff1ff" font-size="11.5" text-anchor="start" font-family="'DejaVu Sans Mono', monospace" font-weight="700">git push</text>
  <text x="172" y="662.3" fill="#9fc9e0" font-size="10" text-anchor="start">receive-pack</text>
  <text x="1130" y="662.3" fill="#7fa8c4" font-size="9" text-anchor="end" font-family="'DejaVu Sans Mono', monospace">in: pkt-line cmds + PACK, ssh/http   out: pack-&lt;id&gt;.pack/.idx + ref CAS</text>
  <rect x="40" y="678.8" width="134.86" height="50" rx="7" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.6"/>
  <text x="107.43" y="697.8" fill="#eaf6ff" font-size="10.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">pkt-line</text>
  <text x="107.43" y="711.8" fill="#9fc9e0" font-size="8.8" text-anchor="middle">cmd list, sideband</text>
  <text x="107.43" y="723.8" fill="#5f8ba6" font-size="7.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">src/transport.rs:1428</text>
  <path d="M177.86 703.8 H191.86" fill="none" stroke="#6fd3f5" stroke-width="2.6" marker-end="url(#arrow)"/>
  <circle cx="187.86" cy="703.8" r="3" fill="#bfecff"/>
  <rect x="200.86" y="678.8" width="134.86" height="50" rx="7" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.6"/>
  <text x="268.29" y="697.8" fill="#eaf6ff" font-size="10.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">serve_session</text>
  <text x="268.29" y="711.8" fill="#9fc9e0" font-size="8.8" text-anchor="middle">&lt;old&gt; &lt;new&gt; &lt;ref&gt;</text>
  <text x="268.29" y="723.8" fill="#5f8ba6" font-size="7.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">src/receive_pack.rs:905</text>
  <path d="M338.71 703.8 H352.71" fill="none" stroke="#6fd3f5" stroke-width="2.6" marker-end="url(#arrow)"/>
  <circle cx="348.71" cy="703.8" r="3" fill="#bfecff"/>
  <rect x="361.71" y="678.8" width="134.86" height="50" rx="7" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.6"/>
  <text x="429.14" y="697.8" fill="#eaf6ff" font-size="10.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">index_thin_pack</text>
  <text x="429.14" y="711.8" fill="#9fc9e0" font-size="8.8" text-anchor="middle">O(bytes), SHA-1-bound</text>
  <text x="429.14" y="723.8" fill="#5f8ba6" font-size="7.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">src/read.rs:138</text>
  <path d="M499.57 703.8 H513.57" fill="none" stroke="#6fd3f5" stroke-width="2.6" marker-end="url(#arrow)"/>
  <circle cx="509.57" cy="703.8" r="3" fill="#bfecff"/>
  <rect x="522.57" y="678.8" width="134.86" height="50" rx="7" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.6"/>
  <text x="590" y="697.8" fill="#eaf6ff" font-size="10.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">gate</text>
  <text x="590" y="711.8" fill="#9fc9e0" font-size="8.8" text-anchor="middle">connectivity, O(new objects)</text>
  <text x="590" y="723.8" fill="#5f8ba6" font-size="7.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">src/receive_pack.rs:1612</text>
  <path d="M660.43 703.8 H674.43" fill="none" stroke="#6fd3f5" stroke-width="2.6" marker-end="url(#arrow)"/>
  <circle cx="670.43" cy="703.8" r="3" fill="#bfecff"/>
  <rect x="683.43" y="678.8" width="134.86" height="50" rx="7" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.6"/>
  <text x="750.86" y="697.8" fill="#eaf6ff" font-size="10.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">ref CAS</text>
  <text x="750.86" y="711.8" fill="#9fc9e0" font-size="8.8" text-anchor="middle">MustExistAndMatch(old)</text>
  <text x="750.86" y="723.8" fill="#5f8ba6" font-size="7.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">src/lib.rs:859</text>
  <path d="M821.29 703.8 H835.29" fill="none" stroke="#6fd3f5" stroke-width="2.6" marker-end="url(#arrow)"/>
  <circle cx="831.29" cy="703.8" r="3" fill="#bfecff"/>
  <rect x="844.29" y="678.8" width="134.86" height="50" rx="7" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.6"/>
  <text x="911.71" y="697.8" fill="#eaf6ff" font-size="10.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">push refs</text>
  <text x="911.71" y="711.8" fill="#9fc9e0" font-size="8.8" text-anchor="middle">Arrow batch, one push_seq</text>
  <text x="911.71" y="723.8" fill="#5f8ba6" font-size="7.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">src/refs.rs:130</text>
  <path d="M982.14 703.8 H996.14" fill="none" stroke="#f0a9a0" stroke-width="2.6" stroke-dasharray="3 4" marker-end="url(#arrow)"/>
  <circle cx="992.14" cy="703.8" r="3" fill="#bfecff"/>
  <rect x="1005.14" y="678.8" width="134.86" height="50" rx="7" fill="url(#chip)" stroke="#f0a9a0" stroke-width="1.6" stroke-dasharray="3 4"/>
  <text x="1072.57" y="697.8" fill="#eaf6ff" font-size="10.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">__gunnar_refs__</text>
  <text x="1072.57" y="711.8" fill="#9fc9e0" font-size="8.8" text-anchor="middle">one RecordBatch per push</text>
  <text x="1072.57" y="723.8" fill="#5f8ba6" font-size="7.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">src/refs.rs:93</text>
  <text x="40" y="744.8" fill="#f0a9a0" font-size="9.5" text-anchor="start">The live ref transaction lands in gix-ref and arrow_log. znippy's RefLog is constructed inside a fold (the old znippy engine crate/src/lib.rs:186) from a ref snapshot pushed as one batch, so a sealed</text>
  <text x="40" y="757.3" fill="#f0a9a0" font-size="9.5" text-anchor="start">__gunnar_refs__ carries one frame holding the current namespace rather than one frame per push.</text>
  <rect x="40" y="783.8" width="1100" height="22" rx="5" fill="url(#rail)" stroke="#3c6a86" stroke-width="1"/>
  <text x="50" y="799.3" fill="#dff1ff" font-size="11.5" text-anchor="start" font-family="'DejaVu Sans Mono', monospace" font-weight="700">git fetch / clone</text>
  <text x="172" y="799.3" fill="#9fc9e0" font-size="10" text-anchor="start">upload-pack</text>
  <text x="1130" y="799.3" fill="#7fa8c4" font-size="9" text-anchor="end" font-family="'DejaVu Sans Mono', monospace">in: ls-refs, want/have   out: PACK on the wire</text>
  <rect x="40" y="815.8" width="161.67" height="50" rx="7" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.6"/>
  <text x="120.83" y="834.8" fill="#eaf6ff" font-size="10.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">advertise</text>
  <text x="120.83" y="848.8" fill="#9fc9e0" font-size="8.8" text-anchor="middle">v2 caps, ls-refs</text>
  <text x="120.83" y="860.8" fill="#5f8ba6" font-size="7.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">src/upload_pack.rs:155</text>
  <path d="M204.67 840.8 H218.67" fill="none" stroke="#6fd3f5" stroke-width="2.6" marker-end="url(#arrow)"/>
  <circle cx="214.67" cy="840.8" r="3" fill="#bfecff"/>
  <rect x="227.67" y="815.8" width="161.67" height="50" rx="7" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.6"/>
  <text x="308.5" y="834.8" fill="#eaf6ff" font-size="10.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">negotiate</text>
  <text x="308.5" y="848.8" fill="#9fc9e0" font-size="8.8" text-anchor="middle">haves/wants, HaveMemo</text>
  <text x="308.5" y="860.8" fill="#5f8ba6" font-size="7.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">src/negotiate.rs:321</text>
  <path d="M392.33 840.8 H406.33" fill="none" stroke="#6fd3f5" stroke-width="2.6" marker-end="url(#arrow)"/>
  <circle cx="402.33" cy="840.8" r="3" fill="#bfecff"/>
  <rect x="415.33" y="815.8" width="161.67" height="50" rx="7" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.6"/>
  <text x="496.17" y="834.8" fill="#eaf6ff" font-size="10.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">select_objects</text>
  <text x="496.17" y="848.8" fill="#9fc9e0" font-size="8.8" text-anchor="middle">want−have, bitmap or walk</text>
  <text x="496.17" y="860.8" fill="#5f8ba6" font-size="7.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">src/graph.rs:2218</text>
  <path d="M580 840.8 H594" fill="none" stroke="#6fd3f5" stroke-width="2.6" marker-end="url(#arrow)"/>
  <circle cx="590" cy="840.8" r="3" fill="#bfecff"/>
  <rect x="603" y="815.8" width="161.67" height="50" rx="7" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.6"/>
  <text x="683.83" y="834.8" fill="#eaf6ff" font-size="10.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">objects.packed()</text>
  <text x="683.83" y="848.8" fill="#9fc9e0" font-size="8.8" text-anchor="middle">the pack-copy seam on ObjectStore</text>
  <text x="683.83" y="860.8" fill="#5f8ba6" font-size="7.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">src/git_ops.rs:1141</text>
  <path d="M767.67 840.8 H781.67" fill="none" stroke="#6fd3f5" stroke-width="2.6" marker-end="url(#arrow)"/>
  <circle cx="777.67" cy="840.8" r="3" fill="#bfecff"/>
  <rect x="790.67" y="815.8" width="161.67" height="50" rx="7" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.6"/>
  <text x="871.5" y="834.8" fill="#eaf6ff" font-size="10.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">write_pack_copy</text>
  <text x="871.5" y="848.8" fill="#9fc9e0" font-size="8.8" text-anchor="middle">byte-range copy, O(bytes)</text>
  <text x="871.5" y="860.8" fill="#5f8ba6" font-size="7.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">src/copy.rs:1145</text>
  <path d="M955.33 840.8 H969.33" fill="none" stroke="#6fd3f5" stroke-width="2.6" marker-end="url(#arrow)"/>
  <circle cx="965.33" cy="840.8" r="3" fill="#bfecff"/>
  <rect x="978.33" y="815.8" width="161.67" height="50" rx="7" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.6"/>
  <text x="1059.17" y="834.8" fill="#eaf6ff" font-size="10.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">send_pack</text>
  <text x="1059.17" y="848.8" fill="#9fc9e0" font-size="8.8" text-anchor="middle">sideband out</text>
  <text x="1059.17" y="860.8" fill="#5f8ba6" font-size="7.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">src/upload_pack.rs:1806</text>
  <text x="40" y="881.8" fill="#a7e6c2" font-size="9.5" text-anchor="start">The copy branch is taken whenever the store has packs (upload_pack.rs:1396); its applied output is objects_copied_from_pack against objects_recompressed. Selection is answered from a git .bitmap when one is</text>
  <text x="40" y="894.3" fill="#a7e6c2" font-size="9.5" text-anchor="start">present and falls back to a closure walk when it is not — the archive's own reach encoding is a second representation of the same set and is not the one gunnar reads.</text>
  <rect x="40" y="920.8" width="1100" height="22" rx="5" fill="url(#rail)" stroke="#3c6a86" stroke-width="1"/>
  <text x="50" y="936.3" fill="#dff1ff" font-size="11.5" text-anchor="start" font-family="'DejaVu Sans Mono', monospace" font-weight="700">gc / repack</text>
  <text x="172" y="936.3" fill="#9fc9e0" font-size="10" text-anchor="start">fold, then re-seal</text>
  <text x="1130" y="936.3" fill="#7fa8c4" font-size="9" text-anchor="end" font-family="'DejaVu Sans Mono', monospace">in: N packs + loose objects   out: 1 consolidated pack</text>
  <rect x="40" y="952.8" width="161.67" height="50" rx="7" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.6"/>
  <text x="120.83" y="971.8" fill="#eaf6ff" font-size="10.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">next_generation</text>
  <text x="120.83" y="985.8" fill="#9fc9e0" font-size="8.8" text-anchor="middle">names repository.gN+1.znippy</text>
  <text x="120.83" y="997.8" fill="#5f8ba6" font-size="7.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">src/gc.rs:326</text>
  <path d="M204.67 977.8 H218.67" fill="none" stroke="#6fd3f5" stroke-width="2.6" marker-end="url(#arrow)"/>
  <circle cx="214.67" cy="977.8" r="3" fill="#bfecff"/>
  <rect x="227.67" y="952.8" width="161.67" height="50" rx="7" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.6"/>
  <text x="308.5" y="971.8" fill="#eaf6ff" font-size="10.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">hard_link</text>
  <text x="308.5" y="985.8" fill="#9fc9e0" font-size="8.8" text-anchor="middle">second name, same inode</text>
  <text x="308.5" y="997.8" fill="#5f8ba6" font-size="7.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">src/gc.rs:214</text>
  <path d="M392.33 977.8 H406.33" fill="none" stroke="#6fd3f5" stroke-width="2.6" marker-end="url(#arrow)"/>
  <circle cx="402.33" cy="977.8" r="3" fill="#bfecff"/>
  <rect x="415.33" y="952.8" width="161.67" height="50" rx="7" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.6"/>
  <text x="496.17" y="971.8" fill="#eaf6ff" font-size="10.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">compact</text>
  <text x="496.17" y="985.8" fill="#9fc9e0" font-size="8.8" text-anchor="middle">rewrite the work copy</text>
  <text x="496.17" y="997.8" fill="#5f8ba6" font-size="7.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">src/gc.rs:214</text>
  <path d="M580 977.8 H594" fill="none" stroke="#6fd3f5" stroke-width="2.6" marker-end="url(#arrow)"/>
  <circle cx="590" cy="977.8" r="3" fill="#bfecff"/>
  <rect x="603" y="952.8" width="161.67" height="50" rx="7" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.6"/>
  <text x="683.83" y="971.8" fill="#eaf6ff" font-size="10.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">read back</text>
  <text x="683.83" y="985.8" fill="#9fc9e0" font-size="8.8" text-anchor="middle">every entry, blake3 checked</text>
  <text x="683.83" y="997.8" fill="#5f8ba6" font-size="7.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">src/gc.rs:358</text>
  <path d="M767.67 977.8 H781.67" fill="none" stroke="#6fd3f5" stroke-width="2.6" marker-end="url(#arrow)"/>
  <circle cx="777.67" cy="977.8" r="3" fill="#bfecff"/>
  <rect x="790.67" y="952.8" width="161.67" height="50" rx="7" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.6"/>
  <text x="871.5" y="971.8" fill="#eaf6ff" font-size="10.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">sync_dir</text>
  <text x="871.5" y="985.8" fill="#9fc9e0" font-size="8.8" text-anchor="middle">rename DURABLE, not just visible</text>
  <text x="871.5" y="997.8" fill="#5f8ba6" font-size="7.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">src/gc.rs:412</text>
  <path d="M955.33 977.8 H969.33" fill="none" stroke="#6fd3f5" stroke-width="2.6" marker-end="url(#arrow)"/>
  <circle cx="965.33" cy="977.8" r="3" fill="#bfecff"/>
  <rect x="978.33" y="952.8" width="161.67" height="50" rx="7" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.6"/>
  <text x="1059.17" y="971.8" fill="#eaf6ff" font-size="10.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">maintain</text>
  <text x="1059.17" y="985.8" fill="#9fc9e0" font-size="8.8" text-anchor="middle">the server's only gc verb</text>
  <text x="1059.17" y="997.8" fill="#5f8ba6" font-size="7.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">storage/znippy_engine.rs:470</text>
  <text x="40" y="1018.8" fill="#f0a9a0" font-size="9.5" text-anchor="start">One consolidated ARCHIVE, not one consolidated pack: the packfile repacker was amputated 2026-08-10 and `maintain` is the server's only gc verb — it takes no window, depth, delta policy or ordering, which is</text>
  <text x="40" y="1031.3" fill="#f0a9a0" font-size="9.5" text-anchor="start">why `gunnar gc` no longer has those flags. The safety is the same shape as before: compaction runs against a hard link, the result is read back and blake3-checked before anything is committed, and the directory</text>
  <text x="40" y="1043.8" fill="#f0a9a0" font-size="9.5" text-anchor="start">is fsynced so the rename is durable rather than merely visible. ⚠ MEASURED 2026-08-13: `next_generation` derives its target from the archive's CURRENT name, and the live archive is always opened as</text>
  <text x="40" y="1056.3" fill="#f0a9a0" font-size="9.5" text-anchor="start">`repository.znippy`, so the target is always `repository.g1.znippy` and the second gc on any repository hard-fails on `already exists`. gc is cron work. Whether the first gc should swap the generation over the</text>
  <text x="40" y="1068.8" fill="#f0a9a0" font-size="9.5" text-anchor="start">live name, or the open path should follow generations, is NOT determined.</text>
  <rect x="40" y="1095.3" width="1100" height="22" rx="5" fill="url(#rail)" stroke="#3c6a86" stroke-width="1"/>
  <text x="50" y="1110.8" fill="#dff1ff" font-size="11.5" text-anchor="start" font-family="'DejaVu Sans Mono', monospace" font-weight="700">secrets</text>
  <text x="172" y="1110.8" fill="#9fc9e0" font-size="10" text-anchor="start">host key, deploy keys, webhook tokens</text>
  <text x="1130" y="1110.8" fill="#7fa8c4" font-size="9" text-anchor="end" font-family="'DejaVu Sans Mono', monospace">in: ed25519 minted in-process   out: sealed arrow_log rows</text>
  <rect x="40" y="1127.3" width="199.2" height="50" rx="7" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.6"/>
  <text x="139.6" y="1146.3" fill="#eaf6ff" font-size="10.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">ensure_host_key</text>
  <text x="139.6" y="1160.3" fill="#9fc9e0" font-size="8.8" text-anchor="middle">minted, never shelled out</text>
  <text x="139.6" y="1172.3" fill="#5f8ba6" font-size="7.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">src/host_key.rs:125</text>
  <path d="M242.2 1152.3 H256.2" fill="none" stroke="#6fd3f5" stroke-width="2.6" marker-end="url(#arrow)"/>
  <circle cx="252.2" cy="1152.3" r="3" fill="#bfecff"/>
  <rect x="265.2" y="1127.3" width="199.2" height="50" rx="7" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.6"/>
  <text x="364.8" y="1146.3" fill="#eaf6ff" font-size="10.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">SecretStore::put</text>
  <text x="364.8" y="1160.3" fill="#9fc9e0" font-size="8.8" text-anchor="middle">trait + blanket impls</text>
  <text x="364.8" y="1172.3" fill="#5f8ba6" font-size="7.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">src/secret.rs:143</text>
  <path d="M467.4 1152.3 H481.4" fill="none" stroke="#6fd3f5" stroke-width="2.6" marker-end="url(#arrow)"/>
  <circle cx="477.4" cy="1152.3" r="3" fill="#bfecff"/>
  <rect x="490.4" y="1127.3" width="199.2" height="50" rx="7" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.6"/>
  <text x="590" y="1146.3" fill="#eaf6ff" font-size="10.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">Stores::secrets()</text>
  <text x="590" y="1160.3" fill="#9fc9e0" font-size="8.8" text-anchor="middle">the sealed-secret boot-path handle</text>
  <text x="590" y="1172.3" fill="#5f8ba6" font-size="7.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">src/stores.rs:1634</text>
  <path d="M692.6 1152.3 H706.6" fill="none" stroke="#6fd3f5" stroke-width="2.6" marker-end="url(#arrow)"/>
  <circle cx="702.6" cy="1152.3" r="3" fill="#bfecff"/>
  <rect x="715.6" y="1127.3" width="199.2" height="50" rx="7" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.6"/>
  <text x="815.2" y="1146.3" fill="#eaf6ff" font-size="10.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">SealedSecretStore</text>
  <text x="815.2" y="1160.3" fill="#9fc9e0" font-size="8.8" text-anchor="middle">AEAD under a KEK</text>
  <text x="815.2" y="1172.3" fill="#5f8ba6" font-size="7.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">src/seal.rs:377</text>
  <path d="M917.8 1152.3 H931.8" fill="none" stroke="#f0a9a0" stroke-width="2.6" stroke-dasharray="3 4" marker-end="url(#arrow)"/>
  <circle cx="927.8" cy="1152.3" r="3" fill="#bfecff"/>
  <rect x="940.8" y="1127.3" width="199.2" height="50" rx="7" fill="url(#chip)" stroke="#f0a9a0" stroke-width="1.6" stroke-dasharray="3 4"/>
  <text x="1040.4" y="1146.3" fill="#eaf6ff" font-size="10.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">__gunnar_secrets__</text>
  <text x="1040.4" y="1160.3" fill="#9fc9e0" font-size="8.8" text-anchor="middle">never reaches an archive</text>
  <text x="1040.4" y="1172.3" fill="#5f8ba6" font-size="7.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">src/secrets.rs:89</text>
  <text x="40" y="1193.3" fill="#a7e6c2" font-size="9.5" text-anchor="start">Stores::secrets() (stores.rs:279) constructs SealedSecretStore over the raw ArrowLogSecretStore, the KEK comes from Kek::for_control_dir at stores.rs:223, and serve.rs:387 takes that handle. Sealing happens at</text>
  <text x="40" y="1205.8" fill="#a7e6c2" font-size="9.5" text-anchor="start">the store; __gunnar_secrets__ is a separate archive-side encoding that FoldRequest carries no input for (repack.rs:188).</text>

  <!-- ==================== -->
  <!-- PANEL 3 - over time: one frame per push, packs accumulate, a re-seal compacts -->
  <text x="40" y="1250.3" fill="#6fd3f5" font-size="15" text-anchor="start" font-family="'DejaVu Sans Mono', monospace" font-weight="700">3</text>
  <text x="74" y="1250.3" fill="#eaf6ff" font-size="15" text-anchor="start" font-weight="700">Over time — the part a box diagram cannot show</text>
  <text x="74" y="1267.3" fill="#9fc9e0" font-size="11" text-anchor="start">each push appends one self-contained Arrow frame · packs accumulate · a re-seal compacts</text>
  <line x1="40" y1="1276.3" x2="1140" y2="1276.3" stroke="#143a52" stroke-width="1"/>
  <text x="40" y="1296.3" fill="#bcd9ec" font-size="11" text-anchor="start" font-weight="700">the live push log — one RecordBatch per push, fsynced</text>
  <text x="40" y="1310.3" fill="#7fa8c4" font-size="9" text-anchor="start" font-family="'DejaVu Sans Mono', monospace">plugins/native/znippy-plugin-git/src/pushlog.rs:266 append() · frame = [ schema | batch | EOS ] · the frame boundary is the transaction</text>
  <rect x="40" y="1322.3" width="118" height="40" rx="5" fill="url(#slot)" stroke="#6fd3f5" stroke-width="1.4"/>
  <rect x="46" y="1330.3" width="30" height="14" rx="2" fill="#0a2032" stroke="#4a8fb0" stroke-width="1"/>
  <text x="61" y="1340.8" fill="#a9d8ee" font-size="7.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">schema</text>
  <rect x="78" y="1330.3" width="46" height="14" rx="2" fill="#0a2032" stroke="#4a8fb0" stroke-width="1"/>
  <text x="101" y="1340.8" fill="#a9d8ee" font-size="7.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">batch</text>
  <rect x="126" y="1330.3" width="30" height="14" rx="2" fill="#0a2032" stroke="#4a8fb0" stroke-width="1"/>
  <text x="141" y="1340.8" fill="#a9d8ee" font-size="7.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">EOS</text>
  <text x="99" y="1356.3" fill="#9fc9e0" font-size="8.2" text-anchor="middle">push 1</text>
  <rect x="166" y="1322.3" width="118" height="40" rx="5" fill="url(#slot)" stroke="#6fd3f5" stroke-width="1.4"/>
  <rect x="172" y="1330.3" width="30" height="14" rx="2" fill="#0a2032" stroke="#4a8fb0" stroke-width="1"/>
  <text x="187" y="1340.8" fill="#a9d8ee" font-size="7.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">schema</text>
  <rect x="204" y="1330.3" width="46" height="14" rx="2" fill="#0a2032" stroke="#4a8fb0" stroke-width="1"/>
  <text x="227" y="1340.8" fill="#a9d8ee" font-size="7.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">batch</text>
  <rect x="252" y="1330.3" width="30" height="14" rx="2" fill="#0a2032" stroke="#4a8fb0" stroke-width="1"/>
  <text x="267" y="1340.8" fill="#a9d8ee" font-size="7.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">EOS</text>
  <text x="225" y="1356.3" fill="#9fc9e0" font-size="8.2" text-anchor="middle">push 2</text>
  <rect x="292" y="1322.3" width="118" height="40" rx="5" fill="url(#slot)" stroke="#6fd3f5" stroke-width="1.4"/>
  <rect x="298" y="1330.3" width="30" height="14" rx="2" fill="#0a2032" stroke="#4a8fb0" stroke-width="1"/>
  <text x="313" y="1340.8" fill="#a9d8ee" font-size="7.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">schema</text>
  <rect x="330" y="1330.3" width="46" height="14" rx="2" fill="#0a2032" stroke="#4a8fb0" stroke-width="1"/>
  <text x="353" y="1340.8" fill="#a9d8ee" font-size="7.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">batch</text>
  <rect x="378" y="1330.3" width="30" height="14" rx="2" fill="#0a2032" stroke="#4a8fb0" stroke-width="1"/>
  <text x="393" y="1340.8" fill="#a9d8ee" font-size="7.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">EOS</text>
  <text x="351" y="1356.3" fill="#9fc9e0" font-size="8.2" text-anchor="middle">push 3</text>
  <rect x="418" y="1322.3" width="118" height="40" rx="5" fill="url(#slot)" stroke="#6fd3f5" stroke-width="1.4"/>
  <rect x="424" y="1330.3" width="30" height="14" rx="2" fill="#0a2032" stroke="#4a8fb0" stroke-width="1"/>
  <text x="439" y="1340.8" fill="#a9d8ee" font-size="7.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">schema</text>
  <rect x="456" y="1330.3" width="46" height="14" rx="2" fill="#0a2032" stroke="#4a8fb0" stroke-width="1"/>
  <text x="479" y="1340.8" fill="#a9d8ee" font-size="7.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">batch</text>
  <rect x="504" y="1330.3" width="30" height="14" rx="2" fill="#0a2032" stroke="#4a8fb0" stroke-width="1"/>
  <text x="519" y="1340.8" fill="#a9d8ee" font-size="7.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">EOS</text>
  <text x="477" y="1356.3" fill="#9fc9e0" font-size="8.2" text-anchor="middle">push 4</text>
  <rect x="544" y="1322.3" width="118" height="40" rx="5" fill="url(#slot)" stroke="#6fd3f5" stroke-width="1.4"/>
  <rect x="550" y="1330.3" width="30" height="14" rx="2" fill="#0a2032" stroke="#4a8fb0" stroke-width="1"/>
  <text x="565" y="1340.8" fill="#a9d8ee" font-size="7.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">schema</text>
  <rect x="582" y="1330.3" width="46" height="14" rx="2" fill="#0a2032" stroke="#4a8fb0" stroke-width="1"/>
  <text x="605" y="1340.8" fill="#a9d8ee" font-size="7.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">batch</text>
  <rect x="630" y="1330.3" width="30" height="14" rx="2" fill="#0a2032" stroke="#4a8fb0" stroke-width="1"/>
  <text x="645" y="1340.8" fill="#a9d8ee" font-size="7.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">EOS</text>
  <text x="603" y="1356.3" fill="#9fc9e0" font-size="8.2" text-anchor="middle">push 5</text>
  <rect x="670" y="1322.3" width="118" height="40" rx="5" fill="url(#slot)" stroke="#6fd3f5" stroke-width="1.4"/>
  <rect x="676" y="1330.3" width="30" height="14" rx="2" fill="#0a2032" stroke="#4a8fb0" stroke-width="1"/>
  <text x="691" y="1340.8" fill="#a9d8ee" font-size="7.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">schema</text>
  <rect x="708" y="1330.3" width="46" height="14" rx="2" fill="#0a2032" stroke="#4a8fb0" stroke-width="1"/>
  <text x="731" y="1340.8" fill="#a9d8ee" font-size="7.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">batch</text>
  <rect x="756" y="1330.3" width="30" height="14" rx="2" fill="#0a2032" stroke="#4a8fb0" stroke-width="1"/>
  <text x="771" y="1340.8" fill="#a9d8ee" font-size="7.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">EOS</text>
  <text x="729" y="1356.3" fill="#9fc9e0" font-size="8.2" text-anchor="middle">push 6</text>
  <rect x="796" y="1322.3" width="118" height="40" rx="5" fill="url(#slot)" stroke="#f0a9a0" stroke-width="1.4" stroke-dasharray="3 4"/>
  <rect x="802" y="1330.3" width="30" height="14" rx="2" fill="#0a2032" stroke="#7a4038" stroke-width="1"/>
  <text x="817" y="1340.8" fill="#e6b7ad" font-size="7.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">schema</text>
  <rect x="834" y="1330.3" width="46" height="14" rx="2" fill="#0a2032" stroke="#7a4038" stroke-width="1"/>
  <text x="857" y="1340.8" fill="#e6b7ad" font-size="7.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">batch</text>
  <text x="855" y="1356.3" fill="#f0a9a0" font-size="8.2" text-anchor="middle">torn — discarded whole</text>
  <text x="1140" y="1376.3" fill="#86b3cc" font-size="9" text-anchor="end">scan_frames reads forward while frames parse and stops at the first that does not — pushlog.rs:126</text>
  <text x="40" y="1376.3" fill="#86b3cc" font-size="9" text-anchor="start">frame = 2056 B · schema 448 B (21.8%) · batch 1600 B · 4 refs/push, the desktop 2026-08-03</text>
  <text x="40" y="1408.3" fill="#bcd9ec" font-size="11" text-anchor="start" font-weight="700">what accumulates is packs, not payload — the append is flat, the pack count is not</text>
  <text x="40" y="1422.3" fill="#7fa8c4" font-size="9" text-anchor="start">the desktop 2026-08-03 · arm gunnar.znippy_engine_growth · 1000 real pushes onto a 512 KiB tree · repeated at loadavg 36.3</text>
  <text x="40" y="1434.3" fill="#7fa8c4" font-size="9" text-anchor="start">and 56.7, agreeing to better than 0.01%</text>
  <text x="84" y="1459.3" fill="#9fc9e0" font-size="9.5" text-anchor="end" font-family="'DejaVu Sans Mono', monospace">10 pushes</text>
  <rect x="92" y="1449.3" width="106.26" height="8" rx="2" fill="url(#cold)" stroke="#7a4038" stroke-width="1"/>
  <rect x="92" y="1459.3" width="53.39" height="8" rx="2" fill="url(#hot)" stroke="#2f7d54" stroke-width="1"/>
  <text x="206.26" y="1457.3" fill="#f0a9a0" font-size="8.6" text-anchor="start" font-family="'DejaVu Sans Mono', monospace">archive 32.3 kB</text>
  <text x="153.39" y="1467.3" fill="#a7e6c2" font-size="8.6" text-anchor="start" font-family="'DejaVu Sans Mono', monospace">objects 18.0 kB  →  1.79x</text>
  <text x="84" y="1485.3" fill="#9fc9e0" font-size="9.5" text-anchor="end" font-family="'DejaVu Sans Mono', monospace">100 pushes</text>
  <rect x="92" y="1475.3" width="284.6" height="8" rx="2" fill="url(#cold)" stroke="#7a4038" stroke-width="1"/>
  <rect x="92" y="1485.3" width="216.18" height="8" rx="2" fill="url(#hot)" stroke="#2f7d54" stroke-width="1"/>
  <text x="384.6" y="1483.3" fill="#f0a9a0" font-size="8.6" text-anchor="start" font-family="'DejaVu Sans Mono', monospace">archive 230.5 kB</text>
  <text x="316.18" y="1493.3" fill="#a7e6c2" font-size="8.6" text-anchor="start" font-family="'DejaVu Sans Mono', monospace">objects 108.4 kB  →  2.13x</text>
  <text x="84" y="1511.3" fill="#9fc9e0" font-size="9.5" text-anchor="end" font-family="'DejaVu Sans Mono', monospace">1000 pushes</text>
  <rect x="92" y="1501.3" width="490" height="8" rx="2" fill="url(#cold)" stroke="#7a4038" stroke-width="1"/>
  <rect x="92" y="1511.3" width="356.62" height="8" rx="2" fill="url(#hot)" stroke="#2f7d54" stroke-width="1"/>
  <text x="590" y="1509.3" fill="#f0a9a0" font-size="8.6" text-anchor="start" font-family="'DejaVu Sans Mono', monospace">archive 2.22 MB</text>
  <text x="456.62" y="1519.3" fill="#a7e6c2" font-size="8.6" text-anchor="start" font-family="'DejaVu Sans Mono', monospace">objects 510.1 kB  →  4.35x</text>
  <text x="92" y="1534.3" fill="#5f8ba6" font-size="8.4" text-anchor="start">bar length ∝ log10(bytes) — the span is 68.8x and a linear axis would show one bar and two slivers</text>
  <text x="92" y="1546.3" fill="#86b3cc" font-size="8.8" text-anchor="start">per-push append: 1556 / 1558 / 1557 B, flat · the growth is 1000 packs, rows_replaced 0 throughout</text>
  <rect x="704" y="1434.3" width="436" height="140" rx="8" fill="url(#rail)" stroke="#7fc8ea" stroke-width="2"/>
  <text x="922" y="1452.3" fill="#dff1ff" font-size="12" text-anchor="middle" font-weight="700">the re-seal</text>
  <text x="922" y="1467.3" fill="#bcd9ec" font-size="9" text-anchor="middle">seal() — the compaction repack() calls</text>
  <text x="922" y="1488.3" fill="#f0a9a0" font-size="14" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">2 219 778 B</text>
  <text x="922" y="1504.3" fill="#6fd3f5" font-size="13" text-anchor="middle">↓</text>
  <text x="922" y="1522.3" fill="#8fe6b8" font-size="16" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">427 820 B</text>
  <text x="922" y="1540.3" fill="#a7e6c2" font-size="9.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">5.19x reclaimed · 2.4 ms CPU</text>
  <text x="922" y="1556.3" fill="#7fa8c4" font-size="8.6" text-anchor="middle">staged · fsync · rename · fsync parent</text>

  <!-- ==================== -->
  <!-- GROUND RAIL - the claim -->
  <rect x="40" y="1616.3" width="1100" height="109.2" rx="10" fill="url(#rail)" stroke="#7fc8ea" stroke-width="2"/>
  <circle cx="64" cy="1716.5" r="4" fill="#0a1c2c" stroke="#7fc8ea" stroke-width="1.5"/>
  <circle cx="144" cy="1716.5" r="4" fill="#0a1c2c" stroke="#7fc8ea" stroke-width="1.5"/>
  <circle cx="224" cy="1716.5" r="4" fill="#0a1c2c" stroke="#7fc8ea" stroke-width="1.5"/>
  <circle cx="304" cy="1716.5" r="4" fill="#0a1c2c" stroke="#7fc8ea" stroke-width="1.5"/>
  <circle cx="384" cy="1716.5" r="4" fill="#0a1c2c" stroke="#7fc8ea" stroke-width="1.5"/>
  <circle cx="464" cy="1716.5" r="4" fill="#0a1c2c" stroke="#7fc8ea" stroke-width="1.5"/>
  <circle cx="544" cy="1716.5" r="4" fill="#0a1c2c" stroke="#7fc8ea" stroke-width="1.5"/>
  <circle cx="624" cy="1716.5" r="4" fill="#0a1c2c" stroke="#7fc8ea" stroke-width="1.5"/>
  <circle cx="704" cy="1716.5" r="4" fill="#0a1c2c" stroke="#7fc8ea" stroke-width="1.5"/>
  <circle cx="784" cy="1716.5" r="4" fill="#0a1c2c" stroke="#7fc8ea" stroke-width="1.5"/>
  <circle cx="864" cy="1716.5" r="4" fill="#0a1c2c" stroke="#7fc8ea" stroke-width="1.5"/>
  <circle cx="944" cy="1716.5" r="4" fill="#0a1c2c" stroke="#7fc8ea" stroke-width="1.5"/>
  <circle cx="1024" cy="1716.5" r="4" fill="#0a1c2c" stroke="#7fc8ea" stroke-width="1.5"/>
  <circle cx="1104" cy="1716.5" r="4" fill="#0a1c2c" stroke="#7fc8ea" stroke-width="1.5"/>
  <text x="58" y="1640.3" fill="#dff1ff" font-size="15" text-anchor="start" font-weight="700">where each seam stands</text>
  <text x="58" y="1660.3" fill="#bcd9ec" font-size="9.8" text-anchor="start">RepackOptions::cold_tier() has no caller in a server crate; `gc` builds RepackOptions::new() at gunnar-cli/src/server/admin.rs:383, so the packfile is the znippy engine. SealedSecretStore is</text>
  <text x="58" y="1673.1" fill="#bcd9ec" font-size="9.8" text-anchor="start">constructed on the boot path at crates/gunnar-cli/src/server/stores.rs:279, so the secret STORE is sealed while the archive section __gunnar_secrets__ has no producer. __gunnar_oid__,</text>
  <text x="58" y="1685.9" fill="#bcd9ec" font-size="9.8" text-anchor="start">__gunnar_graph__ and __gunnar_reach__ are not emitted at all, because GitIndexBuilder::pack_tier returns an empty section list by construction (plugins/native/znippy-plugin-git/src/sections.rs:249)</text>
  <text x="58" y="1698.7" fill="#bcd9ec" font-size="9.8" text-anchor="start">— the pack's own .idx is the oid index, and the other two derive from object payloads a pack tier never inflates.</text>
</svg>