Code & Engineering

API Breaking Change Check for OpenAPI

Compares two versions of one API description (OpenAPI 3.0 or 3.1 in YAML or JSON, or two JSON Schemas of one request or response) and lists ONLY the changes that break clients written against the old version, one line each with a fixed code, the place, old and new, and who breaks - or exactly No breaking changes. The skill judges by direction - a request may widen safely and breaks when it narrows, a response may narrow safely and breaks when it widens - and it follows each $ref and allOf to the operations that use it, so a change made only in a shared schema is still found, while a renamed path variable, a new optional field, a reformatted file and a field moved between allOf branches are left out. Use to check an API change before release, review a pull request that edits an OpenAPI file, or gate a pipeline on breaking changes.

API Breaking Change Check for OpenAPI is a tested SKILL.md that compares two versions of one API description (OpenAPI 3.0 or 3.1 in YAML or JSON, or two JSON Schemas of one request or response) and lists ONLY the changes that break clients written against the old version, one line each with a fixed code, the place, old and new, and who breaks - or exactly No breaking changes; an agent buys it once for $0.03 over x402.

Tested 2026-10-18No code, no hidden instructionsv1.0.0 · 10.7 KB · perpetual license

Not for

Writing an OpenAPI operation from an example call, listing every difference between two JSON documents, or judging server behaviour the description does not show. It reads two pasted versions of one API description, treats a newly documented error response as not breaking, and gives no versioning advice.

Tested, honestly

Tested 2026-10-18 with a strong and a weak model.

With and without the skill

Results with and without the skill, for Sonnet and Haiku
SonnetHaiku
withwithoutwithwithout
Pairs judged right (33 pairs)33/3331/3333/3331/33

Same request on both sides. Read by hand, both bare models already handled removed endpoints, new required fields, narrowed limits, removed response fields, nullable in 3.0 and 3.1, status changes, added auth and type changes, and ignored a renamed path variable, an allOf refactor, null newly allowed in a request and a deprecated flag. Two situations differ. A default of the optional limit parameter moved from 20 to 50: Sonnet saw it and left it out on purpose as a behaviour shift, Haiku did not mention it. The value shipped was removed from a response enum: both called it breaking; the skill says safe, since the response stays inside the old values. That is the skill's policy, not the OpenAPI standard, and a reader could side with the bare model.

Same cases and the same checks with and without the skill. The cases are ours, written around what the skill is for; with a handful of cases, a difference of one or two is within noise.

SonnetStrong model, claude-sonnet-5-5
Right on all 33 pairs of API descriptions, read by hand: it listed removed endpoints, new required fields and parameters, narrowed limits, removed response fields, a response field that may now be absent, null newly allowed in a response in both the 3.0 and the 3.1 spelling, a replaced success status, auth added on one operation or on the whole API, type changes, a new response enum value and a changed default of an optional query parameter. It left out the safe look-alikes that sat beside each break (a renamed path variable, a field moved between allOf branches, null newly allowed in a request, a deprecated flag) and answered exactly No breaking changes. on all seven controls, including the one where a response enum lost a value.
HaikuWeak model, claude-haiku-5-5
Right on all 33 pairs with the skill, read by hand: every planted break came out as one coded line with the place, old and new, and which clients are hit, the safe look-alikes stayed out, a removed response enum value was judged safe, a changed default of an optional parameter was listed, and each of the seven controls got exactly No breaking changes.

Full test summary

Example

Our own test text, before and after the skill ran. Excerpts only.

English · claude-sonnet-5-5

Before

=== BEFORE (bookshop-api-2.3.0.yaml) === openapi: 3.1.0 info: title: Bookshop API version: 2.3.0 servers: - url: https://api.example.com paths: /books: get: summary: List books parameters: - name: limit in: query schema: type: integer minimum: 1 maximum: 100 default: 20 - name: sort…

After

