- Guide
- Playground
- GitHub
-
Ecosystem
Help
Resource Lists
Recent Posts
- What's new in Infection 0.32.3
- What's new in Infection 0.26.0
- What's new in Infection 0.25.0
- What's new in Infection 0.24.0
- What's new in Infection 0.23.0
- What's new in Infection 0.21.0
- What's new in Infection 0.20.0
- What's new in Infection 0.19.0
- What's new in Infection 0.18.0
- What's new in Infection 0.17.0
What's new in Infection 0.32.3
Jan 14, 2026
Release: https://github.com/infection/infection/releases/tag/0.32.3
Timeout Control Options
Timeouts have been the silent killers of mutation testing quality. This release introduces two new options to give you visibility and control over timed-out mutants.
The Problem
MSI inflation: On CI environments with weaker CPUs, mutations that would escape locally instead time out. Since timeouts count as “killed” mutants, your MSI score is inflated. A project reporting 97% MSI might actually have 87% if those timeouts were counted as escapes.
Slow CI accumulation: You get timeouts to zero, the build is fast. You add a new feature - suddenly 20 new timeouts. Your CI now takes minutes longer. The worst part? There’s no way to know they exist without digging through logs.
Hidden infinite loops: Some timeouts are simple performance hits on slow CI. Others are mutations that create infinite loops-the very test gaps Infection is supposed to find, now hidden among “acceptable” slowdowns.
The Solution: Two New Options
--with-timeouts / timeoutsAsEscaped
Treats timed-out mutants as escaped instead of killed. This affects MSI calculation - timeouts count against your score, giving you an honest picture of test quality.
# See your real MSI with timeouts counted as escaped |
--max-timeouts / maxTimeouts
Fails the build if the number of timed-out mutants exceeds the specified threshold. This is purely a threshold check and does not affect MSI calculation.
# Fail if any timeouts occur (strict mode for PRs) |
These Options Are Independent
The two options serve different purposes and can be used separately or together:
| Scenario | --with-timeouts |
--max-timeouts |
|---|---|---|
| Stricter MSI only | Yes | No |
| Hard ceiling only | No | Yes |
| Both concerns | Yes | Yes |
Why not implicit? If --max-timeouts=10 implicitly enabled --with-timeouts, a project with 9 timeouts and 100% MSI would suddenly fail - the timeouts would count as escaped, dropping MSI below 100%. These are orthogonal concerns: one affects metric calculation, the other is a hard limit.
Configuration
Both options can be set in infection.json5:
{ |
Recommended Workflows
For PRs: Zero Tolerance
Prevent any new timeouts from being introduced:
infection --git-diff-lines --max-timeouts=0 |
For Full Runs: Honest MSI
Get accurate MSI that counts timeouts as test gaps:
infection --with-timeouts --min-msi=80 |
Hunting Timeouts
See all timed-out mutations to fix them:
infection --with-timeouts --show-mutations |
This shows timed-out mutations in the console output, making them visible and actionable rather than hidden in logs.
Performance Metrics Dashboard
We now track Infection’s own performance over time with automated benchmarks on every release. The results are published to a public dashboard:
https://infection.github.io/infection-metrics/
Each benchmark run captures wall clock time, CPU time (user + system), total mutations generated, and peak memory usage. We also compute derived metrics like time per mutation to normalize across different codebases and detect regressions independent of test suite size.
This helps us catch performance regressions early and track improvements across releases.
Enjoying Infection? Consider supporting us on GitHub Sponsors