|
Build the (b) ruling: prefer-ipv6 emitted for NO application; 9b re-pointed
Renderer: the emission condition is DISABLED, not deleted -- when the v6 completion work lands (allocatable ranges on the six v6 plane subnets, rack-side v6 legs, a v6 default route, v6-reachable services) that one line turns it back on, and PREFER_IPV6_CHARMS is still the correct set to gate it by. Both overlays re-rendered: exactly 7 lines removed per DC and nothing else -- all 13 apps keep 6-leg dual-family vips at both DCs. INVARIANT 9b RE-POINTED, not deleted: it required the option and the v6 legs to travel together on a declaring charm (the L3-9 defect), which would now fail on the ruled artifact. The rule is the option must be ABSENT everywhere. L3-9 cannot recur while it is absent -- there is nothing to keep while legs are dropped. It returns to the coupling form when v6 is operational. HARNESS re-pointed rather than deleted, and three stale fixtures fixed: - T20 was 'option without v6 legs FAILS'; now 'option on a DECLARING charm FAILS' - T21 was the inverse; now the POSITIVE CONTROL -- v6 legs WITHOUT the option must PASS, so 9b cannot be satisfied by rejecting everything - T22/T23/T30 each set prefer-ipv6 because the OLD coupling required it alongside v6 legs. Under the absence rule 9b fires FIRST and short-circuits, so their v6-band assertions would never have been reached and they would have passed for the wrong reason. The option is removed from those fixtures. Mutation-proven: disabling the 9b absence check kills T20; re-enabling renderer emission kills render-drift. Source restored byte-identical after each. Gauntlet ALL GREEN (93); repo-lint 0 fail; harness 55/55. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HvCyrwvYTTcDYnRErfMsNf |
|---|
|
|
| overlays/vr1-dc0-vips.yaml |
|---|
| overlays/vr1-dc1-vips.yaml |
|---|
| scripts/provider-bundle-check.py |
|---|
| scripts/render-dc-overlays.py |
|---|
| tests/provider-bundle-check/run-tests.sh |
|---|