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

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

De todos modos, investigué un poco más :detective:

En realidad no pude encontrar el script de automatización para schedule pm with data-explorer results en la carpeta plugins/automation/lib/discourse_automation/scripts de core, así que debe estar oculto en otro lugar.

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

Creo que el código subyacente para las automatizaciones recurrentes mensuales 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 la RRule, la automatización fuerza una alineación por 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 resulta ser el 3er miércoles de abril), el sistema interpreta la regla como: ejecutar el 3er miércoles de cada mes.

Cuando llega mayo, el 3er miércoles es el 20 de mayo, lo que hace que la programación se desvíe 5 días.

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

Tengo una corrección probada y estoy preparando una PR por si el equipo quiere revisarla. Cambia la lógica de N-ésimo día de la semana a 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 corrección lógica

Crea exactamente 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 buscara el 4º jueves en lugar de una fecha real.

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

Sin parche:

Con corrección:

PR aquí:

Edición: parece que el error afecta a cualquier script de automatización que utilice el disparador recurring configurado para ejecutarse cada mes. :grimacing:

También puedo reproducir el banner vacío a veces; por ejemplo, si configuras la fecha de inicio para el 29 de abril de 2026, entonces no puede encontrar el 5º miércoles de mayo porque no existe: la automatización fallará al activarse aquí (sin corregir a la izquierda, corregido a la derecha):

Parece que el error lanza un NoMethodError en rails cuando no puede encontrar el N-ésimo día de la semana como en el ejemplo anterior; de ahí el banner de próxima activación vacío y la ejecución fallida:

2 Me gusta