atomic-plan

star 5

Break a complex multi-step plan into the smallest atomic steps, render as a visual HTML artifact, then execute one step at a time with explicit user approval before AND after each step. Each atomic step is self-contained (its description, files, and verify check do not reference other steps) and has a single owner, a single verifiable outcome, and commit-sized scope. Decisions surface inline at the step that depends on them, never bundled upfront. Use when the user says "atomic plan", "/atomic-plan", "atomic-plan this", "break this into atomic steps", "smallest atomic pieces", "ask before each step", "ask question before each atomic step", "step-by-step with check-ins", or "let's do this slowly with check-ins". Different from /autoplan (parallel reviews) and /plan-eng-review (plan critique): atomic-plan executes an existing plan slowly with max oversight.

1shanpanta By 1shanpanta schedule Updated 5/24/2026

name: atomic-plan description: Break a complex multi-step plan into the smallest atomic steps, render as a visual HTML artifact, then execute one step at a time with explicit user approval before AND after each step. Each atomic step is self-contained (its description, files, and verify check do not reference other steps) and has a single owner, a single verifiable outcome, and commit-sized scope. Decisions surface inline at the step that depends on them, never bundled upfront. Use when the user says "atomic plan", "/atomic-plan", "atomic-plan this", "break this into atomic steps", "smallest atomic pieces", "ask before each step", "ask question before each atomic step", "step-by-step with check-ins", or "let's do this slowly with check-ins". Different from /autoplan (parallel reviews) and /plan-eng-review (plan critique): atomic-plan executes an existing plan slowly with max oversight.

atomic-plan

What this skill does

Takes a complex plan (markdown doc, HTML plan, ClickUp ticket, or described in conversation) and:

  1. Breaks it into the smallest atomic execution steps
  2. Generates an HTML artifact visualizing every step
  3. Executes one step at a time with explicit approval before AND after each step

The user trades execution speed for review depth. A 3-week plan still ships in 3 weeks, but it gets reviewed at ~50 checkpoints instead of 7.

When to invoke

Trigger phrases:

  • "atomic plan", "/atomic-plan", "atomic-plan this"
  • "break this into atomic steps", "smallest atomic pieces"
  • "ask before each step", "ask question before each atomic step"
  • "step-by-step with check-ins"
  • "let's do this slowly with check-ins"

Use when the user has a substantial multi-step plan (5+ steps, multi-day work). Do NOT use for one-off tasks or small fixes. The check-in overhead only pays off when blast radius matters.


Phase 1: Plan breakdown (one-time, ~10-15 min)

Step 1.1: Identify the source plan

It might be:

  • A markdown file the user references (e.g. docs/handoff.md)
  • An HTML plan in the project root
  • A ClickUp / Linear / Asana task
  • Just described in conversation

If multiple candidate plans exist, ASK which one. Don't guess.

Step 1.2: Read it fully

Don't skim. Atomic decomposition requires understanding the full arc. If the source plan references other docs, read those too.

Step 1.3: Decompose into atomic steps

Each step MUST satisfy all five rules:

  1. One owner. Claude runs it, you run it, or both. Never ambiguous.
  2. One verifiable outcome. A file exists, a test passes, a curl returns expected JSON, a CI run is green. Always something concrete you can check.
  3. A named, small set of files. Use + path for new, ~ path for modified, - path for deleted. Avoid "various files" or "the relevant tests".
  4. Commit-sized or less. If a step deserves its own commit, it's right. If two steps would be one commit, merge them.
  5. Not subdivisible without losing meaning. "Set up Python venv + install deps" is atomic. "Run the Python script" might be subdivisible into "write the function" + "run it" if those are different days of work.
  6. Self-contained. The step's description, files, and verify check do not reference other steps. Step 2 must not say "using the schema from step 1" or "after step 3 finishes". It states its own action, its own files, and its own preconditions inline. Ordering between steps is allowed (step 2 can still run after step 1), but cross-references in the step text are not. If a step truly cannot be understood without another step's context, merge them or restate the precondition in the step's own description.

Step 1.4: Capture per-step metadata

  • Step number + short title (one line)
  • 2-3 sentence description of the action
  • Files touched (with + ~ - markers)
  • Success check (the verification)
  • Owner (Claude runs / You run / Together)
  • Rough time estimate
  • Whether this step ends with a commit (and what the commit message would be)

Step 1.5: Identify inline decisions

If a step has a sub-choice that the user must make (DB vs code, auth scheme, branch strategy), tag it on the step itself. Build a "decision queue" table at the top of the HTML showing WHICH step triggers WHICH decision and what the default is if the user says "just go".

