# buildthing → per-site installer ISO (gap analysis item 19)
The suite-level capability now exists at the SHARED layer, measured green on
edda 2026-08-14: `nornir_build_thing::suite_cli::run_installer` resolves an
`[[build.installer]]` cell, applies repeatable `--param` values (`name=value`, `name=@path`,
or `name=@fixture` for a parameter whose cell declares a fixture — the forge mints it and
prints `param name ← fixture <kind> (…)` beside the ISO path) through the
ONE validation path (unknown/secret/wrong-shape refused by name), and hands
the composition to an injected `InstallerComposer`. korp-installer provides
the composer: `korp_installer::isocompose::ForgeComposer` (behind `forge`) —
the SAME `compose_and_master` every product verb and every KVM proof drives.
Secure Boot signing and root-key enrollment honor the crate's existing env
contracts (`KORP_SECURE_BOOT_KEY`/`CERT`, `KORP_ROOT_SIGNING_KEY`), so an
armed build needs no new flags at this layer.
## The wiring `buildthing` needs (exact, ~10 lines)
In `buildthing_cmd` — which lives in `crates/dwarves/src/main.rs` (~:6572)
and delegates to `dwarves::buildthing::run_args` — add an installer branch.
NOTE: `suite_cli::BuildArgs` has no `cell` field (its fields are `suite`,
`atom`, `list`, `attest`, `params`), so the cell name arrives either as a
new `--installer <name>` CLI arg or by reusing the existing `--atom` string
when it names an `[[build.installer]]` cell — the resolver refuses unknown
names by name either way:
```rust
#[cfg(feature = "appliance-iso")]
{
let iso = nornir_build_thing::suite_cli::run_installer(
&repo_root,
&repo_label,
installer_cell.as_deref(), // --installer <name>, or None = the single cell
&kernel_path, // --kernel / $KORP_TEST_KERNEL
&app_path, // the product's packed .znippy
&args.params, // the repeatable --param k=v values
&korp_installer::isocompose::ForgeComposer,
)?;
println!("installer ISO: {}", iso.display());
}
```
`appliance-iso` already exists and already carries the korp-installer dep
(crates/dwarves/Cargo.toml:536,544) — no new dependency edge.
## Why the wiring is not committed as code from this box
dwarves does not compile here — measured 2026-08-14, verbatim:
```
error: failed to load manifest for workspace member `/home/henrik/dwarves/dwarves-gui`
referenced by workspace at `/home/henrik/dwarves/Cargo.toml`
Caused by:
failed to load manifest for dependency `facett-manual`
Caused by:
failed to read `/home/henrik/facett/facett-manual/Cargo.toml`
Caused by:
No such file or directory (os error 2)
```
The local facett checkout (main @ 0730bff0) predates the facett-manual crate
and has DIVERGED from origin/main (not fast-forwardable), with a sibling
session's uncommitted change in the very file the delta touches — syncing it
is a merge decision over a live working tree, not this session's call.
Committing CLI code that cannot be compiled would be a claim, not a
capability; the seam is proven at the shared layer instead (the fake-composer
test in suite_cli), and this file is the exact remaining wiring.