nordisk/edda
.nornir/assets/build-info-flight-sink.svg
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1180 560" 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="root" x1="0" y1="0" x2="0" y2="1">
<stop offset="0" stop-color="#173d57"/><stop offset="1" stop-color="#0c2438"/>
</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="slot" x1="0" y1="0" x2="0" y2="1">
<stop offset="0" stop-color="#123448"/><stop offset="1" stop-color="#0a2032"/>
</linearGradient>
<marker id="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>
<marker id="arrg" 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="#7CFFB2"/>
</marker>
</defs>
<rect x="0" y="0" width="1180" height="560" fill="url(#board)"/>
<g stroke="#143a52" stroke-width="1"><line x1="0" y1="82" x2="1180" y2="82"/><line x1="0" y1="516" x2="1180" y2="516"/></g>
<text x="40" y="42" fill="#eaf6ff" font-size="22" font-weight="700">build-info stream — one <tspan fill="#7CFFB2">BuildInfoSink</tspan> trait, two transports (§f1/§f2/§f5)</text>
<text x="40" y="64" fill="#9fc9e0" font-size="14.5">emitter deals only in <tspan font-family="'DejaVu Sans Mono', monospace" fill="#bfe6ff">BuildInfoRow</tspan>s · transport picked by deployment · wire = <tspan fill="#bfe6ff">Arrow Flight</tspan> (edda/nornir-flight) · auth = nornir-service bearer</text>
<g font-size="12.5">
<line x1="800" y1="60" x2="840" y2="60" stroke="#6fd3f5" stroke-width="3" marker-end="url(#arr)"/>
<text x="848" y="64" fill="#cfe6f5">RecordBatch / do_put · do_get</text>
</g>
<!-- producer: build-thing emitter -->
<rect x="36" y="150" width="196" height="150" rx="12" fill="url(#root)" stroke="#7CFFB2" stroke-width="2.5"/>
<text x="134" y="182" fill="#eaf6ff" font-size="14.5" font-weight="700" text-anchor="middle">build-thing emitter</text>
<text x="134" y="201" fill="#9fc9e0" font-size="10.5" text-anchor="middle">manifest + live feed</text>
<rect x="54" y="216" width="160" height="24" rx="5" fill="url(#slot)" stroke="#6fd3f5" stroke-width="1.2"/><text x="134" y="232" fill="#bfe6ff" font-size="9" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">manifest_rows()</text>
<rect x="54" y="246" width="160" height="24" rx="5" fill="url(#slot)" stroke="#6fd3f5" stroke-width="1.2"/><text x="134" y="262" fill="#bfe6ff" font-size="9" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">build_feed_rows()</text>
<rect x="54" y="276" width="160" height="18" rx="5" fill="url(#slot)" stroke="#7CFFB2" stroke-width="1.2"/><text x="134" y="289" fill="#7CFFB2" font-size="8.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">sink.emit(&[row])</text>
<line x1="232" y1="225" x2="292" y2="200" stroke="#6fd3f5" stroke-width="2.5" marker-end="url(#arr)"/>
<line x1="232" y1="225" x2="292" y2="330" stroke="#6fd3f5" stroke-width="2.5" marker-end="url(#arr)"/>
<!-- sink A: in-process default -->
<rect x="298" y="160" width="220" height="86" rx="12" fill="url(#chip)" stroke="#5aa6cf" stroke-width="2"/>
<text x="408" y="188" fill="#eaf6ff" font-size="13.5" font-weight="700" text-anchor="middle">InMemBuildInfoSink</text>
<text x="408" y="206" fill="#9fc9e0" font-size="10" text-anchor="middle">in-process (DEFAULT)</text>
<rect x="316" y="214" width="184" height="20" rx="5" fill="url(#slot)" stroke="#6fd3f5" stroke-width="1.1"/><text x="408" y="228" fill="#bfe6ff" font-size="8.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">single box · zero transport tax</text>
<!-- sink B: flight remote -->
<rect x="298" y="290" width="220" height="96" rx="12" fill="url(#chip)" stroke="#7CFFB2" stroke-width="2.5"/>
<text x="408" y="316" fill="#eaf6ff" font-size="13.5" font-weight="700" text-anchor="middle">FlightBuildInfoSink</text>
<text x="408" y="333" fill="#7CFFB2" font-size="10" text-anchor="middle">Flight (REMOTE) — slice 5</text>
<rect x="316" y="342" width="184" height="18" rx="5" fill="url(#slot)" stroke="#6fd3f5" stroke-width="1.1"/><text x="408" y="355" fill="#bfe6ff" font-size="8.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">rows_to_batch (arrow-56)</text>
<rect x="316" y="363" width="184" height="18" rx="5" fill="url(#slot)" stroke="#6fd3f5" stroke-width="1.1"/><text x="408" y="376" fill="#bfe6ff" font-size="8.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">conn.put(key, batch)</text>
<line x1="518" y1="338" x2="578" y2="338" stroke="#6fd3f5" stroke-width="3" marker-end="url(#arr)"/>
<!-- flight server -->
<rect x="584" y="290" width="220" height="96" rx="12" fill="url(#root)" stroke="#7CFFB2" stroke-width="2.5"/>
<text x="694" y="316" fill="#eaf6ff" font-size="13.5" font-weight="700" text-anchor="middle">FlightServer (edda)</text>
<text x="694" y="333" fill="#9fc9e0" font-size="10" text-anchor="middle">MemFlightStore · do_put/get</text>
<rect x="602" y="342" width="184" height="18" rx="5" fill="url(#slot)" stroke="#7CFFB2" stroke-width="1.1"/><text x="694" y="355" fill="#7CFFB2" font-size="8.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">nornir-service bearer auth</text>
<rect x="602" y="363" width="184" height="18" rx="5" fill="url(#slot)" stroke="#6fd3f5" stroke-width="1.1"/><text x="694" y="376" fill="#bfe6ff" font-size="8.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">key = build_id[/step_id]</text>
<line x1="804" y1="338" x2="864" y2="338" stroke="#6fd3f5" stroke-width="3" marker-end="url(#arr)"/>
<!-- consumer: subscribe per step_id -->
<rect x="870" y="290" width="270" height="96" rx="12" fill="url(#chip)" stroke="#5aa6cf" stroke-width="2"/>
<text x="1005" y="316" fill="#eaf6ff" font-size="13.5" font-weight="700" text-anchor="middle">consumer: subscribe(ticket)</text>
<text x="1005" y="333" fill="#9fc9e0" font-size="10" text-anchor="middle">viz bench-live / jobview live-tail</text>
<rect x="888" y="342" width="234" height="18" rx="5" fill="url(#slot)" stroke="#6fd3f5" stroke-width="1.1"/><text x="1005" y="355" fill="#bfe6ff" font-size="8.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">do_get(build_id/step_id) → batch_to_rows</text>
<rect x="888" y="363" width="234" height="18" rx="5" fill="url(#slot)" stroke="#7CFFB2" stroke-width="1.1"/><text x="1005" y="376" fill="#7CFFB2" font-size="8.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">rows byte-identical to emitted</text>
<!-- in-process default sink also feeds warehouse/seal (context) -->
<line x1="518" y1="203" x2="694" y2="203" stroke="#6fd3f5" stroke-width="2.5" marker-end="url(#arr)"/>
<rect x="700" y="176" width="300" height="54" rx="10" fill="url(#chip)" stroke="#7fc8ea" stroke-width="1.6"/>
<text x="850" y="198" fill="#eaf6ff" font-size="12" font-weight="700" text-anchor="middle">at rest (slices 3–4): same schema</text>
<text x="850" y="216" fill="#9fc9e0" font-size="9.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">warehouse build_info · .build-info.znippy seal</text>
<!-- ground -->
<rect x="36" y="466" width="1104" height="38" rx="10" fill="url(#chip)" stroke="#7fc8ea" stroke-width="2"/>
<text x="58" y="490" fill="#bcd9ec" font-size="11">Reuse, don't re-roll: edda/nornir-flight = the ONE Arrow Flight transport (raw do_put/do_get) · nornir-service = the ONE bearer-auth interceptor · build-thing = the ONE BuildInfoRow/§f3 schema. In-process default unchanged (additive).</text>
</svg>