# Branch prune — 2026-09-20
Twenty-five `origin` branches older than today were examined against
`origin/main` (`bd1c357`, which contains `e8a7060`). Sixteen were **provably
contained** and were deleted. Nine remain, each because it holds something main
does not have — or because the owner ordered it kept.
## Method, and the trap in it
The proof of containment is `git cherry -v origin/main origin/<branch>`: a `-`
prefix means main already carries an equivalent patch, a `+` means it does not.
For every `+` the question was then asked per file — `git diff --numstat
origin/main origin/<branch> -- <files the + touches>` — and a branch was deleted
only when main was **ahead on every one of them** and carried the same idea.
Two traps were hit and are recorded here so the next pass does not re-learn them:
1. **`git cherry` skips merge commits.** The `salvage-stash-*` and
`rescue/holger-cargo-lock` tips are stash WIP commits (two parents), so their
actual stashed content is invisible to `cherry`. It was read separately with
`git diff <tip>^1 <tip>` — in all three cases: `Cargo.lock` only.
2. **"main lacks this file" is not the same as "this work is lost."** Nearly
every old branch shows `server/ui/**` and `holger-demo/**` as files main
lacks. Main *removed* them on purpose — `7cb6a49 server/ui leaves for
holger-egui` and `71e9330 Drop holger-demo` — so those trees are still in
main's history and are recoverable from it. They were not counted as unique
content unless the branch's own commits changed them.
`holger-egui` is **not cloned on oden**, so no branch was deleted on the strength
of "its egui half surely lives there". The branches whose only unique content is
an egui snapshot main never committed are kept.
Nothing under `.nornir/` is `include_str!`'d anywhere in the workspace (all
fifteen `include_str!`/`include_bytes!` sites listed and checked), so this file
cannot affect a build.
## Deleted — provably contained (16)
| branch | cherry | evidence |
|---|---|---|
| `ny_dok` | −0 +3 (+1 merge) | the three commits move every `.md` into `source_md/` as **pure renames** (0-line diffs) of July originals that are in main's history; main is **23 534 lines ahead** on the doc tree (4 279 in / 23 534 out). |
| `salvage-stash-0-2026-07-13` | −0 +1 | stash WIP = `Cargo.lock` only, 141/141. Parent `a7a5500` **is an ancestor of main**, so the whole tree is in main's history. |
| `salvage-stash-1-2026-07-13` | −0 +1 | identical shape; parent `07a9d1a` is an ancestor of main. |
| `rescue/holger-cargo-lock` | −0 +1 | stash WIP = `Cargo.lock` only, 4/4. Parent `b234349` is an ancestor of main. |
| `feat/facett-scene` | −0 +2 | the scene layer **landed**: `.nornir/scene-design.md` is still in main, and main's last `server/ui` state (`0b06503`, just before the egui move) is ahead by 1 107 lines on `app/scene.rs`, 943 on `tests/robot_scene.rs`, 1 664 on `app.rs`. |
| `feat/facet-error-reactions` | −0 +1 | `mannequin/src/facet_react.rs` and `tests/facet_reaction_matrix.rs` are **byte-identical** in main (absent from the diff). Only `Cargo.toml`/`lib.rs` differ, and main is ahead 42 out / 7 in. |
| `fix/robotui-trigger-specification` | −0 +1 | one `Cargo.toml` comment. Main carries the **same correction, one step further on** (lines 145-150: "0.3.0 **is published** — the egui-0.35, glow-free release, carrying `wire`/`cmd_json`"). The branch's `Cargo.toml` is an old workspace list that still re-adds `server/ui` and omits the whole `plugin/` lane. |
| `feature/holger-secure-update-gateway-mvp` | −6 +2 | both `+` are docs/meta, and main is ahead on **every** file they touch (`README.md` 16/37, `.nornir/README.md` 9/39, `docs/ai-context-full.md` 4 172/6 803, `server/cli/Cargo.toml` 21/196, `traits/Cargo.toml` 2/12). The authorship change it carries is already in main: `LICENSE` reads "Rickard Ernst Björn Lundin & Henrik Torp" and the string "Wilhelm" appears nowhere in main. |
| `build-thing-code-recipe` | −0 +0 | ancestor of `origin/main`. |
| `cleanup/one-build-thing` | −0 +0 | ancestor of `origin/main`. |
| `egui/out` | −0 +0 | ancestor of `origin/main` — fully merged, so the `holger-egui` question does not arise for it: deleting it loses nothing whatever lives on gunnar.rs. |
| `holger-passkey` | −0 +0 | ancestor of `origin/main`. |
| `holger-rs` | −0 +0 | ancestor of `origin/main`. |
| `merge/passkey` | −0 +0 | ancestor of `origin/main`. |
| `feat/holger-appliance-iso` | −0 +0 | ancestor of `origin/main`. |
| `feat/front-feature-and-ui-bff` | −0 +3 | the `front` feature **landed** — main's `server/lib/Cargo.toml` declares `front` in `default` and gates `holger-front`. Main is ahead on all ten files the three commits touch: 203 lines in against **1 628** out (`exposed/http.rs` 60/635, `server/lib/Cargo.toml` 13/239, `xtask/src/main.rs` 56/266, …). Its three commits also survive intact on `deploy/front-page`, which is kept. |
Local refs deleted with them: `feat/facet-error-reactions`, `fix/robotui-trigger-specification`.
## Kept (9)
| branch | cherry | what it holds that main does not |
|---|---|---|
| `pages` | −0 +1 | a **publishing target**, not work to merge: five files (`index.html`, `holger-demo.js`, `holger-demo_bg.wasm` 4.2 MB, `.domains`, `.nojekyll`) and nothing else. Main has none of them; deleting it takes the live web demo down. |
| `feat/facet-react-consumer-wiring` | −0 +1 | genuinely unmerged: `mannequin/src/facet_react.rs` +20/−0, `mannequin/src/gui.rs` +51/−15, `tests/facet_reaction_matrix.rs` +78/−0. Main **has** `facet_react.rs` but its `gui.rs` never references it — the declaration landed, the consumer wiring did not. |
| `park/matrix-naming-2026-08-02` | −1 +1 | `.nornir/build-variants.toml` holds **633 lines main lacks** (main is ahead on the other files: `suite_build_shape.rs` 95/171, `xtask/src/main.rs` 247/698). Written in the pre-2026-08-26 vocabulary ("every atom names its delivery"), so it is a parked design, not current — but main is not ahead on it, so it is not contained. |
| `rescue/holger-uncommitted-2026-08-04` | −0 +2 | the only copy of a **13 000-line snapshot of work that was never committed** on 2026-08-04, across ~170 files, including `server/ui/**` and `holger-demo/**` versions that main never received. `holger-egui` is not on oden, so the egui half cannot be cross-checked. |
| `fix/installer-iso-payload-freshness` | −0 +1 | main has **neither file**: `xtask/src/payload_provenance.rs` (245 lines) and `xtask/tests/installer_iso_payload_freshness.rs` (232 lines). The refusal of a payload whose binary moved underneath it does not exist in main. |
| `holger-installer` | −1 +2 | main is ahead on five of six files, but **not** on `xtask/src/installer_iso.rs` (+59/−16). What main lacks is a `donorless()` test fixture and `the_declared_row_names_its_kernel_donor()`. This is the vacuous-guard shape: main's kernel-rule tests all build on `row()`, which now declares a donor, so they can bail on the donor check before reaching the rule they name. |
| `deploy/front-page` | −0 +6 (+1 merge) | `holger-front/assets/arrow.svg` and `holger-front/assets/ferris.svg` exist on **no other ref** — checked against `main`, `fix/front-marks`, `lane-f/front-publish`, `lane/deploy-today`. It also carries the credit block, the re-sampled background and the `mvp-server-musl-front` variant. |
| `feat/metering-doors` | −0 +0 | kept by order. See below — it is an ancestor of main. |
| `monetize-doors` | −0 +1 | kept by order. See below. |
## ?3 — "which metering branch is the base?"
HOLGER-PLAN.md asks which of the two ~2 300-line metering branches is the base,
worrying that they drift further apart. The factual half is now settled:
**`feat/metering-doors` is the base, and it is not a branch any more — it is
main.** Its tip `f6ff7ec` ("The two doors monetize has been waiting for: usage,
and a signed entitlement") is an **ancestor of `origin/main`**; `git cherry`
reports −0 +0. What landed with it: `proto/holger-metered.proto`,
`server/lib/src/metered.rs`, `metering.rs`, `meter_services.rs`,
`promote/meter_gate.rs`, `generated/holger.metered.v1.rs`, the
`plugin/{abi,host}` meter lane, and the tests `metering_doors.rs` and
`the_meter_is_what_answers.rs`.
**`monetize-doors` is the rival, and it is the one that is behind.** One commit
(`f0ce959`, 2 355 lines) that main never took, proposing the same two doors
under different names:
| | `monetize-doors` | `origin/main` (via `feat/metering-doors` + R13) |
|---|---|---|
| entitlement file | `proto/holger-entitlement.proto` | folded into `proto/holger-metered.proto` |
| entitlement rpcs | `Set`, `Get` | `Get`, `Set`, **`List`** |
| usage rpc | `UsageService.Read` | `UsageService.ReadUsage` (in `holger.proto`) |
| impl | `server/lib/src/entitlement.rs`, `usage.rs` | `metered.rs`, `metering.rs`, `meter_services.rs` |
So the two do not need reconciling in both directions. Main's shape is a
**superset** of what `monetize-doors` proposes — it has the third rpc
(`List`) and the WASM meter lane the branch has no equivalent of. The drift is
one-sided: `monetize-doors` is a superseded spelling of doors that already
exist. The remaining question for the owner is only whether anything in its
`open_build_speaks_no_money.rs` (239 lines) is worth lifting across before it
goes; both branches were left in place pending that ruling.
## What remains
After this pass the pre-today branches on `origin` are exactly the nine above.
Everything else on `origin` is from 2026-09-20 (the `lane/*`, `stinky/*`,
`lane-f/*`, `fix/front-marks` work) and was out of scope.