.nornir/assets/popviz-load.svg
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 860 320" font-family="-apple-system,Segoe UI,Roboto,sans-serif" font-size="14">
<defs>
<marker id="a" markerWidth="9" markerHeight="9" refX="7" refY="3" orient="auto">
<path d="M0,0 L7,3 L0,6 Z" fill="#555"/>
</marker>
</defs>
<text x="30" y="26" font-weight="700" font-size="16">knut-popviz — the bulk-insert loop</text>
<!-- knut-popsim -->
<rect x="30" y="70" width="150" height="66" rx="8" fill="#eefaf0" stroke="#2f8f4e" stroke-width="1.5"/>
<text x="105" y="98" text-anchor="middle" font-weight="600">knut-popsim</text>
<text x="105" y="118" text-anchor="middle" fill="#555" font-size="12">simulate / geo · pure</text>
<!-- Arrow batches -->
<rect x="230" y="70" width="150" height="66" rx="8" fill="#eef3fb" stroke="#2b5fb3" stroke-width="1.5"/>
<text x="305" y="92" text-anchor="middle" font-weight="600">Arrow batches</text>
<text x="305" y="110" text-anchor="middle" fill="#555" font-size="12">vertex_batches</text>
<text x="305" y="126" text-anchor="middle" fill="#555" font-size="12">_gar_id + cols, ≤25k</text>
<!-- FalkorDbLoader -->
<rect x="430" y="70" width="170" height="66" rx="8" fill="#fdf2ec" stroke="#c26a2b" stroke-width="1.5"/>
<text x="515" y="92" text-anchor="middle" font-weight="600">FalkorDbLoader</text>
<text x="515" y="110" text-anchor="middle" fill="#555" font-size="12">per-label insert_vertices</text>
<text x="515" y="126" text-anchor="middle" fill="#555" font-size="12">+ create_index (UNWIND)</text>
<!-- PopvizState -->
<rect x="330" y="215" width="200" height="70" rx="8" fill="#f6eefb" stroke="#7a3fb3" stroke-width="1.5"/>
<text x="430" y="240" text-anchor="middle" font-weight="600">PopvizState</text>
<text x="430" y="258" text-anchor="middle" fill="#555" font-size="12">Phase · per-label loaded/total</text>
<text x="430" y="274" text-anchor="middle" fill="#555" font-size="12">rows_per_s · error</text>
<!-- egui bars -->
<rect x="655" y="70" width="175" height="66" rx="8" fill="#eefaf0" stroke="#2f8f4e" stroke-width="1.5"/>
<text x="742" y="92" text-anchor="middle" font-weight="600">egui app</text>
<text x="742" y="110" text-anchor="middle" fill="#555" font-size="12">bars per label</text>
<text x="742" y="126" text-anchor="middle" fill="#555" font-size="12">--autostart</text>
<!-- state dump -->
<rect x="600" y="215" width="230" height="66" rx="8" fill="#eef3fb" stroke="#2b5fb3" stroke-width="1.5"/>
<text x="715" y="240" text-anchor="middle" font-weight="600">$KNUT_POPVIZ_STATE</text>
<text x="715" y="258" text-anchor="middle" fill="#555" font-size="12">state_json() every ~300 ms</text>
<text x="715" y="274" text-anchor="middle" fill="#555" font-size="12">headless robot oracle</text>
<!-- popsim -> arrow -->
<path d="M180,103 L230,103" fill="none" stroke="#555" stroke-width="1.5" marker-end="url(#a)"/>
<!-- arrow -> loader -->
<path d="M380,103 L430,103" fill="none" stroke="#555" stroke-width="1.5" marker-end="url(#a)"/>
<!-- loader -> egui -->
<path d="M600,103 L655,103" fill="none" stroke="#555" stroke-width="1.5" marker-end="url(#a)"/>
<!-- loader -> PopvizState (run_load updates) -->
<path d="M510,136 C500,175 480,185 455,215" fill="none" stroke="#555" stroke-width="1.5" marker-end="url(#a)"/>
<text x="530" y="180" fill="#7a3fb3" font-size="12">run_load updates</text>
<!-- PopvizState -> egui (repaint via wake) -->
<path d="M530,238 C620,215 690,180 730,136" fill="none" stroke="#555" stroke-width="1.5" marker-end="url(#a)"/>
<text x="600" y="200" fill="#2f8f4e" font-size="12">wake → bars</text>
<!-- PopvizState -> state dump -->
<path d="M530,255 L600,251" fill="none" stroke="#555" stroke-width="1.5" marker-end="url(#a)"/>
<text x="700" y="305" text-anchor="middle" fill="#888" font-size="12" font-style="italic">one state · GUI bars and the JSON oracle are both pure functions of it</text>
</svg>