The lab's guests, cloned from packer/'s templates
through Saruman's API, from phoenix (ADR-0076). How to run it is
provision-lab-guests.md. This page is the map.
set -a; . ~/.config/proxmox/phoenix.env; set +a
tofu -chdir=tofu init
tofu -chdir=tofu plan -out=next.tfplan
tofu -chdir=tofu apply next.tfplan && rm tofu/next.tfplanversions.tfpins tofu,bpg/proxmoxandrandom, and sets the local backend atstate/lab.tfstate..terraform.lock.hclpins the providers' hashes and is committed.encryption.tfencrypts state and plans with a passphrase fromphoenix.env, and refuses to write either unencrypted. It is self-contained, because CI copies it as it stands to prove it.providers.tfreads the endpoint and the token from the environment, so neither is ever written to state.guests.tflists the guests. The pools are derived from them, so a pool lives exactly as long as a guest in it does. It holds ADR-0029's six domain guests (150–155), in thelab-domainpool, #920's on-demand dotfiles VMs (191–198, ADR-0090), in thedotfilespool, #921's always-on analyst workstationgaruda(162, [ADR-0091]), in theanalystpool, and the proof guest, 998, only under-var proof=true.modules/guest/makes one full clone, with the flags the hand-built guests have: q35, OVMF and an EFI disk, a TPM on Windows, and the MAC and SMBIOS UUID each guest is given. It leavesstartupalone: setting it takesSys.Modifyon/, so root onSarumansets it after an apply.
- State is never plaintext, and never tracked.
enforced = truerefuses a plaintext write..gitignore,scripts/check-tracked-artefacts.shand thetfstate-plaintextrule in.gitleaks.tomleach catch a state that got out.scripts/check-tofu-state-encryption.sh --self-testproves every one of those can fail. - Full clones only, because
packer build -forcerebuilds a template at the same VMID (ADR-0074). - The six domain guests keep their MACs and SMBIOS UUIDs.
morpheus's reservations are keyed by MAC, and the endpoints' activation by the UUID. A rebuild isbuild-the-lab-domain.md's, and it destroys with-target=module.guestso the pool's grant survives. - CI proves that the tree parses and that the encryption holds.
phoenixproves that it applies.scripts/lint.shrunsfmt -checkandvalidate, andscripts/self-tests.shruns the encryption proof. Both use the imagestacks/observability/compose.yamlpins. A change here is only finished once the runbook's §4 has passed against a real apply.