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

nordisk/holger

.nornir/stinky/13-requirements-2026-09-22.md

13 — the owner's requirements checked against the code, 2026-09-22

Agent V1. Read-only audit of holger origin/main 2333299 and private-holger-ops main fe6c0ea. The live box holger.rs was read only; it runs holger v0.6.10 (2333299). Nothing here was fixed.

The owner's words for the twin: "regarding holger we want the same behaviour" as gunnar. gunnar's list is workspace_nordisk/stinky-gunnar-requirements-2026-09-22.md.

Rule for every item: "done" means the fix is proven on the mock cloud first (mock-upcloud / mock-upcloud-kvm, SeaBIOS, the UpCloud shape), and only then on anything real.

holger.rs is one box today. A twin server costs money and is the owner's decision. The items below are about the code, so it is ready when the owner says yes.

Verdict per requirement

# requirement verdict why, in one line
H1 the twin is a restore source (config + data), also after a failed reshape PARTLY replicate_estate (server/lib/src/replication.rs:686) and follow_once (twin.rs:396) work between two data roots on ONE host. There is no network transport, nothing on a timer, the artifact store is not moved, and there is no reshape fallback.
H2 the twin only receives and stores; indexing is done on main at recharge NOT MET wire_holger builds a twin like a primary. The job queue opens and starts workers on every role (server/lib/src/lib.rs:3222-3242), and jobs is in ESTATE, so a twin would resume the primary's jobs.
H3 backfill a missed entry, never skip a gap; main keeps entries until the twin has them NOT MET Replication is a full idempotent scan. There is no sequence, no watermark, no gap detection, and retention.rs knows nothing of a twin.
H4 config lives in the twin too PARTLY holger.ron is in ESTATE. admin-token is deliberately not replicated (copied by hand, front plan step 12). Local only, with no wire.
H5 one ISO; the role is elected at bootstrap and recorded PARTLY elect (twin.rs:621) writes holger-role.ron once. AdminService.BecomeTwin is at grpc/services.rs:1196, and the recipe refuses a twin row. The HOLGER_ROLE/HOLGER_PRIMARY environment (twin.rs:423-500, lib.rs:342-357) and the RON role: key can still make a twin that was never elected.
H6 the weakest box is the twin, decided once by xtask; the keep-up floor only warns PARTLY The floor warns (twin.rs:247, test a_short_twin_is_named_and_never_refused). private-holger-ops xtask/src/front.rs:273-298 only prints instructions. No xtask measures the boxes, and cores/RAM are on no holger endpoint. WireGuard between the two boxes is proposed in HOLGER-PLAN §5 "W22 — a paired on-prem holger over WireGuard" (2026-09-22, design only).
H7 main and twin trust each other both ways NOT MET There is no network link and no peer identity (02 S2-9: "a peer is any admin").
H8 WireGuard + mTLS (TLS 1.3), signed medium, audit that survives a restore PARTLY Signed medium: MET through korp-installer (?13). Audit: holger-audit is in ESTATE, lib test only. No WireGuard between VMs. exposed/tls.rs:116 allows TLS 1.2 and 1.3, and client certificates are optional (:129 allow_unauthenticated).
H9 UpCloud trait + mock as pre-test NOT MET on main agent/mock-estate e565609 and agent/one-upcloud-client 7561e88 are unmerged. On them only orphans goes through upcloud_api. Terraform reaches the mock by base URL, and nothing uses mock-upcloud-kvm.
H10 immutable box (?25) MET as a ruling, NOT PROVEN ?25 answered 2026-09-20 (HOLGER-PLAN.md:82): no self-update, and there is no UpdateService/ImportBundle in proto/holger.proto. No test pins it, and the live box has its binary swapped in place.
H11 flow SVG in the console with visitor counts, no raw IPs MET 2333299 (2316d9c + 93df658). no_client_address_reaches_the_rendered_picture (flow.rs:2897). Verified live: /-/flow.svg shows client 5cebb6db and "consumers today", and the only addresses are 0.0.0.0/127.0.0.1.
H12 the rest of HOLGER-PLAN open See item 9.

Gaps, highest priority first

1. There is no network link between main and twin, and no mutual trust (H1, H4, H7).

2. The twin processes: its job queue runs on every role (H2).

3. There is no sequence, so no gap detection and no retention guard (H3).

4. The role can still come from the environment or the config (H5).

5. There is no xtask election (H6).

6. No WireGuard between VMs; TLS is not 1.3-only and not mutual (H8).

7. The UpCloud trait and the mock are not on main (H9).

8. The immutable box is a ruling without a test (H10).

9. HOLGER-PLAN open work (H12), for dispatch.