Skip to content

Category: The Art of Vibe Coding

11 min read The Art of Vibe Coding

The Single File That Makes or Breaks Your Claude Code Workflow

I thought I was being thorough.

My CLAUDE.md file had grown to over 1,500 lines. Every coding convention I’d ever learned. Every edge case I’d encountered. Code snippets for common patterns. Integration examples for every third-party service we used. Database schema references. The works.

I was so proud of that file. Look at all this context I’m giving Claude! Surely this would make it understand my project perfectly.

(Narrator voice: It did not.)

Here’s what actually happened: Claude started missing obvious things. Instructions I knew were in there—ignored. Conventions I’d spelled out clearly—forgotten. The more I added to my CLAUDE.md, the worse Claude performed.

I’d accidentally discovered something that changed how I approach AI-assisted development entirely.

.

.

.

The problem wasn’t that Claude couldn’t follow instructions. The problem was that I’d given it too many to follow.

What Even Is a CLAUDE.md File? (And Why Should You Care?)

Let’s back up for a second—because if you’re new to Claude Code, you might be wondering what I’m talking about.

CLAUDE.md is a markdown file that lives at the root of your project. Claude Code reads it automatically at the start of every session. Think of it as your project’s instruction manual for the AI—persistent memory across what would otherwise be completely stateless conversations.

And here’s the thing: after your choice of model, your CLAUDE.md file is the single biggest point of leverage you have in Claude Code.

One bad line in there? It cascades into everything downstream.

Every decision Claude makes flows from that initial context. A vague instruction becomes a vague spec, becomes vague research, becomes a vague plan, becomes… well, you know how this story ends.

.

.

.

The “Instruction Budget” I Wish Someone Had Told Me About

Here’s where I learned my lesson the hard way.

LLMs have a finite number of instructions they can reliably follow at once. This sounds obvious when I say it out loud, but I’d never really internalized it until I watched my 1,500-line CLAUDE.md file turn Claude into a confused mess.

The counterintuitive part? Adding more instructions doesn’t just risk the new ones being ignored. It degrades performance uniformly across all your instructions—including the ones that worked perfectly before.

Research from Chroma on “context rot” backs this up: as the number of tokens in the context window increases, the model’s ability to accurately recall information from that context decreases. Your beautiful, comprehensive CLAUDE.md file might actually be making Claude worse at remembering what’s in it.

Let me do the math for you: Claude Code’s system prompt already uses around 50 instructions. If the model handles roughly 250 total, you’ve got about 200 left for your CLAUDE.md plus your plan plus your task prompt.

And here’s the part that really stung when I realized it: a bloated CLAUDE.md means you’re filling up the context window before you even send your first instruction. Every session starts with that massive file loaded. Every message you send has to fit alongside it.

If you’ve been struggling with Claude Code eating through your weekly usage too fast, the first place to cut is your CLAUDE.md file. Seriously. Smaller context = fewer tokens consumed = more runway for actual work.

I went digging through public CLAUDE.md files on GitHub recently. About 10% of them exceed 500 lines.

That’s almost certainly too large. (Ask me how I know.)

👉 Aim for under 300 lines. Ideally much shorter.

.

.

.

The Framework That Finally Made Sense

After my bloated-file disaster, I needed a new approach. I landed on something simple: think of CLAUDE.md as an onboarding document.

Imagine you’re bringing a brilliant new hire up to speed on day one. What would you tell them? Three things, really:

WHAT — The tech stack, project structure, key files. “This is a Next.js 14 app with App Router, Prisma, and Stripe.”

WHY — The purpose of the project and its parts. “We’re building an e-commerce platform for artisan sellers.”

HOW — Commands, workflows, conventions. “Use npm, not pnpm. Run tests before commit.”

Everything else? Details that can live elsewhere or get loaded on-demand. (More on that “on-demand” part in a minute—it’s a game-changer.)

.

.

.

Where You Put Things Actually Matters

Here’s something I didn’t appreciate until embarrassingly recently: models pay more attention to the top and bottom of a document than the middle. Primacy and recency effects—same cognitive biases humans have.

So structure your CLAUDE.md accordingly:

At the top (highest weight):

  1. Project description (1-3 lines)
  2. Key commands (dev, test, build, lint, deploy)
  3. Tech stack and architecture overview

In the middle (lower relative weight): 4. Code style and conventions 5. File/folder structure map 6. Important gotchas and warnings 7. Git and commit conventions

At the bottom (high weight again): 8. Explicit DO NOTs 9. References and @imports to deeper docs

Let me walk through the ones that matter most.

Project Description

A concise summary that orients Claude to the big picture. Every decision should tie back to purpose.

# Project: ShopFront
Next.js 14 e-commerce application with App Router, 
Stripe payments, and Prisma ORM. Built for artisan 
sellers to manage inventory and process orders.

Three lines. Claude now knows what you’re building, who it’s for, and the core architecture. That’s it.

Key Commands

Be explicit here. Don’t assume Claude knows your setup—it doesn’t.

## Commands
- `npm run dev`      — Start dev server (port 3000)
- `npm run test`     — Run Jest unit tests
- `npm run test:e2e` — Run Playwright E2E tests  
- `npm run lint`     — ESLint check
- `npm run build`    — Production build
- `npm run db:migrate` — Run Prisma migrations

And include the non-obvious choices! “Use npm not pnpm or bun” saves you from Claude randomly picking bun because it read about it somewhere and thought it’d be helpful. (Thanks, Claude. Very helpful.)

Code Style—Where Most People Go Wrong

This is where I see CLAUDE.md files bloat into monsters. Vague rules that waste your precious instruction budget.

Don’t write this:

  • “Use good coding practices”
  • “Write clean code”
  • “Follow best practices”

These instructions accomplish nothing. They’re the equivalent of telling a new hire “do good work.” Thanks, very actionable.

Write this instead:

  • “TypeScript strict mode, no any types”
  • “Use named exports, not default exports”
  • “Prefer const over let
  • “Use import type {} for type-only imports”

Every instruction should produce a measurable difference in output.

And here’s a secret that took me way too long to figure out: don’t send an LLM to do a linter’s job. If a rule can be enforced by ESLint or Prettier, enforce it there. LLMs are slow and expensive linters. Claude learns from your existing code patterns anyway—it doesn’t need to be told every formatting convention.

One more thing: resist the urge to stuff code snippets, integration examples, and schema references into your CLAUDE.md. I know it feels helpful. I did it too. But all those “handy references” are just bloating your context window and triggering context rot. If Claude needs to see code, it can read your actual codebase.

The DO NOTs

Put these at the bottom (recency effect) and be specific:

## DO NOT
- Do not modify files in `/generated/` — they are auto-generated
- Do not use `console.log` — use the project logger
- Do not run `prisma db push` — always use migrations

Use emphasis sparingly. If everything is IMPORTANT, nothing is.

.

.

.

The Technique That Changed Everything: Lazy Loading Your Context

Okay, here’s where things get really interesting.

Instead of cramming everything into one giant root file, you can distribute smaller CLAUDE.md files across subfolders. The magic? They only load when Claude actually reads files in that folder.

Think about what this means: your Supabase migration instructions only consume tokens when you’re actually working on Supabase. During frontend work? Those instructions don’t exist. They’re not cluttering up Claude’s context. They’re not eating into your instruction budget.

It’s lazy loading for your AI context.

How to Split Things Up

Your root CLAUDE.md stays small—maybe 50-100 lines. Project description, global commands, universal rules. The stuff that applies everywhere.

Then each subfolder gets its own focused file:

  • src/CLAUDE.md — Component patterns, state management approach, import rules
  • api/CLAUDE.md — Endpoint conventions, auth rules, error format, validation patterns
  • supabase/CLAUDE.md — Migration flow, schema rules, dangerous commands to avoid

These load automatically when Claude reads files in those directories. No extra work on your part. Just organize your instructions where they logically belong.

Progressive Disclosure with @imports and Rules

Here’s another trick: reference detailed docs instead of inlining everything.

## References
See @README.md for project overview
See @docs/api-patterns.md for API conventions  
See @docs/auth-flow.md for authentication details
See @package.json for available scripts

Or use the .claude/rules/ directory:

All markdown files in .claude/rules/ load automatically alongside your main CLAUDE.md. Modular. Organized. Maintainable.

If you want to take this further—and I mean really further—I wrote a deep dive on building self-evolving Claude Code rules that keep all your guidelines, code snippets, and best practices organized in a system that actually grows smarter over time: How to Build Evolving Claude Code Rules.

It’s the natural next step once you’ve got the basics of CLAUDE.md structure down.

.

.

.

A Real Example: What This Looks Like in Practice

Here’s a complete root CLAUDE.md that actually works:

# Project: ShopFront
Next.js 14 e-commerce app with App Router, Stripe, Prisma ORM.
Built for artisan sellers to manage inventory and process orders.

## Commands
- `npm run dev`: Start dev server (port 3000)
- `npm run test`: Run Jest tests
- `npm run test:e2e`: Run Playwright E2E tests
- `npm run lint`: ESLint check
- `npm run build`: Production build
- `npm run db:migrate`: Run Prisma migrations

## Tech Stack
- TypeScript (strict mode)
- Next.js 14 (App Router)
- Prisma ORM + PostgreSQL
- Stripe for payments
- Tailwind CSS + Radix UI
- Jest + Playwright for testing

## Architecture
- `/app` — Pages, layouts, API routes
- `/components/ui` — Shared UI components
- `/lib` — Utilities, helpers, shared logic
- `/prisma` — Schema and migrations

## Code Conventions
- Named exports only (no default exports)
- Use `import type {}` for type-only imports
- No `any` types — use branded types for IDs
- Functional components with hooks
- Tailwind classes only, no custom CSS files

## Important
- NEVER commit .env files
- Stripe webhook must validate signatures
- Images stored in Cloudinary, not locally
- Do not modify files in `/generated/`
- Use project logger, not console.log

See @docs/auth-flow.md for authentication details
See @docs/api-patterns.md for API route conventions

That’s roughly 45 lines. Clean. Scannable. Universally applicable.

.

.

.

The Growth Strategy (Or: How to Not Repeat My Mistakes)

Please, I’m begging you: do not start with a giant template or auto-generated file.

Start with the absolute minimum. Project description, key commands. Maybe 20 lines.

Then use Claude Code on your project. When Claude makes a repeated mistake—and it will—add ONE targeted instruction to fix it. Commit that change to Git so you can trace it later.

Here’s the counterintuitive part: with every model release, look at what you can remove from your CLAUDE.md. Not what you can add. Remove.

Newer models have better built-in behaviors. Old workarounds can actively hinder them. Your CLAUDE.md should shrink over time, not grow.

(This was hard for me. I’m a collector by nature. But trust me—less really is more here.)

.

.

.

The Maintenance Checklist I Actually Use

Every few weeks—or after any model upgrade—I run through this:

Remove:

  • Redundant rules the model handles naturally now
  • Old workarounds for previous model versions
  • Vague instructions that don’t change output
  • Rules that should be enforced by linters instead
  • Code snippets and examples that bloat context

Relocate:

  • Domain-specific rules → move to subfolder CLAUDE.md files
  • Detailed docs → convert to @imported files
  • Rarely-used conventions → put in .claude/rules/

Simplify:

  • Merge overlapping instructions
  • Replace verbose paragraphs with bullet points
  • Make every line earn its place

The Complete Picture

Here’s how all the pieces fit together:

It looks like a lot. But you don’t need all of it. Start with the root file. Add lazy loading when your root gets crowded. Grow organically.

.

.

.

Your Next Step

Here’s my challenge for you:

Open your most active Claude Code project. Look at your CLAUDE.md file (or create one if it doesn’t exist). And ask yourself one question:

What instruction am I going to remove today?

Not add. Remove.

Find the vague rule that accomplishes nothing. Find the workaround for a model behavior that’s been fixed. Find the code snippet that’s just bloating your context. Find the formatting instruction that ESLint already handles.

Delete it.

Every line should earn its place.

10 min read The Art of Vibe Coding

I Found a Better Way to Design Pages in Claude Code (And I’m a Little Mad I Didn’t Know Sooner)

You’re tweaking a landing page in Claude Code.

“Make the layout more balanced,” you type—feeling pretty clever about your prompt, if we’re being honest.

Claude adjusts the CSS. You refresh the browser.

Hmm. Not quite right.

“Actually, make the image section wider.”

Claude dutifully changes the grid. You refresh again.

Still off. (Why is this so hard?)

“Can you try pill-shaped buttons instead?”

And now you’re three iterations deep, squinting at your screen, no longer entirely sure what “right” even looks like anymore.

Here’s the thing: I spent an embarrassing amount of time in this loop before discovering there’s a plugin that makes the whole rigmarole unnecessary.

It’s called the Claude Code Playground skill. And it changes everything about how you approach design work.

Stay with me.

.

.

.

The Describe-Refresh-Despair Loop (A Love Story Gone Wrong)

Let’s be real about what’s happening here.

You have a vision in your head. A feeling of what the page should look like. Something about the proportions, the spacing, the way elements breathe together.

But translating that feeling into words?

That’s where the wheels come off the wagon.

The loop goes something like this:

  1. Describe a change in words (that you hope Claude interprets correctly)
  2. Wait for Claude to apply it
  3. Refresh the page
  4. Realize it’s not quite what you meant
  5. Try different words—maybe “airy” instead of “spacious”?
  6. Repeat 8-12 times
  7. Eventually settle for “close enough” while muttering under your breath

I burned way too many hours in this loop last week, redesigning a page. Every iteration felt like playing telephone with my own design instincts.

(Spoiler: I was the one garbling the message.)

The problem isn’t Claude. The problem is that words are a terrible interface for visual decisions.

.

.

.

Enter the Claude Code Playground Skill: Your New Best Friend

Anthropic built an official plugin—the Playground skill—that adds something radical to Claude Code:

A visual layer between your brain and your codebase.

Here’s how it works: Claude analyzes your existing page, then generates a self-contained HTML file with sliders, dropdowns, and presets that let you see different design directions instantly.

No code changes. No refreshing. No “what I said vs. what I meant” shenanigans.

Just a live preview that updates as you click.

Once you’ve dialed in the exact design you want—with your actual eyeballs—the playground generates a natural language prompt describing your choices.

Copy. Paste. Execute.

One pass. Done.

👉 The key insight: You’re no longer translating visual intuition into words. The playground does that translation for you.

.

.

.

The Real-World Test: Redesigning a WooCommerce Product Page

Enough theory. Let me show you exactly how this worked on my LicenseWP product page.

The existing page was… fine. Functional. The kind of “fine” that makes you wince slightly every time you look at it.

Alt: The original LicenseWP product page showing Theme Pro v2 with a gradient image placeholder on the left, three pricing tier cards (Agency, Business, Personal) stacked vertically on the right, and description tabs below

The image area felt cramped. The pricing cards looked squished together. The “Add to cart” button was doing its best impression of a wallflower at a party.

I wanted to experiment with different proportions, card styles, and CTA treatments.

The old me would have spent an hour going back-and-forth with Claude in text prompts.

The new me? Installed the Playground skill.

.

.

.

Step 0: Install the Plugin (30 Seconds, Tops)

First things first—you need the Claude Code Playground skill installed.

Run /plugin in Claude Code, switch to the Discover tab, and search for “playground.”

Alt: Claude Code's plugin discovery interface showing a search for "playground" with the official plugin by claude-plugins-official listed below, showing 11.4K installs and description "Creates interactive HTML playgrounds"

Hit space to toggle it on.

That’s it. Claude now knows how to build interactive design playgrounds. (11.4K installs can’t be wrong, right?)

.

.

.

Step 1: Send Claude to Do Reconnaissance

Here’s where the magic starts.

I gave Claude a prompt telling it to visit my product page, study the layout like an art critic at a museum, and then build a Design Layout Playground based on what it found.

Alt: The detailed prompt entered into Claude Code instructing it to visit the product page URL, study the layout structure, and build an interactive Design Layout Playground using the playground skill with specifications for presets, preview panel, output location, and prompt generation

Claude opens Chrome and starts analyzing—like a very thorough house inspector, but for web pages.

Alt: Claude Code using Chrome browser tools to analyze the product page, showing multiple tool calls: tabs_context, read_page, get_page_text, and several javascript_tool executions to extract HTML structure

It reads the DOM, extracts text content, and runs JavaScript to pull the full HTML structure.

Alt: Claude Code taking a screenshot of the page and scrolling down to capture the tabs section and footer, building a complete mental model of the layout

Screenshots. Scrolling. Full page analysis from header to footer.

(Claude is nothing if not thorough.)

.

.

.

Step 2: Claude Builds You a Custom Design Tool

Once Claude understands your page, it loads the Playground skill and reads the design template.

Claude Code loading the playground skill successfully and reading the design-playground template file from the plugins cache directory

Then—and here’s the part that made me do a little happy dance—it creates a single self-contained HTML file with everything baked in.

Alt: Claude Code creating the notes/playground directory and writing 1253 lines to product-page-design.html, showing the beginning of the HTML file with doctype, head section, and CSS reset

1,253 lines. A complete interactive design tool, built specifically for your page, in about 30 seconds.

Alt: VS Code file explorer showing the notes folder containing the playground subfolder with product-page-design.html file marked as untracked

Here’s what Claude built for me:

Alt: Claude Code's summary showing the playground includes controls for Page Layout, Gallery, Typography, Tier Cards, CTA Button, Tabs, and Color Theme, plus 5 presets: Current Design, Clean Editorial, Bold SaaS, Compact & Dense, and Premium Showcase
  • 5 presets — each one a cohesive design direction
  • 7 control groups — layout, gallery, typography, cards, buttons, tabs, colors
  • Live preview — using my actual page content (real product names, real prices, real structure)

Ferpetesake, this is exactly what I needed.

.

.

.

Step 3: Play With Designs Like a Kid With New LEGOs

Open the HTML file in your browser.

And then—I’m not going to lie—prepare to lose 20 minutes just playing.

Alt: The Product Page Design Playground interface showing a left panel with controls for Page Layout (max width, grid split, gap, spacing), Gallery (style, radius, aspect ratio), and Typography (title size, weight, description style), with a live preview of the product page on the right

The left panel has all the controls. The right panel shows a live preview that updates instantly as you change anything.

(I may have spent an unreasonable amount of time just clicking the “Gallery Style” options back and forth. Don’t judge me.)

Alt: Scrolled down view of the playground showing additional controls for Tier Cards (layout, card style, radius, highlight, badge), CTA Button (style, width, size), Tabs Section (style, alignment), and Color Theme (primary accent swatches and surface treatment)

I started by clicking through the presets to find a direction:

  • Bold SaaS — too aggressive for this product
  • Compact & Dense — too cramped (we’re selling premium themes, not packing a suitcase)
  • Clean Editorial — closer! But needed tweaks

Then I fine-tuned individual controls:

  • Grid split: 50/50 (equal width for image and details)
  • Gallery style: Framed (light background with border instead of that gradient)
  • Gallery radius: 24px (rounder corners, friendlier vibe)
  • CTA button: Pill-shaped, full-width, large
  • Tabs: Pill style, stretched across the full width

Every single change reflected instantly in the preview.

👉 Here’s what hit me: I wasn’t describing what I wanted anymore. I was seeing it. And clicking until it looked right.

.

.

.

Step 4: Copy the Magic Prompt

Once the design felt right, I scrolled to the bottom of the playground.

And there it was.

Alt: The playground with controls adjusted showing the generated prompt output at the bottom in a highlighted box listing all design changes: product grid split 50/50, section spacing 64px, gallery style framed, border radius 24px, title size 36px, etc., with a Copy Prompt button on the right

The Prompt Output panel had already written a clear instruction describing exactly what I chose—and only what differed from the defaults.

Redesign the product single page at http://localhost:8107/product/theme-pro-tc011/ 
with the following design changes:

- product grid split: 50/50
- section spacing: 64px
- gallery style: framed
- gallery border radius: 24px
- product title size: 36px
- tier card border radius: 8px
- selected tier highlight: border-only
- CTA button style: pill-shaped
- CTA button width: full-width
- CTA button size: large
- tab style: pill tabs
- tab alignment: stretch

No ambiguity. No “make it more modern” nonsense.

Just precise specifications that Claude can execute without guessing.

One click on Copy Prompt.

.

.

.

Step 5: Let Claude Do Its Thing

Back in Claude Code. Paste.

Alt: Claude Code receiving the pasted prompt and entering plan mode, exploring the product page CSS and templates by running find commands in the woocommerce directory

Claude immediately recognizes the design instructions and enters plan mode to explore the codebase.

Alt: Claude Code reading CSS files, checking CSS variables, and examining the single product template structure, then entering a "thinking" state for 2 minutes 17 seconds to write the plan

33 tool uses. 101k tokens. 2 minutes of thinking.

Claude reads every relevant CSS file, understands the variable system, and maps out exactly what needs to change.

Then it presents the plan:

Alt: Claude Code's detailed plan titled "Redesign Product Single Page" showing the context, file to modify (assets/css/frontend.css), and specific CSS changes including grid-template-columns changing from 2fr 3fr to 1fr 1fr, margin-bottom adjustments, and gallery style changes from gradient to framed with exact code snippets

Every change mapped out. Exact line numbers. Before/after CSS.

(Is it weird that I find this deeply satisfying? Don’t answer that.)

Alt: Continuation of the plan showing dark mode considerations (existing CSS variables handle it automatically), verification steps for testing the changes visually, and the execution prompt asking whether to proceed with options to clear context, auto-accept edits, manually approve, or modify the plan

Verification steps included. Dark mode considerations. Mobile responsiveness checks.

I approved. Claude started executing.

Alt: Claude Code applying CSS edits to frontend.css, showing a diff view with red lines indicating removed code (grid-template-columns: 2fr 3fr, old margin-bottom, linear-gradient background) and green lines showing the new values (1fr 1fr grid, updated spacing, solid background with border)

9 CSS edits. All applied.

Alt: Claude Code's completion summary confirming all 9 CSS changes were applied correctly, listing each change: grid split 1fr 1fr, section spacing, gallery styling with border and radius, title size, tier cards, CTA button, and tabs, with a note that dark mode works automatically

And… done.

.

.

.

The Result (AKA: The Part Where I Do a Victory Lap)

Here’s the final redesigned product page:

Alt: The redesigned LicenseWP product page showing the new 50/50 grid layout with a framed gallery area on the left, equal-width pricing section on the right with the same three tiers, a full-width pill-shaped purple Add to cart button, and stretched pill-style tabs below for Description, Additional information, and Reviews
  • Equal-width layout. The image and product details now have balanced visual weight.
  • Framed gallery. Clean border instead of that dated gradient background.
  • Full-width CTA. The “Add to cart” button finally commands the attention it deserves.
  • Pill tabs. Stretched across the full width with a modern, cohesive feel.

The design matches what I saw in the playground preview—applied in a single pass.

HECK YES.

.

.

.

The Before & After (Because We All Love a Good Transformation)

BeforeAfter
40/60 grid split (cramped image)50/50 split (balanced)
Gradient gallery backgroundFramed with border
Small inline CTA buttonFull-width pill CTA
Underline tabsStretched pill tabs
10+ prompt iterations1 pass

The old workflow would’ve taken an hour of back-and-forth (and probably some mild frustration-snacking).

This took 15 minutes—and honestly, most of that was me playing with the controls because it was genuinely fun.

.

.

.

When the Claude Code Playground Skill Really Shines

👉 Redesigning existing pages. You already have something. You want to explore variations without breaking it.

👉 Client projects. Preview before you commit. Show options before you build. (Clients LOVE this, by the way.)

👉 Design indecision. When you don’t know what you want—and let’s be honest, that’s more often than we’d like to admit—clicking through presets beats describing in words.

👉 Reducing the prompt iteration loop. One visual session replaces 10+ text-based rounds of “no, more like… actually less like that… wait, go back.”

The playground acts as a translation layer between your visual intuition and Claude’s execution capabilities. You figure out what “right” looks like with your eyes, then communicate that with precision.

The Prompt Template (Steal This)

Here’s the full prompt I use. Copy it. Adapt it. Make it yours.

First, use the browser to visit and read this page: [YOUR_PAGE_URL]

Study the page's current layout structure, section hierarchy, component patterns, 
and overall visual design. Take note of how content is organized and what 
elements are present.

Then, use the "playground" skill (design-playground template) to build an 
interactive Design Layout Playground based on what you found on that page.

The playground should let me visually explore different layout and component 
style combinations for that page.

## Presets
Include 3–5 named presets that snap all controls to a cohesive combination, 
inspired by what would work well for the page's content. For example:
- "Clean Editorial" — airy spacing, narrow content width, minimal components
- "Bold & Modern" — full-width hero, elevated cards, bold CTAs
- "Compact Dashboard" — tight spacing, grid cards, minimal chrome
- Adapt these to fit the actual content and purpose of the page

## Preview
- Single live preview panel that updates instantly on every control change
- The preview should use a simplified but recognizable representation of the 
  actual page content (use real section names, headings, and placeholder text 
  that matches the page structure)
- Use raw CSS (no Tailwind or frameworks)

## Output Location
- Save the playground HTML file to `notes/playground/` folder (create it if 
  it doesn't exist)

## Prompt Output
- Generate a natural language instruction at the bottom that I can copy and 
  paste back into Claude to implement the chosen design
- The prompt should describe the layout and component decisions in enough 
  detail to be actionable without the playground
- Only mention choices that differ from the defaults
- Frame it as a direction, e.g.: "Redesign the page with a full-width hero 
  section, 3-column card grid with elevated shadows and 16px gap, airy 
  section spacing (64px), pill-shaped CTAs positioned inline..."
- Include the source page URL in the generated prompt for context

Replace [YOUR_PAGE_URL] with whatever page you want to redesign.

.

.

.

Your Turn

Next time you’re about to type “make it more modern” or “adjust the spacing” or “try a different card style”—stop.

Build a playground first.

Let your eyes make the decisions. Let the Claude Code Playground skill translate those decisions into words. Let Claude execute them precisely.

What page are you going to redesign with this workflow?

Go install the plugin. Run /plugin, search “Playground”, toggle it on.

Now.

(And maybe clear your schedule. Because once you start playing with those sliders, you might lose track of time.)

9 min read The Art of Vibe Coding

I Showed You the Wrong Way to Do Claude Code Testing. Let Me Fix That.

Last week, I walked you through browser testing with Claude Code using the Ralph loop plugin.

I was pretty proud of it, actually.

Here’s the thing: I was wrong.

Well, not entirely wrong. The tests ran. Things got verified. But what I showed you? That wasn’t a true Ralph loop—not the way Geoffrey Huntley originally designed it. And the difference matters more than I realized at the time.

(Stay with me here. This confession has a happy ending.)

.

.

.

The Problem I Didn’t See Coming

The real Ralph loop is supposed to wipe memory clean at the start of each iteration. No leftover context. No accumulated baggage. Just a fresh, focused agent tackling one task at a time.

The Ralph loop plugin from Claude Code’s official marketplace? It preserves context from the previous loop. The plugin relies on a stop hook to end and restart each iteration—but the conversation history tags along for the ride.

And that’s where everything quietly falls apart.

Here’s what this actually looks like in practice:

Imagine you’re setting out on a multi-day hiking trip. Every morning, you pack your backpack for that day’s trail.

Now imagine that instead of emptying your pack each night, you just… keep adding to it. Day one’s water bottles. Day two’s snacks. Day three’s rain gear (even though it’s sunny now). By day five, you’re hauling 40 pounds of stuff you don’t need, and you can barely focus on the trail in front of you.

That’s context rot.

It happens when an AI model’s performance degrades because its context window gets bloated with accumulated information from previous tasks. The more history your agent carries forward, the harder it becomes for the model to stay sharp on what actually matters right now.

👉 The takeaway: Fresh context isn’t a nice-to-have. It’s the whole point.

.

.

.

What Context Rot Actually Looks Like

Let me make this concrete with Claude Code testing:

Iteration 1: Claude runs test TC-001. Context is clean. Performance is sharp. The backpack is light.

Iteration 5: Claude runs test TC-005. But it’s also dragging along memories of TC-001 through TC-004. The pack is getting heavy.

Iteration 15: Claude runs test TC-015. The model is now swimming through accumulated history, trying to find what actually matters among all the gear from previous days.

Iteration 25: Claude runs test TC-025. Performance has degraded. The model makes weird mistakes. It forgets what it was supposed to verify—because it’s exhausted from carrying everyone else’s context.

Same trail. Same agent. Completely different performance.

And here’s the frustrating part: you might not even notice it happening. The tests still run. They just run… worse. Slower. Less reliably. With occasional bizarre failures that make you question your own test plan.

.

.

.

The Solution That Was Already There

So I went looking for a better approach to Claude Code testing—something that would give me the clean-slate benefits of a proper Ralph loop without the context accumulation problem.

And I found it in a tool I’d been using for something else entirely: Claude Code’s task management system.

Here’s where it gets interesting.

The task management system gives you the same effect as a properly implemented Ralph loop—but with something the Ralph loop never had: dependency management.

Think back to the hiking metaphor.

Each sub-agent is like a fresh hiker starting a new day with an empty pack. They get their assignment, they complete their section of trail, they report back. Then the next hiker takes over with their own empty pack.

  • No accumulated gear.
  • No context rot.
  • No performance degradation over time.

But here’s the bonus: the task management system also handles situations where “Day 3’s trail can’t start until Day 2’s bridge gets built.” Dependencies get tracked automatically. Tests that need prerequisites don’t run until those prerequisites pass.

(Is that two features in one? Well, is a package of two Reese’s Peanut Butter Cups two candy bars? I say it counts as one delicious solution.)

.

.

.

How Claude Code Testing Actually Works With Task Management

Let me show you exactly how to set this up.

Fair warning: there are a lot of screenshots coming. But I promise each one shows something important about the workflow.

Step 1: Put the Prompt as a Command

First, store the entire testing prompt as a command file. This makes triggering your Claude Code testing workflow trivially easy—just a slash command away.

Claude Code project structure showing .claude/commands folder containing run_test_plan.md file, with a skills folder below it

The full prompt (I’ll include it at the end—it’s long but worth having) tells Claude exactly how to read your test plan, create tasks, set dependencies, execute tests sequentially, and track results.

Step 2: Trigger the Command

With the command saved, execution is just:

Claude Code terminal showing the /run_test_plan command being typed, ready for execution

That’s it. Type /run_test_plan and let the system take over.

Step 3: Claude Reads Your Specs

Since we’re starting fresh—no memory of previous execution—Claude first reads your original specs, test plan, and implementation plan to understand the context.

Claude Code output showing it checking for existing test runs and reading 3 files including the test plan

(Remember: empty backpack. The agent needs to load up on just what it needs for this journey.)

Step 4: Claude Creates the Tasks

After understanding the context, Claude creates one task per test case. Watch how it automatically detects dependencies:

Claude Code creating 30 test tasks with dependency analysis showing TC-004/005/006/008 depend on TC-003, TC-016/017 depend on TC-014, and other dependency chains

See that dependency analysis?

  • TC-004, TC-005, TC-006, TC-008 depend on TC-003 (password field must exist first)
  • TC-016, TC-017 depend on TC-014 (categories must exist first)
  • TC-019 through TC-023 depend on TC-018 (priority dropdown must exist first)
  • TC-029 depends on TC-027 (accent color must be saved first)

The system figured this out by reading the test plan. No manual configuration required.

Step 5: Dependencies Get Locked In

All 30 tasks created.

Now Claude sets up the dependencies and verifies everything:

Claude Code showing all 30 tasks created with dependencies being set up, updating test-status.json with start timestamp

Step 6: Test Status File Created

Claude creates a test-status.json file to track everything—machine-readable, resumable, and audit-friendly:

Claude Code writing 260 lines to notes/test-status.json, showing metadata structure with testPlanSource, totalIterations, maxIterations, startedAt, and summary counts

The execution order is now crystal clear:

  1. Unblocked tasks first: TC-001, TC-002, TC-003, TC-007, TC-009, TC-010, TC-011, TC-012, TC-013, TC-014, TC-015, TC-018, TC-024
  2. Tasks blocked by TC-003: TC-004, TC-005, TC-006, TC-008
  3. Tasks blocked by TC-014: TC-016, TC-017
  4. Tasks blocked by TC-018: TC-019, TC-020, TC-021, TC-022, TC-023
  5. Tasks blocked by TC-027: TC-029

Step 7: First Task Begins

Here’s where the magic happens.

Claude spawns a sub-agent—with fresh context—to execute TC-001:

Claude Code starting execution with TC-001, spawning a Task sub-agent with the instruction "You are a test execution sub-agent. You have ONE job: execute and verify ONE test case."

“You are a test execution sub-agent. You have ONE job: execute and verify ONE test case.”

That’s the key instruction. Fresh hiker. Empty backpack. Single trail.

Step 8: Browser Automation for Testing

The sub-agent uses Claude Code’s browser automation to test like a real user would:

Claude Code showing Chrome browser automation (javascript_tool) with "View Tab" option, indicating 52+ tool uses for the testing process

It navigates to URLs, clicks buttons, fills forms, takes screenshots at verification points, and checks the DOM state against expected outcomes.

Real browser. Real interactions. Real Claude Code testing.

Step 9: Test Status Gets Updated

After completing a test, the sub-agent updates the status file:

Claude Code updating notes/test-status.json after TC-001 execution, showing 30 tasks with 1 done and 29 open, with VS Code diff view

Step 10: Human-Readable Results Too

The results also get appended to a markdown log for human review:

Claude Code writing to notes/test-results.md after updating test-status.json, showing the dual logging system for machine and human readability

Every test gets logged in two places:

  • test-status.json for machine parsing
  • test-results.md for human review

(Because sometimes you want to query the data programmatically, and sometimes you just want to read what happened over coffee. Both are valid.)

Step 11: Automatic Progression to Next Task

Once TC-001 completes, Claude automatically moves to TC-002:

Claude Code showing TC-001 passed (Done with 36 tool uses, 48.1k tokens, 4m 19s), then spawning a new sub-agent for TC-002 with fresh context

Look at those stats: 36 tool uses, 48.1k tokens, 4 minutes 19 seconds for TC-001.

Then a completely fresh sub-agent spawns for TC-002. New hiker. New backpack. No accumulated context from TC-001.

Step 12: Bugs Found? Claude Fixes Them.

TC-002 found a bug. Here’s what happened:

Claude Code showing TC-002 passed after 1 fix (Quick Setup wasn't saving color options - fixed in WizardAjax.php), then moving to TC-003 which is Critical and unblocks 4 other tests

“TC-002 passed after 1 fix (Quick Setup wasn’t saving color options — now fixed in WizardAjax.php).”

The sub-agent detected the failure, analyzed the root cause, implemented a fix, and re-ran the test. All autonomously. All within the same fresh context.

Step 13: Dependencies Unlock Automatically

Now watch the dependency system in action.

Once TC-003 passes:

Claude Code showing TC-003 passed, announcing that TC-004, TC-005, TC-006, TC-008 are now unblocked, then moving to TC-007

“TC-003 passed. Now TC-004, TC-005, TC-006, TC-008 are unblocked.”

The password field exists now. All the tests that depend on it can finally run.

👉 This is why dependencies matter: They prevent tests from running before their preconditions are met—avoiding the exact conflicts where one agent messes with something another agent needs.

Steps 14-15: The Marathon Continues

It keeps going. Test after test. Each sub-agent fresh and focused:

Claude Code showing a sequence of passed tests: TC-007, TC-004, TC-006, TC-005, TC-008, TC-009, TC-010, each with tool usage stats and completion times
Claude Code showing later tests completing: TC-023 through TC-030, including TC-029 being unblocked after TC-027, with all tests passing

Every test runs sequentially. Every sub-agent gets clean context. Every dependency is respected. No context rot in sight.

Step 16: All Tests Complete

After 2 hours and 12 minutes:

Claude Code showing final test results being written to test-results.md, displaying a summary table with all 30 tests passed, including TC-001 through TC-012 with their priorities and fix attempts

30 tests. All passed. Zero known issues.

Step 17: The Full Summary

The orchestrator writes a comprehensive summary:

Here’s what got verified:

  • All 6 Critical tests passed (password handling, priority validation, accent color persistence)
  • Server-side validation confirmed working (urgent priority rejected, invalid hex rejected, password never stored in wp_options)
  • UI behaviors verified (notice dismiss, auto-hide, field error clearing, color sync)
  • Accessibility attributes verified on priority dropdown

And that bug that got fixed? handleQuickSetup() in WizardAjax.php wasn’t saving desq_primary_color or desq_accent_color options. Found during TC-002. Fixed autonomously.

.

.

.

Why This Actually Works Better

Let me be direct about the comparison:

AspectRalph Loop PluginTask Management System
ContextPreserves across iterationsFresh per sub-agent
DependenciesNoneBuilt-in blocking
Parallel SafetyRiskySequential by default
State TrackingBasic stop hookJSON + Markdown logs
Bug FixingManualAutomatic (up to 3 attempts)
ResumabilityLimitedFull state recovery

The Ralph loop was supposed to start each iteration with a clean slate. The task management system actually delivers on that promise—and adds dependency management that prevents tests from stepping on each other.

.

.

.

The Full Prompt (Copy This)

Here’s the complete command file to drop into .claude/commands/run_test_plan.md:

PROMPT: Execute Test Plan Using Claude Code Task Management System
Loading longform...
We are executing the test plan. All implementation is complete. Now we verify it works.

## Reference Documents

- **Test Plan:** `notes/test_plan.md`
- **Implementation Plan:** `notes/impl_plan.md`
- **Specs:** `notes/specs.md`
- **Test Status JSON:** `notes/test-status.json`
- **Test Results Log:** `notes/test-results.md`

---

## Phase 1: Initialize

### Step 1: Check for Existing Run (Resumption)

Before creating anything, check if a previous test run exists:

1. Check if `notes/test-status.json` exists
2. Check if there are existing tasks via `TaskList`

**If both exist and tasks have results:**
- This is a **resumed run** — skip to Phase 2 (Step 7)
- Announce: "Resuming previous test run. Skipping already-passed tests."
- Only execute tasks that are still `pending` or `fail` (with fixAttempts < 3)

**If no previous run exists (or files are missing):**
- Continue with fresh initialization below

### Step 2: Read the Test Plan

Read `notes/test_plan.md` and extract ALL test cases. Auto-detect the TC-ID pattern used (e.g., `TC-001`, `TC-101`, `TC-5A`, etc.).

For each test case, note:

- TC ID
- Name
- Priority (Critical / High / Medium / Low — default to Medium if not stated)
- Preconditions
- Test steps and expected outcomes
- Test data (if any)
- Dependencies on other test cases (if any)

### Step 3: Analyze Test Dependencies

Determine which test cases depend on others. Common dependency patterns:

- A "saves data" test may depend on a "displays default" test
- A "form submission" test may depend on "form validation" tests
- An "end-to-end" test may depend on individual component tests

If no clear dependencies exist between test cases, treat them all as independent.

### Step 4: Create Tasks

Use `TaskCreate` to create one task per test case. Set `blocked_by` based on the dependency analysis.

**Task description format:**

```
Test [TC-ID]: [Test Name]
Priority: [Priority]

Preconditions:
- [Required state before test]

Steps:
| Step | Action | Expected Result |
|------|--------|-----------------|
| 1 | [Action] | [Result] |
| 2 | [Action] | [Result] |

Test Data:
- [Field]: [Value]

Expected Outcome: [Final verification]

Environment:
- Refer to CLAUDE.md for wp-env details, URLs, and credentials
- WordPress site: http://localhost:8105
- Admin: http://localhost:8105/wp-admin (admin/password)

---
fixAttempts: 0
result: pending
lastTestedAt: null
notes:
```

### Step 5: Generate Test Status JSON

Create `notes/test-status.json`:

```json
{
    "metadata": {
        "testPlanSource": "notes/test_plan.md",
        "totalIterations": 0,
        "maxIterations": 50,
        "startedAt": null,
        "lastUpdatedAt": null,
        "summary": {
            "total": "<count>",
            "pending": "<count>",
            "pass": 0,
            "fail": 0,
            "knownIssue": 0
        }
    },
    "testCases": {
        "<TC-ID>": {
            "name": "Test case name",
            "priority": "Critical|High|Medium|Low",
            "status": "pending",
            "fixAttempts": 0,
            "notes": "",
            "lastTestedAt": null
        }
    },
    "knownIssues": []
}
```

### Step 6: Initialize Test Results Log

Create `notes/test-results.md`:

```markdown
# Test Results

**Test Plan:** notes/test_plan.md
**Started:** [CURRENT_TIMESTAMP]

## Execution Log
```

### Verify Initialization

Use `TaskList` to confirm:
- All TC-IDs from the test plan have a corresponding task
- Dependencies are correctly set via `blocked_by`
- All tasks show `result: pending`

Cross-check task count matches `summary.total` in `notes/test-status.json`.

---

## Phase 2: Execute Tests

### Step 7: Determine Execution Order

Use `TaskList` to read all tasks and their `blocked_by` fields. Determine sequential execution order:

1. Tasks with no `blocked_by` (or all dependencies resolved) come first
2. Tasks whose dependencies are resolved come next
3. Continue until all tasks are ordered

**For resumed runs:** Skip tasks where `result` is already `pass` or `known_issue`.

### Step 8: Execute One Task at a Time

For the next eligible task, spawn ONE sub-agent with the instructions below.

**One sub-agent at a time. Do NOT spawn multiple sub-agents in parallel.**

---

#### Sub-Agent Instructions

**You are a test execution sub-agent. You have ONE job: execute and verify ONE test case.**

1. **Read your task** using `TaskGet` to get the full description
2. **Parse the test steps** from the description (everything above the `---` separator)
3. **Parse the metadata** from below the `---` separator
4. **Read CLAUDE.md** for environment details, URLs, and credentials

5. **Execute the test:**

    Using browser automation:
    - Navigate to URLs specified in the test steps
    - Click buttons/links as described
    - Fill form inputs with the test data provided
    - Take screenshots at key verification points
    - Read console logs for errors
    - Verify DOM state matches expected outcomes

    Follow the test plan steps EXACTLY. Do not skip steps.

6. **Determine the result:**

    **PASS** if:
    - All expected outcomes verified
    - No unexpected console errors
    - UI state matches test plan

    **FAIL** if:
    - Any expected outcome not met
    - Unexpected errors
    - UI state doesn't match

7. **If PASS:** Update the task description metadata via `TaskUpdate`:

    ```
    ---
    fixAttempts: 0
    result: pass
    lastTestedAt: [CURRENT_TIMESTAMP]
    notes: [Brief description of what was verified]
    ```

    Mark the task as `completed`.

8. **If FAIL and fixAttempts < 3:**

    a. Analyze the root cause
    b. Implement a fix in the codebase
    c. Increment fixAttempts and update via `TaskUpdate`:

    ```
    ---
    fixAttempts: [previous + 1]
    result: fail
    lastTestedAt: [CURRENT_TIMESTAMP]
    notes: [What failed, root cause, what fix was applied]
    ```

    d. Re-run the test steps to verify the fix
    e. If now passing, set `result: pass` and mark task as `completed`
    f. If still failing and fixAttempts < 3, repeat from (a)

9. **If FAIL and fixAttempts >= 3:** Mark as known issue via `TaskUpdate`:

    ```
    ---
    fixAttempts: 3
    result: known_issue
    lastTestedAt: [CURRENT_TIMESTAMP]
    notes: KI — [Description of the issue, steps to reproduce, severity, suggested fix]
    ```

    Mark the task as `completed`.

10. **Update Test Status JSON** — Read `notes/test-status.json`, update the test case entry and recalculate summary counts, then write back:

    - Set `status` to `pass`, `fail`, or `known_issue`
    - Update `fixAttempts`, `notes`, `lastTestedAt`
    - Increment `metadata.totalIterations`
    - Update `metadata.lastUpdatedAt`
    - Recalculate `metadata.summary` counts
    - If known_issue, add entry to `knownIssues` array

11. **Append to test results log** (`notes/test-results.md`):

    ```markdown
    ## [TC-ID] — [Test Name]

    **Result:** PASS | FAIL | KNOWN ISSUE
    **Tested At:** [TIMESTAMP]
    **Fix Attempts:** [N]

    **What happened:**
    [Brief description of test execution]

    **Notes:**
    [Observations, errors, or fixes attempted]

    ---
    ```

**CRITICAL: Before finishing, verify you have updated ALL THREE locations:**

1. Task description (metadata below `---` separator) via `TaskUpdate`
2. `notes/test-status.json` (test case entry + summary counts)
3. `notes/test-results.md` (appended human-readable entry)

Missing ANY of these = incomplete iteration.

---

### Step 9: Verify and Continue

After each sub-agent finishes, the orchestrator:

1. Uses `TaskGet` to verify the task description metadata was updated
2. Reads `notes/test-status.json` to confirm JSON was updated and summary counts are correct
3. Reads `notes/test-results.md` to confirm a new entry was appended
4. **If any location was NOT updated**, update it before proceeding
5. Determines the next eligible task (unresolved, dependencies met)
6. Spawns the next sub-agent (back to Step 8)

### Step 10: Repeat Until All Resolved

Continue until ALL tasks have `result: pass` or `result: known_issue`.

```
Completion check:
  - result: pass         → resolved
  - result: known_issue  → resolved
  - result: fail         → needs re-test (if fixAttempts < 3)
  - result: pending      → not yet tested

ALL resolved? → Phase 3 (Summary)
Otherwise?    → Next task
```

---

## Phase 3: Summary

### Step 11: Generate Final Summary

When all tasks are resolved, append a final summary to `notes/test-results.md`:

```markdown
# Final Summary

**Completed:** [TIMESTAMP]
**Total Test Cases:** [N]
**Passed:** [N]
**Known Issues:** [N]

## Results

| TC | Name | Priority | Result | Fix Attempts |
|----|------|----------|--------|--------------|
| TC-XXX | [Name] | High | PASS | 0 |
| TC-YYY | [Name] | Medium | KNOWN ISSUE | 3 |

## Known Issues Detail

### KI-001: [TC-ID] — [Issue Title]

**Severity:** [low|medium|high|critical]
**Steps to Reproduce:** [How to see the bug]
**Suggested Fix:** [Potential solution if known]

## Recommendations

[Any follow-up actions needed]
```

---

## Rules Summary

| Rule | Description |
|------|-------------|
| 1:1 Mapping | One task per test case — no grouping |
| Dependencies | Use `blocked_by` to enforce test execution order |
| Sequential | One sub-agent at a time — do NOT spawn multiple in parallel |
| Sub-Agents | One sub-agent per task — fresh context, focused execution |
| Max 3 Attempts | After 3 fix attempts → mark as `known_issue` |
| Metadata in Description | Track `fixAttempts`, `result`, `lastTestedAt`, `notes` below `---` separator |
| Test Status JSON | Always update `notes/test-status.json` after each test |
| Log Everything | Append results to `notes/test-results.md` for human review |
| Resumable | Detect existing run state and continue from where it left off |
| Completion | All tasks resolved = all results are `pass` or `known_issue` |

## Do NOT

- Spawn multiple sub-agents in parallel — execute ONE at a time
- Leave tasks in `fail` state without either retrying or escalating to `known_issue`
- Modify test plan steps — execute them exactly as written
- Forget to update `notes/test-status.json` after each test
- Forget to append to the test results log after each test
- Skip the dependency analysis
- Use `alert()` or `confirm()` in any fix (see CLAUDE.md)
We are executing the test plan. All implementation is complete. Now we verify it works.

## Reference Documents

- **Test Plan:** `notes/test_plan.md`
- **Implementation Plan:** `notes/impl_plan.md`
- **Specs:** `notes/specs.md`
- **Test Status JSON:** `notes/test-status.json`
- **Test Results Log:** `notes/test-results.md`

---

## Phase 1: Initialize

### Step 1: Check for Existing Run (Resumption)

Before creating anything, check if a previous test run exists:

1. Check if `notes/test-status.json` exists
2. Check if there are existing tasks via `TaskList`

**If both exist and tasks have results:**
- This is a **resumed run** — skip to Phase 2 (Step 7)
- Announce: "Resuming previous test run. Skipping already-passed tests."
- Only execute tasks that are still `pending` or `fail` (with fixAttempts < 3)

**If no previous run exists (or files are missing):**
- Continue with fresh initialization below

### Step 2: Read the Test Plan

Read `notes/test_plan.md` and extract ALL test cases. Auto-detect the TC-ID pattern used (e.g., `TC-001`, `TC-101`, `TC-5A`, etc.).

For each test case, note:

- TC ID
- Name
- Priority (Critical / High / Medium / Low — default to Medium if not stated)
- Preconditions
- Test steps and expected outcomes
- Test data (if any)
- Dependencies on other test cases (if any)

### Step 3: Analyze Test Dependencies

Determine which test cases depend on others. Common dependency patterns:

- A "saves data" test may depend on a "displays default" test
- A "form submission" test may depend on "form validation" tests
- An "end-to-end" test may depend on individual component tests

If no clear dependencies exist between test cases, treat them all as independent.

### Step 4: Create Tasks

Use `TaskCreate` to create one task per test case. Set `blocked_by` based on the dependency analysis.

**Task description format:**

```
Test [TC-ID]: [Test Name]
Priority: [Priority]

Preconditions:
- [Required state before test]

Steps:
| Step | Action | Expected Result |
|------|--------|-----------------|
| 1 | [Action] | [Result] |
| 2 | [Action] | [Result] |

Test Data:
- [Field]: [Value]

Expected Outcome: [Final verification]

Environment:
- Refer to CLAUDE.md for wp-env details, URLs, and credentials
- WordPress site: http://localhost:8105
- Admin: http://localhost:8105/wp-admin (admin/password)

---
fixAttempts: 0
result: pending
lastTestedAt: null
notes:
```

### Step 5: Generate Test Status JSON

Create `notes/test-status.json`:

```json
{
    "metadata": {
        "testPlanSource": "notes/test_plan.md",
        "totalIterations": 0,
        "maxIterations": 50,
        "startedAt": null,
        "lastUpdatedAt": null,
        "summary": {
            "total": "<count>",
            "pending": "<count>",
            "pass": 0,
            "fail": 0,
            "knownIssue": 0
        }
    },
    "testCases": {
        "<TC-ID>": {
            "name": "Test case name",
            "priority": "Critical|High|Medium|Low",
            "status": "pending",
            "fixAttempts": 0,
            "notes": "",
            "lastTestedAt": null
        }
    },
    "knownIssues": []
}
```

### Step 6: Initialize Test Results Log

Create `notes/test-results.md`:

```markdown
# Test Results

**Test Plan:** notes/test_plan.md
**Started:** [CURRENT_TIMESTAMP]

## Execution Log
```

### Verify Initialization

Use `TaskList` to confirm:
- All TC-IDs from the test plan have a corresponding task
- Dependencies are correctly set via `blocked_by`
- All tasks show `result: pending`

Cross-check task count matches `summary.total` in `notes/test-status.json`.

---

## Phase 2: Execute Tests

### Step 7: Determine Execution Order

Use `TaskList` to read all tasks and their `blocked_by` fields. Determine sequential execution order:

1. Tasks with no `blocked_by` (or all dependencies resolved) come first
2. Tasks whose dependencies are resolved come next
3. Continue until all tasks are ordered

**For resumed runs:** Skip tasks where `result` is already `pass` or `known_issue`.

### Step 8: Execute One Task at a Time

For the next eligible task, spawn ONE sub-agent with the instructions below.

**One sub-agent at a time. Do NOT spawn multiple sub-agents in parallel.**

---

#### Sub-Agent Instructions

**You are a test execution sub-agent. You have ONE job: execute and verify ONE test case.**

1. **Read your task** using `TaskGet` to get the full description
2. **Parse the test steps** from the description (everything above the `---` separator)
3. **Parse the metadata** from below the `---` separator
4. **Read CLAUDE.md** for environment details, URLs, and credentials

5. **Execute the test:**

    Using browser automation:
    - Navigate to URLs specified in the test steps
    - Click buttons/links as described
    - Fill form inputs with the test data provided
    - Take screenshots at key verification points
    - Read console logs for errors
    - Verify DOM state matches expected outcomes

    Follow the test plan steps EXACTLY. Do not skip steps.

6. **Determine the result:**

    **PASS** if:
    - All expected outcomes verified
    - No unexpected console errors
    - UI state matches test plan

    **FAIL** if:
    - Any expected outcome not met
    - Unexpected errors
    - UI state doesn't match

7. **If PASS:** Update the task description metadata via `TaskUpdate`:

    ```
    ---
    fixAttempts: 0
    result: pass
    lastTestedAt: [CURRENT_TIMESTAMP]
    notes: [Brief description of what was verified]
    ```

    Mark the task as `completed`.

8. **If FAIL and fixAttempts < 3:**

    a. Analyze the root cause
    b. Implement a fix in the codebase
    c. Increment fixAttempts and update via `TaskUpdate`:

    ```
    ---
    fixAttempts: [previous + 1]
    result: fail
    lastTestedAt: [CURRENT_TIMESTAMP]
    notes: [What failed, root cause, what fix was applied]
    ```

    d. Re-run the test steps to verify the fix
    e. If now passing, set `result: pass` and mark task as `completed`
    f. If still failing and fixAttempts < 3, repeat from (a)

9. **If FAIL and fixAttempts >= 3:** Mark as known issue via `TaskUpdate`:

    ```
    ---
    fixAttempts: 3
    result: known_issue
    lastTestedAt: [CURRENT_TIMESTAMP]
    notes: KI — [Description of the issue, steps to reproduce, severity, suggested fix]
    ```

    Mark the task as `completed`.

10. **Update Test Status JSON** — Read `notes/test-status.json`, update the test case entry and recalculate summary counts, then write back:

    - Set `status` to `pass`, `fail`, or `known_issue`
    - Update `fixAttempts`, `notes`, `lastTestedAt`
    - Increment `metadata.totalIterations`
    - Update `metadata.lastUpdatedAt`
    - Recalculate `metadata.summary` counts
    - If known_issue, add entry to `knownIssues` array

11. **Append to test results log** (`notes/test-results.md`):

    ```markdown
    ## [TC-ID] — [Test Name]

    **Result:** PASS | FAIL | KNOWN ISSUE
    **Tested At:** [TIMESTAMP]
    **Fix Attempts:** [N]

    **What happened:**
    [Brief description of test execution]

    **Notes:**
    [Observations, errors, or fixes attempted]

    ---
    ```

**CRITICAL: Before finishing, verify you have updated ALL THREE locations:**

1. Task description (metadata below `---` separator) via `TaskUpdate`
2. `notes/test-status.json` (test case entry + summary counts)
3. `notes/test-results.md` (appended human-readable entry)

Missing ANY of these = incomplete iteration.

---

### Step 9: Verify and Continue

After each sub-agent finishes, the orchestrator:

1. Uses `TaskGet` to verify the task description metadata was updated
2. Reads `notes/test-status.json` to confirm JSON was updated and summary counts are correct
3. Reads `notes/test-results.md` to confirm a new entry was appended
4. **If any location was NOT updated**, update it before proceeding
5. Determines the next eligible task (unresolved, dependencies met)
6. Spawns the next sub-agent (back to Step 8)

### Step 10: Repeat Until All Resolved

Continue until ALL tasks have `result: pass` or `result: known_issue`.

```
Completion check:
  - result: pass         → resolved
  - result: known_issue  → resolved
  - result: fail         → needs re-test (if fixAttempts < 3)
  - result: pending      → not yet tested

ALL resolved? → Phase 3 (Summary)
Otherwise?    → Next task
```

---

## Phase 3: Summary

### Step 11: Generate Final Summary

When all tasks are resolved, append a final summary to `notes/test-results.md`:

```markdown
# Final Summary

**Completed:** [TIMESTAMP]
**Total Test Cases:** [N]
**Passed:** [N]
**Known Issues:** [N]

## Results

| TC | Name | Priority | Result | Fix Attempts |
|----|------|----------|--------|--------------|
| TC-XXX | [Name] | High | PASS | 0 |
| TC-YYY | [Name] | Medium | KNOWN ISSUE | 3 |

## Known Issues Detail

### KI-001: [TC-ID] — [Issue Title]

**Severity:** [low|medium|high|critical]
**Steps to Reproduce:** [How to see the bug]
**Suggested Fix:** [Potential solution if known]

## Recommendations

[Any follow-up actions needed]
```

---

## Rules Summary

| Rule | Description |
|------|-------------|
| 1:1 Mapping | One task per test case — no grouping |
| Dependencies | Use `blocked_by` to enforce test execution order |
| Sequential | One sub-agent at a time — do NOT spawn multiple in parallel |
| Sub-Agents | One sub-agent per task — fresh context, focused execution |
| Max 3 Attempts | After 3 fix attempts → mark as `known_issue` |
| Metadata in Description | Track `fixAttempts`, `result`, `lastTestedAt`, `notes` below `---` separator |
| Test Status JSON | Always update `notes/test-status.json` after each test |
| Log Everything | Append results to `notes/test-results.md` for human review |
| Resumable | Detect existing run state and continue from where it left off |
| Completion | All tasks resolved = all results are `pass` or `known_issue` |

## Do NOT

- Spawn multiple sub-agents in parallel — execute ONE at a time
- Leave tasks in `fail` state without either retrying or escalating to `known_issue`
- Modify test plan steps — execute them exactly as written
- Forget to update `notes/test-status.json` after each test
- Forget to append to the test results log after each test
- Skip the dependency analysis
- Use `alert()` or `confirm()` in any fix (see CLAUDE.md)

.

.

.

Your Turn

If you’ve been frustrated with AI-generated code that “works” but doesn’t actually work, give this a shot.

Define your success criteria upfront with a solid test plan. Let Claude Code testing handle the execution and verification through task management. Walk away while it iterates.

The test-fix-retest loop is boring. Tedious. The kind of thing every developer has always done manually.

Now you don’t have to.

What feature are you going to test with this workflow?

Set it up. Let it run. Come back to green checkmarks.

(And maybe grab a coffee while you wait. Your backpack is empty now—you’ve earned the rest.)

11 min read The Art of Vibe Coding

How to Make Claude Code Test and Fix Its Own Work (The Ralph Loop Method)

Last week, I showed you my Claude Code implementation workflow.

52 minutes. 13 tasks. 38 test cases worth of functionality. All built by sub-agents running in parallel.

Here’s what I didn’t tell you.

Half of it didn’t work.

(I know. I KNOW.)

.

.

.

The Part Where I Discover My “Complete” Implementation Is… Not

Let me show you what happened when I actually tested the WooCommerce integration Claude built for me.

Quick context: I have a WordPress theme for coworking spaces. Originally, it used direct Stripe integration for payments. But here’s the thing—not everyone wants Stripe. Some coworking spaces prefer PayPal. Others need local payment gateways. (And some, bless their hearts, are still figuring out what a payment gateway even is.)

The solution? Let WooCommerce handle payments. Hundreds of gateway integrations, tax calculations, order management—all built-in.

Claude followed my implementation workflow perfectly.

PERFECTLY.

The settings page looked gorgeous:

WordPress admin settings page showing Payment Gateway Configuration with two card options: Direct Stripe Integration (marked Recommended) on the left and WooCommerce on the right, each with icons, descriptions, and feature bullet points

There’s even a Product Sync panel showing 3 published plans synced to WooCommerce at 100% progress. One hundred percent!

Product Sync panel displaying 3 Published Plans, 3 Synced to WooCommerce, 100% Sync Progress, with explanation of how sync works and two buttons: Sync Plans to WooCommerce and View Products

My plans:

  • Hot Desk ($199/month),
  • Dedicated Desk ($399/month),
  • Private Office ($799/month)

—all published and ready to go:

Plans list showing three rows: Hot Desk at $199/month, Dedicated Desk at $399/month, and Private Office at $799/month, all with Published status and 0 subscribers

And look!

They synced perfectly to WooCommerce products:

WooCommerce Products page showing Hot Desk, Dedicated Desk, and Private Office as variable products with price ranges and In Stock status

Everything looked GREAT.

So I clicked “Get Started” on the Hot Desk plan to test the checkout flow. You know, like a responsible developer would do. (Stop laughing.)

And here’s what I saw:

Checkout page showing the old direct Stripe integration with Card Number field, "Your card will be charged securely via Stripe" message, and Order Summary showing Hot Desk at $199/month—despite WooCommerce mode being enabled

The old Stripe checkout.

The direct integration I was trying to REPLACE.

I switched the payment mode to WooCommerce. I synced the products. Everything in the admin looked correct.

But the frontend? Still using the old Stripe integration.

Ferpetesake.

.

.

.

Why Claude Thinks “Done” When It’s Really “Done-ish”

Here’s where I went full detective mode.

I checked the codebase. The WooCommerce checkout code exists. Functions written. Hooks registered. File paths correct. All present and accounted for.

So why wasn’t it working?

The code was never connected to the rest of the system.

(Stay with me here.)

Claude wrote the WooCommerce checkout handler. Beautiful code. But the pricing page? Still calling the old Stripe checkout function. The new code sat there—perfectly written, completely unused—like a fancy espresso machine you forgot to plug in.

And here’s the thing: this happens ALL THE TIME with AI-generated code.

Claude writes features.

It creates files. It generates functions. And in its summary, it reports “Task complete.”

But “code exists” and “code works”?

Two very different things.

You’ve probably experienced this.

Claude builds a feature. You test it. Something’s broken. You point out the bug. Claude apologizes (so polite!), fixes that specific issue, and introduces two new ones.

The Reddit crowd calls this “nerfed” or “lazy.”

They’re wrong.

👉 Claude lacks visibility into whether its code actually runs correctly in your system.

It can’t see the browser. It can’t watch a user click through your checkout flow. It can’t verify that function A actually calls function B in production.

The fix? Give Claude the ability to test its own work.

(This is where it gets good.)

.

.

.

The Most Important Testing? Not What You Think

You might be thinking: “Just write unit tests. Problem solved.”

And look—unit tests help. Integration tests help more.

But here’s what nobody talks about:

Perfect code doesn’t mean a working product.

The WooCommerce checkout code passed every logical check. Functions syntactically correct. Hooks properly registered. A unit test would have given it a gold star and a pat on the head.

But the pricing page template still imported the old Stripe checkout URL.

That’s a wiring problem. Not a code problem.

The test that catches this? User acceptance testing.

Actual users (or something simulating actual users) verifying the end product meets their needs. Clicking buttons. Filling forms. Going through the whole dang flow.

This is exactly why my implementation workflow generates a test plan BEFORE the implementation plan. The test plan represents success criteria from the user’s perspective:

  • Can a user switch payment modes?
  • Does the checkout redirect to WooCommerce?
  • Does the order confirmation show correct details?

These questions can’t be answered by reading code. They require clicking through the actual interface.

Which brings us to Ralph Loop.

.

.

.

Meet Ralph Loop: Your Autonomous Claude Code Testing Loop

Here’s the workflow I use to make Claude test its own work:

This is an autonomous loop that picks up a test case, executes it in an actual browser, checks against acceptance criteria, logs results, and repeats. If a test fails? Claude fixes the code and retests.

(Yes, really. It fixes its own bugs. I’ll show you.)

The idea comes from Ryan Carson’s video “Ralph Wiggum” AI Agent will 10x Claude Code/Amp.

The core insight: you can’t throw a vague prompt at an autonomous loop and expect magic. The loop needs structure.

Specifically, it needs:

  • A test plan defining every test case upfront
  • A status.json tracking pass/fail for each case
  • A results.md where Claude logs learnings after each iteration

Let me show you exactly how I set this up for Claude Code testing.

.

.

.

1. Create the Ralph Test Folder

First, create a folder to store all your Ralph loop files:

VS Code file explorer showing ralph_test folder containing four files: prepare.md, prompt.md, results.md, and status.json

Four files. That’s it.

  • prepare.md — Instructions for generating the status.json from your test plan
  • prompt.md — The loop instructions Claude follows each iteration
  • status.json — Tracks the state of all test cases (starts empty)
  • results.md — Human-readable log of each iteration (starts empty)

2. The Prepare Prompt

The prepare prompt tells Claude how to read your test plan and initialize the status file:

prepare.md file showing instructions to read test plan, extract all TC-XXX test cases with ID, name, and priority, then generate a JSON file with metadata including testPlanSource, totalIterations, maxIterations, and summary counts
PROMPT: Ralph Loop Testing Agent (Prepare prompt)
Read the test plan file and generate a `status.json` file with all test cases initialized.

## Input

- **Test Plan:** `notes/test_plan.md`

## Output

- **Status File:** `notes/ralph_test/status.json`

## Instructions

1. Read the test plan markdown file
2. Extract ALL test cases (format: TC-XXX)
3. For each test case, extract:
    - TC ID (e.g., "TC-501")
    - Name (the test case title after the TC ID)
    - Priority (Critical/High/Medium/Low)
4. Generate a JSON file with this exact structure:

```json
{
  "metadata": {
    "testPlanSource": "notes/test_plan.md",
    "totalIterations": 0,
    "maxIterations": 50,
    "startedAt": null,
    "lastUpdatedAt": null,
    "summary": {
      "total": <count>,
      "pending": <count>,
      "pass": 0,
      "fail": 0,
      "knownIssue": 0
    }
  },
  "testCases": {
    "TC-XXX": {
      "name": "Test case name from plan",
      "priority": "Critical|High|Medium|Low",
      "status": "pending",
      "fixAttempts": 0,
      "notes": "",
      "lastTestedAt": null
    }
  },
  "knownIssues": []
}
```

````

5. Save the file to the output path

## Extraction Rules

- Test case IDs follow pattern: `TC-NNN` (e.g., TC-501, TC-522)
- Test case names are in headers like: `#### TC-501: Checkout Header Display`
- Priority is usually listed in the test case details or status tracker table
- If priority not found, default to "Medium"

## Example

Input (from test plan):

```markdown
#### TC-501: Checkout Header Display

**Priority:** High
...

#### TC-502: Checkout Elements - Step Progress Display

**Priority:** High
...
```

Output (status.json):

```json
{
    "metadata": {
        "testPlanSource": "./docs/test-plan.md",
        "totalIterations": 0,
        "maxIterations": 50,
        "startedAt": null,
        "lastUpdatedAt": null,
        "summary": {
            "total": 2,
            "pending": 2,
            "pass": 0,
            "fail": 0,
            "knownIssue": 0
        }
    },
    "testCases": {
        "TC-501": {
            "name": "Checkout Header Display",
            "priority": "High",
            "status": "pending",
            "fixAttempts": 0,
            "notes": "",
            "lastTestedAt": null
        },
        "TC-502": {
            "name": "Checkout Elements - Step Progress Display",
            "priority": "High",
            "status": "pending",
            "fixAttempts": 0,
            "notes": "",
            "lastTestedAt": null
        }
    },
    "knownIssues": []
}
```

## Validation

After generating, verify:

- [ ] All TC-XXX IDs from the test plan are included
- [ ] No duplicate TC IDs
- [ ] Summary.total matches count of testCases
- [ ] JSON is valid (no syntax errors)
- [ ] File saved to correct path
````
Read the test plan file and generate a `status.json` file with all test cases initialized.

## Input

- **Test Plan:** `notes/test_plan.md`

## Output

- **Status File:** `notes/ralph_test/status.json`

## Instructions

1. Read the test plan markdown file
2. Extract ALL test cases (format: TC-XXX)
3. For each test case, extract:
    - TC ID (e.g., "TC-501")
    - Name (the test case title after the TC ID)
    - Priority (Critical/High/Medium/Low)
4. Generate a JSON file with this exact structure:

```json
{
  "metadata": {
    "testPlanSource": "notes/test_plan.md",
    "totalIterations": 0,
    "maxIterations": 50,
    "startedAt": null,
    "lastUpdatedAt": null,
    "summary": {
      "total": <count>,
      "pending": <count>,
      "pass": 0,
      "fail": 0,
      "knownIssue": 0
    }
  },
  "testCases": {
    "TC-XXX": {
      "name": "Test case name from plan",
      "priority": "Critical|High|Medium|Low",
      "status": "pending",
      "fixAttempts": 0,
      "notes": "",
      "lastTestedAt": null
    }
  },
  "knownIssues": []
}
```

````

5. Save the file to the output path

## Extraction Rules

- Test case IDs follow pattern: `TC-NNN` (e.g., TC-501, TC-522)
- Test case names are in headers like: `#### TC-501: Checkout Header Display`
- Priority is usually listed in the test case details or status tracker table
- If priority not found, default to "Medium"

## Example

Input (from test plan):

```markdown
#### TC-501: Checkout Header Display

**Priority:** High
...

#### TC-502: Checkout Elements - Step Progress Display

**Priority:** High
...
```

Output (status.json):

```json
{
    "metadata": {
        "testPlanSource": "./docs/test-plan.md",
        "totalIterations": 0,
        "maxIterations": 50,
        "startedAt": null,
        "lastUpdatedAt": null,
        "summary": {
            "total": 2,
            "pending": 2,
            "pass": 0,
            "fail": 0,
            "knownIssue": 0
        }
    },
    "testCases": {
        "TC-501": {
            "name": "Checkout Header Display",
            "priority": "High",
            "status": "pending",
            "fixAttempts": 0,
            "notes": "",
            "lastTestedAt": null
        },
        "TC-502": {
            "name": "Checkout Elements - Step Progress Display",
            "priority": "High",
            "status": "pending",
            "fixAttempts": 0,
            "notes": "",
            "lastTestedAt": null
        }
    },
    "knownIssues": []
}
```

## Validation

After generating, verify:

- [ ] All TC-XXX IDs from the test plan are included
- [ ] No duplicate TC IDs
- [ ] Summary.total matches count of testCases
- [ ] JSON is valid (no syntax errors)
- [ ] File saved to correct path
````

Key elements:

  • Points to your test plan location (notes/test_plan.md)
  • Specifies the output file (notes/ralph_test/status.json)
  • Defines the JSON structure with metadata and test case tracking

Nothing fancy. Just clear instructions.

3. The Loop Prompt

The prompt.md file contains the instructions Claude follows every single iteration:

prompt.md showing the testing agent loop: 1. Read state from files, 2. Pick ONE test case, 3. Execute or fix it, 4. Update state files, 5. Check if done. Includes warning that Claude has NO memory of previous iterations—files are the memory
PROMPT: Ralph Loop Testing Agent (Execution Prompt)
You are a testing agent in an iterative loop. Each iteration:

1. Read state from files
2. Pick ONE test case
3. Execute or fix it
4. Update state files
5. Check if done → output completion promise OR continue

**You have NO memory of previous iterations.** Files are your memory.

---

## Files to Read FIRST

| File                           | Purpose                                         |
| ------------------------------ | ----------------------------------------------- |
| `notes/ralph_test/status.json` | Current state of all test cases (JSON)          |
| `notes/test_plan.md`           | Full test plan with steps and expected outcomes |
| `notes/ralph_test/results.md`  | Human-readable log (append results here)        |

**Optional context:**

- `notes/impl_plan.md` — Implementation details
- `notes/specs.md` — Specifications details

---

## Environment

wp-env is running:

- Dev site: http://localhost:8101
- Test site: http://localhost:8102
- Admin: http://localhost:8101/wp-admin

Commands:

- Run inside sandbox: Standard commands
- Run outside sandbox: npm, docker, wp-env commands

## Test Credentials

### Admin

- URL: http://localhost:8101/wp-admin
- Username: admin
- Email: wordpress@example.com
- Password: password

### Reset Password (if needed)

```bash
wp user update admin --user_pass=password
```

---

## This Iteration

### Step 1: Read State

Read the test status JSON file. Understand:

- Which test cases exist
- Status of each: `pending`, `testing`, `pass`, `fail`, `known_issue`
- Fix attempts for failing tests

### Step 2: Check Completion

**If ALL test cases are `pass` or `known_issue`:**

Output completion promise and final summary:

<promise>ALL_TESTS_RESOLVED</promise>

Summary:

- Total passed: X
- Known issues: Y
- Recommendations: ...

**Otherwise, continue to Step 3.**

### Step 3: Pick ONE Test Case

Priority order:

1. `testing` — Continue mid-test
2. `fail` with `fixAttempts < 3` — Needs fix
3. `pending` — Fresh test

### Step 4: Execute Test

Using Chrome browser automation (natural language):

- Navigate to URLs
- Click buttons/links
- Fill form inputs
- Take screenshots
- Read console logs
- Verify DOM state

**Follow the test plan click-path EXACTLY.**

### Step 5: Record Result

Update test status JSON:

**PASS:**

```json
{ "status": "pass", "notes": "What was verified", "lastTestedAt": "ISO timestamp" }
```

**FAIL:**

```json
{ "status": "fail", "fixAttempts": <increment>, "notes": "What failed", "lastTestedAt": "ISO timestamp" }
```

Update `metadata.totalIterations` and `metadata.lastUpdatedAt`.

### Step 6: Handle Failures

**If FAIL and fixAttempts < 3:**

- Analyze root cause
- Implement fix in codebase
- Next iteration will re-test

**If FAIL and fixAttempts >= 3:**

- Set status to `known_issue`
- Add to `knownIssues` array with: id, description, steps, severity

### Step 7: Update Human Log

Append to test results markdown:

```markdown
## Iteration [N] — [TIMESTAMP]

**TC:** TC-XXX — [Name]
**Status:** ✅/❌/⚠️
**Notes:** [What happened]

---
```

### Step 8: Continue or Complete

- If all TCs resolved → Output `<promise>ALL_TESTS_RESOLVED</promise>`
- Otherwise → Continue working (loop will restart)

---

## Rules

1. ONE test case per iteration
2. Update files BEFORE finishing
3. Follow test steps EXACTLY
4. Screenshot key verification points
5. Max 3 fix attempts → then known_issue
6. Output promise ONLY when truly complete
You are a testing agent in an iterative loop. Each iteration:

1. Read state from files
2. Pick ONE test case
3. Execute or fix it
4. Update state files
5. Check if done → output completion promise OR continue

**You have NO memory of previous iterations.** Files are your memory.

---

## Files to Read FIRST

| File                           | Purpose                                         |
| ------------------------------ | ----------------------------------------------- |
| `notes/ralph_test/status.json` | Current state of all test cases (JSON)          |
| `notes/test_plan.md`           | Full test plan with steps and expected outcomes |
| `notes/ralph_test/results.md`  | Human-readable log (append results here)        |

**Optional context:**

- `notes/impl_plan.md` — Implementation details
- `notes/specs.md` — Specifications details

---

## Environment

wp-env is running:

- Dev site: http://localhost:8101
- Test site: http://localhost:8102
- Admin: http://localhost:8101/wp-admin

Commands:

- Run inside sandbox: Standard commands
- Run outside sandbox: npm, docker, wp-env commands

## Test Credentials

### Admin

- URL: http://localhost:8101/wp-admin
- Username: admin
- Email: wordpress@example.com
- Password: password

### Reset Password (if needed)

```bash
wp user update admin --user_pass=password
```

---

## This Iteration

### Step 1: Read State

Read the test status JSON file. Understand:

- Which test cases exist
- Status of each: `pending`, `testing`, `pass`, `fail`, `known_issue`
- Fix attempts for failing tests

### Step 2: Check Completion

**If ALL test cases are `pass` or `known_issue`:**

Output completion promise and final summary:

<promise>ALL_TESTS_RESOLVED</promise>

Summary:

- Total passed: X
- Known issues: Y
- Recommendations: ...

**Otherwise, continue to Step 3.**

### Step 3: Pick ONE Test Case

Priority order:

1. `testing` — Continue mid-test
2. `fail` with `fixAttempts < 3` — Needs fix
3. `pending` — Fresh test

### Step 4: Execute Test

Using Chrome browser automation (natural language):

- Navigate to URLs
- Click buttons/links
- Fill form inputs
- Take screenshots
- Read console logs
- Verify DOM state

**Follow the test plan click-path EXACTLY.**

### Step 5: Record Result

Update test status JSON:

**PASS:**

```json
{ "status": "pass", "notes": "What was verified", "lastTestedAt": "ISO timestamp" }
```

**FAIL:**

```json
{ "status": "fail", "fixAttempts": <increment>, "notes": "What failed", "lastTestedAt": "ISO timestamp" }
```

Update `metadata.totalIterations` and `metadata.lastUpdatedAt`.

### Step 6: Handle Failures

**If FAIL and fixAttempts < 3:**

- Analyze root cause
- Implement fix in codebase
- Next iteration will re-test

**If FAIL and fixAttempts >= 3:**

- Set status to `known_issue`
- Add to `knownIssues` array with: id, description, steps, severity

### Step 7: Update Human Log

Append to test results markdown:

```markdown
## Iteration [N] — [TIMESTAMP]

**TC:** TC-XXX — [Name]
**Status:** ✅/❌/⚠️
**Notes:** [What happened]

---
```

### Step 8: Continue or Complete

- If all TCs resolved → Output `<promise>ALL_TESTS_RESOLVED</promise>`
- Otherwise → Continue working (loop will restart)

---

## Rules

1. ONE test case per iteration
2. Update files BEFORE finishing
3. Follow test steps EXACTLY
4. Screenshot key verification points
5. Max 3 fix attempts → then known_issue
6. Output promise ONLY when truly complete

This is crucial for Claude Code testing to work properly.

Each iteration, Claude:

  1. Reads status.json to understand current state
  2. Picks the next pending test case
  3. Executes the test in an actual browser
  4. Updates status.json and results.md
  5. Ends the iteration (which triggers the next loop)

Rinse. Repeat. Until done.

4. Initialize the Status File

Run the prepare prompt to generate your starting state:

Claude Code terminal showing the command to read and implement the prepare.md file

Claude reads your test plan and creates status.json with all 38 test cases initialized:

Claude Code output showing it created status.json with 38 test cases extracted, priority breakdown of 6 Critical, 18 High, 14 Medium, all cases initialized with status pending and fixAttempts 0

The generated status file looks like this:

status.json file showing metadata section with testPlanSource, totalIterations at 0, maxIterations at 50, summary counts, and testCases section with TC-001 Display Payment Mode Settings, TC-002 Prerequisites Check WooCommerce Not Active, and TC-003 Prerequisites Check No Payment Gateway, all pending

Every test case has:

  • status: “pending”, “pass”, “fail”, or “knownIssue”
  • fixAttempts: How many times Claude tried to fix this case
  • notes: What Claude observed during testing
  • lastTestedAt: Timestamp of the last test

All 38 tests. Ready to go. Pending status across the board.

.

.

.

5. Trigger the Ralph Loop

Now the magic happens.

Trigger the Ralph loop with this command:

/ralph-loop:ralph-loop "perform this: @notes/ralph_test/prompt.md" --completion-promise "ALL_TESTS_RESOLVED" --max-iterations 100
Claude Code terminal showing the ralph-loop command with prompt.md path, completion-promise set to ALL_TESTS_RESOLVED, and max-iterations 100
  • The --completion-promise tells Ralph to keep looping until Claude outputs “ALL_TESTS_RESOLVED.”
  • The --max-iterations prevents infinite loops. (Because nobody wants that.)

6. Watch Claude Test Its Own Work

Claude starts by reading the state files to understand the current status:

Claude Code showing iteration 1 starting, reading state files showing 38 total test cases all pending, then selecting TC-001 Display Payment Mode Settings as the first test, launching browser to navigate to admin settings page

It picks TC-001: Display Payment Mode Settings.

Then it launches a browser—an actual browser!—navigates to the settings page, and verifies each requirement:

Claude Code showing TC-001 verification results with green checkmarks for: Settings page loads, Payment Mode section visible, Radio button options displayed showing Direct Stripe Integration and WooCommerce, and Description of each mode shown in info box. Concludes with TC-001 PASS

All checks pass. TC-001: PASS ✅

(Look at all those green checkmarks. Gorgeous.)

Claude updates the status file:

Claude Code diff showing status.json updates: totalIterations changed from 0 to 1, startedAt and lastUpdatedAt timestamps added, pending count decreased from 38 to 37, pass count increased from 0 to 1, TC-001 status changed from pending to pass with detailed notes

Then updates results.md with a human-readable log:

Claude Code showing results.md being written with Iteration 1 header, TC-001 test case name, PASS status, and detailed notes about what was verified. Shows iteration complete with 1 pass 37 pending, then stop hook triggering Ralph iteration 2

Notice the stop hook at the bottom: “Ralph iteration 2.”

The loop automatically triggers the next iteration.

No manual intervention.

No babysitting.

Just… Claude Code testing itself.

.

.

.

7. The Loop Continues (Without You)

Iteration 2 starts.

Claude reads the state (1 pass, 37 pending), picks TC-002:

Claude Code showing Iteration 2 starting with current state 1 pass 37 pending, selecting TC-002 Prerequisites Check WooCommerce Not Active, then running bash command to deactivate WooCommerce plugin to test the prerequisite behavior

TC-002 requires WooCommerce to be deactivated.

So what does Claude do? Runs wp plugin deactivate woocommerce, then tests the settings page behavior.

The test passes—the WooCommerce option correctly shows “Setup Required” when the plugin is inactive:

Claude Code showing TC-002 verification with green checkmarks for: Settings page loads, WooCommerce option shows Setup Required badge and is disabled, Error message displayed in Prerequisites section with Install WooCommerce link, Payment Gateway prerequisite shows warning. TC-002 PASS

Claude reactivates WooCommerce and updates the status:

Claude Code diff showing status.json metadata updates: totalIterations increased to 2, lastUpdatedAt timestamp updated
Claude Code diff showing TC-002 status changed from pending to pass with notes describing the WooCommerce deactivation test results

And appends to results.md:

Claude Code showing results.md update with Iteration 2 section added, TC-002 test details, PASS status, and notes about WooCommerce prerequisite behavior verification

Iteration 2 complete.

Stop hook triggers iteration 3:

Claude Code showing Iteration 2 Complete with TC-002 PASS, total 2 pass 36 pending, stop hook message triggering Ralph iteration 3, then reading state for TC-003 Prerequisites Check No Payment Gateway

This continues automatically. Test after test after test.

You could go make coffee. Take a walk. Do your taxes.

(Okay, maybe not taxes.)

.

.

.

8. When Tests Fail, Claude Fixes Them

HERE’S where Ralph Loop really shines.

During testing, Claude encounters a failing test. The pricing page isn’t displaying plan prices correctly.

Does it give up? Does it log “FAIL” and move on?

Nope.

Claude investigates, finds the issue—the template is using old meta keys instead of the Plan model—and fixes it:

Claude Code showing investigation of pricing section template, identifying issue with meta key mismatch between template expectations and Plan model, then updating section-plans.php to replace manual WP_Query with Plan model method call

Then Claude retests to verify the fix worked:

Claude Code showing template update to use Plan::findPublished(), refreshing pricing page, verifying correct prices displayed (Hot Desk $199/month, Dedicated Desk $399/month with Most Popular badge, Private Office $799/month), then clicking Get Started to test checkout flow

The pricing page now shows correct prices. Claude clicks “Get Started” to continue testing the checkout flow.

Test. Find bug. Fix bug. Retest. Confirm fix.

All automatic.

.

.

.

9. All Tests Pass

After 3 hours and 32 minutes, all 38 test cases resolve:

Claude Code showing final test results summary table with all categories passing: Payment Mode Configuration (5 tests), Product & Plan Sync (2 tests), Checkout Flow (6 tests), Subscription Lifecycle (6 tests), Renewal Processing (2 tests), Plan Changes (6 tests), Cancellation (2 tests), Member Portal (4 tests), Admin Features (2 tests), Emails (2 tests), Security (1 test). Key P0/P1 Critical Tests listed below, ending with ALL_TESTS_RESOLVED and total time of 3h 32m 34s

Summary of Test Results:

  • Payment Mode Configuration: 5 tests ✅
  • Product & Plan Sync: 2 tests ✅
  • Checkout Flow: 6 tests ✅
  • Subscription Lifecycle: 6 tests ✅
  • Renewal Processing: 2 tests ✅
  • Plan Changes: 6 tests ✅
  • Cancellation: 2 tests ✅
  • Member Portal: 4 tests ✅
  • Admin Features: 2 tests ✅
  • Emails: 2 tests ✅
  • Security: 1 test ✅

Total: 38 tests. All passing.

The critical P0/P1 tests that Claude fixed during the loop:

  • TC-004: Mode Switch Blocking ✅
  • TC-009: Guest Checkout Prevention ✅ (with fix)
  • TC-016: Race Condition Prevention ✅
  • TC-018: Pre-Renewal Token Validation ✅
  • TC-020: 3D Secure Handling ✅
  • TC-038: Token Ownership Validation ✅

HECK YES.

.

.

.

The Proof: It Actually Works Now

Remember the checkout problem from the beginning? The one that made me question my life choices?

Let’s see what happens now.

The pricing page displays correctly:

CoWorkPress pricing page showing three plan cards: Hot Desk at $199/month, Dedicated Desk at $399/month with Most Popular badge, and Private Office at $799/month, each with feature lists and Get Started buttons. Arrow pointing to Hot Desk Get Started button

Click “Get Started” on Hot Desk, and you’re redirected to the WooCommerce checkout:

WooCommerce Checkout page with Account Required for Subscription notice, Contact information section with email field, Billing address fields, and Order summary showing Hot Desk at $199.00 with Monthly billing cycle

See the difference?

This is the WooCommerce checkout page.

The order summary shows “Hot Desk” with “Billing Cycle: Monthly.” The account creation notice appears because subscriptions require accounts.

(This is the moment I did a small victory dance. Don’t judge.)

Scroll down to payment options—Stripe through WooCommerce:

Payment options section showing Stripe card payment form with test mode notice, card number field filled with test card 4242, expiration and security code fields, and optional fields for saving payment information

The Stripe integration now runs through WooCommerce. Same payment processor, but managed by WooCommerce’s subscription system. I can swap in PayPal, Square, or any other gateway without touching theme code.

Complete the purchase, and you land on the welcome page:

Welcome to CoWorkPress confirmation page with checkmark icon, Your membership is now active message, Order Confirmation card showing Hot Desk plan, Monthly subscription, $199.00 charged, next billing date March 10 2026, confirmation number, and View Receipt on Stripe link

Everything works.

The flow connects end-to-end.

The WooCommerce integration that Claude “completed” previously?

Now it’s actually complete.

.

.

.

The Complete Journey: From Idea to Working Product

Let me zoom out and show you how all three parts of this series connect:

Infographic titled "FROM IDEA TO WORKING PRODUCT" detailing a four-phase software development process. The first phase, "PHASE 1: SPECS" (with a brain emoji and document icon), involves describing the task and trigger, asking user questions until 95% confident. An arrow leads to "PHASE 2: TEST PLAN" (with eyes emoji and checklist icon), which asks "What does success look like?" and defines "38 test cases with criteria." The next phase, "PHASE 3: IMPLEMENTATION" (with keyboard emoji and code icon), addresses "What tasks map to which test cases?" and lists "13 tasks in 4 phases." An arrow descends to a central box for "PHASE 4: TESTING" (with seal emoji and browser loop icon), detailing the "RALPH LOOP": "Pick test case," "Execute in browser," "Pass? → Next" (with green check), "Fail? → Fix → Retest" (with red cross), and final results of "3h 32m" and "38/38 passing" (with green check). A final arrow points down to the "WORKING PRODUCT" box (with rocket emoji and green check), listing the outcomes: "All features implemented," "All edge cases handled," "All tests verified in actual browser," and "Bugs found and fixed during testing." The background is soft light gray, with navy text and structural lines, and safety orange accents for key metrics and the final result box.

Phase 1: Bulletproof Specs

We started by brainstorming comprehensive specifications.

Using the AskUserQuestion tool, Claude asked 12 clarifying questions covering everything from subscription handling to checkout experience to refund policies. Then Claude critiqued its own specs, finding 14 potential issues before we wrote any code.

Phase 2: Test Plan

Before implementation, we generated a test plan.

38 test cases defining exactly what success looks like—from a user’s perspective. These became our acceptance criteria.

Phase 3: Implementation Plan + Sub-Agents

We created an implementation plan mapping tasks to test cases. Then executed with sub-agents running in parallel waves, keeping context usage low while building everything in 52 minutes.

Phase 4: Claude Code Testing + Fixing with Ralph Loop

Finally, we let Ralph loose. The autonomous loop tested each case in an actual browser, found the bugs Claude missed during implementation, fixed them, and verified the fixes.

3 hours 32 minutes later: 38/38 tests passing.

.

.

.

What I’ve Learned About Building With AI

Here’s what this whole journey taught me.

We all want AI to one-shot solutions on the first try. To type a prompt, hit enter, and watch magic happen. And when it doesn’t work perfectly? We blame the AI. Call it nerfed. Call it lazy. Move on to the next shiny tool.

But here’s the thing I keep coming back to:

Even the most experienced developer can’t one-shot a complex feature.

We write code. Test it. Find bugs. Fix them. Test again. That’s just how building software works. Always has been. Probably always will be.

AI is no different.

The breakthrough—the real breakthrough—comes from giving AI the ability to verify its own work. The same way any developer does. Write the code. Test it against real user scenarios. See what breaks. Fix it. Test again.

Ralph Loop makes this autonomous.

You don’t have to manually test 38 scenarios. You don’t have to spot the bugs yourself. You don’t have to describe each fix.

You define success criteria upfront (test plan), give Claude the ability to test against those criteria (browser automation), and let it iterate until everything passes.

👉 That’s the entire secret: structured iteration with clear success criteria.

Not smarter prompts. Not better models. Not more tokens.

Just… iteration.

The same boring, unsexy process that’s always made software work.

Except now, you don’t have to do it yourself.

8 min read The Art of Vibe Coding

How to Make Claude Code Actually Build What You Designed

Here’s a thing that happened to me once.

I moved apartments.

Being the organized person I am, I created the most detailed inventory list you’ve ever seen. Every box labeled. Every item cataloged. “Kitchen – Plates (12), Bowls (8), That Weird Garlic Press I Never Use But Can’t Throw Away (1).”

I handed this masterpiece to the movers and said, “Here you go!”

They looked at me like I’d handed them a grocery list in Klingon.

Because here’s what my beautiful inventory didn’t tell them: Which boxes go to which rooms. What order to load things. Which items are fragile. What depends on what. The fact that the bookshelf needs to go in before the desk, or nothing fits.

They weren’t wrong to be confused. I’d given them a comprehensive what without any how.

This is exactly what happens when you hand Claude Code your bulletproof specs and say “implement this.”

.

.

.

The Gap Nobody Warns You About

Last week, we talked about creating bulletproof specs using the 3-phase method.

You followed the process. You answered every clarifying question. You had Claude critique its own work. Your specs are comprehensive—2,000+ lines of detailed requirements, edge cases, and architectural decisions.

Now you’re ready to build.

So you fire up Claude Code and type: “Read the specs and implement it.”

Claude starts working. Files appear. Code flows.

And thirty minutes later? Half your edge cases are missing. The checkout flow doesn’t match what you specified. That critical race condition prevention you spent three rounds of Q&A perfecting?

Nowhere to be found.

Here’s the thing: Comprehensive specs don’t automatically translate to comprehensive implementation.

Your specs might be 2,000 lines. Claude’s context window is limited. As implementation progresses, early requirements fade from memory. The AI starts making shortcuts. Details slip through the cracks like sand through fingers.

Sound familiar?

(If you’re nodding right now, stay with me.)

The issue isn’t Claude’s capability. It’s the gap between what’s documented and what gets built. Even human developers working from perfect documentation miss things. They get tired. They make assumptions. They interpret requirements their own way.

Claude faces the same challenges—plus context limits that force it to work with only a subset of information at any given moment.

👉 The solution isn’t better prompting. It’s better process.

And that process? It’s what I’ve been calling the Claude Code implementation workflow. Let me show you what I mean.

.

.

.

The Missing Middle Layer

Here’s what most people do:

I call this the “hope-based development methodology.”

(That’s a joke. Please don’t actually call it that.)

Here’s what actually works:

An infographic titled "DEVELOPMENT WORKFLOW: SPECS TO IMPLEMENTATION" on a light gray background. A horizontal flowchart shows four rectangular boxes with rounded corners connected by gray arrows. The first box on the left is "SPECS" with a small pink brain icon. An arrow points from "SPECS" to the second box, "TEST PLAN," which has a clipboard with a checkmark and two eyes icon. A downward arrow from "TEST PLAN" points to a gray rounded rectangular box below with the text: "'What does success look like?'" followed by a green checkmark icon. An arrow from "TEST PLAN" points to the third horizontal box, "IMPLEMENTATION PLAN," with a keyboard icon. A downward arrow from "IMPLEMENTATION PLAN" points to a gray rounded rectangular box below with the text: "'What tasks map to which test cases?'" followed by a green checkmark icon. An arrow from "IMPLEMENTATION PLAN" points to the fourth horizontal box, "TASK-BY-TASK IMPLEMENTATION," with a seal icon. A downward arrow from "TASK-BY-TASK IMPLEMENTATION" points to a gray rounded rectangular box below with the text: "'One focused sub-agent per task'" followed by a green checkmark icon. All boxes have dark blue borders and dark blue text, except for the gray boxes below which have dark blue text and a green checkmark.
  • The test plan answers: “How will we know if each requirement is implemented correctly?”
  • The implementation plan answers: “What specific tasks need to happen, and in what order?”
  • The task management answers: “How do we keep Claude focused and prevent context overload?”

Think of it like this: your specs are the inventory list. The test plan is the “here’s how we’ll know each box arrived safely” checklist. The implementation plan is the “which room, which order, what depends on what” instruction sheet.

The movers—er, Claude—can actually do their job now.

Let me walk you through exactly how this Claude Code implementation workflow… well, works.

.

.

.

Step 1: Create a Test Plan From Your Specs

Before writing any code, Claude needs to understand what success looks like.

Now, I know what you’re thinking: “Wait—isn’t a test plan for after implementation?”

Traditionally, yes. But for AI-driven development, creating the test plan first serves a completely different purpose.

👉 It forces Claude to deeply analyze every requirement and translate it into verifiable outcomes.

When Claude creates test cases for “handle race conditions during renewal processing,” it has to think through exactly what that means. What are the preconditions? What actions trigger the behavior? What should the expected results be?

It’s like asking someone to write the exam questions before teaching the class. Suddenly, they understand the material much more deeply.

Here’s the prompt I use:

PROMPT: Create a Comprehensive Test Plan based on Specs
Create a comprehensive test plan that will verify the implementation matches the specs at `notes/specs.md`

### Step 1: Identify Test Scenarios

Based on the specs:
- Happy path flows
- Error conditions
- Edge cases
- State transitions
- Responsive behavior
- Accessibility requirements

### Step 2: Create Test Cases

For each scenario, create detailed test cases:

```markdown
### TC-NNN: [Test Name]

**Description:** [What this test verifies]

**Preconditions:**
- [Required state before test]
- [Required data]

**Steps:**

| Step | Action | Expected Result |
|------|--------|-----------------|
| 1 | [Action to take] | [What should happen] |
| 2 | [Action to take] | [What should happen] |

**Test Data:**
- Field 1: `value`
- Field 2: `value`

**Expected Outcome:** [Final verification]

**Priority:** Critical / High / Medium / Low
````

### Step 3: Organize by Category

Group test cases:

- Functional tests
- UI/UX tests
- Validation tests
- Integration tests (if applicable)
- Edge case tests

### Step 4: Create Status Tracker

```markdown
## Status Tracker

| TC     | Test Case | Priority | Status | Remarks |
| ------ | --------- | -------- | ------ | ------- |
| TC-001 | [Name]    | High     | [ ]    |         |
| TC-002 | [Name]    | Medium   | [ ]    |         |
```

### Step 5: Add Known Issues Section

```markdown
## Known Issues

| Issue | Description | TC Affected | Steps to Reproduce | Severity |
| ----- | ----------- | ----------- | ------------------ | -------- |
|       |             |             |                    |          |
```

## Output

Save the test plan to: `notes/test_plan.md`

Include:

1. Overview and objectives
2. Prerequisites
3. Reference wireframe (if applicable)
4. Test cases (10-20 typically)
5. Status tracker
6. Known issues section

## Test Case Guidelines

- Each test should be independent
- Use specific, concrete test data
- Include both positive and negative tests
- Cover all screens from wireframe (if applicable)
- Test all states from prototype
- Consider mobile/responsive

## Do NOT

- Over-test obvious functionality
- Skip error handling tests
- Forget accessibility basics
Create a comprehensive test plan that will verify the implementation matches the specs at `notes/specs.md`

### Step 1: Identify Test Scenarios

Based on the specs:
- Happy path flows
- Error conditions
- Edge cases
- State transitions
- Responsive behavior
- Accessibility requirements

### Step 2: Create Test Cases

For each scenario, create detailed test cases:

```markdown
### TC-NNN: [Test Name]

**Description:** [What this test verifies]

**Preconditions:**
- [Required state before test]
- [Required data]

**Steps:**

| Step | Action | Expected Result |
|------|--------|-----------------|
| 1 | [Action to take] | [What should happen] |
| 2 | [Action to take] | [What should happen] |

**Test Data:**
- Field 1: `value`
- Field 2: `value`

**Expected Outcome:** [Final verification]

**Priority:** Critical / High / Medium / Low
````

### Step 3: Organize by Category

Group test cases:

- Functional tests
- UI/UX tests
- Validation tests
- Integration tests (if applicable)
- Edge case tests

### Step 4: Create Status Tracker

```markdown
## Status Tracker

| TC     | Test Case | Priority | Status | Remarks |
| ------ | --------- | -------- | ------ | ------- |
| TC-001 | [Name]    | High     | [ ]    |         |
| TC-002 | [Name]    | Medium   | [ ]    |         |
```

### Step 5: Add Known Issues Section

```markdown
## Known Issues

| Issue | Description | TC Affected | Steps to Reproduce | Severity |
| ----- | ----------- | ----------- | ------------------ | -------- |
|       |             |             |                    |          |
```

## Output

Save the test plan to: `notes/test_plan.md`

Include:

1. Overview and objectives
2. Prerequisites
3. Reference wireframe (if applicable)
4. Test cases (10-20 typically)
5. Status tracker
6. Known issues section

## Test Case Guidelines

- Each test should be independent
- Use specific, concrete test data
- Include both positive and negative tests
- Cover all screens from wireframe (if applicable)
- Test all states from prototype
- Consider mobile/responsive

## Do NOT

- Over-test obvious functionality
- Skip error handling tests
- Forget accessibility basics
Claude Code terminal showing the prompt to create a comprehensive test plan based on specs, with structured steps for identifying test scenarios and creating detailed test cases with preconditions, steps tables, test data, and priority levels

Claude reads through all the specs, identifies what needs to be tested, and generates a structured test plan.

Claude Code output showing it reading the specs file and three detailed spec parts, then writing a 1145-line test plan file titled "WooCommerce Integration Test Plan" with version, date, and specification reference

For my WooCommerce integration, Claude created 38 test cases organized into 12 sections:

Claude Code displaying the test plan summary with 38 test cases across 12 sections including Payment Mode Configuration, Product Sync, Checkout Flow, Subscription Lifecycle, Renewal Processing, and more, with priority distribution showing 7 Critical, 20 High, and 11 Medium tests

Notice the priority distribution:

  • Critical (P0): 7 tests — Must pass before deployment
  • High (P1): 20 tests — Essential functionality
  • Medium: 11 tests — Important but not blocking

Each test case maps directly to a requirement in my specs. Nothing ambiguous. Nothing assumed. Nothing left to interpretation.

(This is the part where past-me would have skipped ahead to coding. Don’t be past-me.)

.

.

.

Step 2: Create an Implementation Plan That Maps to Test Cases

Now Claude knows what success looks like. Next question: how do we get there?

The implementation plan bridges test cases to actual tasks. Every task links back to specific test cases it will satisfy. It’s the “what depends on what” instruction sheet for our movers.

PROMPT: Create an Implementation Plan That Maps to Test Cases
Specs is approved, test plan is ready. Now we need an implementation plan.

- **Specs**: `notes/specs.md`
- **Test Plan:** `notes/test_plan.md`

## Your Task

Create a detailed implementation plan that maps to the test cases.

### Step 1: Analyze Test Cases

For each test case (TC-NNN):
- What functionality must exist?
- What files need to be created/modified?
- What dependencies are needed?

### Step 2: Create Task Breakdown

Group test cases into implementation tasks:

```markdown
## Implementation Plan: [PHRASE_NAME]

### Overview
[Brief description]

### Files to Create/Modify
[List all files]

### Implementation Tasks

#### Task 1: [Name]
**Mapped Test Cases:** TC-001, TC-002, TC-003
**Files:**
- `path/to/file1.php` - [description]
- `path/to/file2.js` - [description]

**Implementation Notes:**
- [Key detail 1]
- [Key detail 2]

**Acceptance Criteria:**
- [ ] TC-001 passes
- [ ] TC-002 passes
- [ ] TC-003 passes

#### Task 2: [Name]
...
````

### Step 3: Identify Dependencies

- What from previous phrases is needed?
- What order should tasks be implemented?
- Any external dependencies?

### Step 4: Estimate Complexity

- Simple: 1-2 tasks, straightforward
- Medium: 3-5 tasks, some complexity
- Complex: 6+ tasks, significant work

## Output

Save the implementation plan to: `notes/impl_plan.md`

Include:

1. Overview
2. Files to create/modify
3. Tasks with TC mappings
4. Dependencies
5. Complexity estimate

## Guidelines

- Every test case must map to a task
- Tasks should be completable in one session
- Include enough detail to guide implementation
- Reference design system patterns

## Do NOT

- Include actual code (next step)
- Over-engineer simple features
Specs is approved, test plan is ready. Now we need an implementation plan.

- **Specs**: `notes/specs.md`
- **Test Plan:** `notes/test_plan.md`

## Your Task

Create a detailed implementation plan that maps to the test cases.

### Step 1: Analyze Test Cases

For each test case (TC-NNN):
- What functionality must exist?
- What files need to be created/modified?
- What dependencies are needed?

### Step 2: Create Task Breakdown

Group test cases into implementation tasks:

```markdown
## Implementation Plan: [PHRASE_NAME]

### Overview
[Brief description]

### Files to Create/Modify
[List all files]

### Implementation Tasks

#### Task 1: [Name]
**Mapped Test Cases:** TC-001, TC-002, TC-003
**Files:**
- `path/to/file1.php` - [description]
- `path/to/file2.js` - [description]

**Implementation Notes:**
- [Key detail 1]
- [Key detail 2]

**Acceptance Criteria:**
- [ ] TC-001 passes
- [ ] TC-002 passes
- [ ] TC-003 passes

#### Task 2: [Name]
...
````

### Step 3: Identify Dependencies

- What from previous phrases is needed?
- What order should tasks be implemented?
- Any external dependencies?

### Step 4: Estimate Complexity

- Simple: 1-2 tasks, straightforward
- Medium: 3-5 tasks, some complexity
- Complex: 6+ tasks, significant work

## Output

Save the implementation plan to: `notes/impl_plan.md`

Include:

1. Overview
2. Files to create/modify
3. Tasks with TC mappings
4. Dependencies
5. Complexity estimate

## Guidelines

- Every test case must map to a task
- Tasks should be completable in one session
- Include enough detail to guide implementation
- Reference design system patterns

## Do NOT

- Include actual code (next step)
- Over-engineer simple features
Claude Code terminal showing the prompt to create an implementation plan with task breakdowns mapped to specific test cases, including file lists and acceptance criteria linked to TC numbers

Claude analyzes both the specs and test plan, then generates a phased implementation plan:

Claude Code output showing it analyzing specs and test plan files, reading detailed spec parts, then writing an 848-line implementation plan file with version info and test plan reference
Claude Code displaying the implementation plan summary organized into 4 phases with 12 tasks total, showing a table with Phase, Focus, Tasks count, and Test Cases covered for each phase, plus critical path items and new files required

The result: 4 phases, 12 implementation tasks, each explicitly linked to the test cases that will verify them.

  • Phase 1: Foundation & Configuration (2 tasks → TC-001 to TC-007)
  • Phase 2: Checkout & Lifecycle (2 tasks → TC-008 to TC-014)
  • Phase 3: Renewal Processing (3 tasks → TC-015 to TC-021, TC-038)
  • Phase 4: Features (6 tasks → TC-022 to TC-037)

Plus a critical path of P0/P1 items that must work before deployment:

  • Mode switch blocking when active subscriptions exist
  • Race condition prevention (double-charge protection—ferpetesake, the payments!)
  • Pre-renewal token validation
  • Token ownership security

Now we have specs, a test plan, AND an implementation plan. Three documents that all reference each other. A complete picture.

But here’s where most people (including past-me, again) would stumble.

.

.

.

Step 3: Execute With Sub-Agents (This Is Where It Gets Fun)

Here’s something I learned the hard way.

There’s research showing that LLM performance degrades as context size increases. When Claude’s context fills up with implementation details from Task 1, it starts losing precision on Task 8. It’s like asking someone to remember the first item on a grocery list after they’ve been shopping for an hour.

The fix: run each task in its own sub-agent.

Each sub-agent gets fresh context. It focuses on one task, implements it, and reports back. The orchestrating agent manages dependencies and progress. No context pollution. No forgotten requirements.

It’s like having a team of movers where each person is responsible for exactly one room—and they all have fresh energy because they haven’t been carrying boxes all day.

Here’s the prompt that kicks off the Claude Code implementation workflow execution:

PROMPT: Claude Code implementation workflow execution

We are executing the implementation plan. All design and planning is complete.

## Reference Documents
- **Specs:** @notes/specs.md
- **Implementation Plan:** @notes/impl_plan.md
- **Test Plan:** @notes/test_plan.md

## Phase 1: Task Creation

### Before Creating Tasks
1. Review @notes/impl_plan.md completely
2. Understand test case expectations from @notes/test_plan.md
3. Reference wireframe/prototype for UI (if applicable)
4. Check design system for patterns (if available)

### Create Tasks from Implementation Plan
Parse the implementation plan and use `TaskCreate` to create a task for each implementation item:

1. **Extract all tasks** from @notes/impl_plan.md
2. **Identify dependencies** between tasks (what must be done before what)
3. **Create each task** with:
   - Clear description including the specific files to create/modify
   - Mapped test cases (TCs) that verify the task
   - `blocked_by`: tasks that must complete first
   - `blocks`: tasks that depend on this one

Tasks should be granular enough to run independently but logical enough to represent complete units of work.

---

## Phase 2: Task Execution

### Execution Strategy
Execute tasks using sub-agents for parallel processing:

1. **Group tasks into waves** based on dependencies
2. **Run each task in its own sub-agent** - This keeps context usage low (~18% vs ~56%)
3. **Process waves sequentially** - Wave N+1 starts only after Wave N completes

### For Each Task (Sub-Agent Instructions)
1. Use `TaskGet` to read full task details
2. Create/modify specified files
3. Implement functionality to pass mapped TCs
4. **Self-verify the implementation:**
   - Check that code compiles/runs without errors
   - Verify the functionality matches test expectations
   - Ensure design consistency with existing patterns
5. Use `TaskUpdate` to mark task complete with a brief summary of what was done
6. Note any deviations, concerns, or discovered issues

### If Issues Are Discovered
- Use `TaskCreate` to add new fix/bug tasks
- Set appropriate dependencies so fixes run in correct order
- Continue with other independent tasks

---

## Phase 3: Completion Summary

After all tasks are complete, provide:

### 1. Summary of Changes
- Files created
- Files modified  
- Key functionality added

### 2. Self-Verification Results
- What works as expected
- Any concerns or edge cases noted
- Tasks that required fixes (if any)

### 3. Ready for Testing
- Confirm all tasks marked complete
- List any setup needed for testing
- Note any known limitations

---

## Important Notes

- **Do NOT run full test suite** - that's the next step
- **Use `TaskList`** periodically to check overall progress
- **Dependencies are critical** - ensure tasks don't start before their blockers complete
- **Keep sub-agent context focused** - each sub-agent only needs info for its specific task

We are executing the implementation plan. All design and planning is complete.

## Reference Documents
- **Specs:** @notes/specs.md
- **Implementation Plan:** @notes/impl_plan.md
- **Test Plan:** @notes/test_plan.md

## Phase 1: Task Creation

### Before Creating Tasks
1. Review @notes/impl_plan.md completely
2. Understand test case expectations from @notes/test_plan.md
3. Reference wireframe/prototype for UI (if applicable)
4. Check design system for patterns (if available)

### Create Tasks from Implementation Plan
Parse the implementation plan and use `TaskCreate` to create a task for each implementation item:

1. **Extract all tasks** from @notes/impl_plan.md
2. **Identify dependencies** between tasks (what must be done before what)
3. **Create each task** with:
   - Clear description including the specific files to create/modify
   - Mapped test cases (TCs) that verify the task
   - `blocked_by`: tasks that must complete first
   - `blocks`: tasks that depend on this one

Tasks should be granular enough to run independently but logical enough to represent complete units of work.

---

## Phase 2: Task Execution

### Execution Strategy
Execute tasks using sub-agents for parallel processing:

1. **Group tasks into waves** based on dependencies
2. **Run each task in its own sub-agent** - This keeps context usage low (~18% vs ~56%)
3. **Process waves sequentially** - Wave N+1 starts only after Wave N completes

### For Each Task (Sub-Agent Instructions)
1. Use `TaskGet` to read full task details
2. Create/modify specified files
3. Implement functionality to pass mapped TCs
4. **Self-verify the implementation:**
   - Check that code compiles/runs without errors
   - Verify the functionality matches test expectations
   - Ensure design consistency with existing patterns
5. Use `TaskUpdate` to mark task complete with a brief summary of what was done
6. Note any deviations, concerns, or discovered issues

### If Issues Are Discovered
- Use `TaskCreate` to add new fix/bug tasks
- Set appropriate dependencies so fixes run in correct order
- Continue with other independent tasks

---

## Phase 3: Completion Summary

After all tasks are complete, provide:

### 1. Summary of Changes
- Files created
- Files modified  
- Key functionality added

### 2. Self-Verification Results
- What works as expected
- Any concerns or edge cases noted
- Tasks that required fixes (if any)

### 3. Ready for Testing
- Confirm all tasks marked complete
- List any setup needed for testing
- Note any known limitations

---

## Important Notes

- **Do NOT run full test suite** - that's the next step
- **Use `TaskList`** periodically to check overall progress
- **Dependencies are critical** - ensure tasks don't start before their blockers complete
- **Keep sub-agent context focused** - each sub-agent only needs info for its specific task
Claude Code terminal showing the comprehensive implementation execution prompt with three phases: Task Creation with dependency tracking, Task Execution using sub-agents in waves for parallel processing, and Completion Summary requirements

I know. That’s a lot of prompt. But here’s the thing—you set this up once, and then you watch the magic happen.

Task Creation

First, Claude creates all 13 tasks from the implementation plan:

Claude Code showing the task creation process with a list of all tasks including Payment Mode Configuration, Product Sync, Plan Changes, Cancellations, Day Pass Handling, Member Portal, Admin Dashboard, Email Notifications, Checkout Flow, and Subscription Lifecycle with their blocking dependencies

Then sets up dependencies between them. (This is the “bookshelf before desk” part.)

Claude Code displaying the complete task dependency tree showing all tasks with their blocking relationships, such as Task 2.1 Checkout Flow blocked by Tasks 1 and 2, Task 3.1 Renewal Processing blocked by Tasks 3 and 4, and Phase 4 tasks blocked by multiple earlier tasks

Wave-Based Execution

Before diving into implementation, Claude explores the existing codebase to understand patterns:

Claude Code showing Phase 1 execution starting with codebase exploration using 18+ tool calls, displaying the task list with all tasks pending and their dependency relationships clearly visible

Wave 1 starts with 2 sub-agents running Tasks 1.1 and 1.2 in parallel:

Claude Code showing Wave 1 execution with 2 Task agents running in parallel, implementing Payment Mode Configuration (40 tool uses, 111.2k tokens) and Product Sync (36 tool uses, 123.2k tokens), with real-time status updates showing files being modified

Once Wave 1 completes, Wave 2 begins:

Claude Code displaying Wave 1 completion with both tasks marked Done, then starting Wave 2 with 2 new Task agents implementing Checkout Flow and Subscription Lifecycle, showing the task list with Tasks 3 and 4 now unblocked

Wave 2 completes, Wave 3 (the critical phase) starts with 3 sub-agents:

Claude Code showing Wave 2 completion and Wave 3 starting with 3 Task agents implementing Renewal Processing with Race Condition Prevention, Token Validation and Ownership Security, and 3D Secure Handling with Retry Logic, with completed tasks shown crossed out

Wave 3 completes, and Wave 4 launches with 6 sub-agents in parallel:

Claude Code displaying Wave 3 completion with all 3 tasks done, then starting Wave 4 with 6 Task agents running simultaneously for Plan Changes, Cancellations, Day Pass, Portal Integration, Admin Dashboard, and Email Notifications

(Six sub-agents. Running in parallel. Each with fresh context. This is the future we were promised.)

Implementation Complete

All 13 tasks across 4 waves:

Claude Code showing all 6 Wave 4 Task agents finished with their tool counts and token usage, followed by the Implementation Complete summary showing Phase 1 Foundation and Configuration changes including new files created and modified for Payment Mode and Product Sync
Claude Code displaying Phase 2 Checkout and Lifecycle implementation summary showing created files for Checkout Flow and Subscription Lifecycle with test case mappings, plus Phase 3 Renewal Processing Critical section with Race Prevention, Token Validation, and 3DS Retry Logic details
Claude Code showing Phase 4 Features implementation summary including Plan Changes, Cancellations, Day Passes, Portal Integration, Admin Dashboard, and Email Notifications, plus Test Coverage table showing all 38 test cases implemented across P0 Critical, P1 Critical, High, and Medium priorities
Claude Code displaying the final implementation summary with P0/P1 Critical Features Implemented table showing 8 critical features with their implementations, Ready for Testing section with setup requirements, Known Limitations, and confirmation that all 13 tasks across 4 phases are complete, with total execution time of 52 minutes 22 seconds

Total time: 52 minutes 22 seconds.

That’s 13 tasks. 38 test cases worth of functionality. Parallel execution keeping context usage low throughout.

Remember my WooCommerce integration specs? The 2,000+ lines that would have turned into a context-overloaded mess if I’d just said “implement this”?

Every requirement addressed. Every edge case accounted for. Every critical feature implemented.

.

.

.

The Complete Claude Code Implementation Workflow

Let me put this all together:

A technical infographic titled "SPECS TO IMPLEMENTATION WORKFLOW" outlines a process in five steps using a blue, gray, and orange color scheme on a light grid background. The title is at the top in large, bold dark text. Below it, the workflow begins with a box on the left titled "BULLETPROOF SPECS," accompanied by an icon of a document with a shield, stating "2,000+ lines of detailed requirements." An arrow points right to a box titled "TEST PLAN," with a clipboard and magnifying glass icon, asking "'What does success look like?'" and noting "38 test cases across 12 sections." An arrow points down to a central box titled "IMPLEMENTATION PLAN," featuring a flowchart icon, with the text "'What tasks map to which test cases?'" and "12 tasks in 4 phases with dependencies." Another arrow points down to a box titled "TASK EXECUTION WITH SUB-AGENTS," with an icon of a gear and people, listing "Wave 1: 2 agents," "Wave 2: 2 agents," "Wave 3: 3 agents," and "Wave 4: 6 agents," with a callout box highlighting "~18% context vs ~56% without." The final box at the bottom is titled "IMPLEMENTATION COMPLETE," with a checkered flag and stopwatch icon, summarizing the results as "52 minutes," "13 tasks," and "38 test cases" with a green checkmark.

Step 1: Create a test plan from your specs

  • Claude analyzes every requirement
  • Generates verifiable test cases
  • Establishes priority levels

Step 2: Create an implementation plan mapped to test cases

  • Groups requirements into logical tasks
  • Links each task to specific test cases
  • Identifies dependencies between tasks

Step 3: Execute with sub-agents

  • Create all tasks with dependency tracking
  • Process in waves based on blocking relationships
  • Each sub-agent gets fresh context
  • Parallel execution where dependencies allow

It’s the complete Claude Code implementation workflow—from inventory list to fully unpacked apartment. (Okay, I’ll stop with the moving metaphor now.)

.

.

.

But Wait. There’s a Catch.

You followed the workflow. Claude built everything in 52 minutes. Your implementation summary shows all 38 test cases “implemented.”

Here’s the uncomfortable truth I need to share with you:

“Implemented” and “working correctly” aren’t the same thing.

Claude sometimes takes shortcuts. Features get partially built. Edge cases get acknowledged in comments but not actually handled. The sub-agent said “Done”—but did it really do what the test case required?

You need a verification step. A way to systematically check that every test case actually passes. A process for catching the gaps before you discover them in production.

That’s next week.

(Yes, another cliffhanger 😁)

10 min read The Art of Vibe Coding

The 3-Phase Method for Bulletproof Specs When You’re Not Starting From Scratch

Imagine this.

You hire a contractor to “update the bathroom.” You wave your hand vaguely at the space, mention something about “modern vibes,” and leave for work.

You come home to discover they’ve ripped out your vintage clawfoot tub—the one you specifically loved—and replaced it with a walk-in shower. They’ve chosen gray tiles. (Gray! When you’re clearly a warm terracotta person.) And oh, they’ve moved the toilet to a spot that now requires you to shimmy sideways to close the door.

“But you said you wanted it updated,” they say, genuinely confused.

Here’s the thing: they weren’t wrong. You did say that.

You just forgot to mention all the things living rent-free in your head—the constraints, the preferences, the “obviously don’t touch THAT” items you assumed were, well, obvious.

This is exactly what happens when you ask Claude Code to add a feature to your existing app.

.

.

.

The “Just Add This Feature” Trap

You’ve got a working application.

It’s not perfect, but it works. Now you want to add something—a new feature, a refactor, maybe squash a bug that’s been giving you side-eye for weeks.

So you fire up Claude Code and describe what you want in two or three sentences.

Claude gets to work. Files change. Functions appear. Code flows.

And then—record scratch—you realize it completely missed the point.

Not because Claude is bad at its job. But because you gave it the software equivalent of “update the bathroom.”

Your codebase has history.

Conventions. Edge cases you’ve already wrestled to the ground. Payment integrations that absolutely, positively cannot break (ferpetesake, the payments!). Claude needs to understand ALL of this before writing a single line of code.

This is where Claude Code spec-driven development comes in.

And honestly?

It’s transformed how I approach every feature request.

.

.

.

Why Spec-Driven Development Changes Everything

Here’s what most people do: describe the feature → let Claude code → discover problems → fix problems → discover MORE problems → question life choices.

Here’s what works: describe the feature → trigger clarifying questions → answer EVERY question → generate comprehensive specs → review specs → THEN code.

Infographic comparing two approaches to adding a feature like "WooCommerce". The top section, titled "THE WRONG WAY (aka "YOLO Mode")" in dark navy, shows a linear flowchart: "Add WooCommerce" leads to "Claude codes", which results in "Problems 🧠" (brain emoji) with a red cross icon. This is followed by a "Fix 🔧" (wrench emoji) step, then "MORE problems 🧠" with another red cross, another "Fix 🔧", and then "EVEN MORE" leading to "Question life 😖" (distressed emoji) with a final red cross. Below the flowchart, a safety orange pill-shaped callout with a red cross icon states "Time: ??? | Mass Confusion: YES". The bottom section, titled "THE RIGHT WAY (Spec-Driven Development)" in dark navy, shows a cyclical flowchart: "Add WooCommerce" leads to a loop of "Claude explores codebase 🦭" (seal emoji) -> "You answer questions ⌨️" (keyboard emoji) -> "Claude asks more 👀" (eyes emoji), with a note "(repeat until 95%)". This loop leads to a prominent box with a green checkmark icon: "Comprehensive Specs Generated 📄✅" (document emoji), which then leads to "THEN code ✅" (green checkmark). Below the flowchart, a dark navy pill-shaped callout with a green checkmark icon states "Time: Predictable | Surprises: Minimal". The background is a soft off-white, and clean lines and icons are used throughout.

The difference isn’t just efficiency (though yes, that too).

👉 The real magic is that Claude surfaces edge cases YOU haven’t thought about.

All those assumptions living in your head? Claude will ask about them. All those “obviously we’d handle it THIS way” decisions? Claude will make you choose explicitly.

It’s like having a brilliant—if occasionally pedantic—architect who refuses to pick up a hammer until every single detail is documented.

Let me show you exactly how this works.

.

.

.

The 3-Phase Method for Claude Code Spec-Driven Development

I’ve been refining this workflow for weeks, and it breaks down into three distinct phases.

(Stay with me—I promise this is more exciting than it sounds. Okay, maybe “exciting” is strong. But genuinely useful? HECK YES.)

Infographic titled "THE 3-PHASE METHOD AT A GLANCE" in dark navy text. It illustrates a three-phase process with a clean flowchart design.

Phase 1 is titled "PHASE 1: BUILD 🏗️" with a construction crane emoji. It consists of three vertical steps in dark navy-outlined boxes with light gray fills: "Describe task 📝 + Trigger Q&A 🗣️" (with a pencil and megaphone emoji), "Answer ALL questions 🧠" (with a brain emoji), and "Specs created 📜" (with a scroll emoji). An arrow points from the bottom of Phase 1 to the top of Phase 2.

Phase 2 is titled "PHASE 2: REVIEW 🔍" with a magnifying glass emoji. It also has two vertical steps: "Fresh session 🔄 + Find problems 🕵️" (with a refresh icon and detective emoji), and "Prioritized issue list 📋" (with a clipboard emoji). An arrow points from the bottom of Phase 2 to the top of Phase 3.

Phase 3 is titled "PHASE 3: REFINE ✨" with a sparkle emoji. It has two vertical steps: "Fix critical issues 🔧 + More Q&A 🗣️" (with a wrench and megaphone emoji), and "Updated specs 🔄📜" (with a refresh icon and scroll emoji).

Below Phase 3, a large orange diamond-shaped box asks "Satisfied? 🤔" (with a thinking face emoji). A red arrow with a cross icon points from "Satisfied?" to a pill-shaped box on the left that says "Back to Phase 2" with a navy outline and gray fill, pointing back to Phase 2. A green arrow with a checkmark icon points from "Satisfied?" to a pill-shaped box on the right that says "Ready to implement! 🚀" (with a rocket emoji) and has a green outline and white fill, indicating the final step. All arrows and main text are in dark navy, with specific color accents for decision points.

.

.

.

Phase 1: Build Your Specs

This is where you go from “vague idea in your head” to “comprehensive document that leaves nothing to chance.”

Step 1: Describe the Task + Trigger the Magic Words

Here’s the prompt structure that makes everything work:

[Describe your task/feature in detail]

Based on the tasks above, write the specs at @notes/specs.md.

Use ASCII diagrams where necessary to illustrate the UI/UX.

Use the AskUserQuestion tool to Ask me clarifying questions until you are 95% confident you can complete this task successfully. For each question, add your recommendation (with reason why) below the options. This would help me in making a better decision.

That last paragraph? That’s the secret sauce.

“Ask me clarifying questions until you are 95% confident” tells Claude not to make assumptions. Not to guess. Not to fill in blanks with whatever seems reasonable.

Instead, Claude will ASK.

Claude Code terminal showing the initial prompt describing WooCommerce integration requirements and the instruction to use AskUserQuestion tool for clarifying questions until 95% confidence
The initial prompt triggering Claude’s question-asking mode

Step 2: Let Claude Explore First

Here’s something beautiful: Claude doesn’t immediately pepper you with questions.

First, it explores your codebase. It reads your existing implementation. It studies your patterns, your database schema, your webhook handlers.

In my WooCommerce integration project, Claude spent about 2 minutes analyzing the existing Stripe integration—36 tool uses, 97.5k tokens of context-gathering—before asking its first question.

Then the questions began:

Claude Code showing it explored the Stripe integration and now asks about WooCommerce Subscriptions plugin vs custom subscription handling, with three options and a recommendation
Claude explores codebase first, then asks its first clarifying question about subscription handling approach

Notice what’s happening here (and this is the part that made me unreasonably happy):

  • Claude presents clear options—not vague open-ended questions
  • Each option includes an explanation of implications
  • Claude adds its own recommendation with reasoning
  • You can select an option OR type something custom

That recommendation is EVERYTHING. You’re not making decisions in a vacuum. You’re evaluating Claude’s expert analysis against your own context.

Step 3: Keep Answering Until Claude Hits 95%

After your first answer, Claude asks another question. Then another.

Claude Code asking how recurring payments should be handled in WooCommerce mode, with options for WP Cron, manual invoices, or payment gateway handling
Second question about renewal payment flows with three implementation options

Each question builds on your previous answers. Claude’s understanding deepens with every response.

Claude Code asking about checkout experience in WooCommerce mode, with options for standard WooCommerce checkout, custom checkout with WC backend, or hybrid approach
Third question about checkout UX with three different approaches

“But wait,” you might be thinking. “Isn’t this just Plan Mode with extra steps?”

Ah. Good question. (I asked it too.)

Plan Mode asks one batch of questions, then starts planning.

This approach keeps questioning until Claude reaches genuine confidence. If something’s unclear—or conflicts with an earlier answer—Claude asks follow-up questions. It’s more thorough. Sometimes annoyingly so. But annoyingly thorough beats catastrophically incomplete every time.

Step 4: Review the Complete Q&A

By the end of my WooCommerce project, Claude had asked 15 different questions covering:

  • Subscription plugin choice
  • Renewal flow mechanics
  • Checkout experience
  • Payment mode switching
  • Migration strategy
  • Product mapping
  • Refund handling
  • Member portal UI
  • Day pass handling
  • Coupon systems
  • Settings location
  • Email notifications
Claude Code showing the first half of all Q&A interactions, including questions about subscription handling, renewals, checkout, payment modes, migration, and product mapping
First half of the complete Q&A session—eight questions answered
Claude Code showing the second half of Q&A interactions plus a summary of all 15 requirements gathered from the conversation
Second half of Q&A plus the requirements summary Claude compiled

Every edge case I hadn’t considered? Surfaced as a question.

Every architectural decision that could bite me later? Addressed before a single line of code.

👉 This is the core of Claude Code spec-driven development: front-loading decisions instead of discovering them mid-implementation.

Step 5: Watch Your Specs Materialize

Once Claude hit 95% confidence, it summarized everything and started writing:

Claude Code displaying the summary of all 15 requirements gathered, including subscription handling, renewal flow, checkout, mode switch, migration, and more
Claude’s confidence summary showing 15 requirements before writing specs

The result? A 2,068-line specification document with:

  • Architecture decisions (documented!)
  • Database schema changes (planned!)
  • State machines for subscriptions (visualized!)
  • ASCII diagrams for UI mockups (actually helpful!)
  • Detailed flow documentation (comprehensive!)
  • Edge case handling (the stuff that usually bites you)
Claude Code showing the created specs.md file with 2068 lines, including specification summary, key architecture decisions, and a table of major sections
Specs created—2068 lines covering architecture, checkout flow, renewals, and more
Claude Code showing more details of the specs including major sections table and list of ASCII diagrams included
Specs include ASCII diagrams for architecture, checkout flow, state machines, and UI mockups

Two thousand lines might sound excessive. It’s not. It’s every decision you’d otherwise make on the fly—except now they’re documented, reviewable, and consistent.

Bonus Step: Split Large Specs

Quick practical note: if your specs exceed ~1,500 lines, split them.

Claude’s file reading has a 25k token limit. Large files cause problems during implementation. The fix is simple:

This specs file is too big. Please split it into 3 parts. 
Keep the original file as the index file that links to the 3 parts.
Claude Code terminal showing user request to split specs into 3 parts with original file as index
Asking Claude to split the large specs file into manageable parts

Claude reorganizes everything into digestible chunks:

Claude Code showing the split result: specs.md as index (~130 lines) linking to three parts covering architecture, flows, and features
Result—four files total with specs.md as navigation hub linking to three focused documents

Now you have:

  • specs.md — Index file (~130 lines)
  • specs-part1-architecture.md — Sections 1-5 (~490 lines)
  • specs-part2-flows.md — Sections 6-10 (~470 lines)
  • specs-part3-features.md — Sections 11-20 (~530 lines)

Each part fits comfortably within context limits.

Crisis averted.

.

.

.

Phase 2: Review Your Specs

Here’s where most people stop.

(Don’t be most people.)

Your specs might be comprehensive, but they could still contain conflicts, gaps, or requirements that are—how do I put this diplomatically—completely impossible to implement.

Step 6: Start Fresh and Ask Claude to Critique

Start a new session. Fresh context. Then ask Claude to review its own work with skeptical eyes:

Read the `notes/specs.md`, analyze the codebase and tell me what could be 
the potential problems with this specs. 

Let's look at it from different angles and try to consider every edge cases.

Use ASCII diagrams to illustrate if needed. Don't edit anything yet. 
Let's focus on analysis.
Claude Code terminal showing the review prompt asking Claude to analyze specs for potential problems and edge cases
The review prompt—fresh session, analysis-only mode

That last line—”Don’t edit anything yet”—is important. You want analysis first. Changes second. Mixing them leads to chaos.

Step 7: Receive Your Brutally Honest Analysis

Claude reads the specs, re-explores your codebase, and delivers feedback that might sting a little:

Claude Code showing analysis results with first identified problem about data synchronization and dual source of truth conflicts, with ASCII diagram
Claude identifies Problem #1—dual source of truth conflicts during mode transitions

The analysis includes ASCII diagrams showing exactly where problems would occur:

Claude Code showing payment token lifecycle issues with ASCII diagram illustrating three scenarios: card expiration, token deletion, and gateway changes
Problem #2—payment token lifecycle gaps with three failure scenarios illustrated

In my project, Claude found 14 potential issues, organized by severity:

Claude Code showing summary table of critical issues to address, organized by priority from P0-Critical to P3-Low with issue descriptions and impacts
The full prioritized issue list—P0 Critical down to P3 Lo

P0 – Critical (the “oh no” tier):

  • Race condition in renewal processing → Double charges 😱
  • Token deletion not detected → Failed renewals
  • Mode switch with active Stripe subs → Billing confusion

P1 – High (the “definitely fix this” tier):

  • Proration + coupon calculation undefined → Financial errors
  • Guest checkout for subscriptions → Broken flow
  • 3D Secure on unattended renewals → Payment failures

Would I have caught all these myself?

Honestly? Maybe half. And probably not until they caused real problems with real users and real money.

👉 Having Claude review its own specs is like getting a code review before the code exists.

.

.

.

Phase 3: Refine Your Specs

Now you have a prioritized list of issues. Time to fix them—but not by guessing.

Step 8: Address Issues With Another Round of Questions

Ask Claude to fix the critical issues, but trigger the questioning mode AGAIN:

Let's address all the P0 and P1 issues.

Update the specs file.

Use the AskUserQuestion tool to Ask me clarifying questions until you are 95% confident you can complete this task successfully. For each question, add your recommendation (with reason why) below the options.
Claude Code terminal showing request to address all P0 and P1 issues with AskUserQuestion tool enabled
Requesting fixes for critical and high-priority issues with question-asking enabled

Fixing these issues requires MORE decisions. Should you block mode switches entirely? Allow mixed modes temporarily? Auto-cancel subscriptions?

Claude asks:

Claude Code asking what should happen during mode switch with active Stripe subscriptions, with three options: block switch, auto-cancel, or allow mixed mode
Question about mode switch behavior—block, auto-cancel, or allow mixed mode
Claude Code asking how proration and coupon calculation should work during plan upgrades, with three options for handling discounts
Question about proration and coupon math during plan changes

Each answer shapes the solution. After this round, Claude updates the specs with concrete, specific fixes:

Claude Code showing summary of spec updates with P0 and P1 issues fixed, including solutions for renewal race condition, token deletion, mode switch, proration, guest checkout, and 3D Secure
All P0 and P1 issues addressed with specific solutions and file locations

P0 Fixes:

  • Renewal Race Condition → Database row locking with SELECT FOR UPDATE
  • Token Deletion → Pre-renewal validation 7 and 3 days before renewal
  • Mode Switch Danger → Block switching if ANY active Stripe subscriptions exist

P1 Fixes:

  • Proration + Coupon → Calculate from actual paid amounts, keep coupon on upgraded plan
  • Guest Checkout → Force account creation for subscription products
  • 3D Secure → Request off-session exemption, fallback to email payment link

You can repeat Phase 2 and Phase 3 as many times as needed. Review, refine, review, refine—until you’re genuinely confident in your specs.

Infographic titled "THE REVIEW-REFINE CYCLE (Repeat as Needed)" showing a flowchart. The process begins with a box labeled "PHASE 2: REVIEW 🔍" with the text "Find all problems". An arrow points down to a diamond-shaped decision box that asks "Issues Found? 🤔". Two arrows emerge from this decision box. The left arrow, labeled "YES ❌", points to a box labeled "PHASE 3: REFINE 🔧" with the text "Fix issues with Q&A". An arrow from this "PHASE 3" box loops back up to the top, pointing to the "PHASE 2: REVIEW" box, with the text "(back to review)" next to the loop. The right arrow from the decision box, labeled "NO ✅", points to a final orange box labeled "DONE! 🚀" with the text "Specs are bulletproof. Ready for implementation.". The flowchart demonstrates an iterative cycle of reviewing and refining until a final, approved state is reached.

.

.

.

The Method, Summarized

Because I know you’re going to want to reference this later:

Phase 1: Build Specs

  1. Describe what you want + add the AskUserQuestion trigger
  2. Let Claude explore your codebase first
  3. Answer every clarifying question
  4. Review the generated specs
  5. Split large specs into parts (if needed)

Phase 2: Review Specs 6. Start a new session 7. Ask Claude to find problems (analysis only—no edits)

Phase 3: Refine Specs 8. Fix critical issues with another round of questions 9. Repeat Phases 2-3 until satisfied

YOU decide when specs are ready.

Not Claude.

You.

.

.

.

What About Implementation?

Ah. Yes.

You have these beautiful, bulletproof specs. Now what?

You could tell Claude to implement everything in one go. But for specs this comprehensive, that approach has problems:

  • Claude might skip features (context limits are real)
  • Long implementations drift from the plan
  • Details get forgotten mid-stream

The solution?

Claude Code’s task management system—which breaks large specs into trackable tasks, maintains progress across sessions, and ensures nothing slips through the cracks.

That’s next week’s issue.

(Consider this a cliffhanger. I regret nothing.)

9 min read The Art of Vibe Coding, Vibe Coding

The Dip Is Coming For Every Vibe Coder (And That’s Okay)

When I turned ten, my parents gifted me a battleship model kit.

You know the ones—those intricate naval vessels with approximately 1,000 tiny plastic pieces, decals thinner than a whisper, and instructions that assume you already have the steady hands of a neurosurgeon.

The box art was magnificent. A mighty warship cutting through ocean waves, every gun turret perfectly positioned, every railing impossibly detailed.

I tore it open that morning. Snapped together the first few pieces. The hull took shape. Then the deck. This was going to be amazing.

And then I hit the superstructure.

Tiny railings that snapped if you looked at them wrong. Parts that looked identical but absolutely weren’t. Decals that crumpled the moment I breathed near them. Suddenly, my mighty warship looked less “naval destroyer” and more “sad boat that lost a fight with a bathtub drain.”

I shoved it in my closet. It sat there for two years.

Here’s the thing: the kit wasn’t defective. I’d just hit The Dip.

.

.

.

The Honeymoon Is Real (Enjoy It While It Lasts)

When Anthropic dropped Claude Opus 4.5 in November, it felt like someone handed us the instruction manual to the universe.

You typed a prompt. Claude built exactly what you described. You shipped in 30 minutes what used to take an entire afternoon of Stack Overflow rabbit holes and frustrated Googling.

The dopamine hit was real.

“I’ll never code the old way again,” you probably said. (I certainly did. Out loud. To no one in particular.)

Infographic titled "THE VIBE CODING HONEYMOON" at the top in dark navy sans-serif font against a light gray background. Below the title, a navy subheading with a sparkle emoji says "Excitement ✨". A downward-pointing muted gray arrow leads to a large, rounded rectangular box with a dark navy border. Inside this box, a smaller navy header reads "Phase 1: The 'Magic' Moment". Below this, three lines of text are presented with emojis, styled in a monospaced font resembling code: "🚀 'This is MAGIC! 🧠'", "⏰ 'I'm 10x more productive! ⌨️'", and "🤔 'Why didn't this exist sooner? 👀'". Below this box, another downward-pointing muted gray arrow is positioned next to a dark navy, pill-shaped callout box with a bird emoji, containing the text "← You are here (for now) 🦭". The final element below is a prominent, rounded rectangular box with a safety orange border, containing three large orange question marks "???" and the text "Result: ???" in a smaller orange font. The overall flow is vertical, guided by the arrows.

But here’s what nobody tells you when you’re in the honeymoon phase:

A smarter model doesn’t eliminate the wall you’re about to hit. It just moves it further down the road.

.

.

.

Then the Fog Rolls In

Three weeks in. Same prompt that worked beautifully yesterday. Completely different result today.

Claude starts “forgetting” context. Hallucinating function names that don’t exist. Proposing fixes that miss the point so entirely you wonder if you’re even having the same conversation.

You rephrase. Clarify. Add more detail.

Still broken.

It’s like driving in thick fog. You know the road is there. You know your car works fine. But you can’t see three feet in front of you, and suddenly every turn feels dangerous.

This is the dip in vibe coding. And if you’ve been working with Opus 4.5 for more than a few weeks, you’ve been here.

The symptoms look something like this:

  • “Claude won’t listen to me anymore”
  • “Works for simple cases, breaks on anything real”
  • “My whole process is falling apart”
  • “Maybe I actually need to understand this stuff…”

Sound familiar? (Be honest. I won’t tell anyone.)

.

.

.

The Spiral We Don’t Talk About

Let me tell you what happened to me.

It was 11 PM. Third cup of coffee—the one that crosses the line from “productive fuel” into “questionable life choices.” I’d been debugging with Claude for over an hour.

The bug was obvious. At least to me. I could see exactly where the logic broke down.

Claude kept proposing fixes that missed the point entirely.

I rephrased. Added context. Tried twelve different angles.

Nothing.

“You’re supposed to be the smartest model on the planet,” I muttered at my screen. (Yes, I talk to my computer. Don’t pretend you don’t.)

“Why can’t you just see this?”

.

.

.

And then came the spiral.

Maybe Anthropic is serving me a weaker model. They probably quantized it to save on compute—everyone knows they throttle heavy users. The conspiracy theories started writing themselves.

I opened Reddit. Started typing.

“Anyone else notice Claude got way worse lately?”

Found others who agreed. Upvotes. Comments. Validation.

Felt good.

The bug was still there.

Infographic titled "THE SPIRAL (A Diagram of Poor Choices)" at the top in dark navy sans-serif font. Below it, a muted gray arrow points down from "Claude fails → Frustration builds 😡". This leads to a large, rounded rectangular box with a dark navy border, titled "Phase 2: The Blame Game". Inside, three lines of text with megaphone and face emojis read: "📣 'They nerfed it!' 🤦‍♂️", "📣 'Model got dumber!' 🤡", "📣 'It's not me, it's Anthropic!' 😤". Below this box, a gray arrow points to another navy rounded box with "Reddit r/ClaudeAI 🤝". To the right, a navy pill-shaped callout with a thumbs-up emoji and text "Validation feels good 👍" points with a gray arrow into the Reddit box. Another gray arrow points from the Reddit box to the final safety orange rounded box at the bottom, which contains the text "Bug is still there 🐛". To its right, a navy pill-shaped callout with a shrug emoji and text "Reality doesn't care 🤷‍♂️" points with a gray arrow into the final box. The entire diagram is on a soft off-white background.

.

.

.

The Uncomfortable Question

I closed Reddit and stared at my screen.

What if the model didn’t change?

What if I was the variable?

(Stay with me here—this is where it gets good.)

I went back to my conversation with Claude. Read through it again. And this time, I noticed something that made me want to crawl under my desk.

Claude wasn’t seeing what I was seeing.

I had context in my head—error logs I’d scanned, behavior I’d observed, patterns I’d noticed across multiple test runs. None of that was in the conversation. I was asking Claude to diagnose a problem while hiding half the symptoms.

Remember that fog metaphor? I was the fog.

I’d been yelling at my car for not driving properly while I was the one smearing mud on the windshield.

.

.

.

The Insight That Changed Everything

Here’s what I learned—and I want you to write this down somewhere:

👉 LLMs don’t fail because they’re not smart enough. They fail because they can’t see what you see.

Opus 4.5 is brilliant. But brilliance without visibility is just confident guessing. (And confident guessing is somehow more frustrating than obvious failure, isn’t it?)

The moment I understood this, my entire approach changed.

Instead of crafting cleverer prompts, I started providing better context. Added logging. Pasted actual error output—not my interpretation of it, but the raw, ugly, unfiltered thing. Described exactly what I observed.

Suddenly the “dumb” Claude became brilliant again.

The model didn’t change. What I gave it changed.

The fog cleared. The road was there all along.

Infographic titled "THE VISIBILITY PRINCIPLE" at the top in bold, dark blue font. The image is divided into two sections, "BEFORE" and "AFTER", separated by a horizontal line.

The "BEFORE" section, with a downward arrow, shows a flow diagram. On the left, a person icon labeled "You" has an arrow pointing right to a gray rectangular box labeled "[Fog]" with a cloud emoji. Below this fog box, a smaller gray box with an upward arrow points to it, containing the text "(Missing context, summarized errors, assumptions) ❓". An arrow from the "[Fog]" box points right to a robot icon labeled "Claude". An arrow from "Claude" points right to a red rectangular box labeled "Wrong answer" with a red 'X' mark and a sad face emoji 😞.

The "AFTER" section, with a downward arrow, shows a parallel flow diagram. On the left, a person icon labeled "You" has an arrow pointing right to a blue rectangular box labeled "[Clear]" with an eyes emoji 👀. Below this clear box, a smaller blue box with an upward arrow points to it, containing the text "(Raw errors, actual output, full context) 🔍". An arrow from the "[Clear]" box points right to a robot icon labeled "Claude". An arrow from "Claude" points right to a green rectangular box labeled "Right answer" with a green checkmark ✅ and a happy face emoji 😊.

.

.

.

What Seth Godin Knew All Along

Quick detour. (I promise it’s relevant.)

Seth Godin wrote about The Dip years ago. His insight: The Dip is the long, hard slog between starting something and mastering it. The point where initial excitement fades and real work begins.

Most people quit here. That’s exactly what makes pushing through valuable.

My battleship model kit? I eventually finished it. Two years later, with steadier hands and more patience. It’s not perfect—one gun turret sits slightly crooked—but it’s done. And I learned something about myself in the finishing that I never would have learned in the quitting.

The dip in vibe coding works the same way.

You’ve moved past the toy examples. You’re building real things now. And real things have edge cases, complexity, and problems that require iteration.

That’s always been true. AI doesn’t change the fundamental nature of engineering—it just accelerates everything. The breakthroughs come faster.

So do the walls.

.

.

.

The Dip Survival Kit

Okay. Enough philosophy. Let’s get tactical.

Here are five things I do now when Claude stops cooperating—and more importantly, when I feel the urge to open Reddit instead of solving the actual problem.

1. Visibility First (Clear the Fog)

The problem: Claude fails because it lacks context, not intelligence. You’re driving in fog and blaming the car.

The fix:

Add logging before asking Claude to debug. Paste actual error messages—not your summary of them, the real thing. Describe exactly what you observed.

Opus 4.5 has a massive context window. Use it. Don’t summarize when you can show.

A prompt pattern that actually works:

“Here’s what I’m seeing: [actual output]. Here’s what I expected: [expected output]. Here’s the relevant code: [code]. What’s the disconnect?”

More context = better reasoning. That’s literally why Opus outperforms previous models.


2. Tool Pivot (Different Hammers for Different Nails)

The problem: One tool can’t do everything brilliantly—even Opus 4.5.

The fix:

I’ve started using different AI tools for different phases:

TaskBest Tool
Brainstorming & PlanningCodex / GPT-5
ImplementationClaude Code (Opus 4.5)
Review & QACodex reviewing diffs

Claude excels at implementation and extended reasoning. Using it for everything creates blind spots. Match the tool to the task—not the task to the tool.


3. Blueprint Over Code (Clarity Before Creativity)

The problem: Vague prompts produce vague results. Even from Opus 4.5.

The fix:

Write detailed specs before asking Claude to build anything. Use ASCII wireframes for UI. Define success criteria upfront. Get to 95% clarity before implementation begins.

Bad prompt:

“Build me a login form”

Better prompt:

“Build a login form with email and password fields. Email validation on blur. Password requires 8+ characters, one uppercase, one number. Show inline errors below each field. On success, redirect to /dashboard. On failure, show error banner at top. Use existing Button and Input components.”

Here’s the thing: smarter models reward precision. Opus 4.5 can follow complex specifications better than any previous model. Don’t waste that intelligence on ambiguity.


4. The Strategic Retreat (Walking Away Is a Skill)

The problem: Tunnel vision makes everything harder. You’ve been staring at the same bug for two hours and you’re no longer thinking—you’re just reacting.

The fix:

Walk away. Literally.

Work on something else. Go for a walk. Sleep on it. (Yes, actual sleep. Revolutionary concept, I know.)

Your brain keeps processing in the background. You’ll return without the emotional charge. Often—annoyingly often—the solution becomes obvious after distance.

The anti-pattern to avoid:

Don’t keep hammering the same prompt hoping Opus 4.5 will suddenly “get it.” Ten variations of a bad approach is still a bad approach. Step back. Reassess.


5. Experiment Deliberately (Failure as Data)

The problem: Random attempts waste time and tokens. Frustration makes you sloppy.

The fix:

Change one variable at a time. Document what you tried. Look for patterns in what’s failing. Treat debugging as research, not combat.

The mindset shift:

“I’m not failing. I’m eliminating approaches that don’t work.”

A Claude-specific tip:

Start a fresh conversation when context gets polluted. Sometimes Opus 4.5 locks onto a wrong approach and keeps circling back to it like a dog with a favorite squeaky toy. New conversation = clean slate. Sometimes that’s genuinely all you need.

.

.

.

The Other Side of the Dip

Let me be honest with you.

The dip in vibe coding is real. It’s coming for every single person reading this—if it hasn’t arrived already.

Even with Claude Opus 4.5. Even with the most capable AI model we’ve ever had.

But here’s what the dip actually means: you’ve moved past the tutorials. You’re building something real. You’re pushing against the edges of what’s possible.

That’s engineering. That’s the craft.

Every new Claude model will have a honeymoon phase. And every one will eventually lead to a dip. The skill isn’t avoiding it.

The skill is navigating it.

Push through. Tinker. Experiment. Clear the fog. Give Claude what it can’t see on its own.

The developers who learn this with Opus 4.5 will be ready for whatever Anthropic ships next.

Claude keeps getting smarter.

The dip will always be there.

Learn to love the climb.

10 min read The Art of Vibe Coding, Claude

How to Write Better Requirements with Claude (Stop Letting AI Assume)

I fire up Claude Code.

New project in mind—a WordPress theme for coworking spaces. And I want to do this right, you know? Start with requirements. Be professional about it. Act like someone who has their act together.

So I type:

I want to build a WordPress theme for Coworking space website 
for the coworking space owner to use it to promote and manage 
their coworking space.

I want you to help me brainstorm for the product requirement 
document (PRD) for this theme.

Put the PRD at @requirements/coworkpress.md
Claude Code terminal with user prompt asking to generate a PRD for a coworking WordPress theme

I hit enter, feeling like a real PM.

Claude responds: “I’d be happy to help you brainstorm a PRD for a coworking space WordPress theme. Let me create a comprehensive document covering the key aspects.”

Then it writes. And writes. And writes.

313 lines.

Claude Code output showing "Wrote 313 lines to requirements/coworkpress.md" with a preview of the PRD structure
[PRD] CoWorkPress – WordPress Theme
Loading longform...

Product Overview

Product Name: CoWorkPress Type: WordPress Theme Target Market: Coworking space owners and operators Purpose: Enable coworking space owners to create professional websites to promote their spaces, showcase amenities, display pricing, and manage bookings.


Problem Statement

Coworking space owners need an affordable, easy-to-use solution to:

  • Establish an online presence without hiring developers
  • Showcase their space professionally to attract members
  • Display pricing and membership options clearly
  • Allow potential members to book tours or reserve spaces
  • Build community and promote events

Target Users

Primary Users (Site Owners)

  • Small coworking space owners - Single location, 10-50 desks
  • Boutique coworking operators - 1-3 locations, design-focused spaces
  • Community space managers - Non-profit or community-driven spaces

Secondary Users (Site Visitors)

  • Freelancers looking for workspace
  • Remote workers needing occasional office space
  • Startups seeking affordable office solutions
  • Corporate teams needing satellite office space

Core Features

1. Homepage Builder

  • Hero Section - Full-width image/video with headline and CTA
  • Space Highlights - Showcase different workspace types
  • Amenities Grid - Visual display of available amenities
  • Testimonials - Member reviews and success stories
  • Pricing Preview - Quick view of membership options
  • Location Map - Interactive map integration
  • CTA Sections - Book a tour, Get started buttons

2. Space/Room Showcase

  • Gallery System - Photo galleries with lightbox
  • Virtual Tour Integration - Support for 360° tours (Matterport, etc.)
  • Space Types Display
    • Hot desks
    • Dedicated desks
    • Private offices
    • Meeting rooms
    • Event spaces
  • Capacity & Availability Indicators
  • Filtering/Sorting Options

3. Pricing & Membership Plans

  • Pricing Table Templates
    • Monthly memberships
    • Day passes
    • Hourly rates
    • Meeting room rates
  • Plan Comparison Feature
  • Custom Pricing Tiers
  • Add-on Services Display
  • Currency & Tax Settings

4. Booking & Contact System

  • Tour Booking Form - Schedule space visits
  • Contact Forms - General inquiries
  • Meeting Room Booking (Basic)
    • Calendar view
    • Time slot selection
    • Integration hooks for booking plugins
  • Lead Capture Forms
  • Email Notifications

5. Amenities Showcase

  • Icon-based Amenities Grid
  • Pre-built Amenity Icons
    • WiFi, Printing, Coffee, Kitchen
    • Phone booths, Lockers, Parking
    • Mail handling, Reception
    • 24/7 access, Security
  • Custom Amenity Support

6. Location & Multi-Location Support

  • Single Location
    • Address display
    • Google Maps integration
    • Directions/transit info
    • Operating hours
  • Multi-Location (Future/Premium)
    • Location selector
    • Location-specific pages
    • Location comparison

7. Community & Events

  • Events Calendar
    • Upcoming events display
    • Event registration
    • Integration with event plugins
  • Member Directory (Optional)
  • Blog/News Section
  • Community Perks Display

8. Trust & Social Proof

  • Testimonial Sections
  • Client/Company Logos
  • Press Mentions
  • Statistics Counter (Members served, sqft, etc.)
  • Certifications/Awards Display

Technical Requirements

WordPress Compatibility

  • Minimum WordPress Version: 6.0+
  • PHP Version: 8.0+
  • Full Site Editing (FSE) Support - Block-based theme
  • Gutenberg Compatible - Custom blocks for coworking features

Performance

  • PageSpeed Score: 90+ on mobile
  • Lightweight - < 100KB CSS, < 50KB JS (minified)
  • Lazy Loading - Images and videos
  • Optimized Assets - WebP support, responsive images

Responsive Design

  • Mobile-First Approach
  • Breakpoints:
    • Mobile: < 768px
    • Tablet: 768px - 1024px
    • Desktop: > 1024px
  • Touch-Friendly - Navigation, galleries, forms

Accessibility

  • WCAG 2.1 AA Compliance
  • Keyboard Navigation
  • Screen Reader Support
  • Sufficient Color Contrast
  • Alt Text Support

SEO

  • Schema.org Markup - LocalBusiness, Place
  • Clean HTML Structure
  • Optimized Heading Hierarchy
  • Fast Loading Times
  • Social Meta Tags (Open Graph, Twitter Cards)

Design System

Visual Style

  • Modern & Professional - Clean, minimal aesthetic
  • Flexible Color System - Primary, secondary, accent colors
  • Typography
    • Google Fonts integration
    • System font fallbacks
    • Readable body text (16px+)

Pre-built Templates

  1. Homepage Variations (3-5 layouts)
  2. About Page
  3. Spaces/Rooms Page
  4. Pricing Page
  5. Contact Page
  6. Single Space/Room Template
  7. Events Page
  8. Blog Templates

Customization Options

  • Global Colors - Via WordPress Customizer/FSE
  • Typography Settings
  • Header Layouts (2-3 options)
  • Footer Layouts (2-3 options)
  • Button Styles
  • Section Spacing Controls

Plugin Integrations

Required/Bundled

  • None (theme should work standalone)
  • Forms: WPForms, Contact Form 7, Gravity Forms
  • Booking: Amelia, BookingPress, Simply Schedule Appointments
  • Maps: Google Maps, Mapbox
  • SEO: Yoast SEO, Rank Math
  • Analytics: Google Analytics, Plausible
  • Page Builders: Elementor, Beaver Builder (optional compatibility)

Future/Premium Integrations

  • Stripe/WooCommerce for payments
  • CRM integrations (HubSpot, etc.)
  • Coworking management software APIs (Nexudus, Cobot, OfficeRnD)

Content Requirements

Demo Content

  • Sample homepage with realistic coworking imagery
  • Sample spaces with descriptions
  • Placeholder testimonials
  • Sample pricing plans
  • Demo blog posts

Documentation

  • Quick Start Guide
  • Theme Options Documentation
  • Block Usage Guide
  • Customization Tutorials
  • FAQ Section

Success Metrics

For Theme (Business)

  • Downloads/Sales numbers
  • User reviews and ratings
  • Support ticket volume
  • Renewal/upgrade rate

For End Users (Coworking Owners)

  • Time to launch (< 1 day for basic site)
  • Lead generation improvement
  • Tour booking conversion
  • Member acquisition cost reduction

Phases & Roadmap

Phase 1 - MVP (v1.0)

  • [ ] Core theme structure (FSE-based)
  • [ ] Homepage template with essential sections
  • [ ] Spaces showcase (custom post type)
  • [ ] Basic pricing table block
  • [ ] Amenities block
  • [ ] Contact/Tour booking form integration
  • [ ] Responsive design
  • [ ] Basic customization options

Phase 2 - Enhanced (v1.5)

  • [ ] Additional homepage layouts
  • [ ] Events integration
  • [ ] Testimonials management
  • [ ] Gallery enhancements
  • [ ] Multi-location basic support
  • [ ] Performance optimizations

Phase 3 - Premium Features (v2.0)

  • [ ] Advanced booking system
  • [ ] Member portal template
  • [ ] Coworking software integrations
  • [ ] Advanced analytics dashboard
  • [ ] White-label options

Competitive Analysis

Existing Solutions

Solution Type Pros Cons
Flavor Theme WP Theme Coworking-specific Outdated, not FSE
Flavor Theme WP Theme Modern Generic, needs customization
Flavor Theme Template Beautiful Not WordPress
Flavor Theme Template Feature-rich Requires coding

Differentiation

  • WordPress-native - No complex setup
  • FSE/Block-based - Modern, future-proof
  • Coworking-specific - Purpose-built features
  • Lightweight - Fast performance
  • Affordable - Accessible for small operators

Open Questions

  1. Pricing Model - One-time purchase vs. subscription?
  2. Free vs. Premium - Freemium model with premium add-ons?
  3. Booking Depth - Build custom booking or rely on plugin integrations?
  4. Multi-location - Core feature or premium add-on?
  5. Community Features - Include member directory/forum?
  6. E-commerce - Direct payment processing for memberships?

Notes & Ideas

  • Consider integration with popular coworking management platforms
  • Virtual tour integration could be a key differentiator
  • Mobile app companion for members (future consideration)
  • Community marketplace for member services
  • Analytics for space utilization (premium feature)

Product Overview

Product Name: CoWorkPress Type: WordPress Theme Target Market: Coworking space owners and operators Purpose: Enable coworking space owners to create professional websites to promote their spaces, showcase amenities, display pricing, and manage bookings.


Problem Statement

Coworking space owners need an affordable, easy-to-use solution to:

  • Establish an online presence without hiring developers
  • Showcase their space professionally to attract members
  • Display pricing and membership options clearly
  • Allow potential members to book tours or reserve spaces
  • Build community and promote events

Target Users

Primary Users (Site Owners)

  • Small coworking space owners - Single location, 10-50 desks
  • Boutique coworking operators - 1-3 locations, design-focused spaces
  • Community space managers - Non-profit or community-driven spaces

Secondary Users (Site Visitors)

  • Freelancers looking for workspace
  • Remote workers needing occasional office space
  • Startups seeking affordable office solutions
  • Corporate teams needing satellite office space

Core Features

1. Homepage Builder

  • Hero Section - Full-width image/video with headline and CTA
  • Space Highlights - Showcase different workspace types
  • Amenities Grid - Visual display of available amenities
  • Testimonials - Member reviews and success stories
  • Pricing Preview - Quick view of membership options
  • Location Map - Interactive map integration
  • CTA Sections - Book a tour, Get started buttons

2. Space/Room Showcase

  • Gallery System - Photo galleries with lightbox
  • Virtual Tour Integration - Support for 360° tours (Matterport, etc.)
  • Space Types Display
    • Hot desks
    • Dedicated desks
    • Private offices
    • Meeting rooms
    • Event spaces
  • Capacity & Availability Indicators
  • Filtering/Sorting Options

3. Pricing & Membership Plans

  • Pricing Table Templates
    • Monthly memberships
    • Day passes
    • Hourly rates
    • Meeting room rates
  • Plan Comparison Feature
  • Custom Pricing Tiers
  • Add-on Services Display
  • Currency & Tax Settings

4. Booking & Contact System

  • Tour Booking Form - Schedule space visits
  • Contact Forms - General inquiries
  • Meeting Room Booking (Basic)
    • Calendar view
    • Time slot selection
    • Integration hooks for booking plugins
  • Lead Capture Forms
  • Email Notifications

5. Amenities Showcase

  • Icon-based Amenities Grid
  • Pre-built Amenity Icons
    • WiFi, Printing, Coffee, Kitchen
    • Phone booths, Lockers, Parking
    • Mail handling, Reception
    • 24/7 access, Security
  • Custom Amenity Support

6. Location & Multi-Location Support

  • Single Location
    • Address display
    • Google Maps integration
    • Directions/transit info
    • Operating hours
  • Multi-Location (Future/Premium)
    • Location selector
    • Location-specific pages
    • Location comparison

7. Community & Events

  • Events Calendar
    • Upcoming events display
    • Event registration
    • Integration with event plugins
  • Member Directory (Optional)
  • Blog/News Section
  • Community Perks Display

8. Trust & Social Proof

  • Testimonial Sections
  • Client/Company Logos
  • Press Mentions
  • Statistics Counter (Members served, sqft, etc.)
  • Certifications/Awards Display

Technical Requirements

WordPress Compatibility

  • Minimum WordPress Version: 6.0+
  • PHP Version: 8.0+
  • Full Site Editing (FSE) Support - Block-based theme
  • Gutenberg Compatible - Custom blocks for coworking features

Performance

  • PageSpeed Score: 90+ on mobile
  • Lightweight - < 100KB CSS, < 50KB JS (minified)
  • Lazy Loading - Images and videos
  • Optimized Assets - WebP support, responsive images

Responsive Design

  • Mobile-First Approach
  • Breakpoints:
    • Mobile: < 768px
    • Tablet: 768px - 1024px
    • Desktop: > 1024px
  • Touch-Friendly - Navigation, galleries, forms

Accessibility

  • WCAG 2.1 AA Compliance
  • Keyboard Navigation
  • Screen Reader Support
  • Sufficient Color Contrast
  • Alt Text Support

SEO

  • Schema.org Markup - LocalBusiness, Place
  • Clean HTML Structure
  • Optimized Heading Hierarchy
  • Fast Loading Times
  • Social Meta Tags (Open Graph, Twitter Cards)

Design System

Visual Style

  • Modern & Professional - Clean, minimal aesthetic
  • Flexible Color System - Primary, secondary, accent colors
  • Typography
    • Google Fonts integration
    • System font fallbacks
    • Readable body text (16px+)

Pre-built Templates

  1. Homepage Variations (3-5 layouts)
  2. About Page
  3. Spaces/Rooms Page
  4. Pricing Page
  5. Contact Page
  6. Single Space/Room Template
  7. Events Page
  8. Blog Templates

Customization Options

  • Global Colors - Via WordPress Customizer/FSE
  • Typography Settings
  • Header Layouts (2-3 options)
  • Footer Layouts (2-3 options)
  • Button Styles
  • Section Spacing Controls

Plugin Integrations

Required/Bundled

  • None (theme should work standalone)
  • Forms: WPForms, Contact Form 7, Gravity Forms
  • Booking: Amelia, BookingPress, Simply Schedule Appointments
  • Maps: Google Maps, Mapbox
  • SEO: Yoast SEO, Rank Math
  • Analytics: Google Analytics, Plausible
  • Page Builders: Elementor, Beaver Builder (optional compatibility)

Future/Premium Integrations

  • Stripe/WooCommerce for payments
  • CRM integrations (HubSpot, etc.)
  • Coworking management software APIs (Nexudus, Cobot, OfficeRnD)

Content Requirements

Demo Content

  • Sample homepage with realistic coworking imagery
  • Sample spaces with descriptions
  • Placeholder testimonials
  • Sample pricing plans
  • Demo blog posts

Documentation

  • Quick Start Guide
  • Theme Options Documentation
  • Block Usage Guide
  • Customization Tutorials
  • FAQ Section

Success Metrics

For Theme (Business)

  • Downloads/Sales numbers
  • User reviews and ratings
  • Support ticket volume
  • Renewal/upgrade rate

For End Users (Coworking Owners)

  • Time to launch (< 1 day for basic site)
  • Lead generation improvement
  • Tour booking conversion
  • Member acquisition cost reduction

Phases & Roadmap

Phase 1 - MVP (v1.0)

  • [ ] Core theme structure (FSE-based)
  • [ ] Homepage template with essential sections
  • [ ] Spaces showcase (custom post type)
  • [ ] Basic pricing table block
  • [ ] Amenities block
  • [ ] Contact/Tour booking form integration
  • [ ] Responsive design
  • [ ] Basic customization options

Phase 2 - Enhanced (v1.5)

  • [ ] Additional homepage layouts
  • [ ] Events integration
  • [ ] Testimonials management
  • [ ] Gallery enhancements
  • [ ] Multi-location basic support
  • [ ] Performance optimizations

Phase 3 - Premium Features (v2.0)

  • [ ] Advanced booking system
  • [ ] Member portal template
  • [ ] Coworking software integrations
  • [ ] Advanced analytics dashboard
  • [ ] White-label options

Competitive Analysis

Existing Solutions

Solution Type Pros Cons
Flavor Theme WP Theme Coworking-specific Outdated, not FSE
Flavor Theme WP Theme Modern Generic, needs customization
Flavor Theme Template Beautiful Not WordPress
Flavor Theme Template Feature-rich Requires coding

Differentiation

  • WordPress-native - No complex setup
  • FSE/Block-based - Modern, future-proof
  • Coworking-specific - Purpose-built features
  • Lightweight - Fast performance
  • Affordable - Accessible for small operators

Open Questions

  1. Pricing Model - One-time purchase vs. subscription?
  2. Free vs. Premium - Freemium model with premium add-ons?
  3. Booking Depth - Build custom booking or rely on plugin integrations?
  4. Multi-location - Core feature or premium add-on?
  5. Community Features - Include member directory/forum?
  6. E-commerce - Direct payment processing for memberships?

Notes & Ideas

  • Consider integration with popular coworking management platforms
  • Virtual tour integration could be a key differentiator
  • Mobile app companion for members (future consideration)
  • Community marketplace for member services
  • Analytics for space utilization (premium feature)

At first glance, it looks thorough. Professional, even. Like something a senior engineer would put together after three cups of coffee and a really productive morning.

But here’s where things get squirrely.

Look closer at what Claude produced:

  • WordPress 6.0+ and PHP 8.0+ version requirements
  • Full Site Editing (FSE) block-based architecture decisions
  • Performance targets: 90+ PageSpeed, < 100KB CSS, < 50KB JS
  • Specific responsive breakpoints (768px, 1024px)
  • Plugin recommendations: WPForms, Amelia, Yoast SEO
  • A three-phase development roadmap with version numbers
Claude Code terminal displaying a PRD summary with 7 key sections: Problem Statement, Target Users, Core Features (homepage builder, space showcase, pricing tables, booking, amenities, location/map, events, trust elements), Technical Requirements (WordPress 6.0+, PHP 8.0+, FSE block-based theme, 90+ PageSpeed, WCAG 2.1 AA), Design System, Plugin Integrations, and Phased Roadmap. Also shows Open Questions about pricing model, freemium approach, booking integration, and multi-location support

Wait.

Hold on.

I haven’t even started coding yet—haven’t written a single line—and I’ve already “decided” on performance budgets, responsive breakpoints, and plugin integrations?

Huh.

.

.

.

The Problem: Requirements That Aren’t Actually Requirements

Here’s what happened (and stay with me, because this is the part that changes everything): I asked Claude for requirements. Claude gave me implementation decisions.

Those 313 lines contain:

  • Technical stack choices I haven’t made yet
  • Performance constraints that might change
  • Architecture patterns I haven’t validated
  • Integration approaches I haven’t researched

And now this entire document sits in my context window—taking up space, influencing every future conversation. Every time I ask Claude to help me build something, it references these premature decisions like they’re gospel.

The PRD became a constraint instead of a guide.

Here’s the thing. Claude conflates two very different things:

  1. What you want to build (requirements)
  2. How to build it (implementation)

And honestly? That’s not Claude’s fault. It’s mine. I didn’t tell it otherwise.

But here’s the real insight—the one that made me completely rethink how I approach Claude Code requirements:

User perspective yields better AI output.

(I know, I know. That sounds like something you’d find on a motivational poster in a Silicon Valley bathroom. But hear me out.)

When you describe what users experience, Claude understands context. It grasps the why behind features. It catches edge cases you’d miss while you’re busy thinking about database schemas.

When you describe technical implementation? Claude follows a checklist. No context. No judgment. Just execution.

So what if I asked differently?

.

.

.

The Reframe: Making Claude Interview You First

I tried again. Same project. Different approach.

This time, I asked for a Business Requirements Document—focused on user stories and business logic, not technical specs.

But here’s the key change (and this is the part you’ll want to screenshot): I told Claude to interview me first.

Claude Code terminal showing a detailed prompt requesting a BRD with instructions to use AskUserQuestionTool and ask clarifying questions until 95% confident

The exact prompt:

I want to build a WordPress theme for Coworking space website 
for the coworking space owner to use it to promote and manage 
their coworking space.

I want you to help me brainstorm for the business requirement 
document (BRD) for this theme. Focus on business logic and 
rules, user stories, and acceptance criteria.

Use the "wp-theme-dev" skill to understand the development 
patterns and guidance for building WordPress themes.

IMPORTANT: DO NOT INCLUDE ANY TECHNICAL IMPLEMENTATION DETAILS.

Use the AskUserQuestionTool to Ask me clarifying questions 
until you are 95% confident you can complete this task 
successfully. For each question, add your recommendation 
(with reason why) below the options. This would help me 
in making a better decision.

Put the BRD at @requirements/coworkpress.md

Three things matter here:

  1. “Focus on business logic, user stories, and acceptance criteria” — This sets explicit scope. No wandering into implementation land.
  2. “DO NOT INCLUDE ANY TECHNICAL IMPLEMENTATION DETAILS” — A hard boundary. (Yes, I’m yelling. Sometimes Claude needs yelling.)
  3. “Ask me clarifying questions until you are 95% confident” — This is the magic ingredient. The secret sauce. The thing that changes everything.

That last part triggers AskUserQuestionTool—a built-in Claude Code feature that lets Claude pause and interview you before generating anything.

Flowchart titled 'THE ASKUSERQUESTION FLOW' illustrating an interactive process between a user and an AI, Claude, to improve output. The flow starts with 'Your Prompt' 🗣️ leading to 'Claude Asks Questions' 🤖. This step points to 'You Answer (Options + Your Input)' ⌨️, which then leads to a decision diamond: '95% Confident?' 🤔. If 'No', an arrow loops back to '[Ask More]' 👀 and then to 'Claude Asks Questions'. If 'Yes', an arrow points to '[Generate BRD]' 📄. Finally, '[Generate BRD]' leads to the ultimate goal: 'Better Output' 💪✅. The boxes are connected by arrows on a light grey background.

What happened next?

It changed how I start every single project.

.

.

.

The Interview Begins

Claude didn’t start writing.

It started asking.

Claude Code's AskUserQuestion interface showing tabs for Target Users, Business Model, Space Types, and Submit. The question asks "What is the primary business model for the coworking space?" with four options: Membership-based (Recommended), Pay-per-use, Hybrid Model, and Type something

Look at that interface. (Isn’t it beautiful?) Claude organized its questions into themes:

  • Target Users
  • Business Model
  • Space Types

And each question comes with options—plus Claude’s recommendation with reasoning. It’s like having a really thoughtful product manager who actually wants to understand what you’re building before they start building it.

For the business model question, Claude recommended Membership-based because “Monthly/annual subscriptions with different tiers (hot desk, dedicated desk, private office)” represents the most common coworking model.

I selected the recommendation. Next question.

.

.

.

Round 2: Booking and Member Management

After answering the first batch, Claude moved deeper.

Claude Code showing question "What community features are important for the coworking space?" with options including Member Directory, Events Calendar, Both Directory + Events (Recommended), None, and Type something

Now it’s asking about:

  • Booking systems (meeting rooms, event spaces)
  • Member portal requirements
  • Community features

Notice how Claude builds on previous answers. Because I said “membership-based” earlier, it now asks about member-specific features like portals and directories.

The questions aren’t random. They follow a logical thread—like a conversation with someone who’s actually paying attention.

I selected Both Directory + Events for community features. Claude recommended it because “Full community engagement with directory and events” maximizes the value proposition for members.

(Smart cookie, that Claude.)

.

.

.

Round 3: Operations and Scale

Claude Code asking "Does the coworking space operate multiple locations?" with options: Single Location, Multiple Locations (Recommended), Franchise Model, and Type something

The questions got more specific:

  • Membership lifecycle (upgrades, downgrades, cancellations)
  • Multi-location support
  • Marketing page requirements

Claude recommended Multiple Locations because “Two or more locations with shared or separate memberships” covers both current single-location spaces and future expansion.

It’s thinking about growth—not just current state.

That’s… actually really thoughtful?

.

.

.

Round 4: Sales Funnel and Operations

Claude Code asking "What reporting does the coworking space owner need?" with options: Comprehensive Dashboard (Recommended) showing occupancy rates, revenue, member growth, booking analytics; Basic Metrics; External Tools; and Type something

Now Claude explored:

  • Lead capture and nurturing
  • Notification preferences
  • Reporting needs

For reporting, I went with Comprehensive Dashboard—occupancy rates, revenue, member growth, booking analytics, space utilization.

Claude’s reasoning: space owners need visibility into their business health, and a comprehensive dashboard reduces the need for external tools.

(I mean, yes. Exactly. Thank you for understanding.)

.

.

.

Round 5: Policies and Edge Cases

Claude Code asking "Can members bring guests to the coworking space?" with options: Guest Passes Included (Recommended), Paid Day Passes, No Guest Access (currently selected), and Type something

The final rounds covered operational details:

  • Amenities handling
  • Access control methods
  • Guest policies

And here’s where it gets interesting.

These questions catch edge cases I wouldn’t have thought about until I was knee-deep in development—cursing at my screen at 11 PM, wondering why I didn’t think of this earlier.

Guest policy? I hadn’t considered it. But it affects:

  • Pricing structure
  • Access control logic
  • Liability considerations
  • Member value perception

Claude surfaced this decision before I started building.

Before I wrote a single line of code.

Before I had to refactor anything.

.

.

.

21 Questions Later: The Full Picture

After 7 rounds, Claude had asked 21 questions across multiple categories.

Claude Code terminal showing a summary of answered questions including: Target Users → Mixed Audience, Business Model → Membership-based, Space Types → Full-Service, Booking System → Real-time Online Booking, Member Portal → Full Portal, Community → Both Directory + Events, Membership Lifecycle → Full Lifecycle, Locations → Multiple Locations, Marketing Pages → Essential Pages
Claude Code terminal showing additional answered questions including: Lead Capture → Tour Booking + Lead Nurturing, Notifications → Essential Only, Reporting → Comprehensive Dashboard, Amenities → Included in Membership Tiers, Access Control → Physical Keys/Cards, Guest Policy → No Guest Access, Corporate Accounts → Yes, Admin Roles → Two Roles, Visual Customization → Highly Customizable, Billing Cycles → Flexible Cycles, Cancellation Policy → Notice Period, Booking Restrictions → Plan-Based Limits

Look at the coverage:

Business Model & Users

  • Target audience: Mixed (freelancers, startups, corporate)
  • Business model: Membership-based with tiers
  • Space types: Full-service (hot desks, dedicated, private offices, meeting rooms)

Features & Functionality

  • Booking: Real-time online system
  • Member portal: Full dashboard with profile, bookings, billing
  • Community: Directory + events calendar

Operations & Scale

  • Multiple locations with location-based time zones
  • Two admin roles (Admin + Staff)
  • Comprehensive reporting dashboard

Policies & Rules

  • Flexible billing (monthly/quarterly/annual)
  • 30-day cancellation notice
  • Plan-based meeting room quotas
  • No guest access
  • Corporate accounts supported

Claude now has context. Real context. Not assumptions—actual decisions I made.

“I now have comprehensive understanding of your requirements. Let me create the Business Requirements Document.”

Yes. Yes you do. Finally.

.

.

.

The Output: A Document I Can Actually Build From

Claude Code terminal showing BRD summary with sections: Executive Summary, Business Context, User Personas (5 defined), Functional Requirements with user stories, Business Rules (16 codified rules), Non-Functional Requirements, Out of Scope items, and Glossary. Key business decisions listed include membership-based model, plan-based meeting room quotas, 30-day cancellation policy, two admin roles, and location-based time zones
[BRD] CoworkPress – WordPress theme
Loading longform...

Document Information

Field Value
Project Name CoworkPress
Document Type Business Requirements Document (BRD)
Version 1.0
Created 2026-01-13
Status Draft

1. Executive Summary

CoworkPress is a WordPress theme designed for coworking space owners to promote and manage their coworking business. The theme enables owners to showcase their spaces, manage memberships, handle bookings, and build community—all through a highly customizable, professional website.

1.1 Business Objectives

  • Enable coworking space owners to establish a professional online presence
  • Streamline membership management and billing operations
  • Provide real-time booking capabilities for spaces and resources
  • Support multi-location operations under a single platform
  • Deliver comprehensive business analytics and reporting
  • Foster community engagement through member directories and events

1.2 Target Market

Primary User (Theme Buyer): Coworking space owners and operators managing one or more locations

End Users (Website Visitors):

  • Freelancers and remote workers seeking flexible workspace
  • Small teams and startups needing dedicated desks or private offices
  • Enterprise clients looking for satellite offices or meeting spaces

2. Business Context

2.1 Business Model

The coworking space operates on a membership-based model with flexible billing cycles (monthly, quarterly, annual). Revenue is generated through:

  • Recurring membership subscriptions
  • Additional hour purchases when quotas are exhausted
  • Corporate accounts managing multiple employee memberships

2.2 Space Offerings

Space Type Description
Hot Desks Shared open workspace with no assigned seating
Dedicated Desks Reserved desk space for consistent use
Private Offices Enclosed offices for teams or individuals
Meeting Rooms Bookable conference and collaboration spaces
Event Spaces Larger venues for workshops, seminars, and gatherings

2.3 Multi-Location Operations

The business supports multiple physical locations, each operating in its own time zone. Memberships may be location-specific or provide access across locations depending on the plan.


3. User Personas

3.1 Coworking Space Owner (Admin)

Goals:

  • Manage all aspects of the coworking business from a single dashboard
  • Track business performance through analytics and reporting
  • Customize the website to match brand identity
  • Oversee memberships, bookings, and staff operations

Permissions: Full system access including financial data, member management, settings, and reporting

3.2 Front Desk Staff

Goals:

  • Assist members with day-to-day inquiries
  • Manage bookings and check-ins
  • Handle basic member account updates
  • Process tour requests and follow-ups

Permissions: Limited access—cannot access financial reports, billing settings, or system configuration

3.3 Prospective Member (Lead)

Goals:

  • Explore available spaces and amenities
  • Understand pricing and membership options
  • Schedule a tour of the facility
  • Compare plans to find the right fit

Journey: Website visitor → Tour booking → Lead nurturing → Member conversion

3.4 Individual Member

Goals:

  • Book meeting rooms and resources within quota
  • View upcoming bookings and membership status
  • Access invoices and billing history
  • Connect with other members through directory
  • Attend community events

Permissions: Access to member portal, personal bookings, own profile, community features

3.5 Corporate Account Manager

Goals:

  • Manage employee memberships under company account
  • View consolidated billing for all employees
  • Add or remove team members from the plan
  • Track company-wide space usage

Permissions: Access to company dashboard, employee management, corporate billing


4. Functional Requirements

4.1 Public Website

4.1.1 Homepage

User Stories:

  • As a visitor, I want to immediately understand what the coworking space offers so I can decide if it meets my needs
  • As a visitor, I want to see the different locations available so I can find one near me
  • As a visitor, I want clear calls-to-action so I know how to take the next step

Acceptance Criteria:

  • [ ] Hero section communicates value proposition clearly
  • [ ] Location selector/showcase displays all available spaces
  • [ ] Membership tiers are summarized with pricing
  • [ ] Prominent CTAs for tour booking and sign-up
  • [ ] Testimonials or social proof elements are visible
  • [ ] Mobile-responsive layout

4.1.2 Pricing Page

User Stories:

  • As a visitor, I want to compare membership plans side-by-side so I can choose the right one
  • As a visitor, I want to understand what's included in each tier so there are no surprises
  • As a corporate buyer, I want to see corporate account options so I can evaluate for my team

Acceptance Criteria:

  • [ ] All membership tiers displayed with clear pricing
  • [ ] Monthly, quarterly, and annual pricing shown with any discounts
  • [ ] Amenities included in each tier clearly listed
  • [ ] Meeting room hour quotas displayed per plan
  • [ ] Corporate account option highlighted
  • [ ] CTA to sign up or contact sales for each tier

4.1.3 Locations Page

User Stories:

  • As a visitor, I want to see all locations so I can find the most convenient one
  • As a visitor, I want to view details about each location so I can assess the facilities

Acceptance Criteria:

  • [ ] All locations listed with address and contact information
  • [ ] Each location shows available space types
  • [ ] Operating hours displayed per location
  • [ ] Photo gallery or visual representation of each space
  • [ ] Link to book a tour at specific location

4.1.4 Virtual Tour Page

User Stories:

  • As a remote visitor, I want to experience the space virtually so I can evaluate without visiting in person
  • As a decision-maker, I want to share a virtual tour with my team so we can discuss together

Acceptance Criteria:

  • [ ] 360-degree tour or video walkthrough available
  • [ ] Key amenities and features highlighted
  • [ ] Easy to navigate between different areas
  • [ ] Works on mobile devices
  • [ ] Option to schedule in-person tour after viewing

4.1.5 About Page

User Stories:

  • As a visitor, I want to learn about the company and team so I can trust the brand
  • As a visitor, I want to understand the coworking philosophy so I know if it aligns with my values

Acceptance Criteria:

  • [ ] Company story and mission clearly presented
  • [ ] Team members or leadership showcased (optional)
  • [ ] Community values or culture highlighted
  • [ ] Contact information accessible

4.1.6 Contact Page

User Stories:

  • As a visitor, I want to easily reach the team with questions so I can get answers before committing
  • As a visitor, I want location-specific contact options so I reach the right team

Acceptance Criteria:

  • [ ] Contact form with required fields (name, email, message)
  • [ ] Phone number and email displayed
  • [ ] Location selector if multiple locations exist
  • [ ] Map integration showing physical location(s)
  • [ ] Expected response time communicated

4.2 Tour Booking & Lead Management

4.2.1 Tour Scheduling

User Stories:

  • As a prospective member, I want to book a tour online so I can visit at a convenient time
  • As a staff member, I want to see scheduled tours so I can prepare for visitors
  • As an admin, I want tour data captured so I can follow up with leads

Acceptance Criteria:

  • [ ] Calendar interface showing available tour slots
  • [ ] Location selection for multi-location operations
  • [ ] Lead information captured (name, email, phone, company, needs)
  • [ ] Confirmation email sent to prospect after booking
  • [ ] Tour appears in staff/admin dashboard
  • [ ] Reminder sent 24 hours before scheduled tour

4.2.2 Lead Nurturing

User Stories:

  • As a staff member, I want to track lead status so I know who to follow up with
  • As an admin, I want to see conversion metrics so I can improve sales process

Acceptance Criteria:

  • [ ] Lead status tracking (new, toured, follow-up, converted, lost)
  • [ ] Notes field for staff to record interactions
  • [ ] Follow-up reminders for staff
  • [ ] Lead source tracking (how they found us)
  • [ ] Basic lead-to-member conversion reporting

4.3 Membership Management

4.3.1 Membership Plans

User Stories:

  • As an admin, I want to create and manage membership plans so I can offer different options
  • As a member, I want to clearly understand my plan benefits so I know what I'm paying for

Business Rules:

  • Each plan has a name, description, price, and billing cycle options
  • Plans include specific amenities (bundled, not à la carte)
  • Plans define meeting room hour quotas per billing period
  • Plans may be location-specific or cross-location
  • Pricing supports monthly, quarterly, and annual cycles

Acceptance Criteria:

  • [ ] Admin can create, edit, and deactivate plans
  • [ ] Each plan specifies included amenities
  • [ ] Meeting room quotas defined per plan
  • [ ] Billing cycles with pricing for each cycle length
  • [ ] Plans can be restricted to specific locations or allow all

4.3.2 Member Sign-up

User Stories:

  • As a prospective member, I want to sign up for a membership online so I can start using the space
  • As an admin, I want to manually add members so I can onboard people who signed up offline

Acceptance Criteria:

  • [ ] Online sign-up form with plan selection
  • [ ] Required information: name, email, phone, billing address
  • [ ] Payment information collected securely
  • [ ] Welcome email sent upon successful sign-up
  • [ ] Account created and accessible immediately
  • [ ] Admin can manually create member accounts

4.3.3 Free Trial

User Stories:

  • As a prospective member, I want to try the space before committing so I can make an informed decision
  • As an admin, I want to offer trials to increase conversions without revenue loss

Business Rules:

  • Trial duration is configurable by admin
  • Trial may be limited to certain plans
  • Automatic conversion to paid if not cancelled
  • Only one trial per person (prevent abuse)

Acceptance Criteria:

  • [ ] Admin can enable/disable trial period per plan
  • [ ] Trial duration configurable (e.g., 7 days, 14 days)
  • [ ] Member notified before trial ends
  • [ ] Automatic conversion to paid plan after trial
  • [ ] Trial status clearly shown in member portal
  • [ ] System prevents multiple trials per email/person

4.3.4 Plan Changes

User Stories:

  • As a member, I want to upgrade my plan so I can get more benefits
  • As a member, I want to downgrade my plan so I can reduce costs
  • As a member, I want to pause my membership temporarily so I don't lose my spot

Business Rules:

  • Upgrades take effect immediately, prorated billing applied
  • Downgrades take effect at next billing cycle
  • Pause duration has minimum and maximum limits
  • Paused memberships don't accrue quota or incur charges

Acceptance Criteria:

  • [ ] Member can request upgrade through portal
  • [ ] Upgrade applied immediately with prorated charge
  • [ ] Member can request downgrade through portal
  • [ ] Downgrade scheduled for next billing cycle
  • [ ] Member can request pause with date range
  • [ ] Pause limits enforced (min/max duration)
  • [ ] All changes logged for audit trail

4.3.5 Cancellation

User Stories:

  • As a member, I want to cancel my membership so I can stop payments
  • As an admin, I want a cancellation policy enforced so I can manage churn

Business Rules:

  • 30-day notice period required
  • Membership remains active until end of current billing cycle
  • Member retains access until membership end date
  • Cancellation reason captured for business insights

Acceptance Criteria:

  • [ ] Member can initiate cancellation through portal
  • [ ] 30-day notice clearly communicated
  • [ ] Cancellation date calculated (end of billing cycle after notice)
  • [ ] Confirmation email sent with end date
  • [ ] Cancellation reason collected (optional)
  • [ ] Admin can override cancellation policy if needed

4.4 Corporate Accounts

4.4.1 Company Account Setup

User Stories:

  • As a corporate buyer, I want a company account so I can manage all employees under one umbrella
  • As an admin, I want to offer corporate accounts so I can attract larger clients

Acceptance Criteria:

  • [ ] Company account with organization name and billing contact
  • [ ] Single invoice for all employee memberships
  • [ ] Primary contact designated as account manager
  • [ ] Company-wide membership plan selection

4.4.2 Employee Management

User Stories:

  • As a corporate account manager, I want to add employees so they can access the space
  • As a corporate account manager, I want to remove employees so we don't pay for people who left
  • As an employee, I want to use my company membership so I can work from the coworking space

Acceptance Criteria:

  • [ ] Account manager can add employees by email
  • [ ] Employee receives invitation to create profile
  • [ ] Account manager can deactivate employee access
  • [ ] Employee count limited by corporate plan
  • [ ] Each employee has their own profile but company billing
  • [ ] Account manager can view all employee bookings

4.5 Booking System

4.5.1 Resource Types

Business Rules:

  • Bookable resources: Meeting rooms, event spaces
  • Non-bookable resources: Hot desks (first-come), dedicated desks (assigned), private offices (leased)
  • Each bookable resource has capacity, amenities, and hourly rate

4.5.2 Real-time Booking

User Stories:

  • As a member, I want to see available time slots so I can book when I need
  • As a member, I want to book a room instantly so I don't have to wait for confirmation
  • As a member, I want to book at any of my accessible locations so I can work where convenient

Acceptance Criteria:

  • [ ] Calendar view shows real-time availability
  • [ ] Booking completes immediately upon submission
  • [ ] Location filter for multi-location members
  • [ ] Resource filter (room type, capacity, amenities)
  • [ ] Time slot selection with duration options
  • [ ] Booking confirmation displayed immediately
  • [ ] Confirmation email sent to member

4.5.3 Quota Management

User Stories:

  • As a member, I want to see my remaining hours so I can plan my bookings
  • As a member, I want to purchase extra hours when my quota runs out so I can continue booking

Business Rules:

  • Quotas reset at the start of each billing cycle
  • Unused quota does not roll over
  • Additional hours can be purchased at a fixed rate
  • Quota is deducted upon booking confirmation

Acceptance Criteria:

  • [ ] Member dashboard shows remaining quota
  • [ ] Warning displayed when quota is low
  • [ ] Booking prevented when quota exhausted (unless purchasing extra)
  • [ ] Option to purchase additional hours during booking
  • [ ] Additional hours charged immediately
  • [ ] Quota usage history visible to member

4.5.4 Booking Modifications

User Stories:

  • As a member, I want to cancel a booking so I can get my hours back
  • As a member, I want to reschedule a booking so I can change my plans

Business Rules:

  • Cancellations allowed up to X hours before start time (configurable)
  • Late cancellations do not refund quota
  • Rescheduling treated as cancel + new booking

Acceptance Criteria:

  • [ ] Member can cancel upcoming bookings
  • [ ] Quota refunded if cancelled within allowed window
  • [ ] No refund for late cancellations
  • [ ] Member can reschedule (if new slot available)
  • [ ] Cancellation policy clearly displayed
  • [ ] Cancelled bookings logged for reporting

4.6 Member Portal

4.6.1 Dashboard

User Stories:

  • As a member, I want a personalized dashboard so I can see everything relevant to me
  • As a member, I want quick access to common actions so I can be efficient

Acceptance Criteria:

  • [ ] Welcome message with member name
  • [ ] Upcoming bookings summary
  • [ ] Quota remaining display
  • [ ] Membership status and renewal date
  • [ ] Quick action buttons (book room, view invoices, etc.)
  • [ ] Recent activity feed

4.6.2 Profile Management

User Stories:

  • As a member, I want to update my profile so my information stays current
  • As a member, I want to control my directory visibility so I maintain privacy

Acceptance Criteria:

  • [ ] Edit personal information (name, phone, bio)
  • [ ] Upload profile photo
  • [ ] Add business/company information
  • [ ] Add skills/expertise for directory
  • [ ] Toggle directory visibility (opt-in/opt-out)
  • [ ] Change password

4.6.3 Booking Management

User Stories:

  • As a member, I want to see all my bookings so I can manage my schedule
  • As a member, I want to filter bookings so I can find specific ones

Acceptance Criteria:

  • [ ] List of upcoming bookings with details
  • [ ] Past bookings history
  • [ ] Filter by location, date range, resource type
  • [ ] Cancel or reschedule actions available
  • [ ] Calendar view option

4.6.4 Billing & Invoices

User Stories:

  • As a member, I want to view my invoices so I can track expenses
  • As a member, I want to download invoices so I can submit for reimbursement
  • As a member, I want to update payment method so I don't have service interruption

Acceptance Criteria:

  • [ ] List of all invoices with status (paid, pending, overdue)
  • [ ] Invoice details (line items, dates, amounts)
  • [ ] Download invoice as PDF
  • [ ] View/update payment method
  • [ ] Billing history summary

4.6.5 Membership Management

User Stories:

  • As a member, I want to see my membership details so I know my benefits
  • As a member, I want to manage my membership so I can make changes

Acceptance Criteria:

  • [ ] Current plan name and price displayed
  • [ ] List of included amenities
  • [ ] Quota allocation and usage
  • [ ] Renewal/next billing date
  • [ ] Options to upgrade, downgrade, pause, or cancel

4.7 Community Features

4.7.1 Member Directory

User Stories:

  • As a member, I want to discover other members so I can network
  • As a member, I want to find members with specific skills so I can collaborate
  • As a member, I want to control my listing so I maintain privacy

Business Rules:

  • Directory is opt-in (members choose to be listed)
  • Only accessible to logged-in members
  • Members control what information is visible

Acceptance Criteria:

  • [ ] Searchable directory of opted-in members
  • [ ] Filter by location, industry, skills
  • [ ] Member profile cards with photo, name, company, bio
  • [ ] Contact button (email or in-app message)
  • [ ] Members can opt-in/out at any time
  • [ ] Only visible to authenticated members

4.7.2 Events Calendar

User Stories:

  • As a member, I want to see upcoming events so I can participate
  • As a member, I want to RSVP to events so organizers know I'm coming
  • As an admin, I want to create events so I can build community

Acceptance Criteria:

  • [ ] Calendar view of upcoming events
  • [ ] Event details (title, description, date, time, location, capacity)
  • [ ] RSVP functionality with attendee limit
  • [ ] Filter events by location and type
  • [ ] Admin can create, edit, and cancel events
  • [ ] Event reminder notifications

4.8 Admin Dashboard & Reporting

4.8.1 Admin Dashboard

User Stories:

  • As an admin, I want an overview of business health so I can make informed decisions
  • As an admin, I want quick access to key metrics so I don't have to dig through reports

Acceptance Criteria:

  • [ ] Total active members count
  • [ ] New members this month
  • [ ] Revenue this month (and comparison to last month)
  • [ ] Occupancy rate across locations
  • [ ] Upcoming tours and recent leads
  • [ ] Quick action buttons for common tasks

4.8.2 Membership Reports

User Stories:

  • As an admin, I want to track member growth so I can measure marketing effectiveness
  • As an admin, I want to understand churn so I can improve retention

Acceptance Criteria:

  • [ ] Member count over time (graph)
  • [ ] New members by period
  • [ ] Cancellations by period
  • [ ] Churn rate calculation
  • [ ] Member breakdown by plan type
  • [ ] Export data for external analysis

4.8.3 Revenue Reports

User Stories:

  • As an admin, I want to track revenue so I can monitor financial health
  • As an admin, I want to understand revenue sources so I can optimize pricing

Acceptance Criteria:

  • [ ] Total revenue by period
  • [ ] Revenue breakdown by plan type
  • [ ] Additional hours revenue
  • [ ] Revenue by location
  • [ ] Month-over-month comparison
  • [ ] Export for accounting

4.8.4 Booking & Utilization Reports

User Stories:

  • As an admin, I want to see space utilization so I can optimize resources
  • As an admin, I want to identify peak times so I can plan staffing

Acceptance Criteria:

  • [ ] Bookings by resource and time period
  • [ ] Utilization rate per room/space
  • [ ] Peak hours/days analysis
  • [ ] No-show tracking
  • [ ] Revenue from bookings
  • [ ] Location comparison

4.8.5 Lead & Conversion Reports

User Stories:

  • As an admin, I want to track lead sources so I can invest in effective channels
  • As an admin, I want to measure conversion rates so I can improve sales process

Acceptance Criteria:

  • [ ] Leads by source
  • [ ] Tour completion rate
  • [ ] Lead-to-member conversion rate
  • [ ] Average time to conversion
  • [ ] Lost lead reasons

4.9 Notifications

4.9.1 Email Notifications

User Stories:

  • As a member, I want booking confirmations so I have a record
  • As a member, I want payment receipts so I can track expenses

Required Notifications:

Trigger Recipient Content
Booking confirmed Member Booking details, location, time
Booking cancelled Member Cancellation confirmation
Payment processed Member Receipt with amount and date
Payment failed Member Alert with retry instructions
Membership renewal upcoming Member Reminder with renewal date

Acceptance Criteria:

  • [ ] All required notifications sent automatically
  • [ ] Emails branded with coworking space identity
  • [ ] Unsubscribe option for non-critical notifications
  • [ ] Admin can customize email templates

4.10 Theme Customization

4.10.1 Visual Customization

User Stories:

  • As a space owner, I want to match my website to my brand so visitors have a consistent experience
  • As a space owner, I want to customize without coding so I can make changes myself

Acceptance Criteria:

  • [ ] Brand colors configurable (primary, secondary, accent)
  • [ ] Logo upload for header and footer
  • [ ] Favicon upload
  • [ ] Font selection from curated options
  • [ ] Homepage layout options
  • [ ] Footer content customizable
  • [ ] All changes preview before publishing

5. Business Rules Summary

5.1 Membership Rules

Rule Description
MEM-001 Members must provide valid payment method to activate membership
MEM-002 Free trials limited to one per person based on email
MEM-003 Upgrades take effect immediately with prorated billing
MEM-004 Downgrades take effect at next billing cycle
MEM-005 Cancellations require 30-day notice
MEM-006 Cancelled memberships remain active until end of billing cycle
MEM-007 Paused memberships do not accrue quota or charges

5.2 Booking Rules

Rule Description
BKG-001 Bookings deduct from quota at time of confirmation
BKG-002 Cancellations refund quota only if within allowed window
BKG-003 Members cannot book more than their remaining quota unless purchasing extra
BKG-004 Quotas reset at start of each billing cycle
BKG-005 Unused quota does not roll over
BKG-006 All bookings display in location's local time zone

5.3 Corporate Account Rules

Rule Description
CORP-001 Corporate accounts receive single consolidated invoice
CORP-002 Account manager can add/remove employees
CORP-003 Employee count limited by corporate plan
CORP-004 Employees share company quota or have individual quotas (configurable)

5.4 Billing Rules

Rule Description
BILL-001 Billing cycles: monthly, quarterly, annual
BILL-002 Annual plans may include discount (configurable)
BILL-003 Failed payments trigger retry and member notification
BILL-004 Membership suspended after X failed payment attempts
BILL-005 Additional hour purchases charged immediately

6. Non-Functional Requirements

6.1 Usability

  • Website must be mobile-responsive
  • Member portal accessible on mobile devices
  • Booking process completable in under 2 minutes
  • Admin interface intuitive without extensive training

6.2 Accessibility

  • Theme should follow WCAG 2.1 AA guidelines
  • All interactive elements keyboard accessible
  • Proper color contrast for readability
  • Alt text for images

6.3 Performance

  • Public pages load within 3 seconds
  • Booking availability updates in real-time
  • Dashboard loads within 5 seconds

6.4 Security

  • Member data protected with secure authentication
  • Payment information handled by PCI-compliant processor
  • Admin actions logged for audit trail
  • Personal data export capability (GDPR compliance)

6.5 Scalability

  • Support for multiple locations
  • Handle hundreds of concurrent members
  • Booking system supports high-demand periods

7. Out of Scope

The following are explicitly NOT included in this theme:

  • Digital access control integration (key cards, QR codes, mobile app)
  • Guest pass management
  • À la carte amenity purchases
  • Franchise/white-label multi-tenant operations
  • Native mobile applications
  • Third-party calendar sync (Google, Outlook)
  • Chat/messaging between members
  • Automated marketing campaigns
  • Inventory management for physical supplies

8. Glossary

Term Definition
Hot Desk Shared workspace with no assigned seating
Dedicated Desk Reserved desk assigned to a specific member
Private Office Enclosed office space for individual or team use
Quota Allocated meeting room hours included in membership
Billing Cycle Period between recurring payments (monthly, quarterly, annual)
Lead Prospective member who has shown interest but not signed up
Conversion When a lead becomes a paying member
Churn When a member cancels their membership
Utilization Percentage of available time a resource is booked

Document Information

Field Value
Project Name CoworkPress
Document Type Business Requirements Document (BRD)
Version 1.0
Created 2026-01-13
Status Draft

1. Executive Summary

CoworkPress is a WordPress theme designed for coworking space owners to promote and manage their coworking business. The theme enables owners to showcase their spaces, manage memberships, handle bookings, and build community—all through a highly customizable, professional website.

1.1 Business Objectives

  • Enable coworking space owners to establish a professional online presence
  • Streamline membership management and billing operations
  • Provide real-time booking capabilities for spaces and resources
  • Support multi-location operations under a single platform
  • Deliver comprehensive business analytics and reporting
  • Foster community engagement through member directories and events

1.2 Target Market

Primary User (Theme Buyer): Coworking space owners and operators managing one or more locations

End Users (Website Visitors):

  • Freelancers and remote workers seeking flexible workspace
  • Small teams and startups needing dedicated desks or private offices
  • Enterprise clients looking for satellite offices or meeting spaces

2. Business Context

2.1 Business Model

The coworking space operates on a membership-based model with flexible billing cycles (monthly, quarterly, annual). Revenue is generated through:

  • Recurring membership subscriptions
  • Additional hour purchases when quotas are exhausted
  • Corporate accounts managing multiple employee memberships

2.2 Space Offerings

Space Type Description
Hot Desks Shared open workspace with no assigned seating
Dedicated Desks Reserved desk space for consistent use
Private Offices Enclosed offices for teams or individuals
Meeting Rooms Bookable conference and collaboration spaces
Event Spaces Larger venues for workshops, seminars, and gatherings

2.3 Multi-Location Operations

The business supports multiple physical locations, each operating in its own time zone. Memberships may be location-specific or provide access across locations depending on the plan.


3. User Personas

3.1 Coworking Space Owner (Admin)

Goals:

  • Manage all aspects of the coworking business from a single dashboard
  • Track business performance through analytics and reporting
  • Customize the website to match brand identity
  • Oversee memberships, bookings, and staff operations

Permissions: Full system access including financial data, member management, settings, and reporting

3.2 Front Desk Staff

Goals:

  • Assist members with day-to-day inquiries
  • Manage bookings and check-ins
  • Handle basic member account updates
  • Process tour requests and follow-ups

Permissions: Limited access—cannot access financial reports, billing settings, or system configuration

3.3 Prospective Member (Lead)

Goals:

  • Explore available spaces and amenities
  • Understand pricing and membership options
  • Schedule a tour of the facility
  • Compare plans to find the right fit

Journey: Website visitor → Tour booking → Lead nurturing → Member conversion

3.4 Individual Member

Goals:

  • Book meeting rooms and resources within quota
  • View upcoming bookings and membership status
  • Access invoices and billing history
  • Connect with other members through directory
  • Attend community events

Permissions: Access to member portal, personal bookings, own profile, community features

3.5 Corporate Account Manager

Goals:

  • Manage employee memberships under company account
  • View consolidated billing for all employees
  • Add or remove team members from the plan
  • Track company-wide space usage

Permissions: Access to company dashboard, employee management, corporate billing


4. Functional Requirements

4.1 Public Website

4.1.1 Homepage

User Stories:

  • As a visitor, I want to immediately understand what the coworking space offers so I can decide if it meets my needs
  • As a visitor, I want to see the different locations available so I can find one near me
  • As a visitor, I want clear calls-to-action so I know how to take the next step

Acceptance Criteria:

  • [ ] Hero section communicates value proposition clearly
  • [ ] Location selector/showcase displays all available spaces
  • [ ] Membership tiers are summarized with pricing
  • [ ] Prominent CTAs for tour booking and sign-up
  • [ ] Testimonials or social proof elements are visible
  • [ ] Mobile-responsive layout

4.1.2 Pricing Page

User Stories:

  • As a visitor, I want to compare membership plans side-by-side so I can choose the right one
  • As a visitor, I want to understand what's included in each tier so there are no surprises
  • As a corporate buyer, I want to see corporate account options so I can evaluate for my team

Acceptance Criteria:

  • [ ] All membership tiers displayed with clear pricing
  • [ ] Monthly, quarterly, and annual pricing shown with any discounts
  • [ ] Amenities included in each tier clearly listed
  • [ ] Meeting room hour quotas displayed per plan
  • [ ] Corporate account option highlighted
  • [ ] CTA to sign up or contact sales for each tier

4.1.3 Locations Page

User Stories:

  • As a visitor, I want to see all locations so I can find the most convenient one
  • As a visitor, I want to view details about each location so I can assess the facilities

Acceptance Criteria:

  • [ ] All locations listed with address and contact information
  • [ ] Each location shows available space types
  • [ ] Operating hours displayed per location
  • [ ] Photo gallery or visual representation of each space
  • [ ] Link to book a tour at specific location

4.1.4 Virtual Tour Page

User Stories:

  • As a remote visitor, I want to experience the space virtually so I can evaluate without visiting in person
  • As a decision-maker, I want to share a virtual tour with my team so we can discuss together

Acceptance Criteria:

  • [ ] 360-degree tour or video walkthrough available
  • [ ] Key amenities and features highlighted
  • [ ] Easy to navigate between different areas
  • [ ] Works on mobile devices
  • [ ] Option to schedule in-person tour after viewing

4.1.5 About Page

User Stories:

  • As a visitor, I want to learn about the company and team so I can trust the brand
  • As a visitor, I want to understand the coworking philosophy so I know if it aligns with my values

Acceptance Criteria:

  • [ ] Company story and mission clearly presented
  • [ ] Team members or leadership showcased (optional)
  • [ ] Community values or culture highlighted
  • [ ] Contact information accessible

4.1.6 Contact Page

User Stories:

  • As a visitor, I want to easily reach the team with questions so I can get answers before committing
  • As a visitor, I want location-specific contact options so I reach the right team

Acceptance Criteria:

  • [ ] Contact form with required fields (name, email, message)
  • [ ] Phone number and email displayed
  • [ ] Location selector if multiple locations exist
  • [ ] Map integration showing physical location(s)
  • [ ] Expected response time communicated

4.2 Tour Booking & Lead Management

4.2.1 Tour Scheduling

User Stories:

  • As a prospective member, I want to book a tour online so I can visit at a convenient time
  • As a staff member, I want to see scheduled tours so I can prepare for visitors
  • As an admin, I want tour data captured so I can follow up with leads

Acceptance Criteria:

  • [ ] Calendar interface showing available tour slots
  • [ ] Location selection for multi-location operations
  • [ ] Lead information captured (name, email, phone, company, needs)
  • [ ] Confirmation email sent to prospect after booking
  • [ ] Tour appears in staff/admin dashboard
  • [ ] Reminder sent 24 hours before scheduled tour

4.2.2 Lead Nurturing

User Stories:

  • As a staff member, I want to track lead status so I know who to follow up with
  • As an admin, I want to see conversion metrics so I can improve sales process

Acceptance Criteria:

  • [ ] Lead status tracking (new, toured, follow-up, converted, lost)
  • [ ] Notes field for staff to record interactions
  • [ ] Follow-up reminders for staff
  • [ ] Lead source tracking (how they found us)
  • [ ] Basic lead-to-member conversion reporting

4.3 Membership Management

4.3.1 Membership Plans

User Stories:

  • As an admin, I want to create and manage membership plans so I can offer different options
  • As a member, I want to clearly understand my plan benefits so I know what I'm paying for

Business Rules:

  • Each plan has a name, description, price, and billing cycle options
  • Plans include specific amenities (bundled, not à la carte)
  • Plans define meeting room hour quotas per billing period
  • Plans may be location-specific or cross-location
  • Pricing supports monthly, quarterly, and annual cycles

Acceptance Criteria:

  • [ ] Admin can create, edit, and deactivate plans
  • [ ] Each plan specifies included amenities
  • [ ] Meeting room quotas defined per plan
  • [ ] Billing cycles with pricing for each cycle length
  • [ ] Plans can be restricted to specific locations or allow all

4.3.2 Member Sign-up

User Stories:

  • As a prospective member, I want to sign up for a membership online so I can start using the space
  • As an admin, I want to manually add members so I can onboard people who signed up offline

Acceptance Criteria:

  • [ ] Online sign-up form with plan selection
  • [ ] Required information: name, email, phone, billing address
  • [ ] Payment information collected securely
  • [ ] Welcome email sent upon successful sign-up
  • [ ] Account created and accessible immediately
  • [ ] Admin can manually create member accounts

4.3.3 Free Trial

User Stories:

  • As a prospective member, I want to try the space before committing so I can make an informed decision
  • As an admin, I want to offer trials to increase conversions without revenue loss

Business Rules:

  • Trial duration is configurable by admin
  • Trial may be limited to certain plans
  • Automatic conversion to paid if not cancelled
  • Only one trial per person (prevent abuse)

Acceptance Criteria:

  • [ ] Admin can enable/disable trial period per plan
  • [ ] Trial duration configurable (e.g., 7 days, 14 days)
  • [ ] Member notified before trial ends
  • [ ] Automatic conversion to paid plan after trial
  • [ ] Trial status clearly shown in member portal
  • [ ] System prevents multiple trials per email/person

4.3.4 Plan Changes

User Stories:

  • As a member, I want to upgrade my plan so I can get more benefits
  • As a member, I want to downgrade my plan so I can reduce costs
  • As a member, I want to pause my membership temporarily so I don't lose my spot

Business Rules:

  • Upgrades take effect immediately, prorated billing applied
  • Downgrades take effect at next billing cycle
  • Pause duration has minimum and maximum limits
  • Paused memberships don't accrue quota or incur charges

Acceptance Criteria:

  • [ ] Member can request upgrade through portal
  • [ ] Upgrade applied immediately with prorated charge
  • [ ] Member can request downgrade through portal
  • [ ] Downgrade scheduled for next billing cycle
  • [ ] Member can request pause with date range
  • [ ] Pause limits enforced (min/max duration)
  • [ ] All changes logged for audit trail

4.3.5 Cancellation

User Stories:

  • As a member, I want to cancel my membership so I can stop payments
  • As an admin, I want a cancellation policy enforced so I can manage churn

Business Rules:

  • 30-day notice period required
  • Membership remains active until end of current billing cycle
  • Member retains access until membership end date
  • Cancellation reason captured for business insights

Acceptance Criteria:

  • [ ] Member can initiate cancellation through portal
  • [ ] 30-day notice clearly communicated
  • [ ] Cancellation date calculated (end of billing cycle after notice)
  • [ ] Confirmation email sent with end date
  • [ ] Cancellation reason collected (optional)
  • [ ] Admin can override cancellation policy if needed

4.4 Corporate Accounts

4.4.1 Company Account Setup

User Stories:

  • As a corporate buyer, I want a company account so I can manage all employees under one umbrella
  • As an admin, I want to offer corporate accounts so I can attract larger clients

Acceptance Criteria:

  • [ ] Company account with organization name and billing contact
  • [ ] Single invoice for all employee memberships
  • [ ] Primary contact designated as account manager
  • [ ] Company-wide membership plan selection

4.4.2 Employee Management

User Stories:

  • As a corporate account manager, I want to add employees so they can access the space
  • As a corporate account manager, I want to remove employees so we don't pay for people who left
  • As an employee, I want to use my company membership so I can work from the coworking space

Acceptance Criteria:

  • [ ] Account manager can add employees by email
  • [ ] Employee receives invitation to create profile
  • [ ] Account manager can deactivate employee access
  • [ ] Employee count limited by corporate plan
  • [ ] Each employee has their own profile but company billing
  • [ ] Account manager can view all employee bookings

4.5 Booking System

4.5.1 Resource Types

Business Rules:

  • Bookable resources: Meeting rooms, event spaces
  • Non-bookable resources: Hot desks (first-come), dedicated desks (assigned), private offices (leased)
  • Each bookable resource has capacity, amenities, and hourly rate

4.5.2 Real-time Booking

User Stories:

  • As a member, I want to see available time slots so I can book when I need
  • As a member, I want to book a room instantly so I don't have to wait for confirmation
  • As a member, I want to book at any of my accessible locations so I can work where convenient

Acceptance Criteria:

  • [ ] Calendar view shows real-time availability
  • [ ] Booking completes immediately upon submission
  • [ ] Location filter for multi-location members
  • [ ] Resource filter (room type, capacity, amenities)
  • [ ] Time slot selection with duration options
  • [ ] Booking confirmation displayed immediately
  • [ ] Confirmation email sent to member

4.5.3 Quota Management

User Stories:

  • As a member, I want to see my remaining hours so I can plan my bookings
  • As a member, I want to purchase extra hours when my quota runs out so I can continue booking

Business Rules:

  • Quotas reset at the start of each billing cycle
  • Unused quota does not roll over
  • Additional hours can be purchased at a fixed rate
  • Quota is deducted upon booking confirmation

Acceptance Criteria:

  • [ ] Member dashboard shows remaining quota
  • [ ] Warning displayed when quota is low
  • [ ] Booking prevented when quota exhausted (unless purchasing extra)
  • [ ] Option to purchase additional hours during booking
  • [ ] Additional hours charged immediately
  • [ ] Quota usage history visible to member

4.5.4 Booking Modifications

User Stories:

  • As a member, I want to cancel a booking so I can get my hours back
  • As a member, I want to reschedule a booking so I can change my plans

Business Rules:

  • Cancellations allowed up to X hours before start time (configurable)
  • Late cancellations do not refund quota
  • Rescheduling treated as cancel + new booking

Acceptance Criteria:

  • [ ] Member can cancel upcoming bookings
  • [ ] Quota refunded if cancelled within allowed window
  • [ ] No refund for late cancellations
  • [ ] Member can reschedule (if new slot available)
  • [ ] Cancellation policy clearly displayed
  • [ ] Cancelled bookings logged for reporting

4.6 Member Portal

4.6.1 Dashboard

User Stories:

  • As a member, I want a personalized dashboard so I can see everything relevant to me
  • As a member, I want quick access to common actions so I can be efficient

Acceptance Criteria:

  • [ ] Welcome message with member name
  • [ ] Upcoming bookings summary
  • [ ] Quota remaining display
  • [ ] Membership status and renewal date
  • [ ] Quick action buttons (book room, view invoices, etc.)
  • [ ] Recent activity feed

4.6.2 Profile Management

User Stories:

  • As a member, I want to update my profile so my information stays current
  • As a member, I want to control my directory visibility so I maintain privacy

Acceptance Criteria:

  • [ ] Edit personal information (name, phone, bio)
  • [ ] Upload profile photo
  • [ ] Add business/company information
  • [ ] Add skills/expertise for directory
  • [ ] Toggle directory visibility (opt-in/opt-out)
  • [ ] Change password

4.6.3 Booking Management

User Stories:

  • As a member, I want to see all my bookings so I can manage my schedule
  • As a member, I want to filter bookings so I can find specific ones

Acceptance Criteria:

  • [ ] List of upcoming bookings with details
  • [ ] Past bookings history
  • [ ] Filter by location, date range, resource type
  • [ ] Cancel or reschedule actions available
  • [ ] Calendar view option

4.6.4 Billing & Invoices

User Stories:

  • As a member, I want to view my invoices so I can track expenses
  • As a member, I want to download invoices so I can submit for reimbursement
  • As a member, I want to update payment method so I don't have service interruption

Acceptance Criteria:

  • [ ] List of all invoices with status (paid, pending, overdue)
  • [ ] Invoice details (line items, dates, amounts)
  • [ ] Download invoice as PDF
  • [ ] View/update payment method
  • [ ] Billing history summary

4.6.5 Membership Management

User Stories:

  • As a member, I want to see my membership details so I know my benefits
  • As a member, I want to manage my membership so I can make changes

Acceptance Criteria:

  • [ ] Current plan name and price displayed
  • [ ] List of included amenities
  • [ ] Quota allocation and usage
  • [ ] Renewal/next billing date
  • [ ] Options to upgrade, downgrade, pause, or cancel

4.7 Community Features

4.7.1 Member Directory

User Stories:

  • As a member, I want to discover other members so I can network
  • As a member, I want to find members with specific skills so I can collaborate
  • As a member, I want to control my listing so I maintain privacy

Business Rules:

  • Directory is opt-in (members choose to be listed)
  • Only accessible to logged-in members
  • Members control what information is visible

Acceptance Criteria:

  • [ ] Searchable directory of opted-in members
  • [ ] Filter by location, industry, skills
  • [ ] Member profile cards with photo, name, company, bio
  • [ ] Contact button (email or in-app message)
  • [ ] Members can opt-in/out at any time
  • [ ] Only visible to authenticated members

4.7.2 Events Calendar

User Stories:

  • As a member, I want to see upcoming events so I can participate
  • As a member, I want to RSVP to events so organizers know I'm coming
  • As an admin, I want to create events so I can build community

Acceptance Criteria:

  • [ ] Calendar view of upcoming events
  • [ ] Event details (title, description, date, time, location, capacity)
  • [ ] RSVP functionality with attendee limit
  • [ ] Filter events by location and type
  • [ ] Admin can create, edit, and cancel events
  • [ ] Event reminder notifications

4.8 Admin Dashboard & Reporting

4.8.1 Admin Dashboard

User Stories:

  • As an admin, I want an overview of business health so I can make informed decisions
  • As an admin, I want quick access to key metrics so I don't have to dig through reports

Acceptance Criteria:

  • [ ] Total active members count
  • [ ] New members this month
  • [ ] Revenue this month (and comparison to last month)
  • [ ] Occupancy rate across locations
  • [ ] Upcoming tours and recent leads
  • [ ] Quick action buttons for common tasks

4.8.2 Membership Reports

User Stories:

  • As an admin, I want to track member growth so I can measure marketing effectiveness
  • As an admin, I want to understand churn so I can improve retention

Acceptance Criteria:

  • [ ] Member count over time (graph)
  • [ ] New members by period
  • [ ] Cancellations by period
  • [ ] Churn rate calculation
  • [ ] Member breakdown by plan type
  • [ ] Export data for external analysis

4.8.3 Revenue Reports

User Stories:

  • As an admin, I want to track revenue so I can monitor financial health
  • As an admin, I want to understand revenue sources so I can optimize pricing

Acceptance Criteria:

  • [ ] Total revenue by period
  • [ ] Revenue breakdown by plan type
  • [ ] Additional hours revenue
  • [ ] Revenue by location
  • [ ] Month-over-month comparison
  • [ ] Export for accounting

4.8.4 Booking & Utilization Reports

User Stories:

  • As an admin, I want to see space utilization so I can optimize resources
  • As an admin, I want to identify peak times so I can plan staffing

Acceptance Criteria:

  • [ ] Bookings by resource and time period
  • [ ] Utilization rate per room/space
  • [ ] Peak hours/days analysis
  • [ ] No-show tracking
  • [ ] Revenue from bookings
  • [ ] Location comparison

4.8.5 Lead & Conversion Reports

User Stories:

  • As an admin, I want to track lead sources so I can invest in effective channels
  • As an admin, I want to measure conversion rates so I can improve sales process

Acceptance Criteria:

  • [ ] Leads by source
  • [ ] Tour completion rate
  • [ ] Lead-to-member conversion rate
  • [ ] Average time to conversion
  • [ ] Lost lead reasons

4.9 Notifications

4.9.1 Email Notifications

User Stories:

  • As a member, I want booking confirmations so I have a record
  • As a member, I want payment receipts so I can track expenses

Required Notifications:

Trigger Recipient Content
Booking confirmed Member Booking details, location, time
Booking cancelled Member Cancellation confirmation
Payment processed Member Receipt with amount and date
Payment failed Member Alert with retry instructions
Membership renewal upcoming Member Reminder with renewal date

Acceptance Criteria:

  • [ ] All required notifications sent automatically
  • [ ] Emails branded with coworking space identity
  • [ ] Unsubscribe option for non-critical notifications
  • [ ] Admin can customize email templates

4.10 Theme Customization

4.10.1 Visual Customization

User Stories:

  • As a space owner, I want to match my website to my brand so visitors have a consistent experience
  • As a space owner, I want to customize without coding so I can make changes myself

Acceptance Criteria:

  • [ ] Brand colors configurable (primary, secondary, accent)
  • [ ] Logo upload for header and footer
  • [ ] Favicon upload
  • [ ] Font selection from curated options
  • [ ] Homepage layout options
  • [ ] Footer content customizable
  • [ ] All changes preview before publishing

5. Business Rules Summary

5.1 Membership Rules

Rule Description
MEM-001 Members must provide valid payment method to activate membership
MEM-002 Free trials limited to one per person based on email
MEM-003 Upgrades take effect immediately with prorated billing
MEM-004 Downgrades take effect at next billing cycle
MEM-005 Cancellations require 30-day notice
MEM-006 Cancelled memberships remain active until end of billing cycle
MEM-007 Paused memberships do not accrue quota or charges

5.2 Booking Rules

Rule Description
BKG-001 Bookings deduct from quota at time of confirmation
BKG-002 Cancellations refund quota only if within allowed window
BKG-003 Members cannot book more than their remaining quota unless purchasing extra
BKG-004 Quotas reset at start of each billing cycle
BKG-005 Unused quota does not roll over
BKG-006 All bookings display in location's local time zone

5.3 Corporate Account Rules

Rule Description
CORP-001 Corporate accounts receive single consolidated invoice
CORP-002 Account manager can add/remove employees
CORP-003 Employee count limited by corporate plan
CORP-004 Employees share company quota or have individual quotas (configurable)

5.4 Billing Rules

Rule Description
BILL-001 Billing cycles: monthly, quarterly, annual
BILL-002 Annual plans may include discount (configurable)
BILL-003 Failed payments trigger retry and member notification
BILL-004 Membership suspended after X failed payment attempts
BILL-005 Additional hour purchases charged immediately

6. Non-Functional Requirements

6.1 Usability

  • Website must be mobile-responsive
  • Member portal accessible on mobile devices
  • Booking process completable in under 2 minutes
  • Admin interface intuitive without extensive training

6.2 Accessibility

  • Theme should follow WCAG 2.1 AA guidelines
  • All interactive elements keyboard accessible
  • Proper color contrast for readability
  • Alt text for images

6.3 Performance

  • Public pages load within 3 seconds
  • Booking availability updates in real-time
  • Dashboard loads within 5 seconds

6.4 Security

  • Member data protected with secure authentication
  • Payment information handled by PCI-compliant processor
  • Admin actions logged for audit trail
  • Personal data export capability (GDPR compliance)

6.5 Scalability

  • Support for multiple locations
  • Handle hundreds of concurrent members
  • Booking system supports high-demand periods

7. Out of Scope

The following are explicitly NOT included in this theme:

  • Digital access control integration (key cards, QR codes, mobile app)
  • Guest pass management
  • À la carte amenity purchases
  • Franchise/white-label multi-tenant operations
  • Native mobile applications
  • Third-party calendar sync (Google, Outlook)
  • Chat/messaging between members
  • Automated marketing campaigns
  • Inventory management for physical supplies

8. Glossary

Term Definition
Hot Desk Shared workspace with no assigned seating
Dedicated Desk Reserved desk assigned to a specific member
Private Office Enclosed office space for individual or team use
Quota Allocated meeting room hours included in membership
Billing Cycle Period between recurring payments (monthly, quarterly, annual)
Lead Prospective member who has shown interest but not signed up
Conversion When a lead becomes a paying member
Churn When a member cancels their membership
Utilization Percentage of available time a resource is booked

Compare this to the PRD output.

The BRD contains:

  • Executive Summary with clear business objectives
  • 5 defined user personas (Admin, Staff, Lead, Member, Corporate Manager)
  • Functional requirements as user stories with acceptance criteria
  • 16 codified business rules
  • Non-functional requirements (usability, accessibility, performance)
  • Explicit “Out of Scope” section
  • Glossary of terms

The BRD does NOT contain:

  • Database schemas
  • API endpoint specifications
  • PHP version requirements
  • CSS bundle size limits
  • Framework choices

No premature implementation decisions. Just clear requirements I can build against.

And because Claude interviewed me first, these requirements reflect my decisions—not Claude’s assumptions.

That’s the difference.

.

.

.

👉 The Prompt Template (Copy-Paste This)

Here’s the exact prompt structure you can steal (please steal it—that’s why I’m sharing it):

I want to build [YOUR PROJECT DESCRIPTION].

I want you to help me brainstorm for the business requirement 
document (BRD) for this [project type]. Focus on business logic 
and rules, user stories, and acceptance criteria.

[Optional: Use the "[skill-name]" skill to understand the 
development patterns and guidance for building [technology].]

IMPORTANT: DO NOT INCLUDE ANY TECHNICAL IMPLEMENTATION DETAILS.

Use the AskUserQuestionTool to Ask me clarifying questions 
until you are 95% confident you can complete this task 
successfully. For each question, add your recommendation 
(with reason why) below the options. This would help me 
in making a better decision.

Put the BRD at @[your-path]/[filename].md

Why each piece matters:

  1. “Focus on business logic, user stories, and acceptance criteria” Forces Claude to think from user perspective, not implementation. This is where the magic happens.
  2. “DO NOT INCLUDE ANY TECHNICAL IMPLEMENTATION DETAILS” Hard boundary that keeps the document clean. (Again with the yelling. It works.)
  3. “95% confident” Gives Claude a threshold—it keeps asking until it has enough information. No more guessing.
  4. “Add your recommendation (with reason why)” Claude explains its thinking, helping you make informed decisions instead of random choices.

.

.

.

Where Do Technical Details Go?

Okay, so if technical specs don’t belong in your requirements, where do they live?

Two places:

  1. Project rules — Your .claude/rules/ directory
  2. Agent skills — Reusable patterns Claude loads on-demand

I covered this in detail in my previous issue on self-evolving Claude Code rules. (If you missed it, go read it. I’ll wait.)

The key insight: Claude loads skills when it needs them.

Instead of burning context on every technical decision upfront, Claude reads skill descriptions at session start. When it encounters a database task, then it loads your database rules. When it’s building an API, then it loads your API patterns.

Your requirements stay clean. Your context window stays focused. Technical standards still get applied—just at the right moment.

Think of it as separation of concerns for your AI workflow:

  • Requirements (BRD) = What you want to build (the what and why)
  • Project rules & skills = How to build it (the how)
Infographic titled "SEPARATION OF CONCERNS" illustrating how to manage information in an AI context window. The top section is a rounded box labeled "YOUR BRD 🧠📄" containing high-level requirements like "User stories," "Business rules," "Acceptance criteria," "Scope boundaries," "User personas," and "What + Why," noting that it "(Lives in context window)." A large gray downward arrow points to the bottom section, another rounded box labeled "PROJECT RULES + SKILLS 🧰⚙️" containing technical details like "Tech stack patterns," "API conventions," "Database rules," "Testing standards," "Code style," and "How," noting that it is "(Loaded on-demand when needed)." A concluding sentence at the very bottom reads: "Context stays clean. Technical standards still apply."

Simple. Elegant. Actually works.

.

.

.

👉 The Real Lesson

The difference between mediocre AI output and genuinely great output often comes down to one thing:

Did you let the AI assume, or did you make it ask?

When you hand Claude a prompt and let it run, it fills gaps with assumptions. Sometimes those assumptions are good. Often? They’re not. And you won’t know until you’re three hours into building the wrong thing.

When you force Claude to interview you first—to surface decisions, explore edge cases, and validate understanding—you get output that reflects your vision. Not Claude’s best guess.

21 questions took about 5 minutes to answer.

Those 5 minutes saved me from 313 lines of premature decisions and gave me requirements I can actually build against.

That’s a pretty good trade.

Your turn:

Next time you start a project, don’t ask Claude for a PRD.

Ask it to interview you first.

Then watch what happens.

12 min read The Art of Vibe Coding, Claude

How to Build Self-Evolving Claude Code Rules (So You Stop Fixing the Same Mistakes)

Last week, I watched Claude make the exact same mistake I’d corrected three days earlier.

Same project. Same codebase. Same error.

I’d spent fifteen minutes explaining why we use prepared statements for database queries—not string concatenation. Claude understood. Claude apologized. Claude fixed it beautifully.

And then, in a fresh session, Claude did it again. Like our conversation never happened.

Here’s the thing: it wasn’t Claude’s fault.

(Stay with me.)

The correction I’d made? It lived and died in that single session. I never added it to my Claude Code rules. Never updated my project guidelines. Never captured what we’d learned together.

So Claude forgot. Because Claude had to forget.

And honestly? I’ve done this more times than I’d like to admit.

.

.

.

The Uncomfortable Truth About Your Claude Code Rules

You’ve probably got project rules somewhere.

Maybe in a CLAUDE.md file. Maybe in a markdown doc you include at the start of sessions. Maybe scrawled on a Post-it note stuck to your monitor.

(No judgment.)

These rules matter.

They’re the guardrails that keep Claude from hallucinating, making mistakes, or generating code that looks like it was written by someone who’s never seen your codebase before.

But here’s what nobody talks about: most Claude Code rules are frozen in time.

You wrote them once—probably when you were optimistic and caffeinated and full of good intentions. Maybe you updated them once or twice when something broke spectacularly. And then… they fossilized.

Meanwhile, you’re out there learning. Every session teaches you something. Better patterns. Sneaky edge cases. Production bugs that made you question your life choices at 2am.

But none of that learning makes it back into your rules.

Your rules stay stuck at whatever understanding you had on Day One. A Level 5 Charmander trying to fight Level 50 battles.

(More on Pokémon in a minute. I promise this metaphor is going somewhere.)

.

.

.

The Three Problems That Keep Your Rules Stuck

Let me break down why this happens—because understanding the problem is half the battle.

Problem #1: The Inclusion Tax

You have to remember to add your rules file at the start of every session. Miss it once—maybe you’re rushing, maybe you’re excited about a feature, maybe you just forgot—and suddenly you’re debugging code that violates your own standards.

It’s like having a gym membership you forget to use. The potential is there. The execution… less so.

Problem #2: Context Decay

Even when you do include your rules, long sessions dilute them. By message #50, your carefully crafted “always use prepared statements” guideline has degraded into… whatever Claude feels like doing.

The rules are still technically in the context window. They’re just competing with 47 other messages for Claude’s attention. And losing.

Here’s what that looks like:

CONTEXT DECAY OVER TIME" on a light background, illustrating how the influence of rules diminishes in communication as more context is added. Four horizontal progress bars are stacked vertically. The top bar, "Message #1: 🧠 Your rules (100%) ✔️", is entirely dark navy blue. The second bar, "Message #10: 👀 Rules + conversation 💬", is mostly dark navy blue with a smaller gray segment on the right. The third bar, "Message #25: ⌨️ Rules getting buried ⬇️", has a smaller dark navy blue segment and a larger gray segment. The bottom bar, "Message #50: 🦭 Rules? What rules? 🔍", has a very small dark navy blue segment on the left and a large gray segment. A legend below indicates that the dark navy blue squares represent "Rule influence" and the gray squares represent "Other context". At the very bottom, a rounded orange callout box with a warning icon states, "Key Takeaway: Rules are forgotten as context fills up!

Problem #3: The Maintenance Black Hole

Rules should evolve. You know this. I know this. We all know this.

But who actually updates their rules file regularly?

(I’m raising my hand here too. We’re in this together.)

.

.

.

The CLAUDE.md Trap

Here’s what most developers do—and I get why it seems logical:

They cram everything into CLAUDE.md.

Security rules. Database patterns. API conventions. Coding standards. Error handling preferences. That one weird edge case from six months ago. All of it, stuffed into one giant file that gets loaded at the start of every session.

The thinking makes sense: “Claude will always have my rules!”

The reality?

A 2,000-line CLAUDE.md file burns through your token limits before you even start working.

You’re paying the context tax on every single message—whether you need those rules or not. Working on a simple UI tweak? Still loading all your database migration patterns. Fixing a typo? Still burning tokens on your entire security playbook.

TOKEN CONSUMPTION: BEFORE vs AFTER". The top section, "THE CLAUDE.md TRAP (Before) ❌", shows a large, full dark bar labeled "2,000 lines = ~4k tokens". Below it are labels for code modules: [security][database][api][hooks][i18n][testing][deploy][...]. Text states "Every message loads EVERYTHING" and "Simple UI task? Still paying for ALL of it. ⚠️". The bottom section, "THE INDEXED SKILL (After) ✅", shows a small dark bar for "Index/descriptions = ~500 tokens (always loaded)". Below it, a separate, segmented gray bar represents "+ security.md = ~800 tokens (only if needed)". Text states "Load index first, references only when needed" and "Simple UI task? Pay only for the index. ✅". A legend indicates that dark bars mean "Tokens consumed" and gray bars mean "Loaded on-demand". A final callout box with a lightbulb icon states, "Key Takeaway: Indexing significantly reduces token costs by loading only what's necessary!

It’s like packing your entire wardrobe for a weekend trip. Sure, you’ll have options. But you’ll also be exhausted before you get anywhere.

.

.

.

What If Your Rules Could Level Up?

Okay, here’s where the Pokémon thing comes in. (Told you I’d get there.)

Think about how evolution works in Pokémon. A Charmander doesn’t stay a Charmander forever. It battles. It gains experience. It evolves into Charmeleon, then Charizard. Each evolution makes it stronger, better suited for tougher challenges.

What if your Claude Code rules could work the same way?

Every correction you make.

Every “actually, do it this way instead” moment. Every hard-won insight from debugging at 2am. What if all of that could strengthen your rules automatically?

Not stuffed into a bloated CLAUDE.md. Not forgotten when sessions end. Actually captured and integrated into a system that gets smarter over time.

This is possible now. And it’s not even that complicated.

Enter Agent Skills (And Why They Change Everything)

If you haven’t explored Agent Skills yet, here’s the short version: Skills let Claude activate knowledge only when it needs it.

Instead of loading everything upfront—all 2,000 lines of your rules, whether relevant or not—Claude starts by reading just the skill descriptions. A few lines each. When a task triggers a specific skill, then it reads the full details.

Working on database queries? Claude loads the database skill. Building an API endpoint? It loads the API patterns. Simple UI change? It loads… just what it needs for that.

The token savings are significant. Instead of paying for your entire rulebook on every message, you pay for maybe 50 lines of descriptions, plus whatever specific reference you actually need.

But here’s where it gets interesting for our “evolving rules” problem…

The Card Catalog Architecture

Here’s the approach that solves all three problems we talked about earlier:

Structure your skill like a card catalog, not a library.

Your SKILL.md file becomes an index—brief descriptions pointing to reference files. The actual rules live in a references/ folder:

CARD CATALOG vs LIBRARY: SKILL STRUCTURE" compares two approaches to organizing information. The top section, labeled "❌ THE LIBRARY (Everything in one file)", shows a large file icon and a messy pile of folders. A text box below it is titled "SKILL.md (2,000+ lines)" and lists "All database rules here", "All security rules here", "All API rules here", "All hook patterns here", and "Everything else here too..." within a single structure. A warning triangle icon is present. The bottom section, labeled "✅ THE CARD CATALOG (Index + References)", shows a neat index card icon, a folder icon, and several smaller, organized file icons. A text box below it is titled "SKILL.md (~80 lines - INDEX ONLY)" and lists pointers: "Database rules → see references/", "Security rules → see references/", and "API rules → see references/". Below this is a folder named references/ containing individual files: database.md (121 lines), security.md (104 lines), api.md (98 lines), and hooks.md (132 lines). A note with an arrow points to these files, stating "← Load only when needed ↓

Instead of cramming everything into SKILL.md like this:

## Database Schema Rules
Always use snake_case for table names...
[50 more lines of database rules]

## Firebase Security Rules  
Auth patterns must follow...
[40 more lines of Firebase rules]

Your SKILL.md becomes a simple directory:

## Database Schema Rules
See: references/database.md
Guidelines for table naming, migrations, and schema patterns.

## Firebase Security Rules
See: references/security.md  
Authentication patterns and Firestore rules structure.

Why does this matter for evolution?

When you capture new insights, they go into the specific reference file—not bloating the main index. Your skill grows by expanding its reference library, not by inflating one massive file.

And when you pair this structure with the build-insights-logger skill? Your rules start updating themselves based on real learnings.

Your Charmander starts evolving.

.

.

.

Building Your Self-Evolving Skill: The Complete Walkthrough

Alright, let’s get practical. Here’s exactly how to set this up—step by step, with real screenshots from when I did this myself.

Step 1: Convert Your Existing Rules to an Indexed Skill

If you already have Claude Code rules somewhere (in CLAUDE.md, a rules file, or scattered notes), this is your starting point.

Here’s the prompt I used:

Convert the following project rules at @notes/rules.md into a live documentation skill using the "skill-creator" skill.

## Requirements

### 1. Skill Structure

Create a skill folder with this structure:

```
.claude/skills/[skill-name]/
    ├── SKILL.md           # Index file (card catalog, NOT the full library)
    ├── references/        # Detailed rule files
    │   ├── [category-1].md
    │   ├── [category-2].md
    │   └── ...
    └── [README.md](http://README.md)          # Optional: skill usage guide
```

### 2. SKILL.md Design (The Index)

The SKILL.md should act as a **card catalog**, not contain the full rules. 

Example:

```
[...content of SKILL.md...]

## Quick Reference

Brief overview of what this skill covers (2-3 sentences max).

## Rule Categories

### [Category 1 Name]

Brief description (1 line). See: `references/[category-1].md`

### [Category 2 Name]

Brief description (1 line). See: `references/[category-2].md`

[Continue for all categories...]

## When to Load References

- Load `references/[category-1].md` when: [specific trigger]
- Load `references/[category-2].md` when: [specific trigger]
```

### 3. Reference File Design

Each reference file in `references/` should:
- Focus on ONE category/domain of rules
- Include code examples where helpful
- Be self-contained (can be understood without reading other files)
- End with a "Quick Checklist" for that category

### 4. Evolvability

Structure the skill so new learnings can be easily added:
- Each reference file should have a `## Lessons Learned` section at the end (initially empty)
- The SKILL.md index should be easy to extend with new categories
- Use consistent formatting so automated updates are possible

## Notes

- Prioritize token efficiency: Claude should only load what it needs
- Keep SKILL.md under 100 lines if possible
- Each reference file should be focused (ideally under 200 lines)
- Use the indexed structure so the build-insights-logger can update specific reference files later
Screenshot of the prompt used to create the skill, showing requirements for skill structure with SKILL.md as index, references folder for detailed rules, and design requirements for evolvability

Two prerequisites before you run this:

  • Install the “skill-creator” skill first
  • Turn on Plan Mode (Shift+Tab)

Claude initiates the skill-creator and starts working:

Claude Code terminal showing the initiation of skill-creator skill with "Forging..." status indicating it's processing the request

It explores your codebase for existing patterns to follow. (I love watching this part—it’s like Claude doing research before diving in.)

Claude Code exploring existing skills patterns in the codebase, showing 6 tool uses and 21.1k tokens consumed during exploration

In my case, Claude asked clarifying questions before finalizing the plan. This is Plan Mode doing its job—thinking before coding:

Claude Code asking clarifying questions about skill naming, presenting options like "wordpress-plugin-rules", "wp-plugin-standards", and "wordpress-dev" with navigation instructions

After answering, Claude proposed a complete plan:

Claude Code displaying the generated plan for converting WordPress Plugin Rules to Live Documentation Skill, showing the proposed file structure with SKILL.md and 15 reference files organized by topic

The plan includes the SKILL.md design—notice how it acts as an index, not a container for all the rules:

Detailed view of SKILL.md design showing the YAML frontmatter with name and description, body structure with Quick Reference and Rule Categories sections, and a Reference File Template with Quick Checklist and Lessons Learned sections

I agreed to proceed with auto-accept edits. And here’s what Claude created:

Summary of the generated WordPress Plugin Rules skill showing the final structure: SKILL.md (83 lines) acting as index/card catalog, and 15 reference files in the references folder ranging from 95 to 166 lines each, covering topics like code-structure, security, database, performance, and deployment

The result:

  • SKILL.md: 83 lines (the index/card catalog)
  • 15 reference files, each under 200 lines
  • Every reference file includes code examples, a Quick Checklist, and an empty Lessons Learned section

Those empty Lessons Learned sections? They’re intentional. That’s where the evolution happens.

👉 Don’t have existing rules to convert? You can ask Claude to analyze your codebase and extract patterns into a skill. Or check out my previous post on how to compile your own project rules first.

Step 2: Install the Build-Insights-Logger

This is the skill that captures learnings during your sessions and routes them to the right place.

/plugin marketplace add nathanonn/claude-skill-build-insights-logger

GitHub repo: https://github.com/nathanonn/claude-skill-build-insights-logger

(Yes, I built this. Yes, I’m biased. But it solves a real problem.)

Step 3: Work Like You Normally Would

Here’s the beautiful part: you don’t need to change how you work.

With your skill installed and the insights logger ready, just… build. Code. Debug. Do your thing.

I’ll show you what this looks like. I asked Claude to audit my WordPress plugin for security vulnerabilities:

Security audit results showing a table of security strengths (SQL Injection protection, CSRF Protection, Authorization, Input Sanitization, Token Security, Session Protection, Rate Limiting) and three medium-risk concerns: IP Spoofing via X-Forwarded-For, Token Exposure in Debug Logs, and No User Status Re-validation

Claude found several issues, fixed them, and documented the changes. Standard stuff.

But here’s where it gets good.

After the implementation, I triggered the insights logger:

Please jot down what you have learned so far using the "build-insights-logger" skill.
Terminal showing the prompt to jot down learnings using build-insights-logger skill, with "accept edits on" mode enabled

Claude activated the skill:

Claude Code initiating the build-insights-logger skill, showing the skill permission prompt with description explaining it automatically logs meaningful insights, discoveries, and decisions during coding sessions

And logged 6 insights from the session:

Table showing 6 logged insights from the security audit session: IP Spoofing via X-Forwarded-For Headers (Security), Token Exposure in Debug Logs (Security), Consolidating Duplicate IP Detection Code (Architecture), CIDR Notation Support for IP Ranges (Patterns), False Positive in Security Audit (Edge Cases), and WordPress Settings API Auto-Rendering (Patterns). Session file created at .claude/insights/session-2026-01-05-143600.md

Six insights. Automatically categorized. Saved to .claude/insights/session-2026-01-05-143600.md.

No manual documentation. No “I should write this down” that never happens. Just… captured.

Step 4: Review and Integrate (The Curation Step)

You can review immediately after one session, or batch multiple sessions together. I usually wait until I have a few sessions worth of insights—but that’s personal preference.

Here’s how to review:

Please use the "build-insights-logger" skill to review the insights logged so far.
Terminal showing the prompt to review insights using the build-insights-logger skill

Claude reads all session files and presents a summary organized by category:

Detailed review of 6 insights organized by category. Security section shows IP Spoofing via X-Forwarded-For Headers and Token Exposure in Debug Logs. Architecture section shows Consolidating Duplicate IP Detection Code. Patterns section shows CIDR Notation Support for IP Ranges and WordPress Settings API Auto-Rendering. Edge Cases section shows False Positive in Security Audit. Each insight includes relevant file paths and explanations. Prompt asks which insights to add to CLAUDE.md

Now here’s the critical part: don’t add everything.

This is where human judgment matters. Review each insight and ask: “Will this apply to future projects, or is it specific to this one-off feature?”

Some insights are gold. Some are situational. You’re the curator here.

I selected insights 1, 2, 5, and 6—the ones that generalize across WordPress projects:

User response selecting insights "1, 2, 5, 6" with instructions to update the wordpress-plugin-rules skill instead of CLAUDE.md, keeping insights generic for other WordPress plugins, and emphasizing not to bloat SKILL.md—insights should go to relevant reference files

Important detail: Notice my instruction. By default, the build-insights-logger updates CLAUDE.md. I explicitly redirected it to update the skill instead, with a reminder to keep SKILL.md clean—insights should go to the relevant reference files, not the index.

Claude reads the relevant reference files and adds the insights where they belong:

Claude Code reading multiple files (security.md at 105 lines, hooks-ajax.md at 133 lines, SKILL.md at 84 lines, plugin-lifecycle.md at 156 lines) and then updating security.md with new lessons learned section about IP Address Spoofing via X-Forwarded-For, showing the diff with problem statement and solution

The result:

Completion message showing 4 insights added to the wordpress-plugin-rules skill. IP Spoofing via X-Forwarded-For, Token Exposure in Debug Logs, and Verify Security Concerns by Reading Code Flow were added to references/security.md. Settings API Auto-Renders Registered Fields was added to references/plugin-lifecycle.md. Session file archived to .claude/insights/archive/

4 insights added to the skill:

  • 3 security insights → references/security.md
  • 1 lifecycle insight → references/plugin-lifecycle.md

The session file gets archived. And your skill is now smarter than it was an hour ago.

.

.

.

What You Actually Built Here

Let’s step back for a second.

Four steps. That’s all it took:

  1. Convert rules to an indexed skill
  2. Install the insights logger
  3. Build like normal
  4. Review and integrate learnings

But what actually changed?

An infographic flowchart titled "THE EVOLUTION CYCLE" illustrates a continuous five-step process. The first step at the top is a box labeled "1. BUILD (normal workflow) 🔨" with a hammer icon. An arrow points down to "2. LEARN (insights emerge) 💡" with a lightbulb icon. Another arrow points right to "3. CAPTURE (insights logger) 📝" with a notepad icon. A downward arrow leads to "4. REVIEW & CURATE (you pick) 👀" with an eye icon. An arrow points left to "5. SKILL EVOLVES (smarter) 🚀" with a rocket icon. From this fifth step, an arrow points down to a final box that reads "Next session starts with better rules 🔄" with a recycle icon. A long arrow loops from this final box back to the first "1. BUILD" step, completing the cycle.

You’re no longer maintaining documentation. You’re growing a knowledge base.

Every correction you make—every “actually, do it this way instead” moment, every insight from debugging at 2am—the system captures it. You review it. The good stuff evolves your skill. Your next session starts with rules that reflect what you actually learned, not what you thought you knew when you started.

The gap between your experience and your documentation? It closes.

That mistake I mentioned at the beginning—Claude repeating an error I’d already corrected? It doesn’t happen anymore. Because the correction made it into my Claude Code rules. Automatically. As part of my normal workflow.

Your Charmander evolved into Charizard.

And it keeps evolving.

.

.

.

Your Turn

If you’ve been cramming rules into CLAUDE.md—or worse, keeping them in your head and hoping for the best—try this process on your next project.

Start with whatever rules you have. Even messy ones. (Especially messy ones, honestly.)

Convert them to an indexed skill. Install the insights logger. Build for a few sessions. Then review your insights folder.

You’ll be surprised at what Claude captured. And you’ll be amazed at how much smarter your rules become when they’re allowed to learn alongside you.

What project are you going to evolve first?

Go build it.

Now.

12 min read The Art of Vibe Coding, Claude, Vibe Coding

Stop Arguing With Your AI. Start Showing It What You See.

Imagine trying to teach someone to cook over the phone.

You’re walking them through your grandmother’s pasta recipe—the one with the garlic that needs to be just golden, not brown. You describe every step perfectly. The timing. The technique. The little flip of the wrist when you toss the noodles.

And then they say: “It’s burning. What do I do?”

Here’s the thing: you can’t help them. Not really. Because you can’t see the pan. You can’t see how high the flame is. You can’t see that they accidentally grabbed the chili flakes instead of oregano. All you have is their panicked description and your best guess about what might be going wrong.

This, my friend, is exactly what happens when you ask Claude Code to fix a bug.

(Stay with me here.)

.

.

.

The Merry-Go-Round Nobody Enjoys

You’ve been on this ride before. I know you have.

You describe the bug to Claude. Carefully. Thoroughly. You even add screenshots and error messages because you’re a good communicator, dammit.

Claude proposes a fix.

You try it.

It doesn’t work.

So you describe the bug again—this time with more adjectives and maybe a few capitalized words for emphasis. Claude proposes a slightly different fix. Still broken. You rephrase. Claude tries another angle. Round and round we go.

This is the debugging merry-go-round, and nobody buys tickets to this ride on purpose.

The instinct—the very human instinct—is to blame the AI.

  • “Claude isn’t smart enough for this.”
  • “Maybe I need a different model.”
  • “Why can’t it just SEE what’s happening?”

That last one?

That’s actually the right question.

Just not in the way you think.

Here’s what I’ve learned after spending more time than I’d like to admit arguing with AI about bugs: Claude almost never fails because it lacks intelligence. It fails because it lacks visibility.

Think about what you have access to when you’re debugging. Browser dev tools. Console logs scrolling in real-time. Network requests you can inspect. Elements that highlight when you hover. The actual, living, breathing behavior playing out on your screen.

What does Claude have?

The code. Just the code.

That’s it.

An infographic titled "THE VISIBILITY GAP" compares the debugging experience of a human developer ("WHAT YOU SEE" with an eyes emoji) to that of an AI model ("WHAT CLAUDE SEES" with a brain emoji). The left column, for the developer, has a list of six items with green checkmarks: "Browser dev tools", "Console logs in real-time", "Network requests", "Elements highlighting", "Actual behavior on screen", and "The sequence of events". The right column, for Claude, shows a red 'X' and the phrase "Just the code" for every single one of these six points. A thick navy line separates the two columns. Below this comparison, a horizontal bar separates a final summary section with two pill-shaped callout boxes. The left green box says "YOU: Full visibility" with a magnifying glass icon, and the right red-accented box says "CLAUDE: Reading with a blindfold" with a blindfold icon. The background is a light off-white, and the overall style is clean and minimalist.

You’re asking a brilliant chef to fix your burning pasta—but they can only read the recipe card. They can’t see the flame. They can’t smell the smoke. They’re working with incomplete information and filling in the gaps with educated guesses.

Sometimes those guesses are right. (Claude is genuinely brilliant at guessing.)

Most of the time? Merry-go-round.

.

.

.

The Two Bugs That Break AI Every Time

After countless Claude Code debugging sessions—some triumphant, many humbling—I’ve noticed two categories that consistently send AI spinning:

The Invisible State Bugs

React’s useEffect dependencies.

Race conditions. Stale closures. Data that shapeshifts mid-lifecycle like some kind of JavaScript werewolf. These bugs are invisible in the code itself. You can stare at the component for hours (ask me how I know) and see nothing wrong. The bug only reveals itself at runtime—in the sequence of events, the timing of updates, the order of renders.

It’s happening in dimensions Claude can’t perceive.

The “Wrong Address” Bugs

CSS being overridden by inline JavaScript. WordPress functions receiving unexpected null values from somewhere upstream. Error messages that point to line 7374 of a core file—not your code, but code three function calls removed from the actual problem.

The error exists.

But the source? Hidden in cascading calls, plugin interactions, systems talking to systems.

Claude can’t solve either category by reading code alone.

So what do we do?

We give Claude eyes.

(I told you to stay with me. Here’s where it gets good.)

.

.

.

Method 1: Turn Invisible Data Into Evidence Claude Can Actually See

Let me walk you through a real example.

Because theory is nice, but showing you what this looks like in practice? That’s the good stuff.

I had a Products Browser component. Simple filtering and search functionality—the kind of thing you build in an afternoon and then spend three days debugging because life is like that sometimes.

Each control worked beautifully in isolation:

Products Browser interface showing a search for "apple" returning 3 matching results: Apple fruit priced at $1.99, Apple Airpods at $129.99, and Apple MacBook Pro at $1999.99. The status shows "Ready - products: 100 · view: 3"

Search for “apple” → Three results. Beautiful.

Products Browser interface with category filter set to "laptops" displaying 5 laptop products including MacBook Pro, Asus Zenbook, Huawei Matebook X Pro, Lenovo Yoga 920, and Dell XPS 13. Status shows "Ready - products: 100 · view: 5"

Filter by “laptops” → Five results. Chef’s kiss.

But combine them?

Products Browser showing broken behavior when combining search term "apple" with category filter "laptops". Results incorrectly display Apple fruit and Apple Airpods alongside MacBook Pro, ignoring the laptops-only filter

Search “apple” + category “laptops” → Broken. The filter gets completely ignored, like I never selected it at all.

Classic React hook dependency bug.

If you’re experienced with React, you spot this pattern in your sleep. But if you’re newer to the framework—or if you vibe-coded this component and touched a dozen files before realizing something broke—you’re stuck waiting for Claude to get lucky.

I spent three rounds asking Claude to fix it. Each fix addressed a different theoretical cause. None worked.

That’s when I stopped arguing and started instrumenting.

An infographic titled "METHOD 1: THE LOGGING WORKFLOW" shows a four-step flowchart with navy blue boxes and arrows on a light background. The first box, labeled "STEP 1", contains the text "Ask for logging (not fix)" with the caption below it: "Add logging" not "fix this". An arrow points right to the second box. The second box, labeled "STEP 2", contains the text "Run test + copy console" with the caption: You become the bridge. An arrow points right to the third box. The third box, labeled "STEP 3", contains the text "Feed logs back to Claude" with the caption: Evidence in, insight out. An arrow points right to the fourth and final box. The fourth box, labeled "RESULT", contains the text "Claude SEES the problem" with the caption: One-shot fix (finally!).

Step 1: Ask Claude to Add Logging (Not Fixes)

Instead of another “please fix this” prompt, I asked Claude to help me see what was happening:

Terminal command showing user request to Claude: "I can search products by keywords or filter them by category, but both don't work together at the same time. Add logging to track data changes."

Notice what I didn’t say: “Fix this bug.”

What I said: “Add logging to track data changes.”

This is the mindset shift that changes everything.

Claude added console.log statements to every useEffect that touched the view state:

Claude Code diff view showing 37 lines added to src/App.tsx, adding console.log statements to useEffect hooks that track triggers like 'products loaded', 'query changed', and 'filter changed' with their corresponding state values

Each log captured which effect triggered, what the current values were, and what got computed. Basically, Claude created a running transcript of everything happening inside my component’s brain.

Step 2: Run the Test and Capture What You See

I opened the browser, selected “laptops” from the category filter, then typed “apple” in the search box.

Split screen showing Products Browser on the left with search "apple" and category "laptops" selected, and Chrome DevTools console on the right displaying multiple useEffect log entries showing the filter and search triggers firing

The console lit up like a Christmas tree of evidence.

Step 3: Feed the Logs Back to Claude

Here’s where the magic happens. I copied that console output—all of it—and pasted it directly into Claude:

Terminal showing user pasting console logs to Claude, displaying useEffect:filters and useEffect:search log entries that reveal each search keystroke triggers a reset of category, minRating, maxPrice, and sort to DEFAULTS

And Claude? Claude saw everything:

Claude's analysis of the logs explaining the bug: the category filter was ignored because applySearchOnly resets category back to "all", and the search effect ran last so it "won" and overwrote the filter results. Proposes fix using single useMemo

Claude found the bug immediately.

The logs revealed the whole story: when I selected a category, useEffect:filters fired and correctly filtered the products. But then when I typed in the search box, useEffect:search fired—and it ran against the full product list, completely ignoring the category filter.

The search effect was overwriting the filter results.

Last effect wins. (JavaScript, you beautiful chaos gremlin.)

Claude proposed the fix: replace multiple competing useEffect hooks with a single useMemo that applies all transforms together:

const view = useMemo(() => {
  return transformProducts(products, {
    query,
    category,
    minRating,
    maxPrice,
    sortKey,
    sortDir,
  });
}, [products, query, category, minRating, maxPrice, sortKey, sortDir]);

One attempt. Bug fixed.

The difference between “Claude guessing for 20 minutes” and “Claude solving it instantly” was 30 seconds of logging.

That’s not hyperbole. That’s just… math.

.

.

.

Method 2: Map the Problem Before Anyone Tries to Solve It

The second method works for a different beast entirely—the kind of bug where even the error message is lying to you.

Here’s a WordPress error that haunted me for hours:

Deprecated: strpos(): Passing null to parameter #1 ($haystack) of type string 
is deprecated in /var/www/html/wp-includes/functions.php on line 7374

Warning: Cannot modify header information - headers already sent by 
(output started at /var/www/html/wp-includes/functions.php:7374) 
in /var/www/html/wp-includes/option.php on line 1740

If you’ve done any WordPress development, you recognize this particular flavor of suffering.

The error points to core WordPress files—not your code. Something, somewhere, is passing null to a function that expects a string. But where? The error message is about as helpful as a fortune cookie that just says “bad things happened.”

I’d made changes to several theme files.

Any one of them could be the culprit.

And the cascading nature of WordPress hooks meant the error could originate three or four function calls before the actual crash.

After a few rounds of Claude trying random fixes (bless its heart), I tried something completely different.

The Brainstorming Prompt That Changes Everything

Terminal showing user pasting WordPress deprecation errors (strpos and str_replace warnings about null parameters) and requesting: "Let's brainstorm ways to fix this. Use ASCII diagrams."

Instead of “fix this,” I asked Claude to brainstorm debugging approaches—and to visualize them with ASCII diagrams.

(I know. ASCII diagrams. In 2025. But stay with me, because this is where Claude Code debugging gets genuinely interesting.)

Claude Maps the Error Chain

Claude started by analyzing the flow of the problem:

Claude's ASCII diagram titled "ERROR CHAIN" showing data flow from Theme Code through WordPress Core (functions.php lines 7374 and 2196) to PHP Engine, with null values being passed that trigger strpos() and str_replace() deprecated warnings

The diagram showed exactly what was happening: some theme code was passing null to WordPress core functions, which then passed that null to PHP string functions, which threw the deprecation warning.

But which theme code? Claude identified the suspect locations:

Claude's ASCII diagram titled "SUSPECT LOCATIONS" listing four possible sources of null values: filter callbacks returning null, options/meta returning null from get_option(), admin menu/page registration with null titles, and wp_safe_redirect with null URL

Four possible sources.

Each with code examples showing what the problematic pattern might look like.

This is Claude thinking out loud, visually. And it’s incredibly useful for Claude Code debugging because now we’re not guessing—we’re investigating.

Multiple Debugging Strategies (Not Just One)

Rather than jumping to a single fix and hoping, Claude laid out several approaches:

Claude's ASCII diagram showing "APPROACH OPTIONS" with four debugging strategies: A) Search for all filter callbacks, B) Find WordPress functions using strpos internally, C) Instrument error with debug_backtrace(), D) Search for common patterns
  • Option A: Search all filter callbacks for missing return statements.
  • Option B: Find which WordPress functions use strpos internally.
  • Option C: Add debug_backtrace() at the error point to trace the caller.
  • Option D: Search for common patterns like wp_redirect with variables.

Four different angles of attack.

This is what systematic debugging looks like—and it’s exactly what you need when you’re stuck in the merry-go-round.

Claude Does Its Homework

Here’s where Opus 4.5 surprised me.

Instead of settling on the first approach, it validated its theories by actually searching the codebase:

Claude Code executing multiple search commands: searching for wp_redirect, add_filter, get_option patterns, and reading specific files like AdminMenu.php and MembershipPlans.php

It searched for wp_redirect calls, add_filter patterns, get_option usages—systematically eliminating possibilities like a detective working through a suspect list.

Then it updated its diagnosis based on what it found:

Claude's updated ASCII diagram showing the probable call chain: Something returns null path, which goes to wp_normalize_path(), which then causes the strpos() error. Suspects listed: wp_enqueue with null source, file_exists on null path, filter returning null instead of path

The investigation narrowed.

The error was coming from path-handling functions—something was returning a null path where a string was expected.

The Summary That Actually Leads Somewhere

Claude concluded with a clear summary of everything we now knew:

Claude's Investigation Summary showing three identified errors receiving NULL values, the functions they're called during (script/style enqueueing, admin page rendering, template loading), and noting that the original fix was correct but there's a second source of null values

And multiple approaches to fix it, ranked by how surgical they’d be:

Claude's "Possible Approaches" diagram showing four options: A) Add debug backtrace to find exact source, B) Wrap all path-sensitive functions with null checks, C) Check FluentCart plugin for similar issues, D) Disable theme components one by one

Did it work?

First attempt. Approach A—adding a debug backtrace—immediately revealed a function in FluentCartBridge.php that was returning null when $screen->id was empty.

One additional null check.

Bug gone.

All those rounds of failed attempts? They were doomed from the start because Claude was guessing blindly. Once it could see the error chain visually—once it had a map instead of just a destination—the solution was obvious.

.

.

.

Why This Actually Works (The Part Where I Get a Little Philosophical)

Both of these methods work because they address the same fundamental gap in Claude Code debugging: AI doesn’t fail because it’s not smart enough. It fails because it can’t see what you see.

When you’re debugging, you have browser dev tools, console logs, network requests, and actual behavior unfolding on your screen. Claude has code files.

That’s it.

It’s working with incomplete information and filling the gaps with educated guesses.

Here’s the mindset shift that changed everything for me:

👉 Stop expecting AI to figure it out. Start helping AI see what you see.

You become the eyes. AI becomes the analytical brain that processes patterns and proposes solutions based on the evidence you feed it.

It’s a collaboration. A partnership. Not a vending machine where you insert a problem and expect a solution to drop out.

A flowchart infographic titled "WHICH METHOD SHOULD YOU USE?". Below the title, a question asks "Bug won't die?". An arrow points down to a central box labeled "What kind of bug is it?". From this box, two arrows branch out.

The left branch leads to a box titled "STATE/TIMING" with bullet points: "• 🧠 React hooks", "• ⏱️ Race conditions", "• 🔄 Data flow", "• 🗄️ Stale closures". Below this box, an arrow points to a final orange-accented box labeled "✅ METHOD 1: ADD LOGGING". The description reads "Turn invisible data into visible evidence 👀" with a monospaced code snippet console.log().

The right branch leads to a box titled "CASCADING/WRONG ADDRESS" with bullet points: "• 📍 Error points to wrong file", "• 🔀 Multiple possible sources", "• 🔌 Plugin/system interactions". Below this box, an arrow points to a final orange-accented box labeled "✅ METHOD 2: ASCII BRAINSTORM". The description reads "Map before you solve 🧠" with monospaced code snippets diagram.txt and diagram.txt.

The overall aesthetic is clean with navy blue borders and text, orange accents for the result boxes, and a light gray background.

When to Use Logging

Add logs when the bug involves:

  • Data flow and state management
  • Timing issues and race conditions
  • Lifecycle problems in React, Vue, or similar frameworks
  • Anything where the sequence of events matters

The logs transform invisible runtime behavior into visible evidence.

React’s useEffect, state updates, and re-renders happen in milliseconds—too fast to trace mentally, but perfectly captured by console.log. Feed those logs to Claude, and suddenly it can see the movie instead of just reading the script.

When to Use ASCII Brainstorming

Use the brainstorming approach when:

  • Error messages point to the wrong location
  • The bug could originate from multiple places
  • You’ve already tried the obvious fixes (twice)
  • The problem involves cascading effects across systems

Asking Claude to brainstorm with diagrams forces it to slow down and map the problem systematically. It prevents the merry-go-round where AI keeps trying variations of the same failed approach. By exploring multiple angles first, you often find the root cause on the very first real attempt.

.

.

.

The Line Worth Tattooing Somewhere (Metaphorically)

Here’s what I want you to take away from all of this:

Don’t argue with AI about what it can’t see. Show it.

The next time Claude can’t solve a bug after a few rounds, resist the urge to rephrase your complaint. Don’t add more adjectives. Don’t type in all caps. (I know. I KNOW. But still.)

Instead, ask yourself: “What am I seeing that Claude isn’t?”

Then find a way to bridge that gap—through logs, through diagrams, through screenshots, through any method that gives AI the visibility it needs to actually help you.

.

.

.

Your Next Steps (The Warm and Actionable Version)

For state and timing bugs:

  1. Pause. Take a breath. Step off the merry-go-round.
  2. Ask Claude to add logging that tracks the data flow.
  3. Run your test, copy the console output, paste it back to Claude.
  4. Watch Claude solve in one shot what it couldn’t guess in twenty.

For complex, cascading bugs:

  1. Paste the error message (yes, the whole confusing thing).
  2. Add: “Let’s brainstorm ways to debug this. Use ASCII diagrams.”
  3. Let Claude map the problem before it tries to solve it.
  4. Pick the most surgical approach from the options it generates.

That bug that’s been driving you up the wall? The one Claude keeps missing?

Give it eyes.

Then watch it solve what seemed impossible.

You’ve got this. And now Claude does too.