Skip to content
Agentmart
Submit a tool

api-compat-review

Backward-compatibility review of changes to a project's public surface.

Skill by Priyank Patel

IndexedApache-2.0★ 1
Write a review

Install

Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.

npx agentmarket install skill/priyank766-api-compat-review

Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.

Get the weekly diff

The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.

We use your email only for this newsletter. Privacy

About

Backward-compatibility review of changes to a project's public surface. Use when a diff changes exported function or type signatures, renames or removes public symbols, changes a default value, alters config keys, environment variables, or CLI flags, modifies an HTTP or wire format, migrates a database schema, changes exception or error types, touches plugin or extension hooks, or whenever a PR proposes a major-version bump. Establishes what the project actually promises, diffs the public surface between base and head with language-native tooling, classifies each change against a breaking-change taxonomy, and requires a migration path before a break may land. Language-agnostic. Do NOT use for purely internal or private code with no external consumers.

Use cases: backend

No reviews yet. Installed it? Reviews come from verified installers only. How reviews work

Permissions

What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.

Tools
No tools found
Secrets
None asked for
Install scripts
None found

Network hosts it talks to 1

  • codeload.github.com · found in install command

Files it touches

  • ~/.claude/skills/api-compat-review

What's inside

Skill name
api-compat-review
Description
Backward-compatibility review of changes to a project's public surface. Use when a diff changes exported function or type signatures, renames or removes public symbols, changes a default value, alters config keys, environment variables, or CLI flags, modifies an HTTP or wire format, migrates a database schema, changes exception or error types, touches plugin or extension hooks, or whenever a PR proposes a major-version bump. Establishes what the project actually promises, diffs the public surface between base and head with language-native tooling, classifies each change against a breaking-change taxonomy, and requires a migration path before a break may land. Language-agnostic. Do NOT use for purely internal or private code with no external consumers.
License
Apache-2.0
Metadata
suite: opensource-review-suite · author: Priyank Patel · domain: compatibility · version: 1.0.0 · severity_floor: 7.5
Instructions
356 lines in SKILL.md · view on GitHub

Files (4)

  • SKILL.md
  • DETECTION-PLAYBOOK.md · references/
  • QUALITY-FILTER.md · references/
  • REVIEW-VOICE.md · references/

SKILL.md (first lines)

# API Compatibility Review

