90f958bdc6
The APScheduler cron job fires daily at every entry in `periodic_times`, and nothing in the dispatch path consulted `periodic_interval_days` or `periodic_start_date` — so a configured 3-day interval still produced a daily summary. Gate the dispatch in `dispatch_scheduled_for_tracker` for kind=periodic via `(today_in_app_tz - start_date).days % interval == 0`. Log a skip with reason `interval_not_due` on non-firing days so operators can tell suppressed-by-interval apart from other skip causes.