◉CLAUDE LABJP
●2.1.301 — Adds the vim % motion, LaTeX math rendering in the VS Code panel, and a retry-watchdog limit for usage-limit waits (10/15)●2.1.299 — Conversations over 200K tokens left idle about 54 minutes get compacted; MCP allow rules now match only the server they name●SONNET 4.5 — Retires on the Claude API on 11/30, 45 days left. Migrate to Sonnet 5.5●WINDOWS — Reports say hooks break silently only on Japanese-locale Windows; check the character encoding first●FAST MODE — Opus 5.5 fast mode is out of research preview and no longer needs the beta header (10/15)●NEW — I Put a Ten-Line Promise File at the To…●2.1.301 — Adds the vim % motion, LaTeX math rendering in the VS Code panel, and a retry-watchdog limit for usage-limit waits (10/15)●2.1.299 — Conversations over 200K tokens left idle about 54 minutes get compacted; MCP allow rules now match only the server they name●SONNET 4.5 — Retires on the Claude API on 11/30, 45 days left. Migrate to Sonnet 5.5●WINDOWS — Reports say hooks break silently only on Japanese-locale Windows; check the character encoding first●FAST MODE — Opus 5.5 fast mode is out of research preview and no longer needs the beta header (10/15)●NEW — I Put a Ten-Line Promise File at the To…
Articles/Claude Code
⟐ Claude Code/2026-05-02Advanced

7 Daily Decisions in Solo Development with Claude Code — A Year of Lessons

When I started using Claude Code for solo development, seven recurring decision points kept tripping me up. After a year of running, breaking, and fixing my workflow, here is the criteria I have settled on — including the reasoning behind each judgment call.

claude-code132solo-devdecision-patternsworkflow41best-practices4

Every Night I Asked Myself: Did I Make the Right Call Today?

I have been doing solo development for twelve years, but in the first few months after adopting Claude Code, I made a habit of replaying the day's decisions every night before sleep. The question was always the same: did I make the right call when I delegated this task, or should I have done it myself?

Decisions branched constantly. Should I split this work into sub-agents, or is it faster to push through in the main context? Should I stop in Plan mode here, or let it run and just review the result? Should the tests come before or after the implementation? Each one looks like a matter of taste from the outside, but the wrong call meant chasing bugs at 2 a.m.

This article shares seven decision points I now have a clear answer for, after a year of getting them wrong, recovering, and slowly building a personal rulebook. These are not textbook answers; they are the working judgments of a solo developer who has been burned a few times.

Decision 1 — Delegate to Sub-Agents, or Think It Through in Main?

Sub-agents are powerful, but splitting every task is a trap. When I over-delegate, the holistic view that lives in the main context simply does not transfer, and the sub-agents return implementations that contradict each other.

The criterion I use today is simple: delegate when the input and output have a clean boundary. Tasks like "write five test cases for this function" or "search this directory for code that looks similar to X" are independently evaluable, and sub-agents excel at them.

Tasks that involve design judgment or whole-system trade-offs stay in the main context. "Decide the refactoring strategy" or "choose which layer this feature belongs in" requires understanding the codebase as a whole and recalling past decisions. The main agent, with all its accumulated context, gives noticeably better answers.

I learned this the hard way. One day I tried to rewrite an authentication layer by splitting research, design, implementation, and testing across four sub-agents. The research agent recommended JWTs as the standard. The design agent decided session cookies fit the app better. The implementation agent merged the two halfheartedly. The fragmented context produced a fragmented result.

Decision 2 — Stop in Plan Mode, or Let It Run?

Plan mode is one of my favorite features, but using it for every task breaks the rhythm of development. I now invoke Plan mode only when at least one of the following holds:

  1. The change spans three or more files
  2. It touches database schema or an API contract
  3. The domain has bitten me with bad judgment calls before
  4. The blast radius of failure is high (payments, auth, persistent data)

For everything else — style tweaks, copy changes, adding a small new file — I skip Plan mode and let Claude Code run. Reviewing a plan for every minor change creates context-switching overhead that adds up.

The compensating discipline is smaller commits, so that I can review changes after the fact through diffs. It is a trade-off between reviewing before versus after, and the right answer depends on what is at stake.

Decision 3 — TDD First, or Implementation First?

Test-driven development is beautiful in theory, but in solo development I find it is not always optimal.

I use TDD when the specification is fixed and the input/output mapping is logically derivable: validation functions, data transformations, business rule implementations. Writing tests first is faster and produces sturdier code.

For UI components, API handlers, and external service integrations, I implement first because the right interface only becomes clear after I see the code in motion. Once I have something working, I lock the behavior in with regression tests.

I also phrase the request to Claude Code differently. For the first case: "Please write tests for this spec, then implement the minimum to pass them." For the second: "Please write the smallest working implementation. After I verify behavior, I will add regression tests." Vaguely saying "also write tests" produces tightly coupled implementation and tests, which becomes painful when the spec evolves.

