.nornir/assets/build-flow.svg
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1180 622" 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>
<marker id="arrow" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse">
<path d="M0 0 L10 5 L0 10 z" fill="#6fd3f5"/>
</marker>
</defs>
<rect x="0" y="0" width="1180" height="622" fill="url(#board)"/>
<g stroke="#143a52" stroke-width="1"><line x1="0" y1="96" x2="1180" y2="96"/></g>
<text x="40" y="40" fill="#eaf6ff" font-size="22" font-weight="700">build thing — where the flow is DECLARED and where it is CODE</text>
<text x="40" y="62" fill="#9fc9e0" font-size="14">every box carries the file:line it was audited at, 2026-09-10 — generated by <tspan fill="#bfe6ff">cargo xtask build-flow-svg</tspan>, never drawn</text>
<text x="40" y="98" fill="#9fc9e0" font-size="13" font-weight="700" letter-spacing="1">the DOORS</text>
<text x="320" y="98" fill="#9fc9e0" font-size="13" font-weight="700" letter-spacing="1">the FORGE</text>
<text x="620" y="98" fill="#9fc9e0" font-size="13" font-weight="700" letter-spacing="1">the EVALUATOR</text>
<text x="920" y="98" fill="#9fc9e0" font-size="13" font-weight="700" letter-spacing="1">ISOLATION + OUTPUT</text>
<line x1="290" y1="144" x2="320" y2="144" stroke="#6fd3f5" stroke-width="2" marker-end="url(#arrow)" opacity="0.55"/>
<line x1="570" y1="144" x2="620" y2="144" stroke="#6fd3f5" stroke-width="2" marker-end="url(#arrow)" opacity="0.55"/>
<line x1="870" y1="144" x2="920" y2="144" stroke="#6fd3f5" stroke-width="2" marker-end="url(#arrow)" opacity="0.55"/>
<rect x="40" y="118" width="250" height="52" rx="6" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.6"/>
<text x="50" y="137" fill="#eaf6ff" font-size="13" font-weight="700">CLI</text>
<text x="50" y="151" fill="#9fc9e0" font-size="10.5">dwarves buildthing <p> --variant V</text>
<text x="50" y="164" fill="#6fd3f5" font-size="9.5" font-style="italic">from the declaration</text>
<rect x="40" y="186" width="250" height="52" rx="6" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.6"/>
<text x="50" y="205" fill="#eaf6ff" font-size="13" font-weight="700">rpc</text>
<text x="50" y="219" fill="#9fc9e0" font-size="10.5">dwarf.v1.BuildThing (the --server door)</text>
<text x="50" y="232" fill="#6fd3f5" font-size="9.5" font-style="italic">from the declaration</text>
<rect x="40" y="254" width="250" height="52" rx="6" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.6"/>
<text x="50" y="273" fill="#eaf6ff" font-size="13" font-weight="700">⚒ pane</text>
<text x="50" y="287" fill="#9fc9e0" font-size="10.5">Act::Build{row,target,settings}</text>
<text x="50" y="300" fill="#6fd3f5" font-size="9.5" font-style="italic">from the declaration</text>
<rect x="320" y="118" width="250" height="52" rx="6" fill="url(#chip)" stroke="#f0a9a0" stroke-width="1.6" stroke-dasharray="6 4"/>
<text x="330" y="137" fill="#eaf6ff" font-size="13" font-weight="700">prologue</text>
<text x="330" y="151" fill="#9fc9e0" font-size="10.5">resolve → stale-reader → refuse-build-flags → recipe line</text>
<text x="330" y="164" fill="#f0a9a0" font-size="9.5" font-style="italic">crates/dwarves/src/buildthing.rs:988</text>
<rect x="320" y="186" width="250" height="52" rx="6" fill="url(#chip)" stroke="#f0a9a0" stroke-width="1.6" stroke-dasharray="6 4"/>
<text x="330" y="205" fill="#eaf6ff" font-size="13" font-weight="700">phase order</text>
<text x="330" y="219" fill="#9fc9e0" font-size="10.5">code road → opts → kernel axis → plan → resolve → loop → GATE</text>
<text x="330" y="232" fill="#f0a9a0" font-size="9.5" font-style="italic">crates/dwarves/src/buildthing.rs:1306</text>
<rect x="320" y="254" width="250" height="52" rx="6" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.6"/>
<text x="330" y="273" fill="#eaf6ff" font-size="13" font-weight="700">selection</text>
<text x="330" y="287" fill="#9fc9e0" font-size="10.5">suite_cli::resolve — WHICH variants, from the set</text>
<text x="330" y="300" fill="#6fd3f5" font-size="9.5" font-style="italic">from the declaration</text>
<rect x="320" y="322" width="250" height="52" rx="6" fill="url(#chip)" stroke="#f0a9a0" stroke-width="1.6" stroke-dasharray="6 4"/>
<text x="330" y="341" fill="#eaf6ff" font-size="13" font-weight="700">the funnel</text>
<text x="330" y="355" fill="#9fc9e0" font-size="10.5">BuildRun::spawn_recording_with_selection — every door lands here</text>
<text x="330" y="368" fill="#f0a9a0" font-size="9.5" font-style="italic">crates/dwarves/src/build_thing.rs:1813</text>
<rect x="320" y="390" width="250" height="52" rx="6" fill="url(#chip)" stroke="#f0a9a0" stroke-width="1.6" stroke-dasharray="6 4"/>
<text x="330" y="409" fill="#eaf6ff" font-size="13" font-weight="700">typ default</text>
<text x="330" y="423" fill="#9fc9e0" font-size="10.5">kind_of(v).unwrap_or(Exe) — an undeclared row silently becomes cargo</text>
<text x="330" y="436" fill="#f0a9a0" font-size="9.5" font-style="italic">crates/dwarves/src/build_thing.rs:1841</text>
<rect x="620" y="118" width="250" height="52" rx="6" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.6"/>
<text x="630" y="137" fill="#eaf6ff" font-size="13" font-weight="700">is_cargo(typ)</text>
<text x="630" y="151" fill="#9fc9e0" font-size="10.5">Exe|Lib|Wasm|Service → cargo; else assemble</text>
<text x="630" y="164" fill="#6fd3f5" font-size="9.5" font-style="italic">from the declaration</text>
<rect x="620" y="186" width="250" height="52" rx="6" fill="url(#chip)" stroke="#f0a9a0" stroke-width="1.6" stroke-dasharray="6 4"/>
<text x="630" y="205" fill="#eaf6ff" font-size="13" font-weight="700">dispatch(kind)</text>
<text x="630" y="219" fill="#9fc9e0" font-size="10.5">the 7-arm builder match — one arm per typ, in Rust</text>
<text x="630" y="232" fill="#f0a9a0" font-size="9.5" font-style="italic">edda:nornir-build-thing/src/assemble.rs:955</text>
<rect x="620" y="254" width="250" height="52" rx="6" fill="url(#chip)" stroke="#f0a9a0" stroke-width="1.6" stroke-dasharray="6 4"/>
<text x="630" y="273" fill="#eaf6ff" font-size="13" font-weight="700">assemble_cell</text>
<text x="630" y="287" fill="#9fc9e0" font-size="10.5">dwarves' SECOND full kind chain over the same typs</text>
<text x="630" y="300" fill="#f0a9a0" font-size="9.5" font-style="italic">crates/dwarves/src/assemble_cell.rs:395</text>
<rect x="620" y="322" width="250" height="52" rx="6" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.6"/>
<text x="630" y="341" fill="#eaf6ff" font-size="13" font-weight="700">settings tree</text>
<text x="630" y="355" fill="#9fc9e0" font-size="10.5">--opt / --param / presets resolve against the declaration</text>
<text x="630" y="368" fill="#6fd3f5" font-size="9.5" font-style="italic">from the declaration</text>
<rect x="620" y="390" width="250" height="52" rx="6" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.6"/>
<text x="630" y="409" fill="#eaf6ff" font-size="13" font-weight="700">BUILT edges</text>
<text x="630" y="423" fill="#9fc9e0" font-size="10.5">BuildDag::derive — the chain's order IS the DAG</text>
<text x="630" y="436" fill="#6fd3f5" font-size="9.5" font-style="italic">from the declaration</text>
<rect x="620" y="458" width="250" height="52" rx="6" fill="url(#chip)" stroke="#e8c46a" stroke-width="1.6" stroke-dasharray="2 5"/>
<text x="630" y="477" fill="#eaf6ff" font-size="13" font-weight="700">BuildPlan</text>
<text x="630" y="491" fill="#9fc9e0" font-size="10.5">typed, ABI-transported, NEVER executed — dwarves never calls plan()</text>
<text x="630" y="504" fill="#e8c46a" font-size="9.5" font-style="italic">edda:nornir-build-thing/src/plugin.rs:990</text>
<rect x="920" y="118" width="250" height="52" rx="6" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.6"/>
<text x="930" y="137" fill="#eaf6ff" font-size="13" font-weight="700">container?</text>
<text x="930" y="151" fill="#9fc9e0" font-size="10.5">[build.toolchain] present → container; absent → HOST</text>
<text x="930" y="164" fill="#6fd3f5" font-size="9.5" font-style="italic">from the declaration</text>
<rect x="920" y="186" width="250" height="52" rx="6" fill="url(#chip)" stroke="#f0a9a0" stroke-width="1.6" stroke-dasharray="6 4"/>
<text x="930" y="205" fill="#eaf6ff" font-size="13" font-weight="700">host fallback</text>
<text x="930" y="219" fill="#9fc9e0" font-size="10.5">no toolchain ⇒ build on the host — undeclarable, unrefusable</text>
<text x="930" y="232" fill="#f0a9a0" font-size="9.5" font-style="italic">crates/dwarves/src/build_thing.rs:1917</text>
<rect x="920" y="254" width="250" height="52" rx="6" fill="url(#chip)" stroke="#f0a9a0" stroke-width="1.6" stroke-dasharray="6 4"/>
<text x="930" y="273" fill="#eaf6ff" font-size="13" font-weight="700">kernel runner</text>
<text x="930" y="287" fill="#9fc9e0" font-size="10.5">DraupnirKernelRunner + ContainerKernelBuilder, behind a cfg!</text>
<text x="930" y="300" fill="#f0a9a0" font-size="9.5" font-style="italic">crates/dwarves/src/assemble_cell.rs:553</text>
<rect x="920" y="322" width="250" height="52" rx="6" fill="url(#chip)" stroke="#f0a9a0" stroke-width="1.6" stroke-dasharray="6 4"/>
<text x="930" y="341" fill="#eaf6ff" font-size="13" font-weight="700">kernel script</text>
<text x="930" y="355" fill="#9fc9e0" font-size="10.5">the in-container step list is a String builder: make → merge → bzImage</text>
<text x="930" y="368" fill="#f0a9a0" font-size="9.5" font-style="italic">edda:nornir-build-thing/src/kernel.rs:1677</text>
<rect x="920" y="390" width="250" height="52" rx="6" fill="url(#chip)" stroke="#f0a9a0" stroke-width="1.6" stroke-dasharray="6 4"/>
<text x="930" y="409" fill="#eaf6ff" font-size="13" font-weight="700">output dirs</text>
<text x="930" y="423" fill="#9fc9e0" font-size="10.5">.iso-out · .kernel-out/<name> · target/ · /usr/local/bin</text>
<text x="930" y="436" fill="#f0a9a0" font-size="9.5" font-style="italic">edda:nornir-build-thing/src/image_build.rs:760</text>
<rect x="40" y="566" width="1100" height="40" rx="6" fill="url(#rail)" stroke="#143a52"/>
<line x1="56" y1="586" x2="88" y2="586" stroke="#6fd3f5" stroke-width="2.4"/>
<text x="96" y="590" fill="#eaf6ff" font-size="12">DECLARED · 8 steps the recipe orders</text>
<line x1="356" y1="586" x2="388" y2="586" stroke="#f0a9a0" stroke-width="2.4" stroke-dasharray="6 4"/>
<text x="396" y="590" fill="#eaf6ff" font-size="12">HARD-CODED · 10 steps fixed in Rust</text>
<line x1="686" y1="586" x2="718" y2="586" stroke="#e8c46a" stroke-width="2.4" stroke-dasharray="2 5"/>
<text x="726" y="590" fill="#eaf6ff" font-size="12">TYPED, NEVER EXECUTED · BuildPlan/PlanStep</text>
</svg>