Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Audit CVE/vulnerability source coverage for a technology stack. Maps each component (container, library, base image, runtime) to authoritative CVE feeds, flags gaps, and produces audit-ready reports. Generic: works for any service or stack.
.claude/skills/notque-cve-source-check/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-06 | ✗→✓ | ▲ Improved | -39% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 47% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 3% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 42% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 11% | 0% |
Audits CVE/vulnerability source coverage for a technology stack. Given an inventory of components and (optionally) the feeds you currently monitor, it maps each component to authoritative CVE sources, flags gaps, and emits audit-ready reports.
| In scope | Out of scope | |---|---| | Mapping components → authoritative feeds via a versioned registry | Running vulnerability scanners (Trivy/Snyk/etc.) | | Reporting coverage and gaps in JSON + Markdown | Fetching CVE content or ranking by severity | | Optional HEAD-check for source URL reachability | Integrating with private/commercial vuln databases | | Audit-ready output (deterministic, reproducible) | Live LLM research per run |
| Flag | Purpose | |---|---| | --inventory <file> | JSON inventory: [{name, version?, type?}, ...] or {components: [...]}. | | --inline "name@ver,name,..." | Quick comma-separated list. Mutually exclusive with --inventory. | | --current-sources <file> | Optional. One URL per line. Blank lines and # comments skipped. | | --service <name> | Free-form name used in report header and filenames. | | --check-urls | HEAD-check every source URL (5s timeout, graceful degradation). | | --registry <path> | Override default tech-source-registry.json. | | --out-dir <path> | Output directory (default: cwd). |
JSON inventory format only. YAML is not supported — stdlib does not ship a YAML parser.
| File | Format | |---|---| | cve-source-report-{service}-{YYYYMMDD}.md | Human-readable audit report. | | cve-source-report-{service}-{YYYYMMDD}.json | Machine-readable per references/output-formats.md. |
| Exit code | Meaning | |---|---| | 0 | Full coverage. | | 1 | Gaps exist (unmapped components or unmonitored sources). | | 2 | At least one source URL is unreachable (only with --check-urls). | | 3 | Input error (missing/malformed registry or inventory). |
tech-source-registry.json next to this SKILL.md by default.--inventory: parse JSON; accept either a list or {components: [...]}.--inline: split on commas, parse name@version pairs.--current-sources is provided, read URLs (one per line); normalize forcase-insensitive comparison.
Gate: at least one inventory component is present. Empty inventory → exit 3.
name (and aliases) in the registry.mapped, attach the registry's source list.unmapped, sources [].monitored: true when itsnormalized URL appears in the set.
--check-urls is set, HEAD-check every unique source URL. Treat200/301/302/403/405 as reachable; record definite failures and network errors distinctly. See references/source-verification.md.
Gate: every component has a status; every source has monitored and reachable fields populated (reachable: null when checks are skipped).
gaps, unreachable.
gaps exist).
components exist).
Gate: both files exist on disk and the summary printed; exit code reflects the audit result.
bash# Inline, offline, no monitoring data python3 scripts/check-cve-sources.py \ --inline "go@1.22,alpine@3.19,postgres@16,redis@7,nginx@1.25" \ --service my-service # Inventory file + current monitored feeds python3 scripts/check-cve-sources.py \ --inventory examples/inventory.example.json \ --current-sources examples/current-sources.example.txt \ --service my-service # Same, with link verification python3 scripts/check-cve-sources.py \ --inventory examples/inventory.example.json \ --current-sources examples/current-sources.example.txt \ --service my-service \ --check-urls
To add a technology, edit tech-source-registry.json. Each entry needs name, aliases, type, and 1–3 sources. Schema lives at references/registry-schema.md.
| Signal | Load These Files | Why | |---|---|---| | adding a technology to the registry | registry-schema.md | Defines registry shape and allowed values. | | checking source URLs | source-verification.md | Defines HEAD-check semantics and graceful degradation. | | generating audit reports | output-formats.md | Defines JSON and Markdown report contracts. |
Cause: registry file missing or malformed JSON. Solution: confirm tech-source-registry.json is at --registry (or default location) and parses with python3 -m json.tool.
Cause: inventory file missing, malformed JSON, or unexpected shape. Solution: validate with python3 -m json.tool. Inventory must be a list or an object with a components key.
Cause: no usable components after parsing. Solution: confirm each entry has a name. Inline form requires non-empty tokens.
Cause: --current-sources URLs do not match registry URLs exactly (e.g., extra path segments, trailing slashes). Solution: copy URLs directly from the registry. The script normalizes scheme/host case and trailing slash; everything else must match.
--check-urls flags many [—] entriesCause: network issues (proxy, DNS, offline) — recorded as reachable: null. Solution: re-run without --check-urls for the audit; investigate network separately. Network errors do not affect the gap exit code.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-06 | fail→pass | 22,757 | 5,264 | -77% | 1 | 1 | 0% | 3,959 | 2,404 | -39% | 0 | 0 | — |
case-05 | fail→fail | 14,279 | 7,105 | -50% | 1 | 1 | 0% | 2,377 | 2,710 | +14% | 0 | 0 | — |
case-01 | fail→fail | 25,638 | 8,753 | -66% | 1 | 1 | 0% | 4,460 | 1,939 | -57% | 0 | 0 | — |
case-02 | fail→fail | 4,065 | 7,283 | +79% | 1 | 1 | 0% | 389 | 1,945 | +400% | 0 | 0 | — |
case-03 | fail→fail | 21,629 | 7,660 | -65% | 1 | 1 | 0% | 3,204 | 1,893 | -41% | 0 | 0 | — |
case-04 | fail→pass | 10,593 | 6,007 | -43% | 1 | 1 | 0% | 1,774 | 2,607 | +47% | 0 | 0 | — |
case-07 | fail→pass | 13,996 | 4,879 | -65% | 1 | 1 | 0% | 2,369 | 2,445 | +3% | 0 | 0 | — |
case-08 | fail→pass | 10,532 | 4,538 | -57% | 1 | 1 | 0% | 1,713 | 2,430 | +42% | 0 | 0 | — |
case-09 | fail→pass | 11,265 | 2,137 | -81% | 1 | 1 | 0% | 1,734 | 1,930 | +11% | 0 | 0 | — |
case-10 | pass→pass | 8,221 | 2,485 | -70% | 1 | 1 | 0% | 1,338 | 2,007 | +50% | 0 | 0 | — |
case-11 | fail→pass | 10,275 | 4,778 | -53% | 1 | 1 | 0% | 1,516 | 2,400 | +58% | 0 | 0 | — |
case-12 | fail→pass | 14,487 | 5,363 | -63% | 1 | 1 | 0% | 2,179 | 2,499 | +15% | 0 | 0 | — |
case-13 | pass→pass | 8,793 | 3,378 | -62% | 1 | 1 | 0% | 1,376 | 2,147 | +56% | 0 | 0 | — |
case-14 | fail→pass | 9,065 | 5,390 | -41% | 1 | 1 | 0% | 1,487 | 2,588 | +74% | 0 | 0 | — |
case-15 | fail→pass | 8,001 | 2,316 | -71% | 1 | 1 | 0% | 1,394 | 1,904 | +37% | 0 | 0 | — |
case-16 | pass→pass | 14,307 | 1,480 | -90% | 1 | 1 | 0% | 2,394 | 1,861 | -22% | 0 | 0 | — |
case-17 | fail→pass | 8,287 | 3,038 | -63% | 1 | 1 | 0% | 1,233 | 2,083 | +69% | 0 | 0 | — |
case-18 | fail→pass | 9,390 | 1,982 | -79% | 1 | 1 | 0% | 1,461 | 1,905 | +30% | 0 | 0 | — |
case-19 | fail→pass | 13,051 | 4,148 | -68% | 1 | 1 | 0% | 2,211 | 2,365 | +7% | 0 | 0 | — |
case-20 | fail→pass | 10,625 | 2,633 | -75% | 1 | 1 | 0% | 1,793 | 2,134 | +19% | 0 | 0 | — |
case-21 | pass→pass | 4,811 | 3,583 | -26% | 1 | 1 | 0% | 666 | 2,109 | +217% | 0 | 0 | — |
case-22 | fail→pass | 9,345 | 3,691 | -61% | 1 | 1 | 0% | 1,546 | 2,194 | +42% | 0 | 0 | — |
case-23 | pass→pass | 8,780 | 2,935 | -67% | 1 | 1 | 0% | 1,349 | 2,002 | +48% | 0 | 0 | — |
case-24 | pass→pass | 14,214 | 2,888 | -80% | 1 | 1 | 0% | 2,159 | 2,120 | -2% | 0 | 0 | — |
case-25 | fail→pass | 19,835 | 2,149 | -89% | 1 | 1 | 0% | 3,272 | 1,930 | -41% | 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. 25 cases were attempted, and 22 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 +60 percentage points is the difference between those two pass rates over the 22 comparable cases. 1 case got worse with the skill loaded, and it is 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.