What problem does it solve? Upgrading a working application to a newer framework or language version is risky: breaking changes are easy to miss, cross-runtime moves get mistaken for simple upgrades, and hand-editing large codebases introduces regressions. This Skill removes that guesswork by classifying whether a change is a true in-place upgrade, grounding every breaking-change claim in authoritative sources, and driving the stack-native upgrade tool instead of hand-authoring code. ## Core Features & Use Cases - Classification & false-upgrade rejection: Detects stack and version, then rejects cross-runtime moves (e.g., .NET Framework to .NET, AngularJS to Angular, Python 2 to 3) and routes them to a rewrite workflow before any edit occurs. - Decision-grade Gap + Risk report: Produces a feasibility report with VERIFIED/INFERRED source tags, a dependency ledger flagging packages with no target-compatible version, and a multi-hop version path — valuable even if you never proceed. - Gated, bisectable execution: Runs the deterministic tool (dotnet upgrade-assistant, ng update, OpenRewrite, pyupgrade, npm-check-updates) one commit per version hop on an isolated branch off a baseline tag, with every residual fix behind an approval gate. - Use Case: You need to move a solution from .NET 6 to .NET 8. The Skill plans the 6→7→8 hop sequence, reports breaking changes with dated official sources, then drives upgrade-assistant per hop and verifies against the pre-upgrade baseline. ## Quick Start Ask the assistant to upgrade my project from .NET 6 to .NET 8 and produce the gap and risk report before making any changes.