Ежемесячная автоматизация с триггером не работает как ожидалось

Окей, так сегодня я и Мойн обсуждали этот случай, и она упомянула, что, возможно, есть баг при использовании параметра «ежемесячно», поскольку длина месяца варьируется? Конечно, она была права — отчасти… :stuck_out_tongue:

В любом случае, я немного покопался :detective:

Мне не удалось найти скрипт автоматизации для schedule pm with data-explorer results в основной папке plugins/automation/lib/discourse_automation/scripts, значит, он где-то спрятан.

Однако я посмотрел на логику здесь для повторяющихся событий (предположительно, этот скрипт использует её) в файле plugins/automation/lib/discourse_automation/triggers/recurring.rb:

Я думаю, что базовый код для ежемесячных повторяющихся автоматизаций вычисляет N-й день недели вместо фактической календарной даты, и здесь возникает несоответствие логики с параметром Calendar day — при внедрении BYDAY=#{count}#{byday} в RRule автоматизация принудительно привязывается к дню недели, тогда как следовало бы использовать BYMONTHDAY вместо BYDAY.

Так, если вы настроите автоматизацию на запуск 15 апреля (который, кстати, является 3-й средой апреля), система интерпретирует правило как: запускать в 3-ю среду каждого месяца.

Когда наступает май, 3-я среда — это 20 мая, из-за чего расписание сдвигается на 5 дней.

Более того, если вы установите автоматизацию на 30-е или 31-е число месяца (например, «5-я вторник»), система будет искать 5-й вторник в следующем месяце. Если в этом месяце всего 4 вторника, автоматизация полностью не сможет найти валидную дату и тихо пропустит весь месяц.

У меня есть протестированное исправление, и я готовлю PR, если команда захочет его проверить. Оно меняет логику с N-го дня недели на точную календарную дату.


Вот несколько скриншотов моих тестов и отладки:

Два экземпляра: один без исправления, другой с моим исправлением логики.

Создайте идентичную автоматизацию в обоих (исправленная версия справа):

Обратите внимание на различия в баннерах с сообщением «Следующая автоматизация сработает в:» — сдвиг составляет 5 дней: неотредактированная версия смещается к третьей среде (20 мая), вместо 15 мая.

Например, месяцы могут полностью пропускаться, если система ищет 4-й четверг вместо конкретной даты.

Тот же результат можно проверить в консоли Rails.

Без исправления:

С исправлением:

PR здесь:

Редактирование: похоже, что баг затрагивает любой скрипт автоматизации, использующий триггер recurring, настроенный на запуск каждый месяц. :grimacing:

Я также могу воспроизвести иногда пустой баннер, например, если установить дату начала на 29 апреля 2026 года, то система не сможет найти 5-ю среду в мае, так как её не существует — автоматизация не сработает здесь (неисправленная версия слева, исправленная справа):

Похоже, что баг вызывает NoMethodError в Rails, когда не удаётся найти N-й день недели, как в примере выше; отсюда пустой баннер следующего запуска и сбой выполнения:

2 лайка