# Pass 4 / W4.3 -- Execution sequencing into the teardown -> redeploy (module invocations)

READ-ONLY planning artifact. Container-layer-elimination pass, Phase 4, Worker 3.
Confirmed ground truth consumed: `pass0-admin-report.md` Section 7a (**Option 1**;
cross-DC handling **(a)**; MAAS region stays on `vr1-dcN-maas-01`); `pass1-admin-report.md`
Sections 3-7 (planning change-set, the (a)-control spec, the L0-L5 layer model); `pass1-w3-
sequencing.md` (the base ordered sequence, adversarially corrected by the pass1 admin);
`pass2-admin-report.md` Sections 2-5 (the THREE isolation concerns, the 13 owed artifacts,
Phase-2 recommendation-grade resolutions); `pass3-admin-report.md` Sections 2-4 (the unified
tests change-set, the gate-home map, the #11 critical-path constraint). No mutation
proposed or performed here -- this is the ORDERED PLAN, expressed as module/artifact
invocations, for later gated execution.

**Layer model used (adopted from `pass1-admin-report.md` Section 5, W1.4's design --
NOT redefined here; W4.2 owns its full specification):** L0 host/inter-site substrate ->
L1 site/edge nodes (incl. the client VM as a `cloudinit-vm` instance) -> L2 DC substrate
(planes + node VMs; the two-root split collapses into L2) -> L3 enlist/commission -> L4
Juju/OpenStack deploy (D-140 pins as procedure) -> L5 verify/gate (cross-cutting).

Axis tags throughout: **[D-143]** (value/address substitution) / **[CE]** (container-elim,
shape change) / **[both]** (four confirmed dual-cause items, per pass1 check 5) /
**[unchanged]** (persists across the pivot, neither axis's content).

---

## 0. Four critical-path invariants -- where each lands, verified against the sequence below

| # | Invariant (source) | Lands at | Verified honored |
|---|---|---|---|
| 1 | **(a)-control BEFORE any flat substrate apply** (`pass1-admin-report.md` Section 3; `pass2-admin-report.md` Section 2.1) | **B.3, before B.4** | YES -- B.3 gate-closes before B.4.0/B.4.1 open; B.4 is the first step that can co-locate two DCs' plane bridges on vcloud's kernel |
| 2 | **Power-key mitigation (#11) BEFORE lib-hosts power-address re-derivation** -- blocks a 6-item test cluster (`pass3-admin-report.md` Section 4) | **B.6.1, before B.6.2** | YES -- B.6.2 (the `lib-hosts.sh` edit) is sequenced strictly after B.6.1's mechanism ruling + C4 harness; B.6.2's own gate lists the same 6-item cluster as blocked-together |
| 3 | **R7 revocation + MAAS record-release BEFORE substrate destroy** (`pass1-w3-sequencing.md` Part A steps 3-4; Part E risk 4) | **A.3-A.4, before A.5-A.7** | YES -- A.3/A.4 precede the destroy-plan/apply steps A.5-A.7 in Part A below, unchanged from pass1's ordering |
| 4 | **D-143 value-substitution kept attributable, separate from container-elim shape-change** (`SCOPE-AND-EXECUTION-PLAN.md` Section 7; pass1 check 5) | **Every row's tag column** | YES -- every step below carries its axis tag; the four genuinely dual-cause items (B.1.4, B.4/B.6.2 power-address, R7/A.3, B.7.1/B.7.4) are marked `[both]`, not silently folded into one axis |

No step below violates any of the four; the invariant table above is the single
cross-check a future session should re-run if this document is ever amended.

---

## PART A -- TEARDOWN of the current 10.12 Model-B checkpoint

Baseline unchanged from `pass1-w3-sequencing.md` Part A (pass1-admin-report.md consumed it
without correction) -- today's tooling (`runbooks/dc-dc-teardown-rollback.md`) tears down
today's actually-deployed two-root shape; the flat-topology target does not change what
commands remove the OLD shape.

| # | Module/artifact invoked | Layer (old shape) | Tag | Depends-on | Gate that closes it |
|---|---|---|---|---|---|
| A.1 | `tofu state pull` / backup, BOTH roots BOTH hosts (outer state on vcloud; each DC's inner state on the Office1 headend, D-128 Plane 2) | L2 (old two-root) | [D-143] | -- | backup file exists for both roots, both hosts, verified present before proceeding |
| A.2 | MAAS machine census, from voffice1 -- LENS 1 (every `power_type=virsh` record) + LENS 2 (corroborate vs `lib-hosts.sh` pinned boot-MAC roster) | L3 | [D-143] | A.1 | both lenses succeed; LENS 2 returns zero unattributed records |
| A.3 | **R7 credential-revocation checklist** (owed artifact #4) -- SEC-026 client cred, SEC-028 service cred, SEC-029 rack-local PKI copy (shred), D-126 per-env SSH keypair (clean retirement, no successor), MAAS rack enroll-secret residue; enumerated from EVERY `vm-secret-locations` row keyed to the rack/`vr1-dcN-client` host class, not only the named examples | L5 (credential gate) | **[both]** -- owed BY D-143's re-IP ruling (owed-execution item 5); the credentials revoked are container-elim-eliminated host classes | A.2 (hosts still up and reachable) | every row individually confirmed revoked/shredded/rotated with captured command output (never asserted from memory); rows marked RETIRED, append-only |
| A.4 | MAAS machine-record release/delete [MUTATION, operator-gated per record class] (owed artifact #5, amended by pass2 to include `maas rack-controller delete` decommission of `vvr1-dcN`'s Office1 registration + the region's `primary_rack`/DHCP reference) | L3 | [D-143] | A.3 (revoke before the record that names the credential-bearing host disappears) | LENS 2 (A.2's check) re-run and now returns zero; region-side rack-controller/`primary_rack` residue confirmed clean |
| A.5 | Plan destroy, INNER root (`opentofu/vr1-dcN-substrate/`), from voffice1; capture pre-destroy `virsh list/net-list/pool-list --all` baseline while the containment VM is still reachable | L2 (old inner root) | [D-143] | A.4 | plan reviewed; baseline captured |
| A.6 | Plan destroy, OUTER root (vcloud): `-target=module.vvr1_dcN -target=module.vr1_dcN_uplink -target=module.vr1_dcN_storage` only -- **do NOT target mesh/netem modules** (mesh triangle survives the pivot, confirmed at Phase 2/pass2 4.5) | L1 (old containment shape) | [D-143] | A.5 | plan reviewed; mesh/netem legs confirmed excluded from the target set |
| A.7 | Apply destroys, INNER then OUTER (`tofu destroy` plans from A.5/A.6); verify each half from the host that can see it (inner via the containment VM's virsh before it's gone; outer via vcloud's own virsh after) | L2 then L1 | [D-143] | A.6; each destroy individually operator-approved (hard rule 3 -- destructive steps never batched) | inner half destroyed + verified; outer half destroyed + verified |
| A.8 | Untargeted `tofu plan` drift gate (outer root; equivalent check on any surviving DC's inner root) | L5 | [D-143] | A.7 | zero unexpected drift |
| A.9 | NetBox DCIM decommission of the `vvr1-dcN` device record(s) (`netbox/dc-rack-mgmt-import.py`) | system-of-record (cross-layer) | [D-143] | A.7 confirmed gone | record marked decommissioned in live NetBox |
| A.10 | Repeat A.1-A.9 per DC (Path A) or run the Path B batched form for both DCs at once | -- | [D-143] | A.1-A.9 per DC | both DCs' checkpoints torn down and drift-gated |

**A.10 note (site-down primitive):** D-122's one-command site-down (`virsh destroy
vvr1-dcN`) is still literally available during Part A (the shape being torn down still has
it) but is NOT used raw here -- module-scoped `tofu destroy` is the reviewed, gated path
(CLAUDE.md hard rule 4, the 2026-08-03 incident this rule exists to prevent). The
PRIMITIVE'S REPLACEMENT for the new flat shape is a Part-B design note (B.0), not built or
exercised during this teardown.

---

## PART B -- REDEPLOY on flat 10.13 (Option 1), as module invocations

### B.0 -- site-down primitive replacement (design note only; not an executable step)

Under Option 1 there is no single VM whose destruction equals "the DC is gone." The
target-state primitive is **one module/root-scoped `tofu destroy` against the flat root's
`vr1_dcN_*` module set** (owed artifact #1, root-shape-(B)-dependent; owed artifact #6 is
the emergency `virsh destroy` loop over the same root's state-listed domains as a distinct
non-gated lever). Neither is built during the redeploy itself -- noted here so B.4/B.8 do
not read as having silently re-earned it without a delivered artifact.

### B.1 -- prerequisites (run once, before any apply; GATES B.4)

| # | Module/artifact invoked | Layer | Tag | Depends-on | Gate that closes it |
|---|---|---|---|---|---|
| B.1.1 | **`dc-dc-whole-host-budget.py` FIT-calculator extension + fresh vcloud capacity re-measurement** (owed artifact #7, amended to include the 3 utility-node classes + artifact-service disk sizing) | L5 | **[both]** -- D-143 needs it for rebuild sizing; container-elim needs it to convert "~176 GiB freed" from directional to measured | -- | **>>> HARD GATE, closes before B.4's first apply <<<** live-measured host budget + extended FIT verdict for the flat 12+1-VM/DC roster, both DCs; a roster total exceeding the measured budget must FAIL, not be rounded or omitted (test A8) |
| B.1.2 | NetBox apex re-carve: mint B2 role `Cloud -- VR1 rebuild` owning `10.13.0.0/16`; re-carve VR1 prefixes/VIPs/ranges octet-preserving (D-143 owed-execution item 1) | system-of-record | [D-143] | -- | 10.13 prefixes exist under the new role; `Cloud` (10.12) role confirmed untouched |
| B.1.3 | `scripts/lib-net.sh`: flat defaults stay 10.12 (vr0-dc0 no-op preserved); `vr1-dc0`/`vr1-dc1` gain full 10.13 literal blocks; `:124-134` stale "inherits VR0" comment corrected (D-143 owed-execution item 2, F13) | L0 library | [D-143] | B.1.2 | `tests/lib-validate` green against the new literals |
| B.1.3a | 10.13 naming-collision DOCFIX (D-143 owed-execution item 3): `netbox/README.md:49` and `tests/dc-rack-mgmt-import/test_logic.py:265` reconciled so the /16 adoption doesn't leave a rack-IP test fixture inside the new Cloud space | doc/test currency | [D-143] | B.1.2 | repo-lint clean; no residual `10.13.0.5`-class fixture collision |
| B.1.4 | D-124 transit routes re-point + DC-side static shift (12->13) -- octet-preserving math is D-143; the BEARER host changes from `vvr1-dcN`'s rack-transit IP to the new `vr1-dcN-client` VM's transit leg (CE) | L1 (client-VM identity) / L0 (transit) | **[both]** | B.1.2 | NetBox shows the client VM's transit `/30` address; carried into B.4's client-VM module inputs |

### B.2 -- Office1 + vcloud prep (persists, off the container layer entirely)

| # | Module/artifact invoked | Layer | Tag | Depends-on | Gate |
|---|---|---|---|---|---|
| B.2.1 | vcloud host prep (Phase-0 runbook) | L0 | [unchanged] | -- | existing Phase-0 runbook gate |
| B.2.2 | Office1 headend standup (Phase-1 runbook), if not already up from the dc0 checkpoint -- voffice1 remains MAAS region host (D-132 addendum, unaffected) and remains Plane-2 host for whatever still needs a remote dial | L0/L1 | [unchanged] | -- | existing Phase-1 runbook gate |

### B.3 -- the NEW cross-DC isolation control (concern i) -- MUST precede B.4

| # | Module/artifact invoked | Layer | Tag | Depends-on | Gate |
|---|---|---|---|---|---|
| B.3.1 | Build + install the vcloud-level host isolation control (owed artifact #2): nftables artifact asserting no inter-plane/inter-DC forwarding on vcloud's own kernel; new SEC-NNN row (next-free SEC-034 per pass3 check 6); harness `tests/<name>` (C2, offline fixture model) | **NEW L5 artifact** (SEC-010's pattern, one layer up) | **[CE]** | B.2.1 (vcloud host prep) | **>>> HARD GATE, closes before B.4 <<<** `--check` enumerates the live bridge set for BOTH DCs' six planes and REFUSES if fewer than the full plane count resolves; must be installed and verified **before the first flat apply of EITHER per-DC root** (fork-robust invariant #1, honored regardless of root shape) |

### B.4 -- the flat apply (formerly outer + bootstrap-gate + inner), COLLAPSED into L1/L2

Root shape recommended (B) shared-outer + per-DC-flat roots (pass2 Section 3.1,
recommendation grade, Phase-4 ratifies). One apply CYCLE per DC.

| # | Module/artifact invoked | Layer | Tag | Depends-on | Gate |
|---|---|---|---|---|---|
| B.4.0 | Shared-outer root apply: mesh triangle legs (x3, MTU 9000) + uplink NAT `/24` -- already exist at vcloud level, UNCHANGED by flattening | L0 | [unchanged] | B.3 gate closed | existing mesh/uplink module state clean |
| B.4.1 | Per-DC-flat root apply invoking **`modules/dc-site`** (owed artifact #12, new IaC composition unit): composes storage pool (collapsed from 2-per-DC to 1) + six planes (`dc-planes`, unchanged CIDRs/MTU/family, D-139 unaffected) + DC edge (`opnsense-edge`, WAN input re-pointed to attach directly to `vr1_dcN_uplink` NAT, no `wan-bridge`) + 12 role/utility node VMs (`node-vm` x9 + juju-01 + maas-01 + tailscale-01) | L2 | **[CE]** structural; address VALUES inside these modules are **[D-143]** via B.1.3's lib-net literals | B.3 gate closed; B.1.1 FIT gate closed; B.1.3 lib-net literals present; B.1.4 client-VM address minted | apply succeeds (harness C1, `tests/dc-site`: 6-plane tree, 13-node roster incl. client VM = exactly one client-VM call, `mtu=1500` tenant / 9000 underlay, site-token parameterized, no hardcoded DC literal) |
| B.4.2 | Same `dc-site` composition, `client_vm` sub-call: the new **`vr1-dcN-client` VM** (`cloudinit-vm` module type, ~4/8192/80, octet `.8` metal-admin + D-124 transit leg per B.1.4) -- Option 1's non-hypervisor D-138 client host | L1 | **[CE]**, no D-143 content | B.4.1 (same apply) | client VM boots; identity confirmed live (not `lib-hosts.sh`/`CARVE_AUX_HOSTS`-tracked -- pass2 3.2 resolution) |
| B.4.3 | **MAC re-measurement pass** (owed artifact #8) -- 24 node MACs + 2 edge MACs move provider under the re-home; treat every MAC as unmeasured until re-pinned (hard rule 2) | L2 verify | [CE] | B.4.1 apply complete | live MAC roster captured and matches `dc-site`'s MAC invariant (rides C1's harness, pass3 3-rides list) -- **must close before B.6 trusts any MAC** |
| -- | *Vanished from the module set entirely (not re-homed, not a step):* `vvr1_dc0`/`vvr1_dc1` containment modules + sizing/rack-addressing/pubkey vars; the two `opentofu/vr1-dcN-substrate/` roots as separate roots/states; the qemu+ssh provider dial + D-126 keys (already revoked at A.3, no successor); `modules/wan-bridge` + `br-vr1-dcN-wan` netplan; the bootstrap gate's `--host-nodes` duty in `site-headend-install.sh` | -- | [CE] | -- | (deletion confirmed by B.4.1's module inventory containing none of these) |

### B.5 -- surviving duties, re-targeted (Phase-2 recommendation-grade placement; Phase-4 ratifies)

Pass1 left this OPEN ("THE highest-leverage open item"); pass2's W2.3 measurement
**largely dissolves it** -- carried here as pass2's recommended placement, explicitly
flagged not-yet-ratified.

| # | Module/artifact invoked | Layer | Tag | Depends-on | Gate |
|---|---|---|---|---|---|
| B.5.1 | **Rack-controller: RECOMMEND RETIRE the standalone Office1 enrollment entirely** (pass2 4.2(i)) -- both `vr1-dcN-maas-01` VMs already run `region+rack` (dc1 transcript-grade, dc0 functional-grade, `pass2-admin-report.md` check 2); NO `--role rack` re-enrollment step runs against the client VM. **A current-day live re-measure of both DCs' `primary_rack`/rackd state is OWED before this is treated as settled** (instrument-currency discipline) | L3 (was; now dissolved) | [CE] | B.4.1 (maas-01 exists) | live re-measure confirms `region+rack` on both fresh `-maas-01` VMs; A.4's decommission of the OLD `vvr1-dcN` rack record already closed this in Part A |
| B.5.2 | **D-131 forwarder: RECOMMEND RETIRE-WITH-EVIDENCE** for both DCs (pass2 4.2(ii)) -- each fresh 10.13 region sets its own BIND from the start; retirement evidence = a dig test against the fresh region's own BIND (owed artifact #13, harness C5). dc1's asymmetry (its forwarder was load-bearing pre-teardown) is a standing-RED case in C5 **until this live retirement is confirmed on the new build** | L3 verify (one-time evidence capture, not a standing service) | [CE] | B.4.1 (region exists), B.5.1 | dig-resolver-identity test PASSES against each fresh region's BIND (both DCs); captured into the build changelog |
| B.5.3 | Artifact-service (`.4`) placement -- **OPEN, sizing decision, not resolved here.** Neither the client VM (~80 GiB) nor `vr1-dcN-maas-01` (150 GiB earmarked, no spare) fits dc0's full mirror as authored; resolved WITH NUMBERS by B.1.1's extended FIT calculator (dc0 full-mirror vs dc1 cache per D-135) | L2/L3 storage | [CE] | **B.1.1 gate** (numbers), B.4.1 | a right-sized, explicitly-provisioned home is chosen and confirmed before B.6.6 (artifact-source verify) depends on it |
| B.5.4 | **SEC-010 transit-leg FORWARD-drop successor (concern ii)** -- endpoints RESOLVED by pass2 recommendation: client VM (DC side) + voffice1 (Office1 side); ONE extracted role-agnostic installer subcommand (out of `site-headend-install.sh`'s `node_host_setup()`) installs BOTH ends (owed artifact #3) | **NEW L5 artifact**, distinct from B.3 | [CE] | B.4.2 (client VM exists, its transit NIC re-measured -- NIC-naming trap: dc0 live was `enp1s0`, not `mgmt`) | harness A3 (`site-headend-install` Section-8 sub-case, migrated): both-ends fixture passes; wrong-role interface-name fixture FAILS; new SEC-row disposition (possibly a SEC-010 amendment) minted |

### B.6 -- MAAS enlist / commission / carve (largely unchanged mechanics; power-address value is BLOCKED)

**>>> Invariant #2, the load-bearing one for this section: owed artifact #11 (power-key
blast-radius mitigation) MUST close, with its harness green, before B.6.2 -- B.6.2 is the
edit that a 6-item test cluster is pinned to (pass3 Section 4). A guessed URI/key value
here is exactly the false-green mint the inferred-value rule (hard rule 2) exists to
prevent. <<<**

| # | Module/artifact invoked | Layer | Tag | Depends-on | Gate |
|---|---|---|---|---|---|
| B.6.1 | **Choose the concern-(iii) power-key mitigation mechanism** (owed artifact #11: `command=`-restricted SSH key / per-DC-scoped virsh wrapper / libvirt polkit ACL) -- required because BOTH DCs' region VMs + voffice1 now dial the SAME vcloud `qemu:///system` connection with no per-domain scoping (verified this pass, `pass2-admin-report.md` Section 2.3); root-shape (B) does NOT mitigate this (state isolation, not connection scoping) | **NEW L5 artifact** | [CE] | B.4.1 (flat topology exists to design against); B.2.1 (vcloud host prep) | **>>> HARD GATE <<<** harness C4 (offline rendered-ACL/`authorized_keys`/polkit parsing) green: dc0's key reaching a dc1 domain FAILS; reaching voffice1 FAILS (mirrored both directions); new SEC-NNN row minted with the mechanism |
| B.6.2 | `scripts/lib-hosts.sh` `VIRSH_POWER_ADDRESS_FROM_OFFICE1`/`_FROM_DCREGION` re-derivation to vcloud's own libvirtd (whether the FROM_OFFICE1/FROM_DCREGION split survives is itself a #11 design output) | L0 library | **[both]** -- D-143-shaped value change, CE-shaped mechanism dependency | **B.6.1 gate closed** | the SAME edit session closes A4 (`dc-selector`) + A5 (`maas-region-power-key` URI assertions) together -- editing one without the other is the named hazard H1 (a plausible-but-unenforced URI swap) |
| B.6.3 | `scripts/maas-node-power.sh` invocation-site/runbook literal updates -- no code change (address is `$1`, topology-agnostic) | L3 | [D-143 value] | B.6.2 | every invocation-site/runbook example carries the new address |
| B.6.4 | MAAS discovers node VMs via per-machine `power_type=virsh` (mechanism unchanged, D-123 amendment 2026-07-20 -- the pod/`vm-host` mechanism was already refuted before this pass; only the VALUE re-derives) | L3 | [D-143 value] | B.6.2, B.6.3 | discovery succeeds against the new power addresses |
| B.6.5 | Commission each node (Phase-3 Step 3); tag; nodes stay Ready; Pattern-A interface carve via `scripts/dc-node-carve.sh` (no code change, grep-verified zero containment hits, pure MAAS-API, `<site>`-parameterized) | L3 | [unchanged] | B.6.4, B.4.3 (MACs re-measured) | commission + carve succeed; single virsh hop, no "which host can see this domain" ambiguity (the old containment-layer confusion is structurally gone) |
| B.6.6 | PXE/boot-fabric verify (Step 6); per-DC artifact-source + time-authority verify (Step 7, target host = wherever B.5.3 lands); topology consistency check (Step 8) | L3 | [D-143 value for target host] | B.6.5, **B.5.3 resolved** | verify steps pass against the ruled artifact-service host |

### B.7 -- Juju + OpenStack bundle deploy (mechanically unchanged, host renamed)

| # | Module/artifact invoked | Layer | Tag | Depends-on | Gate |
|---|---|---|---|---|---|
| B.7.1 | Juju controller bootstrap on a tagged machine, run FROM the `vr1-dcN-client` VM (D-138 execution host, "never the vcloud jumphost" doctrine intact) -- same commands, renamed host from `vvr1-dcN` | L4 | **[both]** -- mechanics [D-143] unchanged, execution-host identity [CE] changed | B.4.2 (client VM up), B.6.6 (enlist/commission/carve complete) | `preflight.sh` gate (incl. new P10 for B.5.4, P4 dependent on B.6.1's mitigation, P8's declared-root-list loop replacing the single hardcoded `opentofu/` path) |
| B.7.2 | model/spaces setup, DC egress gate (`dc-egress-check.sh`, invocation-host literal re-points to the client VM), `juju deploy bundle.yaml` + overlays, dry-run first, mid-deploy watch | L4 | [unchanged mechanics] | B.7.1 | Phase-4 runbook's own dry-run + watch gates |
| B.7.3 | SEC-026/028/029 credentials (re-)MINTED on the client VM -- Part A step A.3 already revoked the old copies; this is a clean mint, not a migration (pass1 check 7 reconciliation) | L4 credential | **[both]** | B.7.1 | ledger register rows (P5 creds-matrix) re-point to the `client` host class; new rows added for B.3/B.5.4/B.6.1's own key material |
| B.7.4 | vault bring-up (Step 5), IPv6 family-matrix overlay (Step 6), phase-03/04/05 steps (7-9), `cloud-assert.sh --capture` (Step 10), controller backup (Step 11) | L4/L5 | [D-143 for literal addresses; mechanics unchanged] | B.7.2 | existing Phase-4 gates, unchanged content |
| B.7.5 | **VERIFY-LIVE gates** (Step 12): Ceph-over-v6 bind check (D-143 new literals); `geneve-encap-assert.sh` (owed artifact #10 -- MTU budget analytically unchanged by container-elim, live assert still owed as a NEW invocation point, not a script edit); **PLUS the B.3 (a)-control's `--check` RE-RUN**, now that both DCs' planes are actually co-resident on vcloud -- the first point in the whole sequence where the isolation claim is tested against real traffic (cloud-assert A11a periodic re-verify begins here) | L5 | [D-143] for Ceph literals; **[CE]** for the (a)-control re-run and the geneve re-invocation point | B.7.4 | Ceph bind check passes; geneve-encap-assert passes; (a)-control `--check` passes with BOTH DCs' planes live |

### B.8 -- close-out (both axes)

| # | Module/artifact invoked | Layer | Tag | Depends-on | Gate |
|---|---|---|---|---|---|
| B.8.1 | NetBox DCIM: register the new `vr1-dcN-client` VM + the flat node roster device records (owed artifact #9; mirrors A.9's decommission, opposite direction) | system-of-record | [CE] | B.4.1, B.4.2 | roster fully registered in live NetBox |
| B.8.2 | **Enter the container-elim [ARCH] decision record** (D-123 amendment vs. new D-number; ride-alongs: D-125 bridge-in retirement, D-138 concrete-host change, D-128 amendment -- Plane 2 shrinks to MAAS/NetBox, D-122 site-down re-earn, D-124 sizing-void re-cause, D-132-addendum premises note, Stage-3 Owns/Reuse-vs-new rewrite, the client-VM `.8` octet into the D-134 map) | -- (decision-record, not a build step) | [CE] | all of Part B substantively complete | operator ruling recorded (GA-R5) -- **the redeploy is NOT "done" while this is owed**, per SCOPE Section 7 |

---

## Bare-metal-test plug-in points (pre-Roosevelt, hardware specs owed "within days")

Per the operator's own framing and D-138's history (the client VM is explicitly "the D-138
Roosevelt bastion analog, rehearsed early," `pass0-admin-report.md` Section 4), the specs
plug into **sizing and provider targets inside existing steps**, not a new sequence. Split
by whether a step is hardware-PARAMETERIZED (re-run with new numbers/roster once specs
land) or hardware-AGNOSTIC (unaffected either way):

**Hardware-parameterized (specs plug in directly):**
- **B.1.1** -- capacity/FIT math re-derives from real host specs instead of vcloud's
  measured budget; the node-class roster may shrink ("a smaller set of hardware").
- **B.4.1/B.4.2** -- `dc-site`'s module bodies (planes x6, edge, node roster, client VM)
  are the SAME composition intended to transfer; the specs let sizing be re-derived for
  bare metal without changing which modules exist or their call order -- only the provider
  target (bare libvirt host vs vcloud-hosted VM) and concrete sizing numbers change.
- **B.4.3 / B.6.4** -- MAC handling: bare metal uses real NIC MACs discovered via MAAS
  enlistment, not libvirt-injected MACs from a tofu module -- the RE-MEASUREMENT discipline
  transfers, the injection mechanism does not.
- **B.5.3** -- artifact-service sizing is explicitly hardware-dependent (disk on real
  spinning/SSD capacity vs a vcloud-hosted volume).

**Hardware-agnostic (unaffected; the reusable asset IS the sequence/module shape):**
- **B.1.2/B.1.3** -- NetBox/lib-net addressing is pure IPAM, runs identically regardless of
  substrate.
- **B.6.5** -- carve scripts (`dc-node-carve.sh` etc.) are already `<site>`-parameterized,
  pure MAAS-API; grep-verified zero containment hits (pass2 3.3).
- **B.7** -- Juju/bundle deploy mechanics are unchanged by substrate class (D-140 pins L4 as
  procedure regardless).
- **The module INVOCATION ORDER itself (B.1 -> B.8)** is the reusable deliverable -- the
  "layered module system" the operator asked this pass to produce IS the thing rehearsed
  early, independent of whether L1/L2 target vcloud-libvirt VMs or bare hosts.

**Two controls that likely do NOT transfer as-is (flag explicitly, do not let a future
session assume parity):**
- **B.3's (a) cross-DC isolation control** is an artifact of hosting BOTH DCs' plane
  bridges on ONE vcloud-libvirt kernel. Genuinely separate physical hardware per DC at
  Roosevelt would not have this specific exposure -- the CONTROL PATTERN (host-level
  forwarding assertion) may still be good practice, but the gap it closes here may not
  exist at bare metal. Phase-4 should note this, not assume the artifact ships unchanged.
- **B.6.1's power-key mitigation (#11)** is a libvirt/`qemu:///system`-connection-scoping
  problem specific to multiple VMs dialing one shared hypervisor's virsh. Bare-metal power
  management (IPMI/Redfish, not virsh) is a structurally different credential-scope
  problem; the MITIGATION DISCIPLINE (per-DC credential separation, verified by a negative
  test) transfers, the concrete artifact does not.

**Nesting-depth honesty (carried from `pass1-w3-sequencing.md` Part D, not restated as new
here):** flat-Option-1 = `vcloud (libvirt) -> node VM -> nova KVM guest`, depth 2
(VR0-proven). Roosevelt bare metal = `bare host -> KVM guest`, depth 1. The flattening
rehearses the MODULE SHAPE and the single-apply/no-bootstrap-gate WORKFLOW, not the exact
nesting depth.

**B.5's placement should be RE-DECIDED, not carried forward blindly, once hardware specs
exist** -- a bare-metal build may have a materially different answer for where MAAS-rack/
D-131/artifact-service duties land than a VM-hosted `vr1-dcN-client` does (this echoes
`pass1-w3-sequencing.md` Part D verbatim; not re-derived, cited).

---

## Sources read this session

`SCOPE-AND-EXECUTION-PLAN.md` (full), `pass0-admin-report.md` (full), `pass1-admin-report.md`
(full), `pass1-w3-sequencing.md` (full), `pass2-admin-report.md` (full), `pass3-admin-report.md`
(full), plus `docs/design-decisions.md:8083-8182` (D-143 full ruling + owed-execution list,
re-read directly this session to confirm the five owed-execution items and their exact
wording). No inferred values used; every module name, owed-artifact number, and gate
condition traces to the cited pass document. Items marked OPEN/RECOMMENDATION-GRADE above
are stated as such, not silently upgraded to settled.
