skills/bump-fix/SKILL.md
Resolve security vulnerability Jira tickets (typically SECCOMP-*) by upgrading the indicated package, runtime, or base image everywhere it appears in the repository, then creating a branch, commit, and pull request. Use this skill whenever the user asks to "bump", "fix a vuln", "address a SECCOMP ticket", "upgrade a base image", or mentions a ticket ID that looks like a security remediation — even if they don't explicitly say "bump-fix". Also use when the user pastes a Jira URL to a vulnerability ticket and asks to fix it.
npx skillsauth add mbarbieri/my-claude bump-fixInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Take a security vulnerability Jira ticket, apply the remediation it describes (upgrade a package, runtime, or base image wherever it appears), and ship it as a PR. The user verifies — you do not run tests.
The user provides a ticket ID (e.g., SECCOMP-58299) or a Jira URL. If neither is given, ask for one.
jira <TICKET-ID>
The description tells you what to upgrade. Two common shapes:
The rendered description often has missing spaces (e.g., Thetelecaster:0.0.2) because the source HTML is stripped crudely. Read through it — the information is still there.
Extract:
golang, sysdig-micro-ubi9, glibc)rg target)ghWhen the ticket says "latest" and links to a GitHub releases page, use gh — it's authenticated and works with private repos.
From the URL, extract <owner>/<repo> (e.g., draios/base-image). Releases pages are often filtered by a product name (?q=sysdig-micro-ubi9); that filter is typically the tag prefix because the repo ships multiple products from one release stream.
# List recent releases, filter by prefix
gh release list --repo <owner>/<repo> --limit 50 | grep '<prefix>'
# Or use the API for structured output
gh api 'repos/<owner>/<repo>/releases?per_page=100' \
--jq '.[] | select(.tag_name | startswith("<prefix>")) | .tag_name' \
| head -10
Pick the highest semver-sorted tag that matches the prefix. Confirm it's strictly newer than the current version before proceeding. If the repo's version is already ≥ target, stop and tell the user — the image likely just needs redeployment, not a code change.
Branch name: <TICKET-ID>-<short-kebab-slug>. Keep the slug short and descriptive of the action, not the cause.
Examples:
SECCOMP-58299-upgrade-go-1.25.9SECCOMP-55338-upgrade-ubi-imagegit checkout main && git pull --ff-only
git checkout -b <TICKET-ID>-<slug>
rg -l gives you the exhaustive edit set in two seconds. Run it for both the current version string and the image/package name — the union is what you edit. Don't go hunting in files it didn't return.
rg --fixed-strings -l '<current-version>'
rg --fixed-strings -l '<image-or-package-name>'
Then rg -n on each hit shows the exact line. For a single-line version swap, go straight to Edit — don't re-Read the file, the -n output is already enough context.
Fallback only (if rg returns nothing and you suspect a pin is hiding): builder stages in multi-stage Dockerfiles, go.mod/go.work (go directive + toolchain), .github/workflows/*.yml (setup-go, matrices), Makefile, .tool-versions, .goreleaser.yml, Helm values.yaml/Chart.yaml, and install scripts under scripts//ci//hack/.
Shell note: when batching Bash calls in parallel with other tools, don't include a speculative rg over a path that may not exist (e.g., .github/) — a non-zero exit cancels sibling calls. Run it alone, or append || true.
Check conventions once:
test -f CLAUDE.md && cat CLAUDE.md
git log --oneline --grep=SECCOMP -5 # both repo convention + recent bump style in one shot
Most Sysdig repos use Conventional Commits. The scope should be the subdir/service name (e.g., chore(ticketing): ...), not a generic deps. Put the ticket ID in the body; keep the message about what changed and why (the CVE), not the process.
Example:
chore(ticketing): bump sysdig-micro-ubi9 to 1.0.45
Addresses glibc CVE-2026-0915 (SECCOMP-55338).
Resolve the real default branch from the remote — don't trust the harness's "main branch" hint, it can be stale or scoped to the wrong repo:
DEFAULT_BRANCH=$(gh repo view --json defaultBranchRef -q .defaultBranchRef.name)
git push -u origin HEAD
gh pr create --base "$DEFAULT_BRANCH" --title "<TICKET-ID>: <short summary>" --body "$(cat <<'EOF'
## Summary
- Bump <thing> from <old> to <new>
- Addresses <CVE-IDs>
## Jira
<TICKET-ID>
EOF
)"
If the repo has a PR template, use it instead of the body above. Check case-insensitively — the file is often PULL_REQUEST_TEMPLATE.md:
find .github -maxdepth 1 -iname 'pull_request_template.md'
Include the ticket ID (full URL https://<domain>/browse/<TICKET-ID> if ATLASSIAN_DOMAIN is set in .env, otherwise the ID alone) and name the CVEs being fixed — reviewers scan for those.
Print the PR URL. Do not run tests, CI, or linters. Wait for the user to tell you if something failed.
gh handles auth; if it fails, have the user run gh auth status rather than falling back to an unauthenticated fetch.jira — local Jira CLI (see the jira-tool skill if it's missing)gh — releases + PR creation, authenticatedgit, rg, standard file editingdevelopment
Use when writing or refactoring Spock tests in Java projects - enforces data-driven testing with where blocks, proper mock/stub placement, and descriptive test names following Spock best practices
tools
Use when user provides Jira issue URLs or mentions Jira tickets - fetches issue details and comments from Jira Cloud using local jira tool, outputs AI-optimized markdown for context gathering
development
Use when writing, modifying, or reviewing Java code - applies SOLID principles, clean code practices, minimal documentation, and pragmatic abstraction to create maintainable Java applications
development
Use when the user asks to implement a feature, add a class or method, fix a bug, refactor code, add test coverage, or run autonomously to drive work forward. Supports explicit phase selection via the first argument (red | green | refactor | forever) and infers the phase from conversation and test state when no phase is given. With no arguments at all, defaults to forever (autonomous loop). Do NOT use for code review, CI/CD setup, testing questions, infrastructure, or documentation tasks.