Every week someone shows off an agent demo that books flights, writes code, and orders pizza. Very few of those reach production. Having shipped agents into real business workflows, here's what actually separates working agents from impressive prototypes.
Scope the agent like an employee, not a genie
An agent with a vague mandate ("handle customer support") fails the same way a new hire with no job description fails. The agents that survive production have a narrow, measurable job: "classify incoming queries, draft replies for human approval, escalate anything involving refunds."
Start with the smallest unit of work that creates value. Expand only after it's boring and reliable.
Tools are the product
The model is rented; your tools are what you own. A well-designed tool:
- Does one thing and names it honestly (
create_invoice, notdo_billing_stuff) - Validates inputs and returns errors the model can act on ("customer_id not found — ask the user to confirm the email")
- Is idempotent wherever possible, because the model will retry
Most "the agent is dumb" complaints trace back to tools with confusing contracts, not model limitations.
Guardrails beat prompts
Don't ask the model nicely to never issue refunds over ₹10,000 — make the tool reject it. Anything that matters belongs in code:
if (amount > REFUND_LIMIT && !humanApproved) { return { error: "Requires human approval", escalate: true }; }
Prompts set behavior; code sets boundaries.
Log everything, review weekly
An agent in production is a junior teammate. Read its transcripts. The failure patterns you find — a tool it misuses, a question it can't answer — become next sprint's fixes. Teams that skip this plateau at "mostly works," which in business terms means "doesn't work."
The boring conclusion: agents succeed for the same reason software succeeds. Clear scope, good interfaces, hard limits, and someone paying attention.