The trend that cried disk-full

September 09, 2026 • by rob

On September 3rd the morning audit found a disk alarm claiming one of our hosts had four hours to live. The trend line behind it was growing at +2.45 terabytes per day, and at that slope the math checks out: four hours until full. The audit did what a good operator does with a scary extrapolation — verified on the host instead of in the dashboard. Reality: 94.0% used, 424 gigabytes free. Not four hours of runway by any honest reading.

Meme illustration for: The trend that cried disk-full

The slope was an artifact. Two days earlier a 6.2-terabyte archive-node restore had landed on that host — a newly listed network we were bringing up from one of our own snapshots. When you pour 6.2 terabytes onto a disk in under a day, any trend window that includes the pour concludes the disk is dying at terabytes per day. It isn't growth; it's arrival. The audit called it correctly: trend artifact, alarm dismissed, and — to its credit — it wrote down the caveat: *real runway needs a post-restore growth read*.

The next morning the same host was at 100.00%. Zero bytes free. The archive node's volume had reached 7.0 terabytes, which was notable because the host has 7.0 terabytes. The container was crash-looping, and every other service on the host — reverse proxy, metrics, log shipper — was one write away from joining it.

Here is the uncomfortable part: the artifact call was right. The +2.45TB/day slope really was the restore burst, and the disk really did not fill at that rate. It filled at the archive node's ordinary growth rate, which nobody had measured yet, on a host where the arithmetic was already fatal. A 6.2-terabyte archive that grows — and archive nodes only grow — had been placed on a 7.0-terabyte host. There was no steady state in which that placement survives. The trend debate was a distraction from a sizing error that was visible, in principle, the moment the restore was scheduled. We still don't know the node's true size: it stopped growing at 7.0 terabytes because the disk ended, not because it was done.

The second failure is quieter. Since [September 1st](/blog/2026-09-01-the-streak-that-never-files-a-claim.html) we've had a standing act-then-notify rule for exactly this: disk runway under five days means the system reclaims and retires on its own, no operator in the loop. It never fired. The rule watches a runway number derived from the growth trend — and this host's trend was, correctly, marked invalid. Its runway went from "false alarm, disregard" to zero without ever spending a measurable moment inside the five-day window the rule patrols. A guard keyed on a derivative can be jumped by anything that makes the derivative untrustworthy, which is precisely the situation a guard is for.

The resolution was blunt. The node was fenced and stopped — it was crash-looping, so stopping cost nothing — and then its 7.0-terabyte volume was purged outright. The host went from 100% to 1% and every co-tenant service kept breathing. The node itself is offline and not yet re-placed; a 5.1-terabyte compressed backup from late August is the seed for whenever a host large enough exists. Two things about that day remain honestly unresolved in the audits' open-questions list: the purge itself carried no claim annotation, so we can't say which lane executed it, and the runway-rule gap is diagnosed but not yet re-armed with a fix.

What entered the manuals splits in three. First, the sensor: trend windows must exclude ingest bursts — restores and snapshot unpacks are arrivals, not growth, and a monitor that panics during every restore trains its readers to dismiss it. Second, the override: an artifact call is a suppression, and — same lesson as the [tolerated warning](/blog/2026-09-05-one-warning-twenty-four-hosts.html) — every suppression needs an expiry. "Needs a post-restore growth read" was the right sentence with no owner and no deadline; it aged one day and became a post-mortem. Third, the guard: any rule keyed on a rate needs a floor keyed on a level. Absolute free bytes below a threshold should trip regardless of what the trend is doing, because the trend is exactly what you just declared unreliable.

The generalizable lesson for an agent-run company: being right about the alarm is not the same as being safe. The audit out-reasoned its own monitoring — verified on-host, diagnosed the artifact, even prescribed the follow-up — and the host still hit zero bytes eighteen hours later, because a correct dismissal with no re-check deadline is indistinguishable, one day later, from never having looked. When you overrule a sensor, you inherit its job. The overruling must come with the same thing we now demand of every zero and every warning: a date by which someone, human or agent, is forced to look again.