Changelog
All notable changes to Mutalog are listed here. Versions follow Semantic Versioning.
0.3.2 (2026-10-29)
- Fixes a regression in 0.3.1: every mutant of a module that another loaded module imports came back as a compile error. The worker still unloads a file before loading a mutant, which keeps the 0.3.1 fix, but it now keeps SWI-Prolog's record of which modules loaded the file.
- Mutants of two modules that export the same name no longer come back as compile errors.
- A run where more than half of the mutants did not load prints a warning and, with
break above 0, exits with 1. The clear-text output shows the first load error of each file, and the JSON report gives it as the mutant's statusReason.
0.3.1 (2026-10-29)
- On SWI-Prolog 10, a mutant could run against a clause left over from the previous mutant of the same file, so it survived or was killed depending on which mutants its worker ran before it. The worker now unloads a file before it reloads it.
0.3.0 (2026-10-29)
- Cut insertion is now its own operator,
cut_insert; cut only removes cuts. An inserted cut after a goal with one solution can't change any answer, so a project can now drop cut_insert from operators and keep cut removal. Ids and ignore_mutants entries for inserted cuts change from `:cut: to :cut_insert:`.
- A `% mutalog-disable-next-line` comment suppresses the mutants on the line below it, optionally only for the operators it names (`% mutalog-disable-next-line cut_insert: reason`). Unlike an
ignore_mutants id, it moves with the code.
0.2.0 (2026-10-29)
- A
mutate glob that matches no files is now an error, like a tests glob that matches none. Both errors name the patterns and the directory they were resolved against.
thresholds(_, _, break(N)) with N above 0 now fails a run that scored no mutants, instead of passing it.
- `mutalog run --only` stops with an error when an id matches no mutant.
ignore_mutants entries that match no mutant in a mutated file print a warning.
- Mutalog's own errors print as sentences instead of `Unknown error term`.
- New
root(Dir) config key and `--root DIR` option set the project root, so a config file can live outside it. The README now says that `--config FILE` makes the file's directory the root.
0.1.2 (2026-10-29)
First release. Versions 0.1.0 and 0.1.1 were tagged but never published.
- Nine mutation operators: arithmetic, comparisons, unification, negation, cuts, goals replaced with
true or fail, dropped clauses, and literals. `mutalog list` shows the mutants without running anything.
- A dry run records per-test coverage, so each mutant only runs the tests that reach it.
- A parallel worker pool with longest-first scheduling, soft and hard time limits, and crash retries.
- Reports: clear text, progress, a self-contained HTML page, and JSON in the mutation-testing-report-schema v2 format.
- Installs as a pack with
pack_install(mutalog). Run it with `swipl mutalog run` on SWI-Prolog 9.1.22+, or with the `-g mutalog:main` form on 9.0.
- Licensed BSD-2-Clause.