Bug: applyJobResult in src/cron/service/timer.ts calls computeJobNextRunAtMs() without try-catch. If the croner library throws (timezone/expression edge cases), 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. This creates a ~2h repeat cycle instead of the intended schedule.
Fix branch: wonderchook/openclaw:fix/cron-applyJobResult-schedule-catch (commit bcc5ce6)
Bramble is running the patched code (upstream main + fix). Ravel is running unpatched code.