Skip to content
Machine Learning
Skill

/release-cherry-pick

Audit merged bug-fix PRs and release NVBugs for missing cherry-pick labels, then cherry-pick labeled PRs into a release branch and open a PR. Use when asked to "cherry-pick PRs for release/X.Y.Z", "pick PRs to release branch", "verify cherry-pick labels", or "cherry-pick labeled

BOOST
From plugin
model-optimizer
5.3k16 skills5 agents1 MCP
Install
$ npx -y skills add nvidia/model-optimizer --skill release-cherry-pick --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/release-cherry-pick

Context preview

The summary Claude sees to decide when to auto-load this skill.

Audit merged bug-fix PRs and release NVBugs for missing cherry-pick labels, then cherry-pick labeled PRs into a release branch and open a PR. Use when asked to "cherry-pick PRs for release/X.Y.Z", "pick PRs to release branch", "verify cherry-pick labels", or "cherry-pick labeled

SKILL.md

release-cherry-pick.SKILL.md
name: release-cherry-pick
description: Audit merged bug-fix PRs and release NVBugs for missing cherry-pick labels, then cherry-pick labeled PRs into a release branch and open a PR. Use when asked to "cherry-pick PRs for release/X.Y.Z", "pick PRs to release branch", "verify cherry-pick labels", or "cherry-pick labeled PRs".

Cherry-pick PRs to a Release Branch

Cherry-pick all merged `main` PRs labeled `cherry-pick-<version>` (but not `cherry-pick-done`) into the corresponding `release/<version>` branch, one by one in merge order.

Step 1 — Identify the target version

Ask the user for the release version (e.g. `0.44.0`) and target release candidate (e.g. `rc2`) if not already provided. Confirm whether this is the final RC.

Set `VERSION=<version>` for use in subsequent steps.

Step 2 — Audit candidates for missing labels

Before fetching the labeled queue, audit for missing bug fixes:

  • **Non-final RC:** audit release NVBugs and recent merged PRs.
  • **Final RC:** audit only fixes tied to NVBugs with the exact keyword `Committed_ModelOpt_<VERSION>` and QA-verification evidence for the fix. Verify that evidence in the NVBug or linked QA results before recommending **Needs label**; if missing or unclear, classify as **Unknown** and ask for confirmation. Skip the general recent-PR audit; do not introduce general bug-fix PRs or fixes tied only to NVBugs committed for another release.

Audit release NVBugs

Use the NVBugs MCP to search for every NVBug whose **Keywords** field contains the exact keyword `Committed_ModelOpt_<VERSION>`. Follow pagination until no next token is returned.

Fetch each matching NVBug with its comments. Extract every Model-Optimizer PR link or unambiguous `PR #<NUM>` reference from the comments, not only the latest comment. Keep only PRs that are merged into `main`, lack `cherry-pick-<VERSION>`, and are not already included in the release branch. Verify each remaining PR is a bug fix. The NVBug keyword is evidence for review, not by itself proof that every linked PR should be picked.

Audit recent merged PRs

For non-final RCs only: Audit PRs merged into `main` since the latest release candidate. Exclude PRs that already have `cherry-pick-<VERSION>` and changes already present on the release branch:

git fetch origin main "release/$VERSION" --tags
RC_TAG=$(git tag --merged "origin/release/$VERSION" \
  --list "${VERSION}rc*" --sort=-version:refname | head -1)
test -n "$RC_TAG" || {
  echo "No ${VERSION}rc* tag found on origin/release/$VERSION" >&2
  exit 1
}
SINCE=$(git for-each-ref --format='%(creatordate:iso-strict)' \
  "refs/tags/$RC_TAG")

PATCH_STATUS=$(git cherry "origin/release/$VERSION" origin/main)

SEARCH_RESULTS=$(
  gh search prs \
    --repo NVIDIA/Model-Optimizer \
    --merged \
    --base main \
    --merged-at ">=$SINCE" \
    --limit 1000 \
    --json number,title,author,labels,url \
    -- "-label:cherry-pick-$VERSION"
)

if test "$(jq 'length' <<<"$SEARCH_RESULTS")" -ge 1000; then
  echo "Recent-PR audit reached the 1,000-result limit" >&2
  exit 1
fi

jq -r '.[].number' <<<"$SEARCH_RESULTS" \
  | while read -r pr; do
      sha=$(gh pr view "$pr" --repo NVIDIA/Model-Optimizer \
        --json mergeCommit --jq '.mergeCommit.oid')
      if grep -q "^+ $sha$" <<<"$PATCH_STATUS"; then
        gh pr view "$pr" --repo NVIDIA/Model-Optimizer \
          --json number,title,author,labels,url
      fi
    done

A release is not normally expected to reach the 1,000-PR limit.

Review each PR's title, body, labels, changed files, and linked issue context. Classify it as:

  • **Yes** — repairs incorrect behavior, a regression, crash, compatibility problem, or documentation defect relevant to the release.
  • **No** — feature, refactor, cleanup, dependency refresh, or other change not needed to correct the release.
  • **Unclear** — insufficient evidence or meaningful backport risk; ask the user.

Deduplicate PRs found through both audits.

Report and label

Present the complete audit before changing GitHub labels:

| PR | Title | Author | NVBug(s) | Bug fix? | `cherry-pick-<VERSION>` present? | Recommendation | |---|---|---|---|---|---|---|

Use these recommendation values and sort the table in this order:

1. **Needs label** — confirmed release-relevant bug fix. 2. **Unknown** — requires user judgment. 3. **No action needed** — not a release-relevant bug fix.

Use `—` when no NVBug is known. Also list NVBugs with no linked PR. Ask the user to confirm which recommended PRs should receive the missing label. After confirmation, apply it:

for pr in <APPROVED_NUMBERS>; do
  gh pr edit "$pr" --repo NVIDIA/Model-Optimizer --add-label "cherry-pick-$VERSION"
done

Do not label unmerged PRs, PRs not based on `main`, or candidates classified **Unclear** without explicit approval. Re-run the audit table after edits so it reflects the final label state.

Step 3 — Fetch pending PRs

Use the GitHub search API to list PRs that have the cherry-pick label but not cherry-pick-done, sorted by merge date ascending:

gh api "search/issues?q=repo:NVIDIA/Model-Optimizer+is:pr+is:merged+base:main+label:cherry-pick-<VERSION>+-label:cherry-pick-done&sort=updated&order=asc&per_page=50" \
  --jq '.items[] | [.number, .title, .pull_request.merged_at] | @tsv' \
  | sort -t$'\t' -k3

Present the list to the user before proceeding.

Step 4 — Set up the release branch

Check out `release/<VERSION>`, creating it from the remote if it doesn't exist locally:

git fetch origin release/<VERSION>
git checkout release/<VERSION>

Step 5 — Get merge commit SHAs

All PRs are squash-merged, so each has a single-parent commit. Retrieve the SHA for each PR:

gh pr view <NUM> --repo NVIDIA/Model-Optimizer --json mergeCommit --jq '.mergeCommit.oid'

Step 6 — Cherry-pick in merge order

Cherry-pick each commit with `-s` (DCO sign-off). GPG signing is handled automatically by the repo's git config.

git ch
Read more
Ships withmodel-optimizer

Documentation | Roadmap | NVIDIA Model Optimizer (referred to as Model Optimizer, or ModelOpt) is a library comprising state-of-the-art model optimization techniques including quantization, pruning, Neural Architecture Search (NAS), distillation, speculative

Get the whole plugin

Other skills on model-optimizer.