mirror of
https://github.com/openclaw/openclaw.git
synced 2026-03-15 20:10:42 +00:00
* fix(cron): wrap computeJobNextRunAtMs in try-catch inside applyJobResult Without this guard, if the croner library throws during schedule computation (timezone/expression edge cases), the exception propagates out of applyJobResult and the entire state update is lost — runningAtMs never clears, lastRunAtMs never advances, nextRunAtMs never recomputes. After STUCK_RUN_MS (2h), stuck detection clears runningAtMs and the job re-fires, creating a ~2h repeat cycle instead of the intended schedule. The sibling function recomputeJobNextRunAtMs in jobs.ts already wraps computeJobNextRunAtMs in try-catch; this was an oversight in the applyJobResult call sites. Changes: - Error-backoff path: catch and fall back to backoff-only schedule - Success path: catch and fall through to the MIN_REFIRE_GAP_MS safety net - applyOutcomeToStoredJob: log a warning when job not found after forceReload * fix(cron): use recordScheduleComputeError in applyJobResult catch blocks Address review feedback: the original catch blocks only logged a warning, which meant a persistent computeJobNextRunAtMs throw would cause a MIN_REFIRE_GAP_MS (2s) hot loop on cron-kind jobs. Now both catch blocks call recordScheduleComputeError (exported from jobs.ts), which tracks consecutive schedule errors and auto-disables the job after 3 failures — matching the existing behavior in recomputeJobNextRunAtMs. * test(cron): cover applyJobResult schedule-throw fallback paths --------- Co-authored-by: Tak Hoffman <781889+Takhoffman@users.noreply.github.com>