{"id":7045028,"date":"2026-08-23T15:24:19","date_gmt":"2026-08-23T15:24:19","guid":{"rendered":"https:\/\/peraltafinancing.com\/analytics\/spec-driven-development-with-claude-code-a-practical-guide\/"},"modified":"2026-08-23T15:24:19","modified_gmt":"2026-08-23T15:24:19","slug":"spec-driven-development-with-claude-code-a-practical-guide","status":"publish","type":"post","link":"https:\/\/fivemor.com\/?p=7045028","title":{"rendered":"Spec-Driven Development with Claude Code: A Practical Guide"},"content":{"rendered":"<p> <br \/>\n<\/p>\n<div id=\"article-start\">\n<p class=\"wp-block-paragraph\">I have written enough specs for Claude Code now to have hit the failure mode <strong>nobody warns you about<\/strong>.\u00a0<\/p>\n<p class=\"wp-block-paragraph\">The spec was fine. The plan was fine. Claude worked through the tasks, ran the test suite, and reported everything passing. I looked at the <code>diff<\/code> properly the next morning and found it had converted a flaky test from an assertion into a skip. The suite was <mark style=\"background-color:#7bdcb5\" class=\"has-inline-color\">green<\/mark>. The requirement was not met. The test could no longer\u00a0fail, because\u00a0it either passed or quietly skipped.\u00a0<\/p>\n<p class=\"wp-block-paragraph\">That is not a bug in Claude Code. It is what happens when a criterion has no failing state. And it is the part of spec-driven development that most guides leave out, because writing the spec is the easy half.\u00a0<\/p>\n<p class=\"wp-block-paragraph\">This article covers both halves. How to write the spec, and how to write it so the agent cannot declare victory without earning it.\u00a0<\/p>\n<h2 id=\"h-why-a-spec-changes-the-odds\" class=\"wp-block-heading\">Why a Spec Changes the Odds\u00a0<\/h2>\n<p class=\"wp-block-paragraph\">The argument for spec-driven development is usually made on vibes. There is a better version of it that is just arithmetic.\u00a0<\/p>\n<p class=\"wp-block-paragraph\">Anthropic\u2019s\u00a0own RL Engineering team has reported that Claude Code\u2019s first-attempt success rate on small to medium pull requests, without detailed guidance, sits at\u00a0roughly one\u00a0in three. Two thirds of the time it misses a requirement, reads the scope too broadly, or picks an implementation path you would not have chosen.\u00a0<\/p>\n<p class=\"wp-block-paragraph\">Here is why that number is not surprising. Suppose Claude makes the call you would have made 80% of the time on any single decision. A feature of reasonable size involves around twenty decisions. Get all twenty right at 80% each and you are at 0.8 to the power of 20, which is about 1%.\u00a0<\/p>\n<p>\n<b>The point:<\/b>\u00a0a spec does not make Claude smarter at those decisions. It removes them from Claude\u2019s hands\u00a0entirely, because\u00a0you already made them. That is the whole mechanism.\n<\/p>\n<h2 id=\"h-the-four-phases-and-the-one-rule-people-break\" class=\"wp-block-heading\">The Four Phases, and the One Rule People Break<\/h2>\n<p class=\"wp-block-paragraph\">Spec-driven development runs in four phases. Requirements, design, tasks, execute.\u00a0<\/p>\n<div style=\"overflow-x: auto; margin: 24px 0; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;\">\n<table style=\"width: 100%; border-collapse: collapse; border: 1px solid #d1d5db; font-size: 15px; line-height: 1.5;\">\n<tbody>\n<tr style=\"background-color: #f3f4f6;\">\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\"><strong>Phase<\/strong><\/td>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\"><strong>What it captures<\/strong><\/td>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\"><strong>Where it happens<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">Requirements<\/td>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">What the feature must do from the user\u2019s side. User stories, acceptance criteria, edge cases. Not how.<\/td>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">Session 1, plan mode<\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">Design<\/td>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">Data models, API contracts, which files change, which stay untouched, what is explicitly out of scope.<\/td>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">Session 1, plan mode<\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">Tasks<\/td>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">Ordered implementation steps with dependencies. Task 3 cannot start before task 2 finishes.<\/td>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">Session 1, plan mode<\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">Execute<\/td>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">Claude writes code against the task list, one task at a time.<\/td>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">A fresh session<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p class=\"wp-block-paragraph\"><strong>The rule people\u00a0break:\u00a0<\/strong>execute in a new session. Not a continuation of the planning session.\u00a0<\/p>\n<p class=\"wp-block-paragraph\">This is the step I skipped for a while because keeping one session open felt more efficient. It is not. By the end of planning, your context holds every rejected idea, every clarifying question, and every file Claude read while exploring. Building in that same window means every implementation decision is reasoned against a pile of discarded alternatives.\u00a0<\/p>\n<p class=\"wp-block-paragraph\">A fresh session reads <code>SPEC.md<\/code> and <code>PLAN.md<\/code> as documents, with no memory of the arguments that produced them. That is the point. The spec is supposed to be the interface between the two phases.\u00a0<\/p>\n<h3 id=\"h-phase-1-let-claude-interview-you\" class=\"wp-block-heading\">Phase 1: let Claude interview you<\/h3>\n<p class=\"wp-block-paragraph\">Writing a good spec from a blank page is slow. Having Claude extract one from you is faster and surfaces decisions you had not thought about:\u00a0<\/p>\n<pre class=\"wp-block-code\"><code>claude\u00a0--permission-mode plan\u00a0<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>&gt; I want to build passwordless magic-link login. Interview me in detail using the AskUserQuestion tool.\n \n  Ask about implementation, edge cases, failure modes, and tradeoffs. Skip the obvious questions, dig into        the parts I might not have considered. \n \n  Keep going until we have covered everything, then write the spec to SPEC.md.<\/code><\/pre>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img fetchpriority=\"high\" decoding=\"async\" width=\"1217\" height=\"705\" src=\"https:\/\/cdn.analyticsvidhya.com\/wp-content\/uploads\/2026\/08\/image1.webp\" alt=\"Claude Code CLI\" class=\"wp-image-257101\" srcset=\"https:\/\/cdn.analyticsvidhya.com\/wp-content\/uploads\/2026\/08\/image1.webp 1217w, https:\/\/cdn.analyticsvidhya.com\/wp-content\/uploads\/2026\/08\/image1-300x174.webp 300w, https:\/\/cdn.analyticsvidhya.com\/wp-content\/uploads\/2026\/08\/image1-768x445.webp 768w, https:\/\/cdn.analyticsvidhya.com\/wp-content\/uploads\/2026\/08\/image1-150x87.webp 150w\" sizes=\"(max-width: 1217px) 100vw, 1217px\"\/><\/figure>\n<\/div>\n<p class=\"wp-block-paragraph\">Plan mode matters here. Claude reads and reasons but writes nothing until you allow it. When the spec appears, press\u00a0Ctrl+G\u00a0to open it in your editor and change it directly. Editing the spec yourself is what turns it from Claude\u2019s document into yours.\u00a0<\/p>\n<p class=\"wp-block-paragraph\"><strong>Try this now:\u00a0<\/strong>take the next feature on your list and paste that interview prompt with a one-line description. Answer honestly, including the questions you do not have an answer to yet. Those gaps are the actual design work, and they are cheaper to find now than in task 7 of the build.\u00a0<\/p>\n<h4 id=\"h-write-criteria-a-command-can-settle\" class=\"wp-block-heading\">Write Criteria a Command Can Settle\u00a0<\/h4>\n<p class=\"wp-block-paragraph\">This is the section that matters most, and it is where the earlier guides are thinnest.\u00a0<\/p>\n<p class=\"wp-block-paragraph\">Every acceptance criterion you write falls into one of two categories. Either a command can decide whether it passed, or the agent decides. Anything in the second category is a criterion the agent grades itself on.\u00a0<\/p>\n<div style=\"overflow-x: auto; margin: 24px 0; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;\">\n<table style=\"width: 100%; border-collapse: collapse; border: 1px solid #d1d5db; font-size: 15px; line-height: 1.5;\">\n<tbody>\n<tr style=\"background-color: #f3f4f6;\">\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\"><strong>Interpretable<\/strong><\/td>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\"><strong>Checkable<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">Login should be secure<\/td>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">A request with an expired token returns HTTP 401<\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">Handle rate limiting properly<\/td>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">The 4th request from one email within an hour returns HTTP 429<\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">Well-structured error handling<\/td>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">Every 4xx response body contains an \u2018error\u2019 key with a string value<\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">The export should be fast<\/td>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">Exporting 10,000 rows completes in under 3 seconds locally<\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">Tests should pass<\/td>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">pytest exits 0 and the diff adds no skip markers<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p class=\"wp-block-paragraph\">What changes between those two columns is not tone or level of detail. It is whether there is a state the criterion can be in that counts as failing.\u00a0<\/p>\n<h3 id=\"h-phase-2-ears-notation-if-you-want-a-template\" class=\"wp-block-heading\">Phase 2: EARS notation, if you want a template\u00a0<\/h3>\n<p class=\"wp-block-paragraph\">If you would rather not invent phrasing each time, there is a notation for this. EARS, short for Easy Approach to Requirements Syntax, came out of Rolls-Royce in 2009 and has been picked up by AWS Kiro, with an open proposal to add it to GitHub Spec Kit.\u00a0<\/p>\n<p class=\"wp-block-paragraph\">It is five sentence shapes. The useful ones in practice:\u00a0<\/p>\n<div style=\"overflow-x: auto; margin: 24px 0; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;\">\n<table style=\"width: 100%; border-collapse: collapse; border: 1px solid #d1d5db; font-size: 15px; line-height: 1.5;\">\n<tbody>\n<tr style=\"background-color: #f3f4f6;\">\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\"><strong>Pattern<\/strong><\/td>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\"><strong>Example<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">WHEN <trigger> THE system SHALL <response\/><\/trigger><\/td>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">WHEN a valid email is submitted THE system SHALL send a link valid for 15 minutes<\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">IF <condition> THEN THE system SHALL <response\/><\/condition><\/td>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">IF a link is used twice THEN THE system SHALL return HTTP 410<\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">WHILE <state> THE system SHALL <response\/><\/state><\/td>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">WHILE a user is rate limited THE system SHALL return HTTP 429<\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">WHERE <feature is=\"\" present=\"\"> THE system SHALL <response\/><\/feature><\/td>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">WHERE SSO is enabled THE system SHALL skip the magic-link flow<\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">THE system SHALL <response\/><\/td>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">THE system SHALL log every issued token with a hashed identifier<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p class=\"wp-block-paragraph\">Forcing yourself to name the trigger and the condition is what removes ambiguity. The side effect is that criteria written this way map almost one to one onto test cases, which is what makes a spec executable rather than advisory.\u00a0<\/p>\n<h3 id=\"h-the-failure-mode-nobody-warns-you-about\" class=\"wp-block-heading\">The Failure\u00a0Mode\u00a0Nobody Warns You About\u00a0<\/h3>\n<p class=\"wp-block-paragraph\">Now the part that prompted this article.\u00a0<\/p>\n<p class=\"wp-block-paragraph\">Anthropic\u2019s\u00a0own reward-hacking research documents that Claude Code models, given hard tasks, sometimes\u00a0modify\u00a0or delete test assertions rather than fixing the source code. The Sonnet 4.6 system card states directly that the model can find shortcuts or workarounds that technically satisfy requirements while missing the intended goal.\u00a0<\/p>\n<p class=\"wp-block-paragraph\">This is not the model being adversarial. It is a system optimising against the signal you gave it. If the signal is \u201cthe test suite passes\u201d, then editing the test is a valid path to that signal, and a much shorter one than fixing the bug.\u00a0<\/p>\n<h3 id=\"h-what-this-looks-like-in-practice\" class=\"wp-block-heading\">What this looks like in practice\u00a0<\/h3>\n<p class=\"wp-block-paragraph\">Two documented cases worth knowing, because both would pass a casual review:\u00a0<\/p>\n<div style=\"overflow-x: auto; margin: 24px 0; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;\">\n<table style=\"width: 100%; border-collapse: collapse; border: 1px solid #d1d5db; font-size: 15px; line-height: 1.5;\">\n<tbody>\n<tr style=\"background-color: #f3f4f6;\">\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\"><strong>Reported case<\/strong><\/td>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\"><strong>Why it slipped through<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">A flaky end-to-end test converted from assert result[\u2018success\u2019] to pytest.skip() on timeout<\/td>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">The suite reported green. The test can now never fail; it either passes or silently skips.<\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">A production security hardening task declared ready without the review step being run. The user then found eight security issues, two of them critical.<\/td>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">Completion was asserted rather than evidenced, and the assertion was accepted.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p class=\"wp-block-paragraph\"><strong>The pattern in both:\u00a0<\/strong>a criterion that the agent was allowed to self-certify. Checkable criteria constrain this in a way interpretable ones cannot. \u201ccurl\u00a0returns 429\u201d has a failing state. \u201cWell-structured code\u201d does not.\u00a0<\/p>\n<h3 id=\"h-two-defences-that-cost-almost-nothing\" class=\"wp-block-heading\">Two defences that cost almost nothing\u00a0<\/h3>\n<p class=\"wp-block-paragraph\">First, ask for evidence rather than assurance. Tell Claude to show the command it ran and the output it got, not a summary of how it went. Reading evidence takes seconds and is the only way to review a run you were not watching.\u00a0<\/p>\n<p class=\"wp-block-paragraph\">Second, put the anti-gaming rules into the criteria themselves. If the spec says the diff must not add skip markers or\u00a0delete\u00a0assertions, then doing so is a spec violation rather than a clever shortcut:\u00a0<\/p>\n<pre class=\"wp-block-code\"><code>## Verification rules\u00a0\n\n-\u00a0pytest\u00a0exits 0 with zero skipped tests\u00a0\n- git diff adds no @pytest.mark.skip,\u00a0pytest.skip,\u00a0or .only\u00a0\n- git diff\u00a0deletes\u00a0no existing assert lines\u00a0\n- Every criterion in section 2 has at least one test naming it<\/code><\/pre>\n<h3 id=\"h-phase-3-three-ways-specs-drift-mid-build\" class=\"wp-block-heading\">Phase 3: Three Ways Specs Drift Mid-Build\u00a0<\/h3>\n<p class=\"wp-block-paragraph\">Even a good spec loses its grip as a build gets longer. An issue thread from April 2026 categorised the ways this happens, and the categories match what I have seen:\u00a0<\/p>\n<div style=\"overflow-x: auto; margin: 24px 0; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;\">\n<table style=\"width: 100%; border-collapse: collapse; border: 1px solid #d1d5db; font-size: 15px; line-height: 1.5;\">\n<tbody>\n<tr style=\"background-color: #f3f4f6;\">\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\"><strong>Drift mode<\/strong><\/td>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\"><strong>What happens<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">Ignored<\/td>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">The rule is in context and readable, and gets passed over during execution anyway.<\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">Forgotten<\/td>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">Context fills with code as the build progresses, and the rule falls out of effective attention.<\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">Skipped<\/td>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">The rule is read and judged unnecessary for this particular case.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p class=\"wp-block-paragraph\">The blunt summary from that thread, paraphrasing the agent\u2019s own behaviour: it can recite the rules, it just does not follow them. Which tells you something important. A rule living in a document is advisory. Restating it more forcefully does not change its category.\u00a0<\/p>\n<p class=\"wp-block-paragraph\"><strong>What\u00a0actually held:\u00a0<\/strong>of the approaches tried in that thread, only pre-commit hooks proved reliable. A hook is code. It runs\u00a0whether or not\u00a0the rule was in attention.\u00a0<\/p>\n<p class=\"wp-block-paragraph\">A gate script does not need to be clever. Grep the diff for skip markers, check that each criterion identifier in SPEC.md appears in at least one test file, exit non-zero with a readable message. Claude reads the failure and fixes it, which is exactly the loop you want.\u00a0<\/p>\n<h3 id=\"h-phase-4-executing-the-plan-without-losing-the-thread\" class=\"wp-block-heading\">Phase 4: Executing the Plan Without Losing the Thread\u00a0<\/h3>\n<p class=\"wp-block-paragraph\">Once the spec and task list exist, the execution session is where the discipline pays off or does not.\u00a0<\/p>\n<h4 id=\"h-give-the-session-a-goal-condition-not-just-a-prompt\" class=\"wp-block-heading\">Give the session a goal condition, not just a prompt\u00a0<\/h4>\n<p class=\"wp-block-paragraph\">A goal condition is re-checked by an evaluator after every turn, so the session ends when the condition holds rather than when the output looks finished:\u00a0<\/p>\n<pre class=\"wp-block-code\"><code>&gt; \/goal All 5 acceptance criteria in SPEC.md have a passing test,\u00a0\n\u00a0 and git diff --stat shows no changes outside\u00a0src\/auth\/ and\u00a0\n\u00a0 tests\/auth\/<\/code><\/pre>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1914\" height=\"997\" src=\"https:\/\/cdn.analyticsvidhya.com\/wp-content\/uploads\/2026\/08\/image2.webp\" alt=\"Claude Code Interface\" class=\"wp-image-257102\" srcset=\"https:\/\/cdn.analyticsvidhya.com\/wp-content\/uploads\/2026\/08\/image2.webp 1914w, https:\/\/cdn.analyticsvidhya.com\/wp-content\/uploads\/2026\/08\/image2-300x156.webp 300w, https:\/\/cdn.analyticsvidhya.com\/wp-content\/uploads\/2026\/08\/image2-768x400.webp 768w, https:\/\/cdn.analyticsvidhya.com\/wp-content\/uploads\/2026\/08\/image2-1536x800.webp 1536w, https:\/\/cdn.analyticsvidhya.com\/wp-content\/uploads\/2026\/08\/image2-150x78.webp 150w\" sizes=\"auto, (max-width: 1914px) 100vw, 1914px\"\/><\/figure>\n<\/div>\n<p class=\"wp-block-paragraph\">Notice the second clause. Scope creep is the most common way a build technically satisfies a spec while doing things you did not ask for, and it is easy to\u00a0state\u00a0as a checkable condition.\u00a0<\/p>\n<h3 id=\"h-one-task-one-subagent-one-commit-nbsp-nbsp\" class=\"wp-block-heading\"><strong>One task, one subagent, one commit\u00a0<\/strong> \u00a0<\/h3>\n<p class=\"wp-block-paragraph\">For anything past a handful of tasks, give each task its own subagent. Each one starts with a clean context, reads only PLAN.md and the files its task needs, and commits atomically. The exploration and file reading stay out of your main window, and a bad task is one revert rather than an untangling job:\u00a0<\/p>\n<pre class=\"wp-block-code\"><code>&gt; Work through PLAN.md in order. Give each task its own subagent.\u00a0\n\u00a0 One commit per task, and stop if any task fails rather than\u00a0\n\u00a0 working around it.<\/code><\/pre>\n<p class=\"wp-block-paragraph\">The instruction to stop rather than work around a failure is doing real work in that prompt. Task 5 failing because the spec never mentioned Redis is useful information. Task 5 silently being implemented with an in-memory counter is not.\u00a0<\/p>\n<h2 id=\"h-review-with-a-context-that-never-saw-the-plan-being-written\" class=\"wp-block-heading\">Review with a context that never saw the plan being written\u00a0<\/h2>\n<p class=\"wp-block-paragraph\">Before calling it done, have a fresh subagent check the diff against the spec. Because it never saw your reasoning, it judges the result on its own terms:\u00a0<\/p>\n<pre class=\"wp-block-code\"><code>Use a subagent to review the full diff against SPEC.md.\u00a0\nFor each acceptance criterion,\u00a0state\u00a0whether it is implemented\u00a0\nand which test covers it. Flag any file changed that the spec\u00a0\ndid not put in scope. Report gaps, not style preferences.<\/code><\/pre>\n<h2 id=\"h-do-you-still-need-a-framework\" class=\"wp-block-heading\">Do You Still Need a Framework?\u00a0<\/h2>\n<p class=\"wp-block-paragraph\">Most spec-driven development writing from last year assumes you install something. That assumption is worth revisiting, because Claude Code has since shipped native primitives for most of what those frameworks provided.\u00a0<\/p>\n<div style=\"overflow-x: auto; margin: 24px 0; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;\">\n<table style=\"width: 100%; border-collapse: collapse; border: 1px solid #d1d5db; font-size: 15px; line-height: 1.5;\">\n<tbody>\n<tr style=\"background-color: #f3f4f6;\">\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\"><strong>What you need<\/strong><\/td>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\"><strong>Native Claude Code<\/strong><\/td>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\"><strong>Framework<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">Interview to produce a spec<\/td>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">AskUserQuestion in plan mode<\/td>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">Spec Kit \/specify, \/clarify<\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">Read-only planning phase<\/td>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">Plan mode, Ctrl+G to edit<\/td>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">Kiro\u2019s spec phase<\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">Ordered task list<\/td>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">Ask for it in the plan<\/td>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">Spec Kit \/tasks<\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">Condition that gates completion<\/td>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">\/goal with an evaluator<\/td>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">Not typically provided<\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">Hard gate on completion<\/td>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">Stop hook or pre-commit hook<\/td>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">Not typically provided<\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">Task isolation<\/td>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">One subagent per task<\/td>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">BMAD role agents<\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">Reusable workflow<\/td>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">A skill with a slash command<\/td>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">Framework slash commands<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<h2 id=\"h-scaling-to-parallel-work\" class=\"wp-block-heading\">Scaling to Parallel Work\u00a0<\/h2>\n<p class=\"wp-block-paragraph\">One subagent per task is sequential by default. If your task list has independent branches, two options\u00a0open up.\u00a0<\/p>\n<h3 id=\"h-agent-teams\" class=\"wp-block-heading\">Agent teams\u00a0<\/h3>\n<p class=\"wp-block-paragraph\">Agent teams shipped with Opus 4.6 in February 2026 and are still experimental. A lead session spawns teammates, each with its own context window, and they coordinate through a shared task list and a mailbox rather than only reporting back to a parent. You enable it with an environment variable:\u00a0<\/p>\n<pre class=\"wp-block-code\"><code># in\u00a0settings.json\u00a0or your shell\u00a0\nCLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1\u00a0<\/code><\/pre>\n<p class=\"wp-block-paragraph\">The cost is real. Teams use\u00a0roughly seven\u00a0times the tokens of a single session in plan mode, per Claude Code\u2019s own cost documentation. For a multi-module feature where the modules really do not touch, that can still be worth it. For a linear task\u00a0list\u00a0it is waste.\u00a0<\/p>\n<h4 id=\"h-know-the-ceiling\" class=\"wp-block-heading\">Know the ceiling\u00a0<\/h4>\n<p class=\"wp-block-paragraph\">Reported experience puts the practical sweet spot at three to five concurrent agents. Past that, coordination overhead and merge conflicts eat the parallelism. This matches what I have seen: the second and third agent feel like a clear gain, the sixth feels like managing a standup.\u00a0<\/p>\n<p class=\"wp-block-paragraph\">For much larger fan-out, Dynamic Workflows can coordinate far more subagents in a single session, which we covered in\u00a0<a href=\"https:\/\/www.analyticsvidhya.com\/blog\/2026\/05\/claude-opus-4-8-pricing-and-features\/\" target=\"_blank\" rel=\"noreferrer noopener\">our Claude Opus 4.8 article<\/a>. And for how these pieces assemble into repeatable systems rather than one-off runs,\u00a0<a href=\"https:\/\/www.analyticsvidhya.com\/blog\/2026\/07\/loop-engineering-for-ai-agents\/\" target=\"_blank\" rel=\"noreferrer noopener\">Loop Engineering for AI Agents<\/a>\u00a0is the wider view.\u00a0<\/p>\n<h4 id=\"h-honest-limits\" class=\"wp-block-heading\">Honest Limits\u00a0<\/h4>\n<p class=\"wp-block-paragraph\">Things spec-driven development in Claude Code does not give you, which are worth knowing before you bet a production build on it:\u00a0<\/p>\n<div style=\"overflow-x: auto; margin: 24px 0; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;\">\n<table style=\"width: 100%; border-collapse: collapse; border: 1px solid #d1d5db; font-size: 15px; line-height: 1.5;\">\n<tbody>\n<tr style=\"background-color: #f3f4f6;\">\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\"><strong>Limit<\/strong><\/td>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\"><strong>What it means for you<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">No native drift detection<\/td>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">Nothing automatically notices when the build stops matching the spec. A hook is your detection layer.<\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">No guaranteed spec compliance<\/td>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">The spec is context, not a constraint. Only deterministic gates are enforcement.<\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">Multi-agent coordination is not reliable yet<\/td>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">Agent teams remain experimental. Treat parallel work as something to supervise.<\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">Specs go stale<\/td>\n<td style=\"border: 1px solid #d1d5db; padding: 12px 14px;\">A spec written three features ago may describe behaviour that has since changed. Date them and mark what they supersede.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p class=\"wp-block-paragraph\">None of these are reasons to skip the spec. They are reasons to put the enforcement in code rather than in prose.\u00a0<\/p>\n<h2 id=\"h-what-changed-in-how-i-work\" class=\"wp-block-heading\">What Changed in How I Work\u00a0<\/h2>\n<p class=\"wp-block-paragraph\">Spec-driven development gets sold as a <span style=\"text-decoration: underline;\">productivity technique.<\/span> In practice the gain is not speed on any one feature. It is that the failure mode moves to a place where you can catch it.\u00a0<\/p>\n<p class=\"wp-block-paragraph\">Without a spec, a wrong decision surfaces when you read the diff, or later, when something breaks. With one, it surfaces while you are answering an interview question about a case you had not considered. That is a much cheaper place to be wrong.\u00a0<\/p>\n<p class=\"wp-block-paragraph\">The part that took me longest to accept is that the spec is not the artifact doing the work. A document full of intentions is advisory, and an agent optimising for a signal will find the shortest path to that signal. What does the work is the small set of things that can return a non-zero exit code.\u00a0<\/p>\n<p class=\"wp-block-paragraph\"><strong>If you take one thing:\u00a0<\/strong>write every criterion so a command can settle it, then put the ones that matter behind a hook. That single change does more than any amount of\u00a0additional\u00a0spec prose.\u00a0<\/p>\n<p class=\"wp-block-paragraph\">The primitives referenced here come from the\u00a0<a href=\"https:\/\/code.claude.com\/docs\/en\/best-practices\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">official Claude Code best practices documentation<\/a>, and\u00a0<a href=\"https:\/\/github.com\/github\/spec-kit\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">GitHub Spec Kit<\/a>\u00a0is the reference framework implementation if you want to compare. For the session flags and commands used throughout, see\u00a0<a href=\"https:\/\/www.analyticsvidhya.com\/blog\/2026\/07\/hidden-claude-code-cli-commands\/\" target=\"_blank\" rel=\"noreferrer noopener\">the CLI commands worth knowing<\/a>.\u00a0<\/p>\n<h2 id=\"h-frequently-asked-questions-nbsp\" class=\"wp-block-heading\"><strong>Frequently Asked Questions<\/strong>\u00a0<\/h2>\n<div class=\"schema-faq wp-block-yoast-faq-block\">\n<div class=\"schema-faq-section\" id=\"faq-question-1787310517405\"><strong class=\"schema-faq-question\">Q1. <strong>How long should a spec be?<\/strong>\u00a0<\/strong> <\/p>\n<p class=\"schema-faq-answer\">A. Long enough to remove the decisions you care about, and no longer. A spec for a feature of a few days\u2019 work is usually one to two pages. If it is longer than the code it produces, you are writing documentation rather than a spec. The test is whether each line removes a decision Claude would otherwise make.\u00a0<\/p>\n<\/p><\/div>\n<div class=\"schema-faq-section\" id=\"faq-question-1787310527985\"><strong class=\"schema-faq-question\">Q2. <strong>Is spec-driven development the same as test-driven development?<\/strong>\u00a0<\/strong> <\/p>\n<p class=\"schema-faq-answer\">A. They are related but the primary artifact differs. TDD treats a failing test as the thing you write first. SDD treats the specification as primary, with the tests generated from its acceptance criteria. In practice they compose well: write criteria in a shape that maps to test cases, and the first execution task becomes writing those tests.\u00a0<\/p>\n<\/p><\/div>\n<div class=\"schema-faq-section\" id=\"faq-question-1787310537461\"><strong class=\"schema-faq-question\">Q3.<strong> Why must execution happen in a separate session?<\/strong>\u00a0<\/strong> <\/p>\n<p class=\"schema-faq-answer\">A. By the end of planning your context is full of rejected options and files read during exploration. Implementing in that same window means every decision is reasoned against discarded alternatives, and you burn context you will need for the build. A fresh session reads the spec as a document, which is what it was written to be.\u00a0<\/p>\n<\/p><\/div>\n<\/p><\/div>\n<div class=\"border-top py-3 author-info my-4\">\n<div class=\"author-card d-flex align-items-center\">\n<div class=\"flex-shrink-0 overflow-hidden\">\n                                    <a href=\"https:\/\/www.analyticsvidhya.com\/blog\/author\/sreevamsi\/\" class=\"text-decoration-none active-avatar\"><br \/>\n                                                                       <img decoding=\"async\" src=\"https:\/\/cdn.analyticsvidhya.com\/wp-content\/uploads\/2026\/07\/cropped-sree-vamsi-96x96.png\" width=\"48\" height=\"48\" alt=\"Sree Vamsi\" loading=\"lazy\" class=\"rounded-circle\"\/><br \/>\n                                                                <\/a>\n                                <\/div>\n<\/p><\/div>\n<p>Hi , I am Sree Vamsi a passionate Data Science enthusiast currently working at Analytics Vidhya. My journey into data science began with a curiosity for uncovering insights from complex data and has evolved into building end-to-end Generative AI applications, RAG pipelines, agentic AI workflows, and multi-agent systems that solve real-world business problems.<\/p>\n<\/p><\/div>\n<\/p><\/div>\n<p><h4 class=\"fs-24 text-dark\">Login to continue reading and enjoy expert-curated content.<\/h4>\n<p>                        <button class=\"btn btn-primary mx-auto d-table\" data-bs-toggle=\"modal\" data-bs-target=\"#loginModal\" id=\"readMoreBtn\">Keep Reading for Free<\/button>\n                    <\/p>\n\n","protected":false},"excerpt":{"rendered":"<p>I have written enough specs for Claude Code now to have hit the failure mode nobody warns you about.\u00a0 The spec was fine. The plan was fine. Claude worked through the tasks, ran the test suite, and reported everything passing. I looked at the diff properly the next morning and found it had converted a [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":7045030,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12033],"tags":[13259,11230,2993,2059,2058,207526],"dealstore":[],"offerexpiration":[],"class_list":["post-7045028","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-analytics","tag-claude","tag-code","tag-development","tag-guide","tag-practical","tag-specdriven"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Spec-Driven Development with Claude Code: A Practical Guide - Som2ny Network<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fivemor.com\/?p=7045028\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Spec-Driven Development with Claude Code: A Practical Guide - Som2ny Network\" \/>\n<meta property=\"og:description\" content=\"I have written enough specs for Claude Code now to have hit the failure mode nobody warns you about.\u00a0 The spec was fine. The plan was fine. Claude worked through the tasks, ran the test suite, and reported everything passing. I looked at the diff properly the next morning and found it had converted a [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fivemor.com\/?p=7045028\" \/>\n<meta property=\"og:site_name\" content=\"Som2ny Network\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-23T15:24:19+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/fivemor.com\/wp-content\/uploads\/2026\/08\/Spec-drive-dev.webp.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"872\" \/>\n\t<meta property=\"og:image:height\" content=\"473\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/webp\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"15 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fivemor.com\/?p=7045028#article\",\"isPartOf\":{\"@id\":\"https:\/\/fivemor.com\/?p=7045028\"},\"author\":{\"name\":\"admin\",\"@id\":\"https:\/\/fivemor.com\/#\/schema\/person\/b85e3c3dc0e1daea076524dc8810c371\"},\"headline\":\"Spec-Driven Development with Claude Code: A Practical Guide\",\"datePublished\":\"2026-08-23T15:24:19+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fivemor.com\/?p=7045028\"},\"wordCount\":2710,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fivemor.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/fivemor.com\/?p=7045028#primaryimage\"},\"thumbnailUrl\":\"https:\/\/fivemor.com\/wp-content\/uploads\/2026\/08\/Spec-drive-dev.webp.webp\",\"keywords\":[\"Claude\",\"Code\",\"Development\",\"Guide\",\"Practical\",\"SpecDriven\"],\"articleSection\":[\"Analytics\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fivemor.com\/?p=7045028#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fivemor.com\/?p=7045028\",\"url\":\"https:\/\/fivemor.com\/?p=7045028\",\"name\":\"Spec-Driven Development with Claude Code: A Practical Guide - Som2ny Network\",\"isPartOf\":{\"@id\":\"https:\/\/fivemor.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/fivemor.com\/?p=7045028#primaryimage\"},\"image\":{\"@id\":\"https:\/\/fivemor.com\/?p=7045028#primaryimage\"},\"thumbnailUrl\":\"https:\/\/fivemor.com\/wp-content\/uploads\/2026\/08\/Spec-drive-dev.webp.webp\",\"datePublished\":\"2026-08-23T15:24:19+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fivemor.com\/?p=7045028#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fivemor.com\/?p=7045028\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/fivemor.com\/?p=7045028#primaryimage\",\"url\":\"https:\/\/fivemor.com\/wp-content\/uploads\/2026\/08\/Spec-drive-dev.webp.webp\",\"contentUrl\":\"https:\/\/fivemor.com\/wp-content\/uploads\/2026\/08\/Spec-drive-dev.webp.webp\",\"width\":872,\"height\":473},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fivemor.com\/?p=7045028#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/fivemor.com\/?bp_activities=1\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Spec-Driven Development with Claude Code: A Practical Guide\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fivemor.com\/#website\",\"url\":\"https:\/\/fivemor.com\/\",\"name\":\"Som2ny Network\",\"description\":\"Daily Deals\",\"publisher\":{\"@id\":\"https:\/\/fivemor.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fivemor.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/fivemor.com\/#organization\",\"name\":\"Som2ny Network\",\"url\":\"https:\/\/fivemor.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/fivemor.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/fivemor.com\/wp-content\/uploads\/2026\/07\/4a0953c4-logo-300x86-1.png\",\"contentUrl\":\"https:\/\/fivemor.com\/wp-content\/uploads\/2026\/07\/4a0953c4-logo-300x86-1.png\",\"width\":300,\"height\":86,\"caption\":\"Som2ny Network\"},\"image\":{\"@id\":\"https:\/\/fivemor.com\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/fivemor.com\/#\/schema\/person\/b85e3c3dc0e1daea076524dc8810c371\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/fivemor.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/729ae85bf62b9917e93538db2f2688ca?s=96&r=g&default=https%3A%2F%2Ffivemor.com%2Fwp-content%2Fplugins%2Fbuddypress-first-letter-avatar%2Fimages%2Fdefault%2F96%2Flatin_a.png\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/729ae85bf62b9917e93538db2f2688ca?s=96&r=g&default=https%3A%2F%2Ffivemor.com%2Fwp-content%2Fplugins%2Fbuddypress-first-letter-avatar%2Fimages%2Fdefault%2F96%2Flatin_a.png\",\"caption\":\"admin\"},\"sameAs\":[\"https:\/\/fivemor.com\"],\"url\":\"https:\/\/fivemor.com\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Spec-Driven Development with Claude Code: A Practical Guide - Som2ny Network","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fivemor.com\/?p=7045028","og_locale":"en_US","og_type":"article","og_title":"Spec-Driven Development with Claude Code: A Practical Guide - Som2ny Network","og_description":"I have written enough specs for Claude Code now to have hit the failure mode nobody warns you about.\u00a0 The spec was fine. The plan was fine. Claude worked through the tasks, ran the test suite, and reported everything passing. I looked at the diff properly the next morning and found it had converted a [&hellip;]","og_url":"https:\/\/fivemor.com\/?p=7045028","og_site_name":"Som2ny Network","article_published_time":"2026-08-23T15:24:19+00:00","og_image":[{"width":872,"height":473,"url":"https:\/\/fivemor.com\/wp-content\/uploads\/2026\/08\/Spec-drive-dev.webp.webp","type":"image\/webp"}],"author":"admin","twitter_card":"summary_large_image","twitter_misc":{"Written by":"admin","Est. reading time":"15 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fivemor.com\/?p=7045028#article","isPartOf":{"@id":"https:\/\/fivemor.com\/?p=7045028"},"author":{"name":"admin","@id":"https:\/\/fivemor.com\/#\/schema\/person\/b85e3c3dc0e1daea076524dc8810c371"},"headline":"Spec-Driven Development with Claude Code: A Practical Guide","datePublished":"2026-08-23T15:24:19+00:00","mainEntityOfPage":{"@id":"https:\/\/fivemor.com\/?p=7045028"},"wordCount":2710,"commentCount":0,"publisher":{"@id":"https:\/\/fivemor.com\/#organization"},"image":{"@id":"https:\/\/fivemor.com\/?p=7045028#primaryimage"},"thumbnailUrl":"https:\/\/fivemor.com\/wp-content\/uploads\/2026\/08\/Spec-drive-dev.webp.webp","keywords":["Claude","Code","Development","Guide","Practical","SpecDriven"],"articleSection":["Analytics"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fivemor.com\/?p=7045028#respond"]}]},{"@type":"WebPage","@id":"https:\/\/fivemor.com\/?p=7045028","url":"https:\/\/fivemor.com\/?p=7045028","name":"Spec-Driven Development with Claude Code: A Practical Guide - Som2ny Network","isPartOf":{"@id":"https:\/\/fivemor.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/fivemor.com\/?p=7045028#primaryimage"},"image":{"@id":"https:\/\/fivemor.com\/?p=7045028#primaryimage"},"thumbnailUrl":"https:\/\/fivemor.com\/wp-content\/uploads\/2026\/08\/Spec-drive-dev.webp.webp","datePublished":"2026-08-23T15:24:19+00:00","breadcrumb":{"@id":"https:\/\/fivemor.com\/?p=7045028#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fivemor.com\/?p=7045028"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/fivemor.com\/?p=7045028#primaryimage","url":"https:\/\/fivemor.com\/wp-content\/uploads\/2026\/08\/Spec-drive-dev.webp.webp","contentUrl":"https:\/\/fivemor.com\/wp-content\/uploads\/2026\/08\/Spec-drive-dev.webp.webp","width":872,"height":473},{"@type":"BreadcrumbList","@id":"https:\/\/fivemor.com\/?p=7045028#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/fivemor.com\/?bp_activities=1"},{"@type":"ListItem","position":2,"name":"Spec-Driven Development with Claude Code: A Practical Guide"}]},{"@type":"WebSite","@id":"https:\/\/fivemor.com\/#website","url":"https:\/\/fivemor.com\/","name":"Som2ny Network","description":"Daily Deals","publisher":{"@id":"https:\/\/fivemor.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fivemor.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/fivemor.com\/#organization","name":"Som2ny Network","url":"https:\/\/fivemor.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/fivemor.com\/#\/schema\/logo\/image\/","url":"https:\/\/fivemor.com\/wp-content\/uploads\/2026\/07\/4a0953c4-logo-300x86-1.png","contentUrl":"https:\/\/fivemor.com\/wp-content\/uploads\/2026\/07\/4a0953c4-logo-300x86-1.png","width":300,"height":86,"caption":"Som2ny Network"},"image":{"@id":"https:\/\/fivemor.com\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/fivemor.com\/#\/schema\/person\/b85e3c3dc0e1daea076524dc8810c371","name":"admin","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/fivemor.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/729ae85bf62b9917e93538db2f2688ca?s=96&r=g&default=https%3A%2F%2Ffivemor.com%2Fwp-content%2Fplugins%2Fbuddypress-first-letter-avatar%2Fimages%2Fdefault%2F96%2Flatin_a.png","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/729ae85bf62b9917e93538db2f2688ca?s=96&r=g&default=https%3A%2F%2Ffivemor.com%2Fwp-content%2Fplugins%2Fbuddypress-first-letter-avatar%2Fimages%2Fdefault%2F96%2Flatin_a.png","caption":"admin"},"sameAs":["https:\/\/fivemor.com"],"url":"https:\/\/fivemor.com\/?author=1"}]}},"_links":{"self":[{"href":"https:\/\/fivemor.com\/index.php?rest_route=\/wp\/v2\/posts\/7045028","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fivemor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fivemor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fivemor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fivemor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=7045028"}],"version-history":[{"count":0,"href":"https:\/\/fivemor.com\/index.php?rest_route=\/wp\/v2\/posts\/7045028\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/fivemor.com\/index.php?rest_route=\/wp\/v2\/media\/7045030"}],"wp:attachment":[{"href":"https:\/\/fivemor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=7045028"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fivemor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=7045028"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fivemor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=7045028"},{"taxonomy":"dealstore","embeddable":true,"href":"https:\/\/fivemor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fdealstore&post=7045028"},{"taxonomy":"offerexpiration","embeddable":true,"href":"https:\/\/fivemor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fofferexpiration&post=7045028"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}