Three clusters of surviving mutants are real missing assertions #7

Open
opened 2026-08-02 18:53:20 -04:00 by tachikoma · 0 comments
Collaborator

Source: TODO.md §2.4 (at 669b2b3)

The mutation harness samples 260 of 1701 mutants and kills 72.3%. Most of the
72 survivors are equivalent mutants rather than missing tests -- README.md has
the full breakdown -- but three clusters are real work:

  • FINISH(e, true) -> FINISH(e, false), 3 survivors. An error swallowed
    instead of propagated out of an ATTEMPT block, and nothing notices. Each is a
    call whose failure path is exercised but whose propagation is not: the test
    asserts the status the callee raised without checking it came from the callee
    rather than being re-raised locally. tests/test_pool.c's origin assertions
    are the shape of the fix.
  • SUCCEED_RETURN deleted, 7 survivors. The function falls off the end and
    returns whatever is in the return register, which is NULL often enough to
    pass.
    These need an assertion on the side effect -- the buffer that was
    filled, the node that was linked -- rather than on the returned status.
  • FAIL_* guards deleted, ~6 of the 14 in that group. Each is an argument
    check nothing drives. The other 8 in the group are constant shifts no test can
    catch, because the test names the same constant symbolically and moves with it.

Two survivors in this class were real and are already fixed: the right child's
depth + 1 in the depth-first walk, and aksl_tree_remove on an empty tree.

What closing them would touch. Only tests/. Raise the --threshold in
.gitea/workflows/ci.yaml and .githooks/pre-push in step, as a ratchet.

Files: tests/, .gitea/workflows/ci.yaml, .githooks/pre-push


Filed by Tachikoma (Claude Code, Opus 5, 1M context)

**Source:** TODO.md §2.4 (at 669b2b3) The mutation harness samples 260 of 1701 mutants and kills **72.3%**. Most of the 72 survivors are equivalent mutants rather than missing tests -- `README.md` has the full breakdown -- but three clusters are real work: - **`FINISH(e, true)` -> `FINISH(e, false)`, 3 survivors.** An error swallowed instead of propagated out of an `ATTEMPT` block, and nothing notices. Each is a call whose failure path is exercised but whose *propagation* is not: the test asserts the status the callee raised without checking it came from the callee rather than being re-raised locally. **`tests/test_pool.c`'s origin assertions are the shape of the fix.** - **`SUCCEED_RETURN` deleted, 7 survivors.** The function falls off the end and returns whatever is in the return register, **which is NULL often enough to pass.** These need an assertion on the *side effect* -- the buffer that was filled, the node that was linked -- rather than on the returned status. - **`FAIL_*` guards deleted, ~6 of the 14 in that group.** Each is an argument check nothing drives. The other 8 in the group are constant shifts no test can catch, because the test names the same constant symbolically and moves with it. Two survivors in this class were real and are already fixed: the right child's `depth + 1` in the depth-first walk, and `aksl_tree_remove` on an empty tree. **What closing them would touch.** Only `tests/`. Raise the `--threshold` in `.gitea/workflows/ci.yaml` and `.githooks/pre-push` in step, **as a ratchet.** **Files:** `tests/`, `.gitea/workflows/ci.yaml`, `.githooks/pre-push` --- Filed by Tachikoma (Claude Code, Opus 5, 1M context)
tachikoma added this to the 0.2.x milestone 2026-08-02 18:53:20 -04:00
tachikoma added the test-coverageblast-radius:mediumstatus::grooming labels 2026-08-02 18:53:20 -04:00
Sign in to join this conversation.