Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

112 integration failures vs. an accretive-contract versioning tool

Verdicts (about the proposed tool, not the world):

  • S: detectable or preventable mechanically if the design is adopted
  • P: partly; needs an extra facet (ABI, behavior, dialect, environment), laws, or adapters
  • N: outside versioning (governance, business, hardware, coordination)

Examples come from memory and are not individually re-verified. Check specifics before citing.

Tally: S 43, P 57, N 12.

A. Dependency and packaging

#CaseFailureVHandling
1left-pad unpublishedArtifact vanished, builds brokeSAppend-only immutable registry
2event-stream takeoverMalicious maintainer shipped codePNew capabilities show as new requires in the diff; trust is out of scope
3Diamond ranges (npm/pip)Incompatible ranges unsatisfiableSLineage is a chain; take the max
4Python 2→3Breaking change, no bridgePNew lineage name plus mandatory adapter; language-level adapters only partly feasible
5Caret range, breaking minorDeclared minor actually brokeSCompatibility computed, not asserted
60.x semver loophole“Anything may change”SNo special-case versions
7Yanked crate/gemLockfiles reference withdrawn releasePNever delete; mark with advisory edge
8npm peerDependency duplicates (React)Two copies, hooks breakPSingleton contract kind; needs runtime check
9Rust types across majorsv1 Error ≠ v2 ErrorPAdapter plus declared shared identity
10Maven nearest-winsSilently picks older versionSResolver picks max in chain
11Dependency confusionPublic package shadows internal namePNamespace ownership in registry
12TyposquattingLookalike package namesNSocial/registry policy
13Phantom dependenciesImport works only via hoistingSExtracted demands vs declared demands
14Floating latest Docker tagSame tag, different bitsSContent-addressed revisions
15Mutable GitHub Action tagsTag repointed to malicious commitSHash identity
16Lockfile drift between envsCI ≠ prodSHash-pinned revisions

B. ABI and platform

#CaseFailureVHandling
17C++ std::string dual ABI (GCC 5)Link/runtime errorsPABI facet separate from API
18Rust unstable ABIdylib mismatchPABI facet; hash must match
19glibc symbol versions“GLIBC_2.xx not found”PSymbol versioning is accretion; build floor is a requires
20Windows DLL hellShared DLL overwrittenSContent-addressed side-by-side
21Java serialVersionUIDDeserialization failsPSerialization facet
22CPython C-extension ABIWheel per minor versionPabi3 = declared frozen subset
23Node native addon ABINODE_MODULE_VERSION mismatchPSame as 22
24Struct padding/endiannessLayout mismatch across platformsSLayout facet in IR
25FFI/JNI struct driftSilent memory corruptionSLayout hash
26Linux “never break userspace”Rare semantic regressionsPBehavioral laws
27Linux in-kernel APIOut-of-tree modules breakPExplicit “unstable” lineage
28Android targetSdk changesSame API, new behaviorPDefaults as slots; behavior laws
29Swift pre-5.0 ABIApps bundled runtimePABI facet

C. Schema and serialization

#CaseFailureVHandling
30Protobuf field-number reuseOld data misreadSNames/ids never reassigned
31proto2 required fieldCan never be removedSRequires polarity
32Protobuf unknown enum valueOld client mishandlesPOpen vs closed sum flag
33Avro non-transitive BACKWARDv1→v3 breaks despite adjacent passesSTransitive closure
34Avro added field, no defaultOld readers failSNew provide must be optional
35Thrift field id/type changeWire mismatchSShape diff
36JSON int64 in JavaScriptPrecision lossPNumeric range in scalar facet
37null vs absent fieldSemantics divergePPresence as slot attribute
38additionalProperties:falseAdded field breaks strict clientSOpen/closed record flag
39NOT NULL column, old writersInserts failSWriters’ requires grew
40Dropping column, old readersQueries failSProvides shrank
41Column renameNeeds expand/contractSNew name plus adapter (dual-write)
42ORM/DB driftModel ≠ actual schemaPExtract both and diff
43Parquet/Arrow column reorderPositional readers breakPPositional vs named slot flag
44CSV header changeDownstream parsers breakSShape diff
45Date format/timezone in payloadSilent misinterpretationPSemantic type facet
46XML any / namespacesExtension collisionsSOpen record with namespaced names
47GraphQL field removalUnknown clients breakPOnly declared demand is knowable
48GraphQL enum additionExhaustive clients breakSOutput-position sum is closed
49OpenAPI vs implementation driftSpec liesPExtract from code and spec; diff

D. Services and protocols

