Forty artefacts are listed in the ledger beside this page; the
twenty-four that carry the argument are below, graded. Two tiers are absent on purpose and that absence is a
finding: no engineering blog, talk, paper or vendor case study could be reached from this
session, so nothing here is a company narrative about itself.
Decision record
Stripe2026-10
openapi/upcoming-changes/README.md
The only place in this corpus where Stripe states a contract policy in its own words: monthly releases with no breaking changes, and twice a year a named generation that starts with breaking changes. Also calls the directory internal, in a public repository.
Carry forwardWrite the cadence down. A promise with no stated schedule becomes a promise you break by surprise.
raw.githubusercontent.com/stripe/openapi/master/openapi/upcoming-changes/README.md
Source
Stripe2026-10
stripe/openapi, repository README
Describes three publication channels, two file variants, and a generator Stripe does not publish. States that the SDK variant carries deprecated endpoints and pre-release features, and that the old OpenAPI 2.0 dialect lives on at an old tag rather than being migrated.
Carry forwardSeparate the contract you publish from the contract you generate against, and say which is which.
raw.githubusercontent.com/stripe/openapi/master/README.md
Source
Stripe2026-10
spec3.json and spec3.sdk.json at tag v2535
Counted in this session: 431 published paths against 398 in the generator input, 1,538 schemas against 1,823, six operations formally deprecated against 33 paths silently withheld from client generation.
Carry forwardDeprecation can be enforced in code generation while the endpoint keeps serving. It is the only removal available to a publisher who has promised not to remove things.
raw.githubusercontent.com/stripe/openapi/v2535/openapi/spec3.sdk.json
Source
Stripe2026-10
latest/openapi.spec3.json and latest/README.md
The unified specification: 454 paths, of which 23 sit under a second namespace holding the redesigned account, event and metering domains. The README states the unification in one line.
Carry forwardA second namespace is how a never-break publisher finally changes an object's shape. Reserve it for identity changes, not for field churn.
raw.githubusercontent.com/stripe/openapi/master/latest/openapi.spec3.json
Source
Stripe2026-10
stripe-node OPENAPI_VERSION and CODEGEN_VERSION
Two plain files at the repository root recording the spec release and the generator commit behind the current build. The first arrived in May 2022, the second in January 2026.
Carry forwardPin both inputs of a generated artefact in the artefact. Without them a client regression cannot be bisected, only argued about.
raw.githubusercontent.com/stripe/stripe-node/master/OPENAPI_VERSION
Decision record
Stripe2026-09
hark, the changelog generator
One changefile per user-facing pull request, each carrying a semver level that hark inspect emits as JSON so CI can fail on an unplanned major. Published, but closed to contributions and without an issue tracker.
Carry forwardMake the breaking-change classification an artefact in the pull request rather than a judgement at release time, then gate on it.
raw.githubusercontent.com/stripe/hark/master/README.md
Decision record
Stripe2026-10
stripe-mock, scope statement
States that it does not reproduce behaviour at all, that responses are hardcoded, and that it is locked to the newest API version. It is generated from the same specification as the clients and used in their test suites.
Carry forwardA spec-derived mock proves shape, never semantics, and a version-locked mock makes migration rehearsal impossible. Say so loudly or integrators will assume otherwise.
raw.githubusercontent.com/stripe/stripe-mock/master/README.md
Decision record
Stripe2026-02
stripe-node/.claude/CLAUDE.md
Instructions for coding agents working in the repository, added February 2026. Names the generated regions, forbids editing them, and tells the agent to report a needed change instead.
Carry forwardIf machines now edit your repository, your architectural boundaries need a machine-readable statement, not just a convention reviewers know.
raw.githubusercontent.com/stripe/stripe-node/master/.claude/CLAUDE.md
Source
Stripe2026-10
stripe-node README, configuration table
The apiVersion option defaults to null, documented as "stripe-node will use the latest version at the time of release". Preview features are requested inside the same version string, and private previews ship as suffixed package builds.
Carry forwardOne line of default behaviour decides whether a dependency bump is a contract migration. Choose it deliberately and document the consequence.
raw.githubusercontent.com/stripe/stripe-node/master/README.md
Source
Stripe2026-10
Seven server libraries, one release date
node 23.0.0, go v87, ruby 20.0.0, python 16.0.0, php 22.0.0, java 34.0.0 and dotnet 53.0.0 all carry a major dated 30 September 2026, the start date of the endive generation. Each language has 14 or 15 majors since 2022.
Carry forwardSynchronising the fleet to the contract generation is what makes seven languages maintainable, and it also means every consumer in every language migrates on the same two dates a year.
raw.githubusercontent.com/stripe/stripe-ruby/master/CHANGELOG.md
Source
Stripe2026-10
stripe-go go.mod
The module path reads github.com/stripe/stripe-go/v87, so in Go the version boundary sits in the import path and every major is a visible edit at every call site.
Carry forwardYour language's packaging convention decides whether a major is invisible or unmissable. Pick the default that matches how much you want consumers to notice.
raw.githubusercontent.com/stripe/stripe-go/master/go.mod
Operator report
Integrator2025-07
stripe-node issue 2369: expansion returns null after a generation advance
With the library pinning 2025-06-30.basil, latest_invoice.payment_intent is no longer populated; the reporter confirms the same code works on the 2023-10-16 version. The schema never changed, so no shape check could catch it.
Carry forwardBehaviour is not in the specification. Treat a generation advance as a migration with its own test plan, not as a dependency bump.
github.com/stripe/stripe-node/issues/2369
Operator report
Integrator2024-12
stripe-python issue 1432: error bodies emptied in v8
"StripeError -> http_body becomes None instead of valid dictionary", with the reporter noting both fields held identical data before v8. The break is in the hand-written edge of a generated library.
Carry forwardAudit the non-generated edges of a generated client: errors, retries, serialisation. That is where each language's major actually bites.
github.com/stripe/stripe-python/issues/1432
Operator report
Integrator2026-04
stripe-node issue 2658: an undocumented type export removal
"v22 and specifically #2619 remove the export for SessionCreateParams. This was no documented and resulted in breaking existing imports." Fixed by a follow-up pull request.
Carry forwardThe exported symbol table of a typed client is a contract. Gate changes to it the way you gate changes to the API.
github.com/stripe/stripe-node/issues/2658
Operator report
Integrator2026-04
stripe-node issue 2661: typechecks, then throws
An instanceof check against the library's error type "passes type check but throws at runtime" after v22. Labelled bug and future, still open when checked, in the code path least covered by integrator tests.
Carry forwardA compiler that accepts an upgrade proves nothing about the value graph behind the types. Test error handling across majors explicitly.
github.com/stripe/stripe-node/issues/2661
Operator report
Integrator2022-10
stripe-node issue 1593: unusable in an edge runtime
Buffer use in webhook verification, eager crypto imports and untree-shaken Node HTTP modules made the library fail where the documentation said it was supported. Fixed through a fetch client and a worker entry point.
Carry forwardPut the transport behind an interface early. Runtime fragmentation arrives through your customers' platform decisions, not your roadmap.
github.com/stripe/stripe-node/issues/1593
Operator report
Integrator2024-10
stripe-node issue 2211: the client could not be intercepted in tests
The default Node client stopped being mockable by current tooling, open from October 2024 until October 2026. Combined with a version-locked official mock, integrators had no way to rehearse the boundary that changes twice a year.
Carry forwardTestability of the client is part of the contract. If integrators cannot fake you, they will discover your changes in production.
github.com/stripe/stripe-node/issues/2211
Operator report
Integrator2025-10
stripe-node issue 2458: charges rejected after an upgrade
A charge call that worked on 18.4.0 began returning "Invalid amount" on 19.1.0; the reporter reverted. No maintainer root cause appears in the thread as checked, which makes the blast radius unknowable from outside.
Carry forwardFor integrators, your issue tracker is the incident record. An unanswered money-path report is itself a reliability signal.
github.com/stripe/stripe-node/issues/2458
Operator report
Integrator2026-03
stripe-python issue 1779: objects stopped printing in v15
str() and repr() on a subscription object fail with "when serializing dict item 'items'", so a diagnostic log line raises. The break is in hand-written serialisation, not in generated code.
Carry forwardContract-test the ancillary behaviour of generated objects: printing, equality, comparison. The specification cannot describe it and nobody reviews it.
github.com/stripe/stripe-python/issues/1779
Source
Stripe2026-09
stripe-node changelog as a dataset
Generated from changefiles, it carries 218 breaking markers, 32 distinct pinned API versions and 23 majors whose cadence tripled after 2022.
Carry forwardMeasure your own breaking cadence from your changelog before claiming stability; the number is usually worse than the story.
raw.githubusercontent.com/stripe/stripe-node/master/CHANGELOG.md
Source
Stripe2025-04
veneur, archived with a confident README
Archived 25 April 2025, last commit February 2023, while the README still reads "currently handling all metrics for Stripe" and "under active development and maintenance". The feature-flag client was retired the same way, with a notice in 2023.
Carry forwardGeneric platform software gets dropped when the market catches up; the README is the last thing anyone updates. Date your status claims or delete them.
github.com/stripe/veneur
Source
Stripe2026-10
smokescreen, thirteen years of egress policy
Still active, 745 commits since 2013. Centralises outbound traffic so partners get stable egress addresses, and resolves every requested hostname to block requests at internal addresses.
Carry forwardOwn the infrastructure that encodes an obligation specific to your business, and rent the rest. The lifespans in this estate split cleanly along that line.
raw.githubusercontent.com/stripe/smokescreen/master/README.md
Source
Stripe2026-10
stripe/ai, link-cli and mpp-rb
A hosted protocol server for agents, billing adapters for three model vendors' native SDKs, agent plugins for three coding harnesses, a CLI that issues single-use payment credentials to agents, and a client for a separate machine payments protocol. First commits November 2024 and April 2026.
Carry forwardWhen the consumer changes from a developer to a program, the answer is a new protocol surface, not more endpoints on the old one.
raw.githubusercontent.com/stripe/ai/master/README.md
Source
Sorbet, founded at Stripe2026-10
sorbet, and the monolith it is tested against
13,524 commits since October 2017, with a contributor section headed "Testing Sorbet against pay-server" and a design principle that it must scale "on all axes: execution speed, number of collaborators, lines of code, codebase age".
Carry forwardThe compatibility surface inside the monolith needs machine checking for the same reason the outside does: review does not scale with collaborators or age.
raw.githubusercontent.com/sorbet/sorbet/master/README.md