Tenth slice.
Gap: 100+ hand-written tests had never been attacked. Passing tests prove code works; they don’t prove the tests test.
What changed: cargo mutants -p monitor-domain — 48 mutants. First run:
5 missed, all the same shape — comparisons asserted on the rejection side
but never at the boundary (interval < MIN vs <=, timeout > interval vs
>=), and rebuild_tail’s return value never asserted at all. Three tests
added: the minimum interval itself is accepted, a timeout equal to the
interval is accepted, and rebuild_tail returns the larger threshold.
Proof: re-run — 42 caught, 0 missed, 6 unviable (Default::default()
replacements on types that can’t implement it — they can’t compile, so they’re
not alive). The outcome JSON is committed to perf/results/ — survivors, fix,
and clean re-run are all auditable.
Lesson: mutation testing is the only honest answer to “do the tests test anything?” Every miss was the same shape — assert the boundary itself, not just the side of it.