diff --git a/goodwe_controller/test_rehearse.py b/goodwe_controller/test_rehearse.py index bf98399..fa924e1 100644 --- a/goodwe_controller/test_rehearse.py +++ b/goodwe_controller/test_rehearse.py @@ -471,21 +471,31 @@ def m12_findings(tree): _m12 = mutant_tree([("app/inverter.py", _M12_OLD, _M12_NEW)]) _m12_clean_code, _m12_clean, _ = m12_findings(HERE) -_m12_code, _m12_mut, _m12_out = m12_findings(Path(_m12)) +_m12_code, _m12_mut, _ = m12_findings(Path(_m12)) _m12_new = _m12_mut - _m12_clean print(f" staged leg, legacy+shed: shipped exit {_m12_clean_code}, " f"one roster unit's latch popped -> exit {_m12_code}") -print(f" findings the mutation ADDS: {sorted(_m12_new)}") +# ⚠️ THE PRINTED SET IS LOSSIER THAN IT LOOKS: the regex captures the first +# TOKEN of each finding's text, so two findings of one kind collapse into one +# tuple. Harmless here - the difference is one-directional and the pair M12 +# asserts on is exact - but do not read this line as an inventory. +print(f" findings the mutation ADDS (first token only): {sorted(_m12_new)}") check("⚠️ PRECONDITION: the baseline is STABLE and does not already carry the " "finding this mutation exists to produce. It is NOT clean - a legacy " "fixture never is - and the SET DIFFERENCE is what makes that fine, " "which is the sentence the deletion should have read before acting on it", not any(k == "unit/shed/sign_tripped" for _, k in _m12_clean)) -check("⭐ M12 RESTORED: a ROSTER unit's latch key that vanishes is a finding " - "even though a sibling holds True - and this is the STAGED leg, where " - "`snapshot_over()` supplies a transition-made destination, so the " - "provenance clause does not foreclose the narrowing", - any(k == "unit/shed/sign_tripped" for _, k in _m12_new)) +# ⚠️ AND IT MATCHES THE **KIND** AS WELL AS THE KEY, which SAFETY-44's original +# did not. Review measured it: renaming the finding kind in `diff()` from +# "VANISHED STORE KEY" to "GONE STORE KEY" left M12 GREEN. A vanished latch +# quietly downgraded to a softer heading is exactly the shape part 3 requires +# every mutation to be graded against - "the SPECIFIC finding it should produce" +# - and this file was not holding itself to its own rule. +check("⭐ M12 RESTORED: a ROSTER unit's latch key that vanishes is a " + "VANISHED STORE KEY finding even though a sibling holds True - and this " + "is the STAGED leg, where `snapshot_over()` supplies a transition-made " + "destination, so the provenance clause does not foreclose the narrowing", + ("VANISHED STORE KEY", "unit/shed/sign_tripped") in _m12_new) shutil.rmtree(Path(_m12).parent, ignore_errors=True) @@ -742,6 +752,11 @@ check("...and no leg's text has swallowed the CLOSING SUMMARY, which repeats " # and the whole 28-file suite stayed green # MACHINE-READ (C1) R6 # OFF-ROSTER (C5) R2, and M12 end-to-end on the staged leg +# PREFIX GATE (C4) NO 5e ROW, deliberately - `vanished_unit is not None` +# is reached end-to-end by part 3's M9, and a synthetic +# row would duplicate that rather than add separability. +# Listed because C5 lives in the same `if` and omitting +# one guard while naming the other reads as an oversight. # # ⚠️ ONE HOLE IS STILL OPEN AND IS **UNMEASURED**, stated so nobody reads # `sorted()` as guarded: ATTRIBUTION. Which vanished key gets a destination is