Cut 7: retire a test Cut 6b made vacuous, and the invariant it claimed
Cut 3's harness reported OutOfArcConsumesNoDraw as "not yet reached" -- no mutation could turn it red. Chasing that rather than accepting it found the reason, and it is not a fixture defect. The test asserted that a shot gated to zero draws nothing from ItemManager. Random, so the shared stream advanced exactly as if the shot had never queued. Cut 6b moved every roll onto a per-shot local generator seeded from (zone, shot id), so Commit stopped touching that stream on EVERY path. The test then passed for a reason unrelated to arcs -- it passed identically with the target dead ahead -- and the rule it named stopped existing along with the stream it was about. The short-circuit it guarded is now a cheap guard, not an invariant, and Commit's comment was still asserting otherwise. Rewritten as CombatNeverDrawsFromTheSharedStream, a Theory over both an out-of-arc and an in-arc target, pinning the rule that IS live after 6b: no combat path draws from the shared stream at all. Verified by hand -- restoring the shared-stream read in Commit turns the in-arc case red while the out-of-arc case stays green, which is exactly why the old test could not have caught it. 218 tests pass. All six mutation harnesses run clean with tree-clean PASS. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
76758dae5d
commit
0ae8226ccb
2 changed files with 21 additions and 11 deletions
|
|
@ -290,9 +290,14 @@ public static class FireControl
|
|||
|
||||
// R3/R4: the one roll. p_base was frozen at fire; the only thing measured live is how far the target has
|
||||
// actually strayed, by now, from where a straight-line projection of its fire-time velocity said it would
|
||||
// be -- forgiven by the targeting system's Tracking, likewise frozen at fire. A shot gated to zero at fire
|
||||
// (out of arc, out of range, unlocked, undetected) draws nothing here (short-circuit below): the RNG
|
||||
// sequence is exactly as if the shot had never queued.
|
||||
// be -- forgiven by the targeting system's Tracking, likewise frozen at fire.
|
||||
//
|
||||
// Cut 7: the short-circuit below (`p > 0f &&`) is a guard, NOT an invariant. It used to be one -- a shot
|
||||
// gated to zero at fire had to draw nothing so the shared stream advanced exactly as if it had never
|
||||
// queued -- but Cut 6b gave every shot its own generator, seeded from (zone, shot id) and discarded here,
|
||||
// so whether a gated shot draws is unobservable from anywhere. The claim this comment used to make is
|
||||
// gone with the stream it was about, and the test that asserted it became vacuous the same moment; what
|
||||
// replaced it pins the live rule instead (combat touches no shared stream, on any path).
|
||||
private static ShotOutcome Commit(Zone zone, PendingShot shot, float now)
|
||||
{
|
||||
// Cut 6b, 6.1 (Soul finding 6): a shot's dice belong to the shot, not to whatever else happened to
|
||||
|
|
|
|||
Loading…
Reference in a new issue