Changes
The two most recent releases in full, then the version history. The
distribution's Changes file is the authoritative record.
0.47 — 7 October 2026
Enhancements
extract-schemas --function NAME(-F) — extracts everything, then deletes every schema exceptNAME.ymland limits the fuzz run and the summary table to that one routine. Built for isolating a single failure in the self-fuzz suite; if the name is not found, the available routine names are printed and the command exits 1.- A clearer self-fuzz summary. The end-of-run table now
lists every processed routine, not only the ones that fuzzed successfully,
with the module name, the routine and either a test count or a plain
reason for skipping: internal helper, excluded from the fuzz list, instance
method needing an object, mandatory object parameter without a
canhint, or FAILED.
Documentation
- Expanded the
MUTANT_SKIPexamples.
Bug fixes
$pkgwas extracted as a parameter. The invocant filter only knew$selfand$class, so$pkginimport(),$protoin older constructors and$klasswere emitted as position-0 string parameters — giving modules that useuse Module key => valuea spuriouspkg: {type: string}entry. All extraction loops, the POD/code agreement check and the inline body guard now share the fullself|class|pkg|proto|klassset. Three regression tests cover it.
0.46 — 18 August 2026
Dashboard
- CPD drill-down pages. A per-file page shows the source with duplicated lines highlighted, and ◆ markers linking to the other copy of each block. Dup% badges link to it, and the mutation page's legend does too.
- One visual style for per-file pages. Duplication pages now use the same header, footer, CSS variables and dark-mode toggle as mutation pages.
- Sortable mutation and duplication tables. Any column
header sorts; arrows show the active column and direction. Sorting detects
numbers versus text, honours
data-sort-type="date", and respects adata-valueattribute where the displayed text is not the sort key. - Fixed a column-alignment bug. The TER column appeared in data rows but only in the header when LCSAJ data existed, shifting the Dup% index. TER is now always in the header.
- Drag to reorder columns, with the active sort column following its column to its new position.
- Persistent sort and column order for all four tables,
stored in
localStorageand restored on load. Columns are identified by their original index, so a saved order survives a new column being added.
Tests
t/domain.t— equivalence partitioning and boundary value analysis across six modules: confidence thresholds at 19/20/39/40, the signal-to-bucket mappings and their alphabetical tie-breaks, numericmin/maxboundaries where the code uses strict comparisons, theexists-versus-defineddistinction in required attributes, cyclomatic and early-return thresholds, nesting depth, purity classes and mutation-field deduplication.t/data-flow.t— define-use chains: corpus staleness after minimisation, evidence isolation between objects,weight => 0stored as zero rather than defaulted to one, YAML export/import round trips, file handles closed insideexport(), and string literals not mistaken for IO.- Plus the path, transaction and path-coverage suites described in the
repository's
CLAUDE.md.
Earlier releases
| Version | Date | Highlights |
|---|---|---|
| 0.45 | 10 August 2026 | Bug fixes and test-suite work. |
| 0.44 | 21 July 2026 | Schema extraction and dashboard refinements. |
| 0.43 | 11 July 2026 | The version required by t/fuzz.t's Test::Needs guard. |
| 0.42 | 7 July 2026 | POD example extraction, benchmark generation, portable workflow deployment, CPAN Testers reproduction scripts, corpus minimisation. |
| 0.41 | 28 June 2026 | In-place mutation strategy: mutants are written to the project's own lib/ so use lib in test files cannot load the original code. |
| 0.40 | 25 June 2026 | A large release; see Changes. |
| 0.39 | 24 May 2026 | See Changes. |
| 0.38 | 18 May 2026 | See Changes. |
Full history:
MetaCPAN's
changelog, or the Changes file in
the repository.
Upgrading
cpanm App::Test::Generator
Schemas are compatible across releases: a schema that works with 0.47 has
worked since the transform syntax settled. Generated harnesses are
regenerated by tooling, so a stale one is replaced rather than migrated.
If you keep generated .t files in version control, regenerate
them after upgrading — an older harness may not know about a type or a
config key that the new version accepts.