<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[the spiral essays]]></title><description><![CDATA[exploring the philosophy and practice of modern web development - bridging creativity and systems thinking in the age of AI.]]></description><link>https://thespiralessays.ai</link><image><url>https://substackcdn.com/image/fetch/$s_!aynT!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc00078e0-522e-4a19-92cf-a1b58bb0c65c_1024x1024.png</url><title>the spiral essays</title><link>https://thespiralessays.ai</link></image><generator>Substack</generator><lastBuildDate>Wed, 29 Apr 2026 23:31:50 GMT</lastBuildDate><atom:link href="https://thespiralessays.ai/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Anthony Martinović]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[anthonymartinovic@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[anthonymartinovic@substack.com]]></itunes:email><itunes:name><![CDATA[Anthony Martinovic]]></itunes:name></itunes:owner><itunes:author><![CDATA[Anthony Martinovic]]></itunes:author><googleplay:owner><![CDATA[anthonymartinovic@substack.com]]></googleplay:owner><googleplay:email><![CDATA[anthonymartinovic@substack.com]]></googleplay:email><googleplay:author><![CDATA[Anthony Martinovic]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[The Context Problem with Agentic AI]]></title><description><![CDATA[Why AI-Assisted Development Needs Curated Context at Scale]]></description><link>https://thespiralessays.ai/p/on-the-context-problem-with-agentic</link><guid isPermaLink="false">https://thespiralessays.ai/p/on-the-context-problem-with-agentic</guid><dc:creator><![CDATA[Anthony Martinovic]]></dc:creator><pubDate>Wed, 21 Jan 2026 00:32:53 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!3cfx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0452bb65-b35c-455b-9a3a-9f57dfd5a6e7_800x533.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>It&#8217;s 2026 now, and the software engineering industry is in the midst of a (not so) quiet AI revolution. The latest focus is <strong>Agentic AI</strong> - systems designed to assist, reason, plan, and execute on increasingly complex tasks with minimal human intervention. These systems often go beyond following instructions and make architectural decisions through deep reasoning. They&#8217;re being heralded as the future of development: AI that &#8220;just figures it out&#8221;, removing humans from the tedious parts of software creation.</p><p>I think this approach is undeniably powerful in certain circumstances, but there&#8217;s an issue with how broadly it&#8217;s being applied. Inference-heavy systems and higher levels of automation are increasingly being treated as a near-complete solution to software complexity, <strong>but they simply aren&#8217;t.</strong></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://thespiralessays.ai/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading the spiral essays! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>If leveraged too heavily in the wrong situations,<strong> agentic AI will create far more technical debt and organizational dysfunction than any collection of human engineers could create alone.</strong></p><p>This isn&#8217;t a critique of model capability. Agentic systems are powerful and most certainly have their place. The issue is which models are being used where, and how broadly inference-heavy approaches are being applied.</p><p>I believe there&#8217;s a more durable path forward - one that keeps the upside of AI assistance without taking on much of the risk of boundless autonomy. </p><p>To find a solution however, we first need to diagnose the problem.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3cfx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0452bb65-b35c-455b-9a3a-9f57dfd5a6e7_800x533.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3cfx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0452bb65-b35c-455b-9a3a-9f57dfd5a6e7_800x533.png 424w, https://substackcdn.com/image/fetch/$s_!3cfx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0452bb65-b35c-455b-9a3a-9f57dfd5a6e7_800x533.png 848w, https://substackcdn.com/image/fetch/$s_!3cfx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0452bb65-b35c-455b-9a3a-9f57dfd5a6e7_800x533.png 1272w, https://substackcdn.com/image/fetch/$s_!3cfx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0452bb65-b35c-455b-9a3a-9f57dfd5a6e7_800x533.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3cfx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0452bb65-b35c-455b-9a3a-9f57dfd5a6e7_800x533.png" width="800" height="533" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0452bb65-b35c-455b-9a3a-9f57dfd5a6e7_800x533.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:533,&quot;width&quot;:800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:84702,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://thespiralessays.ai/i/185116459?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0452bb65-b35c-455b-9a3a-9f57dfd5a6e7_800x533.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!3cfx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0452bb65-b35c-455b-9a3a-9f57dfd5a6e7_800x533.png 424w, https://substackcdn.com/image/fetch/$s_!3cfx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0452bb65-b35c-455b-9a3a-9f57dfd5a6e7_800x533.png 848w, https://substackcdn.com/image/fetch/$s_!3cfx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0452bb65-b35c-455b-9a3a-9f57dfd5a6e7_800x533.png 1272w, https://substackcdn.com/image/fetch/$s_!3cfx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0452bb65-b35c-455b-9a3a-9f57dfd5a6e7_800x533.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><h2><strong>The Allure of Agency</strong></h2><p>Agentic engineering is simple in concept: delegate multiple steps of the development process to AI systems, reducing the need for continuous human intervention. Tools like <a href="https://claude.com/product/claude-code">Claude Code</a> (utilizing Claude&#8217;s family of models) exemplify this approach. They generate code, reason about architecture, infer intent, and propagate decisions across files and systems.</p><p>And in isolation? It&#8217;s phenomenal.</p><p>Think of it like having a senior engineer in the room: opinionated, experienced, willing to think outside the box and challenge your assumptions. When you&#8217;re prototyping, experimenting, or building something solo, this is exactly what you want. The AI narrates its reasoning beautifully, fills in gaps you didn&#8217;t know existed, and moves fast.</p><p><strong>For early-stage startups, this is often the correct choice.</strong> Speed matters more than formalism. Ambiguity is cheap. The same person who writes the context usually consumes the output. Assumption-heavy systems are incredibly valuable in this phase.</p><p>The problem emerges when this same approach scales beyond its natural boundaries. This &#8220;senior engineer&#8221; is making architectural decisions behind the scenes - decisions you didn&#8217;t explicitly authorize, decisions that aren&#8217;t necessarily documented in shared artifacts, decisions that will eventually multiply across teams and timescales.</p><p>What works brilliantly in a single-team, fast-feedback environment will likely become a liability when context must survive handoffs, turnover, and detailed inspection.</p><div><hr></div><h2><strong>The Hidden Cost of Inference</strong></h2><p>Imagine multiple teams working on loosely related parts of the same system. Each uses agentic tooling to make architectural and implementation decisions in real time. Locally, progress looks strong. Decisions may even be documented within team boundaries.</p><p>But here&#8217;s the problem: <strong>what&#8217;s missing is the reasoning path that led there.</strong></p><p>Much of what occurred and how they arrived at their conclusions is not actually documented in shared artifacts, and even when it is, <strong>tools that rely heavily on deep reasoning still tend to draw different conclusions based on partial or evolving context.</strong></p><p>To clarify - when I say &#8220;context&#8221; here, I don&#8217;t just mean your code files or chat history. I mean the invisible constraints - the business domain knowledge not normally found in a codebase, the architectural non-negotiables, and the &#8220;why&#8221; behind previous decisions. When this information isn&#8217;t explicit, the model infers more, and different models tend to infer differently by default.</p><p>Ask yourself this litmus test:</p><p><strong>Can two teams, six months apart, with partial context, reach similar outcomes and explain why?</strong></p><p>I suspect assumption-heavy systems will fail this test quietly.</p><p>Here&#8217;s the dangerous part: <strong>the divergence won&#8217;t show up immediately</strong>. Codebases drift. Architectural patterns fragment. Tradeoff decisions vary across teams. Integration problems appear long after the decisions that caused them.</p><p><strong>This tech debt will be invisible, until it&#8217;s not.</strong></p><p>Many creative inferences become an undocumented architectural decision. Many &#8220;reasoned&#8221; choices a potential divergence point. Why? Because the reasoning happens behind the scenes (inside the model, not in your artifacts), so you won&#8217;t be able to inspect it, reproduce it, or trust it across contexts.</p><p>In addition, there&#8217;s also the cost factor that businesses need to consider: <strong>deep reasoning is expensive</strong>. Take <a href="https://www.anthropic.com/claude/opus">Claude Opus</a>, for example - it prioritizes sophisticated inference, but consumes significantly more tokens per interaction than more constrained approaches. While highly valuable in the earlier stages of development, its usage will eat away at your bottom line if used beyond its intended scope.</p><p>To top it off, the total cost of ownership for agentic AI at scale includes far more than just the token bill - it also includes the hidden labor cost of reconciling divergent outputs that can easily dwarf the API expenses.</p><div><hr></div><h2><strong>The Phase Change: From Prototyping to Production</strong></h2><p>Now, this isn&#8217;t a moral judgment about agentic AI. I&#8217;m simply looking at a phase change in how systems scale.</p><p><strong>Early stage:</strong></p><ul><li><p>Small teams</p></li><li><p>Shared mental models</p></li><li><p>Informal context</p></li><li><p>Fast feedback</p></li><li><p>Limited blast radius</p></li></ul><p><em>Assumptions help here - awesome &#128077;</em></p><p><strong>Organizational scale:</strong></p><ul><li><p>Many teams</p></li><li><p>Partial context</p></li><li><p>Artifact reuse across time and people</p></li><li><p>Asynchronous consumption</p></li><li><p>Accountability and governance</p></li></ul><p><em>Assumptions become a risk - no thanks &#128078;</em></p><p>Nothing about this transition implies weaker engineers or worse models - it&#8217;s the environment itself that&#8217;s different.</p><p>At the early stage, you want models to infer, challenge, and fill in gaps. At organizational scale, you&#8217;ll need models to respect boundaries, follow declared rules, and produce more consistent outputs.</p><p>Production failures almost always trace back to misaligned assumptions, not intelligence.</p><div><hr></div><h2><strong>What Production Systems Generally Need</strong></h2><p>Once requirements and constraints are clear, production systems tend to need something different: <strong>compliance over creativity</strong>. Predictability over possibility. Executional correctness over speculative reasoning.</p><p>Literalist, rule-following models quietly win here - provided the rules are actually clear.</p><p>Inference-heavy models tend to interpret ambiguity, challenge assumptions, and fill gaps. They behave like thoughtful collaborators when problems are underspecified.</p><p>Constraint-driven models tend to behave differently in day-to-day engineering use. They behave more like the lawyer of LLMs - rigid, precise, and far less willing to reinterpret intent once the rules are set. As of writing, I&#8217;m finding <a href="https://ai.google.dev/gemini-api/docs/models">Gemini Flash</a> to be the clearest example of this archetype, though I recognize that model behaviors are fluid and likely to shift over time.</p><p><strong>Both are valid design philosophies. </strong>The optimal solution depends entirely on the scenario in front of you.</p><p>For budget-conscious businesses (which is most), <strong>this matters</strong>. If you&#8217;re running hundreds or thousands of AI-assisted interactions per day across your engineering team, the cost difference between inference-heavy and constraint-driven approaches compounds quickly.</p><p><strong>Training engineers to toggle based on task type </strong>(expensive inference for ambiguity, cheaper execution for defined work)<strong> can dramatically reduce AI spend without sacrificing quality.</strong></p><p>It&#8217;s also worth noting that a lot of recent work on context engineering is moving in this direction. The focus seems to be on reducing token usage, managing agent state, and making deep reasoning cheaper and more efficient (Anthropic&#8217;s recent work on <a href="http://anthropic.com/engineering/effective-context-engineering-for-ai-agents">effective context engineering</a> is a good example).</p><p>This is valuable, but it doesn&#8217;t fully address the issue I keep running into: <strong>optimized reasoning is still reasoning in places where consistency matters more than inference</strong>. In many cases, the real mistake isn&#8217;t cost inefficiency so much as relying on inference once scope and context are already well-defined.</p><div><hr></div><h2><strong>The Right Tool for the Right Task</strong></h2><p>To illustrate this distinction I&#8217;m making, let me share a simple example:</p><p>Imagine designing a reusable internal library. Early on, requirements are ambiguous. Different teams want slightly different things. API boundaries are unclear. Tradeoffs haven&#8217;t been resolved. <strong>At this stage, leveraging higher levels of inference is incredibly useful</strong>. You want help exploring the design space and pressure-testing assumptions.</p><p>Once the library stabilizes, the problem changes. The API is defined. Constraints are explicit. Multiple teams now depend on consistent behavior. Continued inference becomes a liability.</p><p><strong>For adoption and ongoing use, constraint-driven models are often a better fit.</strong> Their literalism helps enforce consistency. Similar inputs produce similar outputs. Architectural intent is preserved rather than reinterpreted.</p><p>As you can see, thinking in terms of &#8220;better&#8221; or &#8220;worse&#8221; is the wrong approach - different models are better at different steps along the process.</p><p><strong>Inference helps create the solution </strong><em><strong>(0 &gt; 1)</strong></em><strong>. Constraint-following behavior helps it scale </strong><em><strong>(1 &gt; N)</strong></em><strong>.</strong></p><div><hr></div><h2><strong>A Missing Layer: Explicit Context</strong></h2><p>Here&#8217;s the tricky part&#8230; constraint-driven models only work well if you give them the right constraints, and I believe we&#8217;re still missing a critical architectural layer to this: <strong>explicit context curation</strong>.</p><p>Now, let&#8217;s face it - context is rarely maintained well. Whether it&#8217;s in spreadsheets, design docs, third-party integrations, or just implicit knowledge between a number of people, it&#8217;s rarely consistent and is often contradictory.</p><p>As a result, AI tools are forced to infer this context from the limited information it has access to in your codebase. As much as I&#8217;d love for this to be solved with a simple markdown file or two, that simply isn&#8217;t going to cut it.</p><p>Protocols like <a href="https://modelcontextprotocol.io/docs/getting-started/intro">Model Context Protocol (MCP)</a> help standardize how context is delivered to models, but they do not address the problem of determining which context is authoritative, how conflicts are resolved, or when inference must be actively discouraged.</p><p>In my view, the gap here is that we&#8217;ve yet to treat context synthesis as a deliberate step: <strong>actively assembling, weighting, and reconciling multiple sources of context into a task-specific worldview </strong><em><strong>before</strong></em><strong> the model ever starts executing.</strong></p><p>Think of it as constructing a task-specific &#8220;truth environment&#8221; for the model before execution. You&#8217;re declaring what matters rather than asking the AI to guess:</p><ul><li><p>Domain definitions and business invariants (what terms mean)</p></li><li><p>Architectural decisions and constraints (what&#8217;s allowed)</p></li><li><p>Feature specifications and acceptance criteria (what to build now)</p><ul><li><p>For what it&#8217;s worth, <a href="https://github.com/github/spec-kit">Github Spec Kit</a> is already great at this</p></li></ul></li><li><p>Execution instructions for the current task (how to build it)</p></li></ul><p>More than just documentation, it&#8217;s a call for structured, weighted, authoritative context that resolves conflicts deterministically.</p><p>As you can imagine, not all context is equal. Architectural decisions must outrank local preferences. Domain invariants must outrank convenience, and global knowledge used only when it doesn&#8217;t conflict. Without an explicit hierarchy of authority, &#8220;context&#8221; remains advisory, and advisory context still encourages the model to infer.</p><p>When you pair a constraint-driven model with explicitly curated context, I believe you&#8217;ll get:</p><ul><li><p>More consistent output</p></li><li><p>Consistent architectural decisions across teams and time</p></li><li><p>Portability across projects and teams</p></li><li><p>Lower operational cost</p></li></ul><p>Ultimately, the goal is to route execution through systematized knowledge rather than leaving the model to infer that knowledge each time.</p><div><hr></div><h2><strong>What Comes Next</strong></h2><p>This leads to a natural question: how do you actually implement this? How does one structure and curate context at scale?</p><p>Right now, the industry still lacks a standard for this. We have plenty of tools for &#8220;prompt engineering&#8221; and retrieval, but we don&#8217;t yet have a discipline for context synthesis - the architectural layer that actively assembles, weighs, and enforces constraints before the model ever sees a prompt.</p><p>The path forward isn&#8217;t just smarter autonomous agents, but tighter constraints, explicit context, deliberate model selection, and humans carving the path for AI to follow (<a href="https://thespiralessays.ai/p/architecture-specification-execution">something I wrote about recently</a>).</p><p>This is a problem space I&#8217;m invested in exploring in 2026.</p><p>While I don&#8217;t have all the answers yet, I am convinced one of the next great leaps in AI-accelerated software engineering will come from stricter context. We need to stop hoping the model &#8220;figures it out&#8221; and start building the environments where it won&#8217;t fail.<br><br>[P340000000]</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://thespiralessays.ai/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading the spiral essays! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Architecture, Specification, Execution: A Paradigm for AI-Accelerated Development]]></title><description><![CDATA[Carve the path for AI to follow, don't walk it yourself]]></description><link>https://thespiralessays.ai/p/architecture-specification-execution</link><guid isPermaLink="false">https://thespiralessays.ai/p/architecture-specification-execution</guid><dc:creator><![CDATA[Anthony Martinovic]]></dc:creator><pubDate>Mon, 10 Nov 2025 01:15:11 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/f7656f37-4ed7-493d-b819-add89a0addd2_640x457.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>AI tools have been around for a minute now, and while &#8220;vibe coding&#8221; seemed fun for a moment, it&#8217;s becoming clear (at least to me) that it hasn&#8217;t quite lived up to the hype.</p><p>Want to get &#8220;something&#8221; created quickly? Sure, vibe away. But let&#8217;s be real - most of us build specific products with ever-changing requirements, and there comes a point where &#8220;vibing&#8221; gets you nowhere fast. Instead, what we need is a stable foundation that maintains velocity and cuts through the noise.</p><p>You might question if AI is living up to the hype. Honestly? I think it is - but not through vibe coding. I&#8217;ve spent enough time tinkering with these tools to know they&#8217;re powerful, but we engineers need a paradigm to actually harness that power and condense that week&#8217;s worth of work into a day (like we were promised).</p><p>In this post, I&#8217;m going to share a paradigm that&#8217;s been working for me. To be clear: I&#8217;m not advocating for any particular products - Copilot, Kiro, Cursor, they&#8217;re all amazing. What I&#8217;m offering is an approach that works regardless of which tools you choose, delivering the compounding returns vibe coding never reaches.</p><p>Here&#8217;s the core principle:<strong> carve the path for AI to follow, don&#8217;t walk it yourself.</strong></p><p>Your job as the engineer is to set direction, establish constraints, and define success. AI&#8217;s job is to execute within those boundaries. Mix these roles and you&#8217;ll just muddy the waters.</p><p>This paradigm builds on spec-driven development, and it consists of three pillars:</p><ul><li><p><strong>Architecture </strong>- Document the decisions that shape your system</p></li><li><p><strong>Specification </strong>- Define the features within those constraints</p></li><li><p><strong>Execution</strong> - Prompt and let it run</p></li></ul><p>Here&#8217;s what makes this work: <strong>it&#8217;s a recursive system that feeds itself</strong>. Your execution prompts reference your specifications, which reference your architectural decisions. Each layer builds on the previous one. Architecture sets the container, specifications define what to build inside it, and Execution is where AI does the heavy lifting - all feeding back into a cycle that gets sharper each time.</p><p>The result? An optimal environment that maximizes code shipped to production.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!i5KD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87650689-8ef3-4d33-b52b-233cbdc725cf_7731x4527.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!i5KD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87650689-8ef3-4d33-b52b-233cbdc725cf_7731x4527.png 424w, https://substackcdn.com/image/fetch/$s_!i5KD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87650689-8ef3-4d33-b52b-233cbdc725cf_7731x4527.png 848w, https://substackcdn.com/image/fetch/$s_!i5KD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87650689-8ef3-4d33-b52b-233cbdc725cf_7731x4527.png 1272w, https://substackcdn.com/image/fetch/$s_!i5KD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87650689-8ef3-4d33-b52b-233cbdc725cf_7731x4527.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!i5KD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87650689-8ef3-4d33-b52b-233cbdc725cf_7731x4527.png" width="1456" height="853" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/87650689-8ef3-4d33-b52b-233cbdc725cf_7731x4527.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:853,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:946854,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://thespiralessays.ai/i/178432534?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87650689-8ef3-4d33-b52b-233cbdc725cf_7731x4527.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!i5KD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87650689-8ef3-4d33-b52b-233cbdc725cf_7731x4527.png 424w, https://substackcdn.com/image/fetch/$s_!i5KD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87650689-8ef3-4d33-b52b-233cbdc725cf_7731x4527.png 848w, https://substackcdn.com/image/fetch/$s_!i5KD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87650689-8ef3-4d33-b52b-233cbdc725cf_7731x4527.png 1272w, https://substackcdn.com/image/fetch/$s_!i5KD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87650689-8ef3-4d33-b52b-233cbdc725cf_7731x4527.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Ok, let&#8217;s dig in.</p><h3>Architecture: Document the decisions that shape your system</h3><p>Before planning features or generating code, answer this: <strong>What are the foundational principles that define this project?</strong> We need guardrails - a series of governing ideas that create a well-defined container around everything we build. The key asset here is Architecture Decision Records (ADRs) - documented decisions about your technical approach that serve as this foundation.</p><p><strong>What belongs here?</strong></p><p>Tech stack choices, authentication approach, API design philosophy, state management patterns, testing strategy - every architectural decision that will guide future work. Think of this as your &#8220;source of truth&#8221; - the ultimate reference point for any decision made in this environment.</p><p>Example: &#8220;We&#8217;re using Zustand for state management because our app needs global state without the boilerplate of Redux, and Zustand&#8217;s simplicity aligns with our preference for minimal abstractions.&#8221;</p><p><strong>Why does this matter?</strong></p><p>AI needs context, and it needs the <em>right</em> context. AI has access to every pattern and approach imaginable. Every time you prompt it, it could consider countless solutions - that&#8217;s far too much. The goal is to narrow that window at the start, forcing AI to work within pre-defined channels.</p><p>Having architectural decisions on record makes this clear and binding. Once it has a constitution to follow, you prevent &#8220;drift&#8221;, where each AI-generated feature uses a different pattern.</p><p><strong>How to create them?</strong></p><p>Communicate.</p><p>Not just with AI chatbots, but with peers and stakeholders. Nail down requirements and limitations first. The more information you can distill, the better. Compare approaches, discuss trade-offs, and determine what makes sense for your situation.</p><p>As you progress, confirm your decisions, document the rationale, and keep it clear. Remember: these form the outer bounds of the context window for every prompt when generating code, so precision matters.</p><p>Store these documents at or near the root level of your workspace. You can revise them later, but take care when modifying existing decisions.</p><p><strong>The key takeaway</strong></p><p>Time invested here pays dividends during feature development. <strong>AI can&#8217;t make these calls, but you can.</strong> This is where engineers are most valuable - communication, judgment, trade-offs, absorbing business context.</p><p><strong>Everything outside these boundaries is noise that pollutes AI&#8217;s contextual awareness and leads to suboptimal results.</strong></p><p>Once you have the container in place, it&#8217;s time for the next phase: specifications.</p><h3>Specification: Define the features within those constraints</h3><p>This is where we detail <em>what</em> we&#8217;re actually building. Think of specs as feature-level plans that operate within the architectural boundaries you&#8217;ve set. This is Spec-Driven Development at its core, and it&#8217;s the meat of this paradigm (you&#8217;ll spend most of your development time here). Tools like GitHub&#8217;s Spec-Kit are perfect for this.</p><p>Here&#8217;s the critical relationship: ADRs set the rules, specs define the moves. Your architectural decisions have already narrowed AI&#8217;s solution space. Now, specs guide it toward the exact outcome you want. Without ADRs, AI might solve your problem five different ways across five features. With ADRs <em>and</em> specs working together, AI solves it consistently, following your established patterns every time.</p><p><strong>What belongs here?</strong></p><p>Anything relevant to your feature&#8217;s context: user stories, API contracts, UI/UX flows, edge cases, business logic, dependencies, success metrics - if it helps define what you&#8217;re building, include it.</p><p>Be as precise as possible. This might feel tedious at first, but remember: the goal isn&#8217;t instant code - <strong>it&#8217;s an environment that consistently generates code matching your intent.</strong> Every detail you provide here saves debugging time later.</p><p><strong>Why does this matter? </strong></p><p>Specs give AI a clear target within known boundaries. The recursive system works like this: AI reads your ADRs to understand <em>how</em> to build, then reads your specs to understand <em>what</em> to build. The tighter the connection between these two layers, the better your results.</p><p>This is how you prevent drift at the feature level. ADRs prevent architectural drift (every feature uses the same patterns), while specs prevent implementation drift (every feature solves problems the way you intended). Together, they create consistency that compounds.</p><p><strong>How to create them?</strong></p><p>Write specs as if you&#8217;re briefing another engineer who&#8217;s already read your ADRs. Reference specific architectural decisions when relevant - &#8220;Following our ADR on state management, this feature uses Zustand for global cart state.&#8221;</p><p>Be specific about the end goal. Don&#8217;t say &#8220;build a user profile page&#8221; - describe what data it displays, how it handles loading states, what happens when data is missing, how errors surface to users. Define validation rules, edge cases, and data shapes.</p><p>If you&#8217;re integrating with external services, make data contracts explicit. Design mockups, API documentation, and screenshots from similar features all help AI understand your intent.</p><p>Keep specs in version control alongside your code. Unlike ADRs (which rarely change), specs will evolve as requirements shift.</p><p>Focus on <em>what</em> to build, not <em>how</em> to build it. That&#8217;s AI&#8217;s job. Define the destination clearly, and let AI figure out the route within your architectural constraints.</p><p><strong>The key takeaway</strong></p><p>If Architecture is your foundation, specs are your blueprint. This is where you translate business needs into instructions AI can execute. The clearer your specs, the less time you spend fixing AI&#8217;s output.</p><p>The magic happens in the interaction: <strong>ADRs tell AI what patterns to follow, specs tell AI what problems to solve.</strong> When both layers are clear, AI can move fast without breaking things.</p><p>You have the container, and now you have the plan. Time to execute.</p><h3>Execution: Prompt and let it run</h3><p>This is where your preparation pays off. With ADRs defining your architectural boundaries and specs detailing what to build, AI can now handle the implementation. This is where the velocity gains actually happen - you&#8217;re no longer writing boilerplate, wiring up APIs, or building CRUD operations. AI does the heavy lifting while you validate and guide.</p><p>Tools like Cursor and Kiro excel here, giving you AI assistance directly in your development environment.</p><p><strong>What belongs here?</strong></p><p>Your prompts should reference the specific spec you&#8217;re implementing, along with any relevant ADRs. The key is giving AI exactly what it needs - no more, no less.</p><p>A good prompt looks like this: &#8220;Implement the user dashboard feature from <code>/docs/specs/dashboard-spec.md</code>. Follow our state management patterns defined in <code>/docs/adr/004-zustand-state.md</code>. The component should fetch data from the <code>/api/dashboard</code> endpoint as specified.&#8221;</p><p>Notice what this does: it points to the spec (what to build), references the ADR (how to build it), and includes relevant context (the API endpoint). AI now has clear constraints and a clear target.</p><p><strong>Why does this matter?</strong></p><p>This is where the recursive system completes the loop. AI has your architectural rules (ADRs), knows what to build (specs), and now executes within those boundaries. The better your first two layers, the less intervention you need here.</p><p>When your ADRs and specs are solid, AI generates code that&#8217;s not only functional but <em>consistent</em> with the rest of your codebase. You&#8217;re not debugging random implementation choices - you&#8217;re validating that the output matches your intent.</p><p><strong>How to execute effectively?</strong></p><p>Start by pointing AI to the relevant spec and any ADRs that apply. Be explicit about file paths and references - AI can&#8217;t guess which documents matter.</p><p><strong>Let AI complete full implementations before intervening</strong>. This is critical: if you start manually editing AI&#8217;s output mid-stream, you break its context and end up with a franken-implementation that&#8217;s half-yours, half-AI&#8217;s. Resist the urge.</p><p>Validate the output against your spec. Does it handle all the edge cases you defined? Does it follow your architectural patterns? Does it match the data contracts you specified?</p><p>If something&#8217;s wrong, <em>don&#8217;t fix the code directly</em>. Instead:</p><ol><li><p>Check if your spec was clear enough</p></li><li><p>Refine your prompt with more specific guidance</p></li><li><p>Re-run the generation</p></li></ol><p>This might feel slower initially, but it teaches you how to guide AI better and keeps the codebase consistent.</p><p>Keep your context window focused. Don&#8217;t dump your entire codebase into the prompt - reference only what&#8217;s needed for this specific feature. Clear context frequently and re-establish boundaries with each new task.</p><p>As you iterate, you&#8217;ll develop intuition for what level of detail AI needs. Some features need explicit examples, others just need the spec. This is a skill that improves with practice.</p><p><strong>The key takeaway </strong></p><p>You&#8217;re no longer the coder - you&#8217;re the orchestrator. Your job is to validate and guide, not implement. If AI generates something wrong, it&#8217;s usually because the spec was unclear or the prompt lacked necessary context.</p><p>The more you stay in &#8220;prompt mode&#8221; rather than &#8220;edit mode,&#8221; the faster you&#8217;ll move. <strong>Trust the system you&#8217;ve built</strong>: solid ADRs + detailed specs + clear prompts = consistent, high-quality output.</p><p>Now you have all three layers working together. Time to ship.</p><h3>Closing Thoughts</h3><p>The shift happening in software development isn&#8217;t about AI replacing engineers - it&#8217;s about engineers moving upstream. Your value lies in system design, communication, and judgment calls, not in typing out implementations.</p><p>This paradigm isn&#8217;t just about speed. It&#8217;s about building better, more consistent software while maintaining the clarity and intention that separates great code from functional code. When you set clear boundaries and detailed plans, AI becomes a force multiplier.</p><p>Vibe coding will always have its place for prototypes and throwaway experiments. But when you&#8217;re building something real, something that needs to scale and evolve and withstand changing requirements? You need structure. You need intention. <strong>You need a system that feeds itself.</strong></p><p>Start with your ADRs. Define your boundaries. Write specs that leave no ambiguity. Let AI execute within the container you&#8217;ve built. Trust the process, resist the urge to intervene, and watch what compounds.</p><p>The paradigm is simple: <strong>Architecture, Specification, Execution.</strong> The principle is simpler: <strong>Carve the path for AI to follow, don&#8217;t walk it yourself.</strong></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://thespiralessays.ai/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading the spiral essays! Subscribe here to receive new posts.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item></channel></rss>