"""V4 arm-readiness reporter — self-test to death. Spec: prod/docs/VIOLET_PASS_MM1_V4_READINESS_REPORTER.md Style: follows test_violet_domain.py patterns. """ from __future__ import annotations import sys sys.path.insert(0, "/mnt/dolphinng5_predict") import pytest from hypothesis import given, settings from hypothesis import strategies as st from prod.clean_arch.violet.v4_readiness import ( V4ReadinessReport, assess_v4_readiness, ) ALL_FIELDS = [ "creds_ok", "canary_passed", "arming_gate_present", "conviction_bit_identical", "selection_parity_ok", "feed_live", ] def _all_true(**overrides: bool) -> dict: return {f: overrides.get(f, True) for f in ALL_FIELDS} def _single_false(field: str) -> dict: return _all_true(**{field: False}) # ── happy path ──────────────────────────────────────────────────────────────── def test_all_true_ready_to_arm(): r = assess_v4_readiness(**_all_true()) assert r.ready_to_arm is True assert r.reasons == [] # ── each single False yields ready_to_arm=False + correct reason ───────────── @pytest.mark.parametrize("field", ALL_FIELDS) def test_single_false_not_ready(field: str): r = assess_v4_readiness(**_single_false(field)) assert r.ready_to_arm is False assert len(r.reasons) == 1 assert field in r.reasons[0] # ── hypothesis: invariant holds across all 2^6 combos ──────────────────────── @given( creds_ok=st.booleans(), canary_passed=st.booleans(), arming_gate_present=st.booleans(), conviction_bit_identical=st.booleans(), selection_parity_ok=st.booleans(), feed_live=st.booleans(), ) @settings(max_examples=100) def test_ready_to_arm_equals_all_inputs( creds_ok: bool, canary_passed: bool, arming_gate_present: bool, conviction_bit_identical: bool, selection_parity_ok: bool, feed_live: bool, ): r = assess_v4_readiness( creds_ok=creds_ok, canary_passed=canary_passed, arming_gate_present=arming_gate_present, conviction_bit_identical=conviction_bit_identical, selection_parity_ok=selection_parity_ok, feed_live=feed_live, ) expected = all(( creds_ok, canary_passed, arming_gate_present, conviction_bit_identical, selection_parity_ok, feed_live, )) assert r.ready_to_arm is expected # ── mutation litmus: flipping all() to any() MUST break this test ──────────── def test_mutation_litmus_all_must_be_true(): """If someone changes all() to any(), at least one all-False should become ready_to_arm=True — this test catches it.""" r = assess_v4_readiness(**{f: False for f in ALL_FIELDS}) assert r.ready_to_arm is False assert len(r.reasons) == 6 # ── poison: StrictModel rejects non-bool / extra fields ───────────────────── def test_rejects_non_bool(): with pytest.raises(Exception): V4ReadinessReport( creds_ok={"ok": True}, # dict is not coercible to bool canary_passed=True, arming_gate_present=True, conviction_bit_identical=True, selection_parity_ok=True, feed_live=True, reasons=[], ) def test_rejects_extra_fields(): with pytest.raises(Exception): V4ReadinessReport( creds_ok=True, canary_passed=True, arming_gate_present=True, conviction_bit_identical=True, selection_parity_ok=True, feed_live=True, reasons=[], unknown_field="oops", ) def test_rejects_frozen_mutation(): r = assess_v4_readiness(**_all_true()) with pytest.raises(Exception): r.creds_ok = False # type: ignore[misc] # ── reasons content check: False fields produce descriptive strings ────────── def test_reasons_mention_gate_name(): r = assess_v4_readiness(**_single_false("feed_live")) assert any("PASS2.6" in reason for reason in r.reasons) if __name__ == "__main__": raise SystemExit(pytest.main([__file__, "-v"]))