skills/dotnet-change-impact/SKILL.md
Classifies .NET library or NuGet package changes and recommends the correct release bump: Major, Minor, or Patch. Applies both Semantic Versioning (MAJOR.MINOR.PATCH) and .NET assembly/file versioning (Major.Minor.Build.Revision), grounded in Microsoft’s official .NET library compatibility rules. Use when evaluating the current branch, breaking changes, API diffs, public API changes, dependency updates, TFM/platform support, interface or enum changes, overloads, analyzers, source generators, or binary/source/behavioral/design-time/backwards compatibility. When no explicit change details or compare range are provided, inspects the current Git branch and compares it against the upstream default branch automatically. Always returns structured compatibility reasoning with the recommendation.
npx skillsauth add codebeltnet/agentic dotnet-change-impactInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.

Classify a proposed change to a .NET library or NuGet package and recommend the correct release bump. This skill exists to stop accidental breaking releases from being shipped as a patch or minor, while staying practical enough not to label every internal refactor as breaking.
It answers one question:
Given these changes, should I bump Major, Minor, or Patch?
The authority for every decision is Microsoft's official .NET compatibility guidance:
Treat those two sources as normative. When the deep category definitions or the long tail of
special cases matter, read references/compatibility-categories.md.
The skill accepts input in three ways, checked in this order:
1. Explicit change details:
When the user provides release notes, a PR summary, an API diff, a git diff, a changelog entry, dependency update details, a bug-fix description, or a stated release intent, classify those provided changes directly.
2. Explicit compare range:
When the user provides a base ref, current ref, compare URL, branch name, tag range, or commit range, inspect that range and classify the changes found there.
3. Default resolution (no input provided):
When the user does not provide explicit change details or a compare range, operate on the current Git working repository. See Default Resolution Behavior below.
If required information is missing and cannot be inferred or resolved, ask only for the missing fact. Do not ask the user to restate the whole change set when the current repository or an explicit compare range can be inspected.
If the user does not provide explicit change details, a compare URL, branch name, tag range, or commit range, the skill must operate on the current Git working repository.
In that case, the skill must:
main, but do not assume main if
the remote default branch can be resolved.The default comparison should be conceptually equivalent to:
upstream/default-branch...current-branch
For example, if the current branch is feature/change-impact and the upstream default branch is
main, the comparison should be treated as:
upstream/main...feature/change-impact
If the repository uses origin as the upstream remote, use:
origin/main...current-branch
If the repository has both origin and upstream, prefer the remote that represents the
canonical source repository. In fork-based workflows, this is usually upstream. In
single-repository workflows, this is usually origin.
The skill must not silently assume the wrong base branch. If the default branch cannot be resolved, fall back in this order:
origin/HEADupstream/HEADorigin/mainorigin/masterupstream/mainupstream/masterIf none of these can be resolved, ask the user to provide the base branch or compare range.
Useful read-only commands for default resolution:
git rev-parse --abbrev-ref HEAD
git remote
git symbolic-ref refs/remotes/origin/HEAD --short
git symbolic-ref refs/remotes/upstream/HEAD --short
git merge-base HEAD {resolvedBase}
git log --oneline {resolvedBase}..HEAD
git log --format="%H%x09%an%x09%ae%x09%s%x09%b" {resolvedBase}..HEAD
git diff --name-status {resolvedBase}...HEAD
git diff --find-renames {resolvedBase}...HEAD
Use local Git state only for default resolution unless the user explicitly asks to refresh remote state. Do not fetch, pull, push, or mutate repository state as part of this skill.
Always return a structured answer with the recommendation and reasoning. Do not collapse clear
decisions to a bare one-word Major, Minor, or Patch response. The reasoning is part of the
value of this skill, especially for branch-level analysis where the user needs to trust why the
bump follows from the diff.
Use the template in Output format below for every answer. Keep the answer concise when the decision is simple, but still explain the compatibility impact and the deciding facts.
When the answer is ambiguous, incomplete, or depends on a missing fact, still provide the best current recommendation and make the missing fact explicit in Deterministic decision.
Run this analysis internally for every request, regardless of which mode you output. Do not print this checklist verbatim — it is reasoning scaffolding, not the answer format.
Recommend Major when the change can break, or plausibly break, existing consumers. A change
is breaking if it can affect backwards, binary, source, or design-time compatibility, or change
observable behavior that consumers can reasonably depend on.
Changes that usually require Major:
Recommend Minor when the change adds functionality without breaking source, binary,
design-time, or behavioral compatibility.
Changes that usually require Minor:
Be conservative with interfaces: adding members to an existing public interface is usually
breaking for implementers and therefore usually Major. Default interface implementations
reduce but do not eliminate source, design-time, and behavioral risk — evaluate them, do not
wave them through.
Recommend Patch when the change preserves the public contract and adds no new public
functionality.
Changes that usually require Patch:
Key nuance: a bug fix can still be breaking. If the fix changes observable behavior, exception
behavior, serialization, validation, ordering, equality, formatting, parsing, threading,
timing, or side effects that consumers may depend on, evaluate it as a potential Major.
When several changes ship together, choose the highest required bump:
Major > Minor > Patch
Major.Minor.Patch.When uncertain, prefer the safer classification:
Major.Minor.Patch.But do not inflate every behavior change to Major. First decide whether the behavior is
actually observable, documented, reasonably relied upon, or compatibility-sensitive. An
internal or non-observable change is not a breaking change just because something changed.
When you produce an explanation, classify the impact using these five categories. Full,
Microsoft-grounded definitions and examples live in references/compatibility-categories.md;
the summary here is enough for most decisions.
Major.Major.Major if it breaks
existing consumers by default.Major.These recur often enough to call out directly. The full catalog is in
references/compatibility-categories.md.
Patch. Escalate to Minor or Major only if the update
changes public API exposure, supported TFMs/platforms, runtime behavior, introduces
binding/runtime incompatibility, requires consumers to update their own dependencies, or
drops compatibility with existing consumers.Patch. If the old, incorrect behavior was publicly observable and
consumers may depend on it, explain the trade-off; it may still need Major.Minor, but check for overload-resolution ambiguity. If existing
source could bind differently or fail to compile, consider Major.Major (implementers
may fail to compile). Adding a brand-new interface is usually Minor. Default interface
members still warrant caution and explanation.Minor, but may be behavioral or source-impacting
if consumers exhaustively switch over values or serialization contracts are affected. Removing
or renaming values is usually Major.Patch or Minor by scope. Diagnostics that become errors by
default, or generated-code changes that break consumers, are usually Major.Minor; removing support is usually
Major. Raising the minimum supported runtime, SDK, language version, OS, or CPU architecture
is usually Major when existing consumers are affected.Patch when behavior is unchanged; may be Major when
timing, ordering, threading, concurrency, caching, resource lifetime, or side effects are
observable and compatibility-sensitive.MAJOR.MINOR.PATCHMajor → increment Major, reset Minor and Patch to 0.Minor → increment Minor, reset Patch to 0.Patch → increment Patch.Major.Minor.Build.RevisionMajor → increment Major. Reset or align Minor per project policy.Minor → increment Minor.Patch → normally maps to Build or Revision per project policy.Build and Revision are CI/build metadata. Never use them to hide a breaking change, and
do not use them as a substitute for a SemVer Patch when NuGet package versioning is involved.Input may arrive as release notes, git commits, PR summaries, API diffs, changelog entries, dependency updates, bug-fix descriptions, a stated release intent, or the default current-branch comparison. Distinguish carefully between: public API changes, internal implementation changes, consumer-visible behavior changes, build/design-time changes, documentation-only changes, package/dependency changes, and platform/TFM support changes. The bump follows the most impactful real change, not the loudest commit subject.
Use exactly this structure:
## Recommendation
<Major|Minor|Patch>
## Key changes identified
<Short bullet list of the branch changes or provided changes that drive the bump. Omit only when
there is truly no concrete change to list.>
## Compatibility impact
- Behavioral change: <yes/no/possible> — <reason>
- Binary compatibility: <yes/no/possible> — <reason>
- Source compatibility: <yes/no/possible> — <reason>
- Design-time compatibility: <yes/no/possible> — <reason>
- Backwards compatibility: <yes/no/possible> — <reason>
## Reasoning
<Why this bump is recommended. Reference the official .NET compatibility principles,
especially whether existing consumers can compile, run, and observe equivalent behavior.>
## Deterministic decision
<If clear: the decisive fact that makes the recommendation unambiguous. If ambiguous: the single
missing fact that would make the answer deterministic, for example, "Is `Parse` part of the public
API or internal?">
Major, Minor, or Patch recommendations.Patch just because it is "a fix".Major.testing
Generate GitHub release notes by summarizing all commits and pull requests between two Git tags, branches, or the current branch and the upstream default branch. Use when the user asks to write release notes, generate release notes, draft a GitHub release, create release notes from tags, summarize changes between versions, summarize the current branch, or provides a GitHub compare URL. Trigger phrases: "release notes", "generate release notes", "what changed between", "summarize changes from v1 to v2", "GitHub release", "summarize this branch", compare URLs like "github.com/owner/repo/compare/v1...v2". When no explicit input is given, detects the current branch and compares against the upstream default branch automatically.
documentation
Generate source-grounded repository digest markdown from deterministic local evidence bundles. Use when the user asks to create, refresh, or complete repo/package digests, family or project overview pages, .bot/digests output, digest workspace workflows, or result/Index.md plus result/{PackageName}.md files for any repository URL. The skill runs its bundled .NET file-based evidence generator over a git clone, separates authoritative XML evidence from Markdown prompts and reading aids, writes package digests first, then writes the overview from completed package digests, and enforces complete-read grounding and no-invention rules even when file output is capped.
testing
Turn many commits into a curated grouped squash summary compatible with the opinionated wording style of git-visual-commits. Use when the user asks to squash a branch into a concise summary, write a squash-and-merge summary, summarize this branch, summarize a commit range or PR as grouped lines, clean up noisy commit history, or asks for a curated summary without committing. For normal squash-and-merge requests, default to the full current feature branch from merge-base to HEAD against the base branch instead of a same-named tracking remote, include commits from all authors unless the user explicitly narrows by author, and do not ask for yolo because the skill is read-only. Returns grouped lines only, preserves identifiers, merges overlap, drops noise, and avoids changelog wording.
tools
Scaffold a new .NET NuGet library solution following codebelt engineering conventions. Use this skill when the user wants to create a new NuGet library, class library, or reusable .NET package. Also use when the user mentions "new library", "new NuGet package", "scaffold library", "class library solution", "dotnet new classlib", or wants a .NET library project with multi-target frameworks, strong-name signing, NuGet packaging, DocFX documentation, CI/CD pipeline, and code quality tooling. ALWAYS use this skill when asked to scaffold or create a new .NET library solution.