Why three numbers, not one
RPO alone does not describe protection. A real-time replica can have an RPO of seconds and still faithfully replicate a mistakenDROP TABLE five
minutes after it happens — the replica is fresh and the data is still gone.
Recovery window is a peer of RPO, not a footnote: it is how far back you
can reach, not just how current the copy is.
- RPO — how much recent data can be lost.
- RTO — how long until the data is available to restore into a rebuilt guest.
- Recovery window — how far back an error can still be corrected, not just how fast a crash can be recovered from.
Assignment rule
Every store gets its class by answering three questions, in order. Stop at the first one that applies.- Is it reproducible byte-for-byte from infrastructure-as-code, or re-downloadable from a public source? → P3. The source of truth lives elsewhere; regenerating it is the recovery path.
- Does anything outside the codebase — a human, an external API, a sensor — write to it such that the last hour cannot be recreated? → P0. This is state nothing else remembers.
- Otherwise → P1.
Derived vs source of truth
The question underneath every class assignment: is this store a source of truth — something writes to it that cannot be recreated — or is it derived — an index, cache, or rebuild target some other source of truth already covers? That single distinction is what collapses dozens of individually-named stores down to three classes plus one exemption tier. Search indexes, vector embeddings, session stores, and scrape caches are routinely P3 for this reason: the data they hold is regenerated from something else, not lost.The telemetry contract
Every protection mechanism reports one line per run, with a fixed set of fields (timestamp, host, mechanism, job, class, outcome, age). Three rules keep the signal honest:- A job that has never run reports it explicitly — never a value that could be misread as “just ran.”
- A host with nothing to protect says so explicitly, so silence from a healthy host stays distinguishable from silence from a dead one.
- A skipped run is not a success. It is its own outcome, and it must carry a reason.
Related
Data platform resilience
A worked P0 example — replication and layered backups for a shared
application database.
ZFS backup and replication
A worked example at the host layer — the 3-2-1 rule built as four
escalating ZFS layers.