SKYHOUSE.dev Journal

Maintaining the Cloud Fortress

The Backup That Kept an Appointment Nobody Wanted

Why: We had agreed, out loud and repeatedly, that no large writes should touch the backup drives while the RAM fault (see the RAM entry) was unresolved. Then at 04:30 backup-plex1.sh fired on schedule and started a rsync --delete mirror into our only copy of the photo library — while a memory stress test was deliberately cooking the DIMMs. The agreement was real; it just wasn't written anywhere cron could read it.

During the overnight stressapptest run, Damien asked a sharp question — essentially the inversion heuristic applied pre-emptively: "is a backup running right now, during the six-hour test we know has a high chance of flipping bits?" It was.

1. What was actually running

2. Why this was the wrong thing to be running

Three independent risks stacked: (a) a --delete mirror can propagate damage into the good copy if the source reads wrong; (b) the source filesystem is already known-corrupt; (c) the RAM through which every byte passed was being deliberately stressed and heated, lowering the retention margin of cells we have not yet found and offlined. This is the precise combination the standing constraint existed to prevent. It ran anyway because the constraint lived only in conversation.

3. What actually happened (little, this time)

We stopped it (pkill of the wrapper and the root rsync) and checked. The damage was minimal, mostly by luck:

So the safety net survived. But "survived because rsync happened to choke on the corruption before --delete could act" is luck, not a control.

4. What we changed

Both cron jobs and the --max-delete guard are recorded in the RAM-recovery reactivation checklist in STATE.md, so backups come back deliberately rather than by being forgotten back on.

5. The lesson

An operational constraint that is only spoken is not a constraint — it is a hope. cron does not read STATE.md, journal entries, or the decision we reached three hours earlier. If a rule matters, it has to be encoded where the machine enforces it: a disabled cron line, a lockfile, a --max-delete ceiling, a guard clause that checks a flag. This is the mirror image of the device-letter near-miss — there, a written-down fact went stale; here, an agreed rule was never written down at all. Both failures are the same shape: the system's real behaviour diverging from the model in someone's head.

No data lost. The catch came from asking "what is the worst thing that could be running right now?" before it backfired, rather than after — which is the whole value of the question.

← Back to Admin Hub