Build1 distinct publisher3 min readUpdated
A renamed field cost one team a P1 three days after a four-minute code review. Splitting breaking-change diffs from linting from consumer contracts makes most of the tooling debate disappear.
The Engineer · Build desk
Compiled by The EngineerSomething wrong?How this is made
A developer renamed a response field from `customer_id` to `customerId` to match the rest of his codebase, every test passed, and review approved it in about four minutes [1]. Three days later a mobile team filed a P1, because their client had been reading `customer_id` for eighteen months [2].
Nothing in the pipeline was broken, according to his account published on dev.to: the tests tested his own code, and his code was fine, while nothing in CI was looking at the contract with anyone else [3]. His argument, and it is the useful part of the post, is that "contract testing" is one phrase covering four unrelated problems, and that separating them makes the tool question mostly go away [4].
Job one is a diff: compare two OpenAPI specs, classify the changes, and flag the backwards-incompatible ones, such as removed endpoints, narrowed types, and newly required request fields [5]. Job two is linting: missing descriptions, inconsistent casing, absent `operationId`, auth described in ways that bite later [6]. Job three is different in kind, namely whether a change breaks a named consumer, since removing an endpoint nobody calls is free while removing one three teams depend on is an outage [7]. Job four is organisational: someone has to decide a finding blocks a merge, and someone has to be able to override it without switching the check off [8]. He notes that most tools do one or two of these well and none do all four, his own included [9].
Once the jobs are split, the cheap part is obvious. oasdiff is open source, carries several hundred breaking-change checks, ships a CLI and a GitHub Action, and offers a hosted web diff [10]. He calls it the reference implementation and says that if the requirement is knowing when a pull request breaks the spec, install it and skip the rest of the post [11]. He goes further, calling breaking-change detection commoditised table stakes that nobody should pay for as a standalone feature, his own product included [12]. Linting is similarly settled: Spectral is the de facto standard, vacuum is a faster Go implementation that reads the same ruleset format, and both are free [13], while Stoplight, Apigee API hub and Azure API Center all bundle Spectral already [14]. That puts two of the four jobs at zero licence cost [1].
The failure mode there is not the linter but what happens to its output. He reports watching this at two companies: `spectral lint` prints a wall of warnings, someone wires it into CI, it fails on 200 findings on day one, and by week three the command ends in `|| true` [15].
Job three is where paying starts to make sense. Pact and PactFlow have consumers publish what they actually use and providers publish what they offer, with a broker ruling on whether a given pair is compatible [16], and `can-i-deploy` answers whether a specific build will break a consumer that is live right now [17]. PactFlow starts around $99 a month [18], which is roughly $1,188 a year [2]. The reason to pay is the hard limit of spec-to-spec comparison: it cannot tell you a consumer reads a field it never declared, and runtime pact verification can [19].
Job four is the one nobody has finished. The author, who discloses he wrote SpecShield and says teams that only need what oasdiff does should use oasdiff [22], weights governance findings by severity into a 0-100 score and an A-F grade, with any error-severity finding capping the grade at C [21]. The mechanism matters less than the premise: a number a team has agreed on is easier to defend at a deadline than a list.
Two things to watch. Optic was archived in January 2026 and is now unmaintained, which he says surprised several people he spoke to [20]. And check whether your own lint step still ends in `|| true` [15].
Follow any of these and your For You feed starts watching them — no settings page required.
Ranked by verification strength, evidence, and original report placement.
PactFlow starts at around $99 per month.
Spec-to-spec comparison cannot tell you that a consumer reads a field it never declared; runtime pact verification can.
The author renamed an API response field from customer_id to customerId to match the rest of his codebase; every test passed and review approved it in about four minutes.
Three days later a mobile team filed a P1, because their client had been reading customer_id for eighteen months.
Nothing in the pipeline was broken: the tests tested the team's own code, which was fine, and nothing in CI was looking at the contract with the external consumer.
The author argues most confusion in this space comes from one phrase covering four unrelated problems, and that once they are separated tool choice gets obvious.
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
One vendor-authored post; verifiable tool details, anecdotal outcomes
Everything in the cluster comes from a single dev.to post written by the author of one of the compared tools. The technical particulars are concrete and checkable - CLI invocations, ruleset format, output formats, the grade-cap rule - and the conflict is disclosed up front, which lifts the floor. But the load-bearing incident, the lint-gate decay pattern and the category-level judgements are first-person recollection with no corroborating source, no feature matrix and no vendor response.
Free tooling widely embedded; commercial and new-tool adoption unquantified
There is real adoption evidence for the free half of the stack: Spectral is reported bundled by three commercial API platforms and oasdiff ships in the distribution channels teams actually use, including a GitHub Action. Against that, no install, customer or usage figure is given for SpecShield, and PactFlow adoption is represented only by a price point. Optic's archival is a negative adoption signal for one prior option.
Understated for a vendor post; framing outruns proof only on the governance layer
The post consistently argues down its own commercial position: it calls the author's core category commoditised, tells readers with narrow needs to install the free tool and skip the article, and concedes that runtime pact verification goes deeper than any spec-only tool including his own. That pushes the gap slightly negative. The offsetting overstatement is the unproven assertion that no tool covers all four jobs and the implication that scoring plus waivers is the missing piece, which has no operational evidence behind it.
Disclosed vendor authorship of one compared tool
The author sells SpecShield, which is presented as the answer to Job 4, and the article's four-job taxonomy is the frame that makes his product's differentiator look like the unmet need. That is a strong commercial incentive. It is mitigated but not removed by an unusually explicit disclosure, by repeated recommendations of the free alternatives, and by the note that the governance section should be weighed accordingly.
Moderate: checkable specifics, single self-interested source
Confidence is limited by the single-source, vendor-authored basis and by claims that would ordinarily require corroboration - PactFlow's price, Optic's archival date, the several-hundred check count. It is supported by the specificity and falsifiability of the technical detail, the up-front disclosure, and the internal consistency between the opening incident and the structural limitation the author concedes about spec-only tooling.
build
Four Layers, One Status Code: Testing Tenant Scope on a Generated Prisma Route1 distinct publisher
build
Coverage Is A Line Counter, So A Coverage Gate Buys You Line-Counting Tests1 distinct publisher
build
MCP is a discovery layer, and your exposure list is a governance decision1 distinct publisher
build
Your REPL Is Not A Container: Put Free-Variable Checks In CI Before Generated Code Ships1 distinct publisher
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 21, 2026