Re-measure after wave 3, and write down the two kinds of gap it had to separate #189

Merged
JMR-dev merged 1 commits from docs/coverage-wave3 into test/concat-engine-seam 2026-09-02 04:44:33 +00:00
JMR-dev commented 2026-09-02 03:08:08 +00:00 (Migrated from github.com)

Stacked on #188. Docs only — no code changes.

92.8% line (2183/2352), 81.3% branch (1091/1342), 584 JVM tests in 87 classes, measured 2026-09-02 on the tree this branch creates rather than quoted from a PR body.

The shape is worth more than the number

Waves 1 and 2 were finding uncovered code. By wave 3 there was little of that left, so the gaps had to be sorted before any test was written:

  • coverage gaps — filtered to sites where JaCoCo reports mi > 0, which is what separates a real gap from a partial branch on a compound condition. That filter cut the candidate list roughly in half.
  • assertion gaps — JaCoCo green, nothing checking the answer. MainActivity's rail and bottom bar were both executed, and transposing them passed the entire suite; so did swapping the two progress-notification strings, and swapping Content's two destinations. No coverage number would ever have found any of the three.

What the mutation rule actually bought

Naming the required mutation per ticket earned its keep three times — three tests passed, survived their own mutation, and were rewritten. Each is recorded with what the weak assertion actually was, because "write a bad test" is more useful advice with the bad test attached.

Also recorded, because it is the mirror-image trap: a green mutation is only evidence when the mutation is a real change. One classify reordering was semantically equivalent for every reachable input. A bad mutation and a weak test look identical in the output.

Two entries came back as not gaps

A result rather than a shortfall: ContainerCapabilities:282's exclude filter cannot drop anything, and probeForConcat's catch arm is unreachable on this runtime.

Denominators

Both moved, in opposite directions and for different reasons, so they are stated rather than folded into the percentage: 1340 → 1342 branches from MediaProbe.merge, 2348 → 2352 lines from the ConcatJoiner interface. Neither is new untested code.

🤖 Generated with Claude Code

Stacked on #188. Docs only — no code changes. **92.8% line (2183/2352), 81.3% branch (1091/1342), 584 JVM tests in 87 classes**, measured 2026-09-02 on the tree this branch creates rather than quoted from a PR body. ### The shape is worth more than the number Waves 1 and 2 were finding uncovered code. By wave 3 there was little of that left, so the gaps had to be **sorted** before any test was written: - **coverage gaps** — filtered to sites where JaCoCo reports `mi > 0`, which is what separates a real gap from a partial branch on a compound condition. That filter cut the candidate list roughly in half. - **assertion gaps** — JaCoCo green, nothing checking the answer. `MainActivity`'s rail and bottom bar were both *executed*, and transposing them passed the entire suite; so did swapping the two progress-notification strings, and swapping `Content`'s two destinations. **No coverage number would ever have found any of the three.** ### What the mutation rule actually bought Naming the required mutation per ticket earned its keep three times — three tests passed, survived their own mutation, and were rewritten. Each is recorded with what the weak assertion actually was, because "write a bad test" is more useful advice with the bad test attached. Also recorded, because it is the mirror-image trap: **a green mutation is only evidence when the mutation is a real change.** One `classify` reordering was semantically equivalent for every reachable input. A bad mutation and a weak test look identical in the output. ### Two entries came back as not gaps A result rather than a shortfall: `ContainerCapabilities:282`'s `exclude` filter cannot drop anything, and `probeForConcat`'s catch arm is unreachable on this runtime. ### Denominators Both moved, in opposite directions and for different reasons, so they are stated rather than folded into the percentage: 1340 → 1342 branches from `MediaProbe.merge`, 2348 → 2352 lines from the `ConcatJoiner` interface. Neither is new untested code. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Sign in to join this conversation.