# 2026-04-13 - Deduplicação de alertas de metas e orientações de cron

## O que mudou
- Adicionada persistência de histórico de disparos em `wpjy_metas_alert_dispatches`, com script em `sql/2026-04-13-create-metas-alert-dispatches.sql`.
- Estendido `src/Modules/Metas/MetasRepository.php` com leitura e gravação do histórico de dispatch por alerta, meta, usuário e assinatura de estado.
- Refinado `src/Modules/Metas/MetasService.php` para calcular uma assinatura do estado do alerta e respeitar uma janela de repetição (`repeat_window_hours`, padrão de 24h), evitando que o cron envie o mesmo aviso em toda execução.

## Observações
- A assinatura do estado considera `meta_id`, `alert_id`, `user_id`, `policy`, `kpi_status` e bucket de progresso final, permitindo reenvio quando houver mudança relevante de estado.
- A janela pode ser afinada por alerta via `params_json`, usando a chave `repeat_window_hours`.
- Esta etapa complementa a automação anterior: o cron continua rodando metas, mas agora com memória de dispatch para reduzir ruído operacional.

## Validação
- `php -l src/Modules/Metas/MetasRepository.php`
- `php -l src/Modules/Metas/MetasService.php`
