Skip to content
Back to skills

Breaking Change Detection

ASecurity

This skill should be used when the user mentions "breaking change", "semver", "semantic versioning", "major minor patch", "version bump", "backward compatible", "API compatibility", or "deprecation". Provides a decision matrix and per-ecosystem signals for reasoning about behavioral (not just syntactic) breaking changes.

  • 3 stars
  • 0 votes
  • 0 copies
  • 3 views
  • Added September 19, 2026
ai-agentspythonrustgojavac#apidatabaseperformance

Works with

  • cli
  • api

Security analysis

A100/100

Pro scans all 3 files and shows the line behind each finding

Scanned September 19, 2026

npx -y skills add sigistry/marketplace --skill breaking-change-detection --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Breaking Change Detection?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Breaking Change Detection
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/sigistry-breaking-change-detection/badge)](https://www.skillsdirectory.com/skills/sigistry-breaking-change-detection)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: breaking-change-detection
description: This skill should be used when the user mentions "breaking change", "semver", "semantic versioning", "major minor patch", "version bump", "backward compatible", "API compatibility", or "deprecation". Provides a decision matrix and per-ecosystem signals for reasoning about behavioral (not just syntactic) breaking changes.
---

# Breaking Change Detection

## Purpose

Standardize how a change is classified against Semantic Versioning by reasoning about its effect on *consumers*, including behavioral breaks that leave the syntax intact. Humans get binary compatibility right only about 60% of the time; this methodology closes the gap with an explicit decision matrix and per-ecosystem catalogs. Tech-agnostic.

## First: is the change on the public surface?

Only changes to the **public API surface** can be breaking or minor. Establish the surface before classifying (detailed per ecosystem in `references/breaking-change-catalog.md`):

| Ecosystem | Public surface |
|-----------|----------------|
| JS/TS | `package.json` `exports`/`main`, named/default exports, `.d.ts` |
| Python | `__all__`, non-`_` names, entry points |
| Go | Capitalized identifiers outside `internal/` |
| Java/C# | `public`/`protected` members of exported packages |
| Rust | `pub` items reachable from the crate root |
| CLI | flags, subcommands, arg order, exit codes, stdout format |
| HTTP | routes, methods, request/response schema, status codes |
| GraphQL | types, fields, args, nullability, enum values |
| Config | recognized keys, env vars, defaults |

A change entirely within private/internal code is at most a PATCH.

## The decision matrix

| Change | Classification |
|--------|----------------|
| Remove/rename a public export, field, route, flag, env var | **MAJOR** |
| Change a signature (add required param, reorder, retype, change return type) | **MAJOR** |
| Change a default value that alters observable behavior | **MAJOR** |
| Make validation stricter (reject formerly-valid input) | **MAJOR** |
| Change output shape, field names, units, or serialization | **MAJOR** |
| Change/narrow error or exception types, or HTTP status codes | **MAJOR** |
| Remove an enum value or change its meaning | **MAJOR** |
| Add a new public export/endpoint/optional param/flag | **MINOR** |
| Add an optional field to output (additive) | **MINOR** |
| Loosen validation (accept more input) | **MINOR** (usually) |
| Deprecate without removing | **MINOR** |
| Bug fix restoring documented behavior | **PATCH** |
| Performance improvement, no behavior change | **PATCH** |
| Internal refactor, docs, tests, CI | **PATCH** / no release |

Aggregate rule: the single highest-severity change in the range sets the bump.

## Behavioral vs syntactic breaks

Syntactic breaks (removed symbol, changed signature) are caught by compilers. **Behavioral breaks are not** and cause most surprise incompatibilities:

- Same signature, stricter validation → previously-passing inputs now throw.
- Same return type, changed field meaning/units (seconds → milliseconds).
- Same endpoint, changed default page size or sort order.
- Same function, changed default argument that flips behavior.
- Same enum type, a value's semantics changed.

Always read the *diff of behavior*, not only the diff of declarations.

## Additional Resources

### Reference Files
- **`references/breaking-change-catalog.md`**: per-language and per-interface signals (JS/TS, Python, Go, Java, Rust, HTTP/REST, GraphQL, database schema, CLI): what is a break vs an additive change, with concrete examples.
- **`references/semver-rules.md`**: a concise SemVer 2.0.0 summary, pre-1.0.0 rules, deprecation policy (deprecate before removing), and how to communicate breaks to users.

Files in this skill

  • SKILL.md3.7 KB
  • references/breaking-change-catalog.md6.3 KB
  • references/semver-rules.md3.8 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.