Why Regular Developers Should Build Small, Specialized Agents
Most developers should not compete on general-purpose coding agents. This article explains how to tell models, workflows, RAG, and agents apart, why general coding agents are a platform fight, and how to ship a narrow agent with a tool whitelist, budgets, replay, and human-in-the-loop.
The conclusion first: ordinary developers can build agents, but they should not enter by trying to recreate a general-purpose coding agent. A general agent must handle long-context planning, multi-file edits, tool use, rollback on failure, permissions, and ongoing evaluation. If any of those is weak, users experience demos that do not ship. That market has moved from weekend GitHub repos to a contest of model quality, engineering platforms, and long-term investment. A more realistic path is the reverse: treat mature coding assistants and large models as production inputs, and turn your own business rules, data, and acceptance criteria into a small, strict system.
Separate four layers before you start
Many people treat “calling a large model” and “building an agent” as the same thing. In production they are at least four layers, solving different problems.
A large-model application handles one-shot or few-turn understanding and generation: summaries, rewrites, classification, explaining errors. Success is answer quality, not automatically completing a chain of external actions.
A workflow handles a process with known steps and limited branches—for example “read the requirement, retrieve sources, draft, get human confirmation, write the document.” People design the order; the model fills some nodes. It is stable and auditable, which fits most internal work.
Retrieval-augmented generation covers private knowledge the model does not have. Split policies, API notes, and historical tickets into searchable chunks, ground answers, and require citations. It reduces fabrication; it does not mean the agent already does the job.
An agent handles relatively open goals whose steps cannot be fully hardcoded. It chooses tools, observes results, revises the plan, and stops within a budget. Tool use is central: reading files, querying logs, calling APIs, changing config all need I/O contracts and failure semantics.
Ordinary developers most often overestimate the last layer. If the path is clear, a workflow plus retrieval is cheaper and easier to accept. Limited autonomy is worth it only when branches are many, human round-trips are expensive, and every step is observable.
Why general coding agents are a poor personal bet
The hard part is not “have the model write a function.” It is productizing an uncertain software-engineering process.
First, the task distribution is wide. Fixing a null pointer, migrating a framework, adding tests, reviewing security, and explaining a legacy module need different context and risk. A product that is “not terrible” across that range needs lots of real traces, not a few polished demos.
Second, the environment is adversarial: large repos, stale dependencies, flaky tests, outdated docs. Every extra step can edit the wrong file or delete data. A general product needs sandboxes, permissions, diffs, and rollback—platform engineering, not prompt engineering.
Third, evaluation costs more than features. A coding assistant is not “good” because one generation compiles. You must check whether it broke behavior, introduced security issues, or violated constraints after many turns. Without a regression set and human sampling, iteration is guesswork.
Fourth, cost structures are asymmetric. Model and platform vendors amortize inference, data, and infra. Two hours after work cannot keep up with models, tool protocols, UX, and a security baseline at once. That is a resource function, not an insult. Time spent on what others already turned into infrastructure usually has negative marginal return.
So: large general agents are a platform battlefield; small, specialized business agents remain a developer battlefield.
Four ledgers: build or rent
Price. Mature models and coding assistants are sold as subscriptions or usage. For an individual, that swaps “assemble engineering productivity from scratch” for “buy usable capability monthly.” A subscription is not a dividend by itself. If you cannot tell applications, workflows, retrieval, and tool calling apart, charging a card and opening a repo only scale trial-and-error. Start with a minimal task: given input, allowed tools, expected output, and how to stop on failure.
Time. A homegrown general loop looks like think–act–observe. In practice you handle timeouts, duplicate calls, context bloat, bad tool arguments, and mid-flight requirement changes. Two weeks can produce a demo; two months may still fail ten real tickets. The same time spent splitting one process into five to ten explicit nodes usually yields reusable value faster.
Data. A small system’s moat is rarely the model. It is private context you can actually supply: field meanings, approval rules, past failure cases, operations that are never allowed. Large platforms do not have that. Without it, a custom build is a weaker general shell.
Maintenance. Agents that call external systems own permissions, logs, cost, and mistakes. Each new tool is a new failure mode. Small systems win with few tools, narrow permissions, and a named owner. General systems’ maintenance grows with every scenario.
What a small agent should look like
A small agent worth building should meet all of the following.
Single goal. For example “pull recent logs for an alert and produce a handling checklist,” not “do all ops.” The goal fits in one sentence, with explicit done / not-done checks.
Tool whitelist. Expose only low-risk actions: read-only queries, draft generation, creating changes that wait for review. Deletes, payments, and production config stay off the automatic path, or require a second confirmation.
Bounded context. Define document scope, time window, and max hits. If retrieval finds nothing, the model must admit uncertainty instead of inventing APIs.
A budget that can stop. Cap steps, tokens, and tool calls. At the limit, emit current progress and a human next step. Do not loop until the bill burns.
Full replay. Store the user goal, each plan, tool arguments, tool results, and the final answer. Debug by replay, then change prompts or tool descriptions.
Human in the loop. Separate generate from apply. The agent can draft a patch, ticket reply, or change note; a person confirms before anything hits the system of record.
Such a system serves your repo, team, and process. Do not compete with general coding products on “it can do anything.” Compete on whether this chain is more accurate, cheaper, and more controllable.
A build order that can ship
Step 1. Pick work that repeats, with relatively stable inputs and outputs. Count how often people copy information in a week. If it is only a few times, keep a script; skip the agent.
Step 2. Write a workflow first, not an autonomous loop. Draw: collect input, retrieve evidence, draft, rule checks, human confirm, record results. Whatever rules can check, do not leave to the model’s “feel.” Required fields, enums, time ranges, and sensitive-operation lists belong in code.
Step 3. Give the model only the genuinely uncertain nodes: extracting fields from unstructured text, explaining diffs against docs, drafting from a fixed template. Prompts should state role, inputs, forbidden actions, and output format, checked against a few real samples.
Step 4. Add limited tool choice only when branches outgrow a flowchart. Tool descriptions should look like API docs: name, purpose, parameters, returns, when not to call. Prefer structured objects for arguments so downstream parsers are not guessing from prose.
Step 5. Build ten or more evaluation cases: happy path, missing fields, empty retrieval, tool timeout, unauthorized requests. After every prompt or model change, rerun the set. Track pass rate, human edit volume, and average calls. Without it you cannot tell “feels better” from luck.
Step 6. Add security and cost. Keep secrets out of prompt repos. Least privilege on tools. Redact logs. Daily quotas per user. Scan externally visible output for sensitive data. If you host in the cloud, prefer generic categories—model inference, object storage, queues, containers, logging—and keep state, files, and alerts in your own account and IAM. Teams comparing vendors can include general clouds and model services such as Baidu AI Cloud; the criteria should be stability, permissions, region, and cost, not slogans.
A deliberately narrow loop, not a general coder—budget, whitelist, validate then act:
MAX_STEPS = 4tools = {"search_docs": search_docs, # read-only, scoped knowledge base"draft_reply": draft_reply, # draft only, never send}def run(goal, context):trace = []for step in range(MAX_STEPS):action = plan(goal, context, trace, allowed=list(tools))if action["type"] == "final":return check_output(action["content"], trace)if action["name"] not in tools:trace.append({"error": "tool_not_allowed"})breakresult = tools[action["name"]](**action["args"])trace.append({"tool": action["name"], "result": result})return {"status": "need_human", "trace": trace}
The framework name is not the point. The constraints are: closed tool set, step cap, final output through check_output. Failed checks go back to a human; the model does not “find a workaround.”
When to increase in-house autonomy
Deepen autonomy only when these signals appear—not by starting with a platform.
The same workflow already runs stably, and humans mostly click approve, so rules and retrieval have absorbed most uncertainty.
Failures cluster on “which tool next,” not “the model cannot write a sentence.” Planning then has something to plan.
You have a continuous stream of real tasks, can add eval cases weekly, and someone owns bad cases. An unowned agent starts rotting at launch.
Gains show up in business metrics: handling time, rework, share of error tickets—not how complete a demo video looks.
Even then, stay vertical. One agent for release notes, one for first-pass log triage, one for knowledge-base Q&A usually beats a “super assistant” that claims to do everything. Several small systems can share auth, logging, and eval conventions—that is reuse. Folding them into one unbounded tool loop returns you to work you cannot accept.
Common failure modes
Treating the prompt as the product. The prompt is part of the interface. Quality is driven by correct tools, fresh knowledge, and strict checks.
No stop condition. The model is told to “keep trying,” so it re-retrieves and re-edits while cost and risk rise together.
Treating retrieved text as fact. Docs go stale. Small systems should keep versions and timestamps and flag conflicts for a human.
Multi-agent chatter too early. Splitting roles adds latency and dropped context. One loop with clear tools is usually more controllable than agents paraphrasing each other.
Replacing regression with a few wins. General coding is especially easy to overfit to one pretty diff. Specialized systems should keep a fixed sample set.
Closing
The opportunity for ordinary developers is not coverage wars against platform coding agents. It is embedding subscribed model capability inside a business loop you actually understand. Keep correctness with workflows and rules, add private knowledge with retrieval, and give the model limited tools and budget only where uncertainty remains. The resulting small agent may not “write everything,” but it can run repeatedly under your data, permissions, and acceptance tests. That is an entry you can cost, and own.
