---
title: Make the league rules-deadline jobs fire exactly once and on schedule
type: task
status: planned
description: >-
  Move two notification scripts onto claim_league_notification, add an extension-deadline warning
  before the 2027 cycle, and schedule or retire three rules-critical scripts that no crontab runs.
base_uri: user:task/league/make-league-rules-jobs-fire-once-and-on-schedule.md
created_at: '2026-09-30T05:59:32.226Z'
entity_id: 0b56c457-c9c7-4f49-93a8-f6d0a4c0518a
owner_identity_uri: █████████████████████████
priority: Medium
public_read: true
tags:
  - user:tag/league-xo-football.md
updated_at: '2026-09-30T05:59:32.226Z'
visibility_analyzed_at: '2026-11-05T23:49:41.067Z'
---

# Make the league rules-deadline jobs fire exactly once and on schedule

League-rules jobs have failed in three ways: an unscheduled script silently never ran (protected designations, 2026-07-31), a check-then-send notification pattern can double-send, and a moving extension deadline lapsed with no warning (189 transactions rolled back by hand). This task closes those classes.

## Plan

- [ ] Move `scripts/process-extensions.mjs` and `scripts/announce-free-agency-period-start.mjs` onto `claim_league_notification`, deciding per script whether the claim gates the work, the send, or both — [[████████████████████████-██-████████████████-██████-████████████-████████]]
- [ ] Add a pre-deadline warning ahead of `ext_date` on the existing `*/5` process-extensions cron, before the 2027 extension cycle — [[████████████████████████-██-████████████-████-███████████-██████████]]
- [ ] Schedule or retire `notifications-poach-8hr.mjs`, `calculate-franchise-tag.mjs` and `check-restricted-free-agency-salary-cap-violations.mjs` (all still in no crontab on 2026-09-30), and weigh a durable detector — [[████████████████████████-██-██████████████-██████-███████████-███████]]

## Notes

Crontab ships separately from `yarn deploy` (`server/deploy-crontab.sh`). Related but separately owned: [[█████████████████████-█████-█████-████████████-████████████]] and [[user:task/league/data-views/detect-importer-never-scheduled.md]].
