# Comparison

## irradiate vs mutmut

mutmut is irradiate's direct ancestor. They share trampoline architecture, naming conventions, and config format. The differences are in execution model and feature set.

| | mutmut | irradiate |
|---|---|---|
| **Execution** | `pytest.main()` per mutant (~200ms each) | Fork-per-mutant inside pre-warmed workers |
| **Parser** | LibCST (Python, sequential) | tree-sitter (Rust, parallel via rayon) |
| **Operators** | ~20 categories | 27 categories |
| **Cache** | mtime-based (breaks on rebase, `touch`) | Content-addressable (SHA-256) |
| **Orchestration** | Python multiprocessing | Rust + tokio async |
| **Incremental** | -- | `--diff` with merge-base resolution |
| **Reports** | Terminal only | JSON (Stryker v2), HTML, GitHub Actions annotations |
| **Decorator support** | Skip all | @property/@classmethod/@staticmethod handled |
| **CI integration** | Manual | `--fail-under`, inline annotations, step summary |
| **Isolation** | Fork only | Warm-session + `--isolate` + `--verify-survivors` |
| **Config** | `[tool.mutmut]` | `[tool.irradiate]` (mutmut section accepted with deprecation warning) |

The speedup depends on pytest startup overhead. For projects where pytest takes 200ms+ to start, irradiate is typically 10-50x faster.

## Python ecosystem

### cosmic-ray

Parso-based. Generates all pairwise operator permutations rather than curated swap tables. Supports non-pytest test runners via its session/worker model. Good choice if you need a custom test runner or want exhaustive operator coverage over speed.

### mutpy

Python `ast`-based. Follows academic mutation operator naming (AOR, ROR, etc.). Has object-oriented mutation operators not found elsewhere: inheritance manipulation, `self.x` to `x`, slice index removal. Largely unmaintained.

## Other ecosystems

### cargo-mutants (Rust)

Closest equivalent in design philosophy. Primary strategy is function body replacement — replace the entire body with a type-appropriate default. Simpler to reason about than fine-grained operator swaps but produces fewer total mutations.

### Stryker (JS/TS)

The most feature-rich JS/TS mutation tester. JS-specific operators: optional chaining removal, array/object emptying, regex mutation. Runs as a Node.js process.

### PIT / pitest (Java)

Most widely-used JVM mutation tester. Operates on bytecode, making it language-agnostic across JVM languages. Elaborate operator tier system (DEFAULTS vs STRONGER vs ALL) and a commercial extension (Arcmutate).

### Infection (PHP)

The most operator-dense framework, with 200+ distinct mutation operators. PHP-specific mutations: function unwrapping (strip a call, return its argument), type cast removal, visibility reduction.
