.nornir/assets/holger-artifact-store.svg
<svg xmlns="http://www.w3.org/2000/svg" width="820" height="330" font-family="monospace" font-size="13">
<style>
.box{fill:#0f2233;stroke:#6fd3f5;stroke-width:1.5}
.reuse{fill:#12331f;stroke:#7fe0a0;stroke-width:1.5}
.t{fill:#dbeafe}.dim{fill:#9fb6c6}.acc{fill:#7fe0a0}
.arr{stroke:#6fd3f5;stroke-width:1.5;fill:none;marker-end:url(#a)}
.arr2{stroke:#7fe0a0;stroke-width:1.5;fill:none;marker-end:url(#b)}
</style>
<defs>
<marker id="a" markerWidth="9" markerHeight="9" refX="7" refY="3" orient="auto"><path d="M0,0 L7,3 L0,6 Z" fill="#6fd3f5"/></marker>
<marker id="b" markerWidth="9" markerHeight="9" refX="7" refY="3" orient="auto"><path d="M0,0 L7,3 L0,6 Z" fill="#7fe0a0"/></marker>
</defs>
<text x="12" y="20" class="acc">dwarves → holger artifact store — REUSE the shared registry, never a local twin CAS</text>
<!-- build step -->
<rect class="box" x="12" y="46" width="180" height="66"/>
<text x="24" y="68" class="t">a build step RANs</text>
<text x="24" y="86" class="dim">produces 0..N artifacts</text>
<text x="24" y="102" class="dim">StepOutcome.artifact_files</text>
<!-- seam -->
<rect class="box" x="250" y="46" width="200" height="66"/>
<text x="262" y="68" class="t">ArtifactStore (seam)</text>
<text x="262" y="86" class="dim">put_artifacts → id/manifest</text>
<text x="262" y="102" class="dim">get(id) → bytes | manifest</text>
<!-- holger -->
<rect class="reuse" x="512" y="34" width="292" height="92"/>
<text x="524" y="54" class="acc">holger (artifact registry)</text>
<text x="524" y="74" class="dim">Holger::put / backend.put</text>
<text x="524" y="90" class="dim">immutable, content-addressed</text>
<text x="524" y="106" class="dim">SEALED VIA znippy (blake3)</text>
<line class="arr" x1="192" y1="79" x2="248" y2="79"/>
<line class="arr" x1="450" y1="79" x2="510" y2="79"/>
<!-- action cache index -->
<rect class="box" x="250" y="158" width="200" height="60"/>
<text x="262" y="180" class="t">action cache (INDEX)</text>
<text x="262" y="198" class="dim">input_id → artifact_id</text>
<text x="262" y="212" class="dim">(1 file: its id; N: manifest id)</text>
<line class="arr" x1="350" y1="112" x2="350" y2="156"/>
<text x="356" y="138" class="dim">records the id: one artifact's</text>
<text x="356" y="152" class="dim">content id, else the manifest's</text>
<!-- cross-machine resolve -->
<rect class="box" x="512" y="166" width="292" height="76"/>
<text x="524" y="188" class="acc">a HIT on ANY machine</text>
<text x="524" y="206" class="dim">cache: input_id → artifact_id</text>
<text x="524" y="222" class="dim">get → bytes, or a manifest → every member</text>
<line class="arr2" x1="658" y1="126" x2="658" y2="164"/>
<line class="arr2" x1="450" y1="196" x2="510" y2="196"/>
<text x="12" y="276" class="dim">No holger endpoint configured ⇒ ArtifactStore = None ⇒ NO-OP (pre-store behaviour, the label only).</text>
<text x="12" y="296" class="dim">A store the forge can't reach NEVER fails a build (best-effort push; fall back to the runner's label).</text>
<text x="12" y="316" class="dim">Off-by-default `holger` feature links holger-server-lib + znippy in-process; the default forge links none of it.</text>
</svg>