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

nordisk/nornir

.nornir/assets/function-map.svg

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1180 660" 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="verb" x1="0" y1="0" x2="0" y2="1">
      <stop offset="0" stop-color="#14384f"/><stop offset="1" stop-color="#0e2a3e"/>
    </linearGradient>
    <linearGradient id="surf" x1="0" y1="0" x2="0" y2="1">
      <stop offset="0" stop-color="#173d57"/><stop offset="1" stop-color="#0c2438"/>
    </linearGradient>
    <linearGradient id="ware" x1="0" y1="0" x2="0" y2="1">
      <stop offset="0" stop-color="#123448"/><stop offset="1" stop-color="#0a2032"/>
    </linearGradient>
    <marker id="use" 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>
    <marker id="reach" 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="660" fill="url(#board)"/>
  <g stroke="#143a52" stroke-width="1"><line x1="0" y1="86" x2="1180" y2="86"/><line x1="0" y1="612" x2="1180" y2="612"/></g>

  <text x="40" y="42" fill="#eaf6ff" font-size="22" font-weight="700">nornir as one system &#8212; the function map (f0)</text>
  <text x="40" y="66" fill="#9fc9e0" font-size="14.5">peer verb-functions over one warehouse substrate, reached through a few surfaces &#183; an edge is <tspan fill="#7CFFB2" font-weight="700">uses</tspan>, never nesting</text>

  <g font-size="12.5">
    <line x1="762" y1="60" x2="802" y2="60" stroke="#7CFFB2" stroke-width="3" marker-end="url(#use)"/>
    <text x="810" y="64" fill="#cfe6f5">reads / writes warehouse</text>
    <line x1="990" y1="60" x2="1030" y2="60" stroke="#6fd3f5" stroke-width="3" marker-end="url(#reach)"/>
    <text x="1038" y="64" fill="#cfe6f5">reached via surface</text>
  </g>

  <!-- ===== surfaces band ===== -->
  <text x="40" y="122" fill="#86b3cc" font-size="12" font-weight="700">SURFACES &#8212; how a function is reached (not functions)</text>
  <g font-size="13" font-weight="700">
    <rect x="40"  y="132" width="150" height="46" rx="10" fill="url(#surf)" stroke="#5aa6cf" stroke-width="1.8"/><text x="115"  y="152" fill="#eaf6ff" text-anchor="middle">CLI</text><text x="115"  y="169" fill="#9fc9e0" font-size="9.5" font-weight="400" text-anchor="middle">bin/nornir.rs</text>
    <rect x="212" y="132" width="150" height="46" rx="10" fill="url(#surf)" stroke="#5aa6cf" stroke-width="1.8"/><text x="287"  y="152" fill="#eaf6ff" text-anchor="middle">viz</text><text x="287"  y="169" fill="#9fc9e0" font-size="9.5" font-weight="400" text-anchor="middle">egui &#183; urdr-threads</text>
    <rect x="384" y="132" width="150" height="46" rx="10" fill="url(#surf)" stroke="#5aa6cf" stroke-width="1.8"/><text x="459"  y="152" fill="#eaf6ff" text-anchor="middle">serve</text><text x="459"  y="169" fill="#9fc9e0" font-size="9.5" font-weight="400" text-anchor="middle">gRPC + MCP</text>
    <rect x="556" y="132" width="150" height="46" rx="10" fill="url(#surf)" stroke="#5aa6cf" stroke-width="1.8"/><text x="631"  y="152" fill="#eaf6ff" text-anchor="middle">key</text><text x="631"  y="169" fill="#9fc9e0" font-size="9.5" font-weight="400" text-anchor="middle">identity</text>
  </g>

  <!-- ===== verb-functions band ===== -->
  <text x="40" y="222" fill="#86b3cc" font-size="12" font-weight="700">VERB-FUNCTIONS &#8212; peers; one <tspan font-family="'DejaVu Sans Mono', monospace">##</tspan> chapter each</text>
  <g font-size="13" font-weight="700" font-family="'DejaVu Sans Mono', monospace">
    <rect x="40"   y="234" width="150" height="54" rx="10" fill="url(#verb)" stroke="#7CFFB2" stroke-width="2"/><text x="115"  y="258" fill="#eaf6ff" text-anchor="middle" font-size="13.5">workspace</text><text x="115"  y="276" fill="#9fc9e0" font-size="9" font-weight="400" text-anchor="middle">span N crates as one</text>
    <rect x="212"  y="234" width="150" height="54" rx="10" fill="url(#verb)" stroke="#7CFFB2" stroke-width="2"/><text x="287"  y="258" fill="#eaf6ff" text-anchor="middle" font-size="13.5">docbook</text><text x="287"  y="276" fill="#9fc9e0" font-size="9" font-weight="400" text-anchor="middle">.nornir/ &#8594; the books</text>
    <rect x="384"  y="234" width="150" height="54" rx="10" fill="url(#verb)" stroke="#7CFFB2" stroke-width="2"/><text x="459"  y="258" fill="#eaf6ff" text-anchor="middle" font-size="13.5">release</text><text x="459"  y="276" fill="#9fc9e0" font-size="9" font-weight="400" text-anchor="middle">advise&#8594;rehearse&#8594;promote</text>
    <rect x="556"  y="234" width="150" height="54" rx="10" fill="url(#verb)" stroke="#7CFFB2" stroke-width="2"/><text x="631"  y="258" fill="#eaf6ff" text-anchor="middle" font-size="13.5">test</text><text x="631"  y="276" fill="#9fc9e0" font-size="9" font-weight="400" text-anchor="middle">&#8835; bench&#183;cov&#183;robot&#183;saga</text>
    <rect x="728"  y="234" width="150" height="54" rx="10" fill="url(#verb)" stroke="#7CFFB2" stroke-width="2"/><text x="803"  y="258" fill="#eaf6ff" text-anchor="middle" font-size="13.5">build</text><text x="803"  y="276" fill="#9fc9e0" font-size="9" font-weight="400" text-anchor="middle">variants + provenance</text>
    <rect x="900"  y="234" width="150" height="54" rx="10" fill="url(#verb)" stroke="#7CFFB2" stroke-width="2"/><text x="975"  y="258" fill="#eaf6ff" text-anchor="middle" font-size="13.5">jobs</text><text x="975"  y="276" fill="#9fc9e0" font-size="9" font-weight="400" text-anchor="middle">single-writer ledger</text>

    <rect x="40"   y="300" width="150" height="54" rx="10" fill="url(#verb)" stroke="#7CFFB2" stroke-width="2"/><text x="115"  y="324" fill="#eaf6ff" text-anchor="middle" font-size="13.5">funnel</text><text x="115"  y="342" fill="#9fc9e0" font-size="9" font-weight="400" text-anchor="middle">intake&#8594;decompose&#8594;cards</text>
    <rect x="212"  y="300" width="150" height="54" rx="10" fill="url(#verb)" stroke="#7CFFB2" stroke-width="2"/><text x="287"  y="324" fill="#eaf6ff" text-anchor="middle" font-size="13.5">security</text><text x="287"  y="342" fill="#9fc9e0" font-size="9" font-weight="400" text-anchor="middle">modgunn scanner</text>
    <rect x="384"  y="300" width="150" height="54" rx="10" fill="url(#verb)" stroke="#7CFFB2" stroke-width="2"/><text x="459"  y="324" fill="#eaf6ff" text-anchor="middle" font-size="13.5">bakeoff</text><text x="459"  y="342" fill="#9fc9e0" font-size="9" font-weight="400" text-anchor="middle">judged comparison</text>
    <rect x="556"  y="300" width="150" height="54" rx="10" fill="url(#verb)" stroke="#7CFFB2" stroke-width="2"/><text x="631"  y="324" fill="#eaf6ff" text-anchor="middle" font-size="13.5">airgap</text><text x="631"  y="342" fill="#9fc9e0" font-size="9" font-weight="400" text-anchor="middle">offline / sealed import</text>
  </g>

  <!-- uses edges verb -> warehouse -->
  <g stroke="#7CFFB2" stroke-width="2" fill="none" opacity="0.8">
    <path d="M115 354 V430" marker-end="url(#use)"/>
    <path d="M287 354 V430" marker-end="url(#use)"/>
    <path d="M459 354 V430" marker-end="url(#use)"/>
    <path d="M631 354 V430" marker-end="url(#use)"/>
    <path d="M803 288 C803 360 803 380 760 430" marker-end="url(#use)"/>
    <path d="M975 288 C975 360 975 390 900 430" marker-end="url(#use)"/>
  </g>
  <!-- reach edges surface -> verbs (CLI feeds all) -->
  <g stroke="#6fd3f5" stroke-width="1.6" fill="none" opacity="0.55" stroke-dasharray="4 3">
    <path d="M115 178 V234"/>
  </g>

  <!-- ===== warehouse substrate ===== -->
  <text x="40" y="424" fill="#86b3cc" font-size="12" font-weight="700">SUBSTRATE</text>
  <rect x="40" y="436" width="1010" height="120" rx="14" fill="url(#ware)" stroke="#7fc8ea" stroke-width="2.5"/>
  <text x="545" y="466" fill="#eaf6ff" font-size="16" font-weight="700" text-anchor="middle" font-family="'DejaVu Sans Mono', monospace">warehouse</text>
  <text x="545" y="486" fill="#9fc9e0" font-size="11" text-anchor="middle">one append-only Iceberg store, keyed by git SHA &#8212; every function reads/writes here (via skade)</text>
  <g font-size="11" font-family="'DejaVu Sans Mono', monospace">
    <rect x="64"  y="504" width="120" height="34" rx="6" fill="url(#verb)" stroke="#6fd3f5" stroke-width="1.2"/><text x="124"  y="525" fill="#bfe6ff" text-anchor="middle">vector</text>
    <rect x="196" y="504" width="120" height="34" rx="6" fill="url(#verb)" stroke="#6fd3f5" stroke-width="1.2"/><text x="256"  y="525" fill="#bfe6ff" text-anchor="middle">knowledge</text>
    <rect x="328" y="504" width="120" height="34" rx="6" fill="url(#verb)" stroke="#6fd3f5" stroke-width="1.2"/><text x="388"  y="525" fill="#bfe6ff" text-anchor="middle">arch</text>
    <rect x="460" y="504" width="120" height="34" rx="6" fill="url(#verb)" stroke="#6fd3f5" stroke-width="1.2"/><text x="520"  y="525" fill="#bfe6ff" text-anchor="middle">map</text>
    <rect x="592" y="504" width="120" height="34" rx="6" fill="url(#verb)" stroke="#6fd3f5" stroke-width="1.2"/><text x="652"  y="525" fill="#bfe6ff" text-anchor="middle">index</text>
    <rect x="724" y="504" width="120" height="34" rx="6" fill="url(#verb)" stroke="#6fd3f5" stroke-width="1.2"/><text x="784"  y="525" fill="#bfe6ff" text-anchor="middle">diagram</text>
    <rect x="856" y="504" width="80"  height="34" rx="6" fill="url(#verb)" stroke="#6fd3f5" stroke-width="1.2"/><text x="896"  y="525" fill="#bfe6ff" text-anchor="middle">admin</text>
    <rect x="948" y="504" width="90"  height="34" rx="6" fill="url(#verb)" stroke="#7CFFB2" stroke-width="1.6"/><text x="993"  y="525" fill="#7CFFB2" text-anchor="middle">sql</text>
  </g>

  <!-- constellation footing -->
  <text x="40" y="592" fill="#7fa8c4" font-size="11" font-family="'DejaVu Sans', sans-serif">stands on sibling nordisk crates &#8212; <tspan font-family="'DejaVu Sans Mono', monospace" fill="#9fc9e0">skade</tspan> (Iceberg backend) &#183; <tspan font-family="'DejaVu Sans Mono', monospace" fill="#9fc9e0">znippy-zoomies</tspan> (gatling fan-out) &#183; <tspan font-family="'DejaVu Sans Mono', monospace" fill="#9fc9e0">nornir-testmatrix</tspan> (portable matrix)</text>
  <text x="1075" y="500" fill="#86b3cc" font-size="10" text-anchor="middle" transform="rotate(90 1075 500)">f0 = this whole picture</text>
</svg>