.nornir/assets/osm-katana-path-matrix.svg
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1300 760" 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>
<linearGradient id="rail" x1="0" y1="0" x2="0" y2="1">
<stop offset="0" stop-color="#173d57"/><stop offset="1" stop-color="#0c2438"/>
</linearGradient>
<linearGradient id="slot" x1="0" y1="0" x2="0" y2="1">
<stop offset="0" stop-color="#123448"/><stop offset="1" stop-color="#0a2032"/>
</linearGradient>
<linearGradient id="hot" x1="0" y1="0" x2="1" y2="0">
<stop offset="0" stop-color="#1d6f4f"/><stop offset="1" stop-color="#27a36f"/>
</linearGradient>
<marker id="arrow" markerWidth="9" markerHeight="9" refX="7" refY="3" orient="auto">
<path d="M0,0 L7,3 L0,6 Z" fill="#6fd3f5"/>
</marker>
<marker id="arrowd" markerWidth="9" markerHeight="9" refX="7" refY="3" orient="auto">
<path d="M0,0 L7,3 L0,6 Z" fill="#7fb0cc"/>
</marker>
</defs>
<rect x="0" y="0" width="1300" height="760" fill="url(#board)"/>
<g stroke="#143a52" stroke-width="1"><line x1="0" y1="78" x2="1300" y2="78"/><line x1="0" y1="586" x2="1300" y2="586"/></g>
<g fill="#16415c"><circle cx="40" cy="40" r="2"/><circle cx="1260" cy="40" r="2"/><circle cx="40" cy="732" r="2"/><circle cx="1260" cy="732" r="2"/></g>
<!-- title -->
<text x="40" y="40" fill="#eaf6ff" font-size="22" font-weight="700">osm-katana</text>
<text x="172" y="40" fill="#9fc9e0" font-size="14">planet OSM → every supported path, <tspan fill="#bfe6ff" font-weight="700">left → right</tspan>, each permutation <tspan fill="#7be3ad" font-weight="700">100% saturated</tspan></text>
<g font-size="12">
<line x1="40" y1="60" x2="78" y2="60" stroke="#6fd3f5" stroke-width="3" marker-end="url(#arrow)"/>
<text x="86" y="64" fill="#cfe6f5">convert path</text>
<line x1="210" y1="60" x2="248" y2="60" stroke="#7fb0cc" stroke-width="2.5" stroke-dasharray="5 4" marker-end="url(#arrowd)"/>
<text x="256" y="64" fill="#cfe6f5">optional ± clip dimension</text>
<rect x="470" y="52" width="30" height="13" rx="3" fill="url(#hot)"/>
<text x="508" y="64" fill="#cfe6f5">flat-100% cores (1-32-32-32-1)</text>
</g>
<!-- column captions -->
<g fill="#5f93b0" font-size="11" font-weight="700" text-anchor="middle">
<text x="134" y="104">SOURCE</text><text x="395" y="104">DECOMPRESS</text>
<text x="650" y="104">INTERMEDIATE</text><text x="920" y="104">RESOLVE</text><text x="1170" y="104">OUTPUT</text>
</g>
<!-- ===== europe-clip dimension (top, dashed) ===== -->
<rect x="540" y="120" width="320" height="52" rx="9" fill="url(#slot)" stroke="#7fb0cc" stroke-width="1.6" stroke-dasharray="6 4"/>
<text x="700" y="142" fill="#cfe6f5" font-size="12.5" text-anchor="middle" font-weight="700">osmium / osmconvert — europe clip</text>
<text x="700" y="160" fill="#9fc9e0" font-size="10.5" text-anchor="middle">osm-katana converts, never clips · ±clip = rerun the whole matrix</text>
<!-- ===== SOURCE ===== -->
<rect x="44" y="250" width="180" height="92" rx="10" fill="url(#chip)" stroke="#5aa6cf" stroke-width="2"/>
<text x="134" y="284" fill="#eaf6ff" font-size="12.5" text-anchor="middle" font-weight="700">planet-260427.osm.bz2</text>
<text x="134" y="304" fill="#bfe6ff" font-size="10.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">173 GB</text>
<text x="134" y="322" fill="#86b3cc" font-size="10" text-anchor="middle">bz2-packed planet XML</text>
<rect x="44" y="470" width="180" height="64" rx="10" fill="url(#chip)" stroke="#5aa6cf" stroke-width="2"/>
<text x="134" y="498" fill="#eaf6ff" font-size="12.5" text-anchor="middle" font-weight="700">*.osm.gz</text>
<text x="134" y="517" fill="#86b3cc" font-size="10" text-anchor="middle">gz path (region)</text>
<!-- ===== DECOMPRESS ===== -->
<rect x="305" y="200" width="180" height="74" rx="10" fill="url(#chip)" stroke="#5aa6cf" stroke-width="2"/>
<text x="395" y="228" fill="#eaf6ff" font-size="12.5" text-anchor="middle" font-weight="700">znippy lbzip2 -d</text>
<text x="395" y="246" fill="#7be3ad" font-size="10" text-anchor="middle">parallel bzip2 · 100%</text>
<text x="395" y="263" fill="#86b3cc" font-size="9.5" text-anchor="middle">znippy CLI, not system bzip2</text>
<rect x="305" y="300" width="180" height="64" rx="10" fill="url(#slot)" stroke="#6fd3f5" stroke-width="1.5"/>
<text x="395" y="327" fill="#bfe6ff" font-size="11.5" text-anchor="middle" font-weight="700" font-family="'DejaVu Sans Mono', monospace">planet.osm</text>
<text x="395" y="345" fill="#86b3cc" font-size="9.5" text-anchor="middle">~1.8 TB raw XML · VTD parse</text>
<!-- ===== INTERMEDIATE (xml2pbf -> pbf) ===== -->
<rect x="560" y="220" width="180" height="70" rx="10" fill="url(#chip)" stroke="#5aa6cf" stroke-width="2"/>
<text x="650" y="248" fill="#eaf6ff" font-size="13" text-anchor="middle" font-weight="700">xml2pbf</text>
<text x="650" y="267" fill="#7be3ad" font-size="10" text-anchor="middle">VTD + encode · 100%</text>
<rect x="560" y="320" width="180" height="58" rx="10" fill="url(#slot)" stroke="#6fd3f5" stroke-width="1.5"/>
<text x="650" y="346" fill="#bfe6ff" font-size="11.5" text-anchor="middle" font-weight="700" font-family="'DejaVu Sans Mono', monospace">planet.pbf</text>
<text x="650" y="363" fill="#86b3cc" font-size="9.5" text-anchor="middle">zstd-PBF intermediate</text>
<!-- ===== RESOLVE ===== -->
<rect x="800" y="222" width="230" height="180" rx="12" fill="url(#chip)" stroke="#7fc8ea" stroke-width="2.4"/>
<text x="915" y="248" fill="#eaf6ff" font-size="13.5" text-anchor="middle" font-weight="700">pbf2geo / convert</text>
<text x="915" y="266" fill="#9fc9e0" font-size="10" text-anchor="middle">2-pass resolved geometry</text>
<g font-family="'DejaVu Sans Mono', monospace" font-size="9.5" fill="#bfe6ff">
<rect x="818" y="278" width="194" height="20" rx="4" fill="url(#slot)"/><text x="915" y="292" text-anchor="middle">Gatling 1-32-32-32-1 (no-barrier)</text>
<rect x="818" y="302" width="194" height="20" rx="4" fill="url(#slot)"/><text x="915" y="316" text-anchor="middle">Ragnar lookup_batch::<16> (MLP)</text>
<rect x="818" y="326" width="194" height="20" rx="4" fill="url(#slot)"/><text x="915" y="340" text-anchor="middle">streaming k-way sort ~13 GB</text>
<rect x="818" y="350" width="194" height="20" rx="4" fill="url(#slot)"/><text x="915" y="364" text-anchor="middle">zero-copy · rayon-free</text>
</g>
<rect x="818" y="376" width="194" height="16" rx="4" fill="url(#hot)"/>
<text x="915" y="388" fill="#eafff5" font-size="9.5" text-anchor="middle" font-weight="700">32 / 32 cores</text>
<!-- ===== OUTPUT ===== -->
<rect x="1062" y="240" width="190" height="70" rx="10" fill="url(#chip)" stroke="#5aa6cf" stroke-width="2"/>
<text x="1157" y="268" fill="#eaf6ff" font-size="13" text-anchor="middle" font-weight="700">GeoParquet</text>
<text x="1157" y="287" fill="#86b3cc" font-size="10" text-anchor="middle">nodes / ways / relations · WKB</text>
<rect x="1062" y="330" width="190" height="58" rx="10" fill="url(#slot)" stroke="#6fd3f5" stroke-width="1.5"/>
<text x="1157" y="356" fill="#bfe6ff" font-size="12" text-anchor="middle" font-weight="700">geo2arrow</text>
<text x="1157" y="374" fill="#86b3cc" font-size="9.5" text-anchor="middle">→ Arrow IPC</text>
<!-- ===== connectors (permutations) ===== -->
<g fill="none" stroke="#6fd3f5" stroke-width="2.2">
<!-- source -> decompress -->
<path d="M224,290 C260,290 268,237 305,237" marker-end="url(#arrow)"/>
<!-- decompress -> raw osm -->
<path d="M395,274 L395,300" marker-end="url(#arrow)"/>
<!-- source -> xml2pbf (bz2 in) -->
<path d="M224,300 C420,300 430,255 560,255" marker-end="url(#arrow)"/>
<!-- raw osm -> xml2pbf -->
<path d="M485,330 C520,330 525,278 560,272" marker-end="url(#arrow)"/>
<!-- xml2pbf -> pbf -->
<path d="M650,290 L650,320" marker-end="url(#arrow)"/>
<!-- pbf -> resolve -->
<path d="M740,348 C772,348 775,330 800,322" marker-end="url(#arrow)"/>
<!-- source bz2 -> resolve DIRECT (convert) -->
<path d="M224,330 C420,470 640,452 800,392" marker-end="url(#arrow)"/>
<!-- raw osm -> resolve DIRECT (convert) -->
<path d="M485,345 C620,420 700,400 800,372" marker-end="url(#arrow)"/>
<!-- gz -> resolve -->
<path d="M224,500 C520,520 700,470 800,400" marker-end="url(#arrow)"/>
<!-- resolve -> geo -->
<path d="M1030,285 C1046,280 1048,275 1062,275" marker-end="url(#arrow)"/>
<!-- geo -> arrow -->
<path d="M1157,310 L1157,330" marker-end="url(#arrow)"/>
</g>
<!-- clip dimension dashed feed -->
<g fill="none" stroke="#7fb0cc" stroke-width="2" stroke-dasharray="6 4">
<path d="M540,150 C360,150 300,176 224,255" marker-end="url(#arrowd)"/>
</g>
<!-- edge labels -->
<g font-size="9.5" font-family="'DejaVu Sans Mono', monospace" fill="#7be3ad">
<text x="250" y="252">lbzip2 -d</text>
<text x="300" y="244" fill="#a9d8ee">bz2 → pbf</text>
<text x="386" y="466" fill="#a9d8ee">bz2 → geo (direct)</text>
<text x="560" y="408" fill="#a9d8ee">osm → geo (direct)</text>
<text x="250" y="494" fill="#a9d8ee">gz → geo</text>
<text x="744" y="332" fill="#a9d8ee">pbf2geo</text>
</g>
<!-- ===== ENGINE RAIL ===== -->
<rect x="44" y="608" width="1208" height="118" rx="12" fill="url(#rail)" stroke="#3c6a86" stroke-width="1.5"/>
<text x="64" y="634" fill="#eaf6ff" font-size="13" font-weight="700">GATLING engine</text>
<text x="170" y="634" fill="#9fc9e0" font-size="11">one reader pre-reads 4–8 slots · 32 workers carry each unit through all stages, self-dispatch · one writer drains in order — never waits for all</text>
<!-- 1-32-32-32-1 mini -->
<g>
<rect x="64" y="650" width="60" height="58" rx="6" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.4"/>
<text x="94" y="676" fill="#bfe6ff" font-size="11" text-anchor="middle" font-weight="700">1</text>
<text x="94" y="694" fill="#86b3cc" font-size="8.5" text-anchor="middle">reader</text>
<g>
<rect x="150" y="646" width="240" height="66" rx="6" fill="url(#slot)" stroke="#7fc8ea" stroke-width="1.4"/>
<text x="270" y="640" fill="#7be3ad" font-size="9.5" text-anchor="middle">32 → 32 → 32 (decode · VTD · encode, no barrier)</text>
</g>
<g fill="url(#hot)">
<rect x="158" y="654" width="13" height="50" rx="2"/><rect x="175" y="654" width="13" height="50" rx="2"/>
<rect x="192" y="654" width="13" height="50" rx="2"/><rect x="209" y="654" width="13" height="50" rx="2"/>
<rect x="226" y="654" width="13" height="50" rx="2"/><rect x="243" y="654" width="13" height="50" rx="2"/>
<rect x="260" y="654" width="13" height="50" rx="2"/><rect x="277" y="654" width="13" height="50" rx="2"/>
<rect x="294" y="654" width="13" height="50" rx="2"/><rect x="311" y="654" width="13" height="50" rx="2"/>
<rect x="328" y="654" width="13" height="50" rx="2"/><rect x="345" y="654" width="13" height="50" rx="2"/>
<rect x="362" y="654" width="13" height="50" rx="2"/>
</g>
<rect x="416" y="650" width="60" height="58" rx="6" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.4"/>
<text x="446" y="676" fill="#bfe6ff" font-size="11" text-anchor="middle" font-weight="700">1</text>
<text x="446" y="694" fill="#86b3cc" font-size="8.5" text-anchor="middle">writer</text>
<g fill="none" stroke="#6fd3f5" stroke-width="2">
<path d="M124,679 L150,679" marker-end="url(#arrow)"/>
<path d="M390,679 L416,679" marker-end="url(#arrow)"/>
</g>
</g>
<!-- ordered-bench note -->
<g font-size="10.5">
<text x="520" y="660" fill="#cfe6f5" font-weight="700">register_bench_ordered!(n, …)</text>
<text x="520" y="678" fill="#9fc9e0">stages run strictly in order, never in parallel —</text>
<text x="520" y="694" fill="#9fc9e0">each feeds the next; downstream skips if upstream fails.</text>
<text x="820" y="660" fill="#cfe6f5" font-weight="700">source: /run/media/.../planet-260427.osm.bz2</text>
<text x="820" y="678" fill="#9fc9e0">every lane above is one ordered permutation,</text>
<text x="820" y="694" fill="#7be3ad">all proven flat-100% before the run is green.</text>
</g>
</svg>