The 12% That Scale: What Narrow Agents Do That General Agents Do Not

Narrow production agents with high reliability share one consistent trait - comprehensive verification coverage. It is not the narrowness that makes them reliable. It is what narrowness makes possible to verify.

B

Balagei G Nagarajan

4 MIN READ


SWE-bench Verified (Jimenez et al., HumanEval + SWE-bench, 2024) established that top coding agents resolve between 40-50% of real-world GitHub issues end-to-end. These are the narrow agents that have reached production reliability - and they share a common architectural pattern: each action class (read file, write patch, run test, submit PR) has a dedicated verification contract that confirms the action's outcome before the next action begins. The reliability is not from better models. It is from more complete verification per action class.
Narrow agent verification lessons hero
After apply patch, run the test suite and confirm no previously passing tests now fail.
— from “The 12% That Scale: What Narrow Agents Do That General Agents Do Not”

Key facts.

  • SWE-bench Verified (2024): top narrow coding agents resolve 40-50% of real GitHub issues end-to-end - the highest reliability tier in deployed agentic systems.
  • Narrow agents have bounded action spaces: a coding agent has 8-12 distinct action types. Verification contracts per action type are achievable. A general agent with hundreds of possible actions cannot achieve the same verification coverage.
  • The most reliable narrow agents (customer service, coding, data extraction) all implement pre-action input validation, post-action outcome verification, and end-of-task goal achievement check as standard components.
  • General agents skip verification because they cannot enumerate what to verify - there are too many possible actions. Narrowness makes comprehensive verification design tractable.

What narrow agents make tractable

A coding agent can enumerate its action types: read file, write file, run test, search codebase, apply patch, submit PR. For each action type, a verification contract can be written: after read file, confirm the file content is non-empty and the file path resolves to the target file. After apply patch, run the test suite and confirm no previously passing tests now fail. After submit PR, confirm the PR is in the target repository and the diff matches the intended changes.

Each of these contracts is written once, tested once, and applied every time that action type executes. The verification overhead per action is low because the contract is pre-built. The coverage is high because the contract covers every execution of that action type, not just selected instances.

A general agent has no bounded action type set. It can call arbitrary APIs, generate arbitrary outputs, and execute arbitrary plans. Writing a per-action-type verification contract for an unbounded action space is not tractable. Teams default to outcome-only verification, which catches failures only after the full action sequence has run and the damage has accumulated.

Applying narrow-agent lessons to general agents

The lesson from narrow agents is not "build narrow agents instead of general ones." It is "identify the bounded action types in your general agent and write verification contracts for each." Most general agents in production actually have a bounded set of high-frequency, high-consequence action types - even if the agent theoretically can do more. Those high-frequency types account for 80-90% of executed actions. Verification contracts for those types cover most of the reliability surface.

Action type enumeration as a design step: before building the agent, list every action type it will take in the target domain. For each type, write the verification contract. Anything without a verification contract is either too rare to prioritize or too ill-defined to automate - and either conclusion is valuable signal during design.

# Narrow agent verification registry pattern
VERIFICATION_CONTRACTS = {
 "read_file": lambda result, params: (
 result.content is not None and
 result.path == params["target_path"]
 ),
 "apply_patch": lambda result, params: (
 run_tests().all_passed and
 git_diff() == params["expected_diff"]
 ),
 "submit_pr": lambda result, params: (
 pr_exists(result.pr_id, params["repo"]) and
 pr_diff_matches(result.pr_id, params["patch"])
 ),
}

def verified_action(action_type, action_fn, params): result = action_fn(params) contract = VERIFICATION_CONTRACTS.get(action_type) if contract and not contract(result, params): raise VerificationError(f"Contract failed for {action_type}") return result

Narrow vs general agent verification coverage diagram

Verification coverage by agent type

Agent typeAction typesAchievable contract coverageTypical reliability tier
Narrow coding agent8-1280-100%40-50% task completion (SWE-bench)
Narrow customer service agent10-1570-90%High (domain-specific)
General orchestration agent50-200+10-20%Low in production
General agent with domain limiter20-40 in-domain50-70%Medium with right constraints

Shipping agents win on per-action checks, not an upgrade; the gain survives a frontier model and saves the rework.

The Pattern Intelligence Layer enforces action-type enumeration as a pre-design step for every pattern. A pattern that does not have enumerated action types with verification contracts cannot be published as production-ready. The narrow-agent lesson - that reliability follows verification coverage, which follows action-type boundedness - is encoded into the pattern specification process itself.

Frequently asked questions


Share this post

Join the discussion

Have a take, a war story, or a question? Sign in with GitHub to comment and react. Comments are powered by GitHub Discussions, ad-free and yours to moderate.

Continue Reading

Find where your agent breaks, before you build it

Faultmap maps where your agent will fail from the goal and your data, then hands you the first test suite it has to pass.