Decision 4 — How Far Do You Trust AI Code Review?

This question is especially heavy for solo developers. With no teammate, the temptation to lean on AI review is strong. I do ask Claude Code to review my code often, but I draw a clear line.

Auto-fix is fine for low-judgment issues: coding style, unused variables, obvious logic bugs (off-by-one, missing null checks). Letting the AI find and fix these saves time.

I always decide myself on design judgments, naming, error handling strategy, and performance trade-offs. AI review is treated as a hint set — "here is a perspective you might have missed" — but the final call is mine.

Without this discipline, six months later I could not explain why my own codebase looks the way it does. Long-term maintenance is my responsibility, and I want to be able to defend every meaningful choice.

Decision 5 — Refactor Alongside the Feature, or Separately?

Asking Claude Code to "also refactor while you're at it" produces commits that mix feature changes with refactoring, and reading the diff later becomes a nightmare. I learned this lesson several times before it stuck.

My current rule is to refactor in a dedicated commit before the feature change. I tell Claude Code clearly: "Reshape this function to make the upcoming feature easier to add — without changing its behavior." If tests already exist, I confirm they still pass before and after.

The feature change comes as a separate commit. If I later need to revert the feature, the refactoring stays. If I decide the refactoring went too far, the feature change is unaffected.

It feels like extra ceremony, but for code that I will maintain for years, the separation pays off.

Decision 6 — How Verbose Should Comments Be?

Left to its own devices, Claude Code writes overly polite comments. Lines like // increment this variable by 1 clog the file and make code harder to read.

The prompt I now use is: "Comments should answer 'why', not 'what'." Anything obvious from reading the code itself does not need a comment; only intent and background that cannot be recovered from the code should be left behind.

I do, however, ask for comments that capture:

  • The trade-offs that were on my mind when I wrote this
  • Why I rejected the alternative options
  • Side effects that future-me should watch for
  • Cross-references to related code that influences this one

Structured comments — JSDoc, docstrings — are a separate matter. I gladly let Claude Code generate those, because I want to read type and parameter information through editor hover later.

Decision 7 — Hand the Error to Claude Code, or Read It Myself?

When something breaks, the temptation to drop the error in chat and say "fix this" is real. But there is a branch here too.

Errors I delegate are concrete and locally scoped. "Property 'foo' does not exist on type 'Bar'" or "Cannot find module 'baz'" — Claude Code resolves these with one round trip.

Errors I read myself are abstract or span multiple systems. "Internal Server Error" or "The operation could not be completed" rarely lead to the right fix when handed to AI alone, because the symptom and the cause live in different places.

The scariest pattern is when the AI proposes a symptom-suppressing fix: adding a null check that swallows the error, wrapping the call in try-catch and logging nothing, marking the test as skipped. The error vanishes from the output, but the root cause remains, waiting to bite later.

For non-trivial errors I always start with: "Please explain three possible root causes for this error. I'll decide on the fix." Once I know which cause is real, I let Claude Code implement the fix.

Claude Code Is a Partner, Not a Replacement

The seven branches above all share the same underlying belief: Claude Code is not something that thinks instead of me — it is a partner that accelerates my thinking.

Delegate boldly where delegation is right. Decide deliberately where judgment matters. When that line blurs, the codebase loses coherence and six months later you cannot maintain it. When that line stays sharp, a single solo developer can run multiple projects in parallel without losing quality.

I still face these branches every day, and the criteria above are still being updated. Three months from now they may look different. But putting them into words helps future-me, and I hope it helps anyone in a similar position.

If tomorrow you catch yourself thinking "wait, this is a different call than yesterday," that small awareness is, I believe, what growth as a solo developer actually looks like.

Share

Thank You for Reading

Claude Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.

  • ✦Copy-paste ready implementation code
  • ✦New advanced guides published daily
  • ✦$5/mo or $10 for lifetime access
View Membership →

If you found this article helpful, a small tip ($1.50) would mean a lot to us. Your support helps keep this site ad-free and covers server and hosting costs.

Related Articles

⟐ Claude Code2026-05-02
Stop the 'old_string is not unique' Error in Claude Code's Edit Tool — A Practical Rewrite Strategy
When Claude Code's Edit tool throws 'old_string is not unique in the file', the root cause is usually that the prompt didn't guarantee a uniquely identifiable target. Here's how to design rewrites that actually stick.
⟐ Claude Code2026-08-28
A small script that catches invisible characters in plugin names before you install
Control characters and zero-width characters hiding in plugin or skill names are invisible in a terminal listing. I built six deliberately confusing names, compared what ls actually shows, and wrote a short check you can run before installing anything — plus an honest note on what that check misses.
⟐ Claude Code2026-08-26
I decide the prompt cache TTL by where I come back to, not how long I was away
Claude Code v2.1.242 added promptCacheTtl and subagentPromptCacheTtl. Whether the one-hour cache pays off depends on returning to the same directory and the same git state, not on how long the break was. Here is the order I check things in.