.nornir/assets/modgunn-system.svg
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 860 470" 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="30" font-weight="700" font-size="17">Móðguðr — one gatekeeper, two engines, one Verdict</text>
<!-- feeds in -->
<rect x="30" y="70" width="180" height="120" rx="8" fill="#eef3fb" stroke="#2b5fb3" stroke-width="1.5"/>
<text x="120" y="94" text-anchor="middle" font-weight="600">feeds ingest</text>
<text x="120" y="114" text-anchor="middle" fill="#555" font-size="12">osv · nvd · feeds</text>
<text x="120" y="132" text-anchor="middle" fill="#555" font-size="12">vex · versions</text>
<text x="120" y="152" text-anchor="middle" fill="#555" font-size="12">→ Advisory (ranges)</text>
<text x="120" y="172" text-anchor="middle" fill="#888" font-size="11">merge_by_alias · enrich</text>
<!-- warehouse -->
<rect x="30" y="250" width="180" height="150" rx="8" fill="#f2f6ee" stroke="#5c8a2f" stroke-width="1.5"/>
<text x="120" y="274" text-anchor="middle" font-weight="600">warehouse</text>
<text x="120" y="293" text-anchor="middle" fill="#555" font-size="12">skade / Iceberg seam</text>
<text x="120" y="313" text-anchor="middle" fill="#555" font-size="12">OWNs cve_advisories,</text>
<text x="120" y="331" text-anchor="middle" fill="#555" font-size="12">world_snapshots …</text>
<text x="120" y="351" text-anchor="middle" fill="#555" font-size="12">READs sbom_components</text>
<text x="120" y="371" text-anchor="middle" fill="#888" font-size="11">CDC: commit_seq/table_delta</text>
<text x="120" y="389" text-anchor="middle" fill="#888" font-size="11">scan_fleet · sbom_drift</text>
<!-- Engine A -->
<rect x="330" y="70" width="230" height="120" rx="8" fill="#eefaf0" stroke="#2f8f4e" stroke-width="1.5"/>
<text x="445" y="94" text-anchor="middle" font-weight="600">Engine A — verdict (scan)</text>
<text x="445" y="114" text-anchor="middle" fill="#555" font-size="12">OsvScanner: CVE · license ·</text>
<text x="445" y="132" text-anchor="middle" fill="#555" font-size="12">provenance → decide()</text>
<text x="445" y="152" text-anchor="middle" fill="#555" font-size="12">KEV / EPSS / VEX gating</text>
<text x="445" y="172" text-anchor="middle" fill="#888" font-size="11">lean leaf · default feature</text>
<!-- Engine B -->
<rect x="330" y="250" width="230" height="150" rx="8" fill="#fdf2ec" stroke="#c26a2b" stroke-width="1.5"/>
<text x="445" y="274" text-anchor="middle" font-weight="600">Engine B — world-delta (scip)</text>
<text x="445" y="294" text-anchor="middle" fill="#555" font-size="12">WorldSnapshot × 2 → diff()</text>
<text x="445" y="313" text-anchor="middle" fill="#555" font-size="12">tripwire battery · reachability</text>
<text x="445" y="332" text-anchor="middle" fill="#555" font-size="12">blast-radius (PageRank)</text>
<text x="445" y="351" text-anchor="middle" fill="#555" font-size="12">→ BehaviorDelta</text>
<text x="445" y="372" text-anchor="middle" fill="#888" font-size="11">heavy · feature scip · 128GB–1TB</text>
<!-- Verdict -->
<rect x="660" y="160" width="170" height="120" rx="8" fill="#f6eefb" stroke="#7a3fb3" stroke-width="1.5"/>
<text x="745" y="200" text-anchor="middle" font-weight="700">core::Verdict</text>
<text x="745" y="222" text-anchor="middle" fill="#555" font-size="12">Pass / Warn / Block</text>
<text x="745" y="242" text-anchor="middle" fill="#555" font-size="12">+ Vec<Finding></text>
<text x="745" y="262" text-anchor="middle" fill="#888" font-size="11">one shape, both engines</text>
<!-- arrows -->
<path d="M210,120 L330,120" fill="none" stroke="#555" stroke-width="1.5" marker-end="url(#a)"/>
<path d="M210,320 L330,320" fill="none" stroke="#555" stroke-width="1.5" marker-end="url(#a)"/>
<text x="235" y="112" fill="#2b5fb3" font-size="11">advisories</text>
<text x="228" y="312" fill="#5c8a2f" font-size="11">snapshots</text>
<!-- warehouse feeds both engines -->
<path d="M120,250 C120,215 200,150 330,150" fill="none" stroke="#5c8a2f" stroke-width="1.2" stroke-dasharray="4 3" marker-end="url(#a)"/>
<!-- engines to verdict -->
<path d="M560,130 C620,150 630,170 660,190" fill="none" stroke="#555" stroke-width="1.5" marker-end="url(#a)"/>
<path d="M560,320 C620,300 630,270 660,250" fill="none" stroke="#555" stroke-width="1.5" marker-end="url(#a)"/>
<!-- leaf note -->
<text x="660" y="330" fill="#888" font-size="12">holger + nornir depend on modgunn;</text>
<text x="660" y="348" fill="#888" font-size="12">modgunn → skade only (leaf, no cycle).</text>
</svg>