R-011 — Gate de notificação de hábito libera as ondas de lembrete
TLDR:
HabitExecution.is_notifiedcontrola 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_variationaleató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 temenable_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