.nornir/assets/warehouse-write-path.svg
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1180 300" font-family="'DejaVu Sans', 'Segoe UI', sans-serif">
<defs>
<linearGradient id="ww-board" x1="0" y1="0" x2="0" y2="1">
<stop offset="0" stop-color="#0b1c2e"/><stop offset="1" stop-color="#06111d"/>
</linearGradient>
<linearGradient id="ww-chip" x1="0" y1="0" x2="0" y2="1">
<stop offset="0" stop-color="#14384f"/><stop offset="1" stop-color="#0e2a3e"/>
</linearGradient>
<linearGradient id="ww-hot" x1="0" y1="0" x2="1" y2="0">
<stop offset="0" stop-color="#3a1220"/><stop offset="1" stop-color="#2a0d18"/>
</linearGradient>
<marker id="ww-arr" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse">
<path d="M0 0 L10 5 L0 10 z" fill="#6fd3f5"/>
</marker>
</defs>
<rect x="0" y="0" width="1180" height="300" rx="10" fill="url(#ww-board)"/>
<text x="24" y="38" fill="#cfe9f7" font-size="19" font-weight="700">funnel_events — the warehouse WRITE path (one append = one snapshot)</text>
<!-- chips -->
<g font-size="14" fill="#dff2fb" text-anchor="middle">
<rect x="24" y="90" width="150" height="72" rx="9" fill="url(#ww-chip)" stroke="#2f6f92"/>
<text x="99" y="122">Event</text><text x="99" y="142" fill="#8fbdd6" font-size="11">IdeaSubmitted…</text>
<rect x="214" y="90" width="180" height="72" rx="9" fill="url(#ww-chip)" stroke="#2f6f92"/>
<text x="304" y="118">row-encode</text><text x="304" y="138" fill="#8fbdd6" font-size="11">1-row RecordBatch</text><text x="304" y="153" fill="#8fbdd6" font-size="11">per-append builders</text>
<rect x="434" y="90" width="170" height="72" rx="9" fill="url(#ww-chip)" stroke="#2f6f92"/>
<text x="519" y="118">ensure_schema</text><text x="519" y="138" fill="#8fbdd6" font-size="11">every call</text>
<rect x="644" y="90" width="150" height="72" rx="9" fill="url(#ww-chip)" stroke="#2f6f92"/>
<text x="719" y="122">append_batch</text><text x="719" y="142" fill="#8fbdd6" font-size="11">TableIdent alloc</text>
<!-- bottleneck -->
<rect x="834" y="82" width="200" height="88" rx="9" fill="url(#ww-hot)" stroke="#d8607e" stroke-width="2"/>
<text x="934" y="112" fill="#ffd9e2" font-weight="700">Iceberg snapshot</text>
<text x="934" y="132" fill="#ffd9e2">commit (fsync)</text>
<text x="934" y="154" fill="#ff9db4" font-size="12" font-weight="700">≈24.5 ms / append 🔥</text>
<rect x="1054" y="90" width="102" height="72" rx="9" fill="url(#ww-chip)" stroke="#2f6f92"/>
<text x="1105" y="122">table</text><text x="1105" y="142" fill="#8fbdd6" font-size="11">+1 snapshot</text>
</g>
<!-- arrows -->
<g stroke="#6fd3f5" stroke-width="2" fill="none" marker-end="url(#ww-arr)">
<path d="M174 126 H214"/><path d="M394 126 H434"/><path d="M604 126 H644"/><path d="M794 126 H834"/><path d="M1034 126 H1054"/>
</g>
<!-- the win -->
<rect x="214" y="210" width="820" height="58" rx="9" fill="#0e2a1e" stroke="#3f9d6a"/>
<text x="234" y="238" fill="#bff0d2" font-size="14" font-weight="700">THE WIN → batch N events into ONE append</text>
<text x="234" y="257" fill="#8fd6ac" font-size="12">one snapshot + builders sized once → amortizes the ~24.5 ms fsync across the batch (light run: 41 ev/s serial)</text>
<text x="24" y="238" fill="#8fbdd6" font-size="12">serial</text>
<path d="M120 233 H200" stroke="#6fd3f5" stroke-width="2" fill="none" marker-end="url(#ww-arr)"/>
<text x="24" y="255" fill="#8fbdd6" font-size="11">today</text>
</svg>