Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Analyze code coverage metrics and identify untested code paths. Use when analyzing untested code or coverage gaps. Trigger with phrases like "analyze coverage", "check test coverage", or "find untested code".
.claude/skills/jeremylongshore-analyzing-test-coverage/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-07 | ✗→✓ | ▲ Improved | 26% | 0% |
| case-16 | ✗→✓ | ▲ Improved | 57% | 0% |
| case-19 | ✗→✓ | ▲ Improved | 59% | 0% |
| case-20 | ✓→✓ | = Same ✓ | 51% | 0% |
| case-04 | ✓→✓ | = Same ✓ | 36% | 0% |
!ls package.json pyproject.toml Cargo.toml go.mod 2>/dev/null || echo 'No project manifest found' !node -v 2>/dev/null || python3 --version 2>/dev/null || echo 'No runtime detected'
Analyze code coverage metrics to identify untested code paths, dead code, and coverage gaps across line, branch, function, and statement dimensions. Supports Istanbul/nyc (JavaScript/TypeScript), coverage.py (Python), JaCoCo (Java), and Go coverage tools.
go test -cover)npx jest --coverage --coverageReporters=json-summary,lcovpytest --cov=src --cov-report=json --cov-report=term-missinggo test -coverprofile=coverage.out ./...if/else blocks where only one branch is tested.switch/case statements with missing case coverage.catch, except) never exercised.|| and && short-circuit conditions..coveragerc, or CI checks).| Error | Cause | Solution | |-------|-------|---------| | Coverage report shows 0% | Tests ran but coverage instrumentation was not enabled | Verify --coverage flag is passed; check that source files are not excluded by config | | Coverage includes node_modules | Coverage collection scope too broad | Add collectCoverageFrom in Jest config; set --cov=src in pytest; exclude vendor dirs | | Branch coverage much lower than line coverage | Conditional logic is only partially tested | Write tests for both truthy and falsy conditions on each branch; focus on edge cases | | Coverage drops after refactor | New code added without corresponding tests | Set coverageThreshold with global minimums; add --changedSince for incremental checks | | Flaky coverage numbers between runs | Non-deterministic test execution skipping code paths | Sort tests deterministically; run coverage with --runInBand for consistent results |
Jest coverage configuration with thresholds:
json{ "jest": { "coverageThreshold": { "global": { "branches": 70, "functions": 80, "lines": 80, "statements": 80 }, "src/utils/": { "branches": 90, "lines": 95 } }, "collectCoverageFrom": [ "src/**/*.{ts,tsx}", "!src/**/*.d.ts", "!src/**/index.ts" ] } }
Coverage gap analysis output:
Coverage Gaps (sorted by impact):
1. src/auth/oauth.ts Lines: 45% Branches: 30% [Lines 42-67, 89-103 uncovered]
Suggestion: Add tests for token refresh failure and expired session handling
2. src/api/middleware.ts Lines: 62% Branches: 41% [Lines 28-35, 71-80 uncovered]
Suggestion: Test rate limiting edge cases and malformed header handling
3. src/utils/parser.ts Lines: 71% Branches: 55% [Lines 112-130 uncovered]
Suggestion: Test malformed input, empty string, and encoding edge cases| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-07 | fail→pass | 11,855 | 7,944 | -33% | 1 | 1 | 0% | 2,147 | 2,703 | +26% | 0 | 0 | — |
case-20 | pass→pass | 10,075 | 10,543 | +5% | 1 | 1 | 0% | 2,401 | 3,614 | +51% | 0 | 0 | — |
case-01 | fail→fail | 19,479 | 5,646 | -71% | 1 | 1 | 0% | 4,213 | 1,694 | -60% | 0 | 0 | — |
case-02 | fail→fail | 24,443 | 4,411 | -82% | 1 | 1 | 0% | 4,805 | 1,529 | -68% | 0 | 0 | — |
case-03 | fail→fail | 17,144 | 3,827 | -78% | 1 | 1 | 0% | 3,808 | 1,593 | -58% | 0 | 0 | — |
case-04 | pass→pass | 10,760 | 7,979 | -26% | 1 | 1 | 0% | 2,045 | 2,786 | +36% | 0 | 0 | — |
case-05 | pass→pass | 8,244 | 7,079 | -14% | 1 | 1 | 0% | 1,606 | 2,728 | +70% | 0 | 0 | — |
case-06 | pass→pass | 2,031 | 2,886 | +42% | 1 | 1 | 0% | 331 | 1,765 | +433% | 0 | 0 | — |
case-08 | fail→fail | 10,819 | 11,613 | +7% | 1 | 1 | 0% | 1,973 | 3,394 | +72% | 0 | 0 | — |
case-09 | pass→pass | 14,839 | 16,299 | +10% | 1 | 1 | 0% | 2,710 | 4,059 | +50% | 0 | 0 | — |
case-10 | pass→pass | 7,686 | 2,164 | -72% | 1 | 1 | 0% | 1,228 | 1,643 | +34% | 0 | 0 | — |
case-11 | pass→pass | 15,718 | 13,473 | -14% | 1 | 1 | 0% | 2,571 | 3,753 | +46% | 0 | 0 | — |
case-21 | pass→pass | 4,536 | 3,285 | -28% | 1 | 1 | 0% | 1,008 | 1,945 | +93% | 0 | 0 | — |
case-12 | pass→pass | 13,816 | 7,063 | -49% | 1 | 1 | 0% | 2,343 | 2,612 | +11% | 0 | 0 | — |
case-13 | pass→pass | 10,673 | 7,953 | -25% | 1 | 1 | 0% | 2,147 | 2,821 | +31% | 0 | 0 | — |
case-14 | fail→fail | 13,402 | 12,700 | -5% | 1 | 1 | 0% | 2,174 | 3,631 | +67% | 0 | 0 | — |
case-15 | pass→pass | 10,525 | 7,034 | -33% | 1 | 1 | 0% | 2,069 | 2,741 | +32% | 0 | 0 | — |
case-16 | fail→pass | 6,248 | 3,213 | -49% | 1 | 1 | 0% | 1,184 | 1,863 | +57% | 0 | 0 | — |
case-17 | pass→pass | 11,139 | 4,144 | -63% | 1 | 1 | 0% | 1,930 | 1,994 | +3% | 0 | 0 | — |
case-18 | pass→pass | 14,672 | 11,226 | -23% | 1 | 1 | 0% | 2,672 | 3,350 | +25% | 0 | 0 | — |
case-19 | fail→pass | 10,376 | 8,389 | -19% | 1 | 1 | 0% | 1,729 | 2,756 | +59% | 0 | 0 | — |
case-22 | pass→pass | 13,939 | 12,337 | -11% | 1 | 1 | 0% | 2,424 | 3,701 | +53% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 19 counted toward the lift figure. The other 3 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +14 percentage points is the difference between those two pass rates over the 19 comparable cases. 2 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.