.nornir/assets/release-doctor-cascade.svg
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 900 340" font-family="ui-sans-serif,system-ui,Segoe UI,Roboto,sans-serif">
<defs>
<marker id="c" markerWidth="9" markerHeight="9" refX="7" refY="3" orient="auto"><path d="M0,0 L7,3 L0,6 Z" fill="#9ca3af"/></marker>
</defs>
<style>.n{font-size:13px;font-weight:600}.s{font-size:10px;fill:#6b7280}.step{font-size:10px;fill:#9ca3af;font-weight:700}</style>
<text x="450" y="30" text-anchor="middle" font-size="20" font-weight="700" fill="#111827">nordisk publish cascade — topo order (deps first)</text>
<text x="450" y="50" text-anchor="middle" class="s">green = published to crates.io · grey = private (private=true, not published)</text>
<!-- row 1: steps 1-6 -->
<g>
<!-- helper: each node -->
<g transform="translate(20,80)">
<rect width="120" height="46" rx="9" fill="#dcfce7" stroke="#16a34a" stroke-width="1.5"/>
<text x="60" y="22" text-anchor="middle" class="n">Skidbladnir</text><text x="60" y="38" text-anchor="middle" class="s">airgap leaf</text>
<text x="6" y="-6" class="step">1</text>
</g>
<g transform="translate(165,80)"><rect width="105" height="46" rx="9" fill="#dcfce7" stroke="#16a34a" stroke-width="1.5"/><text x="52" y="22" text-anchor="middle" class="n">skade</text><text x="52" y="38" text-anchor="middle" class="s">iceberg wh</text><text x="6" y="-6" class="step">2</text></g>
<g transform="translate(295,80)"><rect width="105" height="46" rx="9" fill="#dcfce7" stroke="#16a34a" stroke-width="2.4"/><text x="52" y="22" text-anchor="middle" class="n">modgunn</text><text x="52" y="38" text-anchor="middle" class="s">★ just added</text><text x="6" y="-6" class="step">3</text></g>
<g transform="translate(425,80)"><rect width="120" height="46" rx="9" fill="#dcfce7" stroke="#16a34a" stroke-width="1.5"/><text x="60" y="22" text-anchor="middle" class="n">znippy-zoomies</text><text x="60" y="38" text-anchor="middle" class="s">codecs/vann</text><text x="6" y="-6" class="step">4</text></g>
<g transform="translate(570,80)"><rect width="105" height="46" rx="9" fill="#dcfce7" stroke="#16a34a" stroke-width="1.5"/><text x="52" y="22" text-anchor="middle" class="n">facett</text><text x="52" y="38" text-anchor="middle" class="s">UI ramverk</text><text x="6" y="-6" class="step">5</text></g>
<g transform="translate(700,80)"><rect width="105" height="46" rx="9" fill="#dcfce7" stroke="#16a34a" stroke-width="1.5"/><text x="52" y="22" text-anchor="middle" class="n">knut</text><text x="52" y="38" text-anchor="middle" class="s">graph/lake</text><text x="6" y="-6" class="step">6</text></g>
<path d="M140,103 L165,103" stroke="#9ca3af" stroke-width="1.5" marker-end="url(#c)"/>
<path d="M270,103 L295,103" stroke="#9ca3af" stroke-width="1.5" marker-end="url(#c)"/>
<path d="M400,103 L425,103" stroke="#9ca3af" stroke-width="1.5" marker-end="url(#c)"/>
<path d="M545,103 L570,103" stroke="#9ca3af" stroke-width="1.5" marker-end="url(#c)"/>
<path d="M675,103 L700,103" stroke="#9ca3af" stroke-width="1.5" marker-end="url(#c)"/>
</g>
<!-- wrap arrow -->
<path d="M805,126 C830,150 830,180 805,200 L70,200 C45,200 45,215 70,222" fill="none" stroke="#9ca3af" stroke-width="1.5" marker-end="url(#c)"/>
<!-- row 2: steps 7-11 -->
<g transform="translate(0,120)">
<g transform="translate(20,80)"><rect width="105" height="46" rx="9" fill="#f3f4f6" stroke="#9ca3af" stroke-width="1.5"/><text x="52" y="22" text-anchor="middle" class="n">ordning</text><text x="52" y="38" text-anchor="middle" class="s">private</text><text x="6" y="-6" class="step">7</text></g>
<g transform="translate(165,80)"><rect width="105" height="46" rx="9" fill="#f3f4f6" stroke="#9ca3af" stroke-width="1.5"/><text x="52" y="22" text-anchor="middle" class="n">holger</text><text x="52" y="38" text-anchor="middle" class="s">private</text><text x="6" y="-6" class="step">8</text></g>
<g transform="translate(295,80)"><rect width="105" height="46" rx="9" fill="#f3f4f6" stroke="#9ca3af" stroke-width="1.5"/><text x="52" y="22" text-anchor="middle" class="n">korp</text><text x="52" y="38" text-anchor="middle" class="s">private</text><text x="6" y="-6" class="step">9</text></g>
<g transform="translate(425,80)"><rect width="105" height="46" rx="9" fill="#dcfce7" stroke="#16a34a" stroke-width="1.5"/><text x="52" y="22" text-anchor="middle" class="n">znippy</text><text x="52" y="38" text-anchor="middle" class="s">compressor</text><text x="6" y="-6" class="step">10</text></g>
<g transform="translate(570,80)"><rect width="105" height="46" rx="9" fill="#dcfce7" stroke="#16a34a" stroke-width="2.4"/><text x="52" y="22" text-anchor="middle" class="n">nornir</text><text x="52" y="38" text-anchor="middle" class="s">flagship (last)</text><text x="6" y="-6" class="step">11</text></g>
<path d="M125,103 L165,103" stroke="#9ca3af" stroke-width="1.5" marker-end="url(#c)"/>
<path d="M270,103 L295,103" stroke="#9ca3af" stroke-width="1.5" marker-end="url(#c)"/>
<path d="M400,103 L425,103" stroke="#9ca3af" stroke-width="1.5" marker-end="url(#c)"/>
<path d="M530,103 L570,103" stroke="#9ca3af" stroke-width="1.5" marker-end="url(#c)"/>
</g>
<text x="450" y="320" text-anchor="middle" class="s">each crate publishes only after every crate it depends on is on the registry — computed by crate-level topological sort</text>
</svg>