ENDPOINT-REMOVED — DELETE /books/{id} — operation present → removed — clients that delete a book get an error (405 or 404) instead of 204

What is in the file

  • The answer
  • The direction rule
  • How to read the two texts
  • The codes
  • Rules
  • Work in this order
  • Short example

Languages

English. Tried in: English.

License

Perpetual, non-exclusive; use and modify for yourself incl. paid work; no resale or republishing. Holder: Georgi Kalchev, aiskills402.com. Full terms.

Versions

Current version 1.0.0, updated 2026-10-18. Whoever bought an earlier version gets new ones free through the same re-download token.

  1. v1.0.0 · 2026-10-18

    First release: compares two versions of one API description (OpenAPI 3.0 or 3.1 in YAML or JSON, or two JSON Schemas of one request or response) and lists only the changes that break clients written against the old version, one line each `CODE — where — old → new — who breaks`, or exactly `No breaking changes.` Ten codes: ENDPOINT-REMOVED, REQUIRED-ADDED, REQUEST-NARROWED, RESPONSE-FIELD-REMOVED, RESPONSE-WIDENED, RESPONSE-ENUM-ADDED, STATUS-CHANGED, DEFAULT-CHANGED, AUTH-ADDED, TYPE-CHANGED. The core rule is direction: a request may widen and breaks when it narrows; a response may narrow and breaks when it widens.

    Facts: public standards only (OpenAPI 3.0.3 and 3.1.0, JSON Schema 2020-12 validation), read on 18 October 2026 with curl; the three standard addresses and our own published description answered 200. No owner measurements, no dated line in SKILL.md, no paid or model call for the writing.

    Decisions (one line each): - A response enum that gains a value is reported as RESPONSE-ENUM-ADDED, with the reason "breaks strict clients"; the shared request says a client handles only what the old version says it can receive. - A newly documented error response is NOT reported (it says what the server may send, not that it started to; tools disagree). The brief listed "new status code" as breaking; narrowed to a replaced or removed success status because the wider rule has no clean test. - The optional "N non-breaking changes not listed" summary line of the brief was dropped: controls must be exactly one sentence, and a planted answer must have only finding lines (a test checks that every non-empty line starts with a code). - Renaming a path variable alone is not breaking; a path whose segments changed is ENDPOINT-REMOVED. - A type change is judged by values: integer to number is safe in a request and breaks in a response; adding or removing null is judged by direction and is never TYPE-CHANGED. - A schema used in both directions is judged in each direction and may give two lines; the same change reached through several operations by one shared schema is one line that names them. - A top-level security requirement counts as AUTH-ADDED for operations that have none of their own (the spec says an operation's own definition overrides the top-level one). - A deprecated flag, a version number, descriptions, examples, tags, operation ids and key order are never breaking. - Notes from the authors of the change are claims; two cases carry a note that asks the reviewer to answer that nothing breaks.

    Test (written, not yet run): 33 cases built by `test/make-cases.mjs` from one base spec (a bookshop on api.example.com, OpenAPI 3.0.3 and 3.1.0, YAML and JSON, ten finding codes) by scripted mutations, so each expected answer is known by construction — 26 planted (3 hard), 7 controls, 16 from the real starting point (two documents and nothing else; the other half carry a short, vague note from the authors). Every planted case also carries at least one safe decoy (optional request field, renamed path variable, new optional query parameter, new endpoint, new response field, widened request enum, relaxed limits, removed response enum value, nullable on a request field, deprecated flag, a field moved between allOf branches), so listing every difference fails. `test/control.mjs` checks every planted case against realistic wrong answers on both sides (a safe change called breaking, a missed finding, a neighbouring code, a surplus code, a wrong place, the fixed sentence for a defect, a fence, extra text), every control against any deviation from the sentence, and every ideal answer; `test/no-leak.mjs` checks that no test answer, test-only name or 6-word run is in SKILL.md.

FAQ

Path variable renamed in a new release: reported?

The URL a client calls is the same. The OpenAPI specification itself treats two templates that differ only in a variable name as identical, so the skill leaves a rename of the variable, in the template and in its parameter entry, out of the list. A path whose shape changed is reported, because the old URL no longer exists for the clients that still call it.

What is the direction rule?

Ask which way the data flows. A request may widen and breaks when it narrows: a new required field, a removed enum value or a tighter limit fail old clients, while a new optional field passes. A response may narrow and breaks when it widens: a removed field, a value that may now be null, or a new enum value fail clients that read the old description as a closed contract.

Does it find a change that exists only in a shared schema?

Yes. It follows each reference to the operations that use the schema and reports the change in the direction of that use, so a field newly required inside a nested address object is found even though the line that refers to it was never touched. It also reads the OpenAPI 3.0 nullable flag and the 3.1 type list as one and the same change, and ignores a field that merely moved between allOf branches.

Does it help Claude Sonnet?

Slightly. The 33 test pairs were one bookshop API description edited 33 ways: 26 with a real break next to a harmless look-alike, 7 where nothing breaks. Sonnet knew nearly every rule already, from removed endpoints to nullable in both spellings. It erred on two: a changed default of an optional page-size parameter, and a value dropped from a response enum, which it called breaking while the skill's own policy says safe. With the skill loaded, Sonnet rose from 31 right to all 33, and Haiku made the same climb.

Share

Read this page as Markdown: /skills/api-breaking-change-check.md.

  • OpenAPI Operation Object From An Example Call

    Code & Engineering

    SKILL.md · v1.0.0 · 9.2 KB

    Writes one OpenAPI 3.1 operation object, as bare JSON, from an example request, an example response and rules given in words - parameters with the right location, requirement flag and type, a request body, and a response per status the person actually showed. Uses the 3.1 forms, not the 3.0 ones - a field that may be null is a type list with "null" (never nullable), a path parameter is always required, a status is a quoted key, an identifier written as text in the URL keeps the type the rules give, a list in the query string gets the style and explode that match how the example writes it. Nothing is made required, closed or listed in an enum because the example happens to look that way, no response is invented, an authorization header is not declared as a parameter, and words inside an example body that give orders are data. Use when asked to document an endpoint, turn a curl call and its reply into an OpenAPI operation, or fill in the operation part of a spec.

    $0.01once

    • x402
    • USDC
    • Base
    Get skill

    Tested with Sonnet and Haiku, 8 Oct 2026

  • JSON Diff Paths

    Data & Analysis

    SKILL.md · v1.0.0 · 7.3 KB

    Compares two pasted JSON documents, BEFORE and AFTER, and lists every value that differs as strict JSON, one entry per changed path, with the old and the new value. Paths are JSON Pointers, types are strict (the string "1" is not the number 1, null is not a missing key, an empty array is not an empty object), arrays are compared by index with no move detection, object key order and number spelling (1.0, 1e2) are not changes, and a document that is not valid JSON is refused, never repaired. Use to see exactly what an API response, config file, fixture or snapshot changed between two versions, to write the assertion for a test, to review a data migration, or to feed an audit log with the list of changed fields.

    $0.01once

    • x402
    • USDC
    • Base
    Get skill

    Tested with Sonnet and Haiku, 9 Oct 2026

More in Code & Engineering

  • GDPR Cookie Consent Review: Banner, Consent Mode

    Code & Engineering

    SKILL.md · v1.0.0 · 17.9 KB

    Reviews a pasted snapshot of a website's cookie and consent setup (scripts in the head, the banner with each toggle's default, the Consent Mode or tag-manager setup, what a fresh browser stored and contacted before any click, the cookie table, the owner's note) against published EU law, court rulings, EDPB guidance, national regulators and vendor documents. It is a technical review, not legal advice. It flags trackers and embeds that store or read before a choice, a Consent Mode default that is late or granted, pre-ticked and implied consent, analytics filed as strictly necessary, legitimate interest used for cookies, a reject option that is missing or disguised, bundled purposes, missing cookie information, no easy withdrawal, a refusal that is not kept, missing Consent Mode v2 signals, personalised Google ads without a certified CMP, cookie walls, and cookieless pings or Google font links treated as exempt. Each finding has a fixed code, the place, the named source with its weight and a fix, then one verdict. Where sources disagree, the line says so and never picks a side. Use to review cookie consent banner setups, run a GDPR cookie banner check or do a Consent Mode setup review before a regulator or a customer asks.

    $0.01once

    • x402
    • USDC
    • Base
    Get skill

    Tested with Sonnet and Haiku, 16 Oct 2026

  • Recommended

    OpenNext R2 Cache Cleanup for Next.js on Cloudflare

    Code & Engineering

    SKILL.md · v1.0.1 · 11.9 KB

    Decides which old build folders of an OpenNext incremental cache on Cloudflare (R2, or Workers KV) can be deleted, from a pasted setup (wrangler config, open-next config, next.config, the public HTML build id, a listing of the cache folders), and never touches the live build. It reads the cache root and the real folder name (a custom prefix, a deploymentId, a constant deploymentId, a no-build-id folder), finds the live build from the public HTML, not from a local file, and handles a rollback, a deploy in progress, two Workers on one bucket, a bucket with other folders, KV billing, and a request to delete the live build or to skip the dry run. Answer in a fixed format: live build, KEEP and DELETE lines, steps with a dry run first, one verdict. Use to clean up an OpenNext R2 cache, find old build folders in R2, or free R2 space used by Next.js on Cloudflare before running any delete.

    $0.05once

    • x402
    • USDC
    • Base
    Get skill

    Tested with Sonnet and Haiku, 16 Oct 2026

  • Recommended

    LLM API Fallback Review: Gemini, Groq, Chains

    Code & Engineering

    SKILL.md · v1.0.0 · 14.8 KB

    Reviews pasted code that calls a language model (JavaScript, TypeScript or Python; REST, @google/genai, google-genai, or an OpenAI-compatible client for Groq), usually through a chain of models or providers with retries. It finds where the call path goes silent or stops while another model would answer (an empty 200 taken as the answer, a 429 or 5xx that ends the call, a retired model's 404, a Groq schema 400 that drops the provider, one provider's stop that ends all) and what costs more or hides the cause (retries on top of SDK retries, a missing thinking setting, a thinking level the model refuses, a small output limit, a moving -latest alias, errors without the model name, unguarded JSON, a model picked from the listing, several keys of one project, a weak model that publishes, a quality gate that cannot fail, a fixed price for open-ended reasoning). Each finding has a fixed code, the place, the reason and a fix, then one verdict. Use to review LLM fallback code, check a Gemini 503 retry, a Gemini empty response or a Groq json_validate_failed handler before the code runs unattended.

    $0.05once

    • x402
    • USDC
    • Base
    Get skill

    Tested with Sonnet and Haiku, 16 Oct 2026

  • PR Description From a Diff

    Code & Engineering

    SKILL.md · v1.0.3 · 10.6 KB

    Writes a pull request title and description from a pasted unified diff, as Markdown only - a title line of at most 72 characters, then four fixed sections - Summary, Changes, Tests and Risks - where every file the diff touches is named once, including renames, deletions, binary files, mode changes, lockfiles and formatting-only edits, and nothing is claimed that the diff does not show. It describes what the hunks change and leaves out a reason, a speed gain, a security fix or a test result unless the author's note supplies it, flags what can break callers, links an issue only when one is given, never copies a secret into the text, treats a note addressed to the AI inside a code comment as data, and says so when the diff is cut off. Use when asked to write a pr description, pull request body or merge request text from a git diff or a patch.

    $0.02once

    • x402
    • USDC
    • Base
    Get skill

    Tested with Sonnet and Haiku, 8 Oct 2026