Serial dependencies are a catastrophe already starting to happen

Wednesday, November 19, 2025 

Leveraging existing tools sure makes the development of new products faster and easier, but it comes with some serious risk propagation problems that can quickly add up to major headaches.

cats.com is down because of cloudflare failure

cats.com is down because of cloudflare failure

Cloudflare went down today and an awful lot of the internet, including ChatGPT, Twitter, and Claude, which threw an incorrect error message because the developers assumed, absurdly, that Cloudflare couldn’t be the cause of the fail.

Cloudflare outage kills Claude

Claude murdered by Cloudflare outage

This sort of thing happens more and more, not just individual sites, but entire ecosystems are knocked offline by a single failure, leading one to consider the growing fragility of an interconnected world. This is a consequence of dependency chains: libraries, objects, modules, gems, packages, etc and their real-world equivalents: services, supply chains. It is more convenient to reuse someone else’s work than to write the code yourself.  Want to round a number in your python script?  Why use the round() function built into python when you can pull in NumPy to do it, it’s only 19.6 MB, compressed, and has had 100s of releases since 1995, what could possiblai go wrong?

Nothing can possiblai go wrong

Take FreeBSD, for example. It has an excellent ports system to manage software and each port lists dependencies, so it is fairly straight-forward to write some code to produce a dotgraph of those dependencies so one can clearly visualize exactly what depends on what, and what the consequences of a port failing:

FreeBSD Ports Dotgraph

FreeBSD Ports Dotgraph

See, it’s obvious! No worries at all, why are people fussing about this stuff? Who needs static compiles, AppImage, Snap, or Flatpak?

Someday ImageMagick will finally break for good and we'll have a long period of scrambling as we try to reassemble civilization from the rubble.

XKCD dependency_2x

The math behind it is simple: All dependencies, even branching dependencies, are effectively serial risks. Some are non-catastrophic: if a web page trades your visit information, IP address and browser fingerprint to Google or Adobe in exchange for “free” access to some pretty fonts, and their server goes down, the page will still render, albeit with improved privacy and typically reduced aesthetic purity. But when a site relies on a web service, such as Cloudflare, which may itself rely on other services, the serial risk grows acute.

The basic problem is that serial risks multiply.  The probability of success of a serial risk function is the product of the individual success probabilities, and even if every step is likely to be successful the net probability of success of a long chain becomes quite low. If the probability of success is Pₜ (0–1) and each individual step, n, has a probability of success of Pₙ, then Pₜ=P₁⨉P₂⨉P₃…Pₙ. If all such steps have the same probability of success then Pₜ=Pⁿ. Even highly reliable steps, say a success probability of 95%, are risky in long dependency chains. 4 such steps and the probability of success is down to 81.5%; 10 steps: 59.9%; 100 steps: 0.6%.

Now it may seem a little pessimistic to consider 100 serial steps, but consider the port dependency tree for FreeBSD (above), 100 serial steps is probably optimistic, even if a 95% build/execution probability is pessimistic, yet even at 99.9% uptime, total system uptime is only 90.5%. “Five nines” uptime, a typical corp BS claim of 99.999% uptime (or 5.26 minutes of downtime per year) becomes a “three nines” system with 100 dependencies.

And 100 dependencies is pretty optimistic a request map for the New York Times shows a “modern” web infrastructure’s fragility.

Request Map For the New York Times

Request Map For the New York Times

Or to take a supply chain example:

Global supply chain example on a world map.

A typical supply chain from raw materials to consumer

That is, 100 element-level serial complexity isn’t surprising.  Even assuming every element in that chain is held to a five nines level of availability, and even if the mean down time (MTTR) is only 2 hours, the mean time to failure starts to get short. I wrote a little Monte Carlo analysis tool to compute the odds.  The failure distribution for a single “five nines” device, one device in series, over a million such devices, runs for years.

5 nines one in series a million such devices

That’s about what you’d expect: MTTF 22.83 years. But if you have a complex system, like everything is getting to be, 100 such elements in series, we go from years to days.

100 five nines devices in series

The system MTTF is only 83 days and the effective system availability is only three nines (which is how that math works: 1,000 series devices would be two nines).

This is why, despite highly reliable systems and everyone’s marketing assurances that they’re all executing at five nines, we’re beset by system failures. Coders need to really internalize that:

Every dependency is a humiliation.

(The only place that isn’t true is crypto code, if you wrote  your own, you did a bad thing and you should feel bad, crypto code is an exception because security confidence can only be achieved by accumulated unsuccessful bashing, no amount of unit testing is useful).

So lets all work toward system independence and parallelism and stop trading PII for code convenience and think twice about linking to a complex image processing library just to scale an image.

Summary
Serial dependencies are a catastrophe already starting to happen
Article Name
Serial dependencies are a catastrophe already starting to happen
Author
Posted at 19:07:25 GMT-0700

Leave a Reply

8 Views