Date: 2026-07-24. Branch: dc-dc-stage4-phase3-maas-deploy. Convened by: operator ("Have subagents deploy a deployment script review for additional cross connections, updates, associations, and pinning updates that are also needed based on the stack expansion").
Status: ADVISORY / audit record. Findings dispositioned below (handled in the render / follow-up / VERIFY-LIVE / no-change). Adopts nothing. docs/CURRENT-STATE.md remains the status authority (GA-R1). Companion to docs/audit/committee-20260724-track2-bundle-render.md.
Three independent read-only reviewers (relations/bindings/cross-DC; config/pins/channels; deployment-scripts). Every load-bearing claim was re-checked against the repo before recording.
bundle.yaml carried VR0's 4 openstack0-3 provider MACs (52:54:00:*); re-homed to the 2 dc1 COMPUTE nodes' provider-public (enp2s0) MACs 52:54:01:d1:04:02 / 52:54:01:d1:05:02 (ovn-chassis is subordinate to the 2-unit nova-compute). NOTE: these are the substrate-PINNED values (scheme 52:54:01:d1:NN:PP, provider = NIC ordinal :02, opentofu/vr1-dc1-substrate/main.tf) -- config-carried as-built, not inferred; still confirm at juju deploy --dry-run.overlays/dc-ha-scaleup.yaml was corrected to 4.preflight.sh gates the wrong artifact -- runs provider-bundle-check.py bundle.yaml BARE (base bundle, default dc0 bands, role tags absent so placement self-skips). Must invoke the real dc1 deploy input: --overlay overlays/vr1-dc1-machines.yaml --overlay overlays/vr1-dc1-vips.yaml --overlay overlays/dc-ha-scaleup.yaml --dc vr1-dc1 (the checker already supports this; only the call site is VR0-frozen). RENDER-ADJACENT.pre-flight-checks.sh is VR0-frozen -- never calls the $DC selectors; VIP band vars are dc0 (and unset under the vr1-dc1 lib-net arm -> trips set -u); host loops resolve by hostname (host_sysid) but VR1 MAAS hostnames are random -- must use host_sysid_by_bootmac "${HOST_BOOT_MAC[$h]}". Fails every dc1 node as written.cloud-assert.sh false-passes decorative HA -- only quorum-checks mysql (A2) + ovn-central (A3); the 12 scaled hacluster-fronted API services get no pacemaker-quorum / VIP-ownership assertion, so a VIP parked on one node (the exact cluster_count-still-1 failure D-121 targets) passes clean. Needs a per-hacluster "3 online / VIP owned" check before the post-deploy acceptance gate.juju bootstrap unconstrained (phase-4 Step 2) -- with 9 Ready nodes tagged openstack-vr1-dc1 in a region that sees both DCs, an unconstrained bootstrap can grab a bundle node. Needs a distinct controller tag + --constraints tags=<controller-tag> (pairs with the D-104-amendment 10th VM).lib_hosts_select_dc vr1-dc1 "fails loud until populated"; it was populated 2026-07-23. Fold into the Step-4 de-stale.ceph-remote (peer ceph-mon) and radosgw multisite (realm/zonegroup/zone + sync) are absent; both are cross-model / cross-controller (D-104) and staged as DR follow-ups per D-108's "prove one-way first".cluster_count -- confirm it means "peers required before VIP binds"; else the VIP can bootstrap off one node (decorative HA).dc-ha-scaleup.yaml scales vault -> 3 + vault-hacluster cluster_count: 3 + re-adds [vault:ha, vault-hacluster:ha], but NO vip: is set on vault anywhere (base or overlays) -- it was dropped with BUNDLEFIX-002 when vault was de-HA'd. D-020 [corrected DOCFIX-201: D-020, not D-036] lists vault among the apps carrying provider+metal VIPs. Without a VIP, kv consumers (barbican-vault -> vault:secrets) get one unit's vault_url, not a stable HA endpoint = decorative HA. Fix = add a dc1-band vault VIP in an overlay (needs a band octet) + the vault-HA VERIFY-LIVE (section C). designate is VIP-less BY DESIGN (dnsaas), not a regression -- the contrast confirms the class.overlays/vr1-dc1-vips.yaml (v4-only, concrete dc1 bands) and overlays/dc-dc-ipv6-family-matrix.yaml (v4+v6, unrendered {{TOKEN}}s) BOTH own vip: for the same 10 apps; overlay merge is per-key REPLACE, so applying both = last-wins (dual-stack lost, or literal tokens deployed). Only bites if both are applied together: a v4-first phase-4 deploy uses only vr1-dc1-vips (no collision). Operator decides whether dc1 phase-4 is v4-only (defer IPv6) or dual-stack (forces reconciling the two overlays into ONE vip string per app now).vr1-dc1-machines.yaml) -- documented juju behavior, but no offline merger exists to prove it here; confirm at juju deploy --dry-run. Fallback: inline the dc1 tags into a rendered dc1 bundle.octavia:ovsdb-cms -> data-tenant + ovn-chassis-octavia on control, ovn-chassis on the 2 compute nodes -- all satisfied. (Caveat: holds ONLY while the uniform-6-NIC decision stands.)lib-hosts.sh vr1-dc1 arm is complete + measured (9 role nodes, octet bands, boot MACs, per-DC tag) -- not a placeholder.provider-bundle-check.py placement section is role-aware + harnessed (this session).cloud-assert.sh A2/A3 already expect 3 units (mysql/ovn). ceph-osd=4, expected-osd-count: 4, monitor-count: 3, reserved-host-memory: 8192 (D-040, ruled retained) all correct.openstack0-3 loops live only in the VR0 teardown/reenroll path, not the dc1 deploy path.These findings motivate a NetBox->deploy coupling (a per-DC renderer/pipeline that GENERATES the overlays + tfvars from NetBox IPAM, making the deploy gates DC-aware and eliminating the hand-render fragility + the VIP-overlay collision by construction). Being scoped as a new PROPOSED D-number (NetBox-deploy coupling; next-free per ledger-scan) in the design-discussion seat (Chat). This is the escalation of the committee's Fork-2 (deferred renderer tool).