Juan Denis and Claude Opus 5
07dbffbedc
fix(doctor): make the two backup Repair buttons actually do something
...
Plan 72 item A.1. The backup_drill_stale and backup_unverified checks both
emitted repairable: True, but DoctorService.repair() only knew drift, service,
dns and extension. Every Repair button those checks rendered came back
"Unknown repair kind: backup_drill" -- a button that failed 100% of the time,
on the check family whose entire job is telling you whether your backups can
be trusted.
The dispatcher now handles both, and they are deliberately asymmetric because
the underlying services are. request_drill enqueues a backup.drill.run job, so
that answer carries the job id for the console to link to. verify_run does the
size and checksum comparison inline and returns a verdict, so there is no job
id -- claiming one would send the console looking for a job that does not
exist. The plan assumed both enqueued; only the drill does.
Verification finding a BAD copy is reported as a failure, not a fix. It is a
worse outcome than "unverified" and calling it a successful repair would be a
lie told by a green checkmark. Both branches turn their services' ordinary
refusals -- a drill already in flight, no successful backup to drill, backup
not found -- into plain error text rather than letting them escape, and a
policy_id echoed back for a since-deleted policy reads as gone instead of
raising.
The second half is the same defect from the other side. verify_run compares
against the REMOTE copy and raises when there is none, so a local-only backup
was rendering a Repair button that could never succeed. That check now only
offers the button when there is something to verify against, and otherwise
says what would actually fix it: send the policy offsite, or run a restore
drill.
Drills started this way are attributed to 'doctor' rather than 'manual', so
the drill history says where they came from -- the field is free-form and only
displayed.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-08-13 17:04:41 -04:00
..
2026-07-07 20:29:31 -04:00
2026-08-13 14:57:51 -04:00
2026-07-09 05:27:22 -04:00
2026-08-12 21:48:21 -04:00
2026-08-12 18:15:53 -04:00
2026-08-06 02:59:14 -04:00
2026-06-12 17:31:26 -04:00
2026-05-31 14:46:47 -04:00
2026-05-31 16:08:13 -04:00
2026-06-12 17:33:29 -04:00
2026-06-01 02:39:05 -04:00
2026-07-25 14:15:29 -04:00
2026-08-05 02:38:41 -04:00
2026-08-06 02:59:14 -04:00
2026-08-04 08:53:27 -04:00
2026-07-21 22:57:33 -04:00
2026-07-01 20:49:41 -04:00
2026-08-12 20:26:04 -04:00
2026-08-05 02:38:41 -04:00
2026-08-09 13:53:59 -04:00
2026-08-05 02:38:41 -04:00
2026-07-02 22:36:34 -04:00
2026-07-07 20:29:25 -04:00
2026-06-19 13:22:43 -04:00
2026-06-24 14:19:32 -04:00
2026-07-07 20:29:25 -04:00
2026-07-09 04:41:00 -04:00
2026-08-05 13:36:33 -04:00
2026-07-09 04:41:00 -04:00
2026-07-07 20:29:25 -04:00
2026-07-09 04:41:00 -04:00
2026-06-24 14:27:08 -04:00
2026-06-24 14:20:43 -04:00
2026-07-09 04:41:00 -04:00
2026-08-05 13:36:33 -04:00
2026-08-05 13:36:33 -04:00
2026-07-07 20:29:25 -04:00
2026-08-06 02:59:14 -04:00
2026-07-25 12:38:56 -04:00
2026-06-23 18:49:04 -04:00
2026-07-25 15:48:36 -04:00
2026-07-03 15:21:22 -04:00
2026-07-11 01:22:49 -04:00
2026-07-04 01:46:34 -04:00
2026-08-06 02:59:14 -04:00
2026-07-02 01:04:03 -04:00
2026-07-09 05:02:54 -04:00
2026-07-02 01:04:03 -04:00
2026-07-21 22:57:33 -04:00
2026-07-25 16:19:33 -04:00
2026-06-24 14:24:13 -04:00
2026-06-23 21:15:16 -04:00
2026-05-05 14:03:31 -04:00
2026-07-01 20:49:41 -04:00
2026-06-19 10:13:50 -04:00
2026-06-19 09:54:40 -04:00
2026-08-12 18:15:53 -04:00
2026-06-23 18:23:47 -04:00
2026-07-09 04:41:00 -04:00
2026-07-07 20:29:24 -04:00
2026-07-27 22:44:40 -04:00
2026-07-25 21:23:14 -04:00
2026-07-26 00:19:46 -04:00
2026-08-12 20:26:04 -04:00
2026-08-06 02:59:14 -04:00
2026-07-03 14:24:03 -04:00
2026-06-15 00:01:41 -04:00
2026-07-03 14:24:02 -04:00
2026-07-22 17:31:18 -04:00
2026-06-19 03:12:07 -04:00
2026-07-23 16:58:46 -04:00
2026-07-03 14:23:50 -04:00
2026-07-25 20:04:39 -04:00
2026-08-04 08:53:27 -04:00
2026-06-24 14:52:04 -04:00
2026-08-13 16:17:23 -04:00
2026-08-13 16:45:38 -04:00
2026-06-22 16:34:17 -04:00
2026-06-22 16:12:31 -04:00
2026-06-22 16:12:31 -04:00
2026-07-08 01:41:22 -04:00
2026-07-09 04:50:16 -04:00
2026-07-08 01:41:22 -04:00
2026-06-30 23:31:57 -04:00
2026-06-22 16:24:53 -04:00
2026-06-23 00:34:55 -04:00
2026-07-03 23:18:08 -04:00
2026-06-22 16:40:35 -04:00
2026-07-25 22:01:15 -04:00
2026-06-24 01:43:29 -04:00
2026-08-13 17:04:41 -04:00
2026-07-07 20:29:24 -04:00
2026-06-19 01:34:02 -04:00
2026-07-04 01:28:16 -04:00
2026-08-12 09:05:56 -04:00
2026-08-06 02:59:14 -04:00
2026-06-23 21:33:53 -04:00
2026-07-09 04:55:53 -04:00
2026-08-06 02:59:14 -04:00
2026-06-24 14:32:41 -04:00
2026-06-24 14:36:08 -04:00
2026-06-23 20:04:04 -04:00
2026-07-08 23:12:48 -04:00
2026-08-06 02:59:14 -04:00
2026-08-06 02:59:14 -04:00
2026-08-06 02:59:14 -04:00
2026-08-05 02:38:41 -04:00
2026-07-03 15:21:34 -04:00
2026-08-02 18:56:33 -04:00
2026-08-13 16:03:25 -04:00
2026-08-06 03:01:24 -04:00
2026-07-09 04:41:00 -04:00
2026-07-08 01:41:13 -04:00
2026-06-23 21:15:16 -04:00
2026-07-08 01:41:13 -04:00
2026-07-09 04:41:00 -04:00
2026-08-06 02:59:14 -04:00
2026-08-03 23:44:56 -04:00
2026-08-11 19:43:46 -04:00
2026-07-07 20:29:24 -04:00
2026-07-10 23:06:09 -04:00
2026-07-07 20:29:31 -04:00
2026-08-06 02:59:14 -04:00
2026-07-22 19:22:43 -04:00
2026-06-19 09:37:30 -04:00
2026-06-23 20:57:40 -04:00
2026-07-25 16:51:44 -04:00
2026-08-12 20:26:04 -04:00
2026-07-22 00:48:13 -04:00
2026-07-18 00:59:19 -04:00
2026-07-03 14:23:50 -04:00
2026-07-03 15:21:23 -04:00
2026-07-01 20:49:41 -04:00
2026-08-06 02:59:14 -04:00
2026-07-09 03:35:53 -04:00
2026-07-09 02:57:23 -04:00
2026-07-09 03:05:08 -04:00
2026-07-10 01:13:14 -04:00
2026-07-04 01:39:53 -04:00
2026-07-09 03:21:14 -04:00
2026-07-09 03:28:08 -04:00
2026-07-04 01:16:29 -04:00
2026-07-04 01:46:34 -04:00
2026-07-09 03:35:53 -04:00
2026-07-04 01:34:54 -04:00
2026-07-10 01:13:14 -04:00
2026-07-04 01:39:53 -04:00
2026-07-09 03:13:54 -04:00
2026-07-08 01:41:43 -04:00
2026-07-03 14:23:11 -04:00
2026-07-03 15:21:50 -04:00
2026-07-25 20:35:19 -04:00
2026-07-02 00:15:10 -04:00
2026-08-05 01:18:32 -04:00
2026-08-13 16:12:19 -04:00
2026-06-15 23:20:00 -04:00
2026-07-07 20:29:31 -04:00
2026-06-21 19:57:02 -04:00
2026-08-13 14:36:24 -04:00
2026-07-07 20:29:29 -04:00
2026-07-08 01:41:43 -04:00
2026-07-09 04:41:00 -04:00
2026-07-14 22:34:24 -04:00
2026-07-09 04:41:00 -04:00
2026-08-05 02:38:41 -04:00
2026-06-12 18:35:43 -04:00
2026-05-31 16:08:32 -04:00
2026-07-02 22:19:14 -04:00
2026-07-08 01:41:43 -04:00
2026-07-25 14:02:08 -04:00
2026-08-05 01:18:32 -04:00
2026-07-25 12:46:59 -04:00
2026-07-25 13:56:09 -04:00
2026-08-05 13:36:20 -04:00
2026-07-25 13:40:00 -04:00
2026-08-06 02:59:14 -04:00
2026-08-13 14:57:51 -04:00
2026-06-23 19:33:44 -04:00
2026-06-23 19:33:44 -04:00
2026-07-14 22:22:18 -04:00
2026-06-23 19:33:44 -04:00
2026-08-12 13:16:58 -04:00
2026-06-20 22:25:06 -04:00
2026-06-20 22:38:38 -04:00
2026-08-04 08:53:27 -04:00
2026-08-12 13:08:49 -04:00
2026-08-05 13:36:20 -04:00
2026-08-06 02:59:14 -04:00
2026-07-07 20:29:29 -04:00
2026-05-03 07:07:57 -04:00
2026-08-05 02:38:41 -04:00
2026-07-22 16:36:58 -04:00
2026-07-22 17:24:36 -04:00
2026-07-22 17:24:36 -04:00
2026-07-11 00:26:40 -04:00
2026-08-04 08:53:27 -04:00
2026-06-21 01:54:51 -04:00
2026-08-02 18:35:25 -04:00
2026-06-19 16:52:40 -04:00
2026-07-08 01:41:43 -04:00
2026-07-31 14:56:37 -04:00
2026-06-23 20:04:04 -04:00
2026-07-07 20:29:24 -04:00
2026-07-01 22:55:11 -04:00
2026-08-06 02:59:14 -04:00
2026-06-25 01:06:44 -04:00
2026-05-05 14:03:31 -04:00
2026-08-12 05:52:37 -04:00
2026-06-23 17:31:28 -04:00
2026-06-24 14:06:05 -04:00
2026-08-13 16:33:47 -04:00
2026-07-07 20:29:23 -04:00
2026-07-07 20:29:23 -04:00
2026-08-05 02:38:41 -04:00
2026-07-09 04:41:00 -04:00
2026-08-04 08:53:27 -04:00
2026-08-06 02:59:14 -04:00
2026-07-01 00:31:22 -04:00
2026-08-06 02:59:14 -04:00
2026-07-03 14:24:29 -04:00
2026-08-05 02:38:41 -04:00
2026-08-05 02:38:41 -04:00
2026-06-30 23:48:28 -04:00
2026-08-12 09:27:05 -04:00
2026-08-06 02:59:14 -04:00
2026-07-08 23:58:45 -04:00
2026-07-09 04:41:00 -04:00
2026-08-13 16:22:33 -04:00
2026-08-13 15:59:47 -04:00
2026-06-24 14:40:08 -04:00
2026-08-06 02:59:14 -04:00
2026-08-06 02:59:14 -04:00
2026-07-09 04:41:00 -04:00
2026-07-09 04:41:00 -04:00
2026-07-07 20:29:24 -04:00
2026-06-22 01:45:15 -04:00
2026-07-25 20:09:05 -04:00
2026-07-21 23:26:13 -04:00
2026-06-23 18:23:47 -04:00
2026-08-06 09:32:40 -04:00
2026-07-10 02:38:46 -04:00
2026-08-06 00:33:46 -04:00
2026-07-23 09:25:01 -04:00
2026-07-23 09:25:01 -04:00
2026-07-20 01:16:16 -04:00
2026-08-06 02:59:14 -04:00
2026-08-05 02:38:41 -04:00
2026-02-10 16:03:19 -05:00
2026-07-25 05:41:00 -04:00
2026-08-09 02:32:55 -04:00
2026-06-19 14:02:24 -04:00
2026-08-05 02:38:41 -04:00
2026-07-09 04:41:00 -04:00
2026-08-12 21:48:21 -04:00
2026-07-03 15:21:23 -04:00