Mutation-testing baseline 2026-08-22: 281 surviving mutants, 419 unreached #87
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
[claude 2026-08-22] First mutation-testing baseline, gremlins v0.6.0,
make mutate(added in the same cycle). 54 packages, 2996 mutants, 22 min wall on tmpfs with 2 workers. internal/agent/cloudhv excluded — see the SIGKILL issue.Totals: killed 2255 / lived 281 / not covered 419 / timed out 41.
Test efficacy 88.9% (of mutants the tests execute, ~1 in 9 changes behaviour unnoticed). Mutant coverage 84.6% (419 mutants no test reaches).
Weakest efficacy — code is executed but not asserted:
Weakest mutant coverage — code no test reaches at all:
Full per-package table, JSON and logs: /var/tmp/gremlins-baseline/v2/ (not durable — rerun with make mutate).
This issue is the record of where we started, not a task. Split per-package work off it as separate issues.
Migrated from git-collab issue
d78939caed3f63f2810e04ecf8484dd5aad38080.Original author: a73x dev@a73x.sh.
[claude 2026-08-23] One note for the baseline's interpretation, from the work merged in
d0c032f.A mutant reported TIMED OUT is not necessarily an unobserved mutant. On the
lying-testsbranch in isolation, gremlins reported 1 timed out againstinternal/server/syncsvc. Fable reproduced the mutant class by hand:10 * time.Second→/makes the production handshake default 0, and the package then fails by assertion in ~6.5s (TestOpenTCPRefused,TestReconnectKeepsNewConnRegistered— both tests that do not override the field, so the production default's presence is genuinely enforced).The TIMED OUT was gremlins' per-mutant clock (baseline × coefficient) expiring before the slowed suite finished, not a surviving mutant. In the integrated tree the same line reports a clean kill: 7 killed, 0 lived, 0 not covered.
So when reading the 281-survivor baseline: treat TIMED OUT as "unknown, re-run in isolation with a longer coefficient", not as "lived".
[claude 2026-08-23] Re-baseline after the comment-audit cycle (~40 tests added). Same method:
make mutateper package, gremlins v0.6.0, 2 workers, timeout-coefficient 10, cloudhv excluded.Comparable scope (internal/ minus internal/pb, 51 packages producing mutants — 2999 mutants vs the original's 2996, which is what confirms the scope matches; the original's "54 packages" counted three that yielded none):
97 surviving mutants died. That is the audit's effect, and it is the only number here that moved for a reason internal to the tree.
Two cautions on the rest:
killedreads 82 lower than last time despite the tree being strictly better tested. Do not read the killed column as a regression. If a clean number is ever needed, rerun on an idle box.Two scope notes for anyone rerunning:
internal/pbcontributes 287 not-covered mutants and nothing else — generated protobuf, no tests, never worth mutating. The original baseline excluded it; keep excluding it or the totals stop comparing.cmd/*(8 packages) contributes 29 not-covered and zero kills. Also outside the original scope.Eight packages produce no mutants at all (
internal/agent/exec,internal/agent/permanent,internal/arch,internal/guest,internal/random,internal/relmanifest,internal/server/api/types,internal/version) — declarations and thin wrappers with nothing to mutate.Where the survivors now live:
internal/server/apiis now the single worst package on both axes and did not appear at the top of either table in the original. Worth its own issue.