<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: João Camarate</title>
    <description>The latest articles on DEV Community by João Camarate (@jcamarate).</description>
    <link>https://dev.to/jcamarate</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3992846%2Fa233f92b-3343-4a1d-aa75-2d8fddf47685.jpeg</url>
      <title>DEV Community: João Camarate</title>
      <link>https://dev.to/jcamarate</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jcamarate"/>
    <language>en</language>
    <item>
      <title>Keeping context and decisions consistent across parallel AI agents</title>
      <dc:creator>João Camarate</dc:creator>
      <pubDate>Wed, 08 Jul 2026 12:32:19 +0000</pubDate>
      <link>https://dev.to/jcamarate/keeping-context-and-decisions-consistent-across-parallel-ai-agents-32nj</link>
      <guid>https://dev.to/jcamarate/keeping-context-and-decisions-consistent-across-parallel-ai-agents-32nj</guid>
      <description>&lt;p&gt;You start the morning with four Claude Code agents running, each in its own git worktree, each on a separate task. By mid-afternoon something is off. One agent has re-implemented a helper another already wrote. A second built against an interface that a third changed an hour ago. A fourth made a naming choice that contradicts a decision you made — out loud, to yourself — at 9am. Every diff is reasonable on its own. The system they add up to is not.&lt;/p&gt;

&lt;p&gt;This is the failure mode that shows up the moment you go from one agent to several. The code each agent produces is fine. What drifts is everything &lt;em&gt;between&lt;/em&gt; the agents: the decisions, the conventions, the current shape of the interfaces they all depend on. Running the agents in parallel is the easy part. Keeping them coherent is the hard part, and it's a different problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why parallel agents drift
&lt;/h2&gt;

&lt;p&gt;An agent's context is per-session. Each Claude Code instance has its own context window, populated by what it has read and done in that session. Nothing about that window is shared with the agent running in the next worktree. There is no common memory they all write to and read from. So when agent A decides "we use the repository pattern for data access," that decision exists in exactly two places: agent A's context, and your head. Agent B never hears about it.&lt;/p&gt;

&lt;p&gt;Three kinds of state cause the drift, and they're worth separating because they need different handling:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Decisions already made.&lt;/strong&gt; Architecture, naming, conventions, the approach you settled on for a cross-cutting concern. These are durable — once made, they should bind every agent, including ones you spawn tomorrow.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The current contract.&lt;/strong&gt; The shape of the interfaces, types, and APIs that agents share. This changes &lt;em&gt;during&lt;/em&gt; the work: agent A edits a signature, and agents B and C are now building against a version that no longer exists.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What's in flight.&lt;/strong&gt; Who is touching which files right now. Two agents editing the same module in separate worktrees won't see each other until the merge, where the conflict surfaces as a surprise.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Single-agent work hides all three, because one session holds the whole picture. Parallelism is what exposes them.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bottleneck isn't the model's context window. It's yours.
&lt;/h2&gt;

&lt;p&gt;The instinctive fix is to be the shared memory yourself — hold the decisions in your head and hand-feed them to each agent. That works at two agents. It breaks at four or five, because you become the integration layer: the only place the parallel streams reconcile is your working memory, and your working memory does not scale with agent count. You spend the day re-briefing, catching contradictions, and re-litigating decisions an agent has quietly forgotten. Throughput went up; your cognitive load went up faster. (We wrote about that tradeoff in more depth in &lt;a href="https://defract.dev/blog/running-parallel-claude-code-agents" rel="noopener noreferrer"&gt;the cognitive load of running parallel Claude Code agents&lt;/a&gt;.)&lt;/p&gt;

&lt;p&gt;So the real question isn't "how do I run more agents." It's "how do the decisions get made once and then bind every agent, without routing through me each time."&lt;/p&gt;

&lt;h2&gt;
  
  
  The ways teams handle it today
&lt;/h2&gt;

&lt;p&gt;There's a spectrum of approaches, each with a real tradeoff. Most people running parallel agents use some mix.&lt;/p&gt;

&lt;h3&gt;
  
  
  Context files (CLAUDE.md and friends)
&lt;/h3&gt;

