<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: mendapi</title>
    <description>The latest articles on DEV Community by mendapi (@mendapi).</description>
    <link>https://dev.to/mendapi</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4057645%2F5650c052-4476-4f00-8cd4-292482d02dc7.png</url>
      <title>DEV Community: mendapi</title>
      <link>https://dev.to/mendapi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mendapi"/>
    <language>en</language>
    <item>
      <title>136 raw removals, 17 real ones: what a spec diff over-reports</title>
      <dc:creator>mendapi</dc:creator>
      <pubDate>Sun, 02 Aug 2026 00:18:36 +0000</pubDate>
      <link>https://dev.to/mendapi/136-raw-removals-17-real-ones-what-a-spec-diff-over-reports-1fba</link>
      <guid>https://dev.to/mendapi/136-raw-removals-17-real-ones-what-a-spec-diff-over-reports-1fba</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://mendapi.com/blog/cloudflare-curation-136-to-17.html" rel="noopener noreferrer"&gt;mendapi.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Between two published snapshots of the Cloudflare OpenAPI schema — &lt;code&gt;7abe88500e55&lt;/code&gt; (2026-03-31) → &lt;code&gt;c92b9b0fde23&lt;/code&gt; (2026-07-27) — a raw structural diff produced 6,354 change records. 136 of them were endpoint path removals, the scariest kind a diff can report: the route your code calls is simply gone from the spec.&lt;/p&gt;

&lt;p&gt;Except 119 of those 136 were not gone at all. This is the accounting of how we know, per record, with machine evidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  The trap in a raw diff
&lt;/h2&gt;

&lt;p&gt;A path removal in a spec diff means one thing: the string key disappeared from the &lt;code&gt;paths&lt;/code&gt; object. It does not mean the runtime URL stopped working. Specs get refactored — concrete routes collapse into templated ones, path parameters get renamed, methods get merged — and every one of those refactors shows up as a "removal" if you only look at one side of the diff.&lt;/p&gt;

&lt;p&gt;An alerting tool that pages you 136 times for this corridor is training you to ignore it. The whole job of the curation layer is to keep that from happening without silently dropping a real break.&lt;/p&gt;

&lt;h2&gt;
  
  
  The ledger: 17 + 119 = 136
&lt;/h2&gt;

&lt;p&gt;Every one of the 136 raw removals has an adjudicated destination. 17 were kept as genuinely client-breaking: the runtime URL or method really disappeared, with no surviving successor. The other 119 were excluded, each with machine evidence from the two spec snapshots that the surface actually survives:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Template consolidation — 107 records.&lt;/strong&gt; Concrete Workers AI model routes like &lt;code&gt;/ai/run/@cf/baai/bge-m3&lt;/code&gt; collapsed into the pre-existing generic &lt;code&gt;/ai/run/{model_name}&lt;/code&gt; route. The runtime URL a client sends never changed; the spec just stopped enumerating each model. The evidence rule requires the templated route to exist in both snapshots and to swallow the removed path with a literal-anchored match, so a template that is merely a shape prefix of a genuinely removed endpoint does not count.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Parameter rename, runtime-identical — 11 records.&lt;/strong&gt; Path parameters renamed (&lt;code&gt;{postfix_id}&lt;/code&gt; to &lt;code&gt;{investigate_id}&lt;/code&gt; and friends). After normalizing parameter names, the route shape and the full HTTP method set are identical on both sides. No client sends the parameter's spec name on the wire.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Method superset — 1 record.&lt;/strong&gt; A renamed discovery route whose surviving form kept the original method and gained another. Strictly more capability, not less.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The audit tool recomputes all of this from the raw snapshots: 107 + 11 + 1 = 119 evidenced exclusions, 0 unevidenced, ledger conserved. If any future re-run finds an exclusion without survival evidence, the audit fails loud and the page you are reading fails its build gate.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the 17 real ones look like
&lt;/h2&gt;

&lt;p&gt;The kept records are the ones a client integration genuinely feels: billing usage routes gone with no successor, legacy &lt;code&gt;/system&lt;/code&gt; secrets-store aliases withdrawn, &lt;code&gt;firewall-for-ai&lt;/code&gt; renamed to &lt;code&gt;ai-security&lt;/code&gt;, cloudforce-one alert routes restructured. Each entered the change database with a fixability verdict, and the mechanical renames among them are covered by deterministic migration packs — the diff you can preview and apply locally.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we are not claiming
&lt;/h2&gt;

