Coverage Drop Investigator
Runbook-style skill for investigating coverage regressions. Identifies which changes caused coverage to drop and recommends targeted tests.
Activation
/coverage-drop-investigator
Investigation Flow
Step 1: Measure Current Coverage
# Generate coverage report
npx jest --coverage --coverageReporters=json-summary
# View summary
cat coverage/coverage-summary.json | jq '.total'
Step 2: Find When Coverage Dropped
# Compare coverage with main branch
git stash && npx jest --coverage --coverageReporters=json-summary
mv coverage/coverage-summary.json coverage/baseline.json
git stash pop && npx jest --coverage --coverageReporters=json-summary
# Compare
jq -s '.[0].total.statements.pct as $baseline | .[1].total.statements.pct as $current | {baseline: $baseline, current: $current, delta: ($current - $baseline)}' coverage/baseline.json coverage/coverage-summary.json
Step 3: Identify Uncovered Files
# Find files with lowest coverage
cat coverage/coverage-summary.json | jq 'to_entries | map(select(.key != "total")) | sort_by(.value.statements.pct) | .[0:10] | .[] | {file: .key, statements: .value.statements.pct, branches: .value.branches.pct}'
Step 4: Map to Recent Changes
# Find recently changed files with low coverage
git diff --name-only main...HEAD | while read file; do
jq --arg f "$file" '.[$f] // empty | {file: $f, statements: .statements.pct}' coverage/coverage-summary.json
done
Step 5: Recommend Tests
For each uncovered file, identify:
- Uncovered functions — need new test cases
- Uncovered branches — need conditional test cases (if/else paths)
- Uncovered lines — may indicate dead code or missing edge cases
Step 6: Report
## Coverage Drop Report
- **Current**: {{current_pct}}%
- **Baseline (main)**: {{baseline_pct}}%
- **Delta**: {{delta}}%
- **Files causing drop**:
| File | Coverage | Changed Lines | Tests Needed |
|------|----------|--------------|-------------|
| {{file}} | {{pct}}% | {{lines}} | {{count}} |
- **Recommended action**: {{write_tests / accept_drop / mark_as_excluded}}
Composition
After investigation:
/qe-test-generation— generate tests for uncovered files/mutation-testing— verify existing tests actually catch bugs/coverage-guard— prevent future drops
Gotchas
- Coverage can drop because NEW code was added without tests, not because tests were removed
- 100% coverage is not always the goal — focus on critical paths, not getters/setters
- Branch coverage drops are more concerning than line coverage drops — branches indicate logic paths
- Coverage tools may count generated code or type definitions — exclude with coveragePathIgnorePatterns