nornir 0.4.10

Companion to cargo: dependency tracking, release gating, deploy, benchmarks, and documentation assembly. Project-agnostic.
Documentation
# agent_fix.md — handoff (2026-06-11)

Session notes: what was fixed, and what's left. Spans znippy, skade, the nornir
release pipeline, and the nornir **server** (oden).

## Done & verified

### Crates published (crates.io)
- **znippy perf pass:** `znippy-zoomies 0.1.10` (stree AVX2-once + hugepage),
  `lbzip2 0.5.2`, `lgz 0.3.3`, `ljar 0.2.1`, `lzip-parallel 0.2.2`,
  `znippy-compress 0.9.2`. All tagged + pushed (codeberg).
- **`znippy-common 0.9.2`** — it had diverged from 0.9.1 without a bump
  (`MetaSinkFactory` iceberg-sink API), blocking the compress/cli publish step.
  Bumped + published; every dependent's version req raised to 0.9.2.

### Docs
- **skade/.nornir:** added `design.md`, `tutorial.md`, `dummy-guide.md`; fixed a
  stale note (REST-shim `commit_table` is implemented, not 501). Pushed.
- **workspace_znippy/release/RUNBOOK.md:** script-free full-release runbook
  (no `release.sh` — pure-Rust toolchain). The workspace-wide release lives in
  the control plane, not znippy/.nornir.

### Config
- **workspace_znippy/release/nornir.toml:** added `[storage] local_path =
  "workspace_znippy/.nornir"`. Without it `warehouse_root()` fell back to
  `workspace_holger/.nornir/warehouse`, so znippy benches wrote into *holger's*
  warehouse and gated against its history.

### nornir server (oden, systemd `nornir.service`, user `nornir`)
- **Fresh binaries** built from current source → `/usr/local/bin/{nornir,nornir-server}`
  (the old installed binary wrote a 10-column `bench_runs` batch vs the current
  7-field schema → local-append failure).
- **znippy added to `NORNIR_MONITOR`** in `/etc/nornir/nornir.env` (it was
  missing → `workspace 'git'/'znippy' is not served`). Env backed up to
  `nornir.env.bak.<mtime>`. Drop-ins (`cuda.conf`, `path.conf`) preserved.
- **Clean-slate wipe** (server stopped, as `nornir`): `registry.redb`,
  `workspaces/*/builds`, `default/{warehouse,cache}`, `funnel`. Kept `.ssh`,
  `descriptors/`, the env, the unit. (git checkouts kept to avoid a full
  re-clone; the poll loop refreshes them.)
- **git committer set** for the `nornir` user (`user.name=nornir`,
  `user.email=nornir@oden`) — the poll-loop fetch was failing with
  `reflog … needs a committer which isn't set`. `nornir workspace fetch znippy`
  now succeeds (2/2 members, incl. the private `nornir` repo over SSH).
- **Verified:** `nornir workspace ls` shows all 5 monitored (holger, knut, njord,
  skade, znippy); `serving 6 workspace(s)`; a server-routed
  `nornir bench run znippy` persisted into `/home/nornir/workspaces/znippy/builds/`
  (stree_8mb/_128mb, lbzip2_scala, lgz_scala present). Service `active`.

## What's left

1. **GitHub push is not automated in `nornir release`** (`src/release/publish.rs:270`).
   By design — gix 0.84 has no send-pack and nornir forbids git-subprocess +
   libgit2. `release run` commits + tags locally + `cargo publish`es, then the
   operator runs `git push` (see workspace_znippy/release/RUNBOOK.md). If you want
   it automated, the options are: implement gix send-pack, sanction a single
   `git push` subprocess, or keep the manual step.

2. **Full `nornir release run` for znippy not yet run end-to-end** — only the
   bench→persist path was validated (with `NORNIR_BENCH_SKIP_HEAVY/PLANET=1`).
   A real release runs the *full* bench suite, which needs the heavy/planet
   fixtures present (`/home/rickard/work/europe-latest.osm.pbf`, the planet
   `.osm.bz2`/`.pbf`) or the gate's `required_results` may fail. Run on a
   quiescent box with the crates.io token configured.

3. **Server-mode bench-run workspace header** derives from the cwd basename, so
   running from `/run/media/rickard/T9/git` sends `git` → "not served". Use
   `NORNIR_WORKSPACE=znippy` (or run inside the znippy checkout). Worth making
   the CLI fall back to the `--repo`/config workspace name instead of cwd.

4. **`maven_extract` bench regression smell:** native ljar maven extract is
   ~14 µs/call vs the fallback ~1.2 µs (`speedup_x≈0.09`, i.e. native is ~10×
   *slower*). Pre-existing; looks like the native path is doing more than the
   fallback. Worth a look.

5. **Stale `/var/lib/nornir`** tree — unused by the running server (real root is
   `/home/nornir/workspaces`). Safe to `sudo rm -rf /var/lib/nornir`.

6. **`/home/nornir/server.toml`** is referenced in places but absent; config is
   entirely via `/etc/nornir/nornir.env`. Remove the stale references or restore
   the file if something still reads it.

7. **skade's nornir release/bench is "not wired yet"** (per
   workspace_skade/WORKSPACE.md — gates aspirational). skade-katalog has a
   `bench/examples/nornir-bench.rs` Bencher; wiring its `release run` is the next
   step there.

8. **`nornir-server` has no `--version`** — invoking it boots the server. Minor
   CLI ergonomics; a `--version`/`--help` short-circuit would avoid accidental
   boots (and accidental `:7878` binds).

9. **Deploy-key coverage:** znippy fetches clean now; confirm the server's deploy
   key (`nornir key show`, nornir@oden) is on every private member repo
   (holger/knut/njord + the `nornir` member) so no monitored workspace silently
   fails to fetch.

## Quick reference
- Restart server: `sudo systemctl restart nornir`
- Server config: `/etc/nornir/nornir.env` (token, addr, `NORNIR_MONITOR`, root)
- Registry: `/home/nornir/workspaces/registry.redb`; per-workspace warehouses:
  `/home/nornir/workspaces/<name>/builds/`
- Full znippy release: see `workspace_znippy/release/RUNBOOK.md`