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

nordisk/holger

.nornir/mannequin-for-idiots.md

mannequin — idiot guide (start it before you develop against holger)

mannequin is holger's test dummy daemon: it stands up the environment holger expects — a PKI (CA + server certs), an OIDC provider, and mock upstream registries — so you can run/develop holger (and a UI against it) without real infrastructure. Crate: mannequin (binary holger-mannequin), in holger/mannequin/. There's an egui system-map dashboard too — now drawn through facett components (the nordisk house pattern), not raw egui.

Start it (the one command)

cd holger/mannequin
cargo run --bin holger-mannequin -- serve --port 9999          # all services
cargo run --bin holger-mannequin -- serve --port 9999 --gui    # + egui system map

What you get (and why a UI dev cares)

Service Use
PKI (CA + server cert) TLS for holger's gRPC/HTTP doors; trust the CA in your client
OIDC provider tokens for holger's auth surface (server/lib/src/auth.rs)
mock registries upstream Maven/PyPI/crates/… so fetch/proxy flows have something to talk to

A UI you build talks to holger, and holger talks to mannequin. So the dev loop is: holger-mannequin serve → start holger pointed at it → run your UI.

The --gui dashboard (facett)

The system map is a facett_syschart::SystemChart: three clickable peer nodes — PKI / OIDC / Nexus — joined by edges, each carrying a live badge (its event count). Click a node to expand its inline detail panel:

The map updates live (~2 Hz) as the daemon serves requests. facett deps are the published crates.io release (facett-core / facett-syschart / facett-table 0.1, from facett 0.1.0 — all 19 crates incl. the facett-syschart invented for this GUI); mannequin is on egui/eframe 0.35 to match facett-core's pin (it was 0.34 until 2026-08-01, when facett moved to 0.35 and holger had to follow or stop compiling). The SystemChart is robot-testable through facett's headless harness, in full 8-LAW value-compliance: the robot drives the REAL shipped shell (eframe::App::ui itself — no proxy), clicking the actual AccessKit map-node buttons, the detail pane's 🔄 Regenerate, the look switcher and the fold chrome. state_json emits every emptiable value as data (LAW 6): chart_nodes[] (id,label,badge,selected plus the exact a11y_label facett registers, so the drive target and the emit are one truth) and detail{} with its EMPTY/ERROR booleans (empty = "(select a system)", pki_certs_empty = "(no child certs yet)", activity_empty per system). The scenario asserts value changes across the sample space (LAW 3): Regenerate increments on each press (0→1→2, not a 0↔1 flip) with the badge tracking it, the look switcher maps two distinct presets to their names, all three nodes select, fold is exercised both ways, and PKI-vs-OIDC isolation is asserted.

It's in the test matrix

A smoke test (mannequin/tests/smoke_serve.rs, #[ignore]'d = heavy) starts holger-mannequin serve on an ephemeral port and asserts the daemon comes up and serves. It runs by default in the release gate (heavy-on); opt out with nornir --skip-heavy. So "does mannequin still boot" is checked, not assumed.

Troubleshooting