A specialised lens layered on [`pr-review`](https://github.com/priyank766/OpenSource-SKILL/blob/main/skills/pr-review/SKILL.md). Run the general
procedure first; run this when the diff touches anything a downstream consumer can observe.

**Read first:** [`DETECTION-PLAYBOOK.md`](references/DETECTION-PLAYBOOK.md) ·
[`QUALITY-FILTER.md`](references/QUALITY-FILTER.md) ·
[`REVIEW-VOICE.md`](references/REVIEW-VOICE.md)

> **Where the time goes.** Finding the flaw is the review. The playbook above is the
> general flaw-hunting procedure; this file is the domain-specific lens on top of it.
> Scoring and writing the comment are the last ten minutes, not the work.

**Severity floor: 7.5** — lower than the suite default of 8.0. The asymmetry justifies it.
A noisy comment costs one maintainer thirty seconds. A missed break reaches every
downstream user simultaneously the moment the release publishes, and cannot be un-shipped:
registries are append-only, a yanked version is still in someone's lockfile, and the fix
arrives as *another* release those users must now also adopt. Under that asymmetry, a
false positive is cheap and a false negative is not.

---

## The governing question

> **What breaks for someone who upgrades without reading the changelog?**

Not "is this change reasonable" — most breaks are reasonable. Not "is the new API better" —
it usually is. The only question is what happens to the person who bumps a caret range,
runs their suite, and gets a red build or, worse, a green one with different behaviour.

Everything below exists to answer that one question with evidence rather than intuition.

---

## Why this exists

Compatibility damage is invisible at review time and expensive afterwards. A removed
keyword argument produces a clean diff, a passing CI run, and — three weeks after release —
a stream of issues that all look different and all have the same cause. The maintainer
pays for it in triage, not in review.

### What each role gets out of it

| Role | Time this gives back |
| :--- | :--- |
| **Maintainer** | The surface diff is computed before merge, not reconstructed from bug reports. One pass over `apidiff`/`cargo-semver-checks` output replaces the weeks of issue triage that follow an unnoticed break, plus the emergency patch release and the apology thread. |
| **Contributor** | You find out your change is breaking while you can still design around it, instead of after a maintainer closes the PR with "this can't land before 3.0". |
| **Project owner** | A written, checkable definition of what the project promises. Version numbers start meaning something, and "is this a minor or a major?" stops being decided by whoever cuts the release. |

---

## Procedure

```mermaid
flowchart TD
    A[Start] --> B[1. Establish the public surface]
    B --> C[2. Diff base vs head across that surface]
    C --> D[3. Classify each change with the taxonomy]
    D --> E{Breaking?}
    E -->|"no, internal only"| F[Drop it silently]
    E -->|"yes"| G[4. Measure blast radius]
    G --> H[5. Check for a migration path]
    H --> I{Shim, changelog, docs present?}
    I -->|"all present"| J[Score the deprecation window]
    I -->|"any missing"| K[Finding at 9.0 or above]
    J --> L[6. Frame in review voice]
    K --> L
    L --> M[7. Get explicit approval, then post]
```

---

## 1. Establish the public surface first

A change is breaking only relative to a contract. Find the contract before judging the
diff; otherwise you will flag internal churn and miss a real break in a file that did not
look public.

```bash
rg -n "semver|semantic version|stability|public API|breaking" README.md docs/ CONTRIBUTING.md
ls docs/versioning.md docs/stability.md POLICY.md 2>/dev/null
cat CHANGELOG.md | head -60        # how have breaks been handled before?
git tag --sort=-v:refname | head   # does this project even bump majors?
```

Then read the language's own marker of intent:

| Ecosystem | Where "public" is declared |
| :--- | :--- |
| Python | `__all__`, absence of a leading `_`, what `docs/` imports, `py.typed` |
| JS/TS | `package.json` `exports` map, generated `.d.ts`, `@public` / `@internal` TSDoc tags |
| Go | Exported identifiers outside any `internal/` directory — the compiler enforces this one |
| Rust | `pub` vs `pub(crate)`, `#[doc(hidden)]`, `#[non_exhaustive]` on enums and structs |
| Java | `public` modifier plus `module-info.java` `exports`, `@Internal` annotations |
| C/C++ | Installed headers only; anything under `src/` or `detail/` is not surface |

`#[non_exhaustive]`, `@internal`, and `internal/` are the project telling you in advance
which changes it reserves the right to make. Respect them — flagging a change the project
explicitly reserved is a false positive, and a costly one for your credibility.

**No stated policy?** Assume anything importable, documented, or shown in a README example
is public, and say so in the review rather than silently assuming it:

> There's no stability policy I could find, so I'm treating anything reachable from
> `import foo` as public — `foo.Client.retries` is used in the quickstart, which is why I
> think dropping it needs a shim. If that's not the intent, a line in the README would
> settle it for future PRs too.

---

## 2. Detection procedure

Start with the raw diff, restricted to the paths you established as public.

```bash
git diff upstream/main...HEAD -- src/mypkg/ 'src/**/*.pyi' docs/api/
git diff upstream/main...HEAD -- ':!**/internal/**' ':!**/_*.py' ':!**/*_test.go'
```

From priyank766/OpenSource-SKILL, Apache-2.0.

Signals

Stars
1
Forks
0
Open issues
0
Last commit (this folder)
Aug 6, 2026 (2 months ago)

From GitHub (fetched Oct 24, 2026).

Details

Version
1.0.0
License
Apache-2.0
First seen
Oct 24, 2026
Last checked
Oct 24, 2026

More from Priyank Patel

Cite this page

api-compat-review skill. Agent Mart. https://agentmart.dev/skills/priyank766-api-compat-review (last updated 2026-10-24)