Gunnar

nordisk/edda

.nornir/assets/build-info-live-tail.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 <tspan fill="#7CFFB2">live-tail</tspan> &#8212; the viz pane tails the &#167;f3 feed per sub-job (&#167;f5 capstone)</text>
  <text x="40" y="64" fill="#9fc9e0" font-size="14.5">subscribe by ticket per <tspan font-family="'DejaVu Sans Mono', monospace" fill="#bfe6ff">step_id</tspan> &#183; pure fold (<tspan font-family="'DejaVu Sans Mono', monospace" fill="#bfe6ff">BuildInfoTail</tspan>) &#183; per-step status transitions + log/metric tail &#183; rendered as <tspan fill="#bfe6ff">state_json</tspan> (robot-testable)</text>

  <g font-size="12.5">
    <line x1="820" y1="60" x2="860" y2="60" stroke="#7CFFB2" stroke-width="3" marker-end="url(#arrg)"/>
    <text x="868" y="64" fill="#cfe6f5">ingest &#183; fold &#183; render</text>
  </g>

  <!-- flight server (source, from slice 5) -->
  <rect x="36" y="150" width="200" height="150" rx="12" fill="url(#root)" stroke="#7fc8ea" stroke-width="2"/>
  <text x="136" y="182" fill="#eaf6ff" font-size="14.5" font-weight="700" text-anchor="middle">FlightServer (edda)</text>
  <text x="136" y="201" fill="#9fc9e0" font-size="10.5" text-anchor="middle">the slice-5 wire</text>
  <rect x="54" y="216" width="164" height="24" rx="5" fill="url(#slot)" stroke="#6fd3f5" stroke-width="1.2"/><text x="136" y="232" fill="#bfe6ff" font-size="8.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">key = build_id/step_id</text>
  <rect x="54" y="246" width="164" height="24" rx="5" fill="url(#slot)" stroke="#7CFFB2" stroke-width="1.2"/><text x="136" y="262" fill="#7CFFB2" font-size="8.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">do_get(ticket)</text>
  <rect x="54" y="276" width="164" height="18" rx="5" fill="url(#slot)" stroke="#6fd3f5" stroke-width="1.1"/><text x="136" y="289" fill="#bfe6ff" font-size="8" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">nornir-service bearer</text>

  <!-- subscribe seam -->
  <line x1="236" y1="225" x2="296" y2="225" stroke="#7CFFB2" stroke-width="2.5" marker-end="url(#arrg)"/>
  <rect x="302" y="176" width="220" height="98" rx="12" fill="url(#chip)" stroke="#7CFFB2" stroke-width="2.5"/>
  <text x="412" y="203" fill="#eaf6ff" font-size="13.5" font-weight="700" text-anchor="middle">subscribe(ticket)</text>
  <text x="412" y="220" fill="#7CFFB2" font-size="10" text-anchor="middle">the consumer seam (tested)</text>
  <rect x="320" y="229" width="184" height="18" rx="5" fill="url(#slot)" stroke="#6fd3f5" stroke-width="1.1"/><text x="412" y="242" fill="#bfe6ff" font-size="8.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">batch_to_rows (arrow-56)</text>
  <rect x="320" y="250" width="184" height="18" rx="5" fill="url(#slot)" stroke="#7CFFB2" stroke-width="1.1"/><text x="412" y="263" fill="#7CFFB2" font-size="8" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">Vec&lt;BuildInfoRow&gt; byte-identical</text>

  <!-- BuildInfoTail: the pure fold -->
  <line x1="522" y1="225" x2="582" y2="225" stroke="#7CFFB2" stroke-width="3" marker-end="url(#arrg)"/>
  <rect x="588" y="150" width="236" height="150" rx="12" fill="url(#root)" stroke="#7CFFB2" stroke-width="2.5"/>
  <text x="706" y="180" fill="#eaf6ff" font-size="14.5" font-weight="700" text-anchor="middle">BuildInfoTail</text>
  <text x="706" y="198" fill="#9fc9e0" font-size="10" text-anchor="middle">pure fold &#183; transport-agnostic</text>
  <rect x="606" y="212" width="200" height="20" rx="5" fill="url(#slot)" stroke="#7CFFB2" stroke-width="1.2"/><text x="706" y="226" fill="#7CFFB2" font-size="8.5" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">ingest(&amp;[BuildInfoRow])</text>
  <rect x="606" y="236" width="200" height="20" rx="5" fill="url(#slot)" stroke="#6fd3f5" stroke-width="1.1"/><text x="706" y="250" fill="#bfe6ff" font-size="8" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">step: status transition (level)</text>
  <rect x="606" y="260" width="200" height="20" rx="5" fill="url(#slot)" stroke="#6fd3f5" stroke-width="1.1"/><text x="706" y="274" fill="#bfe6ff" font-size="8" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">log/metric &#8594; per-step tail grows</text>
  <text x="706" y="293" fill="#9fc9e0" font-size="8.5" text-anchor="middle">manifest rows counted, not tailed</text>

  <!-- state_json + viz pane -->
  <line x1="824" y1="225" x2="884" y2="225" stroke="#6fd3f5" stroke-width="3" marker-end="url(#arr)"/>
  <rect x="890" y="176" width="250" height="98" rx="12" fill="url(#chip)" stroke="#5aa6cf" stroke-width="2"/>
  <text x="1015" y="203" fill="#eaf6ff" font-size="13.5" font-weight="700" text-anchor="middle">&#128225; Live Run pane</text>
  <text x="1015" y="220" fill="#9fc9e0" font-size="10" text-anchor="middle">facett-themed &#183; state_json</text>
  <rect x="908" y="229" width="214" height="18" rx="5" fill="url(#slot)" stroke="#6fd3f5" stroke-width="1.1"/><text x="1015" y="242" fill="#bfe6ff" font-size="8" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">steps[] {status, status_history, tail}</text>
  <rect x="908" y="250" width="214" height="18" rx="5" fill="url(#slot)" stroke="#7CFFB2" stroke-width="1.1"/><text x="1015" y="263" fill="#7CFFB2" font-size="8" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">status chip + tail (robot-asserted)</text>

  <!-- inject path (test) -->
  <line x1="412" y1="274" x2="600" y2="212" stroke="#e4aa46" stroke-width="1.6" stroke-dasharray="5 4" marker-end="url(#arr)"/>
  <rect x="302" y="330" width="220" height="60" rx="10" fill="url(#chip)" stroke="#e4aa46" stroke-width="1.6"/>
  <text x="412" y="354" fill="#eaf6ff" font-size="12" font-weight="700" text-anchor="middle">inject_for_test(rows)</text>
  <text x="412" y="372" fill="#9fc9e0" font-size="9" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">same fold, no server &#8594; tail grows</text>
  <line x1="412" y1="330" x2="412" y2="298" stroke="#e4aa46" stroke-width="1.6" stroke-dasharray="5 4" marker-end="url(#arr)"/>

  <!-- deferred note -->
  <rect x="588" y="330" width="552" height="60" rx="10" fill="url(#slot)" stroke="#7fc8ea" stroke-width="1.4"/>
  <text x="606" y="352" fill="#bcd9ec" font-size="11">DEFERRED (logged): continuous auto-refresh &#8212; a timer that re-<tspan font-family="'DejaVu Sans Mono', monospace" fill="#bfe6ff">pull</tspan>s the ticket while the pane is open,</text>
  <text x="606" y="371" fill="#bcd9ec" font-size="11">like bench-live's warehouse re-read. This pass ships subscribe &#8594; fold &#8594; render &#8594; assert.</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: build::flight_sink::subscribe = the ONE consumer seam &#183; facett palette + status_chip = the ONE themeable widget set &#183; state_json = the ONE robot-test contract. Additive: the pane is viz-gated; the live pull is build-info-flight-gated.</text>
</svg>