# Agent Loops: The Complete Guide

**June 15, 2026**

Every agent is a loop. The difference between a demo agent and a production agent is how well you control that loop.

---

## The Three Loop Types

### Type 1: Think → Act → Observe (Basic)

```
1. LLM decides what to do next (thinks)
2. Tool executes the decision (acts)
3. Result feeds back to LLM (observes)
4. Repeat until done
```

This is the simplest loop. Every lab in this course starts here. It works for single-step tasks where the agent calls one tool and returns an answer.

**Problem**: No bounded iteration. Without `MAX_ITERATIONS`, the agent loops forever on ambiguous tasks.

### Type 2: Plan → Execute → Verify (Guarded)

```
1. Agent plans the approach (tool selection + sequence)
2. Agent executes each step
3. Verifier agent checks each result
4. On failure: re-plan with new context
5. On success: proceed or terminate
```

The verifier is a second, simpler agent (or the same agent with a verification prompt) that checks output quality before the loop continues. This prevents the agent from confidently proceeding with wrong results.

### Type 3: Cascade (Multi-Model)

```
Step 1: Haiku (cheap) — bulk processing
  → Step 2: Sonnet (mid) — analysis
    → Step 3: Opus (premium) — synthesis, quality check
```

Each step uses a different model tier. Early steps are cheap and fast. Later steps are expensive but thorough. The cascade loop saves 60-80% on token costs compared to running everything through Opus.

---

## Termination Conditions

Every loop needs at least one termination condition. Production loops need three:

### 1. Content-Based Termination

The agent decides it's done:

```python
if response.stop_reason == "end_turn":
    return response.text  # Normal completion
elif response.stop_reason == "tool_use":
    continue_loop()  # Agent wants another turn
```

### 2. Hard Limit Termination

The loop has a maximum iteration count:

```python
MAX_ITERATIONS = 10
for i in range(MAX_ITERATIONS):
    result = agent_step()
    if result.is_done:
        return result
return {"error": "Max iterations exceeded", "partial_result": result}
```

This is non-negotiable in production. Every lab includes it. Without it, a single bad prompt can cost you $50+ in runaway token usage.

### 3. Cost Budget Termination

The loop tracks cumulative cost and stops when the budget is spent:

```python
BUDGET_CENTS = 50
total_cost = 0

for i in range(MAX_ITERATIONS):
    result = agent_step()
    total_cost += result.cost_cents
    if total_cost > BUDGET_CENTS:
        return {"error": "Budget exceeded", "total_cost": total_cost}
    if result.is_done:
        return result
```

---

## Loop Anti-Patterns

### Grinding

The agent runs the same code repeatedly hoping for a different result:

```python
# BAD: no change between iterations
for i in range(100):
    score = evaluate(agent_config)
    if score > best_score:
        best_score = score  # same config, different random seed
```

**Fix**: Hash the agent configuration. If it hasn't changed, don't re-run.

### Hallucination Cascade

Each loop iteration builds on potentially wrong information from the previous step. By iteration 5, the agent's context is full of hallucinated facts, and it makes reasonable-looking decisions based on nonsense.

**Fix**: A verifier step after every tool call checks factual claims before they enter the context window.

### Infinite Loop by Design

Some tasks naturally loop (monitoring, polling). Without careful budgeting, these can run forever:

```python
# BAD: no cost tracking on long-running loops
while True:
    data = check_api()
    if data.alerts:
        send_notification(data.alerts)
    time.sleep(60)
```

**Fix**: Daily cost budget + max iterations even in "infinite" loops.

---

## The 5 Rules of Production Loops

1. **Always set MAX_ITERATIONS** — even in loops you expect to terminate naturally
2. **Always track cost per iteration** — you can't optimize what you don't measure
3. **Always verify intermediate results** — don't let bad context compound
4. **Always have a fallback** — what happens when max iterations is reached? Return partial results, don't crash
5. **Always log the loop** — every iteration should be recorded for debugging

---

*This is adapted from Module 1: Foundations of the [Agentic Engineering the Hard Way](/free-preview) course. Full course includes 65 lessons, 13 labs, and 20 skill kits.*
