.nornir/assets/funnel-planner-executor.svg
<svg xmlns="http://www.w3.org/2000/svg" width="880" height="300" viewBox="0 0 880 300" font-family="ui-sans-serif,system-ui,sans-serif">
<style>
.box{fill:#f4f1ea;stroke:#6b6357;stroke-width:1.5;rx:8}
.t{fill:#2b2620;font-size:13px}
.s{fill:#6b6357;font-size:11px}
.lbl{fill:#8a5a3b;font-size:11px;font-weight:600}
.arrow{stroke:#6fb0cc;stroke-width:2;fill:none;marker-end:url(#a)}
.loop{stroke:#c9803b;stroke-width:2;fill:none;marker-end:url(#a);stroke-dasharray:5 3}
</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="#6b6357"/></marker></defs>
<text x="20" y="26" class="lbl">PLANNER (Claude — decompose)</text>
<rect class="box" x="20" y="36" width="150" height="64" rx="8"/>
<text x="34" y="60" class="t">idea → subtasks</text>
<text x="34" y="78" class="s">llm_decompose +</text>
<text x="34" y="92" class="s">RAG anchor → Yggdrasil</text>
<path class="arrow" d="M170,68 L214,68"/>
<rect class="box" x="214" y="36" width="150" height="64" rx="8"/>
<text x="228" y="60" class="t">plan-DAG</text>
<text x="228" y="78" class="s">funnel_events</text>
<text x="228" y="92" class="s">promote_ready →frontier</text>
<path class="arrow" d="M289,100 L289,150"/>
<text x="20" y="150" class="lbl">EXECUTOR (drain_plan — separate Claude)</text>
<rect class="box" x="214" y="160" width="150" height="64" rx="8"/>
<text x="228" y="184" class="t">ready node</text>
<text x="228" y="202" class="s">run_subtask_loop</text>
<text x="228" y="216" class="s">generate → judge</text>
<path class="arrow" d="M364,192 L420,192"/>
<rect class="box" x="420" y="160" width="160" height="64" rx="8"/>
<text x="434" y="184" class="t">ClaudeGenerator</text>
<text x="434" y="202" class="s">viz::claude · opus-4-8</text>
<text x="434" y="216" class="s">(= a jera job)</text>
<path class="arrow" d="M580,192 L636,192"/>
<rect class="box" x="636" y="160" width="150" height="64" rx="8"/>
<text x="650" y="184" class="t">AnswerJudge</text>
<text x="650" y="202" class="s">compiler / cargo test</text>
<text x="650" y="216" class="s">= the oracle</text>
<path class="arrow" d="M786,180 L836,180"/>
<text x="800" y="150" class="lbl">Done</text>
<rect class="box" x="792" y="160" width="70" height="30" rx="8"/>
<text x="806" y="180" class="t">Done</text>
<!-- re-promote loop -->
<path class="loop" d="M711,224 L711,262 L289,262 L289,224"/>
<text x="470" y="278" class="lbl">re-promote frontier · until drained or blocked</text>
</svg>