{"id":3513,"date":"2026-05-15T02:19:49","date_gmt":"2026-05-15T02:19:49","guid":{"rendered":"https:\/\/aiopsschool.com\/blog\/?p=3513"},"modified":"2026-05-15T02:21:14","modified_gmt":"2026-05-15T02:21:14","slug":"plan-first-workflow-making-claude-plan-before-it-codes","status":"publish","type":"post","link":"https:\/\/aiopsschool.com\/blog\/plan-first-workflow-making-claude-plan-before-it-codes\/","title":{"rendered":"Plan-First Workflow \u2014 Making Claude Plan Before It Codes"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/aiopsschool.com\/blog\/wp-content\/uploads\/2026\/05\/Screenshot-2026-05-15-at-11.19.12.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"296\" src=\"https:\/\/aiopsschool.com\/blog\/wp-content\/uploads\/2026\/05\/Screenshot-2026-05-15-at-11.19.12-1024x296.png\" alt=\"\" class=\"wp-image-3514\" srcset=\"https:\/\/aiopsschool.com\/blog\/wp-content\/uploads\/2026\/05\/Screenshot-2026-05-15-at-11.19.12-1024x296.png 1024w, https:\/\/aiopsschool.com\/blog\/wp-content\/uploads\/2026\/05\/Screenshot-2026-05-15-at-11.19.12-300x87.png 300w, https:\/\/aiopsschool.com\/blog\/wp-content\/uploads\/2026\/05\/Screenshot-2026-05-15-at-11.19.12-768x222.png 768w, https:\/\/aiopsschool.com\/blog\/wp-content\/uploads\/2026\/05\/Screenshot-2026-05-15-at-11.19.12-1536x444.png 1536w, https:\/\/aiopsschool.com\/blog\/wp-content\/uploads\/2026\/05\/Screenshot-2026-05-15-at-11.19.12.png 1901w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">What this is<\/h2>\n\n\n\n<p>The third habit (after <code>CLAUDE.md<\/code> and <code>spec.md<\/code>) when working with Claude on real features: <strong>always make Claude propose a written plan before writing any code, and review it before approving.<\/strong><\/p>\n\n\n\n<p>This is the single biggest quality multiplier for non-trivial work. It also happens to be the habit humans forget most often \u2014 so this tutorial covers not just <em>what<\/em> to do, but <em>how to enforce it<\/em> so it happens automatically.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Why this matters<\/h2>\n\n\n\n<p>Claude is fast. That&#8217;s a problem.<\/p>\n\n\n\n<p>If you say <em>&#8220;implement the spec,&#8221;<\/em> Claude will happily produce 400 lines of code in one shot \u2014 and often something is wrong: wrong library, wrong folder, misread edge case, over-built. Now you&#8217;re reviewing a giant diff and arguing with code instead of with ideas.<\/p>\n\n\n\n<p><strong>A plan is cheap to change. Code is expensive to change.<\/strong> Always argue at the cheap layer first.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What &#8220;a plan&#8221; actually means<\/h2>\n\n\n\n<p>When you ask Claude to plan, you want it to produce \u2014 in writing, not in code:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Files it will create or modify<\/strong> \u2014 exact paths<\/li>\n\n\n\n<li><strong>Approach<\/strong> \u2014 which library, pattern, or technique it&#8217;ll use, and why<\/li>\n\n\n\n<li><strong>Steps in order<\/strong> \u2014 what gets built first, second, third<\/li>\n\n\n\n<li><strong>Open questions<\/strong> \u2014 things the spec didn&#8217;t answer that Claude is making assumptions about<\/li>\n\n\n\n<li><strong>Risks or trade-offs<\/strong> \u2014 what could go wrong, what it&#8217;s deliberately not handling<\/li>\n<\/ul>\n\n\n\n<p>If the plan doesn&#8217;t include open questions, that&#8217;s a red flag \u2014 Claude is guessing and not telling you.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">How to ask for a plan<\/h2>\n\n\n\n<p>A simple, reliable prompt:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><em>&#8220;Read <code>docs\/features\/login\/spec.md<\/code>. Propose an implementation plan covering files to change, approach, ordered steps, open questions, and risks. Do not write code yet.&#8221;<\/em><\/p>\n<\/blockquote>\n\n\n\n<p>The phrase <strong>&#8220;do not write code yet&#8221;<\/strong> matters. Without it, Claude often slips into code mode halfway through.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What to do with the plan<\/h2>\n\n\n\n<p>Three options after reading it:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Approve<\/strong> \u2014 <em>&#8220;Looks good, proceed with step 1 only. Stop and show me the result.&#8221;<\/em><\/li>\n\n\n\n<li><strong>Refine<\/strong> \u2014 <em>&#8220;Drop step 3, swap library X for Y, answer open question 2 with [your answer], then revise the plan.&#8221;<\/em><\/li>\n\n\n\n<li><strong>Reject and re-spec<\/strong> \u2014 if the plan reveals the spec was wrong or incomplete, <strong>go fix the spec first<\/strong>. Don&#8217;t patch a bad spec with a clever plan.<\/li>\n<\/ol>\n\n\n\n<p>Then implement <strong>one step at a time<\/strong>: have Claude do step 1, show the diff, run tests, confirm \u2014 then step 2. Small steps mean small diffs, easy review, and easy rollback when something goes sideways.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Enforcing the habit \u2014 three layers<\/h2>\n\n\n\n<p>Humans forget. The plan-first habit needs to be made nearly automatic so skipping it requires conscious effort. Three layers, weakest to strongest:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Layer 1 \u2014 Document the rule in <code>CLAUDE.md<\/code> (always do this)<\/h3>\n\n\n\n<p>Add this section to your root <code>CLAUDE.md<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>## Workflow Rules (MUST FOLLOW)\n\nWhen asked to implement any feature or non-trivial change:\n\n1. ALWAYS read the relevant spec file first (docs\/features\/&lt;name&gt;\/spec.md)\n2. ALWAYS propose a written plan before writing code. The plan must include:\n   - Files to create or modify (exact paths)\n   - Approach and key library\/pattern choices\n   - Ordered implementation steps\n   - Open questions and assumptions\n   - Risks and trade-offs\n3. WAIT for explicit approval (\"approved\", \"proceed\", \"go ahead\") before writing code\n4. Implement ONE step at a time, show the diff, then pause\n5. If no spec exists, STOP and ask the user to create one first\n\nDo not write code in the same response as the plan, even if it seems obvious.\nDo not skip the plan for \"small\" changes \u2014 let the user decide what's small.\n<\/code><\/pre>\n\n\n\n<p>Claude reads this every session. It&#8217;s the foundation and handles most cases.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Layer 2 \u2014 Use Plan Mode in Claude Code (strongest built-in option)<\/h3>\n\n\n\n<p>Claude Code has a built-in <strong>Plan Mode<\/strong> designed exactly for this. When active, Claude is <strong>structurally prevented<\/strong> from making file edits or running write commands \u2014 it can only read, analyze, and propose. You explicitly exit Plan Mode to authorize execution.<\/p>\n\n\n\n<p>Enter it by pressing <strong>Shift+Tab<\/strong> to cycle through modes until you see Plan Mode in the UI. Because the mode is visible, you can&#8217;t accidentally forget you&#8217;re in it.<\/p>\n\n\n\n<p>This is the closest thing to real enforcement \u2014 a tool-level guardrail, not just a prompt-level instruction. Use it whenever you start work on a feature.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Layer 3 \u2014 Hooks (the nuclear option, for teams)<\/h3>\n\n\n\n<p>Claude Code supports <strong>hooks<\/strong> \u2014 scripts that run before or after Claude attempts certain actions. You can write a <code>PreToolUse<\/code> hook that blocks file-write tools (<code>str_replace<\/code>, <code>create_file<\/code>, write-capable <code>bash<\/code> commands) unless a marker file like <code>.claude\/plan-approved<\/code> exists in the workspace.<\/p>\n\n\n\n<p>Workflow becomes:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Claude proposes plan \u2192 no <code>.claude\/plan-approved<\/code> file \u2192 write tools blocked<\/li>\n\n\n\n<li>You review the plan and run <code>touch .claude\/plan-approved<\/code><\/li>\n\n\n\n<li>Claude can now write code<\/li>\n\n\n\n<li>After the feature ships, delete the file to reset<\/li>\n<\/ol>\n\n\n\n<p>Overkill for solo work, powerful for teams who want a hard guarantee. Adopt later if Layers 1 + 2 aren&#8217;t enough.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Recommended setup<\/h2>\n\n\n\n<p>Start with <strong>Layer 1 + Layer 2 together<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Put the workflow rules in <code>CLAUDE.md<\/code> \u2014 forms the habit, covers all chat-based interactions<\/li>\n\n\n\n<li>Use Plan Mode in Claude Code when starting any feature \u2014 catches the moments you forget<\/li>\n<\/ul>\n\n\n\n<p>That combination handles 99% of cases without needing hooks. Graduate to Layer 3 only if you&#8217;re still slipping past the plan step after a few weeks.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">One more practical tip \u2014 trigger phrases<\/h2>\n\n\n\n<p>Add this line to your <code>CLAUDE.md<\/code>:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><em>When I say &#8220;plan it&#8221; \u2014 produce a plan only, never code. When I say &#8220;ship it&#8221; \u2014 that&#8217;s approval to proceed with the next step.<\/em><\/p>\n<\/blockquote>\n\n\n\n<p>Now your verbal shortcuts carry the discipline. You don&#8217;t have to remember to write <em>&#8220;propose a plan first, don&#8217;t write code yet&#8221;<\/em> every time \u2014 two words do it.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The full rhythm so far<\/h2>\n\n\n\n<p>You now have the three-beat working pattern:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong><code>spec.md<\/code><\/strong> \u2014 what to build (durable, written down)<\/li>\n\n\n\n<li><strong>Plan<\/strong> \u2014 how to build it (reviewed before any code)<\/li>\n\n\n\n<li><strong>Code<\/strong> \u2014 one step at a time, reviewed as you go<\/li>\n<\/ol>\n\n\n\n<p>The point isn&#8217;t perfect enforcement \u2014 it&#8217;s making the right path the easy path. Both for Claude and for you. The speed of working with Claude comes from <strong>fewer wrong turns<\/strong>, not from typing faster.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Quick start checklist<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Add the <strong>Workflow Rules<\/strong> section to your root <code>CLAUDE.md<\/code><\/li>\n\n\n\n<li>Add the <strong>trigger phrases<\/strong> line (&#8220;plan it&#8221; \/ &#8220;ship it&#8221;) to the same file<\/li>\n\n\n\n<li>Learn the Plan Mode shortcut (Shift+Tab) in Claude Code<\/li>\n\n\n\n<li>For your next feature: write the spec \u2192 enter Plan Mode \u2192 ask Claude to plan \u2192 review \u2192 exit Plan Mode \u2192 implement one step at a time<\/li>\n\n\n\n<li>Revisit hooks (Layer 3) only if the habit still slips after a few weeks<\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>What this is The third habit (after CLAUDE.md and spec.md) when working with Claude on real features: always make Claude [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[916],"tags":[],"class_list":["post-3513","post","type-post","status-publish","format-standard","hentry","category-claude"],"_links":{"self":[{"href":"https:\/\/aiopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/3513","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/aiopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/aiopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/aiopsschool.com\/blog\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/aiopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=3513"}],"version-history":[{"count":1,"href":"https:\/\/aiopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/3513\/revisions"}],"predecessor-version":[{"id":3515,"href":"https:\/\/aiopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/3513\/revisions\/3515"}],"wp:attachment":[{"href":"https:\/\/aiopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=3513"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/aiopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=3513"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/aiopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=3513"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}