Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Automate the backmerge flow after hotfixes (prod -> test -> main)
.claude/skills/nudgebee-backmerge/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-18 | ✗→✓ | ▲ Improved | 66% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 5% | 0% |
| case-06 | ✗→✓ | ▲ Improved | -5% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 8% | 0% |
| case-08 | ✗→✓ | ▲ Improved | -29% | 0% |
Automate the backmerge chain after a hotfix or production merge. Optional argument: $ARGUMENTS (starting branch, defaults to prod).
prod ──PR──> test ──PR──> mainAfter a hotfix lands on prod, it must be backmerged through test into main to keep all branches in sync.
bashgit fetch origin
Check that the starting branch exists and has commits ahead of the target:
bash# Check prod -> test delta git log --oneline origin/test..origin/prod | head -20 # Check test -> main delta (may be empty if prod hasn't merged to test yet) git log --oneline origin/main..origin/test | head -20
If origin/test..origin/prod is empty, there's nothing to backmerge. Inform the user and stop.
Check if a backmerge PR already exists:
bashgh pr list --base test --head prod --state open --json number,title,url
If a PR already exists: show it and ask if the user wants to proceed to the next step.
If no PR exists: create one:
bashgh pr create --base test --head prod --title "chore(release): backmerge prod -> test" --body "$(cat <<'EOF' # Description Automated backmerge of production changes into test branch. ### Commits included $(git log --oneline origin/test..origin/prod) ## Type of change - [x] Chore (non-breaking change which does not modify src or test files) # How Has This Been Tested? - [ ] Review for merge conflicts - [ ] CI passes after merge ### Action required - Review for conflicts - Merge when ready - Then backmerge test -> main (use `/backmerge` again) EOF )"
Ask the user:
If user says wait: stop here, print the PR URL. If user says continue: proceed to step 3.
Check if a backmerge PR already exists:
bashgh pr list --base main --head test --state open --json number,title,url
If a PR already exists: show it and stop.
If no PR exists: create one:
bashgh pr create --base main --head test --title "chore(release): backmerge test -> main" --body "$(cat <<'EOF' # Description Automated backmerge of test changes into main branch. ### Commits included $(git log --oneline origin/main..origin/test) ## Type of change - [x] Chore (non-breaking change which does not modify src or test files) # How Has This Been Tested? - [ ] Review for merge conflicts - [ ] CI passes after merge ### Action required - Review for conflicts - Merge when ready EOF )"
Backmerge Status:
1. prod -> test: PR #{number} ({state}) — {url}
2. test -> main: PR #{number} ({state}) — {url}
Next steps:
- Review and merge PRs in order (test first, then main)
- Resolve any conflicts in the PRs| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-18 | fail→pass | 4,985 | 1,969 | -61% | 1 | 1 | 0% | 673 | 1,118 | +66% | 0 | 0 | — |
case-01 | fail→fail | 5,880 | 3,800 | -35% | 1 | 1 | 0% | 963 | 1,040 | +8% | 0 | 0 | — |
case-02 | fail→fail | 7,419 | 4,345 | -41% | 1 | 1 | 0% | 1,220 | 1,159 | -5% | 0 | 0 | — |
case-03 | fail→fail | 7,772 | 4,478 | -42% | 1 | 1 | 0% | 1,328 | 1,069 | -20% | 0 | 0 | — |
case-04 | pass→pass | 10,619 | 5,047 | -52% | 1 | 1 | 0% | 1,852 | 1,760 | -5% | 0 | 0 | — |
case-05 | fail→pass | 7,329 | 2,997 | -59% | 1 | 1 | 0% | 1,260 | 1,320 | +5% | 0 | 0 | — |
case-06 | fail→pass | 6,831 | 1,891 | -72% | 1 | 1 | 0% | 1,196 | 1,131 | -5% | 0 | 0 | — |
case-07 | fail→pass | 5,980 | 1,798 | -70% | 1 | 1 | 0% | 1,041 | 1,123 | +8% | 0 | 0 | — |
case-08 | fail→pass | 13,130 | 3,881 | -70% | 1 | 1 | 0% | 2,180 | 1,547 | -29% | 0 | 0 | — |
case-09 | fail→fail | 13,061 | 3,723 | -71% | 1 | 1 | 0% | 2,196 | 1,508 | -31% | 0 | 0 | — |
case-10 | pass→pass | 3,009 | 1,459 | -52% | 1 | 1 | 0% | 445 | 1,041 | +134% | 0 | 0 | — |
case-11 | fail→pass | 8,912 | 2,873 | -68% | 1 | 1 | 0% | 1,399 | 1,333 | -5% | 0 | 0 | — |
case-12 | fail→pass | 6,338 | 2,875 | -55% | 1 | 1 | 0% | 1,034 | 1,412 | +37% | 0 | 0 | — |
case-13 | fail→fail | 11,514 | 2,621 | -77% | 1 | 1 | 0% | 1,994 | 1,295 | -35% | 0 | 0 | — |
case-14 | pass→pass | 4,085 | 2,825 | -31% | 1 | 1 | 0% | 669 | 1,309 | +96% | 0 | 0 | — |
case-15 | pass→pass | 8,784 | 1,613 | -82% | 1 | 1 | 0% | 1,512 | 1,013 | -33% | 0 | 0 | — |
case-16 | fail→pass | 13,535 | 3,160 | -77% | 1 | 1 | 0% | 2,364 | 1,382 | -42% | 0 | 0 | — |
case-17 | fail→pass | 7,183 | 2,021 | -72% | 1 | 1 | 0% | 1,103 | 1,094 | -1% | 0 | 0 | — |
case-19 | pass→pass | 7,976 | 1,506 | -81% | 1 | 1 | 0% | 1,179 | 998 | -15% | 0 | 0 | — |
case-20 | pass→pass | 9,952 | 5,280 | -47% | 1 | 1 | 0% | 1,761 | 1,713 | -3% | 0 | 0 | — |
case-21 | pass→pass | 5,388 | 3,153 | -41% | 1 | 1 | 0% | 932 | 1,339 | +44% | 0 | 0 | — |
case-22 | pass→pass | 10,422 | 3,856 | -63% | 1 | 1 | 0% | 985 | 1,475 | +50% | 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 +41 percentage points is the difference between those two pass rates over the 19 comparable cases.
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.