Coverage Analysis
Purpose
Explain what .NET coverage evidence proves, reconcile target arithmetic, and
identify the code blocking progress. Add complexity/CRAP ranking only when the
user explicitly asks for risk hotspots, CRAP, priorities by risk, or refactoring
safety.
When to Use
Use this skill for interpreting supplied .NET line/branch/condition evidence,
coverage gaps and plateaus, target arithmetic, or explicit project-wide
coverage-backed risk analysis.
When Not to Use
- Named method, class, or file CRAP/refactoring-safety analysis — use the
crap-score skill instead
- Static source-to-test pairing or listing files with no tests — use
find-untested-sources
- Behavioral or pseudo-mutation gaps in existing tests — use
test-gap-analysis
- Test trait/category distributions or coverage shape by test type — use
test-tagging
- Writing or generating tests — this skill identifies where tests are needed, not write them
- General test execution unrelated to coverage or CRAP analysis
- Only collecting .NET coverage or printing a raw percentage with no diagnosis — use
run-tests; use native tooling for non-.NET coverage collection or analysis. Interpreting .NET line/branch gaps remains in scope here
Inputs
| Input |
Required |
Default |
Description |
| Project/solution path |
No |
Current directory |
Path to the .NET solution or project |
| Line coverage threshold |
No |
80% |
Minimum acceptable line coverage |
| Branch coverage threshold |
No |
70% |
Minimum acceptable branch coverage |
| Existing Cobertura path |
No |
Discover only if not supplied |
Preferred input; never rerun tests when usable |
| CRAP threshold |
No |
30 |
Used only for explicit risk/CRAP requests |
| Hotspot count |
No |
3 |
Explicit risk requests only; cap at 10 unless the user asks for more |
Discover optional inputs from the workspace. Do not ask for a project path when
the current directory or a supplied report is sufficient.
Choose the smallest matching path
| User intent |
Required work |
Do not do |
| Explain a supplied excerpt, condition, or summary |
Answer directly from the supplied evidence |
Tools, CRAP, discovery, report files |
| Interpret a supplied Cobertura path or diagnose a plateau |
Read that report, reconcile totals, name all material gaps, answer directly |
Rerun tests, install tools, compute CRAP, or generate files unless explicitly requested |
| Rank risk hotspots, compute project-wide CRAP, or assess refactoring safety |
Use the supplied/existing report, read references/guidelines.md, and compute CRAP before ranking |
Coverage-only ranking or a full report template unless requested |
| Analyze coverage when no report exists |
Invoke run-tests to collect coverage with the repository-compatible runner, then analyze the generated report |
Choose or execute a test command independently; CRAP unless risk was requested |
| Produce a full markdown/HTML/CSV report |
First deliver the direct answer; then read references/output-format.md or references/report-generation.md |
Report generation before the answer |
Words such as analyze coverage, what is blocking coverage, or why is
coverage stuck do not by themselves request CRAP. Explicit signals include
risk hotspot, CRAP, complexity-weighted priority, safe to refactor,
or an equivalent request to combine complexity with coverage.
Existing-data fast path
When the user supplies a coverage excerpt, summary, or valid Cobertura path:
- Treat it as authoritative input and start there.
- Do not discover the solution or test projects unless source mapping is necessary.
- Do not run
dotnet test, install ReportGenerator, add a coverage package, or
read references/setup-discovery.md or references/report-generation.md.
- Do not write
coverage-analysis.md or create a report directory unless the user
requested a saved/full report.
- For interpretation and plateau questions, parse only the evidence needed to
answer. For explicit project-wide risk requests, use the bundled scripts as
described in
references/guidelines.md.
A failed read/view operation is not proof that a named path does not exist.
Classify the failure, then make one targeted existence probe and use a normalized
path or alternate reader only for confirmed tool availability, transport, or
path-normalization failures and only after verifying the canonical path remains
inside the workspace. Stop on content-exclusion, permission/policy,
workspace-boundary, or unknown failures. Report a missing path only when the
independent probe also fails; do not broaden the search or substitute another
artifact.
Collection path
Use this path only when no usable coverage evidence exists and the user asked for
analysis that requires it.
- Read
references/setup-discovery.md.
- Prefer existing Cobertura discovered under the requested root.
- If none exists, invoke
run-tests for repository overlay, platform, runner,
and command selection, and have it collect Cobertura once per entry point.
- Analyze the resulting Cobertura. Compute CRAP only if risk analysis was
explicitly requested.
When the workspace contains the project/test manifests needed by this path,
perform discovery directly and delegate collection to run-tests. Do not ask
the user to attach files or pre-run coverage that the current workspace lets
you inspect and generate.
Do not modify production code. Any incidental test-project change needed for
collection is owned by run-tests; include that change and its revert command
in the final analysis.
The automatic collection path is for SDK-style projects. For classic non-SDK or
packages.config projects, use only a repository-owned coverage command. If none
exists, stop and request Cobertura XML. Never migrate the project, inject an
SDK-style provider, create a wrapper project, or report substitute coverage from
another assembly.
Interpretation and arithmetic invariants
- A line hit proves execution, not both decision outcomes.
condition-coverage="50% (1/2)" proves one reported outcome ran, but not which
one. Recommend forcing the opposite outcome. Without source, never invent likely
predicates or claim whether true or false is missing. State that compound
predicates need independently exercised operands and short-circuit combinations
when applicable; do not infer the exact combinations without source or fuller XML.
- Derive overall totals from Cobertura's covered/valid line counts. For target
T, required covered lines are ceiling(valid lines × T).
- Projected coverage is
(current covered lines + newly covered distinct lines) / valid lines. State assumptions such as fully covering a method.
- When asked whether one member can reach a target, show its maximum projected
total and at least one concrete sufficient combination of supplied members or
line gains. If no supplied combination is sufficient, say so.
- For a multi-member target, name the exact combination and resulting covered /
valid total; saying only "combine it with another member" is incomplete.
- Reconcile member gaps against project totals. Method line ranges can overlap or
omit class-level lines, so do not sum method counts as project truth.
- Never call one member the sole, entire, or all remaining gap unless
its distinct uncovered lines exactly reconcile with the project total and no
other below-threshold member remains.
- Name every supplied or extracted below-threshold member, but keep detail
proportional: lead with the blockers, summarize the remainder in one sentence
or a compact table.
Response contract
Answer the user's question in the first 2–4 sentences.
- Excerpt or arithmetic question: one explanation plus the next test or member
priority. No dashboard.
- Existing-report interpretation or plateau: overall line/branch coverage,
blocking members, reconciled target impact, and 1–3 recommendations. Use at
most one compact table.
- Explicit risk/CRAP request: top 3 actual hotspots by default, supporting
complexity/coverage/CRAP values, remaining flagged count, and 1–3 priorities.
Exclude fully covered low-risk methods from the hotspot table. Never exceed 10
rows unless the user requests a larger count. For refactoring safety, rank risky
methods by CRAP rather than raw coverage alone, then name comparatively safe
well-covered methods separately.
- Explicit full report request: read
references/output-format.md. Save the
report only then.
Report only artifacts that exist. Do not announce inaccessible output paths or
failed optional file writes when no file was requested.
Optional reports
HTML/CSV/markdown files are not part of normal analysis. Generate them only when
the user explicitly requests report files or a CI artifact.
- Deliver the direct coverage/risk answer first.
- For a full markdown report, read
references/output-format.md and save it.
- For HTML/CSV, then read
references/report-generation.md. Do not install
ReportGenerator before the direct answer, and do not retry a failed install.
Validation
- Confirm a supplied report was used without test execution or tool installation.
- Reconcile covered, valid, and uncovered line totals before projecting impact.
- Confirm every stated blocker comes from supplied or extracted evidence.
- If CRAP was requested, spot-check one score using
references/guidelines.md.
- If files were requested, verify they exist before reporting their paths.
Common Pitfalls
- Existing report triggers setup work — stop. Analyze the named artifact first.
- Generic analysis triggers CRAP — stop. CRAP requires explicit risk intent.
- One method is called the entire gap — reconcile distinct uncovered lines and
the full below-threshold set first.
- A small request gets a dashboard — scale down to a direct answer or one table.
- No Cobertura from collection — report the collection failure; do not invent
substitute coverage.
- Compiler-generated method names — verify suspicious async, lambda, or local
function names against source before presenting them as user-authored members.
- Test exit code 1 — coverage may still exist; proceed with a warning. Other
nonzero build failures stop the collection path.
1---2name: coverage-analysis3description: Activation requires either supplied .NET coverage reports/percentages/line, branch, or condition metrics, or an explicit request to collect .NET coverage for analysis. USE FOR: interpreting that evidence, including Cobertura data, partial conditions, plateaus, target arithmetic, project-wide coverage-backed CRAP, and coverage-backed refactoring safety. Analyze supplied reports directly without rerunning tests or installing tools. DO NOT USE FOR: requests with neither coverage evidence nor explicit coverage-collection intent, including hypothetical change-survival questions (use test-gap-analysis); CRAP or refactoring safety for one named target (use crap-score); or requests owned by test-tagging, find-untested-sources, test-anti-patterns, run-tests, or code-testing-agent.4license: MIT5---6
7# Coverage Analysis
8
9## Purpose
10
11Explain what .NET coverage evidence proves, reconcile target arithmetic, and
12identify the code blocking progress. Add complexity/CRAP ranking only when the
13user explicitly asks for risk hotspots, CRAP, priorities by risk, or refactoring
14safety.
15
16## When to Use
17
18Use this skill for interpreting supplied .NET line/branch/condition evidence,
19coverage gaps and plateaus, target arithmetic, or explicit project-wide
20coverage-backed risk analysis.
21
22## When Not to Use
23
24- **Named method, class, or file CRAP/refactoring-safety analysis** — use the `crap-score` skill instead
25- **Static source-to-test pairing or listing files with no tests** — use `find-untested-sources`
26- **Behavioral or pseudo-mutation gaps in existing tests** — use `test-gap-analysis`
27- **Test trait/category distributions or coverage shape by test type** — use `test-tagging`
28- **Writing or generating tests** — this skill identifies where tests are needed, not write them
29- **General test execution** unrelated to coverage or CRAP analysis
30- **Only collecting .NET coverage or printing a raw percentage with no diagnosis** — use `run-tests`; use native tooling for non-.NET coverage collection or analysis. Interpreting .NET line/branch gaps remains in scope here
31
32## Inputs
33
34| Input | Required | Default | Description |
35|-------|----------|---------|-------------|
36| Project/solution path | No | Current directory | Path to the .NET solution or project |
37| Line coverage threshold | No | 80% | Minimum acceptable line coverage |
38| Branch coverage threshold | No | 70% | Minimum acceptable branch coverage |
39| Existing Cobertura path | No | Discover only if not supplied | Preferred input; never rerun tests when usable |
40| CRAP threshold | No | 30 | Used only for explicit risk/CRAP requests |
41| Hotspot count | No | 3 | Explicit risk requests only; cap at 10 unless the user asks for more |
42
43Discover optional inputs from the workspace. Do not ask for a project path when
44the current directory or a supplied report is sufficient.
45
46## Choose the smallest matching path
47
48| User intent | Required work | Do not do |
49|-------------|---------------|-----------|
50| Explain a supplied excerpt, condition, or summary | Answer directly from the supplied evidence | Tools, CRAP, discovery, report files |
51| Interpret a supplied Cobertura path or diagnose a plateau | Read that report, reconcile totals, name all material gaps, answer directly | Rerun tests, install tools, compute CRAP, or generate files unless explicitly requested |
52| Rank risk hotspots, compute project-wide CRAP, or assess refactoring safety | Use the supplied/existing report, read `references/guidelines.md`, and compute CRAP before ranking | Coverage-only ranking or a full report template unless requested |
53| Analyze coverage when no report exists | Invoke `run-tests` to collect coverage with the repository-compatible runner, then analyze the generated report | Choose or execute a test command independently; CRAP unless risk was requested |
54| Produce a full markdown/HTML/CSV report | First deliver the direct answer; then read `references/output-format.md` or `references/report-generation.md` | Report generation before the answer |
55
56Words such as **analyze coverage**, **what is blocking coverage**, or **why is
57coverage stuck** do not by themselves request CRAP. Explicit signals include
58**risk hotspot**, **CRAP**, **complexity-weighted priority**, **safe to refactor**,
59or an equivalent request to combine complexity with coverage.
60
61## Existing-data fast path
62
63When the user supplies a coverage excerpt, summary, or valid Cobertura path:
64
65- Treat it as authoritative input and start there.
66- Do not discover the solution or test projects unless source mapping is necessary.
67- Do not run `dotnet test`, install ReportGenerator, add a coverage package, or
68 read `references/setup-discovery.md` or `references/report-generation.md`.
69- Do not write `coverage-analysis.md` or create a report directory unless the user
70 requested a saved/full report.
71- For interpretation and plateau questions, parse only the evidence needed to
72 answer. For explicit project-wide risk requests, use the bundled scripts as
73 described in `references/guidelines.md`.
74
75A failed read/view operation is not proof that a named path does not exist.
76Classify the failure, then make one targeted existence probe and use a normalized
77path or alternate reader only for confirmed tool availability, transport, or
78path-normalization failures and only after verifying the canonical path remains
79inside the workspace. Stop on content-exclusion, permission/policy,
80workspace-boundary, or unknown failures. Report a missing path only when the
81independent probe also fails; do not broaden the search or substitute another
82artifact.
83
84## Collection path
85
86Use this path only when no usable coverage evidence exists and the user asked for
87analysis that requires it.
88
891. Read `references/setup-discovery.md`.
902. Prefer existing Cobertura discovered under the requested root.
913. If none exists, invoke `run-tests` for repository overlay, platform, runner,
92 and command selection, and have it collect Cobertura once per entry point.
934. Analyze the resulting Cobertura. Compute CRAP only if risk analysis was
94 explicitly requested.
95
96When the workspace contains the project/test manifests needed by this path,
97perform discovery directly and delegate collection to `run-tests`. Do not ask
98the user to attach files or pre-run coverage that the current workspace lets
99you inspect and generate.
100
101Do not modify production code. Any incidental test-project change needed for
102collection is owned by `run-tests`; include that change and its revert command
103in the final analysis.
104
105The automatic collection path is for SDK-style projects. For classic non-SDK or
106`packages.config` projects, use only a repository-owned coverage command. If none
107exists, stop and request Cobertura XML. Never migrate the project, inject an
108SDK-style provider, create a wrapper project, or report substitute coverage from
109another assembly.
110
111## Interpretation and arithmetic invariants
112
113- A line hit proves execution, not both decision outcomes.
114- `condition-coverage="50% (1/2)"` proves one reported outcome ran, but not which
115 one. Recommend forcing the opposite outcome. Without source, never invent likely
116 predicates or claim whether true or false is missing. State that compound
117 predicates need independently exercised operands and short-circuit combinations
118 when applicable; do not infer the exact combinations without source or fuller XML.
119- Derive overall totals from Cobertura's covered/valid line counts. For target
120 `T`, required covered lines are `ceiling(valid lines × T)`.
121- Projected coverage is `(current covered lines + newly covered distinct lines) /
122 valid lines`. State assumptions such as fully covering a method.
123- When asked whether one member can reach a target, show its maximum projected
124 total and at least one concrete sufficient combination of supplied members or
125 line gains. If no supplied combination is sufficient, say so.
126- For a multi-member target, name the exact combination and resulting covered /
127 valid total; saying only "combine it with another member" is incomplete.
128- Reconcile member gaps against project totals. Method line ranges can overlap or
129 omit class-level lines, so do not sum method counts as project truth.
130- Never call one member the **sole**, **entire**, or **all** remaining gap unless
131 its distinct uncovered lines exactly reconcile with the project total and no
132 other below-threshold member remains.
133- Name every supplied or extracted below-threshold member, but keep detail
134 proportional: lead with the blockers, summarize the remainder in one sentence
135 or a compact table.
136
137## Response contract
138
139Answer the user's question in the first 2–4 sentences.
140
141- **Excerpt or arithmetic question:** one explanation plus the next test or member
142 priority. No dashboard.
143- **Existing-report interpretation or plateau:** overall line/branch coverage,
144 blocking members, reconciled target impact, and 1–3 recommendations. Use at
145 most one compact table.
146- **Explicit risk/CRAP request:** top 3 actual hotspots by default, supporting
147 complexity/coverage/CRAP values, remaining flagged count, and 1–3 priorities.
148 Exclude fully covered low-risk methods from the hotspot table. Never exceed 10
149 rows unless the user requests a larger count. For refactoring safety, rank risky
150 methods by CRAP rather than raw coverage alone, then name comparatively safe
151 well-covered methods separately.
152- **Explicit full report request:** read `references/output-format.md`. Save the
153 report only then.
154
155Report only artifacts that exist. Do not announce inaccessible output paths or
156failed optional file writes when no file was requested.
157
158## Optional reports
159
160HTML/CSV/markdown files are not part of normal analysis. Generate them only when
161the user explicitly requests report files or a CI artifact.
162
1631. Deliver the direct coverage/risk answer first.
1642. For a full markdown report, read `references/output-format.md` and save it.
1653. For HTML/CSV, then read `references/report-generation.md`. Do not install
166 ReportGenerator before the direct answer, and do not retry a failed install.
167
168## Validation
169
170- Confirm a supplied report was used without test execution or tool installation.
171- Reconcile covered, valid, and uncovered line totals before projecting impact.
172- Confirm every stated blocker comes from supplied or extracted evidence.
173- If CRAP was requested, spot-check one score using `references/guidelines.md`.
174- If files were requested, verify they exist before reporting their paths.
175
176## Common Pitfalls
177
178- **Existing report triggers setup work** — stop. Analyze the named artifact first.
179- **Generic analysis triggers CRAP** — stop. CRAP requires explicit risk intent.
180- **One method is called the entire gap** — reconcile distinct uncovered lines and
181 the full below-threshold set first.
182- **A small request gets a dashboard** — scale down to a direct answer or one table.
183- **No Cobertura from collection** — report the collection failure; do not invent
184 substitute coverage.
185- **Compiler-generated method names** — verify suspicious async, lambda, or local
186 function names against source before presenting them as user-authored members.
187- **Test exit code 1** — coverage may still exist; proceed with a warning. Other
188 nonzero build failures stop the collection path.