Surviving mutants — value-moving modules¶
Each file here lists the mutants that survived a cosmic-ray run: the suite executed that
mutated line and no assertion failed. They are the raw output of
scripts/mutation_survivors.py,
one row per mutant — file, line, enclosing definition, mutation operator, and the exact source
change.
This is a worklist, not a defect list. A survivor means one of two things and the difference is a judgement call a human has to make:
Nothing tests this. The branch runs, the behaviour changed, and the suite did not notice. These are the ones worth a test. When you write one, put it in
tests/test_mutation_hardening.pyand name the mutant class it kills, the way the existing entries there do.Nothing can test this. The mutant is equivalent — it does not change behaviour. The classes that dominate in this codebase are catalogued in
../../how-to/mutation-testing.md: type annotations (bytes | None→bytes - None, never evaluated underfrom __future__ import annotations), error-message f-strings, and interpreter-detail rewrites such as==→ison interned values.
Reading a row¶
Column |
Meaning |
|---|---|
Line |
1-based line in the module, at the commit named below |
Definition |
the enclosing function or method — |
Operator |
the cosmic-ray operator, with its |
Original / Mutant |
the single source line before and after the mutation |
(last) |
|
A row is triaged by answering one question: if this mutant shipped, what would go wrong, and why did no test see it? If the answer is “nothing would go wrong”, it is equivalent — say so in the commit that removes it from the worklist. If the answer is anything else, it needs a test.
Provenance¶
Produced 2026-08-12 from a full sweep of all seven value groups — 8 171 mutants, 5 049 killed,
3 122 survived (61%) — against the module sources at commit 3115028, which are byte-identical to
those at 724fe92. Per-module rates and wall times are in
../../how-to/mutation-testing.md.
These lists are generated, and they go stale the moment the source or the tests move. Line numbers are only meaningful at the commit above.
Regenerate them with:
MUTATION_SESSION_DIR=.mutation-sessions task mutate <group>
python scripts/mutation_survivors.py out.md .mutation-sessions/*.sqlite
The weekly Mutation (scheduled)
workflow produces the same files as build artifacts, so the current picture is always one workflow
run away even when the copies here have aged.