&lt;p&gt;Put conventions and decisions in a file every agent reads on startup. This is the right baseline and you should do it. The limit is that it's static: it captures decisions you can write down in advance, not the ones you make mid-stream, and it goes stale the moment the work moves past it. It binds the durable layer, not the in-flight one.&lt;/p&gt;

&lt;h3&gt;
  
  
  Copy-paste briefs
&lt;/h3&gt;

&lt;p&gt;Hand each agent a tailored brief at spawn time. Flexible and precise, but it puts you back in the loop for every task, and it only carries what you remembered to include. This is the approach that makes you the bottleneck.&lt;/p&gt;

&lt;h3&gt;
  
  
  A shared task queue
&lt;/h3&gt;

&lt;p&gt;Tools like Beads, or a kanban of tasks each in its own worktree, give agents a common backlog and a record of what's done. This handles "what's in flight" well — agents can see the work surface. It does less for "decisions already made," which still live outside the queue unless you write them into each task.&lt;/p&gt;

&lt;h3&gt;
  
  
  Plan first, then fan out
&lt;/h3&gt;

&lt;p&gt;Spend an hour up front — non-agentic — resolving the design and the interfaces before any agent starts. One practitioner described it as conducting an ensemble: the score is set before the musicians play. This is the highest-leverage habit on the list, because most drift comes from decomposing into parallel tasks &lt;em&gt;before&lt;/em&gt; the shared decisions are settled. The catch is that it only covers what you can foresee; anything decided after the fan-out still needs somewhere to live.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The pattern underneath all four:&lt;/strong&gt; the durable decisions need a shared home that every agent reads from and writes to, and the interfaces need to be settled &lt;em&gt;before&lt;/em&gt; the work is split, not renegotiated inside five worktrees at once. Tooling helps to the degree it enforces those two things rather than leaving them to your memory.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>ai</category>
      <category>claudecode</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>compound engineering is the only AI coding idea that actually compounds</title>
      <dc:creator>João Camarate</dc:creator>
      <pubDate>Thu, 02 Jul 2026 17:29:00 +0000</pubDate>
      <link>https://dev.to/jcamarate/compound-engineering-is-the-only-ai-coding-idea-that-actually-compounds-n66</link>
      <guid>https://dev.to/jcamarate/compound-engineering-is-the-only-ai-coding-idea-that-actually-compounds-n66</guid>
      <description>&lt;p&gt;I've been building software with AI agents every day for months. The biggest thing I've learned has nothing to do with which model or which tool is hot this week. Its this: most people's AI output is flat. Every task starts from zero. The agent is just as sharp and just as forgetful as it was last week.&lt;/p&gt;

&lt;p&gt;Kieran Klaassen and Dan Shipper at Every gave this problem a name - compound engineering. The idea is almost stupidly simple: each piece of work should make the next one easier, not harder. They run several products with basically single-person eng teams on the back of it. Once you feel the difference its really hard to go back.&lt;/p&gt;

&lt;p&gt;It's usually drawn as a four step loop. Plan, work, assess, compound.&lt;/p&gt;

&lt;p&gt;Plan - before a line of code, the agents go read the codebase, the conventions, the framework versions, and hand you a plan you correct.&lt;br&gt;
Work - the plan drives the build. The agent writes the feature and the tests.&lt;br&gt;
Assess - review agents check it. Correctness, security, architecture.&lt;br&gt;
Compound - whatever you learned this time gets captured into durable rules and docs the system actually reads next time.&lt;/p&gt;

&lt;p&gt;Everyone does the first three. Almost nobody does the fourth.&lt;/p&gt;

&lt;p&gt;And the fourth is the whole point. Its the only step that actually compounds. Skip it and you dont have compound engineering - you have a very fast autocomplete with extra steps.&lt;/p&gt;

&lt;p&gt;Every ships this as an open source claude code plugin, a set of /ce: commands that scaffold the plan, run the work, run the review. Genuinely good on-ramp. If you live in the terminal go grab it.&lt;/p&gt;

&lt;p&gt;But the plugin isnt the loop. The loop is a discipline. The hard part was never typing /ce:plan - its doing the compound step honestly, every single time, when youre tired and the feature already works and you just want to merge and go to bed. Thats exactly where it dies.&lt;/p&gt;

