.nornir/assets/dwarves-embed-live-report.svg
<svg xmlns="http://www.w3.org/2000/svg" width="900" height="384" 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 — GetRunReport RPC (per-step wire) + dwarves-embed live-forge tab; GREEN = REUSED shared piece, YELLOW = the wire</text>
<!-- server side -->
<text x="12" y="48" class="acc">dwarves-server — DwarfSvc::get_run_report(run_id)</text>
<rect class="box" x="12" y="60" width="176" height="86"/>
<text x="24" y="84" class="t">read_runs()</text>
<text x="24" y="102" class="dim">parent RunRow</text>
<text x="24" y="120" class="t">read_steps(run_id)</text>
<text x="24" y="138" class="dim">steps.jsonl (new reader)</text>
<rect class="box" x="220" y="60" width="176" height="86"/>
<text x="232" y="84" class="t">Dag::build(registry)</text>
<text x="232" y="102" class="dim">step → needs edges</text>
<text x="232" y="120" class="dim">(unregistered ⇒</text>
<text x="232" y="138" class="dim">empty, still crosses)</text>
<rect class="box" x="428" y="60" width="200" height="86"/>
<text x="440" y="84" class="wire">RunReport (dwarf.v1)</text>
<text x="440" y="104" class="dim">RunRow run = 1</text>
<text x="440" y="122" class="dim">repeated BuildRow = 2</text>
<text x="440" y="140" class="wire">+ needs = 12</text>
<line class="arr" x1="188" y1="103" x2="220" y2="103"/>
<line class="arr" x1="396" y1="103" x2="428" y2="103"/>
<!-- wire hop -->
<path class="arr" d="M528,146 L528,196"/>
<text x="540" y="176" class="wire">GetRunReport gRPC · Bearer auth (shared nornir-service)</text>
<!-- client side -->
<text x="12" y="222" class="acc">dwarves-embed — thin tonic client (NO nornir dep, NO dwarves `server` feature)</text>
<rect class="box" x="12" y="234" width="176" height="80"/>
<text x="24" y="258" class="t">DwarfClient</text>
<text x="24" y="276" class="dim">History→newest run</text>
<text x="24" y="294" class="dim">or $DWARVES_RUN_ID</text>
<rect class="box" x="220" y="234" width="188" height="80"/>
<text x="232" y="258" class="t">report_from_wire()</text>
<text x="232" y="276" class="dim">→ (Dag, RunReport)</text>
<text x="232" y="294" class="dim">pure · unit-tested</text>
<rect class="reuse" x="440" y="234" width="188" height="80"/>
<text x="452" y="258" class="acc">ForgePipelineAdapter</text>
<text x="452" y="276" class="dim">::from_report (REUSED)</text>
<text x="452" y="294" class="dim">steps→nodes, needs→edges</text>
<rect class="reuse" x="660" y="234" width="176" height="80"/>
<text x="672" y="258" class="acc">PipelineView</text>
<text x="672" y="276" class="dim">facett-pipeline (REUSED)</text>
<text x="672" y="294" class="dim">"Forge (live)" tab</text>
<line class="arr" x1="188" y1="274" x2="220" y2="274"/>
<line class="arr" x1="408" y1="274" x2="440" y2="274"/>
<line class="arr2" x1="628" y1="274" x2="660" y2="274"/>
<text x="12" y="352" class="dim">Offline / no runs ⇒ clean "forge unavailable" pane (never a panic). Auto-poll (1.5s) fills a run in flight live.</text>
<text x="12" y="372" class="dim">Additive: the in-process Pipeline tab (run_pipeline → same adapter) stays unchanged.</text>
</svg>