checks / unit (pull_request) Successful in 7m7s
Review APPROVEDf6f3f22plainly. Three LOW notes, all applied - the first is a real gap and the other two are one line each. ⚠️ M12's ASSERTION WAS KIND-BLIND. It matched on the key and ignored the finding kind, so renaming `diff()`'s `"VANISHED STORE KEY"` to `"GONE STORE KEY"` left M12 GREEN - review measured it. A vanished latch quietly downgraded to a softer heading is exactly what part 3 of this same file requires every mutation to be graded against ("the SPECIFIC finding it should produce"), so the file was not holding itself to its own doctrine. Inherited from SAFETY-44's original M12, not introduced here, and fixed now: ("VANISHED STORE KEY", "unit/shed/sign_tripped") in _m12_new Driven: the kind rename is exit 1 and M12 is among the reds where it was green before, and C5's removal still turns M12 red, so the strengthening did not cost the discrimination it exists for. C4 IS NAMED IN THE CLAUSE MAP. It has no 5e row deliberately - part 3's M9 reaches `vanished_unit is not None` end-to-end and a synthetic row would duplicate that rather than add separability - but C5 lives in the same `if`, and listing one guard while omitting the other reads as an oversight rather than a boundary. Review's own recommendation was not to add the row. AND THE PRINTED SET SAYS WHAT IT LOSES. The finding regex captures the first TOKEN of each text, so two findings of one kind collapse into one tuple; the line now says "first token only" so nobody reads it as an inventory. Harmless for M12 - the difference is one-directional and the pair it asserts on is exact - but the display was lossier than it looked. Unused `_m12_out` dropped. 28/28 files pass. `rehearse_roster.py` is untouched by this round; review confirmed its AST is identical between91b0d5eandf6f3f22, so every measurement made against the shipped rule still stands. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BwRLw7eKYj2byVdwB6kbjU