&lt;p&gt;One-directional honesty, verbatim from the audit's stated property: every excluded removal is machine-evidenced as surviving; the keep/exclude judgment stays with the curator. The audit guarantees no real break was silently excluded — it does not claim the 17 kept records are the theoretical minimum, and a kept record may also match a rule if the curator judged it breaking anyway. And this 136-to-17 ratio is one corridor of one provider's spec history; we do not extrapolate it to other providers or other corridors. Some corridors are almost all real (an earlier Cloudflare corridor kept 14 of 14); this one was almost all noise. That variance is exactly why per-record evidence beats a ratio.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check your own repo against this corridor
&lt;/h2&gt;

&lt;p&gt;All 17 client-breaking removals from this corridor are in the change database behind this site, with fixability verdicts and migration guidance. To find out whether your repo is exposed — file and line number, no code leaving your machine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx mendapi scan &lt;span class="nt"&gt;--repo&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The full Cloudflare timeline lives on the &lt;a href="https://mendapi.com/guides/cloudflare-api-breaking-changes.html" rel="noopener noreferrer"&gt;Cloudflare breaking-change guide&lt;/a&gt;, which renders this same curation ledger.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Detected and tracked by &lt;a href="https://mendapi.com/" rel="noopener noreferrer"&gt;mendapi&lt;/a&gt; — Dependabot for every API you depend on. Scans run locally; your code never leaves your machine.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>openapi</category>
      <category>devtools</category>
      <category>programming</category>
    </item>
    <item>
      <title>Your API provider shipped a breaking change. Here's how to find what it breaks in your code</title>
      <dc:creator>mendapi</dc:creator>
      <pubDate>Sat, 01 Aug 2026 07:55:12 +0000</pubDate>
      <link>https://dev.to/mendapi/your-api-provider-shipped-a-breaking-change-heres-how-to-find-what-it-breaks-in-your-code-3657</link>
      <guid>https://dev.to/mendapi/your-api-provider-shipped-a-breaking-change-heres-how-to-find-what-it-breaks-in-your-code-3657</guid>
      <description>&lt;p&gt;When Dependabot bumps a dependency, the PR is green, the tests pass, and you merge it on autopilot. Three days later something in production throws a &lt;code&gt;TypeError&lt;/code&gt; on a code path your test suite never exercised. The upstream provider shipped a breaking change, your SDK version moved with it, and nothing in your CI caught the mismatch because your tests only cover the surface you thought to write.&lt;/p&gt;

&lt;p&gt;This is the gap. Version bumps tell you &lt;em&gt;that&lt;/em&gt; something changed. They do not tell you &lt;em&gt;what in your code&lt;/em&gt; is now wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  The changelog is not enough
&lt;/h2&gt;

&lt;p&gt;The usual advice is "read the changelog." Fine. You open the OpenAI Node SDK v3-to-v4 migration guide and it lists forty changes. Now what? You have to hold the entire diff in your head and grep your own codebase for every affected symbol, every renamed method, every reshaped response object. For one provider, on a quiet week, maybe you can. Across Stripe, Twilio, PayPal, Cloudflare, and whatever else you integrate, on a real team shipping real features, you won't. The changelog is a description of the provider's world. What you actually need is a mapping from that world onto your call sites.&lt;/p&gt;

&lt;p&gt;That mapping is the boring, mechanical, error-prone work nobody wants to do by hand. So it doesn't get done, and you find out at runtime.&lt;/p&gt;

&lt;h2&gt;
  
  
  What mendapi actually does
&lt;/h2&gt;