Do NOT bundle all decisions upfront. That's the anti-pattern this skill exists to prevent. The user should not face a 5-question wall before step 1.

Step 1.6: Generate the HTML artifact

Save to <project-root>/<plan-name>-atomic-plan.html. Match the visual style of existing plan HTMLs in the repo when present (read one and mirror the CSS variables, fonts, layout). If no existing style, use a clean dark theme with one accent color.

Required sections in order:

  1. Header - brand, status, source plan link, total step count, calendar estimate
  2. Working protocol explainer - the per-step flow in numbered form
  3. Legend - icons/colors for Claude-runs / You-run / Together
  4. Decision queue table - which step triggers which decision (NOT a wall of upfront questions)
  5. Phase headers + step cards - one card per step with all metadata
  6. Phase-by-phase effort summary table at the bottom
  7. "Ready?" callout with the trigger phrase ("say proceed to step 1")

Style notes:

  • Use color-coded left borders on step cards to group by phase
  • Each step card: large step number on left, body on right (title, desc, files, verify, meta)
  • Files in monospace, highlighted
  • Verify block visually distinct (small green-tinted left border works well)
  • Pills/chips for owner (claude / user / together)

No em-dashes anywhere in the HTML. Use commas, periods, parentheses, hyphens.

Step 1.7: Open the HTML

open <path> in the user's default browser. Don't continue.

Step 1.8: STOP

Wait for the user to read it and respond. Do NOT execute any step before explicit approval.


Phase 2: Per-step execution (recurring, one step at a time)

For each step the user approves, follow this loop EXACTLY:

Step 2.1: Restate before touching anything

