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

nordisk/nornir

.nornir/assets/release-doctor-decisions.svg

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 860 560" font-family="ui-sans-serif,system-ui,Segoe UI,Roboto,sans-serif">
  <style>
    .h{font-size:16px;font-weight:700}.r{font-size:12.5px;fill:#1f2937}.s{font-size:11px;fill:#6b7280}
    .card{rx:10}
  </style>
  <text x="430" y="34" text-anchor="middle" font-size="21" font-weight="700" fill="#111827">release doctor — every finding lands in one of three lanes</text>
  <text x="430" y="55" text-anchor="middle" class="s">the engine solves what it can; what it can't, it EXPLAINS — it never guesses</text>

  <!-- AUTO lane -->
  <rect x="24" y="80" width="260" height="440" rx="12" fill="#f0fdf4" stroke="#16a34a" stroke-width="2"/>
  <rect x="24" y="80" width="260" height="46" rx="12" fill="#16a34a"/>
  <text x="154" y="110" text-anchor="middle" class="h" fill="#fff">① AUTO — apply</text>
  <text x="154" y="146" text-anchor="middle" class="s">safe, reversible, deterministic → the engine just does it</text>
  <g>
    <rect x="42" y="166" width="224" height="58" rx="8" fill="#fff" stroke="#86efac"/>
    <text x="54" y="188" class="r" font-weight="600">path dep missing version=</text>
    <text x="54" y="206" class="s">→ --fix (read dep's own manifest)</text>
    <text x="54" y="219" class="s">✅ built 2026-07-03</text>
  </g>
  <g>
    <rect x="42" y="234" width="224" height="52" rx="8" fill="#fff" stroke="#86efac"/>
    <text x="54" y="256" class="r" font-weight="600">dirty tree = noise (.claude/)</text>
    <text x="54" y="274" class="s">→ --tidy (gitignore the junk)</text>
  </g>
  <g>
    <rect x="42" y="296" width="224" height="52" rx="8" fill="#fff" stroke="#86efac"/>
    <text x="54" y="318" class="r" font-weight="600">external version skew</text>
    <text x="54" y="336" class="s">→ bump to the semilattice join</text>
  </g>
  <g>
    <rect x="42" y="358" width="224" height="66" rx="8" fill="#fff" stroke="#86efac"/>
    <text x="54" y="380" class="r" font-weight="600">cycle cut on dev/optional edge</text>
    <text x="54" y="398" class="s">MFAS cost-0 → gate it off,</text>
    <text x="54" y="414" class="s">no crate needs splitting</text>
  </g>

  <!-- DECISION lane -->
  <rect x="300" y="80" width="260" height="440" rx="12" fill="#fffbeb" stroke="#d97706" stroke-width="2"/>
  <rect x="300" y="80" width="260" height="46" rx="12" fill="#d97706"/>
  <text x="430" y="110" text-anchor="middle" class="h" fill="#fff">② DECISION — ask</text>
  <text x="430" y="146" text-anchor="middle" class="s">a real choice a human owns → ONE crisp question</text>
  <g>
    <rect x="318" y="166" width="224" height="66" rx="8" fill="#fff" stroke="#fcd34d"/>
    <text x="330" y="188" class="r" font-weight="600">non-member hard dep</text>
    <text x="330" y="206" class="s">e.g. modgunn: add to the cascade,</text>
    <text x="330" y="222" class="s">feature-gate it, or hold?</text>
  </g>
  <g>
    <rect x="318" y="242" width="224" height="66" rx="8" fill="#fff" stroke="#fcd34d"/>
    <text x="330" y="264" class="r" font-weight="600">cycle needs a crate SPLIT</text>
    <text x="330" y="282" class="s">MFAS min-cut is high-cost →</text>
    <text x="330" y="298" class="s">extract a leaf (like znippy-zoomies)?</text>
  </g>
  <g>
    <rect x="318" y="318" width="224" height="66" rx="8" fill="#fff" stroke="#fcd34d"/>
    <text x="330" y="340" class="r" font-weight="600">skew a transitive dep PINS</text>
    <text x="330" y="358" class="s">bumping fights a locked constraint →</text>
    <text x="330" y="374" class="s">accept, or override the pin?</text>
  </g>

  <!-- UNSOLVABLE lane -->
  <rect x="576" y="80" width="260" height="440" rx="12" fill="#fef2f2" stroke="#dc2626" stroke-width="2"/>
  <rect x="576" y="80" width="260" height="46" rx="12" fill="#dc2626"/>
  <text x="706" y="110" text-anchor="middle" class="h" fill="#fff">③ UNSOLVABLE — explain</text>
  <text x="706" y="146" text-anchor="middle" class="s">outside the engine's power → a clear WHY + what YOU must do</text>
  <g>
    <rect x="594" y="166" width="224" height="72" rx="8" fill="#fff" stroke="#fca5a5"/>
    <text x="606" y="188" class="r" font-weight="600">no crates.io token</text>
    <text x="606" y="206" class="s">can't authenticate the publish →</text>
    <text x="606" y="222" class="s">"create a token at crates.io,</text>
    <text x="606" y="236" class="s">then cargo login" ← we are HERE</text>
  </g>
  <g>
    <rect x="594" y="248" width="224" height="66" rx="8" fill="#fff" stroke="#fca5a5"/>
    <text x="606" y="270" class="r" font-weight="600">crate NAME already taken</text>
    <text x="606" y="288" class="s">someone else owns it on crates.io →</text>
    <text x="606" y="304" class="s">rename, or contact the owner</text>
  </g>
  <g>
    <rect x="594" y="324" width="224" height="66" rx="8" fill="#fff" stroke="#fca5a5"/>
    <text x="606" y="346" class="r" font-weight="600">network / registry down</text>
    <text x="606" y="364" class="s">crates.io unreachable →</text>
    <text x="606" y="380" class="s">report + retry later</text>
  </g>
  <g>
    <rect x="594" y="400" width="224" height="66" rx="8" fill="#fff" stroke="#fca5a5"/>
    <text x="606" y="422" class="r" font-weight="600">a real compile break upstream</text>
    <text x="606" y="440" class="s">dep changed its API →</text>
    <text x="606" y="456" class="s">explain the failing call sites (SCIP)</text>
  </g>
</svg>