.nornir/assets/dwarves-embed-run-picker.svg
<svg xmlns="http://www.w3.org/2000/svg" width="900" height="356" 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}.wire{fill:#f5d76f}
.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-embed — Forge(live) run-picker; YELLOW = the wire, GREEN = REUSED (one History call, no proto change)</text>
<!-- server -->
<text x="12" y="48" class="acc">dwarves-server</text>
<rect class="box" x="12" y="60" width="176" height="70"/>
<text x="24" y="84" class="t">History(limit=N)</text>
<text x="24" y="102" class="dim">newest-first RunRows</text>
<text x="24" y="120" class="dim">(run_id·pipeline·status)</text>
<!-- wire -->
<path class="arr" d="M188,95 L236,95"/>
<text x="196" y="88" class="wire">gRPC · Bearer</text>
<!-- fetch_forge -->
<rect class="box" x="236" y="60" width="196" height="70"/>
<text x="248" y="84" class="t">fetch_forge()</text>
<text x="248" y="102" class="dim">ONE call → (runs, report)</text>
<text x="248" y="120" class="dim">runs feed picker + newest</text>
<path class="arr" d="M432,95 L480,95"/>
<!-- picks -->
<rect class="box" x="480" y="60" width="196" height="70"/>
<text x="492" y="84" class="t">run_picks_from_wire()</text>
<text x="492" y="102" class="dim">pure · order preserved</text>
<text x="492" y="120" class="dim">Vec<RunPick></text>
<path class="arr" d="M676,95 L724,95"/>
<!-- combo -->
<rect class="box" x="724" y="60" width="160" height="70"/>
<text x="736" y="84" class="t">ComboBox</text>
<text x="736" y="102" class="dim">● newest</text>
<text x="736" y="120" class="dim">run-3 · run-2 · …</text>
<!-- pin loop -->
<text x="12" y="176" class="acc">select an entry → pin its run_id → re-fetch that run's report</text>
<rect class="box" x="12" y="188" width="220" height="62"/>
<text x="24" y="212" class="t">update_json {"run_id":"…"}</text>
<text x="24" y="230" class="dim">(""=newest) · the ComboBox</text>
<text x="24" y="246" class="dim">click drives the SAME seam</text>
<path class="arr" d="M232,219 L288,219"/>
<rect class="box" x="288" y="188" width="196" height="62"/>
<text x="300" y="212" class="t">GetRunReport(pin)</text>
<text x="300" y="230" class="dim">parent RunRow + steps</text>
<text x="300" y="246" class="dim">+ needs edges</text>
<path class="arr2" d="M484,219 L540,219"/>
<rect class="reuse" x="540" y="188" width="200" height="62"/>
<text x="552" y="212" class="acc">ForgePipelineAdapter</text>
<text x="552" y="230" class="dim">::from_report (REUSED)</text>
<text x="552" y="246" class="dim">→ PipelineView</text>
<text x="12" y="292" class="dim">state_json: { runs[], run_count, selected_run_id, history_limit } — the picker surface a robot asserts.</text>
<text x="12" y="312" class="dim">Additive: unpinned ⇒ newest (unchanged default). Offline ⇒ clean "forge unavailable"; last-known list sticks through a blip.</text>
<text x="12" y="332" class="dim">No proto change: History already carried the run list; the picker just surfaces + drives it.</text>
</svg>