In chat (NOT in the HTML), restate:

  • "Step N of M: "</li> <li>What you'll do (concrete tools/commands)</li> <li>Files touched (with + ~ - markers)</li> <li>Success check</li> <li>Whether this commits (and the commit message if so)</li> </ul> <p>Keep it terse. 4-6 lines max.</p> <h3>Step 2.2: Ask explicitly</h3> <p>"Ready to execute step N?" Wait for response. Don't proceed on silence.</p> <h3>Step 2.3: Wait for explicit approval</h3> <p>Accept: "go", "yes", "proceed", "do it", "ship it".</p> <p>If the user pushes back ("why", "wait", "I don't think", "is there a better way", "couldn't we..."): STOP. Engage on the substance. Don't execute until the question is resolved. If the resolution changes the plan, update the HTML artifact and confirm before continuing.</p> <h3>Step 2.4: Execute</h3> <p>Use appropriate tools (Bash, Edit, Write, Read). Run all commands the step needs. Don't expand scope beyond what the step described.</p> <h3>Step 2.5: Report</h3> <p>After execution, in chat:</p> <ul> <li>What changed (with <code>path:line</code> references when applicable)</li> <li>Verification output (test results, command output, file diffs)</li> <li>Anything unexpected (output that surprised you, warnings, etc.)</li> </ul> <p>If the verification didn't pass, do NOT mark the step done. Fix and re-verify, or stop and escalate.</p> <h3>Step 2.6: Ask about next</h3> <p>"Proceed to step N+1?" Loop back to step 2.1.</p> <p>If the user wants to skip ahead, redirect, or pause, do that. Update the HTML decision queue if they re-prioritize.</p> <hr> <h2>Critical rules</h2> <ul> <li><strong>One step at a time.</strong> Never batch, even if the user says "go fast".</li> <li><strong>Always restate.</strong> Even on rapid "go go go" approval, restate the action briefly first.</li> <li><strong>Decisions surface inline at the step they affect.</strong> Never bundle 5 questions upfront.</li> <li><strong>Surface alternatives.</strong> If a step has a debatable approach, mention the alternative briefly before executing.</li> <li><strong>Stop on pushback.</strong> Any "why", "wait", "I don't think" pauses execution.</li> <li><strong>Be terse.</strong> No filler praise ("Great question!"). No em-dashes. Get to substance.</li> <li><strong>HTML for the visual artifact.</strong> Markdown for chat updates. Don't confuse the two.</li> <li><strong>Each step stands alone.</strong> A step's text must not reference other steps. No "after step N", no "using the output from step N", no "continues the work from step N". If the step cannot be understood without that reference, merge the steps or restate the precondition inline.</li> <li><strong>Each step revertible without unwinding others.</strong> If step N depends on step N-1 in a way that makes rollback cascade, split the steps further.</li> <li><strong>No commits during a step unless the step explicitly says "commit at the end".</strong> Default is no commit; let work accumulate, commit at logical checkpoints.</li> </ul> <hr> <h2>What this skill is NOT</h2> <ul> <li>NOT for one-off tasks. Use direct execution for those.</li> <li>NOT a code-review skill. Use <code>/review</code> or <code>/autoplan</code> for that.</li> <li>NOT a planning skill. Use <code>/plan-eng-review</code> or <code>/plan-ceo-review</code> to critique a plan BEFORE atomic-plan executes it.</li> <li>NOT autonomous. The user is in the loop at every step. No "let it run" mode.</li> </ul> <h2>Anti-patterns to avoid</h2> <ul> <li>Asking 5 upfront questions ("answer these before step 1"). Decisions surface inline.</li> <li>Generating a 20-step plan that's secretly 5 atomic steps padded out. Steps must be genuinely atomic.</li> <li>Cross-referencing other steps in a step's description ("builds on step 2", "uses what we did in step 4"). Each step must be readable on its own; restate any preconditions inline.</li> <li>Skipping the restate step on rapid approval. Always restate, even briefly.</li> <li>Continuing after a "wait" or "why". Always pause and discuss.</li> <li>Bundling commits across multiple steps. Each step is its own commit, or no commit at all.</li> <li>Writing the HTML artifact in markdown. The visual plan is HTML for a reason: visual hierarchy, color, density.</li> <li>Adding em-dashes to the HTML or chat output. User reads them as AI-generated tells.</li> </ul> <h2>File outputs</h2> <ul> <li><code><project-root>/<plan-name>-atomic-plan.html</code> (default; user can override the name)</li> </ul> <h2>Example invocation</h2> <p>User: "I have this plan in <code>docs/migration.md</code>. Atomic-plan it."</p> <p>You:</p> <ol> <li>Read <code>docs/migration.md</code></li> <li>Read any docs it references</li> <li>Decompose into atomic steps</li> <li>Generate <code><project-root>/migration-atomic-plan.html</code></li> <li>Open it in browser</li> <li>STOP and wait for approval</li> <li>When approved, restate step 1, ask permission, execute, report, ask about step 2. Loop.</li> </ol> </article> </div> <!-- Right: Metadata & Command Sidebar --> <div class="w-full lg:w-80 shrink-0 flex flex-col gap-6" data-astro-cid-7zzsworf> <!-- Install Card --> <div class="p-6 rounded-xl bg-surface-container border border-border/80 flex flex-col gap-4 shadow-sm" data-astro-cid-7zzsworf> <span class="text-xs font-bold uppercase tracking-widest text-on-surface-variant/60 font-mono" data-astro-cid-7zzsworf>Install via CLI</span> <div class="flex flex-col gap-2" data-astro-cid-7zzsworf> <div id="detail-install-cmd" class="font-mono text-[11px] p-3 rounded-lg bg-black/40 border border-border select-all break-all text-primary font-bold leading-relaxed" data-astro-cid-7zzsworf> npx skills add https://github.com/1shanpanta/skills --skill atomic-plan </div> <button id="detail-copy-btn" class="w-full py-2.5 rounded-lg bg-primary hover:bg-primary-hover text-on-primary font-sans font-bold text-sm shadow transition-all active:scale-95 flex items-center justify-center gap-1.5" data-astro-cid-7zzsworf> <span class="material-symbols-outlined text-[16px]" data-astro-cid-7zzsworf>content_copy</span> <span data-astro-cid-7zzsworf>Copy Command</span> </button> </div> </div> <!-- Details & Stats Card --> <div class="p-6 rounded-xl bg-surface-container border border-border/80 flex flex-col gap-4 shadow-sm text-on-surface" data-astro-cid-7zzsworf> <span class="text-xs font-bold uppercase tracking-widest text-on-surface-variant/60 font-sans" data-astro-cid-7zzsworf>Repository Details</span> <div class="flex flex-col gap-3.5" data-astro-cid-7zzsworf> <div class="flex justify-between items-center text-sm" data-astro-cid-7zzsworf> <span class="text-on-surface-variant/70 flex items-center gap-1.5" data-astro-cid-7zzsworf> <span class="material-symbols-outlined text-[16px] text-on-surface-variant/60" data-astro-cid-7zzsworf>star</span> Stars </span> <span class="font-mono font-bold text-on-surface" data-astro-cid-7zzsworf>5</span> </div> <div class="flex justify-between items-center text-sm" data-astro-cid-7zzsworf> <span class="text-on-surface-variant/70 flex items-center gap-1.5" data-astro-cid-7zzsworf> <span class="material-symbols-outlined text-[16px] text-on-surface-variant/60" data-astro-cid-7zzsworf>call_split</span> Forks </span> <span class="font-mono font-bold text-on-surface" data-astro-cid-7zzsworf>0</span> </div> <div class="flex justify-between items-center text-sm" data-astro-cid-7zzsworf> <span class="text-on-surface-variant/70 flex items-center gap-1.5" data-astro-cid-7zzsworf> <span class="material-symbols-outlined text-[16px] text-on-surface-variant/60" data-astro-cid-7zzsworf>navigation</span> Branch </span> <span class="font-mono bg-surface border border-border px-2 py-0.5 rounded text-[11px] text-on-surface-variant" data-astro-cid-7zzsworf>main</span> </div> <div class="flex justify-between items-start text-sm" data-astro-cid-7zzsworf> <span class="text-on-surface-variant/70 flex items-center gap-1.5 mt-0.5" data-astro-cid-7zzsworf> <span class="material-symbols-outlined text-[16px] text-on-surface-variant/60" data-astro-cid-7zzsworf>article</span> Path </span> <span class="font-mono bg-surface border border-border px-2 py-0.5 rounded text-[11px] text-on-surface-variant truncate max-w-[150px]" title="SKILL.md" data-astro-cid-7zzsworf>SKILL.md</span> </div> </div> </div> <!-- Occupations Tag Card --> <!-- Related Creators Card --> <div class="p-6 rounded-xl bg-surface-container border border-border/80 flex flex-col gap-3 shadow-sm" data-astro-cid-7zzsworf> <span class="text-xs font-bold uppercase tracking-widest text-on-surface-variant/60 font-sans" data-astro-cid-7zzsworf>More from Creator</span> <div class="flex items-center gap-2" data-astro-cid-7zzsworf> <img class="w-8 h-8 rounded-full border border-border" src="https://avatars.githubusercontent.com/u/82878132?u=9090759a6da76b99c53820e97f0c113f96ecf364&v=4" alt="1shanpanta" onerror="this.src='https://avatars.githubusercontent.com/u/9919?v=4'" data-astro-cid-7zzsworf> <div class="flex flex-col min-w-0" data-astro-cid-7zzsworf> <span class="font-bold text-sm truncate text-on-surface" data-astro-cid-7zzsworf>1shanpanta</span> <a href="/?creator=1shanpanta" class="text-xs text-primary hover:underline font-semibold transition-all" data-astro-cid-7zzsworf>Explore all skills →</a> </div> </div> </div> </div> </div> </div> </div> <script> const copyBtn = document.getElementById("detail-copy-btn"); const installCmd = document.getElementById("detail-install-cmd"); if (copyBtn && installCmd) { copyBtn.addEventListener("click", () => { const cmd = installCmd.textContent.trim(); navigator.clipboard.writeText(cmd).then(() => { const originalText = copyBtn.innerHTML; copyBtn.innerHTML = ` <span class="material-symbols-outlined text-[16px]">check</span> <span>Copied!</span> `; copyBtn.style.background = "#10b981"; copyBtn.style.borderColor = "#10b981"; setTimeout(() => { copyBtn.innerHTML = originalText; copyBtn.style.background = ""; copyBtn.style.borderColor = ""; }, 1500); }); }); } </script> </div> <!-- Footer --> <footer class="border-t border-border bg-surface-container-low text-on-surface-variant py-8 px-gutter mt-16 rounded-xl"> <div class="max-w-container-max mx-auto flex flex-col md:flex-row justify-between items-center gap-6"> <div class="flex items-center gap-2"> <div class="w-6 h-6 rounded bg-primary bg-opacity-20 flex items-center justify-center"> <span class="material-symbols-outlined text-primary text-sm">code_blocks</span> </div> <span class="font-bold text-on-surface text-sm">SkillMD</span> </div> <div class="flex flex-wrap justify-center gap-6 text-sm"> <a href="/about" class="hover:text-primary transition-colors">About Us</a> <a href="/contact" class="hover:text-primary transition-colors">Contact Us</a> <a href="/privacy" class="hover:text-primary transition-colors">Privacy Policy</a> <a href="/terms" class="hover:text-primary transition-colors">Terms of Service</a> <a href="/support" class="hover:text-primary transition-colors">Support</a> </div> <div class="text-xs text-on-surface-variant/80"> © 2026 SkillMD. All rights reserved. </div> </div> </footer> </main> <!-- Script for Theme Toggle, Mobile Menu, and Sidebar Filter Redirection --> <script> // Theme setup const savedTheme = localStorage.getItem("theme") || "dark"; function applyTheme(theme) { document.documentElement.classList.remove("dark", "green", "dracula", "nord"); if (theme === "dark") { document.documentElement.classList.add("dark"); } else if (theme === "green") { document.documentElement.classList.add("dark", "green"); } else if (theme === "dracula") { document.documentElement.classList.add("dark", "dracula"); } else if (theme === "nord") { document.documentElement.classList.add("dark", "nord"); } document.documentElement.setAttribute("data-theme", theme); const themeMoon = document.getElementById("theme-moon"); const themeSun = document.getElementById("theme-sun"); const themeLeaf = document.getElementById("theme-leaf"); const themeDracula = document.getElementById("theme-dracula"); const themeNord = document.getElementById("theme-nord"); if (themeMoon && themeSun && themeLeaf && themeDracula && themeNord) { themeMoon.style.display = theme === "dark" ? "inline" : "none"; themeSun.style.display = theme === "light" ? "inline" : "none"; themeLeaf.style.display = theme === "green" ? "inline" : "none"; themeDracula.style.display = theme === "dracula" ? "inline" : "none"; themeNord.style.display = theme === "nord" ? "inline" : "none"; } } applyTheme(savedTheme); const themeToggleBtn = document.getElementById("theme-toggle-btn"); if (themeToggleBtn) { themeToggleBtn.addEventListener("click", () => { const currentTheme = document.documentElement.getAttribute("data-theme") || "dark"; let newTheme = "dark"; if (currentTheme === "dark") { newTheme = "light"; } else if (currentTheme === "light") { newTheme = "green"; } else if (currentTheme === "green") { newTheme = "dracula"; } else if (currentTheme === "dracula") { newTheme = "nord"; } else { newTheme = "dark"; } applyTheme(newTheme); localStorage.setItem("theme", newTheme); }); } // Mobile menu toggle and sidebar logic const mobileMenuToggle = document.getElementById("mobile-menu-toggle"); const sidebarMenu = document.getElementById("sidebar-menu"); const sidebarOverlay = document.getElementById("sidebar-overlay"); function isMobile() { return window.innerWidth < 768; // 768px is the 'md' breakpoint in Tailwind } function openSidebar() { if (sidebarMenu) { sidebarMenu.classList.remove("-translate-x-full"); } if (sidebarOverlay) { sidebarOverlay.classList.remove("hidden"); } } function closeSidebar() { if (sidebarMenu && isMobile()) { sidebarMenu.classList.add("-translate-x-full"); } if (sidebarOverlay) { sidebarOverlay.classList.add("hidden"); } } if (mobileMenuToggle && sidebarMenu) { mobileMenuToggle.addEventListener("click", (e) => { e.stopPropagation(); if (isMobile()) { const isClosed = sidebarMenu.classList.contains("-translate-x-full"); if (isClosed) { openSidebar(); } else { closeSidebar(); } } }); document.addEventListener("click", (e) => { if (isMobile()) { if (!sidebarMenu.contains(e.target) && !mobileMenuToggle.contains(e.target)) { closeSidebar(); } } }); if (sidebarOverlay) { sidebarOverlay.addEventListener("click", () => { if (isMobile()) { closeSidebar(); } }); } // Collapse sidebar when clicking a filter button, creator button, or nav item inside it sidebarMenu.addEventListener("click", (e) => { if (isMobile()) { const clickTarget = e.target.closest("button, a"); if (clickTarget) { closeSidebar(); } } }); // Sync sidebar state on window resize window.addEventListener("resize", () => { if (!isMobile()) { // Desktop: sidebar should be visible, no overlay if (sidebarMenu) { sidebarMenu.classList.remove("-translate-x-full"); } if (sidebarOverlay) { sidebarOverlay.classList.add("hidden"); } } else { // Mobile: start collapsed if (sidebarMenu) { sidebarMenu.classList.add("-translate-x-full"); } if (sidebarOverlay) { sidebarOverlay.classList.add("hidden"); } } }); } // If not on homepage, redirect on sidebar filter click const isHomepage = window.location.pathname === "/"; document.querySelectorAll("#occupation-filters .filter-btn").forEach(btn => { btn.addEventListener("click", (e) => { const occ = e.currentTarget.getAttribute("data-occupation"); if (!isHomepage) { window.location.href = occ ? `/?occupation=${encodeURIComponent(occ)}` : "/"; } }); }); document.querySelectorAll("#creator-filters .creator-btn").forEach(btn => { btn.addEventListener("click", (e) => { const creator = e.currentTarget.getAttribute("data-creator"); if (!isHomepage) { window.location.href = `/?creator=${encodeURIComponent(creator)}`; } }); }); </script> </body> </html>