R-011 — Gate de notificação de hábito libera as ondas de lembrete

TLDR: HabitExecution.is_notified controla se a push inicial foi enviada; as ondas de lembrete só disparam quando ele é True.

Given / When / Then

Dado uma HabitExecution com is_notified=False Quando HabitNotificationService.send_pending_notifications roda e a execução está dentro da janela de 10 minutos após o scheduled_time Então a push inicial é enviada em lote e is_notified=True / notified_at=now são gravados via bulk_update

Dado uma HabitExecution com is_notified=False Quando ExecutionService.send_pending_reminders roda Então nenhuma onda de lembrete dispara para essa execução

Dado uma HabitExecution com is_notified=True e status='pending' Quando passaram 2 horas desde o scheduled_time (primeira onda) ou desde a onda anterior Então o lembrete correspondente é enviado e o campo first_reminder ou second_reminder recebe o timestamp

Tabela de decisão

is_notified status Onda de lembrete dispara?
False qualquer Não — a push inicial ainda não saiu
True pending Sim, respeitando o intervalo de 2h desde a onda anterior
True completed / not-completed Não — os lembretes param

Restrições

  • O gate substituiu o antigo notification_ids (ArrayField), removido junto com a migração para envio em lote
  • No primeiro lembrete, um reminder_variation aleatório (1–8) é sorteado e persistido; todas as ondas seguintes usam o fluxo sorteado
  • São no máximo 2 ondas de lembrete, de 2 em 2 horas
  • A notificação inicial só considera execuções cujo hábito está ativo e não soft-deletado (habit__deleted_at__isnull=True) e cujo usuário tem enable_notifications=True

Teste vinculado

tests/habits/test_reminder_service.py — ondas disparam após 2h da anterior, nenhuma onda sem is_notified=True, nenhuma onda com status != 'pending', reminder_variation entre 1 e 8 tests/habits/test_notification_service.py — test_no_notification_for_deleted_habit

Referências