cve-triage — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited cve-triage (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
This skill begins where the scan ends. It receives a list of CVE hits and decides per item: what's this worth, when do we fix, or do we not? Running the scan and building the SBOM happen elsewhere; this is the filter that separates noise from signal.
Triggers:
security-review phase-3 handoff for dep-vulns.supply-chain (SBOM, SLSA, provenance) and sast-orchestrator (SCA-tool configuration).secure-coding phase 6.web-exploit-triage or payload-crafter.container-hardening for the image part, then back here for per-CVE triage.secrets-scanner.ir-runbook. Triage is then too late; response comes first.Six phases. Phase 3 is the heart: a decision tree you walk per CVE. The phases before and after are lighter.
X), fixed-in-version (when available).devDependencies that don't ship in the production bundle, optional features that are off, test fixtures. Label "not-in-prod"; they get an abbreviated phase-3 treatment.Three questions that skew the whole judgement if you miss them. Answer them once per service; they apply to every CVE in that service.
Walk the steps in order. One step may be enough to land on "fix-now" (KEV + reachable + exposed); more often you walk all six.
(a) CISA KEV check. Is the CVE on the CISA Known Exploited Vulnerabilities Catalog? That means demonstrable active exploitation in the wild.
curl -s https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json \
| jq '.vulnerabilities[] | select(.cveID == "CVE-YYYY-NNNNN")'A KEV hit defaults to fix-now, unless you have a strongly substantiated VEX-not-affected claim (see phase 4).
(b) EPSS score. FIRST's Exploit Prediction Scoring System: a probability (0–1) of exploitation in the next 30 days, refreshed daily based on observed exploit activity and vuln features.
curl -s "https://api.first.org/data/v1/epss?cve=CVE-YYYY-NNNNN" \
| jq '.data[0] | {cve, epss, percentile, date}'Use as a relative signal within your portfolio, not a hard cutoff. The distribution is heavily skewed (the majority sits below 0.01). A percentile ≥ 95 means "this is in the top 5% of all CVEs by predicted exploitation"; that's the practical heuristic.
(c) Reachability. Is the vulnerable function actually called from your code, or is it in a code path you don't execute?
govulncheck ./.... Official, call-graph-based, reports per CVE whether you reach the path. The gold standard per ecosystem when it comes to open-source tooling.(d) Exposure modifier. Combine with phase 2.
(e) Compensating controls. What's already in place.
Document every claim. No verified control, no reduction.
(f) Impact estimate. From the CVE description and CVSS vector, not gut feel.
Four outcomes, each with a rationale you write down.
No decision without rationale. If "fix-quarter vs fix-sprint" can't be justified in one sentence: revisit.
Patch path per case:
overrides or resolutions, pnpm overrides, Poetry dependency override, Go replace directive in go.mod, Maven dependencyManagement, Gradle constraints. Verify with npm ls <pkg> or pip show or mvn dependency:tree that the actually installed version is the fixed one.Rollout discipline:
Post-deploy monitoring: the package stays on your radar. New disclosure on the same package = arrange notification. "Accept-risk" entries with expiry get a calendar trigger so they don't quietly expire.
Layer 1: scope (every open CVE assessed, no duplicates, no services skipped?), assumptions ("not reachable" backed by tool output or explicit code inspection, not gut feel?), gaps (tests and dev environments patched on fix-now?), adversarial reader (which decision would an auditor find weakest?).
Layer 2: CVE-IDs are real (NVD check), CVSS scores from NVD or vendor advisory and never self-derived, EPSS numbers with a date (scores change daily), KEV check against the live feed and not a week-old cache, VEX rationale references primary sources and not a blog.
Per CVE a triage entry in this shape:
CVE-YYYY-NNNNN — <package>@<version>
Ecosystem: <npm | pypi | maven | go | cargo | ...>
Introducer: <direct | transitive via X → Y → Z>
CVSS v3.1: <score> (<vector>)
KEV: <yes | no>
EPSS: <0.xxxx — percentile — date>
Reachable: <yes | no | unknown — method>
Exposure: <internet-pre-auth | internet-auth | internal | not-in-prod>
Impact: <RCE | info-disclosure | DoS | ...>
Compensating: <list, or "none">
Decision: <fix-now | fix-sprint | fix-quarter | accept-risk>
Rationale: <1–3 sentences, why this decision given the signals above>
Action: <concrete patch path: "bump lodash to 4.17.21", "override transitive via resolutions", "feature-flag path X">
Expiry: <date — only on accept-risk or temporary mitigation>
VEX status: <affected | not_affected (+ reason) | fixed | under_investigation>Summary at the top:
Triage — <scope / service>
Total: N CVEs over M packages
fix-now: n1 (<short list>)
fix-sprint: n2
fix-quarter: n3
accept-risk: n4
KEV hits: k | Reachable high/critical: r | Not-in-prod: p
Verification-loop:
Verdict: <pass | revise | rewrite>
Security verdict: <no red flags | red flag — ...>Provide VEX entries (for not_affected and under_investigation) as OpenVEX JSON — a separate file scanners can consume so the next cycle doesn't re-surface 200 of the same CVEs. Each entry has at minimum: product identifier (pURL), CVE-ID, status, rationale (justification vocabulary from OpenVEX, e.g. component_not_present, vulnerable_code_not_in_execute_path).
A report without a rationale field per decision is not a triage report; it's a list with colours. Refuse to deliver.
/sites/default/files/feeds/.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.