What changed: Db::backup runs VACUUM INTO — the WAL-aware online
snapshot that reads the store without writing it — behind POST /api/backup,
which requires an absolute path and reports the snapshot’s byte size. Then
scripts/backup-drill.sh rehearses the whole thing, because a backup that was
never restored is a hope, not a backup.
Proof — the drill, run for real: drive an incident open, back up, kill the
server, swap in the snapshot, restart. Result: down, one open incident, one
pending outbox row — nothing replayed, nothing lost.