ec58e08a35
Inspired by Claude Cowork (desktop changelog v1.46388.1, 2026-09-04), which added "automatic re-runs (after 5, 15, and 30 minutes) for a scheduled task that could not reach the model at all, for example right after the computer wakes behind a VPN." A recurring cron job whose run fails with a transient network/DNS error before ANY model call previously sat out a full period (a daily job fired into a reconnecting VPN silently skipped a day). Now the scheduler pulls next_run_at earlier along a bounded 5/15/30-minute ladder, suppresses the interim failure notice while a re-run is pending, and resets the ladder on any run that reaches the model. Deliberately narrower than a generic retry (cf. PR #16512): zero API calls + transient classification means nothing executed and nothing was spent, so a re-run cannot duplicate side effects. One-shots are excluded (at-most-times dispatch accounting, #38758); retries never fire past the schedule's own next occurrence; `cron.retry_unreachable: false` disables. - cron/unreachable_retry.py: ladder, classification, plan/clear/will_retry - cron/scheduler.py: flag unreachable failures in run_job; suppress interim notice; thread model_unreachable through the fenced bookkeeping write - cron/jobs.py: mark_job_run schedules/clears the ladder under the jobs lock - docs: website/docs/user-guide/features/cron.md