&lt;p&gt;mendapi treats this as three steps, and keeps all three local:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Spec diff.&lt;/strong&gt; It maintains a classified database of breaking changes across major API providers, pulled from SDK release feeds and official developer changelogs. Each entry is tagged breaking / deprecation / additive / fix, so you're not drowning in additive noise.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Codebase scan.&lt;/strong&gt; It reads that change database, detects which providers your repo actually uses (SDK imports, API hosts, env vars, not naive grep), and pinpoints the exact files, lines, and symbols a breaking change touches. It scores each finding for confidence so the high-signal ones surface first.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reviewable fix diff.&lt;/strong&gt; It applies deterministic migration rule packs to draft the change as a unified diff you review before anything happens. Nothing is pushed unless you explicitly ask.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The part that matters for a lot of teams: the scanner, fixer, and review CLIs contain no network code at all. Your source never leaves your machine. That's not a promise in a privacy policy, it's enforced by a test that fails the build if a network primitive shows up in those files.&lt;/p&gt;

&lt;h2&gt;
  
  
  The actual commands
&lt;/h2&gt;

&lt;p&gt;Zero config, zero npm dependencies, Node 22+:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# In any repo — nothing leaves your machine&lt;/span&gt;
npx mendapi scan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You get every upstream breaking change that hits your code, with file, line, and symbol. Want it saved?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx mendapi scan &lt;span class="nt"&gt;--repo&lt;/span&gt; /path/to/your/repo &lt;span class="nt"&gt;--out&lt;/span&gt; impact.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Medium-confidence findings can go through an optional semantic review pass:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx mendapi review impact.json &lt;span class="nt"&gt;--pending&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then draft the migration as a diff — dry-run, changes nothing on disk until you say so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx mendapi fix &lt;span class="nt"&gt;--from-report&lt;/span&gt; impact.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And when you're ready to turn that into a branch and a PR-ready description (local only; &lt;code&gt;--push&lt;/code&gt; is required to actually push and is never implied):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx mendapi &lt;span class="nb"&gt;pr&lt;/span&gt; &lt;span class="nt"&gt;--repo&lt;/span&gt; /path/to/your/repo &lt;span class="nt"&gt;--from-report&lt;/span&gt; impact.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;sync&lt;/code&gt; command is the one and only command that touches the network — it fetches the latest change feed. Everything downstream runs offline.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wiring it into your AI coding agent
&lt;/h2&gt;

&lt;p&gt;If you drive your work through Claude Code or Cursor, mendapi ships an MCP server so your agent can run the scan and read the findings itself:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add mendapi &lt;span class="nt"&gt;--&lt;/span&gt; npx mendapi mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For Cursor or any JSON-configured MCP client, drop this into &lt;code&gt;.cursor/mcp.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"mendapi"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"mendapi"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mcp"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The server runs on stdio, offline-first, zero npm dependencies. It exposes &lt;code&gt;scan&lt;/code&gt;, &lt;code&gt;deps&lt;/code&gt;, &lt;code&gt;fix&lt;/code&gt;, and &lt;code&gt;changes&lt;/code&gt; as tools that return the same structured JSON as the CLI's &lt;code&gt;--json&lt;/code&gt; flags. So your agent can ask "what breaks if I bump Stripe" and get file-and-line answers instead of a vibes-based guess.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it falls short
&lt;/h2&gt;

&lt;p&gt;Honesty section, because you're going to hit these:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Coverage is a set, not the universe.&lt;/strong&gt; It watches around twenty major providers today. If your critical dependency is a niche API, it's not in the feed yet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rule packs are curated.&lt;/strong&gt; The deterministic fixers exist for well-trodden migrations. For an obscure breaking change, you may get an accurate &lt;em&gt;finding&lt;/em&gt; but no auto-generated fix — you migrate by hand, just with the exact call sites already located.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's pre-1.0.&lt;/strong&gt; Published on npm as &lt;code&gt;mendapi&lt;/code&gt; v0.5.0. The change database and rule registry grow daily, and interfaces may still shift before 1.0.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of that changes the core value: the scan tells you which of your lines break before your users do.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;It's open source (AGPL-3.0), so your security team can read exactly what reads your code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/mendapi/mendapi" rel="noopener noreferrer"&gt;https://github.com/mendapi/mendapi&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;npm: &lt;a href="https://www.npmjs.com/package/mendapi" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/mendapi&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Run &lt;code&gt;npx mendapi scan&lt;/code&gt; in your noisiest repo and see what a green CI has been hiding.&lt;/p&gt;

</description>
      <category>api</category>
      <category>node</category>
      <category>devtools</category>
      <category>openapi</category>
    </item>
  </channel>
</rss>
