.nornir/assets/plandag-constraints.svg
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1180 520" font-family="'DejaVu Sans', 'Segoe UI', sans-serif">
<defs>
<linearGradient id="board" x1="0" y1="0" x2="0" y2="1">
<stop offset="0" stop-color="#0b1c2e"/>
<stop offset="1" stop-color="#06111d"/>
</linearGradient>
<linearGradient id="chip" x1="0" y1="0" x2="0" y2="1">
<stop offset="0" stop-color="#14384f"/>
<stop offset="1" stop-color="#0e2a3e"/>
</linearGradient>
<marker id="arrow" markerWidth="9" markerHeight="9" refX="7" refY="4" orient="auto">
<path d="M0 0 L8 4 L0 8 Z" fill="#6c7a88"/>
</marker>
<marker id="crit" markerWidth="10" markerHeight="10" refX="7" refY="4" orient="auto">
<path d="M0 0 L8 4 L0 8 Z" fill="#78d2ff"/>
</marker>
</defs>
<rect x="0" y="0" width="1180" height="520" fill="url(#board)"/>
<g stroke="#143a52" stroke-width="1">
<line x1="0" y1="76" x2="1180" y2="76"/>
<line x1="0" y1="486" x2="1180" y2="486"/>
</g>
<!-- title -->
<text x="40" y="44" fill="#eaf6ff" font-size="22" font-weight="700">facett-plandag · constraint overlay</text>
<text x="470" y="44" fill="#9fc9e0" font-size="14">one <tspan fill="#bfe6ff" font-weight="700">resolve()</tspan> → badge the top bottleneck · emphasise by downstream reach · highlight the critical path</text>
<!-- legend -->
<g font-size="12.5">
<circle cx="812" cy="60" r="7" fill="#f0b428"/><text x="825" y="64" fill="#f0d79a">top bottleneck (clear next)</text>
<rect x="988" y="53" width="14" height="14" rx="3" fill="none" stroke="#78d2ff" stroke-width="2"/><text x="1008" y="64" fill="#9fc9e0">reach ring</text>
<line x1="1088" y1="60" x2="1120" y2="60" stroke="#78d2ff" stroke-width="4"/><text x="1126" y="64" fill="#9fc9e0">crit path</text>
</g>
<!-- ================= the wide-vs-deep DAG ================= -->
<!-- edges first (under nodes) -->
<g fill="none" stroke-width="2">
<!-- root -> wide (plain) -->
<path d="M232 250 L300 168" stroke="#6c7a88" marker-end="url(#arrow)"/>
<!-- wide -> w1/w2/w3 (plain) -->
<path d="M452 152 L520 96" stroke="#6c7a88" marker-end="url(#arrow)"/>
<path d="M452 160 L520 160" stroke="#6c7a88" marker-end="url(#arrow)"/>
<path d="M452 168 L520 224" stroke="#6c7a88" marker-end="url(#arrow)"/>
<!-- CRITICAL PATH: root -> deep -> d1 -> d2 -> d3 -> d4 -->
<path d="M232 262 L300 344" stroke="#78d2ff" stroke-width="4" marker-end="url(#crit)"/>
<path d="M452 352 L520 352" stroke="#78d2ff" stroke-width="4" marker-end="url(#crit)"/>
<path d="M672 352 L740 352" stroke="#78d2ff" stroke-width="4" marker-end="url(#crit)"/>
<path d="M892 352 L960 352" stroke="#78d2ff" stroke-width="4" marker-end="url(#crit)"/>
<path d="M1112 352 L1150 352" stroke="#78d2ff" stroke-width="4" marker-end="url(#crit)"/>
</g>
<!-- reach rings (outer accent, weight/alpha ~ downstream) -->
<g fill="none" stroke="#78d2ff">
<rect x="146" y="228" width="92" height="52" rx="9" stroke-opacity="0.75" stroke-width="2.5"/> <!-- root: reach 9 -->
<rect x="304" y="330" width="92" height="52" rx="9" stroke-opacity="0.55" stroke-width="2"/> <!-- deep: reach 4 -->
<rect x="304" y="132" width="92" height="52" rx="9" stroke-opacity="0.45" stroke-width="1.6"/> <!-- wide: reach 3 -->
</g>
<!-- nodes -->
<g font-size="12.5" text-anchor="middle">
<!-- root (source, whole-plan cone; NOT badged) -->
<rect x="150" y="232" width="84" height="44" rx="6" fill="url(#chip)" stroke="#7fb8d8" stroke-width="2"/>
<text x="192" y="252" fill="#eaf6ff">Root</text><text x="192" y="268" fill="#8fb0c4" font-size="10">reach 9 · fan_in 0</text>
<!-- wide (fan_out 3, reach 3) -->
<rect x="308" y="136" width="84" height="44" rx="6" fill="url(#chip)" stroke="#7fb8d8" stroke-width="2"/>
<text x="350" y="156" fill="#eaf6ff">Wide</text><text x="350" y="172" fill="#8fb0c4" font-size="10">reach 3 · fan_out 3</text>
<rect x="524" y="76" width="76" height="40" rx="6" fill="url(#chip)" stroke="#5f7488" stroke-width="1.5"/><text x="562" y="100" fill="#cfe0ec">W1</text>
<rect x="524" y="140" width="76" height="40" rx="6" fill="url(#chip)" stroke="#5f7488" stroke-width="1.5"/><text x="562" y="164" fill="#cfe0ec">W2</text>
<rect x="524" y="204" width="76" height="40" rx="6" fill="url(#chip)" stroke="#5f7488" stroke-width="1.5"/><text x="562" y="228" fill="#cfe0ec">W3</text>
<!-- deep: THE BADGED top bottleneck (fan_out 1, reach 4) -->
<rect x="308" y="330" width="84" height="44" rx="6" fill="url(#chip)" stroke="#f0b428" stroke-width="3"/>
<circle cx="350" cy="330" r="9" fill="#f0b428"/><text x="350" y="334" fill="#1e190a" font-size="11">⚑</text>
<text x="350" y="350" fill="#eaf6ff">Deep</text><text x="350" y="366" fill="#f0d79a" font-size="10">reach 4 · fan_out 1</text>
<rect x="524" y="330" width="76" height="44" rx="6" fill="url(#chip)" stroke="#78d2ff" stroke-width="1.8"/><text x="562" y="356" fill="#cfe0ec">D1</text>
<rect x="744" y="330" width="76" height="44" rx="6" fill="url(#chip)" stroke="#78d2ff" stroke-width="1.8"/><text x="782" y="356" fill="#cfe0ec">D2</text>
<rect x="964" y="330" width="76" height="44" rx="6" fill="url(#chip)" stroke="#78d2ff" stroke-width="1.8"/><text x="1002" y="356" fill="#cfe0ec">D3</text>
<rect x="1094" y="330" width="76" height="44" rx="6" fill="url(#chip)" stroke="#78d2ff" stroke-width="1.8"/><text x="1132" y="356" fill="#cfe0ec">D4</text>
</g>
<!-- caption -->
<text x="40" y="470" fill="#9fc9e0" font-size="13">
<tspan fill="#f0d79a" font-weight="700">reach beats fan-out</tspan>: Deep (fan_out 1, downstream 4) is the badged constraint over Wide (fan_out 3, downstream 3); Root's whole-plan cone is skipped (fan_in 0). Badge / rings / crit-path all read one <tspan fill="#bfe6ff">resolved</tspan> graph — the pixels ARE state_json.
</text>
</svg>