DRAFT -- proposal, NOT ruled, NOT committed. This is a planning artifact only. It does not touch live NetBox, live infra, lib-net.sh, the overlays, or any other authoritative surface. No git commit. It exists to let the operator rule the re-IP (F1 pivot, below) with the full blast radius in view.
scripts/lib-net.sh (full), netbox/draft/vr1-office1-current-20260801.json, docs/design-decisions.md (D-115, D-134), and a repo-wide grep sweep for 10.12. literals. Every value below is measured from those files this session; none is inferred.docs/audit/queued-findings-20260808-...-reip-pivot.txt F1).docs/audit/queued-findings-20260808-dc0-tailscale-incident-reip-pivot.txt F1 records the operator pivot verbatim: the VR1 build's 10.12.0.0/16 collides with the still-online IPv4 single-DC cloud (the NetBox draft that seeded VR1 was that cloud's external export). It surfaced at the Headscale step -- advertising 10.12.8.0/22 overlaps the live cloud on the shared tailnet, and Headscale has no 4via6, so routes must be non-overlapping. Operator plan: drive dc0 to a full-deployment checkpoint, then teardown + redeploy on 10.13.0.0/16 -- a fresh subnetting build, never editing live infra.
This draft is the addressing half of that redeploy. It is a greenfield build on a free /16, so "re-IP" here means "author the new plan"; there is no live-object edit.
10.12.a.b -> 10.13.a.b for every DC (Cloud) address. Second octet 12 -> 13; octets 3 and 4 unchanged.
This preserves, exactly and by construction:
10.12.64.0/19 -> 10.13.64.0/19 /19 supernet (D-115),.4/.5/.6/.7) and the .4-.49 / .50-.99 bands,Only the DC (Cloud-role) 10.12 space moves. Everything else stays (Section 6).
vr1-dc0; flat /22s, D-052/D-053 offsets)| Role | Before (10.12) | After (10.13) |
|---|---|---|
| provider-public | 10.12.4.0/22 | 10.13.4.0/22 |
| metal-admin | 10.12.8.0/22 | 10.13.8.0/22 |
| metal-internal | 10.12.12.0/22 | 10.13.12.0/22 |
| data-tenant | 10.12.16.0/22 | 10.13.16.0/22 |
| storage | 10.12.32.0/22 | 10.13.32.0/22 |
| replication | 10.12.36.0/22 | 10.13.36.0/22 |
vr1-dc1; contiguous /22s inside the 10.12.64.0/19 supernet, D-115)| Role | Before (10.12) | After (10.13) |
|---|---|---|
| (supernet) | 10.12.64.0/19 | 10.13.64.0/19 |
| provider-public | 10.12.64.0/22 | 10.13.64.0/22 |
| metal-admin | 10.12.68.0/22 | 10.13.68.0/22 |
| metal-internal | 10.12.72.0/22 | 10.13.72.0/22 |
| data-tenant | 10.12.76.0/22 | 10.13.76.0/22 |
| storage | 10.12.80.0/22 | 10.13.80.0/22 |
| replication | 10.12.84.0/22 | 10.13.84.0/22 |
PLANE_GW) -- unchanged posture, shifted valuePer D-134 the .1 gateway exists on the provider-public subnet ONLY; metal-admin and the four data planes are gw=none (measured; MAAS returns none, .1 is held by NOTHING on both DCs). The VR0-only vr0-dc0 arm additionally pins metal-admin 10.12.8.1 -- that arm is NOT part of this rebuild (it is the live cloud; see OQ (a)/(c)).
| Plane | Before | After |
|---|---|---|
| vr1-dc0 provider-public gw | 10.12.4.1 | 10.13.4.1 |
| vr1-dc1 provider-public gw | 10.12.64.1 | 10.13.64.1 |
| all other planes, both DCs | none | none |
| Item | Before | After |
|---|---|---|
| dc0 VIP_PREFIX_PROVIDER | 10.12.4 | 10.13.4 |
| dc0 VIP_PREFIX_ADMIN | 10.12.8 | 10.13.8 |
| dc0 VIP_PREFIX_INTERNAL | 10.12.12 | 10.13.12 |
| dc0 KEYSTONE_VIP_DEFAULT | 10.12.4.50 | 10.13.4.50 |
| dc1 VIP_PREFIX_PROVIDER | 10.12.64 | 10.13.64 |
| dc1 VIP_PREFIX_ADMIN | 10.12.68 | 10.13.68 |
| dc1 VIP_PREFIX_INTERNAL | 10.12.72 | 10.13.72 |
| dc1 KEYSTONE_VIP_DEFAULT | 10.12.64.50 | 10.13.64.50 |
VIP band .50-.99 (VIP_OCTET_MIN=50, VIP_OCTET_MAX=99), VIP_COUNT_EXPECT=13 (11 + vault .61 + designate .62, R11) -- all UNCHANGED. The 13 service VIP octets (.50 keystone .. .62 designate) are octet-preserved on each of the three legs.
Each plane carries a .4-.49 utility band and a .50-.99 VIP band (NetBox ip-ranges). The D-134 utility octet map (extended by D-129(iii)(a) for .7) rides the metal-admin plane:
| Octet | Role | dc0 before / after | dc1 before / after |
|---|---|---|---|
| .4 | artifact mirror | 10.12.8.4 / 10.13.8.4 | 10.12.68.4 / 10.13.68.4 |
| .5 | juju controller | 10.12.8.5 / 10.13.8.5 | 10.12.68.5 / 10.13.68.5 |
| .6 | MAAS region | 10.12.8.6 / 10.13.8.6 | 10.12.68.6 / 10.13.68.6 |
| .7 | tailscale subnet router | 10.12.8.7 / 10.13.8.7 | 10.12.68.7 / 10.13.68.7 |
(The .4-.49 / .50-.99 band ip-ranges exist on ALL six planes per DC, 24 ranges total; each shifts by the same 12->13 rule.)
| DC | Before | After | Size |
|---|---|---|---|
| vr1-dc0 | 10.12.5.0 - 10.12.7.254 | 10.13.5.0 - 10.13.7.254 | 767 addrs |
| vr1-dc1 | 10.12.65.0 - 10.12.67.254 | 10.13.65.0 - 10.13.67.254 | 767 addrs |
Each sits inside its DC's provider-public /22 and does not overlap the D-134 .4-.49 / .50-.99 bands. These pools are RESERVED ipranges on the MAAS provider subnet (KI-P3-001), asserted by scripts/phase-04-network-verify.sh -- they are NOT NetBox ip-range objects (the office1 draft holds no FIP-pool range). The re-IP therefore touches MAAS ipranges at build time; NetBox has a standing record gap here.
| Host | Before | After |
|---|---|---|
| vvr1-dc0 | 10.12.8.2/22 | 10.13.8.2/22 |
| vvr1-dc1 | 10.12.68.2/22 | 10.13.68.2/22 |
vr1-office1-current-20260801.json)Counts of objects whose value lies in 10.12 and would shift to 10.13 under the 1:1 rule:
| Object class | Count | Notes |
|---|---|---|
| ipam/prefixes | 13 | 10.12.0.0/16 Cloud + twelve plane /22s (6 dc0 + 6 dc1) |
| ipam/ip-ranges | 24 | D-134 .4-.49 + .50-.99 bands, 2 per plane x 12 planes |
| ipam/ip-addresses | 80 | 78 VIP legs (13 services x 3 legs x 2 DCs) + 2 rack .2 statics |
| ipam/aggregates | 0 | 10.0.0.0/8 is the parent; it ALREADY covers 10.13 -- no change |
| ipam/vlans | 0 | none present in the draft |
| dcim/regions,sites | 0 | topology objects carry no v4 literal -- no change |
Two structural observations (feed OQ (b), not defects):
10.12.64.0/19 has no NetBox prefix object -- only its six child /22s are present. If the plan wants the supernet represented, that is a new object either way.10.12. literals)The re-IP is not a NetBox-only change. lib-net.sh names its own twins-of-record (opentofu/variables.tf vr1_dc1_planes; overlays/vr1-dc*-vips.yaml; provider-bundle-check.py's independent octet band). Grouped literal-bearing LIVE surfaces (historical asbuilt/ snapshots and docs/audit/osd-carve-* frozen captures EXCLUDED -- those are verbatim records, not to be edited):
| Surface class | Files | 10.12 literal hits | Key members |
|---|---|---|---|
| scripts/ | 27 | 246 | lib-net.sh (source of truth), phase-00-maas-standup, dc-rack-net, dc-snap-proxy |
| overlays/ | 3 | 77 | vr1-dc0-vips.yaml, vr1-dc1-vips.yaml (ratified VIP source, D-119 R9) |
| opentofu/ | 4 | 35 | variables.tf (vr1_dc1_planes -- lib-net.sh's named twin) |
| netbox/ importers + drafts | 11 | 257 | dc-dc-prefixes-import, dc-plane-apex-import, dc-util-hosts-import, d120-compose-bands, the draft JSONs |
| bundle.yaml | 1 | 16 | deploy input (VIPs) |
| tests/ harnesses + fixtures | 62 | 724 | dc-selector (re-parses the overlay), provider-bundle-check, render-baseline, phase-04 fixtures |
| runbooks/ | 22 | 194 | procedure text citing plane CIDRs |
| docs/ prose | 85 | 1337 | design-decisions, CURRENT-STATE, audit -- prose record; update via new dated entries, do NOT rewrite |
Discipline note: each script change ships with its tests/<name>/run-tests.sh green, repo-lint clean, and a changelog entry (per CLAUDE.md). The two-file twins (lib-net.sh <-> opentofu/variables.tf, and lib-net.sh <-> overlays/*-vips.yaml via tests/dc-selector) must change in the SAME commit. This inventory is scope visibility for the ruling, NOT a per-line remediation plan.
Stale 10.13 reference already in-repo (pre-D-115): netbox/README.md:49 still shows VR1_DC1_V4_SUPERNET=10.13.0.0/19, an importer default that D-115 superseded (dc1 became 10.12.64.0/19). Reusing 10.13 as the rebuild /16 is unrelated to that old /19 default, but the stale line should be reconciled so the two 10.13 meanings do not confuse.
| Space | Value | Why it stays |
|---|---|---|
| Rack transit /30s | 172.31.0.0/30 (dc0), 172.31.0.4/30 (dc1) | Not in 10.12; D-124 Scheme A. See caveat below. |
| Office1 LAN / compose | 10.10.0.0/22 (10.10.0.0/24, 10.10.1.0/24) | Office role, D-115; not part of the DC space. |
| Edge (sim ISP/WAN) | 172.30.0.0/16 (office1-wan 172.30.1.0/24) | Edge role, D-115. |
| Dev clouds | 10.16.0.0/16, 10.17.0.0/16 | Willamette / Roosevelt dev; unrelated. |
| Aggregate | 10.0.0.0/8 | Parent of BOTH 10.12 and 10.13 -- unchanged, 10.13 falls under it. |
| IPv6 (all) | 2602:f3e2::/36 GUA, fd50:840e:74e2::/48 ULA | This is a v4-only re-IP; v6 is region-hierarchical and untouched. |
Caveat -- transit ADDRESSES stay, transit ROUTES do not. The 172.31.0.x /30 endpoint addresses are unchanged, but the routes carried OVER them point at 10.12.* DC destinations today and must be re-pointed to 10.13.* at rebuild. Flagged so "transit unchanged" is not misread as "transit needs no work."
.201-.254, not a recalled .100-.200.)10.12.8.0/22 -> 10.13.8.0/22 (metal-admin), and the Headscale ACL that references the advertised metal-admin prefix per D-129(iii)(b) star model.bundle.yaml, overlays) -- deploy inputs.(a) Confirm 10.13.0.0/16 is genuinely free -- LIVE, not just in a snapshot. The 10.13 scan in this draft was against vr1-office1-current-20260801.json (a dated snapshot) -- absent there, NOT a measured live absence. Before committing, confirm 10.13.0.0/16 is free of (i) the still-online IPv4 single-DC cloud, and (ii) anything advertised on the shared tailnet (the exact class of overlap that caused the pivot). 10.14/10.15 also sit free between 10.13 and the 10.16/10.17 dev clouds, if a range choice is wanted.
(b) Exact 1:1 shift, or regularize a wart while greenfield? The 1:1 shift preserves everything but also PRESERVES dc0's non-contiguous offsets (4/8/12/16 then jump to 32/36, skipping 20/24/28) and the resulting dc0-vs-dc1 asymmetry (dc1 fits a /19; dc0 cannot). A greenfield /16 is the only cheap moment to regularize dc0 into a contiguous, /19-shaped block symmetric with dc1 -- at the cost of breaking octet-preservation and diverging further from the Roosevelt/VR0 layout D-101 was built to inherit. Presented as an option with its cost; NOT recommended here.
(c) This re-IP needs a GA-R5 ruling BEFORE any dependent work. Governed by D-101 / D-115 / D-124 / D-134 (F1). The number is deliberately NOT minted here -- grep next-free D-NNN at ruling time. Two reconciliations the ruling must make explicit:
lib-net.sh's vr1-dc0 arm exists because D-101 rules VR1 DC0 inherits VR0 DC0's v4 layout unchanged, and the live 10.12 cloud IS vr0-dc0. Moving VR1 to 10.13 ends that inheritance: vr0-dc0 STAYS on 10.12 (live, untouched); the vr0-dc0 and vr1-dc0 case arms genuinely split for the first time, and lib-net.sh's lines 124-134 comment ("Same PLANE values as vr0-dc0 ... INHERITS VR0 DC0's v4 layout UNCHANGED") becomes FALSE and owes an update.10.12.0.0/16 and explicitly superseded a 10.13.0.0/19 recommendation because 10.13.x was unallocated. Its option (b) even floated a per-region /16 (VR1 = 10.15.0.0/16) and the operator chose role-based instead. Picking 10.13.0.0/16 now REVIVES 10.13 as an allocation and must decide: does the NetBox Cloud role/prefix move to 10.13.0.0/16 (leaving the live cloud's 10.12 as its own record), does 10.13 become a NEW role (e.g. "Cloud -- VR1 rebuild") coexisting with the 10.12 Cloud, and is this a D-115 amendment or a superseding decision? This is a genuine fork in the IPAM apex, not a mechanical shift.Proposed: octet-preserving 10.12.a.b -> 10.13.a.b for the entire VR1 Cloud DC space (both DCs), everything else held. Remapped: 12 planes (6 per DC), 13 prefixes, 24 ip-ranges, 80 ip-addresses (78 VIP legs + 2 MAAS rack statics), 2 FIP pools (MAAS ipranges), 2 keystone VIPs, 1 provider gateway per DC. Held: 172.31 transit addresses (routes re-point), 10.10 office, 172.30 edge, 10.16/10.17 dev, all IPv6, the 10.0.0.0/8 aggregate.
DRAFT -- proposal, not ruled, not committed.