{"id":13807,"date":"2026-05-26T22:13:37","date_gmt":"2026-05-26T22:13:37","guid":{"rendered":"https:\/\/cheesecakelabs.com\/blog\/"},"modified":"2026-05-26T22:13:39","modified_gmt":"2026-05-26T22:13:39","slug":"spec-driven-development","status":"publish","type":"post","link":"https:\/\/cheesecakelabs.com\/blog\/spec-driven-development\/","title":{"rendered":"Spec-Driven Development: How to Capture Intent Before You Burn Tokens"},"content":{"rendered":"\n<p>In February 2025, Andrej Karpathy tweeted a phrase that stuck: &#8220;There&#8217;s a new kind of coding I call vibe coding, where you fully give in to the vibes, embrace exponentials, and forget that the code even exists.&#8221; He was being half-serious. The tweet has <strong>4.5 million views,<\/strong> and Karpathy later called it &#8220;a shower of thoughts throwaway.&#8221; The phrase did not stay a throwaway \u2014 it became the shorthand for an entire failure mode.<\/p>\n\n\n\n<p>The failure looks like this. A senior engineer prompts an agent: &#8220;Build me a checkout flow with Stripe, auth, and email confirmation.&#8221; The agent runs for 35 minutes, modifies forty-seven files, and produces 3,200 lines of code.<\/p>\n\n\n\n<p>The engineer opens the diff and finds that some of it works, some does not compile, the <strong>Stripe integration uses a deprecated API<\/strong>, the email confirmation logic is wired to a service that does not exist, and the auth flow looks correct but silently bypasses the rate limiter. None of this is caught in code review because there is simply too much of it to read.<\/p>\n\n\n\n<p>The reaction in most teams is to slow the agent down, smaller prompts, closer supervision, reverting to era-two pair programming with extra steps. That is not the right move. The right move is to write the spec down before the agent runs, not in the conversation but in the repo, as a markdown file, with enough detail that the agent, the next engineer, the QA gate, and the reviewer are all working from the same source of truth. <\/p>\n\n\n\n<p>That is <strong>Spec-Driven Development<\/strong> <strong>(SDD)<\/strong>, the most useful discipline I have adopted at Cheesecake Labs, and one I have watched cut feature cycle times by half on the right kinds of work.<\/p>\n\n\n\n<center><blockquote class=\"twitter-tweet\"><p lang=\"en\" dir=\"ltr\">There&#39;s a new kind of coding I call &quot;vibe coding&quot;, where you fully give in to the vibes, embrace exponentials, and forget that the code even exists. It&#39;s possible because the LLMs (e.g. Cursor Composer w Sonnet) are getting too good. Also I just talk to Composer with SuperWhisper\u2026<\/p>&mdash; Andrej Karpathy (@karpathy) <a href=\"https:\/\/twitter.com\/karpathy\/status\/1886192184808149383?ref_src=twsrc%5Etfw\">February 2, 2025<\/a><\/blockquote> <\/center><script async src=\"https:\/\/platform.twitter.com\/widgets.js\" charset=\"utf-8\"><\/script>\n\n\n\n<h2 class=\"wp-block-heading\">The six ways agents fail at scale<\/h2>\n\n\n\n<p>Before I talk about what Spec-Driven Development fixes, I want to be specific about the failure modes it is trying to address. Most teams talk about &#8220;agents not being reliable&#8221; as if it were one problem. It is six.<\/p>\n\n\n\n<p><strong>The first is the one-shot hero:<\/strong> the agent tries to build the entire feature in a single window, runs out of context budget, starts losing coherence past 200K tokens, and ships something that looks finished but breaks at integration. This is what vibe coding looks like up close.<\/p>\n\n\n\n<p><strong>The second is the premature victory. <\/strong>The agent declares the task done with major pieces still missing \u2014 it shipped the happy path, skipped the error handling, and called itself complete. You discover the gaps in QA, or worse, in production.<\/p>\n\n\n\n<p><strong>The third is cross-session amnesia. <\/strong>A new window has zero memory of what came before, so decisions made yesterday have to be rediscovered today, constraints that took thirty minutes to articulate get forgotten on the next prompt, and you pay for the same thinking twice.<\/p>\n\n\n\n<p><strong>The fourth is fake done.<\/strong> The agent ran a curl command, got a 200 response, and considers the integration working. It does not test the unhappy paths, does not verify the contract, and moves on after seeing a successful HTTP code. The bug ships.<\/p>\n\n\n\n<p><strong>The fifth is self-judgment: <\/strong>the same agent that implemented the feature also decides whether it is complete. The executor approves itself \u2014 structurally the same conflict of interest as a developer reviewing their own pull request, except the agent has no professional reputation to protect.<\/p>\n\n\n\n<p><strong>The sixth is accumulated slop. <\/strong>Each individual feature compiles, passes tests, and ships, but the architecture drifts and the conventions degrade. After 100 features built this way, the codebase is technically functional and structurally garbage. The agent did not violate any rule explicitly \u2014 it just never had one to follow.<\/p>\n\n\n\n<p>These are not theoretical. We see all six at clients, often in the same engagement, and they are not the agent being bad at its job. They are predictable failure modes of unsupervised execution. SDD addresses the first three directly and sets up the conditions for the system to handle the other three.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>Read more: <\/strong><a href=\"https:\/\/cheesecakelabs.com\/blog\/three-eras-of-software\/\" target=\"_blank\" rel=\"noreferrer noopener\">The Three Eras of Software: From Autocomplete to Agentic Development<\/a><\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">What Spec-Driven Development actually is<\/h2>\n\n\n\n<p>Spec-Driven Development (SDD) is the practice of writing a structured specification in the repo, as versioned markdown, before an agent writes a single line of code. It is organized into four phases, with names that vary by toolkit but a shape that stays the same.<\/p>\n\n\n\n<p><strong>Phase one is Specify: <\/strong>You sit with an agent in <a href=\"https:\/\/cheesecakelabs.com\/blog\/plan-mode-claude-code\/\" target=\"_blank\" rel=\"noreferrer noopener\">plan mode<\/a> and write the spec \u2014 not &#8220;build a checkout flow,&#8221; but a real spec: what is the user problem, who is in scope, what are the acceptance criteria, what is explicitly out of scope, what edge cases matter. The output is a markdown file, typically spec.md, that the engineer and the agent agree on before anything else happens.<\/p>\n\n\n\n<p><strong>Phase two is Design. <\/strong>Given the spec, the agent proposes an architecture, a sequence of operations, the data model, the components, the API contracts, and the key decisions. The output is design.md. The human reviews it, pushes back on what is wrong, and confirms what is right.<\/p>\n\n\n\n<p><strong>Phase three is Tasks.<\/strong> The design gets decomposed into atomic, ordered tasks \u2014 each one small enough to fit in a single context window with room to spare, each one with clear acceptance criteria, each one independently testable. The output is <em><strong>tasks.md.<\/strong><\/em><\/p>\n\n\n\n<p><strong>Phase four is Execute. <\/strong>Subagents take tasks off the list, implement them, and update state. Each runs in a new window, reads the spec, the design, and the relevant task, and produces code for that task only. The state of the work lives in tasks.md, not in any agent&#8217;s memory.<\/p>\n\n\n\n<p>The same four phases show up under different names across the tooling. <a href=\"https:\/\/kiro.dev\/blog\/general-availability\/\" target=\"_blank\" rel=\"noreferrer noopener\">AWS Kiro<\/a> uses Requirements, Design, Tasks (and writes its requirements in EARS notation, &#8220;WHEN [condition] THE SYSTEM SHALL [behavior]&#8221;). <a href=\"https:\/\/github.com\/github\/spec-kit\" target=\"_blank\" rel=\"noreferrer noopener\">GitHub Spec Kit<\/a> uses Spec, Plan, Tasks, Implement. What we use at Cheesecake Labs, follows the Specify, Design, Tasks, Execute and auto-sizes the depth of each phase to the complexity of the work. The differences are real but not strategic. Pick one. Use it.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Why writing the spec to a file changes everything<\/h2>\n\n\n\n<p>Most engineers I talk to nod at the idea of writing a spec and then carry on doing the work in chat. The &#8220;spec&#8221; lives in the conversation. The <a href=\"https:\/\/cheesecakelabs.com\/blog\/what-is-artificial-intelligence\/\" target=\"_blank\" rel=\"noreferrer noopener\">Artificial Intelligence<\/a> agent&#8217;s understanding of the feature lives in the agent&#8217;s head. Nothing is durable.<\/p>\n\n\n\n<p>Most engineers I talk to nod at the idea of writing a spec and then carry on doing the work in chat. The &#8220;spec&#8221; lives in the conversation, the agent&#8217;s understanding of the feature lives in the agent&#8217;s head, and nothing is durable. The single insight of SDD that I want every engineer to internalize is this: the spec is the artifact, not the conversation.<\/p>\n\n\n\n<p>Three things flip the moment the spec is a file in the repo.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">The spec survives the session<\/h3>\n\n\n\n<p>The next agent that picks up a task reads the spec. The next engineer that joins the project reads the spec. The QA agent that validates the implementation reads the spec. The pull request reviewer reads the spec. Everyone gets the same source of truth, and you stop paying for the same conversation three times.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">The spec is reviewable<\/h3>\n\n\n\n<p>A pull request describing five files of code is hard to review; a pull request that says &#8220;implements task 4 of docs\/specs\/checkout.md&#8221; is easy to review against the original intent. The reviewer can read what was agreed on, then read the diff, and ask whether one matches the other. The conversation moves up a level, from line-by-line to intent-to-implementation.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">The spec is composable<\/h3>\n\n\n\n<p>You can have one agent specify, another design, a third break down tasks, a fourth implement, and a fifth judge \u2014 with each agent&#8217;s input and output being a markdown file or code. The whole pipeline is just files, which is how a single engineer can change ninety files across a feature without ever blowing past 50K tokens in any one window.<\/p>\n\n\n\n<p>Sean Grove (OpenAI) made the most provocative version of this argument in his AI Engineer World&#8217;s Fair talk last year. His claim: &#8220;the code you write represents only 10 to 20% of the value you bring as a programmer; the other <strong>80 to 90% lies in structured communication.<\/strong>&#8221; His framing is that the spec is the actual product and code is the compiled output. SDD is the practical implementation of that idea.<\/p>\n\n\n\n<p>Or as the GitHub Spec Kit team puts it in their open-source toolkit, the core mental model is &#8220;specifications don&#8217;t serve code, code serves specifications.&#8221; The hierarchy is the opposite of what most engineers internalized over the last twenty years.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>Read more: <\/strong><a href=\"https:\/\/cheesecakelabs.com\/blog\/agent-skills-for-workflows-into-rules-file\/\" target=\"_blank\" rel=\"noreferrer noopener\">Agent Skills: Stop Stuffing Workflows Into Your Rules File<\/a><\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">The toolkits from SDD<\/h2>\n\n\n\n<p>There is no strong reason to prefer one SDD toolkit over another, they all work, and the more important decision is to pick one and stay consistent.<\/p>\n\n\n\n<p><a href=\"https:\/\/kiro.dev\">AWS Kiro<\/a> is Amazon&#8217;s spec-driven IDE. It launched in preview on July 15, 2025, hit general availability on November 17, 2025, and the launch team reported 250,000+ developers in the first three months. It is opinionated about the workflow \u2014 three files, EARS notation for requirements, structured design with sequence diagrams, trackable tasks \u2014 and if you want the spec workflow baked into the IDE without having to think about the harness, Kiro is the simplest path.<\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/github\/spec-kit\">GitHub Spec Kit<\/a> is the open-source alternative: MIT-licensed, compatible with 30+ coding <a href=\"https:\/\/cheesecakelabs.com\/blog\/ai-agents-vs-ai-systems-software-architecture\/\" target=\"_blank\" rel=\"noreferrer noopener\">AI agents<\/a> including Claude Code, Copilot, and Gemini CLI. The workflow follows Spec, Plan, Tasks, Implement, and the repo includes templates, slash commands, and a methodology document called spec-driven.md that is worth reading even if you do not adopt the toolkit. The advantage is portability \u2014 your specs do not live inside a specific IDE.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Where SDD alone falls short<\/h2>\n\n\n\n<p>SDD addresses the one-shot hero, premature victory, and cross-session amnesia directly. The spec prevents the agent from trying to build the whole feature in one window. The task breakdown prevents premature victory because each task has acceptance criteria. The markdown files solve cross-session amnesia by persisting decisions outside any agent&#8217;s memory.<\/p>\n\n\n\n<p>What SDD does not address on its own are fake done, self-judgment, and accumulated slop \u2014 those are not spec problems, they are execution and review problems.<\/p>\n\n\n\n<p>Fake done is fixed by completion gates the agent cannot bypass: lint, typecheck, and tests on every commit; diff coverage that verifies the diff actually addresses the spec; a faithfulness check that compares the implementation back to the design. None of these are part of the spec, they are part of the harness.<\/p>\n\n\n\n<p>Self-judgment is fixed by introducing a separate judge agent. The executor ships the implementation, and a second model \u2014 with no context other than the spec and the diff \u2014 evaluates whether the implementation meets the acceptance criteria. The executor cannot grade itself. We call this <a href=\"https:\/\/arxiv.org\/abs\/2306.05685\">LLM-as-Judge<\/a> (the original pattern from Zheng et al., 2023), and at Cheesecake Labs we run it on every non-trivial PR.<\/p>\n\n\n\n<p>Accumulated slop is fixed by architectural conventions encoded in the harness: <em><strong>CLAUDE.md<\/strong><\/em> files at the project root that capture conventions, skills that encode the right way to do common tasks, and code review agents that enforce them. Without those, even a perfect spec gets executed in ways that drift the architecture.<\/p>\n\n\n\n<p><a href=\"https:\/\/martinfowler.com\/articles\/exploring-gen-ai.html\">Kief Morris at Thoughtworks<\/a> has the cleanest framing for this. In his March 2026 piece &#8220;Humans and Agents in Software Engineering Loops&#8221;, he distinguishes three roles. &#8220;In the loop&#8221; is the engineer who reviews every agent output line by line \u2014 the bottleneck. &#8220;On the loop&#8221; is the engineer who designs and maintains the mechanisms that guide and validate agent behavior, building the harness including the spec workflow and the gates.<\/p>\n\n\n\n<p>&#8220;Out of the loop&#8221; is the case where the harness is mature enough that the agent can run largely autonomously, with the human auditing aggregate outputs. SDD is what gets you from &#8220;in the loop&#8221; to &#8220;on the loop.&#8221; The harness is what gets you to &#8220;out of the loop&#8221; safely. SDD without a harness leaves you stuck with a stack of nicely written specs that still get shipped wrong.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">How do I use Spec-Driven Development<\/h2>\n\n\n\n<p>Four moves to put on the table this quarter.<\/p>\n\n\n\n<p>First, pick an SDD toolkit and standardize on it. Whether that is <a href=\"https:\/\/kiro.dev\" target=\"_blank\" rel=\"noreferrer noopener\">Kiro<\/a>, <a href=\"https:\/\/github.com\/github\/spec-kit\" target=\"_blank\" rel=\"noreferrer noopener\">Spec Kit<\/a>, or a set of internal skills, the wrong move is leaving each engineer to invent their own spec workflow. Commit to one shape and use it for everything over a defined threshold \u2014 we use &#8220;anything that touches more than two files.&#8221; The variance you eliminate by standardizing is worth more than the variance you preserve by staying flexible.<\/p>\n\n\n\n<p>Commit specs to the repo. Every approved spec lives in <strong><em>docs\/specs\/&lt;feature>\/<\/em><\/strong> with spec.md, design.md, and tasks.md. Pull requests reference the spec they implement, and the spec is reviewed in code review like code is. This single move makes the entire team&#8217;s planning legible to itself and to future hires.<\/p>\n\n\n\n<p>Add the completion gates in order of cost. Lint, typecheck, and tests on every PR are table stakes. Then diff coverage that verifies the implementation touched the right files, a faithfulness check comparing the implementation to the design, and a judge agent that evaluates against the acceptance criteria in the spec. Cheap filters run first; the judge agent runs only on PRs that pass them.<\/p>\n\n\n\n<p>For last, separate the executor from the judge. <strong>No agent grades its own work<\/strong> \u2014 the agent that implemented the feature does not get to declare it done. A separate model, ideally a different one (we run Opus 4.7 as judge over implementations done with Sonnet 4.6), reads the spec and the diff and produces an explicit accept or reject with reasons. The executor sees the rejection and retries with feedback. This is the single highest-leverage move you can make on output quality.<\/p>\n\n\n\n<p><strong>The order matters:<\/strong> get the spec workflow in place first, because the gates and the judge both depend on having a spec to validate against. Without the spec, the gates have nothing to check.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Closing thought<\/h2>\n\n\n\n<p>The agents available in 2026 are good. The bottleneck is the surrounding system: how intent gets captured, how completion gets verified, and how architecture stays coherent over hundreds of features. Specs are the cheapest leverage in that system.<\/p>\n\n\n\n<p>They cost minutes to write, they survive sessions, and they make every other gate possible. If your team has not made the move from &#8220;spec in the chat&#8221; to &#8220;spec in the repo,&#8221; that is the next thirty days of work. Then comes the harness.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"http:\/\/cheesecakelabs.com\/services\/\"><img decoding=\"async\" width=\"1200\" height=\"409\" src=\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2023\/06\/legacy-app-ckl-1200x409.jpg\" alt=\"\" class=\"wp-image-13491\" srcset=\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2023\/06\/legacy-app-ckl-1200x409.jpg 1200w, https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2023\/06\/legacy-app-ckl-600x205.jpg 600w, https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2023\/06\/legacy-app-ckl-768x262.jpg 768w, https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2023\/06\/legacy-app-ckl-1536x524.jpg 1536w, https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2023\/06\/legacy-app-ckl-760x259.jpg 760w, https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2023\/06\/legacy-app-ckl.jpg 1920w\" sizes=\"(max-width: 1200px) 100vw, 1200px\" \/><\/a><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>In February 2025, Andrej Karpathy tweeted a phrase that stuck: &#8220;There&#8217;s a new kind of coding I call vibe coding, where you fully give in to the vibes, embrace exponentials, and forget that the code even exists.&#8221; He was being half-serious. The tweet has 4.5 million views, and Karpathy later called it &#8220;a shower of [&hellip;]<\/p>\n","protected":false},"author":92,"featured_media":13812,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1288,432,1162],"tags":[1395,1397,1396],"class_list":["post-13807","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-artificial-intelligence","category-engineering","category-process","tag-ai-agent","tag-sdd","tag-spec-driven-development"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.1.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Spec-Driven Development: How to Capture Intent Before You Burn Tokens<\/title>\n<meta name=\"description\" content=\"Spec-Driven Development captures intent in markdown files before agents write code. Here is how SDD works, what it fixes, and more.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/cheesecakelabs.com\/blog\/spec-driven-development\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Spec-Driven Development: How to Capture Intent Before You Burn Tokens\" \/>\n<meta property=\"og:description\" content=\"Spec-Driven Development captures intent in markdown files before agents write code. Here is how SDD works, what it fixes, and more.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cheesecakelabs.com\/blog\/spec-driven-development\/\" \/>\n<meta property=\"og:site_name\" content=\"Cheesecake Labs\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/cheesecakelabs\" \/>\n<meta property=\"article:published_time\" content=\"2026-05-26T22:13:37+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-05-26T22:13:39+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2026\/05\/what-is-Spec-Driven-Development.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1536\" \/>\n\t<meta property=\"og:image:height\" content=\"689\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Cheesecake Labs\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@cheesecakelabs\" \/>\n<meta name=\"twitter:site\" content=\"@cheesecakelabs\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/spec-driven-development\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/spec-driven-development\/\"},\"author\":{\"name\":\"Douglas da Silva\"},\"headline\":\"Spec-Driven Development: How to Capture Intent Before You Burn Tokens\",\"datePublished\":\"2026-05-26T22:13:37+00:00\",\"dateModified\":\"2026-05-26T22:13:39+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/spec-driven-development\/\"},\"wordCount\":2481,\"image\":{\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/spec-driven-development\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2026\/05\/what-is-Spec-Driven-Development.jpg\",\"keywords\":[\"AI agent\",\"sdd\",\"spec-driven development\"],\"articleSection\":[\"Artificial Intelligence\",\"Engineering\",\"Process\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/spec-driven-development\/\",\"url\":\"https:\/\/cheesecakelabs.com\/blog\/spec-driven-development\/\",\"name\":\"Spec-Driven Development: How to Capture Intent Before You Burn Tokens\",\"isPartOf\":{\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/spec-driven-development\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/spec-driven-development\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2026\/05\/what-is-Spec-Driven-Development.jpg\",\"datePublished\":\"2026-05-26T22:13:37+00:00\",\"dateModified\":\"2026-05-26T22:13:39+00:00\",\"author\":{\"@type\":\"person\",\"name\":\"Douglas da Silva\"},\"description\":\"Spec-Driven Development captures intent in markdown files before agents write code. Here is how SDD works, what it fixes, and more.\",\"breadcrumb\":{\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/spec-driven-development\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cheesecakelabs.com\/blog\/spec-driven-development\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/spec-driven-development\/#primaryimage\",\"url\":\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2026\/05\/what-is-Spec-Driven-Development.jpg\",\"contentUrl\":\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2026\/05\/what-is-Spec-Driven-Development.jpg\",\"width\":1536,\"height\":689},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/spec-driven-development\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cheesecakelabs.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Spec-Driven Development: How to Capture Intent Before You Burn Tokens\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/#website\",\"url\":\"https:\/\/cheesecakelabs.com\/blog\/\",\"name\":\"Cheesecake Labs\",\"description\":\"Nearshore outsourcing company for Web and Mobile design and engineering services, and staff augmentation for startups and enterprises..\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/cheesecakelabs.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"name\":\"Douglas da Silva\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2017\/06\/douglas-da-silva.jpeg\",\"contentUrl\":\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2017\/06\/douglas-da-silva.jpeg\",\"caption\":\"Douglas da Silva\"},\"url\":\"https:\/\/cheesecakelabs.com\/blog\/autor\/douglasgimli\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Spec-Driven Development: How to Capture Intent Before You Burn Tokens","description":"Spec-Driven Development captures intent in markdown files before agents write code. Here is how SDD works, what it fixes, and more.","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:\/\/cheesecakelabs.com\/blog\/spec-driven-development\/","og_locale":"en_US","og_type":"article","og_title":"Spec-Driven Development: How to Capture Intent Before You Burn Tokens","og_description":"Spec-Driven Development captures intent in markdown files before agents write code. Here is how SDD works, what it fixes, and more.","og_url":"https:\/\/cheesecakelabs.com\/blog\/spec-driven-development\/","og_site_name":"Cheesecake Labs","article_publisher":"https:\/\/www.facebook.com\/cheesecakelabs","article_published_time":"2026-05-26T22:13:37+00:00","article_modified_time":"2026-05-26T22:13:39+00:00","og_image":[{"width":1536,"height":689,"url":"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2026\/05\/what-is-Spec-Driven-Development.jpg","type":"image\/jpeg"}],"author":"Cheesecake Labs","twitter_card":"summary_large_image","twitter_creator":"@cheesecakelabs","twitter_site":"@cheesecakelabs","twitter_misc":{"Written by":null,"Est. reading time":"11 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/cheesecakelabs.com\/blog\/spec-driven-development\/#article","isPartOf":{"@id":"https:\/\/cheesecakelabs.com\/blog\/spec-driven-development\/"},"author":{"name":"Douglas da Silva"},"headline":"Spec-Driven Development: How to Capture Intent Before You Burn Tokens","datePublished":"2026-05-26T22:13:37+00:00","dateModified":"2026-05-26T22:13:39+00:00","mainEntityOfPage":{"@id":"https:\/\/cheesecakelabs.com\/blog\/spec-driven-development\/"},"wordCount":2481,"image":{"@id":"https:\/\/cheesecakelabs.com\/blog\/spec-driven-development\/#primaryimage"},"thumbnailUrl":"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2026\/05\/what-is-Spec-Driven-Development.jpg","keywords":["AI agent","sdd","spec-driven development"],"articleSection":["Artificial Intelligence","Engineering","Process"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/cheesecakelabs.com\/blog\/spec-driven-development\/","url":"https:\/\/cheesecakelabs.com\/blog\/spec-driven-development\/","name":"Spec-Driven Development: How to Capture Intent Before You Burn Tokens","isPartOf":{"@id":"https:\/\/cheesecakelabs.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cheesecakelabs.com\/blog\/spec-driven-development\/#primaryimage"},"image":{"@id":"https:\/\/cheesecakelabs.com\/blog\/spec-driven-development\/#primaryimage"},"thumbnailUrl":"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2026\/05\/what-is-Spec-Driven-Development.jpg","datePublished":"2026-05-26T22:13:37+00:00","dateModified":"2026-05-26T22:13:39+00:00","author":{"@type":"person","name":"Douglas da Silva"},"description":"Spec-Driven Development captures intent in markdown files before agents write code. Here is how SDD works, what it fixes, and more.","breadcrumb":{"@id":"https:\/\/cheesecakelabs.com\/blog\/spec-driven-development\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cheesecakelabs.com\/blog\/spec-driven-development\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cheesecakelabs.com\/blog\/spec-driven-development\/#primaryimage","url":"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2026\/05\/what-is-Spec-Driven-Development.jpg","contentUrl":"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2026\/05\/what-is-Spec-Driven-Development.jpg","width":1536,"height":689},{"@type":"BreadcrumbList","@id":"https:\/\/cheesecakelabs.com\/blog\/spec-driven-development\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cheesecakelabs.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Spec-Driven Development: How to Capture Intent Before You Burn Tokens"}]},{"@type":"WebSite","@id":"https:\/\/cheesecakelabs.com\/blog\/#website","url":"https:\/\/cheesecakelabs.com\/blog\/","name":"Cheesecake Labs","description":"Nearshore outsourcing company for Web and Mobile design and engineering services, and staff augmentation for startups and enterprises..","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/cheesecakelabs.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","name":"Douglas da Silva","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cheesecakelabs.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2017\/06\/douglas-da-silva.jpeg","contentUrl":"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2017\/06\/douglas-da-silva.jpeg","caption":"Douglas da Silva"},"url":"https:\/\/cheesecakelabs.com\/blog\/autor\/douglasgimli\/"}]}},"_links":{"self":[{"href":"https:\/\/cheesecakelabs.com\/blog\/wp-json\/wp\/v2\/posts\/13807","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cheesecakelabs.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cheesecakelabs.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cheesecakelabs.com\/blog\/wp-json\/wp\/v2\/users\/92"}],"replies":[{"embeddable":true,"href":"https:\/\/cheesecakelabs.com\/blog\/wp-json\/wp\/v2\/comments?post=13807"}],"version-history":[{"count":2,"href":"https:\/\/cheesecakelabs.com\/blog\/wp-json\/wp\/v2\/posts\/13807\/revisions"}],"predecessor-version":[{"id":13815,"href":"https:\/\/cheesecakelabs.com\/blog\/wp-json\/wp\/v2\/posts\/13807\/revisions\/13815"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cheesecakelabs.com\/blog\/wp-json\/wp\/v2\/media\/13812"}],"wp:attachment":[{"href":"https:\/\/cheesecakelabs.com\/blog\/wp-json\/wp\/v2\/media?parent=13807"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cheesecakelabs.com\/blog\/wp-json\/wp\/v2\/categories?post=13807"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cheesecakelabs.com\/blog\/wp-json\/wp\/v2\/tags?post=13807"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}