Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Generate PR titles and descriptions for DevOps surfaces (CI/CD, composite actions, automation scripts, IaC) following the devops.md PR template and commit/PR format rule. Use when creating a DevOps PR or invoking /qv-devops-pr-create.
.claude/skills/tetherto-qv-devops-pr-create/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 179% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 112% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 198% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 286% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 72% | 0% |
Generate PR titles and descriptions for DevOps changes (CI/CD workflows, composite actions, repo-wide automation scripts, IaC), following the DevOps pod's format rule and PR template.
Applies to PRs whose changes are dominated by paths in .github/teams/devops.json's ownedPaths: .github/workflows/, .github/actions/, .github/scripts/, scripts/. Also applies to repo-level configuration changes (.github/CODEOWNERS, .github/dependabot.yml, top-level Dockerfiles, IaC under top-level terraform/, ansible/, k8s/).
Use when:
/qv-devops-pr-createIf the touched paths are dominated by a non-DevOps pod (e.g., packages/sdk/**), use that pod's *-pr-create skill instead. If a PR mixes DevOps + package changes, prefer the package's pod skill and call out the cross-pod touches in the PR body.
gh CLI installed and authenticated (gh auth status)tetherto/qvac)main (default) or a release-* branch (uncommon for DevOps; treat as user-provided).<base>...origin/<branch>.TICKET prefix[tag]?: subject.[bc])./tmp/pr-body.md so subsequent steps and any gh pr create invocation can read it back without re-rendering. Print the body in chat for inspection AND keep the file canonical (the gh-CLI step below reads from it).bash pbcopy < /tmp/pr-body.md # macOS xclip -selection clipboard < /tmp/pr-body.md # Linux wl-copy < /tmp/pr-body.md # Wayland
gh (see "gh CLI Integration" below).Infer first, ask only if uncertain.
Ticket number:
QVAC-\d+, SDK-\d+, etc.[notask] as the alternative).Prefix (infra / feat / fix / chore / doc / test):
infra/, fix/, chore/)..github/workflows/**, .github/actions/**, .github/scripts/**, scripts/**, IaC files, Dockerfiles, runner config → infrafeatfix.md / docs files → doc.github/actions/*-test/**, *.test.*, tests/**) → testchoreTag ([bc] / [notask] / [skiplog] — not combinable):
[bc] (breaking change) when the diff:inputs: / outputs: shape (workflow_call signature)inputs: / outputs: shape (.github/actions/<name>/action.yml)workflow_call secrets: or permissions: contract[notask] (PRs only): when no ticket — minor automation hygiene. Ask the user before applying.[skiplog]: only when the user explicitly asks (this repo uses [skiplog] to opt out of changelog generation; not the default for DevOps).ASK if [bc] is ambiguous.
Walk the diff before assembling the body. For each trigger detected, the corresponding section is REQUIRED in the PR body.
| Trigger | Detection signal | Required section | |---|---|---| | Third-party action added / bumped / repinned | git diff shows a uses: <vendor>/<action>@<sha> change in any .github/workflows/** or .github/actions/**/action.yml | "🔐 Action pinning" with before/after SHA + version | | Top-level or per-job permissions: block added / modified / removed | git diff shows ^[+-].*permissions: or ^[+-]\s+(contents|pull-requests|id-token|...)\s*: | "🛡️ Permissions changes" with scope, before/after, justification | | State-changing op | Any of: terraform/** *.tf, ansible/** *.yml, k8s/** *.yaml, gh ruleset edit invocations, branch-protection patches | "📋 Plan / dry-run output" — paste the plan/diff | | Breaking change | [bc] tag set per Inference Strategy | "💥 Breaking changes" with BEFORE/AFTER YAML blocks |
Sections that are NOT triggered MUST be deleted (per the template's "Delete this section if not applicable" markers).
^([A-Z]+-\d+ )?(infra|feat|fix|chore|doc|test)(\[(bc|notask|skiplog)\])?: \S.+$Fill the template based on the diff analysis. Delete sections that don't apply.
ALWAYS output the PR in this copy-ready format, even when making corrections:
~~~
TICKET prefix[tag]?: subjectmarkdown## 🎯 What problem does this PR solve? ...
~~~
No pr-validation-devops.yml workflow exists yet (the SDK-pod validator is paths-scoped to packages/<pkg>/). This skill MUST validate the title client-side before pushing or invoking gh pr create. Refuse and ask for correction if any of these fail:
^([A-Z]+-\d+ )?(infra|feat|fix|chore|doc|test)(\[(bc|notask|skiplog)\])?: \S.+$QVAC-\d+) is present unless [notask] is used[bc]: body contains a "💥 Breaking changes" section with BEFORE/AFTER fenced blocksAfter generating the PR description, check for gh and offer to create the PR:
which gh — confirm CLI is installedgit remote -v — identify whether origin is the upstream (tetherto/qvac) or a fork--repo, --base, --head:bashgh pr create \ --repo tetherto/qvac \ --base main \ --head <fork-owner>:<branch> \ --title "TICKET infra: subject" \ --body "$(cat /tmp/pr-body.md)"
For direct-push workflows (the user has write to tetherto/qvac):
bashgh pr create \ --base main \ --title "TICKET infra: subject" \ --body "$(cat /tmp/pr-body.md)"
Never run gh pr create --web for this skill — --web does not actually create the PR; it only opens the browser. The body we generated would be lost.
Before outputting, verify:
actionlint clean, workflow_dispatch test run, terraform plan output, kubectl diff output, etc.)[bc] body has BEFORE/AFTER YAML blocks| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 13,501 | 4,885 | -64% | 1 | 1 | 0% | 2,176 | 2,853 | +31% | 0 | 0 | — |
case-02 | fail→fail | 13,461 | 4,905 | -64% | 1 | 1 | 0% | 2,581 | 2,894 | +12% | 0 | 0 | — |
case-03 | fail→fail | 14,343 | 6,124 | -57% | 1 | 1 | 0% | 2,397 | 3,079 | +28% | 0 | 0 | — |
case-04 | fail→pass | 7,655 | 7,670 | +0% | 1 | 1 | 0% | 1,428 | 3,984 | +179% | 0 | 0 | — |
case-05 | pass→fail | 6,367 | 4,964 | -22% | 1 | 1 | 0% | 1,139 | 2,805 | +146% | 0 | 0 | — |
case-06 | pass→pass | 10,424 | 17,890 | +72% | 1 | 1 | 0% | 2,097 | 5,521 | +163% | 0 | 0 | — |
case-07 | fail→pass | 10,351 | 7,898 | -24% | 1 | 1 | 0% | 1,967 | 4,162 | +112% | 0 | 0 | — |
case-08 | fail→pass | 7,703 | 9,496 | +23% | 1 | 1 | 0% | 1,522 | 4,534 | +198% | 0 | 0 | — |
case-09 | fail→pass | 7,431 | 11,030 | +48% | 1 | 1 | 0% | 1,263 | 4,877 | +286% | 0 | 0 | — |
case-10 | fail→fail | 5,469 | 7,176 | +31% | 1 | 1 | 0% | 905 | 4,038 | +346% | 0 | 0 | — |
case-11 | fail→pass | 12,464 | 8,339 | -33% | 1 | 1 | 0% | 2,561 | 4,400 | +72% | 0 | 0 | — |
case-12 | fail→pass | 8,466 | 6,981 | -18% | 1 | 1 | 0% | 1,485 | 4,010 | +170% | 0 | 0 | — |
case-13 | fail→pass | 9,385 | 11,319 | +21% | 1 | 1 | 0% | 1,940 | 4,978 | +157% | 0 | 0 | — |
case-14 | fail→pass | 5,660 | 9,048 | +60% | 1 | 1 | 0% | 1,105 | 4,434 | +301% | 0 | 0 | — |
case-15 | fail→pass | 8,219 | 8,069 | -2% | 1 | 1 | 0% | 1,506 | 4,365 | +190% | 0 | 0 | — |
case-16 | fail→pass | 5,468 | 7,894 | +44% | 1 | 1 | 0% | 985 | 4,232 | +330% | 0 | 0 | — |
case-17 | fail→fail | 6,089 | 4,733 | -22% | 1 | 1 | 0% | 1,149 | 2,889 | +151% | 0 | 0 | — |
case-18 | fail→fail | 7,781 | 5,398 | -31% | 1 | 1 | 0% | 1,484 | 2,824 | +90% | 0 | 0 | — |
case-19 | pass→pass | 6,502 | 8,452 | +30% | 1 | 1 | 0% | 1,036 | 4,124 | +298% | 0 | 0 | — |
case-20 | fail→pass | 7,615 | 10,266 | +35% | 1 | 1 | 0% | 1,371 | 4,777 | +248% | 0 | 0 | — |
case-21 | fail→pass | 7,685 | 9,103 | +18% | 1 | 1 | 0% | 1,427 | 4,611 | +223% | 0 | 0 | — |
case-22 | fail→pass | 10,745 | 10,626 | -1% | 1 | 1 | 0% | 1,795 | 4,441 | +147% | 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 16 counted toward the lift figure. The other 6 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 +55 percentage points is the difference between those two pass rates over the 16 comparable cases. 5 cases got worse with the skill loaded, and they are 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.