# Audit Coverage Gaps

> Discover test coverage gaps that could hide correctness defects

- Skill: `ben-manes/audit-coverage-gaps` (Agent Skill)
- Install (CLI): `npx skillmds@latest add ben-manes/audit-coverage-gaps`
- Raw SKILL.md: https://api.skillmd.com/api/skills/ben-manes/audit-coverage-gaps/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Security
- Author: ben-manes (https://skillmd.com/u/ben-manes)
- Updated: 2026-09-10
- Page: https://skillmd.com/skills/ben-manes/audit-coverage-gaps

---


Assume the existing tests miss at least one real defect.

1. For each public method, identify the hardest-to-test edge cases:
   - Null values (where permitted)
   - Maximum/minimum weight
   - Zero-duration expiration
   - Mapping functions that return the same instance
   - Mapping functions that throw
   - Weighers that throw
   - Expiry callbacks that throw
   - CompletableFuture values (async cache edge cases)
   - Keys/values with adversarial hashCode/equals

2. For each edge case, trace the code path. Does the code handle it correctly?

3. Identify combinatorially hard behavioral dimensions:
   - Operation A on expired entry during concurrent operation B
   - Exception in user callback X while holding lock Y
   - GC collecting reference R between code points P and Q
   - Fast path falls through to slow path under contention (e.g.,
     entry appears expired on fast path, recovers under lock on slow path)
   - Async cache: future completes between check and action (e.g.,
     isComputingAsync returns true, but future completes before
     the code that depends on that check executes)

4. For each candidate gap, provide a minimal test case with the specific
   cache configuration and thread interleaving needed to reach the code path.

Priority ordering:
- Paths involving the catch-commit-rethrow pattern (doComputeIfAbsent, remap)
- Slow paths reachable only via contention (synchronized blocks after optimistic checks)
- Interactions between expiration and the async value lifecycle (ASYNC_EXPIRY, isComputingAsync)

Focus only on behavioral coverage gaps that could hide correctness bugs.