&lt;p&gt;I ran this by hand for a while and the same leaks show up every time.&lt;/p&gt;

&lt;p&gt;The compound step is optional, so it doesnt happen. Writing down what you learned is boring and nothing breaks when you skip it. So you skip it. And the system quietly stops compounding.&lt;/p&gt;

&lt;p&gt;Your memory is scattered. Lessons end up as random edits to a CLAUDE.md that slowly turns into a swamp, or worse, they live in your head. No record of why a decision got made, or that you corrected the agent on this exact thing last week.&lt;/p&gt;

&lt;p&gt;Nothing is gated. The loop is a convention, not a wall. The second youre moving fast, work jumps from plan straight to merge and assess + compound fall off the back of the truck.&lt;/p&gt;

&lt;p&gt;The deeper version of this - how decisions and context drift across a pile of parallel agents - is its own rabbit hole. I went into that one &lt;a href="https://defract.dev/blog/context-across-parallel-ai-agents" rel="noopener noreferrer"&gt;separately&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;So heres the only question I actually care about now, every time I wire up an agent loop: a month from now, will this system be better at building my product than it is today? Or just as fluent, and just as forgetful?&lt;/p&gt;

&lt;p&gt;If theres no compound step, you already know the answer.&lt;/p&gt;

&lt;p&gt;Build the fourth step. Thats the whole game 🙌&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claudecode</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Why 20 Claude Code instances break down (and what to do)</title>
      <dc:creator>João Camarate</dc:creator>
      <pubDate>Fri, 26 Jun 2026 11:39:04 +0000</pubDate>
      <link>https://dev.to/jcamarate/why-20-claude-code-instances-break-down-and-what-to-do-2i5j</link>
      <guid>https://dev.to/jcamarate/why-20-claude-code-instances-break-down-and-what-to-do-2i5j</guid>
      <description>&lt;p&gt;The instinct makes sense. You're running three or four parallel Claude Code agents and the throughput is noticeably higher than sequential work. So you push further — to eight, to twelve, to twenty. If a few agents are good, more must be better.&lt;/p&gt;

&lt;p&gt;What people find instead is that the gains flatten and then reverse. Not just "more overhead" — the failure mode at 20 agents is qualitatively different from the failure mode at 5. New things break that didn't break before, and they break in ways that aren't immediately obvious.&lt;/p&gt;

&lt;p&gt;This is a breakdown of what those failure modes actually are, because naming them clearly is the prerequisite for avoiding them.&lt;/p&gt;

&lt;h2&gt;
  
  
  the failure modes that appear at scale
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. API throughput becomes the bottleneck
&lt;/h3&gt;

&lt;p&gt;Five agents hitting the Anthropic API simultaneously is fine. Twenty agents, each running long-context tasks, can saturate your per-minute token limits — especially during the heavy context-loading phases at the start of each session. When that happens, agents stall, you get rate-limit errors mid-task, and the "parallel" run becomes a staggered one you didn't plan for.&lt;/p&gt;

&lt;p&gt;This is fixable with backoff logic or scheduling agents to start in waves, but it's work that has nothing to do with software development, and it now falls on you.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. machine resources cap out before you expect
&lt;/h3&gt;

&lt;p&gt;Each Claude Code agent is a PTY session running a full &lt;code&gt;claude&lt;/code&gt; process. On a well-specced MacBook Pro, three to five is comfortable. Ten starts to feel it. Twenty is a memory and CPU problem — you're running what amounts to twenty active terminal sessions plus whatever those sessions are reading and writing. The machine slows down, context-switching becomes sluggish, and the environment itself becomes a source of noise.&lt;/p&gt;

&lt;p&gt;If you're not watching system resources while running at high agent counts, you're probably already past the point where the host is hurting the runs.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. task decomposition becomes intractable
&lt;/h3&gt;

&lt;p&gt;Decomposing a feature into five truly independent tasks is hard. Decomposing it into twenty is harder by a factor that's not linear. The dependencies between tasks multiply; the interfaces that tasks need to share get finer-grained; the risk of two agents working on the same module in different directions grows with each additional task you carve out.&lt;/p&gt;

