Gunnar

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 &#8212; one <tspan fill="#7CFFB2">BuildInfoSink</tspan> trait, two transports (&#167;f1/&#167;f2/&#167;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 &#183; transport picked by deployment &#183; wire = <tspan fill="#bfe6ff">Arrow Flight</tspan> (edda/nornir-flight) &#183; 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 &#183; 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(&amp;[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 &#183; 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) &#8212; 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 &#183; 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) &#8594; 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&#8211;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 &#183; .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) &#183; nornir-service = the ONE bearer-auth interceptor &#183; build-thing = the ONE BuildInfoRow/§f3 schema. In-process default unchanged (additive).</text>
</svg>