## customer_notifications (Tester4): email present?, enabled_events, cooldown, updated_at
 email_set=True cooldown=6 updated=2026-10-18 18:18:34
 enabled_events=["node_down","backup_failed","disk_critical","host_disk_critical","storage_fill_critical","offbox_repo_orphaned","app_update_undone","app_update_held","app_stopped_unhealthy"]
## notification_log Tester4 2026-10-20 (event_type, channel, status, error) counts
  ('app_deploy_failed', 'operator', 'sent', '', 1, '2026-10-20 20:03:28', '2026-10-20 20:03:28')
  ('app_oom', 'customer', 'skipped', 'operator_only', 1, '2026-10-20 13:34:00', '2026-10-20 13:34:00')
  ('app_oom', 'operator', 'sent', '', 1, '2026-10-20 13:34:00', '2026-10-20 13:34:00')
  ('app_start_failed', 'operator', 'sent', '', 1, '2026-10-20 17:19:56', '2026-10-20 17:19:56')
  ('backup_failed', 'customer', 'sent', '', 1, '2026-10-20 17:01:49', '2026-10-20 17:01:49')
  ('backup_failed', 'operator', 'sent', '', 2, '2026-10-20 17:01:49', '2026-10-20 19:56:42')
  ('backup_failed', 'operator', 'suppressed', 'operator cooldown 1h0m0s, key=Tester4:backup_failed', 2, '2026-10-20 17:31:10', '2026-10-20 17:36:11')
  ('backup_run_failures', 'customer', 'skipped', 'operator_only', 1, '2026-10-20 18:40:36', '2026-10-20 18:40:36')
  ('backup_run_failures', 'operator', 'sent', '', 1, '2026-10-20 18:40:36', '2026-10-20 18:40:36')
  ('backup_tier_skipped', 'customer', 'skipped', 'operator_only', 1, '2026-10-20 12:09:27', '2026-10-20 12:09:27')
  ('backup_tier_skipped', 'operator', 'suppressed', 'first hour of a new box (R-723)', 1, '2026-10-20 12:09:27', '2026-10-20 12:09:27')
  ('claim_reenroll', 'customer', 'sent', '', 1, '2026-10-20 12:02:25', '2026-10-20 12:02:25')
  ('disk_warning', 'operator', 'sent', '', 1, '2026-10-20 18:36:13', '2026-10-20 18:36:13')
  ('host_crash_guard_tripped', 'customer', 'skipped', 'operator_only', 1, '2026-10-20 17:49:30', '2026-10-20 17:49:30')
  ('host_crash_guard_tripped', 'operator', 'sent', '', 1, '2026-10-20 17:49:30', '2026-10-20 17:49:30')
  ('host_crash_restart', 'customer', 'skipped', 'operator_only', 5, '2026-10-20 14:26:53', '2026-10-20 20:16:50')
  ('host_crash_restart', 'operator', 'sent', '', 4, '2026-10-20 14:26:53', '2026-10-20 20:16:50')
  ('host_crash_restart', 'operator', 'suppressed', 'operator cooldown 1h0m0s, key=Tester4:host_crash_restart', 1, '2026-10-20 17:49:30', '2026-10-20 17:49:30')
  ('host_recovered', 'operator', 'sent', '', 2, '2026-10-20 13:34:19', '2026-10-20 19:50:20')
  ('host_stale', 'operator', 'sent', '', 2, '2026-10-20 13:33:20', '2026-10-20 19:20:20')
  ('node_recovered', 'operator', 'sent', '', 2, '2026-10-20 16:03:20', '2026-10-20 19:51:19')
  ('node_stale', 'operator', 'sent', '', 2, '2026-10-20 15:59:20', '2026-10-20 19:22:20')
  ('oob_degraded', 'operator', 'sent', '', 1, '2026-10-20 12:03:20', '2026-10-20 12:03:20')
  ('recovery_unit_capture_failed', 'operator', 'recorded', 'record-only: the per-run digest (backup_run_failures) carries the notification', 3, '2026-10-20 18:40:08', '2026-10-20 18:40:08')
  ('restore_interrupted', 'operator', 'sent', '', 1, '2026-10-20 17:31:10', '2026-10-20 17:31:10')
  ('restore_interrupted', 'operator', 'suppressed', 'operator cooldown 1h0m0s, key=Tester4:restore_interrupted', 1, '2026-10-20 17:36:11', '2026-10-20 17:36:11')
  ('storage_disconnected', 'operator', 'sent', '', 2, '2026-10-20 17:57:08', '2026-10-20 18:04:07')
  ('storage_reconnected', 'operator', 'sent', '', 2, '2026-10-20 18:00:27', '2026-10-20 18:06:00')
