Agents vs workflows: choose the least agency that solves the problem
Fully autonomous agents are seductive in demos and brittle in production. Here's a decision framework — chain, state machine, or true agent — and how to pick the least autonomy that gets the job done.
There's a principle that would prevent most agent failures if teams adopted it: use the least agency that solves the problem. The industry keeps reaching for a fully autonomous agent when a state machine would be more reliable, cheaper, and shippable this week. (For the conceptual workflow-vs-agent distinction, see that earlier post; this one is the decision framework.)
Why fully autonomous agents fail in production
Every degree of autonomy you hand the model multiplies the failure surface. That's not a knock on agents — it's the trade you're making, and it should be deliberate.
- Compounding errors — each step builds on the last, so a small early mistake snowballs into a confidently wrong result.
- Non-determinism — the same input can take different paths on different runs, which makes evals and support genuinely hard.
- Cost and latency variance — a bad plan can 10× your bill and your p95 with no warning.
- Blast radius — an autonomous agent with real tools can take real, hard-to-reverse actions.
The agency ladder
Think of it as a ladder, and climb only as high as the problem forces you to:
- Single prompt — one call. If it reliably works, stop here; you've spent no complexity.
- Chain — a fixed sequence of calls with gates between them (see the prompt-chaining post). Known steps, known order.
- State machine (FSM) — explicit states and transitions; the model classifies intent and fills slots, your code owns the flow. This is the workhorse for real customer-facing products.
- True agent — the model decides its own steps and tools in a loop. Only when the path genuinely can't be scripted in advance.
The decision framework
- Can you write the steps down? → a chain or an FSM, not an agent.
- Is there a bounded set of states with clear transitions? → an FSM; let the model handle language inside states, not control flow.
- Is the path truly unknowable until runtime, and worth the operational cost? → an agent, with a capped loop, scoped tools, and full tracing.
Real examples: support triage is an FSM. 'Answer from our docs' is a chain over RAG. Multi-file code changes or open-ended research across an unknown number of sources is where an agent earns its keep. Most production value sits on the lower rungs.
Autonomy is a cost you pay, not a feature you flaunt. Reach for the least autonomous system that solves the problem in front of you.