mikronova/draupnir
.nornir/assets/boot-fleet-readback.svg
<svg xmlns="http://www.w3.org/2000/svg" width="760" height="368" viewBox="0 0 760 368" font-family="ui-sans-serif,system-ui,sans-serif" font-size="12">
<style>
.box{fill:#0f1720;stroke:#2b3948;stroke-width:1.5}
.lbl{fill:#cfe3f5}.dim{fill:#7fa0b8}.acc{fill:#6fd3f5}
.eng{fill:#12202b;stroke:#3a6d86}
.pure{fill:#101d16;stroke:#3a865a}
.warn{fill:#22160f;stroke:#8a5a30}
.err{fill:#22110f;stroke:#8a3a30}
.arr{stroke:#6fd3f5;stroke-width:1.6;fill:none;marker-end:url(#a)}
.t{fill:#e6f2fb}.mono{font-family:ui-monospace,monospace;fill:#a9c7dd;font-size:11px}
</style>
<defs><marker id="a" markerWidth="9" markerHeight="9" refX="7" refY="3.2" orient="auto">
<path d="M0,0 L8,3.2 L0,6.4 Z" fill="#6fd3f5"/></marker></defs>
<rect width="760" height="368" fill="#0a1017"/>
<text x="16" y="26" class="t" font-size="14" font-weight="700">draupnir · boot_fleet_and_await <tspan class="dim" font-weight="400">(boot N members — roll up who is actually ready)</tspan></text>
<!-- consumer -->
<rect class="box" x="16" y="58" width="168" height="66" rx="8"/>
<text x="30" y="80" class="acc" font-weight="700">jera dispatcher</text>
<text x="30" y="98" class="mono">Roster / WorkPayload</text>
<text x="30" y="114" class="mono">boot_fleet_and_await(spec,n)</text>
<!-- plan_fleet -->
<rect class="box eng" x="228" y="58" width="150" height="66" rx="8"/>
<text x="242" y="80" class="acc" font-weight="700">plan_fleet(spec,n)</text>
<text x="242" y="100" class="mono">node-1 … node-n</text>
<text x="242" y="116" class="dim">one image, n names</text>
<!-- per-member boot_and_await -->
<rect class="box pure" x="424" y="46" width="216" height="92" rx="8"/>
<text x="438" y="68" class="acc" font-weight="700">boot_and_await(member)</text>
<text x="438" y="88" class="mono">per member · bounded opts</text>
<text x="438" y="106" class="mono">validate + boot + await On</text>
<text x="438" y="126" class="dim">one dead node can't hang the rest</text>
<path class="arr" d="M184,90 L226,90"/>
<path class="arr" d="M378,90 L422,90"/>
<!-- rollup -->
<rect class="box" x="424" y="176" width="320" height="52" rx="8"/>
<text x="438" y="198" class="lbl">FleetReadback <tspan class="dim">members[] + ready()/failed()/all_ready()</tspan></text>
<text x="438" y="216" class="mono">infallible — a partial fleet is always observable</text>
<path class="arr" d="M532,138 L532,174"/>
<!-- per-member outcomes -->
<rect class="box pure" x="16" y="176" width="180" height="40" rx="8"/>
<text x="30" y="201" class="acc" font-weight="700">Up(Machine) <tspan class="dim">ready</tspan></text>
<rect class="box warn" x="16" y="226" width="180" height="40" rx="8"/>
<text x="30" y="251" class="lbl">Timeout(detail) <tspan class="dim">never up in budget</tspan></text>
<rect class="box err" x="16" y="276" width="180" height="40" rx="8"/>
<text x="30" y="301" class="lbl">Error(detail) <tspan class="dim">bad spec / no backend</tspan></text>
<path class="arr" d="M424,196 C300,196 220,196 198,196"/>
<path class="arr" d="M424,206 C300,240 240,246 198,246"/>
<path class="arr" d="M424,214 C300,300 240,296 198,296"/>
<text x="16" y="346" class="dim">Ok → Up · Err(Backend) → Timeout (readback/backend didn't bring it up in budget) · Err(Spec|Unsupported) → Error (hard misconfig)</text>
<text x="16" y="362" class="dim">the fleet analogue of boot_and_await — reuses it per member (no twin); ready = Up count, failed = the rest; all_ready = non-empty and none failed</text>
</svg>