Gunnar

nordisk/gunnar

assets/gunnar-data-path.svg

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1180 1147.8" 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="1147.8" fill="url(#board)"/>
  <g stroke="#143a52" stroke-width="1">
    <line x1="0" y1="76" x2="1180" y2="76"/>
    <line x1="0" y1="1099.8" x2="1180" y2="1099.8"/>
  </g>
  <g fill="#16415c">
    <circle cx="40" cy="40" r="2"/><circle cx="1140" cy="40" r="2"/>
    <circle cx="40" cy="1119.8" r="2"/><circle cx="1140" cy="1119.8" 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 read path and the write path — data structures, complexity, and where each one lives</text>
  <text x="143.2" y="56" fill="#7fa8c4" font-size="10.5">every box carries the file:line it lives at · every share carries the run it was measured on</text>
  <g font-size="11">
    <line x1="896" y1="34" x2="932" y2="34" stroke="#6fd3f5" stroke-width="3"/>
    <text x="940" y="38" fill="#cfe6f5">on a server build's path</text>
    <line x1="896" y1="54" x2="932" y2="54" stroke="#e0a86a" stroke-width="2.5" stroke-dasharray="7 5"/>
    <text x="940" y="58" fill="#cfe6f5">built, no server build constructs it</text>
  </g>

  <!-- ==================== -->
  <!-- PATH - read -->
  <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">git fetch · git clone — upload-pack</text>
  <text x="74" y="125" fill="#9fc9e0" font-size="11" text-anchor="start">shares: gix census, the desktop 2026-08-04, tree 1a4df9a, 19 workspace_nordisk repositories, 65 737 objects, timed arms pinned taskset -c 24-27</text>
  <line x1="40" y1="134" x2="1140" y2="134" stroke="#143a52" stroke-width="1"/>
  <rect x="40" y="152" width="1100" height="20" rx="5" fill="url(#rail)" stroke="#3c6a86" stroke-width="1"/>
  <text x="50" y="166.5" fill="#bfe6ff" font-size="9.2" text-anchor="start" font-family="'DejaVu Sans Mono', monospace">in: ls-refs, want/have</text>
  <text x="1130" y="166.5" fill="#bfe6ff" font-size="9.2" text-anchor="end" font-family="'DejaVu Sans Mono', monospace">out: PACK, sideband-muxed</text>
  <rect x="40" y="182" width="163.33" height="84" rx="8" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.8"/>
  <text x="121.67" y="199" fill="#eaf6ff" font-size="11" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">ls_refs</text>
  <text x="121.67" y="212" fill="#9fc9e0" font-size="8.4" text-anchor="middle">ref advertisement, gix-ref file</text>
  <text x="121.67" y="222" fill="#9fc9e0" font-size="8.4" text-anchor="middle">store</text>
  <text x="121.67" y="239" fill="#6fd3f5" font-size="9.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">O(refs)</text>
  <text x="121.67" y="251" fill="#a7e6c2" font-size="8" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">under 0.5% CPU</text>
  <text x="121.67" y="261" fill="#5f8ba6" font-size="7.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">wire/upload_pack.rs:850</text>
  <path d="M206.33 224 H218.33" fill="none" stroke="#6fd3f5" stroke-width="2.6" marker-end="url(#arrow)"/>
  <rect x="227.33" y="182" width="163.33" height="84" rx="8" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.8"/>
  <text x="309" y="199" fill="#eaf6ff" font-size="11" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">HaveMemo</text>
  <text x="309" y="212" fill="#9fc9e0" font-size="8.4" text-anchor="middle">connection-lifetime set, one</text>
  <text x="309" y="222" fill="#9fc9e0" font-size="8.4" text-anchor="middle">answer per distinct have</text>
  <text x="309" y="239" fill="#6fd3f5" font-size="9.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">O(distinct haves)</text>
  <text x="309" y="251" fill="#a7e6c2" font-size="8" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">under 0.5% CPU</text>
  <text x="309" y="261" fill="#5f8ba6" font-size="7.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">wire/negotiate.rs:150</text>
  <path d="M393.67 224 H405.67" fill="none" stroke="#6fd3f5" stroke-width="2.6" marker-end="url(#arrow)"/>
  <rect x="414.67" y="182" width="163.33" height="84" rx="8" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.8"/>
  <text x="496.33" y="199" fill="#eaf6ff" font-size="11" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">bitmap::select</text>
  <text x="496.33" y="212" fill="#9fc9e0" font-size="8.4" text-anchor="middle">EWAH run-length maps, want</text>
  <text x="496.33" y="222" fill="#9fc9e0" font-size="8.4" text-anchor="middle">ANDNOT have</text>
  <text x="496.33" y="239" fill="#6fd3f5" font-size="9.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">O(bitmap words)</text>
  <text x="496.33" y="251" fill="#a7e6c2" font-size="8" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">9.41% CPU</text>
  <text x="496.33" y="261" fill="#5f8ba6" font-size="7.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">wire/reachable.rs:85</text>
  <path d="M581 224 H593" fill="none" stroke="#6fd3f5" stroke-width="2.6" marker-end="url(#arrow)"/>
  <rect x="602" y="182" width="163.33" height="84" rx="8" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.8"/>
  <text x="683.67" y="199" fill="#eaf6ff" font-size="11" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">select_objects</text>
  <text x="683.67" y="212" fill="#9fc9e0" font-size="8.4" text-anchor="middle">commit/tree closure walk, when</text>
  <text x="683.67" y="222" fill="#9fc9e0" font-size="8.4" text-anchor="middle">no bitmap answers</text>
  <text x="683.67" y="239" fill="#6fd3f5" font-size="9.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">O(reachable objects)</text>
  <text x="683.67" y="261" fill="#5f8ba6" font-size="7.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">wire/graph.rs:2218</text>
  <path d="M768.33 224 H780.33" fill="none" stroke="#6fd3f5" stroke-width="2.6" marker-end="url(#arrow)"/>
  <rect x="789.33" y="182" width="163.33" height="84" rx="8" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.8"/>
  <text x="871" y="199" fill="#eaf6ff" font-size="11" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">Fanout16::lookup</text>
  <text x="871" y="212" fill="#9fc9e0" font-size="8.4" text-anchor="middle">65 536 buckets, then bisect</text>
  <text x="871" y="222" fill="#9fc9e0" font-size="8.4" text-anchor="middle">inside one</text>
  <text x="871" y="239" fill="#6fd3f5" font-size="9.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">O(log(n/65 536))</text>
  <text x="871" y="251" fill="#a7e6c2" font-size="8" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">5.45/obj · 47 ns · 0.93%</text>
  <text x="871" y="261" fill="#5f8ba6" font-size="7.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">edda/crates/storage-git-gix/fanout.rs:196</text>
  <path d="M955.67 224 H967.67" fill="none" stroke="#6fd3f5" stroke-width="2.6" marker-end="url(#arrow)"/>
  <rect x="976.67" y="182" width="163.33" height="84" rx="8" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.8"/>
  <text x="1058.33" y="199" fill="#eaf6ff" font-size="11" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">write_pack_copy_thin</text>
  <text x="1058.33" y="212" fill="#9fc9e0" font-size="8.4" text-anchor="middle">byte-range copy of</text>
  <text x="1058.33" y="222" fill="#9fc9e0" font-size="8.4" text-anchor="middle">already-deflated entries</text>
  <text x="1058.33" y="239" fill="#6fd3f5" font-size="9.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">O(bytes)</text>
  <text x="1058.33" y="251" fill="#a7e6c2" font-size="8" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">89.98% wall · 90.59% CPU</text>
  <text x="1058.33" y="261" fill="#5f8ba6" font-size="7.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">edda/crates/gunnar-pack/copy.rs:1258</text>
  <line x1="40" y1="282" x2="538.8" y2="282" stroke="#4a8fb0" stroke-width="1.2" stroke-dasharray="4 4"/>
  <text x="40" y="275" fill="#7fa8c4" font-size="8.6" text-anchor="start">the object tier the copy reads through, and the channel it writes out</text>
  <rect x="40" y="296" width="150.27" height="84" rx="8" fill="url(#chip)" stroke="#e0a86a" stroke-width="1.8" stroke-dasharray="7 5"/>
  <text x="115.13" y="313" fill="#eaf6ff" font-size="11" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">ObjectStore::packed</text>
  <text x="115.13" y="326" fill="#9fc9e0" font-size="8.4" text-anchor="middle">the seam a pack tier answers</text>
  <text x="115.13" y="336" fill="#9fc9e0" font-size="8.4" text-anchor="middle">on; None means write_pack</text>
  <text x="115.13" y="353" fill="#6fd3f5" font-size="9.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">O(1)</text>
  <text x="115.13" y="375" fill="#5f8ba6" font-size="7.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">plugins/native/znippy-plugin-git/git_ops.rs:1141</text>
  <rect x="214.27" y="296" width="150.27" height="84" rx="8" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.8"/>
  <text x="289.4" y="313" fill="#eaf6ff" font-size="11" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">SidebandWriter</text>
  <text x="289.4" y="326" fill="#9fc9e0" font-size="8.4" text-anchor="middle">pkt-line channel 1, muxed out</text>
  <text x="289.4" y="353" fill="#6fd3f5" font-size="9.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">O(bytes)</text>
  <text x="289.4" y="375" fill="#5f8ba6" font-size="7.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">wire/wire_io.rs:173</text>
  <rect x="388.53" y="296" width="150.27" height="84" rx="8" fill="url(#chip)" stroke="#e0a86a" stroke-width="1.8" stroke-dasharray="7 5"/>
  <text x="463.67" y="313" fill="#eaf6ff" font-size="11" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">ZnippyObjects</text>
  <text x="463.67" y="326" fill="#9fc9e0" font-size="8.4" text-anchor="middle">third ObjectStore, serves out</text>
  <text x="463.67" y="336" fill="#9fc9e0" font-size="8.4" text-anchor="middle">of a sealed archive</text>
  <text x="463.67" y="353" fill="#6fd3f5" font-size="9.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">O(bytes)</text>
  <text x="463.67" y="375" fill="#5f8ba6" font-size="7.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">server/storage/znippy_engine.rs:388</text>
  <text x="40" y="398" fill="#bcd9ec" font-size="9.4" text-anchor="start">A bitmap replaces the walk, it does not shrink it: when one answers, select_objects is absent from the stage frame entirely. Nothing on this path inflates an object. The entry travels as it lies — the header is</text>
  <text x="40" y="410.4" fill="#bcd9ec" font-size="9.4" text-anchor="start">rewritten, the deflated byte range is copied — so the cost is O(bytes on the wire) and is flat in delta depth: 0.034 µs/object at depth 0 against 0.022 µs at depth 50 (the desktop 2026-08-04).</text>

  <!-- ==================== -->
  <!-- PATH - write -->
  <text x="40" y="450.8" fill="#6fd3f5" font-size="15" text-anchor="start" font-family="'DejaVu Sans Mono', monospace" font-weight="700">2</text>
  <text x="74" y="450.8" fill="#eaf6ff" font-size="15" text-anchor="start" font-weight="700">git push — receive-pack</text>
  <text x="74" y="467.8" fill="#9fc9e0" font-size="11" text-anchor="start">shares: gix census, the desktop 2026-08-04, tree 1a4df9a, 19 workspace_nordisk repositories, 65 737 objects, timed arms pinned taskset -c 24-27</text>
  <line x1="40" y1="476.8" x2="1140" y2="476.8" stroke="#143a52" stroke-width="1"/>
  <rect x="40" y="494.8" width="1100" height="20" rx="5" fill="url(#rail)" stroke="#3c6a86" stroke-width="1"/>
  <text x="50" y="509.3" fill="#bfe6ff" font-size="9.2" text-anchor="start" font-family="'DejaVu Sans Mono', monospace">in: command list + PACK</text>
  <text x="1130" y="509.3" fill="#bfe6ff" font-size="9.2" text-anchor="end" font-family="'DejaVu Sans Mono', monospace">out: pack-&lt;id&gt;.pack/.idx + ref CAS</text>
  <rect x="40" y="524.8" width="163.33" height="84" rx="8" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.8"/>
  <text x="121.67" y="541.8" fill="#eaf6ff" font-size="11" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">index_thin_pack</text>
  <text x="121.67" y="554.8" fill="#9fc9e0" font-size="8.4" text-anchor="middle">streams the pack, writes .pack +</text>
  <text x="121.67" y="564.8" fill="#9fc9e0" font-size="8.4" text-anchor="middle">.idx + .keep</text>
  <text x="121.67" y="581.8" fill="#6fd3f5" font-size="9.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">O(bytes)</text>
  <text x="121.67" y="593.8" fill="#a7e6c2" font-size="8" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">96.67% wall · 93.02% CPU</text>
  <text x="121.67" y="603.8" fill="#5f8ba6" font-size="7.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">edda/crates/gunnar-pack/read.rs:138</text>
  <path d="M206.33 566.8 H218.33" fill="none" stroke="#6fd3f5" stroke-width="2.6" marker-end="url(#arrow)"/>
  <rect x="227.33" y="524.8" width="163.33" height="84" rx="8" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.8"/>
  <text x="309" y="541.8" fill="#eaf6ff" font-size="11" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">verify_connectivity</text>
  <text x="309" y="554.8" fill="#9fc9e0" font-size="8.4" text-anchor="middle">every new tip reaches the</text>
  <text x="309" y="564.8" fill="#9fc9e0" font-size="8.4" text-anchor="middle">frontier</text>
  <text x="309" y="581.8" fill="#6fd3f5" font-size="9.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">O(new objects)</text>
  <text x="309" y="593.8" fill="#a7e6c2" font-size="8" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">6.66% CPU · 1 412 exists/req</text>
  <text x="309" y="603.8" fill="#5f8ba6" font-size="7.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">wire/graph.rs:2734</text>
  <path d="M393.67 566.8 H405.67" fill="none" stroke="#6fd3f5" stroke-width="2.6" marker-end="url(#arrow)"/>
  <rect x="414.67" y="524.8" width="163.33" height="84" rx="8" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.8"/>
  <text x="496.33" y="541.8" fill="#eaf6ff" font-size="11" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">RefLog::push</text>
  <text x="496.33" y="554.8" fill="#9fc9e0" font-size="8.4" text-anchor="middle">one Arrow batch of ref updates</text>
  <text x="496.33" y="564.8" fill="#9fc9e0" font-size="8.4" text-anchor="middle">under one push_seq</text>
  <text x="496.33" y="581.8" fill="#6fd3f5" font-size="9.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">O(edits)</text>
  <text x="496.33" y="593.8" fill="#a7e6c2" font-size="8" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">0.32% CPU</text>
  <text x="496.33" y="603.8" fill="#5f8ba6" font-size="7.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">plugins/native/znippy-plugin-git/refs.rs:130</text>
  <path d="M581 566.8 H593" fill="none" stroke="#6fd3f5" stroke-width="2.6" marker-end="url(#arrow)"/>
  <rect x="602" y="524.8" width="163.33" height="84" rx="8" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.8"/>
  <text x="683.67" y="541.8" fill="#eaf6ff" font-size="11" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">ArrowLog::append</text>
  <text x="683.67" y="554.8" fill="#9fc9e0" font-size="8.4" text-anchor="middle">one RecordBatch as one framed</text>
  <text x="683.67" y="564.8" fill="#9fc9e0" font-size="8.4" text-anchor="middle">IPC message</text>
  <text x="683.67" y="581.8" fill="#6fd3f5" font-size="9.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">O(frame bytes)</text>
  <text x="683.67" y="603.8" fill="#5f8ba6" font-size="7.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">core/arrow_log.rs:842</text>
  <line x1="40" y1="624.8" x2="538.8" y2="624.8" stroke="#4a8fb0" stroke-width="1.2" stroke-dasharray="4 4"/>
  <line x1="121.67" y1="608.8" x2="121.67" y2="624.8" stroke="#4a8fb0" stroke-width="1.4" stroke-dasharray="4 4"/>
  <text x="40" y="617.8" fill="#7fa8c4" font-size="8.6" text-anchor="start">inside index_thin_pack</text>
  <rect x="40" y="638.8" width="150.27" height="84" rx="8" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.8"/>
  <text x="115.13" y="655.8" fill="#eaf6ff" font-size="11" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">gix_hash::hasher</text>
  <text x="115.13" y="668.8" fill="#9fc9e0" font-size="8.4" text-anchor="middle">SHA-1 with UBC collision</text>
  <text x="115.13" y="678.8" fill="#9fc9e0" font-size="8.4" text-anchor="middle">detection, inside gix</text>
  <text x="115.13" y="695.8" fill="#6fd3f5" font-size="9.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">O(bytes)</text>
  <text x="115.13" y="707.8" fill="#a7e6c2" font-size="8" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">64.81% cycles</text>
  <text x="115.13" y="717.8" fill="#5f8ba6" font-size="7.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">edda/crates/gunnar-pack/read.rs:159</text>
  <rect x="214.27" y="638.8" width="150.27" height="84" rx="8" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.8"/>
  <text x="289.4" y="655.8" fill="#eaf6ff" font-size="11" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">inflate</text>
  <text x="289.4" y="668.8" fill="#9fc9e0" font-size="8.4" text-anchor="middle">zlib stream decode and delta</text>
  <text x="289.4" y="678.8" fill="#9fc9e0" font-size="8.4" text-anchor="middle">resolution</text>
  <text x="289.4" y="695.8" fill="#6fd3f5" font-size="9.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">O(bytes)</text>
  <text x="289.4" y="707.8" fill="#a7e6c2" font-size="8" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">18.29% cycles</text>
  <text x="289.4" y="717.8" fill="#5f8ba6" font-size="7.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">edda/crates/gunnar-pack/read.rs:159</text>
  <rect x="388.53" y="638.8" width="150.27" height="84" rx="8" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.8"/>
  <text x="463.67" y="655.8" fill="#eaf6ff" font-size="11" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">memmove / memset</text>
  <text x="463.67" y="668.8" fill="#9fc9e0" font-size="8.4" text-anchor="middle">kernel page init behind the</text>
  <text x="463.67" y="678.8" fill="#9fc9e0" font-size="8.4" text-anchor="middle">two above</text>
  <text x="463.67" y="695.8" fill="#6fd3f5" font-size="9.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">O(bytes)</text>
  <text x="463.67" y="707.8" fill="#a7e6c2" font-size="8" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">4.27% cycles</text>
  <text x="463.67" y="717.8" fill="#5f8ba6" font-size="7.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">edda/crates/gunnar-pack/read.rs:159</text>
  <text x="40" y="740.8" fill="#bcd9ec" font-size="9.4" text-anchor="start">The frame boundary is the transaction boundary: an Arrow IPC frame is [schema | batch | EOS], and a frame that does not parse whole is discarded whole. Everything upstream of it is bytes-bound, not object-bound,</text>
  <text x="40" y="753.2" fill="#bcd9ec" font-size="9.4" text-anchor="start">and SHA-1 owns two thirds of that — index depth does not enter: index_thin_pack is 1.24× faster at depth 50 than at depth 1 (the delta-chain measurement, the desktop 2026-08-04).</text>

  <!-- ==================== -->
  <!-- STORE - what the two paths address, and by what key -->
  <text x="40" y="793.6" fill="#6fd3f5" font-size="15" text-anchor="start" font-family="'DejaVu Sans Mono', monospace" font-weight="700">3</text>
  <text x="74" y="793.6" fill="#eaf6ff" font-size="15" text-anchor="start" font-weight="700">the pack, as structures</text>
  <text x="74" y="810.6" fill="#9fc9e0" font-size="11" text-anchor="start">what addresses each one, and what a probe into it costs</text>
  <line x1="40" y1="819.6" x2="1140" y2="819.6" stroke="#143a52" stroke-width="1"/>
  <rect x="40" y="837.6" width="168.33" height="94" rx="8" fill="url(#slot)" stroke="#6fd3f5" stroke-width="1.6"/>
  <text x="124.17" y="854.6" fill="#eaf6ff" font-size="10.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">pack entry</text>
  <text x="124.17" y="867.6" fill="#9fc9e0" font-size="8.2" text-anchor="middle">type + size header, then a deflated</text>
  <text x="124.17" y="877.2" fill="#9fc9e0" font-size="8.2" text-anchor="middle">byte range</text>
  <text x="124.17" y="903.6" fill="#86b3cc" font-size="8" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">keyed by offset</text>
  <text x="124.17" y="915.6" fill="#6fd3f5" font-size="8.8" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">O(1) locate · O(bytes) copy</text>
  <text x="124.17" y="942.6" fill="#5f8ba6" font-size="7.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">edda/crates/gunnar-pack/copy.rs:1452</text>
  <rect x="226.33" y="837.6" width="168.33" height="94" rx="8" fill="url(#slot)" stroke="#6fd3f5" stroke-width="1.6"/>
  <text x="310.5" y="854.6" fill="#eaf6ff" font-size="10.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">OfsDelta</text>
  <text x="310.5" y="867.6" fill="#9fc9e0" font-size="8.2" text-anchor="middle">base named as a backwards distance</text>
  <text x="310.5" y="877.2" fill="#9fc9e0" font-size="8.2" text-anchor="middle">from this offset</text>
  <text x="310.5" y="903.6" fill="#86b3cc" font-size="8" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">keyed by offset − distance</text>
  <text x="310.5" y="915.6" fill="#6fd3f5" font-size="8.8" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">O(depth) · 0 resolved serving</text>
  <text x="310.5" y="942.6" fill="#5f8ba6" font-size="7.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">edda/crates/gunnar-pack/copy.rs:1454</text>
  <rect x="412.67" y="837.6" width="168.33" height="94" rx="8" fill="url(#slot)" stroke="#6fd3f5" stroke-width="1.6"/>
  <text x="496.83" y="854.6" fill="#eaf6ff" font-size="10.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">RefDelta</text>
  <text x="496.83" y="867.6" fill="#9fc9e0" font-size="8.2" text-anchor="middle">base named by oid, possibly outside</text>
  <text x="496.83" y="877.2" fill="#9fc9e0" font-size="8.2" text-anchor="middle">this pack</text>
  <text x="496.83" y="903.6" fill="#86b3cc" font-size="8" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">keyed by oid</text>
  <text x="496.83" y="915.6" fill="#6fd3f5" font-size="8.8" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">O(depth) + 1 probe per link</text>
  <text x="496.83" y="942.6" fill="#5f8ba6" font-size="7.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">edda/crates/gunnar-pack/copy.rs:1479</text>
  <rect x="599" y="837.6" width="168.33" height="94" rx="8" fill="url(#slot)" stroke="#6fd3f5" stroke-width="1.6"/>
  <text x="683.17" y="854.6" fill="#eaf6ff" font-size="10.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">.idx fanout</text>
  <text x="683.17" y="867.6" fill="#9fc9e0" font-size="8.2" text-anchor="middle">256 buckets over the first oid</text>
  <text x="683.17" y="877.2" fill="#9fc9e0" font-size="8.2" text-anchor="middle">byte, sorted oids after</text>
  <text x="683.17" y="903.6" fill="#86b3cc" font-size="8" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">keyed by oid</text>
  <text x="683.17" y="915.6" fill="#6fd3f5" font-size="8.8" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">O(log(n/256))</text>
  <text x="683.17" y="942.6" fill="#5f8ba6" font-size="7.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">edda/crates/storage-git-gix/bitmap.rs:236</text>
  <rect x="785.33" y="837.6" width="168.33" height="94" rx="8" fill="url(#slot)" stroke="#6fd3f5" stroke-width="1.6"/>
  <text x="869.5" y="854.6" fill="#eaf6ff" font-size="10.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">Fanout16</text>
  <text x="869.5" y="867.6" fill="#9fc9e0" font-size="8.2" text-anchor="middle">65 536 buckets over the first two</text>
  <text x="869.5" y="877.2" fill="#9fc9e0" font-size="8.2" text-anchor="middle">bytes, in front of the .idx</text>
  <text x="869.5" y="903.6" fill="#86b3cc" font-size="8" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">keyed by oid</text>
  <text x="869.5" y="915.6" fill="#6fd3f5" font-size="8.8" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">O(log(n/65 536))</text>
  <text x="869.5" y="942.6" fill="#5f8ba6" font-size="7.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">edda/crates/storage-git-gix/fanout.rs:67</text>
  <rect x="971.67" y="837.6" width="168.33" height="94" rx="8" fill="url(#slot)" stroke="#6fd3f5" stroke-width="1.6"/>
  <text x="1055.83" y="854.6" fill="#eaf6ff" font-size="10.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">.bitmap</text>
  <text x="1055.83" y="867.6" fill="#9fc9e0" font-size="8.2" text-anchor="middle">4 type EWAHs, then one run-length</text>
  <text x="1055.83" y="877.2" fill="#9fc9e0" font-size="8.2" text-anchor="middle">map per selected commit</text>
  <text x="1055.83" y="903.6" fill="#86b3cc" font-size="8" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">keyed by commit oid</text>
  <text x="1055.83" y="915.6" fill="#6fd3f5" font-size="8.8" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace" font-weight="700">O(words), not O(objects)</text>
  <text x="1055.83" y="942.6" fill="#5f8ba6" font-size="7.6" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">edda/crates/gunnar-bitmap/file.rs:133</text>
  <text x="40" y="959.6" fill="#bcd9ec" font-size="9.4" text-anchor="start">git verify-pack -v over the single pack in each of the 19 mirrored workspace_nordisk repositories, 60 739 objects, the desktop 2026-08-04. Max depth 50 — git's default cap — and five of the nineteen sit on it.</text>
  <text x="40" y="972" fill="#bcd9ec" font-size="9.4" text-anchor="start">Mean depth 4.32 counted by object and 0.250 weighted by byte. Objects at depth ≥ 5 are 26.2% of objects and 0.70% of raw bytes: deep chains sit on tiny objects, and the largest object at depth ≥ 25 anywhere in</text>
  <text x="40" y="984.4" fill="#bcd9ec" font-size="9.4" text-anchor="start">the corpus is 4 716 bytes.</text>

  <!-- ==================== -->
  <!-- the asymmetry: read copies, write hashes -->
  <rect x="40" y="1020.8" width="522" height="83" rx="10" fill="url(#rail)" stroke="#7fc8ea" stroke-width="2"/>
  <text x="56" y="1042.8" fill="#dff1ff" font-size="14" text-anchor="start" font-family="'DejaVu Sans Mono', monospace" font-weight="700">read</text>
  <text x="56" y="1058.8" fill="#bcd9ec" font-size="10" text-anchor="start">Read copies. The bytes leave the pack in the encoding they were stored in, so the cost is</text>
  <text x="56" y="1071.8" fill="#bcd9ec" font-size="10" text-anchor="start">the length of the answer and nothing on the path scales in object count or chain depth.</text>
  <text x="56" y="1084.8" fill="#bcd9ec" font-size="10" text-anchor="start">One byte-range copy owns 89.98% of the wall.</text>
  <rect x="618" y="1020.8" width="522" height="83" rx="10" fill="url(#rail)" stroke="#7fc8ea" stroke-width="2"/>
  <text x="634" y="1042.8" fill="#dff1ff" font-size="14" text-anchor="start" font-family="'DejaVu Sans Mono', monospace" font-weight="700">write</text>
  <text x="634" y="1058.8" fill="#bcd9ec" font-size="10" text-anchor="start">Write hashes. Every byte received is inflated once and hashed with collision detection,</text>
  <text x="634" y="1071.8" fill="#bcd9ec" font-size="10" text-anchor="start">so the cost is the length of the input and 64.81% of it is one hash. Both engines on this</text>
  <text x="634" y="1084.8" fill="#bcd9ec" font-size="10" text-anchor="start">arm are SHA-1-bound, neither is delta-bound.</text>
</svg>