Repository navigation
v1.6.1 — Safer reports, faster Xcode runs, and fixes from the October review #163
ericodx
announced in
Announcements
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
This release closes every issue the October 2026 code review opened. The HTML report no longer breaks on a
<mutation or lets a string literal inject markup, simulator clones no longer leak when pool setup fails, and the twelve smaller risks the review listed are each confirmed and fixed. Incompatible Xcode mutants now run in warm sandboxes, one per worker, rebuilt incrementally instead of cold for every mutant, andxcodebuildno longer collects test diagnostics nobody reads, which doubled every failing run on the simulator and sometimes hung it. On the benchmark fixture the incompatible phase is 55% faster on macOS and 57% faster on the iOS Simulator. Nothing in the command line, the configuration keys or the report formats is added or removed.Bug fixes
Reports
&,<,>,",'). A<or&&mutation no longer breaks the table, and a string literal can no longer inject markup (The HTML report interpolates mutant text without escaping, so<mutations break the table and literals can inject markup #139)/private. They no longer start with/(see Upgrading)Simulators
simctl clonereturns, and a pool whose setup fails part-way deletes the clones it made before rethrowing (Simulator clones leak when pool setup fails part-way #141)XMR-<pid>-<session>-<n>. Before cloning, a pool deletes the clones of runs whose process is gone, and those in the old name form. Clones of a run still in progress are left aloneSchematization and execution
ImportStylesees the imports inside the active clauses of#ifblocks, nested ones included, so a schema no longer adds a second, conflicting Foundation import (ImportStyle does not see imports inside #if, so a schema can add a second, conflicting Foundation import #153)SchemaNarrowergives up after taking mutants out of the schema, the fallback no longer tests those mutants again. They already run on the incompatible path, and each of them got a second verdictIntegrityError.sourceNotRestored. Before, every later mutant of that worker was cached asunviableunviable. Before, the computed sandbox path was the sandbox root, and writing the mutant there deleted the sandboxProcesses and signals (#143)
ENOMEM, instead of coming back emptysetpgidalways failed withEACCESonce the child had exec'd. It is replaced by a check that the process leads its own group, which warns onceConfiguration (#143)
timeout,build-timeoutorconcurrencyin.swift-mutation-testing.ymlis a usage error that names the file. Unknown keys are warned about#comments are stripped, outside quotes, and flags acceptyes,no,onandoffas well astrueandfalse--disable-mutator,disabled-mutatorsoractive: false, is a usage error. The empty list it left meant every operator, so the run tested all seven--concurrencyhelp said every SPM run uses one worker. Only an Xcode run on macOS or with XCTest doesCache, plans and test files (#143)
Testsdirectories inside the project count as test files. A project inside a directory named like a test target no longer hashes its sources as testsPerformance
Warm sandboxes for incompatible Xcode mutants (#144)
CalcApppins it--concurrencyworkers run at once, capped by the pool size. A reproduction keeps a cold sandbox per attemptNo test diagnostics
xcodebuild test-without-buildingpasses-collect-test-diagnostics never. By defaultxcodebuildcollects a diagnostics report whenever a test fails. On the iOS Simulator that doubled every failing run (20.7 s against 8.5 s) and sometimes hung it, so killed mutants came back as timeouts after the full limitIncompatible SPM mutants (#146)
Discovery, schematization, plans and sandboxes (#145, #147–#152)
SourceLocationConverterand function body scopes once, and the seven operators, the suppression filter, indexing and schematization share them. Before, each operator built its ownfuncdeclarations and exact@Testtitles instead of rereading every file per killed mutantUpgrading
/(Sources/Calc.swift, not/Sources/Calc.swift). SonarQube's generic issue import expects exactly that form. A script that matched the old form needs updating.swift-mutation-testing.ymlis checked more strictly. A value that was silently ignored, such astimeout: abc, now ends the run with1and names the file. An unknown key is a warning, not an errordefaultoperators, choose--operator-tier experimentalor name the operators with--operatorMeasurements
The warm sandboxes, on a copy of
CalcAppwith 300 generated files and 11 incompatible mutants. These are medians of three end-to-end runs per version, measured againstmainjust before the change, all with the diagnostics flag and all reaching the same verdicts:--concurrency 8The fixture's cold build is short (6.2 s, against 2.8 s incremental), so a project whose build takes minutes should gain more.
Scripts/xcode-incompatible-benchmark/benchmark.swiftreproduces the table.This repository's own score on the
defaulttier is 99.8%, from the self-run of 2026-10-08. That run had 1645 mutants and scored 99.2% over every operator. That is the README badge.Test coverage
The documented region coverage is measured again with
llvm-cov reportand matches it (#154). The six regions left are listed inDocs/CodeBase/README.md, with the reason each cannot be reached and the commands that measure the figure. The one line left is the_exitinSandboxCleaner.SignalTarget.process, which ends the process before coverage is written.Documentation
Docs/CodeBaseandDocs/Architecturewas checked against the sources: signatures corrected, and the types that had no section given one. All 31 diagrams renderDocs/USAGE.MD,Docs/INSTALLATION.MD,Docs/OPERATORS.mdand the plugin skill: the default tier's three operators, the SPM worker count and the Xcode requirement are stated correctlyDocs/BUILDING.mdgives the plainswift testcommands for tests and coverageKnown issues
Signed-Releasesand reproducible build provenance are not in placeRequirements
Installation
See the Installation Guide for Homebrew, pre-built binary, and build from source instructions.
What's Changed
Full Changelog: v1.6.0...v1.6.1
This discussion was created from the release v1.6.1 — Safer reports, faster Xcode runs, and fixes from the October review.
All reactions