Привет! Сегодня мы с Мойн обсуждали этот случай, и она предположила, что, возможно, есть ошибка при использовании параметра «ежемесячно», так как длительность месяца варьируется? Конечно, она была права — отчасти… ![]()
В любом случае, я провёл небольшое расследование ![]()
Мне не удалось найти скрипт автоматизации для 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 апреля (который, кстати, является третьей средой апреля), система интерпретирует правило как: запускать в третью среду каждого месяца.
Когда наступает май, третья среда выпадает на 20 мая, из-за чего расписание смещается на 5 дней.
Более того, если вы установите автоматизацию на 30-е или 31-е число месяца (например, «пятый вторник»), система будет искать пятый вторник в следующем месяце. Если в этом месяце всего 4 вторника, автоматизация полностью не найдёт подходящую дату и тихо пропустит весь месяц.
У меня есть протестированное исправление, и я создаю PR, если команда захочет его проверить. Оно меняет логику с N-го дня недели на точную календарную дату.
Вот несколько скриншотов из моих тестов и отладки:
Два экземпляра: один без исправления, другой с моей логической правкой.
Создайте одну и ту же автоматизацию в обоих случаях (исправленная версия справа):
Обратите внимание на различия в баннерах с сообщением «Следующая автоматизация сработает в:» — наблюдается смещение на 5 дней: неотредактированная версия смещается к третьей среде (20 мая) вместо 15 мая.
Например, месяцы могут полностью пропускаться, если система ищет четвёртый четверг вместо фактической даты.
Тот же результат можно проверить в консоли Rails.
Без исправления:
С исправлением:
PR здесь:



