<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Nick Porter</title>
    <description>The latest articles on Forem by Nick Porter (@nick_porter_0cfcbc03e871f).</description>
    <link>https://forem.com/nick_porter_0cfcbc03e871f</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3614388%2F1f31ea8b-c453-48de-9aea-8246f3677403.jpg</url>
      <title>Forem: Nick Porter</title>
      <link>https://forem.com/nick_porter_0cfcbc03e871f</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/nick_porter_0cfcbc03e871f"/>
    <language>en</language>
    <item>
      <title>New fav claude CLI commands: /primer &amp; /wrap-up</title>
      <dc:creator>Nick Porter</dc:creator>
      <pubDate>Mon, 17 Nov 2025 17:10:30 +0000</pubDate>
      <link>https://forem.com/nick_porter_0cfcbc03e871f/new-fav-claude-cli-commands-primer-wrap-up-59i4</link>
      <guid>https://forem.com/nick_porter_0cfcbc03e871f/new-fav-claude-cli-commands-primer-wrap-up-59i4</guid>
      <description>&lt;p&gt;I have been weaving command into my daily workflow quite frequently lately! It all started when I realized I was repeating the same set of requests or questions to claude at specific intervals, the start of the conversation and when I was ready to wrap up and get all the lint and tests passing.&lt;/p&gt;

&lt;p&gt;As an example of some of the things I would continuously ask claude to make sure they took care of were:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In The Start Of Conversations:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;-use SPARC (see other article)&lt;br&gt;
-make sure to prefer skills over grep&lt;br&gt;
-write code cleanly the first time or you'll be forced to clean it up on pre-commit&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;At The End Of Conversations:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;-ALL tests and lint warnings/errors HAVE to be fixed (sorry to caps out on ya there but I told claude this a whole lotta times!)&lt;br&gt;
-really all the files that are yet to be committed ARE part of the work we did, so REALLY you have to clean ALL of them up&lt;br&gt;
-that last attempt at eslint ignore is sus claude! go back and take your time QUALITY &amp;gt; SPEED&lt;/p&gt;

&lt;p&gt;So in the middle of doing it again I stopped, opened a different claude and asked it to write our first command ...&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;/primer&lt;/code&gt; - Quality Engineering Mode Activation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Purpose: This command activates a structured workflow that prevents "jumping straight to code" - one of the&lt;br&gt;
  most common failure patterns in AI-assisted development. It's essentially a mental reset that enforces&lt;br&gt;
  disciplined engineering practices.&lt;/p&gt;

&lt;p&gt;Intent: To ensure Claude (or any developer) follows the RESEARCH → PLAN → EXECUTE workflow instead of immediately implementing solutions without understanding the full context.&lt;/p&gt;

&lt;p&gt;How It Works:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Mindset Activation: Reminds the AI that it's working on a production app with real users, establishing core principles (Quality &amp;gt; Speed, Tested &amp;gt; Assumed, Verified &amp;gt; Guessed)&lt;/li&gt;
&lt;li&gt;Three-Phase Workflow:

&lt;ul&gt;
&lt;li&gt;Phase 1 (Research): Load memory files, consult relevant skills (specialized documentation), verify current state via git/console/database&lt;/li&gt;
&lt;li&gt;Phase 2 (Plan): Choose appropriate scale (5-15 min bug fix vs 2-4 hour major feature), select TDD approach, present plan for approval&lt;/li&gt;
&lt;li&gt;Phase 3 (Execute): Only proceeds after user approval - write tests first, implement, cleanup, run quality gates&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Anti-Pattern Prevention: Explicitly calls out common pitfalls like "The Grep Trap" (searching raw code instead of consulting curated knowledge) and "The Shortcut Temptation" (rushing after a few tasks)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Implementation Details:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uses a memory system (.claude/memory/) for persistent context across sessions&lt;/li&gt;
&lt;li&gt;Integrates with 16+ specialized "skills" (domain-specific guides)&lt;/li&gt;
&lt;li&gt;Enforces Test-Driven Development via 3 path choices&lt;/li&gt;
&lt;li&gt;Requires explicit user approval between phases (prevents autonomous runaway)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;/wrap-up&lt;/code&gt; - Pre-Push Quality Verification&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Purpose: A comprehensive pre-commit checklist that ensures nothing broken or undocumented makes it to the repository. Think of it as an automated "Did I forget anything?" system.&lt;/p&gt;

&lt;p&gt;Intent: To enforce completion standards before code leaves the developer's machine - the "last 10%" that often gets skipped when rushing. &lt;/p&gt;

&lt;p&gt;We have EXPLICIT documentation for claude that that LAST 10% is the MOST important 10% and no skipping is allowed!&lt;/p&gt;

&lt;p&gt;How It Works:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Inventory Phase: Runs git status to identify ALL modified files (staged, un-staged, and untracked)&lt;/li&gt;
&lt;li&gt;Autonomous Quality Gates (runs in background):

&lt;ul&gt;
&lt;li&gt;TypeScript type checking&lt;/li&gt;
&lt;li&gt;ESLint validation (with strict rules against warnings in modified files)&lt;/li&gt;
&lt;li&gt;Security audit (SQL injection, XSS, RLS policy checks)&lt;/li&gt;
&lt;li&gt;Architecture review (React 19 compliance, Boy Scout Rule violations)&lt;/li&gt;
&lt;li&gt;Test execution&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Memory System Updates (MANDATORY):

&lt;ul&gt;
&lt;li&gt;Session file: Documents what was done, problems encountered, solutions found, patterns established&lt;/li&gt;
&lt;li&gt;Known-gotchas: ONLY for critical, cross-cutting production issues (with strict bloat prevention)&lt;/li&gt;
&lt;li&gt;Common-patterns: ONLY for reusable cross-domain snippets (also bloat-protected)&lt;/li&gt;
&lt;li&gt;Skills: Domain-specific learnings update relevant specialized guides&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Final Status Report: Presents a checklist-style summary with all quality gate results and files ready for commit&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Implementation Details:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quality gates run in parallel for speed (40s total vs 55s sequential)&lt;/li&gt;
&lt;li&gt;Uses AI-powered code review (Haiku model) for pattern detection&lt;/li&gt;
&lt;li&gt;Enforces strict documentation standards (prevents knowledge loss between sessions)&lt;/li&gt;
&lt;li&gt;Includes bloat prevention mechanisms (session files vs shared memory)&lt;/li&gt;
&lt;li&gt;Requires explicit user approval before committing (no autonomous commits)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Killer Innovation: The memory update requirement ensures that learnings persist across AI sessions - solving the "every new Claude starts from zero" problem.&lt;/p&gt;

&lt;p&gt;Let's show how I use 2 commands for this bug fix!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Bug&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can see here a simple translation problem right, well, just open claude, hit /primer and explain the problem with a screen shot as shown here then let claude do the work.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwpd7diy9ggeygfq4lpmj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwpd7diy9ggeygfq4lpmj.png" alt=" " width="800" height="399"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When claude is done do /wrap-up. Claude will make sure you want to push the code up, but when your ready you just say 'push' and kick back!&lt;/p&gt;

&lt;p&gt;Welp ... not quite so fast homie! Check out the repro ...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm7526vnjxtkbllz45iew.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm7526vnjxtkbllz45iew.png" alt=" " width="800" height="399"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ok no worries let's jsut show that to claude and let em do it's thing! &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0s4hld2bal8x2oq2fooh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0s4hld2bal8x2oq2fooh.png" alt=" " width="800" height="1023"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;NOW we're ready for &lt;code&gt;/wrap-up&lt;/code&gt;!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flsdkx0cn8mza1c2ij3jy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flsdkx0cn8mza1c2ij3jy.png" alt=" " width="800" height="564"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It learned how to flatten the intl json properly and documented it in  /session (in another article!)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbowqq2gn9i5codi7e41a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbowqq2gn9i5codi7e41a.png" alt=" " width="800" height="564"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It ALSO updated the intl skill without me needing to ask it!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkmnz5kvoy2lzs7wae5mz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkmnz5kvoy2lzs7wae5mz.png" alt=" " width="800" height="564"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now just tell it 'push'!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flkb0834ojp7ryqf10o6f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flkb0834ojp7ryqf10o6f.png" alt=" " width="800" height="564"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's that, super friction free workflow!&lt;/p&gt;

</description>
      <category>claude</category>
      <category>ai</category>
    </item>
    <item>
      <title>Session Vs. Memory in claude CLI /memory: Finally Context That Survives!</title>
      <dc:creator>Nick Porter</dc:creator>
      <pubDate>Mon, 17 Nov 2025 02:51:20 +0000</pubDate>
      <link>https://forem.com/nick_porter_0cfcbc03e871f/session-vs-memory-in-claude-cli-memory-finally-context-that-survives-4pb6</link>
      <guid>https://forem.com/nick_porter_0cfcbc03e871f/session-vs-memory-in-claude-cli-memory-finally-context-that-survives-4pb6</guid>
      <description>&lt;p&gt;There are TWO features in the new /memory capability in claude CLI:&lt;br&gt;
-session&lt;br&gt;
-memory&lt;/p&gt;

&lt;p&gt;I discovered this after inspecting /context after JUST starting a new claude session and running my new fav command at startup /primer (more on this amazing command in another article) and seeing I had already taken up about 12 bubbles!!! WAY too much for the start of a session. &lt;/p&gt;

&lt;p&gt;There are 3 primary files that make up the /memory file system in my workflow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;project-context.md - The "what's the current state" file&lt;/li&gt;
&lt;li&gt;architecture-decisions.md - The "why we chose X over Y" file&lt;/li&gt;
&lt;li&gt;known-gotchas.md - The "problems and solutions" file&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;When I had allowed 2 of these files to grow to over 1200 lines each THAT was what was burning up my early conversation context!! So I trimmed ALL 3 down to less then 500 lines and BAM when I run a new claude and a /primer I see this!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmzb32ffsqacfflq5h11m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmzb32ffsqacfflq5h11m.png" alt=" " width="800" height="379"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So the big message there is keep these 3 files trim and under 500 lines each!&lt;/p&gt;

&lt;p&gt;Now let's move on to this slightly more interesting session. How does session work and how are it's benefits useful to us?&lt;/p&gt;

&lt;p&gt;Session files (in .claude/memory/sessions/[date]-[topic].md) are different from those three core files.&lt;/p&gt;

&lt;p&gt;Session files are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Task-specific - Created AFTER completing a major task&lt;/li&gt;
&lt;li&gt;Deep dives - More detailed than the core files (can be longer, like 500-800 lines)&lt;/li&gt;
&lt;li&gt;Selectively read - Only read when RELEVANT to current work&lt;/li&gt;
&lt;li&gt;Historical record - "What did we learn when we built X?"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key difference:&lt;/p&gt;

&lt;p&gt;Core 3 files (project-context, architecture-decisions, known-gotchas):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Read at EVERY session startup&lt;/li&gt;
&lt;li&gt;MUST be short (&amp;lt;500 lines, ideally &amp;lt;300)&lt;/li&gt;
&lt;li&gt;Broad overview, not deep details&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Session files:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Read ONLY when continuing related work&lt;/li&gt;
&lt;li&gt;CAN be longer (500-800 lines)&lt;/li&gt;
&lt;li&gt;Deep details about specific implementations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example:&lt;br&gt;
Session 1 (Monday): Build Fitbit integration&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Claude reads the core 3 files (startup)&lt;/li&gt;
&lt;li&gt;Implements feature&lt;/li&gt;
&lt;li&gt;Creates &lt;code&gt;sessions/2025-11-04-fitbit-integration.md&lt;/code&gt; with all the details&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Session 2 (Tuesday): Build WHOOP integration&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Claude reads the core 3 files (startup)&lt;/li&gt;
&lt;li&gt;Claude ALSO reads &lt;code&gt;sessions/2025-11-04-fitbit-integration.md&lt;/code&gt; (because it's relevant)&lt;/li&gt;
&lt;li&gt;Reuses patterns from Fitbit&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Session 3 (Wednesday): Fix unrelated bug&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Claude reads the core 3 files (startup)&lt;/li&gt;
&lt;li&gt;Does NOT read Fitbit session file (not relevant)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So let's see what this would look like in a real world example when I give claude a prompt to look into something we just fixed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0iegjqq9v7yn9jbol8o7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0iegjqq9v7yn9jbol8o7.png" alt=" " width="800" height="582"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can see claude initally goes to git BUT then it looks at session and finds the latest and FULL picture! I feel like session WAS the missing link. I have seen full bug fixes based on JUST session and the existing skills! So rewarding NOT having to tell claude what we did recently!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>vscode</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Nick Porter</dc:creator>
      <pubDate>Mon, 17 Nov 2025 02:02:48 +0000</pubDate>
      <link>https://forem.com/nick_porter_0cfcbc03e871f/-47jo</link>
      <guid>https://forem.com/nick_porter_0cfcbc03e871f/-47jo</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/nick_porter_0cfcbc03e871f" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3614388%2F1f31ea8b-c453-48de-9aea-8246f3677403.jpg" alt="nick_porter_0cfcbc03e871f"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/nick_porter_0cfcbc03e871f/what-is-sparc-and-how-do-i-use-it-in-ai-infused-web-app-development-1p6o" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;SPARC Quality Gates and AI Infused Web App development&lt;/h2&gt;
      &lt;h3&gt;Nick Porter ・ Nov 17&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#nextjs&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#ai&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#javascript&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>nextjs</category>
      <category>ai</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>SPARC Quality Gates and AI Infused Web App development</title>
      <dc:creator>Nick Porter</dc:creator>
      <pubDate>Mon, 17 Nov 2025 01:53:27 +0000</pubDate>
      <link>https://forem.com/nick_porter_0cfcbc03e871f/what-is-sparc-and-how-do-i-use-it-in-ai-infused-web-app-development-1p6o</link>
      <guid>https://forem.com/nick_porter_0cfcbc03e871f/what-is-sparc-and-how-do-i-use-it-in-ai-infused-web-app-development-1p6o</guid>
      <description>&lt;p&gt;I use claude CLI to write my web application on the side that I love.  It's a NextJS app with supabase. After creating my own system of writing features with .md docs I needed a better and more reliable system. &lt;/p&gt;

&lt;p&gt;I started with a TDD approach being an old-school developer and I'll tell you why. TDD forced me to think about now only how the code SHOULD work but edge cases I would not normally consider when diving straight into code. &lt;/p&gt;

&lt;p&gt;Using a pure TDD system helped, it WAS a progression from the .md document system BUT it didn't fill all my needs. That's when I started copying other people. That is I used claude to research what teams at Anthropic were doing. Turns out some of the teams were using SPARC. So what the heck is SPARC!?!&lt;/p&gt;

&lt;p&gt;SPARC is a five-phase methodology that stands for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Specification&lt;/li&gt;
&lt;li&gt;Pseudocode&lt;/li&gt;
&lt;li&gt;Architecture&lt;/li&gt;
&lt;li&gt;Refinement&lt;/li&gt;
&lt;li&gt;Completion&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But here's the thing - it's not just another rigid framework. SPARC scales based on what you're actually doing.&lt;/p&gt;

&lt;p&gt;That's what hooked me.&lt;/p&gt;

&lt;p&gt;See, TDD told me to write tests first. Great. But it didn't tell me HOW MUCH planning a bug fix needs versus building an entire feature. It didn't give me a framework for "okay, this is a 10-minute task" versus "okay, this is a 3-hour task."&lt;/p&gt;

&lt;p&gt;SPARC does.&lt;/p&gt;

&lt;p&gt;The Three Scales That Changed Everything&lt;/p&gt;

&lt;p&gt;SPARC comes in three flavors, and this is where it clicked for me:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔬 SPARC-MICRO (5-15 minutes)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Use this for: Bug fixes, typos, quick config changes&lt;/p&gt;

&lt;p&gt;When a user reports "the recovery score shows NaN," I don't need 2 hours of planning. I need:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Specification: What's actually broken? (Check the browser console, reproduce it)&lt;/li&gt;
&lt;li&gt;Pseudocode: Write a test that proves it's broken&lt;/li&gt;
&lt;li&gt;Architecture: Fix it with the smallest possible change&lt;/li&gt;
&lt;li&gt;Refinement: Clean up the file while I'm there (more on this later)&lt;/li&gt;
&lt;li&gt;Completion: Make sure all tests pass&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it. 12 minutes start to finish. But I still hit all five phases.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⚡ SPARC-STANDARD (30-60 minutes)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Use this for: New features, API endpoints, UI components&lt;/p&gt;

&lt;p&gt;This is where SPARC really shines. When I'm adding a feature like "hide completed habits from the home page," I need MORE rigor than SPARC-MICRO, but not the full SYSTEM treatment.&lt;/p&gt;

&lt;p&gt;Same five phases, just deeper:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Specification: Write user story + acceptance criteria&lt;/li&gt;
&lt;li&gt;Pseudocode: Write comprehensive tests (this is where TDD lives!)&lt;/li&gt;
&lt;li&gt;Architecture: Build the feature to pass those tests&lt;/li&gt;
&lt;li&gt;Refinement: Refactor, extract shared logic, clean up&lt;/li&gt;
&lt;li&gt;Completion: All tests pass, TypeScript happy, linter happy&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This took me 47 minutes last week. Shipped a Premium feature, fully tested, zero tech debt.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🏗️ SPARC-SYSTEM (2-4 hours)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Use this for: Major features, new subsystems, complex integrations&lt;/p&gt;

&lt;p&gt;This is the big leagues. When I built my wearable device integration system (think Fitbit, WHOOP, Oura), I needed:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Specification: Architecture planning, component breakdown, dependency mapping&lt;/li&gt;
&lt;li&gt;Pseudocode: Parallel test writing for MULTIPLE components&lt;/li&gt;
&lt;li&gt;Architecture: Multi-file implementation with shared patterns&lt;/li&gt;
&lt;li&gt;Refinement: Cross-file refactoring, extract factories, create reusable types&lt;/li&gt;
&lt;li&gt;Completion: Integration tests + documentation (critical for future me!)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;3.5 hours. But when I was done? 44 tests passing, zero security issues, and a reusable architecture I used for 4 more providers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Secret Weapon: Automated Quality Gates&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here's where I went a bit crazy (in a good way).&lt;/p&gt;

&lt;p&gt;I set up a pre-commit hook that runs AUTOMATICALLY every time I try to commit:&lt;/p&gt;

&lt;p&gt;npm test              # All tests must pass&lt;br&gt;
  npm run type-check    # TypeScript must be happy&lt;br&gt;&lt;br&gt;
  npm run lint          # ESLint must be happy&lt;/p&gt;

&lt;p&gt;If ANY of these fail, the commit is blocked.&lt;/p&gt;

&lt;p&gt;No --no-verify escape hatch. No "I'll fix it later." No shortcuts.&lt;/p&gt;

&lt;p&gt;Sounds harsh, right? But here's the thing:&lt;/p&gt;

&lt;p&gt;Quality gates take 40 seconds. Debugging production bugs takes 2-8 hours.&lt;/p&gt;

&lt;p&gt;The ROI is 100x. I'm not exaggerating.&lt;/p&gt;

&lt;p&gt;Plus, I added AI-powered checks that run in parallel:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Static analysis (TypeScript + ESLint)&lt;/li&gt;
&lt;li&gt;Security audit (SQL injection, XSS, auth issues)&lt;/li&gt;
&lt;li&gt;Architecture review (catches React anti-patterns)&lt;/li&gt;
&lt;li&gt;The test suite&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;40 seconds total. Every commit. Zero compromises.&lt;/p&gt;

&lt;p&gt;The Boy Scout Rule (Automated Enforcement)&lt;/p&gt;

&lt;p&gt;Part of SPARC's "Refinement" phase is cleaning up. I follow the Boy Scout Rule:&lt;/p&gt;

&lt;p&gt;"Leave code cleaner than you found it"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I Learned After 4 Months&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I've been using SPARC for about 4 months now. Here's what changed:&lt;/p&gt;

&lt;p&gt;Before SPARC:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Good enough" mentality&lt;/li&gt;
&lt;li&gt;Tests were optional&lt;/li&gt;
&lt;li&gt;Bugs shipped to production weekly&lt;/li&gt;
&lt;li&gt;Tech debt piling up&lt;/li&gt;
&lt;li&gt;Fear of touching old code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After SPARC:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Test coverage: 80%+ (was 40%)&lt;/li&gt;
&lt;li&gt;Production bugs: 87% reduction&lt;/li&gt;
&lt;li&gt;TypeScript errors: 0 (was 200+)&lt;/li&gt;
&lt;li&gt;Time debugging: 71% reduction&lt;/li&gt;
&lt;li&gt;Confidence deploying: 10/10 (was 6/10)&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>nextjs</category>
      <category>ai</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>What is Completion Bias and how does it impact end of lifecycle</title>
      <dc:creator>Nick Porter</dc:creator>
      <pubDate>Mon, 17 Nov 2025 01:33:12 +0000</pubDate>
      <link>https://forem.com/nick_porter_0cfcbc03e871f/what-is-completion-bias-and-how-does-it-impact-end-of-lifecycle-idc</link>
      <guid>https://forem.com/nick_porter_0cfcbc03e871f/what-is-completion-bias-and-how-does-it-impact-end-of-lifecycle-idc</guid>
      <description>&lt;p&gt;I write in claude what me and my wife would qualify as ‘constantly’ so it became really frustrating when at the end of a very long running task (more on long running tasks later) and claude would we ready to declare victory! Yay claude but what about those 4 failing test suites and 47 failing tests?&lt;/p&gt;

&lt;p&gt;After explaining to claude repeatedly that in fact those test were not failing before this adventure and yes THEY had to fix them still I got realy tired of that. So I asked claude ‘yo claude what’s the deal?’ (discalimer this is AI generated below).&lt;/p&gt;

&lt;p&gt;What Completion Bias Is&lt;/p&gt;

&lt;p&gt;Completion bias = The psychological pressure to declare something “done” before it’s actually finished,&lt;br&gt;
especially when:&lt;br&gt;
— You’re running low on resources (time, energy, context tokens)&lt;br&gt;
— The work feels “good enough”&lt;br&gt;
— You’re eager to move on to the next thing&lt;br&gt;
— The final 10% feels tedious compared to the exciting 90%&lt;/p&gt;

&lt;p&gt;So in order to prevent Completion Bias we put a new system into place. The system has 7 checkpoints where completion bias gets caught.&lt;/p&gt;

&lt;p&gt;Detailed in our main claude.md file we utilize the SPARC system. I will talk more about the SPARC system in further articles. That system helps prevent Completion Bias with the following checks.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In the main claude.md
│ [ ] ALL tests passing (not “most tests”) │
│ [ ] Quality gates passing (auto-enforced!) │
│ [ ] Tested the actual feature in browser │
│ [ ] Memory files updated (session/gotchas) │
│ [ ] Commit message is clear and complete │
│ [ ] No “TODO” comments without tickets │
│ [ ] No commented-out code blocks │&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is specifically designed to catch: “Well, the code works, I’m done!”&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The “If You’re Thinking Any of These” Section&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;From CLAUDE.md — SPARC-C:&lt;br&gt;
If You’re Thinking Any of These:&lt;br&gt;
— ❌ “I’ll just skip this one test…”&lt;br&gt;
— ❌ “Good enough for now…”&lt;br&gt;
— ❌ “I’ll clean this up later…”&lt;br&gt;
— ❌ “This is taking too long…”&lt;br&gt;
— ❌ “Let me just commit what I have…”&lt;/p&gt;

&lt;p&gt;STOP. You’re in completion bias. Take a 5-minute break.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Autonomous Quality Gate System (The Enforcer)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;From CLAUDE.md:&lt;br&gt;
Quality gates BLOCK commits on:&lt;br&gt;
— Test failures&lt;br&gt;
— TypeScript errors&lt;br&gt;
— Lint errors&lt;br&gt;
— Security vulnerabilities (CRITICAL)&lt;br&gt;
— React 19 violations (useEffect, setTimeout)&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Conversation Checkpoints (Every 5 Tasks OR Post-Compaction)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;From CLAUDE.md:&lt;br&gt;
MANDATORY PAUSE — Read this out loud in your mind:&lt;/p&gt;

&lt;p&gt;“I am NOT in a hurry. The user values QUALITY over SPEED.&lt;br&gt;
Speed without quality is waste. I will NOT shortcut.&lt;br&gt;
Code quality is the ONLY measure of success.”&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Post-Compaction Protocol (Context Loss Recovery)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;From CLAUDE.md:&lt;br&gt;
YOU JUST WENT THROUGH COMPACTION. READ THIS CAREFULLY.&lt;/p&gt;

&lt;p&gt;Compaction removes context but CAN’T remove standards.&lt;/p&gt;

&lt;p&gt;POST-COMPACTION RESET CHECKLIST:&lt;br&gt;
— [ ] Re-read &lt;code&gt;.claude/memory/project-context.md&lt;/code&gt;&lt;br&gt;
— [ ] Re-read “RESEARCH → PLAN → EXECUTE” workflow&lt;br&gt;
— [ ] Re-read “SPARC-C: COMPLETION”&lt;br&gt;
— [ ] Commit to treating the NEXT task with the SAME quality as task #1&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;BUILDS, COMMITS, AND PUSHES: HUMAN APPROVAL REQUIRED&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;From CLAUDE.md:&lt;br&gt;
Committing and pushing is NEVER automatic.&lt;br&gt;
The human must explicitly request or approve EVERY commit and push.&lt;/p&gt;

&lt;p&gt;The Protocol:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Finish implementation → Run quality gates&lt;/li&gt;
&lt;li&gt;Update memory files → Document learnings&lt;/li&gt;
&lt;li&gt;Present completion status:
— ✅ Quality gate results
— 📋 Summary of what was implemented
— 📁 List of modified files
— 🧠 Memory files updated&lt;/li&gt;
&lt;li&gt;WAIT for human to test and approve&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If human requests commit: Draft message, get approval, execute&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Memory System (The Persistent Brain)&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;From CLAUDE.md:&lt;br&gt;
After EVERY major task:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;[ ] Update &lt;code&gt;.claude/memory/sessions/[date]-[topic].md&lt;/code&gt; with learnings&lt;/li&gt;
&lt;li&gt;[ ] Add gotchas to &lt;code&gt;.claude/memory/known-gotchas.md&lt;/code&gt; if hit problems&lt;/li&gt;
&lt;li&gt;[ ] Document patterns in &lt;code&gt;.claude/memory/common-patterns.md&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Run quality gates&lt;/li&gt;
&lt;li&gt;[ ] Wait for human approval before committing&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;With this system in place Completion Bias can be avoid or at least rewarded in a way that gets claude to finish their work!&lt;/p&gt;

&lt;p&gt;Hope this helps with your application building!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>nextjs</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Reclaiming context with claude code CLI</title>
      <dc:creator>Nick Porter</dc:creator>
      <pubDate>Mon, 17 Nov 2025 01:19:39 +0000</pubDate>
      <link>https://forem.com/nick_porter_0cfcbc03e871f/reclaiming-context-with-claude-code-cli-1hic</link>
      <guid>https://forem.com/nick_porter_0cfcbc03e871f/reclaiming-context-with-claude-code-cli-1hic</guid>
      <description>&lt;p&gt;When I first learned about using the /context command I was under the impression that once those little bubbles of context were used up they were sealed off forever. After using claude more I have really grown to appreciate the foresight it provides and I am using it in my overall workflow much more frequently.&lt;/p&gt;

&lt;p&gt;I use 2 MCP tools currently. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;chrome devtools&lt;/li&gt;
&lt;li&gt;supabase&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I rarely use devtools at this point and prefer a much fast copy paste approach to debugging but the supabase mcp has proved invaluable. The speed to delivery is probably a third of the time it would have normally taken to implement a new feature in the DB. &lt;/p&gt;

&lt;p&gt;The biggest gain there though has been the edge taken off by not having to copy paste HUGE sql files in to supabase, run into problems, do it again. That became frustration. BUT a supabase MCP article is for another day.&lt;/p&gt;

&lt;p&gt;What I found by regularly using these tools in my workflow is that they would eat up context quickly. You can see here that even early in the conversation a good chunk of context is already taken up by supabase tools&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqxqus7x83nk0iqrx84bn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqxqus7x83nk0iqrx84bn.png" alt=" " width="800" height="546"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Seems pretty manageable at first but problems can start happening after a conversation is compacted with claude and avoiding it or at least being aware of it ahead of time can be a great way to plan your overall project execution.&lt;/p&gt;

&lt;p&gt;So let's investigate a little further. This is deep into a conversation and at a point where I would consider wrapping up or handing off to another claude.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc7s5gph081i2py08kp5y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc7s5gph081i2py08kp5y.png" alt=" " width="800" height="525"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now this is where you can use the planning around context to your advantage because having checked /context at intervals during the development cycle you know now it's time to free up some of that valuable little cube space!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzqnvivt2lmbslawj3qhi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzqnvivt2lmbslawj3qhi.png" alt=" " width="800" height="288"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;so hit /mcp and free some of it up&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmqwoijddrrw1e2yg4f7g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmqwoijddrrw1e2yg4f7g.png" alt=" " width="800" height="284"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now you have about double the amount of free space you had before!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0n663vbtp4d22do85t81.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0n663vbtp4d22do85t81.png" alt=" " width="800" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Using this technique in my workflow has allowed me to prepare for when claude will start performing badly.&lt;/p&gt;

&lt;p&gt;What happens when claude goes through a compaction process or 2 or 3?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;marks tests as .skip instead of fixing them&lt;/li&gt;
&lt;li&gt;tried to change the pre-commit hook preventing bad code like eslinterrors and warnings&lt;/li&gt;
&lt;li&gt;hides results of the full tests results in it's output on pre-commit and requires further digging and prodding&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the thing claude suffers from Completion Bias. This is something I will talk more about in further articles but because of Completion Bias claude WANTS to think, and so there for wants to make you think, that claude is done working. Many times claude is NOT done and so you need to have measures in place to prevent bad code from going to production.&lt;/p&gt;

&lt;p&gt;I hope this helps you with your coding!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>nextjs</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
