Repository navigation
ci(mutants): exclude the hand-reproduced cursor hangs - #416
Merged
Merged
Conversation
The weekly mutants run (41192647029) left `latency_us / 1_000` with `%` as its one survivor: the wiremock delay tests bound a 200 ms wait to [200, 5200] ms, and 200_xxx us modulo 1000 lands inside that window often enough to pass. A unit test on the private `record` pins the scale deterministically: two sub-millisecond waits sum to one whole millisecond, where `%` reports 300 and `*` 1_300_000, and the last status wins with a response-less request reading `None`. Hand-applied, both scale mutants fail the test and the unmutated code passes it.
Run 41192647029 reported 21 TIMEOUTs, every one a loop cursor whose mutated advance can never pass the current byte: `*= 1` leaves the index in place so the body re-runs in the same state forever, and `-=` steps back onto a byte the preceding branch advances over again so the pair cycles (on other inputs it underflows, which those tests already catch). Each was reproduced on its own under a 10 s per-test timeout, against groups that finish unmutated in under 5 s: qs_mask (2044 -=; 2052, 2078, 2082 both; 2063 *=), qs_split_ranges 2099 *=, qs_find_operator 2116 and 2132 both, qs_has_question 2144 *=, glob_match 164/172/180 *=, embedded_local_ids 942 both, and the stdio delimiter advance 196 both, which DESIGN.md already records as a hand-verified hang. Each mutant hangs at least one test; some `-=` ones also fail others through an underflow, but cargo-mutants runs plain `cargo test`, so the binary holding the hang never exits and the verdict is TIMEOUT either way. No timeout masks a survivor and no added test could turn one into a kill; they are excluded line-anchored like the otel hangs, so the Saturday run stops paying the floor for verdicts already in hand. Verified by --list diff: exactly these 21 disappear and every killed sibling (the -= twins at 2063, 2099, 2144 and the glob lines, the *= at 2044) stays. The mutants.yml note that kept the stdio hangs in scope is updated to match.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes the red weekly mutants run 41192647029. A unit test now kills the one survivor (the
latency_msscale), and line-anchoredexclude_reentries drop the 21 TIMEOUTs. Each excluded mutant was hand-reproduced as a hang, so its test binary never exits. The stdio delimiter advance moves out of scope too, which reverses 0dc4ac2's choice to keep it in. Verified with the workspace gates, acargo mutants --listdiff (exactly those 21 removed, killed siblings kept), an OCR pass, and an adversarial review that hand-applied all 21 plus both scale mutants.