# changelog 2026-08-07 -- dc1-region standup sequence ("sequence and continue")

Session scope: sequence and execute the enumerated NEXT threads (dc1 region buildout,
NetBox recording, hygiene). Status lives ONLY in `docs/CURRENT-STATE.md`; this file is
the per-session body (GA-R2). Each item states what / why (evidence) / how to revert.

---

## Item 1 -- NetBox tool GAP closed + as-built utility hosts LANDED into office1-netbox

**What.** New tested importer `netbox/dc-util-hosts-import.py` (+ harness
`tests/dc-util-hosts-import/` 19/19) that records a D-134 utility-band HOST's
ip-addresses (both planes) into the apex, then landed the four as-built hosts:

| host | metal-admin | provider-public | ids |
|---|---|---|---|
| vr1-dc0-juju-01 (.5)      | 10.12.8.5  | 10.12.4.5  | 187, 188 |
| vr1-dc0-maas-01 (.6)      | 10.12.8.6  | 10.12.4.6  | 189, 190 |
| vr1-dc0-tailscale-01 (.7) | 10.12.8.7  | 10.12.4.7  | 191, 192 |
| vr1-dc1-maas-01 (.6)      | 10.12.68.6 | 10.12.64.6 | 193, 194 |

Fidelity: apex `ipam/ip-addresses` 186 -> 194 (+8); idempotent re-run reports
`EXISTS / created: 0`. Target `office1-netbox` (10.10.1.10, DOCFIX-195 sandbox apex).

**Why.** Landing the operator-flagged NetBox-pending list (changelog-20260807
Item 11) hit a tool gap: `dc-plane-apex-import.py` had loaded the D-134 utility
RANGES (.4-.49) and the VIP addresses (.50-.62), but NO importer recorded the
individual utility-HOST assignments within the band -- all 16 candidate host IPs
measured absent. Per CLAUDE.md hard rule 4 the gap was declared (operator ruled
"Build importer, then land") and NOT improvised as raw API POSTs.

**Design (advisor-reviewed).** DERIVED, never hardcoded: plane CIDRs from
`lib-net.sh`, host octet from `lib-hosts.sh` (an empty/missing octet is a hard die --
the clean-zero failure class). ONE host per invocation (liveness is operator-asserted;
no L3 path apex->DC plane, SEC-010). Whole-plan preflight (both planes) before any
create; the D-134 utility RANGE is the precondition (a missing range dies). dns_name
collision guard; SANDBOX_HOSTS + `--yes-write-upstream` gate; WAF-safe UA. dns_name
carries each ruled `vr1-dc<N>-<role>-NN` name -> the dc0 RENAMES are recorded by
construction (there were no stale old-name records to rename).

**Scope boundary / deferred (queued findings).**
- The `.4` ARTIFACT host (dc0 apt mirror / dc1 caching proxy, D-135) is OUT of this
  importer: it is not a `lib-hosts` host, is metal-admin-ONLY (`10.12.8.4` /
  `10.12.68.4`, no provider-public leg -- measured from `dc-mirror.sh`/`dc-cache-proxy.sh`
  LISTEN_CIDR), per-DC divergent, and has no host NAME anywhere in the repo. Recording
  it needs an operator naming ruling -- a separate finding, not this tool.
- dc1 `.5` juju-01 + `.7` tailscale-01: record WHEN LIVE (juju not yet bootstrapped;
  tailscale planned, rebuilt in step E). The `vr1-dc1-region` MAAS region needs no
  separate NetBox object -- the apex `dcim/regions` are geographic (US-West / VR0 / VR1),
  not MAAS regions; the region VM is represented by its `.6` ip-addresses.

**How to revert.** This is a NetBox state change, not a git revert. Delete the 8
ip-addresses by address from `office1-netbox` (ids 187-194, or by the four host
dns_names), e.g. `DELETE /api/ipam/ip-addresses/<id>/`. The importer itself and its
harness are removable with `git rm netbox/dc-util-hosts-import.py tests/dc-util-hosts-import/`
+ `bash scripts/run-tests-all.sh --record-manifest`.
