Automação recorrente acionada mensalmente não está funcionando conforme o esperado

Ok, então Moin e eu estávamos conversando sobre esse caso hoje, e ela mencionou que talvez houvesse um bug ao usar “mensal”, já que o comprimento de um mês varia? Claro que ela estava certa — até certo ponto… :stuck_out_tongue:

De qualquer forma, fiz uma pequena investigação extra :detective:

Na verdade, não consegui encontrar o script de automação para schedule pm with data-explorer results na pasta plugins/automation/lib/discourse_automation/scripts do núcleo, então ele deve estar escondido em outro lugar.

Mas estava analisando a lógica aqui para recorrências (presumivelmente esse script a utiliza) em plugins/automation/lib/discourse_automation/triggers/recurring.rb:

Acredito que o código subjacente para automações recorrentes mensais está calculando o Nº dia da semana em vez da data real do calendário, e há uma incompatibilidade lógica com Calendar day — ao injetar BYDAY=#{count}#{byday} no RRule, a automação força um alinhamento por dia da semana, quando deveria usar BYMONTHDAY em vez de BYDAY.

Então, se você configurar uma automação para começar em 15 de abril (que, por acaso, é a 3ª quarta-feira de abril), o sistema interpreta a regra como: executar na 3ª quarta-feira de todo mês.

Quando chega maio, a 3ª quarta-feira é 20 de maio, o que faz o agendamento desviar em 5 dias.

Além disso, se você configurar uma automação no dia 30 ou 31 de um mês (por exemplo, a “5ª terça-feira”), o sistema procurará a 5ª terça-feira no mês seguinte. Se esse mês tiver apenas 4 terças-feiras, a automação não conseguirá encontrar uma data válida e pulará silenciosamente o mês inteiro.

Tenho uma correção testada e estou abrindo um PR caso a equipe queira dar uma olhada. Ele altera a lógica de Nº dia da semana para a Data exata do calendário.


Aqui estão algumas capturas de tela dos meus testes e depurações:

2 instâncias, uma sem a correção e outra com a minha lógica de correção

Crie a mesma automação exata em ambas (a versão corrigida está à direita):

Veja as diferenças nas faixas que dizem “Próxima automação será acionada em:” com um desvio de 5 dias — a versão sem correção está desviando para a terça-feira (20 de maio), em vez de 15 de maio.

Por exemplo, meses poderiam ser completamente pulados se estivesse procurando pela 4ª quinta-feira em vez de uma data real.

Também é possível testar o mesmo resultado no console do Rails

Sem correção:

Com correção:

PR aqui:

2 curtidas