From dryrun-finding-remediation
Trigger when user wants to remediate DryRun Deepscan findings or merged pull request findings. Activates when the user asks to fix findings from a deepscan or from a pull request that has already been scanned, and wants to open a fresh PR with the fixes. Covers both code vulnerabilities (deepscan + PR) and SCA advisory findings (deepscan only). Use when the user mentions remediation, fixing, or addressing DryRunSecurity findings, deepscan findings, SCA findings, or PR scan results.
How this skill is triggered — by the user, by Claude, or both
Slash command
/dryrun-finding-remediation:dryrun-finding-remediationThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Pull DryRunSecurity findings via the API and remediate them on a fresh branch with a new PR. Unlike the `remediation` skill (which works on an already-open PR's comments), this skill pulls findings from the API and creates a brand-new PR with the fixes.
Pull DryRunSecurity findings via the API and remediate them on a fresh branch with a new PR. Unlike the remediation skill (which works on an already-open PR's comments), this skill pulls findings from the API and creates a brand-new PR with the fixes.
Prerequisite: The DRYRUN_API_KEY environment variable must be set. If missing, tell the user: "Set your API key with export DRYRUN_API_KEY=your-key."
The scripts/dryrun_api.py script is the interface to the DryRunSecurity API. It uses Python 3 stdlib only — no pip dependencies.
python3 scripts/dryrun_api.py <command> [flags]
| Command | Required Flags | Optional Flags | Purpose |
|---|---|---|---|
list-accounts | (none) | (none) | List accessible accounts |
list-repos | --account-id | --page, --per-page | List repos for an account |
list-scans | --account-id, --repo-id | --page, --per-page, --severity, --pr-number, --date-from, --date-to | List PR scans for a repo |
get-scan | --account-id, --repo-id, --scan-id | --findings-result, --page, --per-page | Get detailed scan findings |
list-deepscans | --account-id, --repo-id | (none) | Get latest deepscan for a repo |
get-deepscan-results | --account-id, --repo-id, --deepscan-id | --severity, --page, --per-page | Get deepscan code findings |
get-sca-results | --account-id, --repo-id, --deepscan-id | --severity, --page, --per-page | Get SCA findings |
All commands output JSON to stdout. Pagination info is included when the API returns it (total, page, per_page, total_pages).
The API requires an account_id for all endpoints.
python3 scripts/dryrun_api.py list-accounts and present the list to the user. Each account shows account_id, org_name, provider_type, and active status.account_id in context for the rest of the session.Ask the user:
Would you like to remediate PR findings or Deepscan findings?
PR findings → read references/PR_REMEDIATION.md and follow that path
Deepscan findings → ask the sub-question:
Would you like to remediate SCA (dependency) findings or code findings?
references/SCA_REMEDIATION.md and follow that pathreferences/DEEPSCAN_REMEDIATION.md and follow that pathFollow the API call sequence in the chosen reference file. Each file documents the exact dryrun_api.py commands to run and the finding data shape for that path.
Present findings as a numbered list:
[N] [severity] type in filename:line_start-line_end
description (truncated if long)
For SCA findings, also show package name, version, CVE, and fixed version:
[N] [severity] CVE-XXXX in package@version (ecosystem)
fixed version: X.Y.Z
description (truncated if long)
Ask the user which findings to fix. The user may select one or multiple.
Ask the user what the branch name should be. Default suggestion: fix/<finding-type>-<short-description>.
For deepscan findings, the latest deepscan includes a branch field — branch from that branch (or main if null) when creating the fix.
For each finding the user selected, follow this process:
Extract vulnerability type, file path, line numbers, and description from the API response. Each path's reference file documents the available fields.
Use Glob and Grep to search, Read to examine. Do NOT propose a fix until complete.
| Area | Search For |
|---|---|
| Config files | .env, package.json, requirements.txt, go.mod, Gemfile, pom.xml |
| Auth patterns | auth.py, authentication.rb, jwt.go, passport.js |
| Authz patterns | Permission models, RBAC, policy files |
| Decorators | @login_required, @requires_auth, requireAuth(), checkPermission() |
| Similar code | How does this codebase handle similar operations securely? |
Trust the finding — DryRunSecurity rigorously filters false positives. See references/DRYRUN_FILTERING.md for details.
Use WebFetch to look up official documentation. Do NOT rely on memorized examples.
Research sources:
references/VULNERABILITY_TYPES.mdUse docs for their specific framework version — security APIs change between versions.
Use Edit to make the minimal change necessary.
Requirements:
Include:
Read references/PR_WORKFLOW.md and follow the full PR creation workflow:
fix: <description>
Co-authored-by: DryRunSecurity <[email protected]>
Finding from API: "SQL Injection in app/handlers/search.go:45"
Before (vulnerable):
db.Raw("SELECT * FROM users WHERE name = '" + input + "'")
After (fixed):
db.Where("name = ?", input).Find(&users)
Research URLs:
https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.htmlhttps://gorm.io/docs/security.htmlGuides creation and editing of skills using test-driven development with pressure scenarios and subagents to verify agent compliance.
Creates platform-native content for X, LinkedIn, TikTok, YouTube, and newsletters from source material. Adapts voice and format per platform while avoiding engagement bait and filler.
npx claudepluginhub dryrunsecurity/external-plugin-marketplace --plugin dryrun-finding-remediation