nordisk/edda
.nornir/assets/build-variants.svg
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1180 560" font-family="'DejaVu Sans', 'Segoe UI', sans-serif">
<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>
<marker id="arr" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse">
<path d="M0 0 L10 5 L0 10 z" fill="#6fd3f5"/>
</marker>
<marker id="arrg" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse">
<path d="M0 0 L10 5 L0 10 z" fill="#7CFFB2"/>
</marker>
</defs>
<rect x="0" y="0" width="1180" height="560" fill="url(#board)"/>
<g stroke="#143a52" stroke-width="1"><line x1="0" y1="82" x2="1180" y2="82"/><line x1="0" y1="516" x2="1180" y2="516"/></g>
<text x="40" y="42" fill="#eaf6ff" font-size="22" font-weight="700">the build-thing</text>
<text x="40" y="64" fill="#9fc9e0" font-size="14.5">declarative build <tspan fill="#bfe6ff">goals</tspan> → validated <tspan fill="#bfe6ff">variants</tspan> → content-addressed <tspan fill="#7CFFB2">provenance</tspan> · one leaf crate <tspan font-family="'DejaVu Sans Mono', monospace" fill="#bfe6ff">nornir-build-thing</tspan></text>
<g font-size="12.5">
<line x1="820" y1="60" x2="860" y2="60" stroke="#7CFFB2" stroke-width="3" marker-end="url(#arrg)"/>
<text x="868" y="64" fill="#cfe6f5">build / attest</text>
<line x1="1000" y1="60" x2="1040" y2="60" stroke="#6fd3f5" stroke-width="3" marker-end="url(#arr)"/>
<text x="1048" y="64" fill="#cfe6f5">render / read</text>
</g>
<!-- 1. declared goals -->
<rect x="36" y="112" width="220" height="150" rx="12" fill="url(#chip)" stroke="#5aa6cf" stroke-width="2"/>
<text x="146" y="140" fill="#eaf6ff" font-size="14.5" font-weight="700" text-anchor="middle">declared goals</text>
<text x="146" y="159" fill="#9fc9e0" font-size="10.5" text-anchor="middle">data, not a Makefile</text>
<g font-family="'DejaVu Sans Mono', monospace">
<rect x="54" y="174" width="184" height="24" rx="5" fill="url(#slot)" stroke="#6fd3f5" stroke-width="1.2"/><text x="146" y="190" fill="#bfe6ff" font-size="10" text-anchor="middle">[build] in nornir.toml</text>
<rect x="54" y="204" width="184" height="24" rx="5" fill="url(#slot)" stroke="#6fd3f5" stroke-width="1.2"/><text x="146" y="220" fill="#bfe6ff" font-size="10" text-anchor="middle">build-variants.toml</text>
</g>
<text x="146" y="250" fill="#86b3cc" font-size="9.5" text-anchor="middle">embedded · minimal · full</text>
<line x1="256" y1="187" x2="316" y2="187" stroke="#7CFFB2" stroke-width="3" marker-end="url(#arrg)"/>
<!-- 2. variant set (validate) -->
<rect x="322" y="112" width="248" height="150" rx="12" fill="url(#rail)" stroke="#7CFFB2" stroke-width="2.5"/>
<text x="446" y="140" fill="#eaf6ff" font-size="14.5" font-weight="700" text-anchor="middle">BuildVariantSet</text>
<text x="446" y="159" fill="#9fc9e0" font-size="10.5" text-anchor="middle">validate the chosen point</text>
<g font-family="'DejaVu Sans Mono', monospace">
<rect x="342" y="174" width="208" height="22" rx="5" fill="url(#slot)" stroke="#6fd3f5" stroke-width="1.2"/><text x="446" y="189" fill="#bfe6ff" font-size="9.5" text-anchor="middle">offers · exclusive · required</text>
<rect x="342" y="202" width="208" height="22" rx="5" fill="url(#slot)" stroke="#6fd3f5" stroke-width="1.2"/><text x="446" y="217" fill="#7CFFB2" font-size="9.5" text-anchor="middle">cargo_args() → build -p --bin …</text>
</g>
<text x="446" y="250" fill="#86b3cc" font-size="9.5" text-anchor="middle">reject bad combos up front, not via cargo</text>
<line x1="570" y1="187" x2="630" y2="187" stroke="#7CFFB2" stroke-width="3" marker-end="url(#arrg)"/>
<!-- 3. cargo build -> artifacts -->
<rect x="636" y="112" width="238" height="150" rx="12" fill="url(#chip)" stroke="#5aa6cf" stroke-width="2"/>
<text x="755" y="140" fill="#eaf6ff" font-size="14.5" font-weight="700" text-anchor="middle">cargo build</text>
<text x="755" y="159" fill="#9fc9e0" font-size="10.5" text-anchor="middle">subprocess, --message-format=json</text>
<rect x="656" y="176" width="198" height="26" rx="5" fill="url(#slot)" stroke="#6fd3f5" stroke-width="1.2"/><text x="755" y="193" fill="#bfe6ff" font-size="10" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">compiler-artifact executables</text>
<text x="755" y="228" fill="#86b3cc" font-size="9.5" text-anchor="middle">three split executables from one tree</text>
<text x="755" y="248" fill="#7fa8c4" font-size="9.5" text-anchor="middle">each artifact SHA-256 hashed</text>
<!-- down to provenance -->
<path d="M755 262 V296" stroke="#7CFFB2" stroke-width="3" fill="none" marker-end="url(#arrg)"/>
<!-- 4. provenance / attestation -->
<rect x="322" y="302" width="552" height="150" rx="12" fill="url(#rail)" stroke="#7CFFB2" stroke-width="2.5"/>
<text x="598" y="330" fill="#eaf6ff" font-size="14.5" font-weight="700" text-anchor="middle">BuildProvenance → Attestation</text>
<text x="598" y="349" fill="#9fc9e0" font-size="10.5" text-anchor="middle">what actually happened, folded to one canonical SHA-256 digest</text>
<g font-family="'DejaVu Sans Mono', monospace" font-size="9.5">
<rect x="342" y="364" width="126" height="24" rx="5" fill="url(#slot)" stroke="#6fd3f5" stroke-width="1.2"/><text x="405" y="380" fill="#bfe6ff" text-anchor="middle">variant + inputs</text>
<rect x="474" y="364" width="126" height="24" rx="5" fill="url(#slot)" stroke="#6fd3f5" stroke-width="1.2"/><text x="537" y="380" fill="#bfe6ff" text-anchor="middle">toolchain + host</text>
<rect x="606" y="364" width="126" height="24" rx="5" fill="url(#slot)" stroke="#6fd3f5" stroke-width="1.2"/><text x="669" y="380" fill="#bfe6ff" text-anchor="middle">vcs rev + dirty</text>
<rect x="738" y="364" width="118" height="24" rx="5" fill="url(#slot)" stroke="#6fd3f5" stroke-width="1.2"/><text x="797" y="380" fill="#bfe6ff" text-anchor="middle">artifact hashes</text>
</g>
<text x="598" y="410" fill="#86b3cc" font-size="9.5" text-anchor="middle">digest binds the record; tampering breaks it</text>
<text x="598" y="430" fill="#7fa8c4" font-size="9.5" text-anchor="middle">a fresh attestation is UNSEALED — no faked signature</text>
<line x1="874" y1="377" x2="934" y2="377" stroke="#7CFFB2" stroke-width="3" marker-end="url(#arrg)"/>
<!-- 5. seal + sinks -->
<rect x="940" y="302" width="204" height="150" rx="12" fill="url(#chip)" stroke="#5aa6cf" stroke-width="2"/>
<text x="1042" y="330" fill="#eaf6ff" font-size="13.5" font-weight="700" text-anchor="middle">seal & keep</text>
<text x="1042" y="348" fill="#9fc9e0" font-size="10" text-anchor="middle">feature build-provenance</text>
<rect x="958" y="360" width="168" height="22" rx="5" fill="url(#slot)" stroke="#7CFFB2" stroke-width="1.2"/><text x="1042" y="375" fill="#7CFFB2" font-size="9.5" text-anchor="middle">znippy CMS seal</text>
<rect x="958" y="388" width="168" height="22" rx="5" fill="url(#slot)" stroke="#6fd3f5" stroke-width="1.2"/><text x="1042" y="403" fill="#bfe6ff" font-size="9.5" text-anchor="middle">warehouse ledger</text>
<text x="1042" y="432" fill="#86b3cc" font-size="9" text-anchor="middle">+ .znippy beside the binary</text>
<!-- surface tap (read side) -->
<path d="M446 262 V196" stroke="none"/>
<line x1="146" y1="302" x2="146" y2="360" stroke="#6fd3f5" stroke-width="2.5" fill="none" marker-end="url(#arr)"/>
<rect x="36" y="302" width="220" height="150" rx="12" fill="url(#chip)" stroke="#5aa6cf" stroke-width="2"/>
<text x="146" y="330" fill="#eaf6ff" font-size="13.5" font-weight="700" text-anchor="middle">BuildSurface</text>
<text x="146" y="349" fill="#9fc9e0" font-size="10" text-anchor="middle">the read-side view-model</text>
<rect x="54" y="362" width="184" height="22" rx="5" fill="url(#slot)" stroke="#6fd3f5" stroke-width="1.2"/><text x="146" y="377" fill="#bfe6ff" font-size="9.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">state_json · Build action</text>
<text x="146" y="404" fill="#86b3cc" font-size="9.5" text-anchor="middle">CLI --json / viz tab / MCP</text>
<text x="146" y="424" fill="#7fa8c4" font-size="9.5" text-anchor="middle">per-variant validity + reason</text>
<!-- ground -->
<rect x="36" y="466" width="1108" height="38" rx="10" fill="url(#rail)" stroke="#7fc8ea" stroke-width="2"/>
<text x="58" y="490" fill="#bcd9ec" font-size="11">The descriptor holds the POSSIBLE build points; a provenance record captures what ONE materialized build produced — JFrog build-info / SLSA in one dep-light crate.</text>
</svg>