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

nordisk/dwarves

.nornir/assets/server-git-source-and-live-report.svg

<svg xmlns="http://www.w3.org/2000/svg" width="880" height="392" font-family="monospace" font-size="13">
  <style>
    .box{fill:#0f2233;stroke:#6fd3f5;stroke-width:1.5}
    .reuse{fill:#12331f;stroke:#7fe0a0;stroke-width:1.5}
    .t{fill:#dbeafe}.dim{fill:#9fb6c6}.acc{fill:#7fe0a0}
    .arr{stroke:#6fd3f5;stroke-width:1.5;fill:none;marker-end:url(#a)}
    .arr2{stroke:#7fe0a0;stroke-width:1.5;fill:none;marker-end:url(#b)}
  </style>
  <defs>
    <marker id="a" markerWidth="9" markerHeight="9" refX="7" refY="3" orient="auto"><path d="M0,0 L7,3 L0,6 Z" fill="#6fd3f5"/></marker>
    <marker id="b" markerWidth="9" markerHeight="9" refX="7" refY="3" orient="auto"><path d="M0,0 L7,3 L0,6 Z" fill="#7fe0a0"/></marker>
  </defs>

  <text x="12" y="20" class="acc">dwarves — server-side git RegisterPipeline (a) + live RunReport → Pipeline tab (b); GREEN = REUSED shared leaf</text>

  <!-- (a) register with source -->
  <text x="12" y="48" class="acc">(a) RegisterPipeline{ source = git@… }</text>

  <rect class="box" x="12" y="60" width="180" height="70"/>
  <text x="24" y="84" class="t">dwarves repo add</text>
  <text x="24" y="102" class="dim">--server &lt;url&gt; (thin)</text>
  <text x="24" y="120" class="dim">source = git@host:o/r.git</text>

  <rect class="box" x="236" y="60" width="196" height="70"/>
  <text x="248" y="84" class="t">dwarves-server</text>
  <text x="248" y="102" class="dim">register_pipeline handler</text>
  <text x="248" y="120" class="dim">SSH-ONLY · https ⇒ reject</text>

  <rect class="reuse" x="476" y="60" width="184" height="70"/>
  <text x="488" y="84" class="acc">edda/nornir-git</text>
  <text x="488" y="102" class="dim">clone_or_fetch (gix+russh)</text>
  <text x="488" y="120" class="dim">/home/dwarves/.ssh key</text>

  <rect class="box" x="704" y="60" width="164" height="70"/>
  <text x="716" y="84" class="t">discover + register</text>
  <text x="716" y="102" class="dim">&lt;repos&gt;/host/o/r</text>
  <text x="716" y="120" class="dim">brokkr.toml → pipeline</text>

  <path class="arr" d="M192,95 L232,95"/>
  <path class="arr2" d="M432,95 L472,95"/>
  <path class="arr" d="M660,95 L700,95"/>

  <!-- (b) live report -->
  <text x="12" y="196" class="acc">(b) live forge run → Pipeline tab</text>

  <rect class="box" x="12" y="208" width="188" height="74"/>
  <text x="24" y="232" class="t">brokkr engine</text>
  <text x="24" y="250" class="dim">run_pipeline(DemoRunner)</text>
  <text x="24" y="268" class="dim">the SAME engine the server drives</text>

  <rect class="box" x="244" y="208" width="176" height="74"/>
  <text x="256" y="232" class="t">RunReport</text>
  <text x="256" y="250" class="dim">run + row-per-step</text>
  <text x="256" y="268" class="dim">real durations</text>

  <rect class="box" x="464" y="208" width="200" height="74"/>
  <text x="476" y="232" class="t">ForgePipelineAdapter</text>
  <text x="476" y="250" class="dim">::from_report(&amp;dag,&amp;report)</text>
  <text x="476" y="268" class="dim">steps→nodes · needs→edges</text>

  <rect class="reuse" x="708" y="208" width="160" height="74"/>
  <text x="720" y="232" class="acc">facett-pipeline</text>
  <text x="720" y="250" class="dim">PipelineView</text>
  <text x="720" y="268" class="dim">ONE viewer, many adapters</text>

  <path class="arr" d="M200,245 L240,245"/>
  <path class="arr" d="M420,245 L460,245"/>
  <path class="arr2" d="M664,245 L704,245"/>

  <text x="12" y="326" class="dim">No hand-typed ledger fixture — the tab renders a REAL completed forge run (all steps Done).</text>
  <text x="12" y="348" class="dim">No `nornir` crate dep (cycle); no `git` binary (L9); additive — empty `source` keeps the local `repo_root` path.</text>
  <text x="12" y="370" class="dim">Swap DemoRunner → RealRunner (server runner selection) and the same pane is a live cargo build, unchanged.</text>
</svg>