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

Merged opened this

Check · Review · Land · Live done — Landed and live in production.

Merged

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

opened this

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/backups page 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

Closes #10167

commented

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/backups page 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

Approved

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.

Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs