diff --git a/docs/CURRENT-STATE.md b/docs/CURRENT-STATE.md index 8945165..cc98278 100644 --- a/docs/CURRENT-STATE.md +++ b/docs/CURRENT-STATE.md @@ -1383,14 +1383,19 @@ flip preflight pass -> fail and **no deploy path that was open is closed** -- the P5 precedent above. Both reds are the ruled gate reporting real work owed: R11's vault `.61` / designate `.62` are RULED-BUT-NOT-BUILT, and per R6 they land BEFORE the HA overlay. - Harness **28/28** (was 15), gauntlet **ALL GREEN (84) ON vcloud** (host named -- the gauntlet + Harness **30/30** (was 15), gauntlet **ALL GREEN (84) ON vcloud** (host named -- the gauntlet is measured host-dependent), repo-lint 0 fail / 604 files scanned. **THREE HARNESS CASES WERE RE-POINTED, NOT DELETED** (the standing rule): the fixture base split into a pristine repo bundle and one carrying designate's ruled `.62`, so the rc=0 cases still assert their own invariant while NEW case T16 keeps the real tree honest by asserting the pristine bundle DOES trip invariant 8. **When `.62` lands in `bundle.yaml`, T16 must be re-pointed, not deleted.** The gate was proven able to BOTH fail and pass (T16 red / T18 green on the same check) -- - the complement invariant this branch established. + the complement invariant this branch established. **T29/T30 exercise the dc1 arm of the apex + lookup**, which no other case reached (T19-T23 all run at the default dc0): dc1's bands resolve + and pass, and a dc0 v6 leg under `--dc vr1-dc1` FAILS, so a cross-DC copy-paste of a rendered + overlay cannot pass. **`preflight` classifies this checker's new exit-2 refusal correctly** -- + P2 rc=2 is already ruled could-not-evaluate -> FAIL (`preflight.sh:36,81`) and harness case + T14 locks it, so a refusal can never downgrade to a warning. **APEX RE-VERIFIED LIVE the same session** (operator question: was the IPv6 actually pushed last session): `http://10.10.1.10:8000` reports ip-addresses **160**, IPv6 **78**, VIP-described **156** (78 v4 / 78 v6, 78 dc0 / 78 dc1), ip-ranges **27**, prefixes **139 / 103 IPv6** -- matching diff --git a/docs/changelog-20260728-vip-arity-gate.md b/docs/changelog-20260728-vip-arity-gate.md index ecd6052..e95026e 100644 --- a/docs/changelog-20260728-vip-arity-gate.md +++ b/docs/changelog-20260728-vip-arity-gate.md @@ -93,9 +93,9 @@ **Revert.** Revert this commit; the constants and the invariant-8 block are contiguous and independent of item 1. -## 3. Harness: 15 -> 28 cases, with three cases RE-POINTED rather than deleted +## 3. Harness: 15 -> 30 cases, with three cases RE-POINTED rather than deleted -**What.** `tests/provider-bundle-check/run-tests.sh` gains 13 cases. The fixture +**What.** `tests/provider-bundle-check/run-tests.sh` gains 15 cases. The fixture base splits: `pristine.yaml` is the repo bundle untouched; `good.yaml` is that bundle PLUS designate's ruled `.62` VIP. @@ -119,13 +119,20 @@ vip FAILS; T25 an unreadable apex REFUSES at rc=2; T26 a v4-only bundle needs no apex; T27/T28 the band is widened to 99 but still bounded. +T29/T30 exercise the **dc1** arm of the apex lookup, which T19-T23 never reached +(they all run at the default `--dc vr1-dc0`): T29 resolves dc1's `f03:11::/64` / +`:320::/64` / `:321::/64` and passes, T30 proves a dc0 v6 leg under `--dc vr1-dc1` +FAILS, so a cross-DC copy-paste of a rendered overlay cannot pass. The renderer's +first real output is per-DC overlays, and a gate observed in only one DC mode is +the same untrustworthiness T16/T18 exist to rule out. + T8's assertion string moved `outside 50-60` -> `outside 50-99` (the same re-pointing rule; the case still guards the band, at its ruled bounds). -**Evidence.** Harness **28/28** (was 15). Gauntlet **ALL GREEN (84 harnesses) on +**Evidence.** Harness **30/30** (was 15). Gauntlet **ALL GREEN (84 harnesses) on vcloud** -- the host is named because the gauntlet is measured HOST-DEPENDENT (2/81 fail on voffice1 on an identical commit). `repo-lint` 0 fail / 1 standing -warn / 604 files scanned. No harness was added or renamed, so +warn / 605 files scanned. No harness was added or renamed, so `tests/HARNESS-MANIFEST` is unchanged and needed no re-record. **Revert.** Revert this commit; the harness returns to 15 cases. diff --git a/tests/provider-bundle-check/run-tests.sh b/tests/provider-bundle-check/run-tests.sh index 7ff5727..d8914a4 100644 --- a/tests/provider-bundle-check/run-tests.sh +++ b/tests/provider-bundle-check/run-tests.sh @@ -221,6 +221,36 @@ mutate t28.yaml 'b["applications"]["glance"]["options"]["vip"]="10.12.4.100 10.12.8.100 10.12.12.100"' run 1 'outside 50-99' "T28 band still bounded (.100 rejected)" "$TMP/t28.yaml" +# ---- the dc1 arm of the apex lookup, exercised for real ---- +# T19-T23 all run at the default --dc vr1-dc0, so the dc1 v6 bands (f03:11::/64, +# :320::/64, :321::/64) were resolved by NO case. The renderer's first real output +# is per-DC overlays; a gate observed in only one DC mode is exactly the +# only-ever-seen-one-way untrustworthiness T16/T18 exist to rule out. +cat > "$TMP/dc1-dual.yaml" <<'YAML' +applications: + keystone: + options: + prefer-ipv6: true + vip: "10.12.64.50 10.12.68.50 10.12.72.50 2602:f3e2:f03:11::50 fd50:840e:74e2:320::50 fd50:840e:74e2:321::50" +YAML +runargs 0 '1 dual-family' "T29 dual-family VIP resolves the dc1 apex bands" \ + "$TMP/good.yaml" --overlay "$REPO/overlays/vr1-dc1-vips.yaml" \ + --overlay "$TMP/dc1-designate.yaml" --overlay "$TMP/dc1-dual.yaml" --dc vr1-dc1 + +# T30 the v6 analogue of T15: dc0 v6 legs under --dc vr1-dc1 must FAIL, so a +# cross-DC copy-paste of a rendered overlay cannot pass. +cat > "$TMP/dc1-dual-wrong.yaml" <<'YAML' +applications: + keystone: + options: + prefer-ipv6: true + vip: "10.12.64.50 10.12.68.50 10.12.72.50 2602:f3e2:f02:11::50 fd50:840e:74e2:220::50 fd50:840e:74e2:221::50" +YAML +runargs 1 'provider v6 leg .* not in 2602:f3e2:f03:11::/64' \ + "T30 dc0 v6 legs under --dc vr1-dc1 FAIL (cross-DC leak)" \ + "$TMP/good.yaml" --overlay "$REPO/overlays/vr1-dc1-vips.yaml" \ + --overlay "$TMP/dc1-designate.yaml" --overlay "$TMP/dc1-dual-wrong.yaml" --dc vr1-dc1 + echo echo "RESULT: PASS=$PASS FAIL=$FAIL" [[ "$FAIL" -eq 0 ]] && { echo "ALL PASS"; exit 0; } || exit 1