Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Plan, batch, and verify dependency upgrades safely. Triages outdated packages into risk tiers, upgrades in order (dev/minor/patch first, runtime majors last), verifies each batch before moving on, and produces an auditable commit sequence. Use when asked to "upgrade deps", "bump packages", "update node_modules", "fix vulnerabilities", "upgrade React/Node/TypeScript", or after `/gsd start dep-upgrade`. Complements the dep-upgrade workflow template with execution-level rigor.
.claude/skills/gsd-build-dependency-upgrade/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 57% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 212% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 28% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 44% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 20% | 0% |
<objective> Turn a pile of outdated packages into a series of small, verifiable upgrades with clean commits. The deliverable is an ordered upgrade plan, executed with verification between batches, and a summary that flags anything risky for follow-up. No big-bang upgrades. </objective>
<context> GSD-2 ships a /gsd start dep-upgrade workflow template (src/resources/extensions/gsd/workflow-templates/dep-upgrade.md) that structures the phases: assess → upgrade → fix breaks → verify. This skill is the execution-level detail inside the upgrade phase — how to batch, how to verify, how to recover from a breaking upgrade without losing the good ones.
Invocation points:
/gsd start dep-upgrade workflow is running</context>
<core_principle> BATCH BY RISK, NOT BY LAZINESS. npm update is a shortcut that blends safe and risky changes into one commit. When something breaks, you can't tell which dep caused it. Always separate: patches and dev-deps first, minors next, majors individually.
VERIFY BETWEEN BATCHES. Run the test suite after every batch. Don't stack five batches and hope. If a batch breaks something, you need to know which one.
ONE MAJOR PER COMMIT. Major version bumps are where real breakage lives. Keep them isolated so the commit history tells the truth. </core_principle>
<process>
Run the ecosystem's outdated check. Capture output, don't act on it yet:
npm outdated or pnpm outdated or yarn outdatedpip list --outdated or uv pip list --outdatedcargo outdatedbundle outdatedgo list -m -u allAlso capture:
npm audit (or equivalent) — security advisoriesFor each outdated package, note:
rg.)Order:
Skip (for now):
Present the plan to the user. One round of adjustment. Then execute.
For each batch:
git status — no uncommitted changes.npm install package@version ..., uv add …, cargo update -p …).lsp diagnostics on changed files + the project linter.If any step fails:
Commit with a precise message:
deps: bump <scope> — <what changed in one line>
- package-a: 1.2.3 → 1.2.9 (patch)
- package-b: 2.1.0 → 2.4.0 (minor — no breaking changes in CHANGELOG)
- package-c: 3.0.1 → 3.0.2 (patch)
Verified: npm test (84/84 pass), npm run build exit 0, lsp diagnostics clean.For each major that breaks something:
rg for the symbols that changed./gsd start refactor follow-up and pin the current major for now.S##). The dep upgrade is only one task; the migration is the rest of the slice.After all batches, produce a rollup:
markdown## Dependency Upgrade — <date> ### Completed - Batch 1 (dev patches): 12 packages — commit abc1234 - Batch 2 (runtime patches): 5 packages — commit def5678 - Batch 3 (runtime minors): 3 packages — commit ... - Batch 4 (React 18 → 19): commit ... — required refactors in <files> ### Deferred - typescript 5.3 → 5.7 — requires updating 40+ decorator usages. Filed as M005. - vite 4 → 5 — config shape changed. Owner assigned: <user>. ### Still outdated (intentional) - <package> — pinned because <reason> ### Security advisories - <CVE> resolved by <package upgrade> - <CVE> still open — not exploitable in our usage (see comment in package.json)
Append to .gsd/KNOWLEDGE.md any non-obvious gotcha from the upgrade (API changes that tripped you up, migration rituals for this codebase).
</process>
<anti_patterns>
npm update blindly. Mixes safe and risky in one undiagnosable commit.--force. Leave it broken or roll back; don't lie to git.--legacy-peer-deps warnings. They're telling you the dep graph is incoherent.</anti_patterns>
<success_criteria>
verify-before-complete).</success_criteria>
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 16,814 | 21,199 | +26% | 1 | 1 | 0% | 203 | 2,218 | +993% | 0 | 0 | — |
case-02 | fail→fail | 7,491 | 23,715 | +217% | 1 | 1 | 0% | 192 | 2,481 | +1192% | 0 | 0 | — |
case-03 | pass→pass | 11,729 | 9,066 | -23% | 1 | 1 | 0% | 1,927 | 3,262 | +69% | 0 | 0 | — |
case-04 | fail→pass | 18,273 | 16,971 | -7% | 1 | 1 | 0% | 2,429 | 3,802 | +57% | 0 | 0 | — |
case-05 | fail→fail | 15,578 | 22,043 | +42% | 1 | 1 | 0% | 2,234 | 4,480 | +101% | 0 | 0 | — |
case-06 | pass→pass | 11,042 | 12,402 | +12% | 1 | 1 | 0% | 1,704 | 3,170 | +86% | 0 | 0 | — |
case-07 | fail→pass | 10,787 | 9,244 | -14% | 1 | 1 | 0% | 860 | 2,684 | +212% | 0 | 0 | — |
case-08 | pass→pass | 15,776 | 13,801 | -13% | 1 | 1 | 0% | 1,678 | 3,243 | +93% | 0 | 0 | — |
case-09 | fail→pass | 17,956 | 14,183 | -21% | 1 | 1 | 0% | 2,564 | 3,276 | +28% | 0 | 0 | — |
case-10 | fail→pass | 20,595 | 8,682 | -58% | 1 | 1 | 0% | 2,296 | 3,304 | +44% | 0 | 0 | — |
case-11 | fail→pass | 24,380 | 11,437 | -53% | 1 | 1 | 0% | 2,871 | 3,438 | +20% | 0 | 0 | — |
case-12 | fail→pass | 19,102 | 14,170 | -26% | 1 | 1 | 0% | 2,137 | 3,453 | +62% | 0 | 0 | — |
case-13 | fail→pass | 19,395 | 12,176 | -37% | 1 | 1 | 0% | 2,327 | 3,003 | +29% | 0 | 0 | — |
case-14 | pass→pass | 21,024 | 16,311 | -22% | 1 | 1 | 0% | 2,198 | 3,528 | +61% | 0 | 0 | — |
case-15 | pass→pass | 22,696 | 16,272 | -28% | 1 | 1 | 0% | 2,498 | 3,469 | +39% | 0 | 0 | — |
case-16 | pass→pass | 20,804 | 13,053 | -37% | 1 | 1 | 0% | 2,425 | 3,904 | +61% | 0 | 0 | — |
case-17 | pass→pass | 19,952 | 11,823 | -41% | 1 | 1 | 0% | 2,159 | 3,695 | +71% | 0 | 0 | — |
case-18 | pass→pass | 17,870 | 22,488 | +26% | 1 | 1 | 0% | 2,460 | 3,984 | +62% | 0 | 0 | — |
case-19 | pass→pass | 15,157 | 8,183 | -46% | 1 | 1 | 0% | 1,394 | 2,312 | +66% | 0 | 0 | — |
case-20 | pass→pass | 21,936 | 27,715 | +26% | 1 | 1 | 0% | 3,640 | 5,999 | +65% | 0 | 0 | — |
case-21 | pass→pass | 6,226 | 22,516 | +262% | 1 | 1 | 0% | 858 | 3,139 | +266% | 0 | 0 | — |
case-22 | pass→fail | 13,808 | 12,589 | -9% | 1 | 1 | 0% | 1,440 | 2,350 | +63% | 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 +27 percentage points is the difference between those two pass rates over the 19 comparable cases. 1 case got worse with the skill loaded, and it is 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.