La automatización recurrente mensual activada no se está ejecutando como se esperaba

Ok, así que Moin y yo estuvimos charlando sobre este caso hoy, y ella mencionó que quizás haya un error al usar la frecuencia mensual, ya que la duración de un mes varía. Por supuesto, tenía razón… en cierto modo :stuck_out_tongue:

De todos modos, hice un poco más de investigación :detective:

No pude encontrar el script de automatización para schedule pm with data-explorer results en la carpeta plugins/automation/lib/discourse_automation/scripts del núcleo, así que debe estar escondido en otro lugar.

Pero estuve revisando la lógica aquí para las ejecuciones recurrentes (presumiblemente ese script la utiliza) en plugins/automation/lib/discourse_automation/triggers/recurring.rb:

Creo que el código subyacente para las automatizaciones mensuales recurrentes está calculando el N-ésimo día de la semana en lugar de la fecha real del calendario, y hay una discrepancia lógica con Calendar day. Al inyectar BYDAY=#{count}#{byday} en el RRule, la automatización fuerza una alineación basada en el día de la semana, cuando debería usar BYMONTHDAY en lugar de BYDAY.

Así que si configuras una automatización para que comience el 15 de abril (que casualmente es el tercer miércoles de abril), el sistema interpreta la regla como: ejecutar el tercer miércoles de cada mes.

Cuando llega mayo, el tercer miércoles es el 20 de mayo, lo que hace que el programa se desvíe 5 días.

Además, si configuras una automatización el 30 o 31 de un mes (por ejemplo, el “quinto martes”), el sistema buscaría el quinto martes del mes siguiente. Si ese mes solo tiene cuatro martes, la automatización no encontrará una fecha válida y saltará silenciosamente todo el mes.

Tengo una corrección probada y estoy preparando un PR por si el equipo quiere revisarla. Cambia la lógica de N-ésimo día de la semana a la fecha exacta del calendario.


Aquí hay algunas capturas de pantalla de mis pruebas y depuración:

Dos instancias, una sin la corrección y la otra con mi solución lógica

Crea la misma automatización en ambas (la versión corregida está a la derecha):

Observa las diferencias en los banners que dicen “La próxima automatización se activará en:” con un desvío de 5 días: la versión sin parche se desvía hacia el tercer miércoles (20 de mayo), en lugar del 15 de mayo.

Por ejemplo, los meses podrían omitirse por completo si se buscaba el cuarto jueves en lugar de una fecha real.

También puedes probar el mismo resultado en la consola de Rails:

Sin parche:

Con la corrección:

PR aquí:

2 Me gusta