How to Prevent AI Agent Cron Jobs from Silently Looping Forever
Source: Dev.to
TL;DR
When an AI agent runs a recurring cron task without explicit exit conditions, it can loop indefinitely, wasting tokens and API calls.
Fixes include: defining clear completion criteria, setting iteration caps, adding idempotency checks, and using OS‑level timeouts.
Problem
An autonomous AI agent (OpenClaw) runs a heartbeat task that checks business metrics:
- Revenue Watch
- Check MRR via RevenueCat API
- Alert on Slack if anomalies detected
During a single heartbeat session the agent called the RevenueCat API 30+ times, each returning the same result (MRR $28, 5 subscribers). The agent kept looping: report → “next step: check Revenue Watch” → repeat.
Root Cause
- Missing completion criteria – “Check X” without “stop after checking”
- No state persistence – the agent doesn’t remember it already checked seconds ago
- Implicit continuation – most frameworks keep running until the task list is empty
Humans assume “check once and move on”; agents follow instructions literally.
Solution
Add an explicit exit condition
## Revenue Watch
- Check MRR via RevenueCat API
- **Exit:** After one successful API response, log the result and stop
- Only alert Slack if values changed from last check
Limit loop iterations
## Revenue Watch
max_iterations: 1
# Fetch MRR → log → done
Framework‑level safety net (LangChain example)
# LangChain example
agent = AgentExecutor(
agent=agent,
tools=tools,
max_iterations=5,
early_stopping_method="force"
)
Even if the task’s completion criteria are buggy, the agent stops after max_iterations.
Implement idempotency (caching)
## Revenue Watch
- Previous result: {cached_result}
- If current == previous: report "no change" and exit immediately
- If changed: report delta and update cache
This prevents redundant API calls and makes the task naturally convergent.
OS‑level timeout (last line of defense)
# Force‑kill after 60 seconds
timeout 60 openclaw heartbeat run
If everything else fails, the operating system terminates the process.
Metrics (Before vs. After)
| Metric | Before | After |
|---|---|---|
| API calls per execution | 30+ | 1 |
| Token consumption | 10× normal | 1× normal |
| Execution time | Minutes (looping) | < 30 seconds |
| Accuracy | Repeated same data | Reports only on changes |
Lessons Learned
- Always define when a task ends. Agents don’t infer “once is enough.”
max_iterationsis non‑negotiable. It provides a safety net for buggy exit conditions.- Idempotency eliminates waste. Skip re‑execution when input hasn’t changed.
- OS‑level timeout is the last resort. It catches any remaining runaway loops.
Takeaway
When designing cron jobs for AI agents, ask “when should it stop?” rather than just “what should it do?” Without a clear stop condition, the agent will keep calling the same API forever.