.nornir/assets/verdict-engine-a.svg
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 820 330" 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="16">Engine A — OsvScanner::scan → Verdict</text>
<!-- Artifact -->
<rect x="30" y="120" width="150" height="80" rx="8" fill="#eef3fb" stroke="#2b5fb3" stroke-width="1.5"/>
<text x="105" y="150" text-anchor="middle" font-weight="600">Artifact</text>
<text x="105" y="170" text-anchor="middle" fill="#555" font-size="12">coords · license</text>
<text x="105" y="188" text-anchor="middle" fill="#555" font-size="12">provenance</text>
<!-- three checks -->
<rect x="270" y="50" width="230" height="56" rx="8" fill="#eefaf0" stroke="#2f8f4e" stroke-width="1.5"/>
<text x="385" y="73" text-anchor="middle" font-weight="600">vuln match — AdvisoryDb::query</text>
<text x="385" y="92" text-anchor="middle" fill="#555" font-size="12">KEV→Critical · EPSS≥τ→High · VEX drop</text>
<rect x="270" y="132" width="230" height="56" rx="8" fill="#eefaf0" stroke="#2f8f4e" stroke-width="1.5"/>
<text x="385" y="155" text-anchor="middle" font-weight="600">license_finding</text>
<text x="385" y="174" text-anchor="middle" fill="#555" font-size="12">allow/deny/unknown → on_unknown</text>
<rect x="270" y="214" width="230" height="56" rx="8" fill="#eefaf0" stroke="#2f8f4e" stroke-width="1.5"/>
<text x="385" y="237" text-anchor="middle" font-weight="600">provenance_finding</text>
<text x="385" y="256" text-anchor="middle" fill="#555" font-size="12">Ignore / Warn / Require</text>
<!-- decide -->
<rect x="580" y="132" width="120" height="56" rx="8" fill="#fdf2ec" stroke="#c26a2b" stroke-width="1.5"/>
<text x="640" y="157" text-anchor="middle" font-weight="600">decide()</text>
<text x="640" y="176" text-anchor="middle" fill="#555" font-size="12">max severity</text>
<!-- Verdict -->
<rect x="580" y="228" width="120" height="66" rx="8" fill="#f6eefb" stroke="#7a3fb3" stroke-width="1.5"/>
<text x="640" y="256" text-anchor="middle" font-weight="700">Verdict</text>
<text x="640" y="276" text-anchor="middle" fill="#555" font-size="12">Pass/Warn/Block</text>
<path d="M180,150 C210,120 220,90 270,78" fill="none" stroke="#555" stroke-width="1.4" marker-end="url(#a)"/>
<path d="M180,160 L270,160" fill="none" stroke="#555" stroke-width="1.4" marker-end="url(#a)"/>
<path d="M180,170 C210,200 220,230 270,242" fill="none" stroke="#555" stroke-width="1.4" marker-end="url(#a)"/>
<path d="M500,78 C540,100 550,130 580,150" fill="none" stroke="#555" stroke-width="1.4" marker-end="url(#a)"/>
<path d="M500,160 L580,160" fill="none" stroke="#555" stroke-width="1.4" marker-end="url(#a)"/>
<path d="M500,242 C540,220 550,190 580,170" fill="none" stroke="#555" stroke-width="1.4" marker-end="url(#a)"/>
<path d="M640,188 L640,228" fill="none" stroke="#555" stroke-width="1.4" marker-end="url(#a)"/>
<text x="30" y="240" fill="#888" font-size="12">cache key:</text>
<text x="30" y="258" fill="#888" font-size="12">(blob_sha256,</text>
<text x="30" y="274" fill="#888" font-size="12"> policy_version,</text>
<text x="30" y="290" fill="#888" font-size="12"> advisory_db_rev)</text>
</svg>