On restart the scheduler was counting interval_hours from now, ignoring when the last cycle actually ran. It now reads last_run_at (in-memory or DB) and deducts elapsed time so a restart doesn't silently push the next fire by a full interval. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>