RecurringTicketModel::toggleActive() flips is_active without touching next_run_at. If a schedule is disabled while next_run_at is still in the future, then re-enabled after that date has passed, the next cron tick sees next_run_at <= NOW() and fires immediately — a single fire, not a catch-up flood (confirmed not to loop), but likely surprising to an admin who just re-enabled a "daily" schedule expecting it to wait until the next natural occurrence rather than create a ticket right away.
Fix: When re-enabling a schedule, recompute next_run_at from the current time (as if the schedule were being freshly created) rather than leaving a stale past timestamp that immediately qualifies as due.
**Severity:** Low
`RecurringTicketModel::toggleActive()` flips `is_active` without touching `next_run_at`. If a schedule is disabled while `next_run_at` is still in the future, then re-enabled after that date has passed, the next cron tick sees `next_run_at <= NOW()` and fires immediately — a single fire, not a catch-up flood (confirmed not to loop), but likely surprising to an admin who just re-enabled a "daily" schedule expecting it to wait until the next natural occurrence rather than create a ticket right away.
**Fix:** When re-enabling a schedule, recompute `next_run_at` from the current time (as if the schedule were being freshly created) rather than leaving a stale past timestamp that immediately qualifies as due.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Severity: Low
RecurringTicketModel::toggleActive()flipsis_activewithout touchingnext_run_at. If a schedule is disabled whilenext_run_atis still in the future, then re-enabled after that date has passed, the next cron tick seesnext_run_at <= NOW()and fires immediately — a single fire, not a catch-up flood (confirmed not to loop), but likely surprising to an admin who just re-enabled a "daily" schedule expecting it to wait until the next natural occurrence rather than create a ticket right away.Fix: When re-enabling a schedule, recompute
next_run_atfrom the current time (as if the schedule were being freshly created) rather than leaving a stale past timestamp that immediately qualifies as due.