#CaseFailureVHandling
50/v1→/v2 copies whole APICoarse bump forces total migrationSPer-slot compatibility
51Twitter API v1.1 / pricingAccess removedNBusiness decision
52Google Reader shutdownService endedNBusiness decision
53Chrome SameSite defaultSame cookie, new behaviorPDefaults as behavior slots
54TLS 1.0 removalOld clients locked outPCapability negotiation as requires/provides
55HTTP middlebox ossificationProtocol can’t evolveNNetwork reality
56DNS flag dayNeeds global coordinationNCoordination
57gRPC status/deadline per languageDivergent semanticsPCross-language laws
58Retry/idempotency changeDuplicate side effectsPIdempotency as law
59Offset→cursor paginationDifferent protocolSNew name plus adapter
60Rate-limit tighteningIntegrations throttledPNon-functional laws
61Webhook payload evolutionReceivers unknownPDeclared demands only
62OAuth scope restrictionCapability narrowedPCapability as requires
63Parsed error stringsClients depend on textPHyrum: undeclared surface
64Unspecified ordering (Go map)Code relied on orderPDeclare unordered; cannot stop reliance
65Performance regressionComplexity change breaks callersPBounds as laws
66Token TTL changeCached tokens expire earlyPBehavior law

E. Language and library

#CaseFailureVHandling
67Java 9 modulesIllegal reflective accessPReflection surface undeclared
68Log4j JNDI defaultDangerous default behaviorPDefaults as slots
69Node createCipher removalAPI removedSProvides shrank
70AngularJS→AngularRewrite under same brandPNew lineage; adapter extremely hard
71Perl 6 / RakuIncompatible successorSLineage rename
72Swift 2→3 renamesMass source breakageSRename = adapter (migrator)
73Ruby 3 kwargsSame signature, new semanticsPCall-semantics law
74C undefined behaviorOptimizers exploit UBNLanguage spec problem
75JS flatten→flat (MooTools)Monkey-patching collided with new builtinPOpen-world extension
76Python async keywordIdentifiers became reservedSReserved names are a shared namespace
77Go compat promise exceptionsUnkeyed struct literalsPClosed-record flag
78Rust trait impl ambiguityAdded impl/method breaks callersPCoherence facet
79Scala 2.12 vs 2.13 binaryIncompatible artifactsSArtifact suffix = lineage name
80Java default-method conflictDiamond default methodsSName collision in merge
81Overload ambiguityAdded overload breaks call sitesPResolution rules per language
82Inference breakageReturn-type change alters inferencePLanguage-specific facet
83Struct field additionBreaks positional/exhaustive useSClosed-record flag
84Floating-point determinismDiffers by platform/flagsNHardware/compiler
85ICU/Unicode collationSort order changesPDialect/environment requires
86Regex dialectsPCRE vs RE2 behaviorPDialect named in contract

F. Distributed systems and runtime

#CaseFailureVHandling
87Rolling deploy N/N+1Mixed versions coexistSAccretion = bidirectional safety
88Stale cached objectsOld serialization after deploySTransitive compatibility
89Kafka in-flight old messagesLong retention outlives schemaSTransitive compatibility
90Event-sourcing replayYears-old eventsSUpcasters are adapters
91Feature-flag combinatoricsUntested combinationsPFlags as slots; explosion remains
92Mobile long-tail clientsOld apps never updateSAccretion keeps them working
93Root cert expiry (Let’s Encrypt 2021)Old devices fail TLSNTime/trust
94Y2038 / int32 timeOverflowPWidth in scalar facet
95Kubernetes API removalsextensions/v1beta1 goneSapiVersion lineage plus conversion
96Terraform provider upgradeResource semantics changePBehavior laws
97Helm values schemaValues keys changeSShape diff
98YAML “Norway problem”Parser dialect differencesPDialect named
99CRD conversion webhook failureConversion bugPAdapter law tests
100nginx directive removalConfigs refuse to loadSProvides shrank

G. Standards, hardware, data, humans

#CaseFailureVHandling
101Mars Climate OrbiterUnits mismatchPUnits in IR
102Ariane 5Ariane 4 assumptions reusedPEnvironment assumptions as requires
103Knight CapitalReused flag changed meaning mid-deploySNames never change meaning
104HL7 v2Vendor-specific interpretationPProfiles as contracts
105Bluetooth/USB interoperabilityImplementation quirksNHardware certification
106OOXML transitional vs strictTwo dialectsPDialect lineage
107CSS vendor prefixes/quirksBrowser divergenceNImplementation diversity
108SQL dialectsPortable SQL isn’tPDialect lineage
109Emoji version glyphsMissing charactersNClient updates
110Excel gene names → datesAuto-typing corrupts dataPSemantic type facet
111EDI X12 versionsTrading-partner mismatchSNegotiated adapters
112tzdata changesFuture timestamps change meaningNPolitical reality

What this changes in the design

  1. Contracts need facets, not one shape: API, ABI/layout, serialization, behavior/defaults, dialect, environment. Most P verdicts live in the last four.
  2. Defaults and environment are first-class slots. Many failures are same signature, new behavior (53, 68, 73, 28).
  3. Name identity must be enforced hard (103, 30, 9). A name’s meaning never changes.
  4. Polarity plus open/closed flags resolve a large cluster (31, 38, 48, 77, 83).
  5. Open-world demand is irreducible (47, 61, 63, 75). Say so in output rather than pretend otherwise.
  6. N cases need a different tool: governance, deprecation schedules, coordination.