|
RULED "B plus C": D-139 ruling A narrowed to an experiment + upstream fix
Operator, exact utterance: "B plus C". Ruling B's GUA carve is unaffected and proceeds; ruling A's five-plane v6-only scope narrows to a bounded experiment; metal-internal, data-tenant and lb-mgmt stay DUAL-STACK pending upstream fixes. That last sentence is recorded as an INTERPRETATION, not as the utterance. >>> I SCOPED THE EXPERIMENT WRONG AND THIS CORRECTS IT. <<< MEASURED against shipped ceph-osd rev 953, ceph_hooks.py:544-553: prefer-ipv6 is ONE switch that sets ms_bind_ipv4 = False GLOBALLY, so it governs Ceph's PUBLIC network (storage) and CLUSTER network (replication) TOGETHER. There is no state in which Ceph runs cluster on v6 and public on v4. I recommended "replication alone, smallest blast radius" -- not achievable. The experiment is storage + replication as a PAIR, with a larger blast radius than I represented. A PATH THE EARLIER ANALYSIS MISSED: the buggy bare get_ipv6_addr() (LP #2061836, dynamic/SLAAC-only, never fixed on ceph-osd, while our nodes hold MAAS statics) is reached ONLY under `if not public_network:` / `if not cluster_network:`. Setting ceph-public-network and ceph-cluster-network to the v6 CIDRs means it is never used for address selection -- the defect becomes AVOIDABLE BY CONFIG. This is a CODE READING, NOT A MEASUREMENT, and it does not address the get_mon_hosts()/ get_host_ip race (LP #2109798). REVIEW PASS on netbox/d139-gua-carve.py (independent second agent, per operator standing instruction). 4 real defects fixed, 4 reported, 1 charter miss upheld. D1 is the mandate's own named class "a refusal that does not refuse": an unreachable apex gave a raw traceback and EXIT 1 -- the tool's own header defines exit 1 as a write error -- on a dry run that wrote nothing. _req caught only HTTPError so URLError walked past the REFUSE handler. Fixed, REFUSE(2). D2: a comment asserted ruling B was "FLAGGED" -- already false at commit time. Replaced with a citation; prose in a script rots against governance state, a citation cannot. D3/D4: two greps over the tool's OWN SOURCE and two vacuous negatives replaced with behavioural coverage. main() decomposition DECLINED on a reusable argument: the `if not a.commit: return 0` guard is ADJACENT to the write block, and extracting commit_writes() would split that safety proof in two. Line count is not the criterion. R1 IS A REAL SECURITY FINDING, MEASURED: urllib carries the Authorization header across a CROSS-HOST redirect (loopback probe -- the target received the token verbatim). SANDBOX_HOSTS gates the supplied url, not a redirect from it. LOW severity, logged not executed. Harness 65/65 -> 71/71; all 5 original mutations RE-RUN and still standing, plus 3 new; gauntlet ALL GREEN (95); dry-run body diffed BYTE-FOR-BYTE identical to the committed capture; apex 139 prefixes before and after. QUALIFIED: a dry run executes zero POSTs, so D1's change to the WRITE path's failure semantics is UNTESTED and is declared, not implied. PROCESS FAILURE REPEATED AND OWNED: the review mandate required a docs/audit/ capture and forbade touching CURRENT-STATE.md -- jointly unsatisfiable against L10. The agent correctly left the tree RED and said so rather than working around it. Standing fix, now twice learned: an agent mandate must name a repo path for findings AND leave the committer able to satisfy L10. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HvCyrwvYTTcDYnRErfMsNf |
|---|
|
|
| docs/CURRENT-STATE.md |
|---|
| docs/audit/d139-carve-review-20260801.txt 0 → 100644 |
|---|
| docs/changelog-20260731-snap-proxy-apply-ipv6.md |
|---|
| netbox/d139-gua-carve.py |
|---|
| tests/d139-gua-carve/run-tests.sh |
|---|
| tests/d139-gua-carve/stub-apex.py |
|---|