Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Triage and remediate security vulnerabilities across Warp infrastructure. Checks Dependabot alerts (GitHub), GCP Artifact Registry container scanning, and Docker Scout for public images. Use when the user asks to check for vulnerabilities, triage CVEs, fix dependency issues, update base images, or remediate security alerts.
.claude/skills/warpdotdev-triage-vulnerabilities/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-07 | ✗→✓ | ▲ Improved | 74% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 132% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 6% | 0% |
| case-15 | ✗→✓ | ▲ Improved | -8% | 0% |
| case-17 | ✗→✓ | ▲ Improved | 43% | 0% |
Triage and remediate security vulnerabilities across four sources: GitHub Dependabot, GCP container registry scanning, Docker Scout, and Linear security issues.
Repos with Dependabot enabled: warp-internal, warp-server, warp-terraform, session-sharing-server.
Fetch open alerts:
bash# All open alerts for a repo (returns JSON array) gh api /repos/warpdotdev/<repo>/dependabot/alerts?state=open # Useful fields per alert: # .number, .state, .html_url # .dependency.package.name, .dependency.package.ecosystem, .dependency.manifest_path # .security_advisory.cve_id, .security_advisory.summary, .security_advisory.severity # .security_vulnerability.first_patched_version.identifier # Summary view: CVE/GHSA, package, severity, fix version, manifest gh api /repos/warpdotdev/<repo>/dependabot/alerts?state=open \ --jq '.[] | [.number, .security_advisory.cve_id // .security_advisory.ghsa_id, .dependency.package.name, .security_advisory.severity, (.security_vulnerability.first_patched_version.identifier // "no fix"), .dependency.manifest_path] | @tsv'
Internal service images in us-east4 across two projects:
astral-field-294621): warp-server, warp-server-jobs, warp-server-migrations, session-sharing-server, pgbouncer-rtcwarp-server-staging): same repos plus cloud-run-source-deployScan steps:
bash# List images in a repo (get digest for vulnerability query) gcloud artifacts docker images list \ us-east4-docker.pkg.dev/<project>/<repo> \ --include-tags --sort-by=~create_time --limit=5 # List vulnerabilities for a specific image gcloud artifacts vulnerabilities list \ "us-east4-docker.pkg.dev/<project>/<repo>/<image>@sha256:<digest>" \ --format=json
Only scan the latest (most recently tagged) image per repo — older images are not actionable.
Public images on Docker Hub under warpdotdev/ org. Currently enrolled repos: dev-base (and potentially others — check with docker scout repo list --org warpdotdev).
bash# List CVEs (critical and high only) docker scout cves warpdotdev/<image> --only-severity critical,high # Check for base image update recommendations docker scout recommendations warpdotdev/<image>
Linear issues with the Security label track vulnerabilities that may not be auto-reported by other tools (e.g., internal findings, manual triages, or organizational security concerns). Note that Linear issues are not automatically closed when vulnerabilities are fixed elsewhere (e.g., via Dependabot PRs), so there may be duplicates across sources.
Find open security issues:
bash# Use the Linear MCP to search for issues with Security label # Example query structure (use Linear MCP tool call): # - Search for issues with label: "Security" # - Filter for state: "Backlog", "Todo", "In Progress" (exclude "Done", "Cancelled") # - Return issue number, title, URL, and current status # Useful fields per issue: # - Issue ID/number (e.g., CLD-2726) # - Title (usually contains CVE ID, e.g., "warp-server-GHSA-8r9q-7v3j-jr4g") # - URL (e.g., https://linear.app/warpdotdev/issue/CLD-2726/...) # - Status (Backlog, Todo, In Progress, Done, Cancelled) # - Description (contains CVE details and affected package info)
IMPORTANT: Use TODOs to track each source.
Query all four sources. Write results to temporary files for reference:
dependabot_alerts.tsv — CVE, package, severity, repo, fix versiongcp_vulns.tsv — CVE, severity, package, image, fix availablescout_vulns.tsv — CVE, severity, package, imagelinear_security.tsv — Issue ID, CVE/Title, status, URLThe same CVE may appear across multiple sources (e.g. a base image vuln reported by both GCP scanning and Docker Scout, or a Dependabot alert duplicated as a Linear issue). Group by CVE ID and note all affected sources/images. When a Linear issue duplicates a vulnerability that's already being tracked (e.g., via Dependabot), note this and consider it resolved once the underlying fix is applied.
IMPORTANT: Add a TODO for each unique vulnerability.
Make sure that you've checked ALL sources and deduplicated vulnerabilities before remediating any.
For each unique vulnerability, starting with critical severity first:
security_vulnerability.first_patched_versionFIX_AVAILABLE fielddocker scout recommendations for base image updateshttps://nvd.nist.gov/vuln/detail/<CVE-ID>https://github.com/advisorieshttps://github.com/GoogleContainerTools/distroless/issuesIf no upstream fix exists, report the vulnerability and move on. Do NOT attempt to deactivate/dismiss alerts — only a human can do this.
Fixes fall into three categories:
Dependabot auto-fix available: The simplest case. Check if Dependabot has already created a PR:
bashgh pr list --repo warpdotdev/<repo> --author app/dependabot --state open --json title,url
If a PR exists, review and approve it. If not, the fix may require manual intervention.
Dependency update: When Dependabot can't auto-fix (e.g. major version bump needed), update the dependency manually in the appropriate manifest (Cargo.toml, go.mod, package.json, etc.), run tests, and submit a PR.
regex to pull in a fixed version of aho-corasick).Infrastructure change: For container image vulnerabilities, the fix may involve:
Dockerfile)session-sharing-server)When submitting a fix PR, include:
create-pr skill for PR creationIf a vulnerability has no available fix (e.g. waiting on distroless base image update), report:
Suggest that a human deactivate the alert until a fix is available. NEVER dismiss or deactivate alerts yourself.
astral-field-294621), then staging| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 21,873 | 48,356 | +121% | 1 | 1 | 0% | 4,047 | 2,737 | -32% | 0 | 0 | — |
case-02 | fail→fail | 27,029 | 27,385 | +1% | 1 | 1 | 0% | 4,269 | 2,458 | -42% | 0 | 0 | — |
case-03 | fail→fail | 7,503 | 35,847 | +378% | 1 | 1 | 0% | 197 | 2,636 | +1238% | 0 | 0 | — |
case-04 | pass→pass | 19,335 | 20,222 | +5% | 1 | 1 | 0% | 3,322 | 5,717 | +72% | 0 | 0 | — |
case-05 | pass→pass | 13,246 | 15,597 | +18% | 1 | 1 | 0% | 2,256 | 4,706 | +109% | 0 | 0 | — |
case-06 | pass→pass | 25,927 | 31,843 | +23% | 1 | 1 | 0% | 3,938 | 7,012 | +78% | 0 | 0 | — |
case-07 | fail→pass | 9,703 | 4,650 | -52% | 1 | 1 | 0% | 1,405 | 2,443 | +74% | 0 | 0 | — |
case-08 | fail→fail | 14,692 | 18,038 | +23% | 1 | 1 | 0% | 2,188 | 2,490 | +14% | 0 | 0 | — |
case-09 | fail→pass | 7,289 | 4,085 | -44% | 1 | 1 | 0% | 1,086 | 2,515 | +132% | 0 | 0 | — |
case-10 | fail→pass | 16,290 | 8,044 | -51% | 1 | 1 | 0% | 2,299 | 2,443 | +6% | 0 | 0 | — |
case-11 | pass→pass | 9,892 | 14,078 | +42% | 1 | 1 | 0% | 1,488 | 2,282 | +53% | 0 | 0 | — |
case-12 | pass→pass | 12,448 | 8,228 | -34% | 1 | 1 | 0% | 1,903 | 2,275 | +20% | 0 | 0 | — |
case-13 | pass→pass | 11,844 | 8,067 | -32% | 1 | 1 | 0% | 1,767 | 2,748 | +56% | 0 | 0 | — |
case-14 | fail→fail | 9,856 | 3,592 | -64% | 1 | 1 | 0% | 1,304 | 2,487 | +91% | 0 | 0 | — |
case-15 | fail→pass | 29,270 | 7,320 | -75% | 1 | 1 | 0% | 3,220 | 2,969 | -8% | 0 | 0 | — |
case-16 | pass→pass | 26,397 | 4,533 | -83% | 1 | 1 | 0% | 2,409 | 2,634 | +9% | 0 | 0 | — |
case-17 | fail→pass | 16,144 | 6,805 | -58% | 1 | 1 | 0% | 2,125 | 3,034 | +43% | 0 | 0 | — |
case-18 | fail→pass | 14,303 | 4,059 | -72% | 1 | 1 | 0% | 1,565 | 2,596 | +66% | 0 | 0 | — |
case-19 | pass→pass | 14,007 | 4,643 | -67% | 1 | 1 | 0% | 1,978 | 2,781 | +41% | 0 | 0 | — |
case-20 | pass→fail | 130,039 | 6,915 | -95% | 1 | 1 | 0% | 1,410 | 2,342 | +66% | 0 | 0 | — |
case-21 | pass→pass | 12,766 | 3,335 | -74% | 1 | 1 | 0% | 1,860 | 2,480 | +33% | 0 | 0 | — |
case-22 | pass→pass | 27,256 | 4,404 | -84% | 1 | 1 | 0% | 2,177 | 2,764 | +27% | 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 +23 percentage points is the difference between those two pass rates over the 19 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.