Your browser sucks, JavaScript disabled! Gunnar's console needs JavaScript and WebAssembly. Git over SSH on port 2222 does not.

nordisk/nornir

.nornir/assets/viz-surfaces.svg

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1180 620" 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="chip" x1="0" y1="0" x2="0" y2="1">
      <stop offset="0" stop-color="#14384f"/><stop offset="1" stop-color="#0e2a3e"/>
    </linearGradient>
    <linearGradient id="rail" x1="0" y1="0" x2="0" y2="1">
      <stop offset="0" stop-color="#173d57"/><stop offset="1" stop-color="#0c2438"/>
    </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>
  </defs>

  <rect x="0" y="0" width="1180" height="620" fill="url(#board)"/>
  <g stroke="#143a52" stroke-width="1"><line x1="0" y1="78" x2="1180" y2="78"/><line x1="0" y1="572" x2="1180" y2="572"/></g>
  <g fill="#16415c"><circle cx="40" cy="40" r="2"/><circle cx="1140" cy="40" r="2"/><circle cx="40" cy="592" r="2"/><circle cx="1140" cy="592" r="2"/></g>

  <text x="40" y="40" fill="#eaf6ff" font-size="22" font-weight="700">the viz surfaces (urdr-threads)</text>
  <text x="40" y="62" fill="#9fc9e0" font-size="15">five release-engineering homes &#183; each emits its full state as machine-readable JSON (the robot-testing law)</text>

  <!-- 🧬 dashboard -->
  <rect x="36" y="108" width="346" height="200" rx="12" fill="url(#chip)" stroke="#5aa6cf" stroke-width="2"/>
  <text x="58" y="138" fill="#eaf6ff" font-size="15" font-weight="700">&#129516; release dashboard</text>
  <text x="58" y="157" fill="#9fc9e0" font-size="10.5">the gate-overlaid dependency graph</text>
  <rect x="56" y="170" width="306" height="58" rx="5" fill="url(#slot)" stroke="#6fd3f5" stroke-width="1.4"/>
  <text x="68" y="188" fill="#ff7a7a" font-size="10.5">&#9940; held &#183; &#10007; edition-fail <tspan fill="#9fc9e0">(RED, blocking)</tspan></text>
  <text x="68" y="204" fill="#ffcf6f" font-size="10.5">&#9660; behind &#183; &#128993; dirty <tspan fill="#9fc9e0">(AMBER, advisory)</tspan> &#183; <tspan fill="#7CFFB2">clean=go</tspan></text>
  <text x="68" y="220" fill="#bfe6ff" font-size="10.5">&#9986; cut edge per cycle (dashed, with rationale)</text>
  <text x="58" y="248" fill="#86b3cc" font-size="10">click a node &#8594; scope the release + light its blast radius</text>
  <text x="58" y="264" fill="#86b3cc" font-size="10">&#128640; Release button GREEN only on a go &#8594; opens the wizard</text>
  <text x="58" y="284" fill="#a9d8ee" font-size="9.5" font-family="'DejaVu Sans Mono', monospace">src/viz/nornir_dashboard.rs</text>

  <!-- 🧙 wizard -->
  <rect x="406" y="108" width="346" height="200" rx="12" fill="url(#chip)" stroke="#5aa6cf" stroke-width="2"/>
  <text x="428" y="138" fill="#eaf6ff" font-size="15" font-weight="700">&#129497; release wizard</text>
  <text x="428" y="157" fill="#9fc9e0" font-size="10.5">a gated four-step walk over the same gate model</text>
  <g font-size="10.5" font-weight="700">
    <rect x="428" y="170" width="74" height="30" rx="6" fill="url(#slot)" stroke="#6fd3f5" stroke-width="1.4"/><text x="465" y="189" fill="#bfe6ff" text-anchor="middle">1 Advise</text>
    <rect x="510" y="170" width="74" height="30" rx="6" fill="url(#slot)" stroke="#6fd3f5" stroke-width="1.4"/><text x="547" y="189" fill="#bfe6ff" text-anchor="middle">2 Fix</text>
    <rect x="592" y="170" width="74" height="30" rx="6" fill="url(#slot)" stroke="#7CFFB2" stroke-width="1.4"/><text x="629" y="189" fill="#bfe6ff" text-anchor="middle">3 Rehearse</text>
    <rect x="674" y="170" width="62" height="30" rx="6" fill="url(#slot)" stroke="#ff7a7a" stroke-width="1.4"/><text x="705" y="189" fill="#ff7a7a" text-anchor="middle">4 Promote</text>
  </g>
  <text x="428" y="224" fill="#86b3cc" font-size="10">can't advance past a red/pending step without arming an</text>
  <text x="428" y="238" fill="#86b3cc" font-size="10">explicit &#9888; override</text>
  <text x="428" y="256" fill="#bfe6ff" font-size="10">Fix surfaces concrete moves (&#128161; bump &#183; cut A&#8594;B &#183; cargo fix)</text>
  <text x="428" y="272" fill="#ff7a7a" font-size="10">Promote: rehearsal GREEN + type the literal PROMOTE</text>
  <text x="428" y="292" fill="#a9d8ee" font-size="9.5" font-family="'DejaVu Sans Mono', monospace">src/viz/release_wizard.rs &#183; pure state machine</text>

  <!-- 🎬 saga -->
  <rect x="776" y="108" width="368" height="200" rx="12" fill="url(#chip)" stroke="#5aa6cf" stroke-width="2"/>
  <text x="798" y="138" fill="#eaf6ff" font-size="15" font-weight="700">&#127916; Saga Sessions</text>
  <text x="798" y="157" fill="#9fc9e0" font-size="10.5">recorded user journeys (under the &#129514; Test tab)</text>
  <rect x="796" y="170" width="328" height="40" rx="5" fill="url(#slot)" stroke="#6fd3f5" stroke-width="1.4"/>
  <text x="810" y="187" fill="#bfe6ff" font-size="10">saga_events: nav/click/log/error/state &#183; keyed by session + SHA</text>
  <text x="810" y="201" fill="#9fc9e0" font-size="9.5">&#9654; Replay &#8594; ReplayPlan (only nav/click become steps)</text>
  <text x="798" y="232" fill="#86b3cc" font-size="10">robot Scenario driven headless &#8594; one matrix row per step</text>
  <text x="798" y="248" fill="#ff7a7a" font-size="10">a target widget that's GONE &#8594; RED matrix row = the UI-regression seam</text>
  <text x="798" y="268" fill="#a9d8ee" font-size="9.5" font-family="'DejaVu Sans Mono', monospace">src/viz/test_tab.rs &#183; engine crates/nornir-saga</text>
  <text x="798" y="290" fill="#7fa8c4" font-size="9.5">aspect robot-ui &#183; end-to-end in tests/saga_roundtrip.rs</text>

  <!-- 📦 holger -->
  <rect x="36" y="328" width="486" height="186" rx="12" fill="url(#chip)" stroke="#5aa6cf" stroke-width="2"/>
  <text x="58" y="358" fill="#eaf6ff" font-size="15" font-weight="700">&#128230; Holger</text>
  <text x="58" y="377" fill="#9fc9e0" font-size="10.5">the married in-process dev pair via holger's functional API (no gRPC/HTTP)</text>
  <g>
    <rect x="56" y="390" width="148" height="44" rx="6" fill="url(#slot)" stroke="#6fd3f5" stroke-width="1.4"/>
    <text x="130" y="408" fill="#bfe6ff" font-size="10.5" text-anchor="middle">/cache</text>
    <text x="130" y="423" fill="#9fc9e0" font-size="9" text-anchor="middle">crates.io mirror</text>
    <rect x="212" y="390" width="148" height="44" rx="6" fill="url(#slot)" stroke="#7CFFB2" stroke-width="1.4"/>
    <text x="286" y="408" fill="#bfe6ff" font-size="10.5" text-anchor="middle">/sparring</text>
    <text x="286" y="423" fill="#9fc9e0" font-size="9" text-anchor="middle">rehearsal registry</text>
    <rect x="368" y="390" width="146" height="44" rx="6" fill="url(#slot)" stroke="#6fd3f5" stroke-width="1.4"/>
    <text x="441" y="408" fill="#bfe6ff" font-size="10.5" text-anchor="middle">/crates-io</text>
    <text x="441" y="423" fill="#9fc9e0" font-size="9" text-anchor="middle">upstream</text>
  </g>
  <text x="58" y="456" fill="#86b3cc" font-size="10">each with its crate/version counts + the recent /sparring publishes</text>
  <text x="58" y="474" fill="#86b3cc" font-size="10">&#9654; bring up /cache + /sparring starts the embedded pair live</text>
  <text x="58" y="496" fill="#a9d8ee" font-size="9.5" font-family="'DejaVu Sans Mono', monospace">src/viz/holger_tab.rs &#183; feature viz + embed-holger</text>

  <!-- 🏛 arch lenses -->
  <rect x="546" y="328" width="598" height="186" rx="12" fill="url(#chip)" stroke="#5aa6cf" stroke-width="2"/>
  <text x="568" y="358" fill="#eaf6ff" font-size="15" font-weight="700">&#127963; Architecture lenses</text>
  <text x="568" y="377" fill="#9fc9e0" font-size="10.5">six lenses over the same scanned codebase (the ArchSubView enum)</text>
  <g font-size="10" text-anchor="middle">
    <rect x="566" y="388" width="178" height="42" rx="6" fill="url(#slot)" stroke="#6fd3f5" stroke-width="1.3"/><text x="655" y="404" fill="#bfe6ff">&#128279; Deps</text><text x="655" y="420" fill="#9fc9e0" font-size="9">cross + intra-repo graph</text>
    <rect x="752" y="388" width="178" height="42" rx="6" fill="url(#slot)" stroke="#6fd3f5" stroke-width="1.3"/><text x="841" y="404" fill="#bfe6ff">&#128225; Live vs &#127963; Wiring</text><text x="841" y="420" fill="#9fc9e0" font-size="9">same board, freshness differs</text>
    <rect x="938" y="388" width="188" height="42" rx="6" fill="url(#slot)" stroke="#6fd3f5" stroke-width="1.3"/><text x="1032" y="404" fill="#bfe6ff">&#128205; H&#229;llpunkter</text><text x="1032" y="420" fill="#9fc9e0" font-size="9">boundary landmark fns</text>
    <rect x="566" y="436" width="178" height="42" rx="6" fill="url(#slot)" stroke="#6fd3f5" stroke-width="1.3"/><text x="655" y="452" fill="#bfe6ff">&#128376; Call Graph</text><text x="655" y="468" fill="#9fc9e0" font-size="9">full caller&#8594;callee</text>
    <rect x="752" y="436" width="374" height="42" rx="6" fill="url(#slot)" stroke="#6fd3f5" stroke-width="1.3"/><text x="939" y="452" fill="#bfe6ff">&#128679; Metro &#8212; a call-PATH map, NOT the call graph</text><text x="939" y="468" fill="#9fc9e0" font-size="9">one subway line per UI button: click &#8594; gRPC handler</text>
  </g>
  <text x="568" y="500" fill="#a9d8ee" font-size="9.5" font-family="'DejaVu Sans Mono', monospace">src/viz/arch_tab.rs &#183; smooth/kinetic scroll, true scroll extent (task #23)</text>

  <!-- ground -->
  <rect x="36" y="534" width="1108" height="22" rx="8" fill="url(#rail)" stroke="#7fc8ea" stroke-width="1.5"/>
  <text x="60" y="549" fill="#bcd9ec" font-size="10.5" font-family="'DejaVu Sans Mono', monospace">$NORNIR_VIZ_STATE &#8212; every pane dumps its block; tests/robot_viz.rs drives real AccessKit clicks and reads them back</text>
</svg>