Duplicate or skipped scheduled runs in CI
Scheduled events are delivered best-effort, not exactly-once. Under load a slot can occasionally be delivered twice or missed entirely. Build jobs to be idempotent and guard against overlap instead of assuming every slot runs exactly once.
What this error means
The Actions history shows two runs for the same cron slot moments apart, or a slot with no run at all, even though the cron and default branch are correct.
# History for cron '0 3 * * *'
03:00 nightly (run 1)
03:00 nightly (run 2) <- duplicate delivery
# next day: no 03:00 run at all <- skipped slotCommon causes
At-least-once delivery under load
The scheduler favors delivering an event over dropping it, so retries can produce a rare duplicate; heavy load can also drop a slot.
Jobs that assume exactly-once
A non-idempotent deploy or report doubles up or leaves a gap when the slot is duplicated or skipped.
How to fix it
Add a concurrency group to collapse overlaps
- Group scheduled runs so a duplicate cancels or waits.
- Make the job idempotent so a re-run is safe.
- Alert on missed slots rather than assuming exactly-once.
concurrency:
group: nightly-${{ github.workflow }}
cancel-in-progress: trueMake the work idempotent
Key the job on the date or a run marker so a duplicate delivery is a no-op and a missed slot can be backfilled on the next run.
How to prevent it
- Design scheduled jobs to be idempotent.
- Use concurrency to prevent overlapping duplicate runs.
- Monitor for missed slots and backfill deterministically.