All notable changes to this project are documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Unreleased
0.1.0 - 2026-09-07
Initial release.
Added
- An SQL-semantics mutation catalog for the Ecto surface, independent of Mutare's Elixir-semantics built-ins: every mutation is one a real SQL engine will run, and equivalence reasoning follows SQL's three-valued logic.
- In-condition families (delivered through
^/dynamicinjection so the query still compiles once):comparison,null_predicate,connective,membership,arithmetic,coalesce,temporal,integer_literal,float_literal, the opt-instring_literal/atom_literal/boolean_literalarms,binding_reorder, andfilter_drop. - Query-shape families:
ordering,ordering_nulls,bound,join_type,combination,aggregate,clause_drop, andquery_terminal. - Repo-write and changeset families:
persistence,on_conflict,validation_drop, andhook_drop. - Both query syntaxes — the
fromkeyword form (piped too) and the composable pipe form — across direct, aliased, andimport/use-bundled call styles; schema definitions are left untouched. - Configuration per
{Mutare.Ecto, …}entry:repo:(Repo-call recognition — one module or a list),families:(:default,:all, an explicit list, or{base, except: […]}),dialects:(portable core by default;:postgres/:mysqlgate dialect-specific swaps), andas:report renaming. - Equivalence reporting: boundary/NULL-sensitive families annotate each
survivor with the specific fixture data a kill would need
(
Mutare.Ecto.equivalence_sensitive_families/0). - Structural-position safety: literals that shape the SQL (fragment templates, interval units, cast types, field/binding names) are never mutated, so no mutant can poison the single metamutant build.