mikronova/draupnir
.nornir/assets/boot-readback.svg
<svg xmlns="http://www.w3.org/2000/svg" width="760" height="340" viewBox="0 0 760 340" 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}
.arr{stroke:#6fd3f5;stroke-width:1.6;fill:none;marker-end:url(#a)}
.loop{stroke:#7fa0b8;stroke-width:1.4;fill:none;marker-end:url(#a);stroke-dasharray:4 3}
.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="340" fill="#0a1017"/>
<text x="16" y="26" class="t" font-size="14" font-weight="700">draupnir · boot-status readback <tspan class="dim" font-weight="400">(boot returns early — poll until actually up)</tspan></text>
<!-- consumer -->
<rect class="box" x="16" y="58" width="150" height="60" rx="8"/>
<text x="30" y="80" class="acc" font-weight="700">jera / Skidbladnir</text>
<text x="30" y="100" class="mono">boot_and_await(spec)</text>
<!-- boot -->
<rect class="box eng" x="210" y="58" width="170" height="60" rx="8"/>
<text x="224" y="80" class="acc" font-weight="700">boot()</text>
<text x="224" y="98" class="mono">validate() + Boot::boot</text>
<text x="224" y="112" class="dim">returns before it is up</text>
<!-- await loop -->
<rect class="box pure" x="430" y="46" width="200" height="120" rx="8"/>
<text x="444" y="68" class="acc" font-weight="700">await_power_state()</text>
<text x="444" y="88" class="mono">loop: Lifecycle::status</text>
<text x="444" y="106" class="mono">observed == want ? → Ok</text>
<text x="444" y="124" class="mono">deadline passed ? → timeout</text>
<text x="444" y="142" class="mono">else sleep(poll) · retry</text>
<text x="444" y="158" class="dim">pure std · any backend</text>
<path class="arr" d="M166,88 L208,88"/>
<path class="arr" d="M380,88 L428,88"/>
<!-- self loop -->
<path class="loop" d="M470,166 C450,200 470,214 520,214 C560,214 578,200 560,168"/>
<text x="486" y="206" class="dim">poll every poll_interval</text>
<!-- status source backends -->
<rect class="box" x="430" y="250" width="330" height="66" rx="8"/>
<text x="444" y="272" class="lbl">Lifecycle::status <tspan class="dim">(one trait, three backends)</tspan></text>
<text x="444" y="292" class="mono">KVM tunnr handle · OCI container state · Redfish BMC power</text>
<text x="444" y="308" class="dim">a status() error propagates — the readback itself failed</text>
<path class="arr" d="M540,250 L540,168"/>
<!-- outcomes -->
<rect class="box pure" x="16" y="160" width="180" height="42" rx="8"/>
<text x="30" y="186" class="acc" font-weight="700">Ok(Machine) <tspan class="dim">power=On</tspan></text>
<rect class="box warn" x="16" y="214" width="180" height="42" rx="8"/>
<text x="30" y="240" class="lbl">Err(Backend) <tspan class="dim">timeout, last state</tspan></text>
<path class="arr" d="M470,120 C300,150 220,160 198,178"/>
<path class="arr" d="M470,150 C300,210 240,232 198,234"/>
<text x="16" y="332" class="dim">the power-lifecycle analogue of run_to_completion — a booted-but-dead instance is a bounded timeout, never a hang; awaiting PowerState::Unknown is rejected up front (Spec)</text>
</svg>