# Scheduler e Execucao de Jobs

## Decisao

Optamos por utilizar uma fila persistida em banco (`automation_jobs`) combinada com um runner CLI acionado via cron do sistema operacional. Essa abordagem evita processamentos concorrentes simultaneos, permite reprocessar falhas e escala melhor do que um cron interno rodando dentro
 da aplicacao web.

- **Fila persistente**: garante que jobs agendados nao se percam em caso de reinicio do servidor.
- **Runner CLI**: executa fora do ciclo de requisicoes HTTP, liberando recursos da aplicacao e permitindo controlar paralelismo.
- **Escalabilidade**: podemos subir multiplos workers e monitorar estados de jobs via tabela.

## Componentes

- `automation_jobs` e `automation_job_logs`: armazenam jobs e historico.
- `automation.php`: utilitario CLI para agendar e processar jobs.
- `JobProcessor`: processa tipos de job suportados (`indicator.snapshot.daily`, `goal.assignment.generate`, `micro-task.set.finalize`).
- `Scheduler`: agenda jobs diarios com base nas atribuicoes ativas.

## Fluxo diario sugerido

1. *Agendamento diário às 01:00 (seg-sex)*  
   - `php automation.php daily:tasks:generate`
2. *Refresh a cada 30 minutos entre 09:00–18:00 (seg-sex)*  
   - `php automation.php daily:tasks:refresh`
3. *Processamento geral (cron a cada 5 minutos)*  
   - `php automation.php run`

Ambos comandos podem ser executados em paralelo em servidores diferentes se necessario.

## Extensibilidade

Novos tipos de job podem ser adicionados estendendo `JobProcessor::executeJob`. Para jobs com requisitos de idempotencia, utilize `AutomationJob::findScheduled` para evitar duplicacao antes de enfileirar.