&lt;p&gt;Most people who try to run twenty agents simultaneously don't actually decompose correctly for twenty tasks. They decompose for five and hand the rest under-specified work. Those agents then make assumptions — about the interface shape, about the conventions, about what the other agents are doing — and those assumptions collide at merge time.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. supervision collapses
&lt;/h3&gt;

&lt;p&gt;At three to five agents, you can maintain a working mental model of what each one is doing. You check in periodically, catch the drift when it starts, redirect before it compounds. The supervision is real, even if it's imperfect.&lt;/p&gt;

&lt;p&gt;At twenty agents, this breaks. You don't know what most of them are doing. Errors propagate for a long time before you see them because your attention is too distributed to catch them early. An agent that's been building against a stale assumption for 30 minutes has produced a lot of output before you notice, and all of that output needs to be re-evaluated or discarded.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;the typical twenty-agent session: you're watching two or three closely, dimly aware of the rest. the ones you're not watching are making decisions. some of those decisions are wrong, and you'll find out when you try to merge.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  5. context cascade failures multiply
&lt;/h3&gt;

&lt;p&gt;Each agent's context window is per-session — it holds what that agent has read and done, nothing from the other agents running in parallel. When you're running five agents and you make a decision that affects all of them, you can re-brief all five in a few minutes. When you're running twenty, re-briefing twenty agents is a significant chunk of time, and if you don't do it completely you have a mixed state: some agents operating on the new decision, some on the old one, and you don't know which is which.&lt;/p&gt;

&lt;p&gt;We wrote about this in detail in &lt;a href="https://defract.dev/blog/context-across-parallel-ai-agents" rel="noopener noreferrer"&gt;keeping context and decisions consistent across parallel AI agents&lt;/a&gt; — the short version is that the problem isn't solvable just by adding more agents. The context coherence requirement grows linearly with agent count, and the cost of maintaining it falls entirely on you.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. the git merge ceremony becomes a project of its own
&lt;/h3&gt;

&lt;p&gt;Worktrees give each agent an isolated environment. That's correct — without them you'd have file conflicts immediately. But isolation defers the merge, it doesn't eliminate it. Twenty worktrees means twenty branches with diverging state, some of which will have touched the same files from different angles, and all of which need to be sequenced back into a coherent main branch.&lt;/p&gt;

&lt;p&gt;Merging twenty branches isn't twenty times as hard as merging one branch. It's harder than that, because the interactions between branches accumulate. If you've run twenty agents on a feature for an afternoon, you may spend the next morning just doing the merge work — and the cognitive load of holding twenty changesets in your head simultaneously while resolving conflicts is substantial.&lt;/p&gt;




&lt;h2&gt;
  
  
  the diagnostic question
&lt;/h2&gt;

&lt;p&gt;Before pushing to higher agent counts, one question cuts through the intuition:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Of your N agents, how many are actually making progress versus waiting on you?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If three of your five agents are blocked waiting for your review, your re-brief, or your arbitration of a conflict — running five agents is providing the throughput of two. Adding more agents doesn't fix this. It adds more agents waiting in the queue.&lt;/p&gt;

&lt;p&gt;The throughput ceiling in most parallel-agent setups isn't the number of agents. It's the rate at which one human can review output, make decisions, and maintain shared context. Adding agents past that ceiling produces waiting agents and deferred work, not faster delivery.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;a practical ceiling:&lt;/strong&gt; most engineers who run parallel Claude Code agents seriously land at 3–5 as the stable operating range. not because more agents can't produce output, but because more agents can't be supervised effectively by one person. the number that feels chaotic is usually a signal that the human bottleneck has been exceeded, not that the agents are broken.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  what to do instead
&lt;/h2&gt;

&lt;h3&gt;
  
  
  fewer, better-structured agents
&lt;/h3&gt;

&lt;p&gt;The return on running more agents diminishes well before 20. The return on running fewer agents more carefully is higher than it looks. Three agents with clear, complete task briefs, well-separated concerns, and one human who can actually supervise all three will routinely outperform ten agents with overlapping work and a supervision gap.&lt;/p&gt;

&lt;p&gt;The question is not "how many agents can I spawn?" It's "what's the maximum number I can supervise well?" For most people working alone on a codebase, that's somewhere between three and six.&lt;/p&gt;

