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
- No
--config→ it generates fresh certs on the fly (zero setup). --config <file.ron>→ load a fixed PKI/OIDC/registry setup (seemannequin/mannequin.ron).- Standalone PKI (no daemon):
holger-mannequin pki generate --output ./certs --cn localhost --sans a,b.
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 system's recent events render as a
facett_table::Table(time / dir / summary); - for PKI, the panel also shows the issued-cert list + a live 🔄 Regenerate button (rotates the CA keypair, logging the event).
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
- Port busy → pass a different
--port. - Cert errors in your client → trust mannequin's generated CA (printed on start, or
pki generateto a dir and point your client's trust store at it).