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> — the viz pane tails the §f3 feed per sub-job (§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> · pure fold (<tspan font-family="'DejaVu Sans Mono', monospace" fill="#bfe6ff">BuildInfoTail</tspan>) · per-step status transitions + log/metric tail · 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 · fold · 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<BuildInfoRow> 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 · 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(&[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 → 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">📡 Live Run pane</text>
<text x="1015" y="220" fill="#9fc9e0" font-size="10" text-anchor="middle">facett-themed · 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 → 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 — 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 → fold → render → 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 · facett palette + status_chip = the ONE themeable widget set · state_json = the ONE robot-test contract. Additive: the pane is viz-gated; the live pull is build-info-flight-gated.</text>
</svg>