&lt;h3&gt;
  
  
  lock the design before you fan out
&lt;/h3&gt;

&lt;p&gt;The biggest cause of agent conflicts at scale is premature decomposition — breaking work into parallel tasks before the interface decisions are settled. An agent that starts building the data layer before the API contract is fixed will produce work that needs to be re-done the moment the contract is resolved.&lt;/p&gt;

&lt;p&gt;The pattern that works: resolve the design and the key interface decisions non-agentic, or with one dedicated planning agent, before any implementation agent starts. Decompose into parallel tasks against a fixed specification, not a live one. The upfront time pays back multiple times in avoided merge conflicts and re-work. (This is what a &lt;a href="https://defract.dev/blog/running-parallel-claude-code-agents" rel="noopener noreferrer"&gt;structured pipeline&lt;/a&gt; enforces by construction.)&lt;/p&gt;

&lt;h3&gt;
  
  
  automated review before it reaches you
&lt;/h3&gt;

&lt;p&gt;If you're reviewing all agent output yourself, you're a single-threaded bottleneck in what's supposed to be a parallel system. Some of that review can be done by agents: type checks, test runs, lint, security scan, architecture review against the specification. These can run automatically when an agent finishes, before the output reaches your queue.&lt;/p&gt;

&lt;p&gt;What remains for you to review is higher-signal: intent alignment, design judgment, the things that require your context about the product. Everything mechanical is pre-filtered. The queue you're looking at is shorter and more meaningful.&lt;/p&gt;

&lt;h3&gt;
  
  
  shared context, not parallel re-briefing
&lt;/h3&gt;

