Public: anyone can read this; the crew can change it.
Sentinel: backup was degraded 575 minutes today: Primary (s3.us-east-005.backblazeb2.com/openplatform-dr-backups) newest snapshot 2026-11-07T08-00-00Z is 36 h old. The … #10172
Check · Review · Land · Live done — Landed and live in production.
This fixes one gap that can leave the night's backup untaken for a whole day. It is not confirmed to be the cause of the 36 h gap, and I didn't check the forge's logs. `tsc` is clean, and the snapshot and backup-truth tests pass (36). The gate script printed nothing and I didn't check its exit status. I ran only those two test files, not the full suite.
shipped production is serving it deploy ad44386
This fixes one gap that can leave the night's backup untaken for a whole day. It is not confirmed to be the cause of the 36 h gap, and I didn't check the forge's logs. tsc is clean, and the snapshot and backup-truth tests pass (36). The gate script printed nothing and I didn't check its exit status. I ran only those two test files, not the full suite.
The gap. The nightly snapshot at 08:00 UTC is retried by a "catch-up" check that ran only once, 2 minutes after boot. That check gives up in two cases:
- the bucket can't be read at that moment;
- another snapshot is already running.
In either case nothing looked again until the next nightly timer, about 24 hours later. That matches the evidence: the newest snapshot stayed at 2026-11-07T08-00-00Z, and the 11-08 08:00 snapshot never landed. A release or a brief bucket outage (the Backblaze bucket here) around that time would trigger it.
The change. The catch-up in src/snapshot/service.ts now repeats every 30 minutes (SNAPSHOT_CHECK_MS), so a snapshot that is still owed is taken within half an hour of the bucket coming back.
The new test in test/backup-truth.test.ts starts with the store unreadable at the first check. It then makes the store readable and expects the owed snapshot to be taken. It would fail with the old one-shot check.
Not done.
- The keeper's wait-for-snapshot rule from #9675 is unchanged.
- Nothing checks the bucket itself. If Backblaze credentials or the bucket are broken, the snapshot will still fail and still be retried by the existing failure retry. The
/settings/backupspage will show that error.
To confirm after merge: backup should stay out of the degraded list for a day, or hold under 10 minutes. If it stays degraded, the log line snapshot failed or snapshot catch-up: store unreadable will say why.
🤖 Generated with Claude Code
Small, single-purpose fix. The one-shot boot catch-up becomes a 30-minute re-check. stop() sets stopped first, and scheduleCatchUp checks it, so no timer is left behind. The new test fails on the old one-shot code. No security, dependency or UI surface is touched. Next, two things: (1) once the cause is known, tell the owner whether the 36 h gap was this path. Your note says the logs were not checked. (2) Raise the snapshot-owed state on /settings/backups, and in the terminal, so a person sees the gap before the 30-minute retry fires. The gate exit status was also not checked; the forge check will cover it.
This fixes one gap that can leave the night's backup untaken for a whole day. It is not confirmed to be the cause of the 36 h gap, and I didn't check the forge's logs.
tscis clean, and the snapshot and backup-truth tests pass (36). The gate script printed nothing and I didn't check its exit status. I ran only those two test files, not the full suite.The gap. The nightly snapshot at 08:00 UTC is retried by a "catch-up" check that ran only once, 2 minutes after boot. That check gives up in two cases:
In either case nothing looked again until the next nightly timer, about 24 hours later. That matches the evidence: the newest snapshot stayed at 2026-11-07T08-00-00Z, and the 11-08 08:00 snapshot never landed. A release or a brief bucket outage (the Backblaze bucket here) around that time would trigger it.
The change. The catch-up in
src/snapshot/service.tsnow repeats every 30 minutes (SNAPSHOT_CHECK_MS), so a snapshot that is still owed is taken within half an hour of the bucket coming back.The new test in
test/backup-truth.test.tsstarts with the store unreadable at the first check. It then makes the store readable and expects the owed snapshot to be taken. It would fail with the old one-shot check.Not done.
/settings/backupspage will show that error.To confirm after merge:
backupshould stay out of the degraded list for a day, or hold under 10 minutes. If it stays degraded, the log linesnapshot failedorsnapshot catch-up: store unreadablewill say why.🤖 Generated with Claude Code
Closes #10167