{"id":405,"date":"2026-07-12T18:50:46","date_gmt":"2026-07-12T18:50:46","guid":{"rendered":"https:\/\/marcinzygmunt.pl\/blog\/?p=405"},"modified":"2026-07-12T19:00:07","modified_gmt":"2026-07-12T19:00:07","slug":"vibe-coding-was-the-warm-up-real-work-with-ai-starts-after","status":"publish","type":"post","link":"https:\/\/marcinzygmunt.pl\/blog\/vibe-coding-was-the-warm-up-real-work-with-ai-starts-after\/","title":{"rendered":"Vibe Coding Was the Warm-Up. Real Work With AI Starts After"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><em>This is Part 2 of two. In Part 1 I argued that AI doesn&#8217;t take the job \u2014 it takes the mechanical typing, and makes your knowledge matter more than ever. If you buy that, the obvious next question is: okay, so how do I actually work with it? This is the how.<\/em><\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Stop trying to win with a single prompt. One-shot prompting \u2014 describe a feature, accept whatever comes back \u2014 falls apart the moment the system gets real, and no amount of prompt-polishing saves it. What works is a workflow that plans before it codes, and turns you from the one typing into the one deciding. The rest of this is why, and how.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">There was a moment when we all believed asking was enough. &#8220;Write me a login endpoint,&#8221; enter, and the agent spits out code. It works in the demo, works in the side project, wows the room at a workshop. This is vibe coding \u2014 you describe a feature in one sentence and accept whatever comes out. And for a moment it looks like the end of the software profession.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Then you open that same workflow on a production system with two hundred thousand lines you didn&#8217;t write yourself, and the magic runs out.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Why vibe coding wastes your time, money, and momentum<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The problem isn&#8217;t that the model is dumb. The problem is that a single prompt carries too little context for the agent to understand <em>why<\/em> the system works the way it does.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Anyone who&#8217;s tried knows the symptoms:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Code drifts from intent<\/strong> \u2014 you asked for one thing and got something that satisfies the prompt but not what you meant.<\/li>\n\n\n\n<li><strong>The agent hallucinates APIs<\/strong> that don&#8217;t exist, because the real signature was never in its context window.<\/li>\n\n\n\n<li><strong>You get a 2,000-line PR<\/strong> that takes half a day to review, because you don&#8217;t know where to start.<\/li>\n\n\n\n<li><strong>A week later nobody remembers<\/strong> \u2014 you included \u2014 why that function looks the way it does.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Bad names are bad<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Here&#8217;s a subtler one that catches people off guard: the model reads intent from your <em>names<\/em>, not just your logic. Name a variable <code>users<\/code> when it actually holds orders, or <code>isValid<\/code> for a flag whose meaning is inverted, and the agent leans on the label \u2014 especially when the behavior isn&#8217;t obvious from the code in front of it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It builds the next ten lines on what the name <em>promised<\/em>, not what the code <em>does<\/em> \u2014 and the bug that follows looks perfectly reasonable until you trace it. You skim past a misleading name because you know the domain; the model takes it at face value.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Architecture by accident<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">But the most dangerous layer runs deeper than typos in the code. It&#8217;s the <strong>architectural decisions the agent had no business making well<\/strong>. Vibe coding optimizes for &#8220;works right now, in this file,&#8221; not for &#8220;fits the rest of the system.&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So the agent drops business logic into a controller because that was the nearest spot. It reaches for a pattern that clashes with how the rest of the app is built \u2014 a repository where the project consistently uses something else, a synchronous call where the design calls for an event. It breaks layer and module boundaries it never knew about, because they weren&#8217;t in the prompt. It ignores the style and conventions your team spent years shaping.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Each such decision looks harmless on its own \u2014 the trouble is they accumulate and quietly erode the consistency that the whole system&#8217;s maintainability rests on.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Small is fine \u2014 big isn&#8217;t<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">And here&#8217;s the key distinction: <strong>vibe coding is fine for small, local changes \u2014 it&#8217;s cheaper and faster, and there&#8217;s no point wrapping a typo fix or a single new field in process.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">But the more mature the project, and the wider the blast radius of a change \u2014 something touching many modules, crossing layer boundaries, or moving the business domain model \u2014 the worse vibe coding performs. Because there the price of a bad architectural decision isn&#8217;t local. The whole system pays it, for a long time.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This is a real cost. Not abstract &#8220;technical debt,&#8221; but your hours spent debugging hallucinations, your tokens burned on regenerating from scratch, and \u2014 worse \u2014 your momentum draining away as the tool that was supposed to speed you up starts slowing you down. Ambition turns into frustration, and the knowledge you hold as an experienced developer \u2014 about architecture, patterns, domain boundaries \u2014 sits idle, because the workflow never taps it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The good news: this isn&#8217;t AI&#8217;s fault. It&#8217;s the method&#8217;s fault. And the method can change.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Where I hit the wall myself<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">For a long time I thought the answer was a better prompt \u2014 sharper wording, more detail. But a prompt is a single shot. You compress everything you know about a system \u2014 its constraints, its conventions, the edge cases you&#8217;d never think to write down \u2014 into one paragraph, and you <em>always<\/em> leave something out. Not out of carelessness; nobody holds all of it in their head in the second they hit enter.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Structure that pushes back<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">What fixed it wasn&#8217;t a better prompt \u2014 it was structure that pushes back. A good plan doesn&#8217;t just record what I asked for; it questions what I forgot to address, works the implementation out in detail, and forces a critical rethink before anything gets built. A review stage challenges the result and catches drift a prompt can&#8217;t even see.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">The prompt asks the <em>agent<\/em> to be complete. The plan and the review interrogate <em>me<\/em> until I am.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">So I stopped running it by hand and built it into my own toolkit. I thought I&#8217;d stumbled onto something personal \u2014 turns out someone had already turned it into a principle.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The answer: stop prompting, start engineering context<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The most practical answer to the chaos of vibe coding didn&#8217;t come from some big lab \u2014 it came from watching how an agent actually works. It was articulated by Dex Horthy of HumanLayer in the essay <em>Advanced Context Engineering for Coding Agents<\/em> (ACE-FCA for short), and the core is brutally simple:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">An agent&#8217;s turn is a stateless function. Context in, next step out. The contents of the context window are the only lever you have on output quality \u2014 so it&#8217;s worth obsessing over.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Everything else follows. Horthy&#8217;s rule of thumb is to keep context-window utilization in the <strong>40\u201360% range<\/strong> (it depends on the problem&#8217;s complexity). Push past that \u2014 keep cramming in \u2014 and recall and reasoning start to crumble. The more you stuff in, the worse the result. You can&#8217;t prompt your way back out; you have to design the whole workflow so context is managed deliberately, not piled up by accident.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The instrument of that discipline is a loop you&#8217;ve probably seen under various names: <strong>Research \u2192 Plan \u2192 Implement (RPI)<\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The RPI flow: three phases, one rule<\/h2>\n\n\n\n<div class=\"wp-block-group has-background\" style=\"border-radius:8px;border-left-color:#3b82f6;border-left-width:4px;background-color:#0d1b2e;padding-top:1rem;padding-right:1.25rem;padding-bottom:1rem;padding-left:1.25rem\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-container-core-group-is-layout-77aeecf2 wp-block-group-is-layout-constrained\">\n<p class=\"wp-block-paragraph\">\ud83d\udca1 <strong>The one rule:<\/strong> we don&#8217;t write a single line of code until an approved plan-artifact exists. Everything else is a consequence.<\/p>\n<\/div><\/div>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Research.<\/strong> The agent doesn&#8217;t touch code \u2014 it maps the terrain: where functionality lives, the conventions, what calls what. Findings land in a doc with concrete <code>file:line<\/code> references and open questions. Verifying it takes minutes; debugging a decision made on bad reconnaissance takes hours.<\/li>\n\n\n\n<li><strong>Plan.<\/strong> From the research, a plan takes shape: what changes, in what phases, the success criteria, and \u2014 just as important \u2014 what we deliberately are NOT doing. This is the <strong>only right place for architectural decisions<\/strong> \u2014 which pattern, where a boundary sits, how it maps to the domain. You approve them here, on a cheap artifact, before the agent guesses them wrong in code. No open questions survive. This file becomes the source of truth.<\/li>\n\n\n\n<li><strong>Implement.<\/strong> Only now, code \u2014 launched in a <em>fresh<\/em> window loading only the plan. The exhausting research-and-planning session that ate 60\u201380% of the context distills into a ~200-line artifact taking a dozen-odd percent (Horthy calls this <em>frequent intentional compaction<\/em>). The agent codes in phases and verifies after each.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"572\" src=\"https:\/\/marcinzygmunt.pl\/blog\/wp-content\/uploads\/2026\/07\/WYZOfpV4a5wT02up-dOjT_B3IruPHy-1024x572.png\" alt=\"The Research \u2192 Plan \u2192 Implement flow: research feeds a plan, and an approved-plan gate stands between planning and writing code.\" class=\"wp-image-412\" srcset=\"https:\/\/marcinzygmunt.pl\/blog\/wp-content\/uploads\/2026\/07\/WYZOfpV4a5wT02up-dOjT_B3IruPHy-1024x572.png 1024w, https:\/\/marcinzygmunt.pl\/blog\/wp-content\/uploads\/2026\/07\/WYZOfpV4a5wT02up-dOjT_B3IruPHy-300x168.png 300w, https:\/\/marcinzygmunt.pl\/blog\/wp-content\/uploads\/2026\/07\/WYZOfpV4a5wT02up-dOjT_B3IruPHy-768x429.png 768w, https:\/\/marcinzygmunt.pl\/blog\/wp-content\/uploads\/2026\/07\/WYZOfpV4a5wT02up-dOjT_B3IruPHy.png 1088w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Notice where you are in all of this. You&#8217;re not banging out code \u2014 <strong>you&#8217;re reviewing the research and the plan<\/strong>. And as Horthy aptly puts it, <strong>reviewing a plan gives you more leverage than reviewing code.<\/strong> Because at the plan stage a fix costs a sentence; at the code stage it costs a refactor.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This skeleton has a wider family. The whole Spec-Driven Development movement (tools like OpenSpec, GitHub Spec Kit, or Kiro) grows from the same intuition: spec\/plan before code, code as a derived artifact. RPI is its most &#8220;context-first&#8221; variant \u2014 less ceremony, more emphasis on what the agent actually holds in its window.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Don&#8217;t wheel it out for everything<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Two caveats before you reach for this on every task.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">First: don&#8217;t. RPI is heavy machinery. For a small, self-contained change \u2014 a typo, one new field, a fix you can hold in your head \u2014 a single prompt, spelled out with care, is the right tool; wrapping it in research, plan, and review costs more than the change is worth. The dividing line is simple: if every relevant detail fits in one prompt without you leaving anything out, just prompt it. It&#8217;s when it <em>doesn&#8217;t<\/em> that the structure earns its keep.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Reach for a single prompt<\/th><th>Reach for RPI<\/th><\/tr><\/thead><tbody><tr><td>A typo, one field, a small fix<\/td><td>A change touching many modules or layers<\/td><\/tr><tr><td>Everything fits in one prompt<\/td><td>You&#8217;d inevitably leave something out<\/td><\/tr><tr><td>Blast radius is local<\/td><td>A bad call costs the whole system<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Second, and less obvious: even when RPI feels like overhead, it pays a dividend beyond the change itself. Working through research and a plan builds <em>your<\/em> understanding of the system, forces the architecture into the open, and leaves durable artifacts behind.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The research doc, the plan, the review notes don&#8217;t evaporate when the code merges \u2014 they become documentation: the context you (and the next agent) load at the start of the next task, so every future session begins already knowing the terrain.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">The plan isn&#8217;t a cost you pay once \u2014 it&#8217;s an asset that compounds.<\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">How to start \u2014 today, without a revolution<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">You don&#8217;t have to rewrite how you work overnight. Three moves to begin:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Create a <code>CLAUDE.md<\/code> (or <code>AGENTS.md<\/code>) in the repo \u2014 a project constitution: conventions, stack, security rules, what not to touch. It&#8217;s persistent context the agent always reads.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># CLAUDE.md \u2014 project constitution\n\n## Stack\n- Java 25 + Micronaut, Postgres, Docker\n\n## Conventions\n- Controllers stay thin; business logic lives in services\n- Map DTOs in dedicated mappers, never in controllers\n- One reason to change per class\n\n## Security\n- Never log secrets or PII; validate external input at the boundary\n\n## Do not touch\n- Generated code, lockfiles, CI config \u2014 unless asked<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">On your next non-trivial task, force the order on yourself: research first (the agent only reads and summarizes), then a plan (which <em>you<\/em> read), then code. Even with no tooling at all, the sheer discipline of &#8220;plan before code&#8221; changes outcomes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Guard the context window. When a session gets long and sluggish, clear it and come back in with the plan instead of dragging a clogged thread along. The public <code>.claude\/commands\/<\/code> from HumanLayer&#8217;s repo are a ready starting point if you want slash-commands <code>research \u2192 plan \u2192 implement<\/code> right away.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The flow is not dogma \u2014 grow it to fit you<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The most important thing to grasp: RPI is a <em>skeleton<\/em>, not scripture. Once you feel it, you&#8217;ll start seeing what <em>you<\/em> are missing \u2014 and that&#8217;s the right moment to extend it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A good example of how far this can be taken is <strong>Maister<\/strong> \u2014 an open project (SkillPanel) that packages the same core as a Claude Code plugin and adds things plain RPI doesn&#8217;t have:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>A task orchestrator<\/strong> \u2014 instead of picking a phase by hand, it classifies the task from the conversation (feature \/ bug \/ enhancement) and chooses the path itself.<\/li>\n\n\n\n<li><strong>Automatic standards discovery<\/strong> \u2014 it scans configs and code, extracts the project&#8217;s conventions, and enforces them at the spec, plan, and implementation stages.<\/li>\n\n\n\n<li><strong>Sharper built-in review<\/strong> \u2014 over-engineering detection and a &#8220;reality assessment&#8221; that checks whether the agent has drifted from what&#8217;s actually in the code.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">The point isn&#8217;t to &#8220;use Maister instead of HumanLayer.&#8221; The point is that <strong>the same skeleton can be grown in many directions<\/strong> \u2014 adding a change lifecycle with explicit statuses, a growing registry of lessons, gates between phases, an archive with an audit trail. Each of those additions answers a specific pain you&#8217;ll only feel in practice. That&#8217;s why the best toolkit is the one you build yourself on top of a proven core \u2014 because only you know where your workflow leaks.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">It was never really about code<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">And it grows <em>outward<\/em>, too. Once you internalize &#8220;research the terrain \u2192 agree the plan \u2192 execute in a fresh, focused context,&#8221; you start applying it to almost any task an agent can help with:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>A slide deck<\/strong> \u2014 research the audience and material, plan the narrative and structure, then generate.<\/li>\n\n\n\n<li><strong>A data pipeline or an ML training run<\/strong> \u2014 research the data and prior art, plan the experiments and success metrics, then implement run by run.<\/li>\n\n\n\n<li><strong>A migration, a report, a research memo<\/strong> \u2014 same three beats.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">The skeleton isn&#8217;t about code; it&#8217;s about not letting an agent act before it understands the terrain and you&#8217;ve approved the direction. Code is just where the pain showed up first.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">AI isn&#8217;t taking your profession. It&#8217;s taking the typing.<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Let&#8217;s go back to that first impression that vibe coding was the end of the profession. It was the opposite.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">What AI actually takes is the least valuable part of your work \u2014 mechanically translating intent into syntax. What stays, and becomes <em>more important than ever<\/em>, are the things you&#8217;re really paid for: understanding the problem, deciding on the architecture, judging whether a plan makes sense, catching a dead end before it turns into 2,000 lines to throw away.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In the RPI workflow, your knowledge as an experienced developer doesn&#8217;t sit idle \u2014 it&#8217;s wired into every gate. You review the research. You approve the plan. You say &#8220;no, we&#8217;re not doing that.&#8221; The agent is the implementation engine; you become the architect.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Vibe coding asked you to trust the machine blindly and wasted your time when it failed. Deliberate work with context does the opposite: it uses what you know to make the machine fail less often and more cheaply. You don&#8217;t have to choose between &#8220;AI will replace me&#8221; and &#8220;AI is a toy.&#8221; There&#8217;s a third path \u2014 learning to work with it so you waste neither time, nor money, nor your own drive.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">And that&#8217;s a skill worth mastering now.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Let&#8217;s talk<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">If you recognize yourself here \u2014 you sense AI could give you far more than it does now, but the workflow keeps falling apart \u2014 write to me.<\/h3>\n\n\n\n<pre class=\"wp-block-verse\">Whether you want to build your own toolkit or one for your team, I'm happy to help. I mentor developers and teams on exactly this: how to get real leverage out of AI without losing weeks to trial and error \u2014 shaping a flow around your project and stack, where teams trip up, and how to grow the skeleton into something that fits how <em>you<\/em> work, not a generic plugin. A comment or a message is enough.<\/pre>\n\n\n<div class=\"wp-block-jetpack-contact-form\"><a href=\"https:\/\/marcinzygmunt.pl\/blog\/vibe-coding-was-the-warm-up-real-work-with-ai-starts-after\/\" target=\"_blank\" rel=\"noopener noreferrer\">Submit a form.<\/a><\/div>\n\n\n<h2 class=\"wp-block-heading\">Links &amp; tools<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The core methodology and the RPI commands:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>HumanLayer \u2014 ACE-FCA essay:<\/strong> <a href=\"https:\/\/github.com\/humanlayer\/advanced-context-engineering-for-coding-agents\">github.com\/humanlayer\/advanced-context-engineering-for-coding-agents<\/a><\/li>\n\n\n\n<li><strong>HumanLayer \u2014 the RPI slash-commands<\/strong> (<code>research_codebase<\/code>, <code>create_plan<\/code>, <code>implement_plan<\/code>): <a href=\"https:\/\/github.com\/humanlayer\/humanlayer\/tree\/main\/.claude\/commands\">github.com\/humanlayer\/humanlayer\/tree\/main\/.claude\/commands<\/a><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Growing the flow into a full toolkit:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Maister<\/strong> (Claude Code plugin, standards-aware workflows): <a href=\"https:\/\/github.com\/SkillPanel\/maister\">github.com\/SkillPanel\/maister<\/a><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">The wider Spec-Driven Development family, if you want to compare approaches:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>GitHub Spec Kit:<\/strong> <a href=\"https:\/\/github.com\/github\/spec-kit\">github.com\/github\/spec-kit<\/a><\/li>\n\n\n\n<li><strong>OpenSpec:<\/strong> <a href=\"https:\/\/github.com\/Fission-AI\/OpenSpec\">github.com\/Fission-AI\/OpenSpec<\/a><\/li>\n\n\n\n<li><strong>AWS Kiro:<\/strong> <a href=\"https:\/\/kiro.dev\">kiro.dev<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>One prompt in, whatever comes back out \u2014 that falls apart on a real system. Here&#8217;s the workflow that replaces it: research the terrain, approve a plan, then let the agent write code.<\/p>\n","protected":false},"author":1,"featured_media":449,"comment_status":"open","ping_status":"open","sticky":true,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[1],"tags":[13,143,142,137,136,127,139,79,144,135,140,128,138,145],"class_list":["post-405","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-ai","tag-ai-pair-programming","tag-claude-code","tag-coding-agents","tag-context-engineering","tag-developer-productivity","tag-developer-workflow","tag-llm","tag-prompt-engineering","tag-research-plan-implement","tag-rpi","tag-software-architecture","tag-spec-driven-development","tag-technical-debt"],"jetpack_likes_enabled":true,"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/marcinzygmunt.pl\/blog\/wp-content\/uploads\/2026\/07\/9ehYVITbpsiHXf7nXZOeO_dXkZ0GnX.png","_links":{"self":[{"href":"https:\/\/marcinzygmunt.pl\/blog\/wp-json\/wp\/v2\/posts\/405","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/marcinzygmunt.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/marcinzygmunt.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/marcinzygmunt.pl\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/marcinzygmunt.pl\/blog\/wp-json\/wp\/v2\/comments?post=405"}],"version-history":[{"count":17,"href":"https:\/\/marcinzygmunt.pl\/blog\/wp-json\/wp\/v2\/posts\/405\/revisions"}],"predecessor-version":[{"id":451,"href":"https:\/\/marcinzygmunt.pl\/blog\/wp-json\/wp\/v2\/posts\/405\/revisions\/451"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/marcinzygmunt.pl\/blog\/wp-json\/wp\/v2\/media\/449"}],"wp:attachment":[{"href":"https:\/\/marcinzygmunt.pl\/blog\/wp-json\/wp\/v2\/media?parent=405"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/marcinzygmunt.pl\/blog\/wp-json\/wp\/v2\/categories?post=405"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/marcinzygmunt.pl\/blog\/wp-json\/wp\/v2\/tags?post=405"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}