&lt;p&gt;Every decision you make in a parallel-agent session that needs to reach multiple agents requires either you re-briefing each one (which doesn't scale) or a shared source that agents read from. &lt;code&gt;CLAUDE.md&lt;/code&gt; handles the static layer — conventions, architecture, the things set before you start. The dynamic layer — decisions made mid-session, current interface shape, what other agents are doing — needs somewhere else to live.&lt;/p&gt;

&lt;p&gt;Without it, you're the only mechanism for propagating mid-session decisions to all agents, and that breaks at agent counts above five or six.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claudecode</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>what is spec-driven development? (with ai coding agents)</title>
      <dc:creator>João Camarate</dc:creator>
      <pubDate>Fri, 19 Jun 2026 16:20:08 +0000</pubDate>
      <link>https://dev.to/jcamarate/what-is-spec-driven-development-with-ai-coding-agents-56mc</link>
      <guid>https://dev.to/jcamarate/what-is-spec-driven-development-with-ai-coding-agents-56mc</guid>
      <description>&lt;p&gt;Most AI coding workflows start the same way - you open the agent, describe what you want in a sentence or two, and watch it write code. It feels fast. Then the diff comes back and it built the wrong thing, or the right thing the wrong way, and you spend the next hour correcting it through follow-up prompts. The agent was never confused about how to write the code. It was confused about what you actually wanted.&lt;/p&gt;

&lt;p&gt;spec-driven development is a direct response to that failure mode. Instead of prompting an agent straight to code, you first produce a spec - a written description of the requirements, the design, and the tasks - and you correct that spec until it is right. Only then does the spec drive implementation. The decision about what to build happens once, explicitly, on paper, before any code exists.&lt;/p&gt;

&lt;h2&gt;
  
  
  what spec-driven development actually means
&lt;/h2&gt;

&lt;p&gt;The term has become popular through tools like AWS Kiro, which put "specs" directly in the IDE, and GitHub's spec-kit, which brings the same idea to Copilot, Claude Code, and other agents. But the idea is older than any of these tools - writing down what a system should do before building it is just engineering, and the AI tooling is a new wrapper around an old discipline.&lt;/p&gt;

&lt;p&gt;The shared shape across the tools is a three-part artifact, usually written as plain markdown:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;requirements&lt;/strong&gt; - what the feature does, who uses it, what success looks like, and the acceptance criteria. This is behavior, not implementation. No stack, no file names.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;design&lt;/strong&gt; - the technical plan that satisfies those requirements. Architecture, data models, the interfaces involved, the constraints and standards the code has to respect.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;tasks&lt;/strong&gt; - the design broken into small, reviewable, testable units. Each one is concrete enough to hand to an agent and check on its own, like "add a registration endpoint that validates email format and rejects duplicates."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each part feeds the next. Requirements constrain the design, the design decomposes into tasks, and the tasks are what the agent implements. The human reviews and corrects at each step, so by the time code generation starts, the agent is working from a document you have already agreed with rather than guessing at thousands of unstated details from a one-line prompt.&lt;/p&gt;

&lt;h2&gt;
  
  
  why this matters now
&lt;/h2&gt;

&lt;p&gt;For most of software's history, the expensive, slow part was writing the code. Specs felt like overhead because the typing was the bottleneck and you could just refactor your way out of a misunderstanding. That economics has changed. When an agent can produce a feature's worth of code in minutes, writing the code is no longer the constraint. &lt;a href="https://defract.dev/blog/ai-build-anything-new-bottleneck" rel="noopener noreferrer"&gt;The bottleneck moved to deciding precisely what to build.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A spec is how you make that decision once, in a form both you and the agent can read. Vague intent forces the model to fill in gaps, and it fills them with plausible guesses that you only discover are wrong after the code is written. A spec moves the guessing forward, into a cheap document, where a wrong assumption costs a sentence to fix instead of a sprint to unwind.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The point of a spec is not documentation. It is to surface the disagreement between what you meant and what the agent understood while that disagreement is still one paragraph instead of two thousand lines.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  where it helps
&lt;/h2&gt;

&lt;h3&gt;
  
  
  you review intent, not diffs
&lt;/h3&gt;

&lt;p&gt;Reviewing a large diff is reverse-engineering - you read the code and try to reconstruct what the author intended, then judge whether that intent was correct. A spec inverts the order. You agree on the intent first, in language, then the implementation is checked against an intent you already approved. Reading "validate email format and reject duplicates" and deciding it is right takes seconds. Reading the endpoint, the validation, and the database query to infer the same thing takes much longer and you can still miss the gap.&lt;/p&gt;

&lt;h3&gt;
  
  
  you catch the wrong build before you pay for it
&lt;/h3&gt;

&lt;p&gt;The most expensive mistake in AI-assisted work is building the wrong thing well. A spec is the cheapest place to catch it. If the requirements say the feature should do X and you wanted Y, you find out before a single task runs, not after the agent has produced a polished, tested, completely misaimed implementation.&lt;/p&gt;

&lt;h3&gt;
  
  
  you can parallelize honestly
&lt;/h3&gt;

&lt;p&gt;Once a design is decomposed into discrete tasks with clear boundaries, you can fan multiple agents out across them without them colliding or duplicating work. The spec is the shared contract that keeps independent work coherent. Without it, parallel agents each invent their own interpretation of the same vague goal and you spend the saved time reconciling them.&lt;/p&gt;

&lt;h2&gt;
  
  
  the honest limits
&lt;/h2&gt;

&lt;p&gt;spec-driven development is not free and it is not always worth it. The discipline carries real costs, and being fair about them is the only way to use it well.&lt;/p&gt;

&lt;p&gt;It is overkill for small work. A one-line fix, a copy change, a rename - writing a requirements-design-tasks document for these is slower than just doing them, and pretending otherwise is how a good practice turns into busywork. The size of the spec should match the size and risk of the change, and for trivial work that means no spec at all.&lt;/p&gt;

&lt;p&gt;Specs go stale. A spec is only the source of truth if it is maintained. The moment the code drifts from the document and nobody updates the document, the spec becomes a confident, out-of-date lie - worse than no spec, because people trust it. This is the failure that sank earlier model-driven approaches, and it has not gone away.&lt;/p&gt;

&lt;p&gt;And agents do not always obey. A larger context window and a detailed spec do not guarantee the model follows every line. Specs reduce ambiguity, they do not eliminate the need to review the output. Some practitioners also find verbose markdown specs tedious to review in their own right, which is a real tradeoff rather than a solved problem. Treat the spec as a tool for making intent explicit, not as a contract the model is forced to honor.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claudecode</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
