430 lines
13 KiB
Markdown
430 lines
13 KiB
Markdown
# Common Anti-Patterns in Claude Code
|
|
|
|
**Critical mistakes to avoid** when building with Claude Code components.
|
|
|
|
## Table of Contents
|
|
|
|
- [The Fatal Five](#the-fatal-five)
|
|
- [1. Converting All Slash Commands to Skills](#1-converting-all-slash-commands-to-skills)
|
|
- [2. Using Skills for One-Off Tasks](#2-using-skills-for-one-off-tasks)
|
|
- [3. Skipping the Primitive (Not Mastering Prompts First)](#3-skipping-the-primitive-not-mastering-prompts-first)
|
|
- [4. Forcing Single Agents to Do Too Much (Context Explosion)](#4-forcing-single-agents-to-do-too-much-context-explosion)
|
|
- [5. Using Sub-Agents When Context Matters](#5-using-sub-agents-when-context-matters)
|
|
- [Secondary Anti-Patterns](#secondary-anti-patterns)
|
|
- [6. Confusing MCP with Internal Orchestration](#6-confusing-mcp-with-internal-orchestration)
|
|
- [7. Forgetting the Core Four](#7-forgetting-the-core-four)
|
|
- [8. No Observability (Can't Measure, Can't Improve)](#8-no-observability-cant-measure-cant-improve)
|
|
- [9. Nesting Sub-Agents](#9-nesting-sub-agents)
|
|
- [10. Over-Engineering Simple Problems](#10-over-engineering-simple-problems)
|
|
- [11. Agent Dependency Coupling](#11-agent-dependency-coupling)
|
|
- [Anti-Pattern Detection Checklist](#anti-pattern-detection-checklist)
|
|
- [Recovery Strategies](#recovery-strategies)
|
|
- [Remember](#remember)
|
|
|
|
## The Fatal Five
|
|
|
|
These are the most common and damaging mistakes engineers make:
|
|
|
|
### 1. Converting All Slash Commands to Skills
|
|
|
|
**The Mistake:**
|
|
> "There are a lot of engineers right now that are going all in on skills. They're converting all their slash commands to skills. I think that's a huge mistake."
|
|
|
|
**Why it's wrong:**
|
|
|
|
- Skills are for **repeat problems that need management**, not simple one-off tasks
|
|
- Slash commands are the **primitive foundation** - you need them
|
|
- You're adding unnecessary complexity and context overhead
|
|
- Skills should **complement** slash commands, not replace them
|
|
|
|
**Correct approach:**
|
|
|
|
- Keep slash commands for simple, direct tasks
|
|
- Only create a skill when you're **managing a problem domain** with multiple related operations
|
|
- Have a strong bias toward slash commands
|
|
|
|
**Example:**
|
|
|
|
- ❌ Wrong: Create a skill for generating a single commit message
|
|
- ✅ Right: Use a slash command for one-off commit messages; create a skill only if managing an entire git workflow system
|
|
|
|
---
|
|
|
|
### 2. Using Skills for One-Off Tasks
|
|
|
|
**The Mistake:**
|
|
> "If you can do the job with a sub-agent or custom slash command and it's a one-off job, do not use a skill. This is not what skills are for."
|
|
|
|
**Why it's wrong:**
|
|
|
|
- Skills have overhead (metadata, loading, management)
|
|
- One-off tasks don't benefit from reuse
|
|
- You're over-engineering a simple problem
|
|
|
|
**Signal words that indicate you DON'T need a skill:**
|
|
|
|
- "One time"
|
|
- "Quick"
|
|
- "Just need to..."
|
|
- "Simple task"
|
|
|
|
**Correct approach:**
|
|
|
|
- Use a slash command for one-off tasks
|
|
- If you find yourself doing it repeatedly (3+ times), **then** consider a skill
|
|
|
|
**Example:**
|
|
|
|
- ❌ Wrong: Build a skill to create one UI component
|
|
- ✅ Right: Use a slash command; upgrade to skill only after creating components repeatedly
|
|
|
|
---
|
|
|
|
### 3. Skipping the Primitive (Not Mastering Prompts First)
|
|
|
|
**The Mistake:**
|
|
> "When you're starting out, I always recommend you just build a prompt. Don't build a skill. Don't build a sub-agent. Don't build out an MCP server. Keep it simple. Build a prompt."
|
|
|
|
**Why it's wrong:**
|
|
|
|
- If you don't master prompts, you can't build effective skills
|
|
- Everything is prompts in the end (tokens in, tokens out)
|
|
- You're building on a weak foundation
|
|
|
|
**The fundamental truth:**
|
|
> "Do not give away the prompt. The prompt is the fundamental unit of knowledge work and of programming. If you don't know how to build and manage prompts, you will lose."
|
|
|
|
**Correct approach:**
|
|
|
|
1. Always start with a prompt/slash command
|
|
2. Master the primitive first
|
|
3. Scale up only when needed
|
|
4. Build from the foundation upward
|
|
|
|
**Example:**
|
|
|
|
- ❌ Wrong: "I'm going to start by building a skill because it's more advanced"
|
|
- ✅ Right: "I'll write a prompt first, see if it works, then consider scaling to a skill"
|
|
|
|
---
|
|
|
|
### 4. Forcing Single Agents to Do Too Much (Context Explosion)
|
|
|
|
**The Mistake:**
|
|
> "200k context window is plenty. You're just stuffing a single agent with too much work, just like your boss did to you at your last job. Don't force your agent to context switch."
|
|
|
|
**Why it's wrong:**
|
|
|
|
- Context explosion leads to poor performance
|
|
- Agent loses focus across too many unrelated tasks
|
|
- You're treating your agent like an overworked employee
|
|
- Results degrade as context window fills
|
|
|
|
**Correct approach:**
|
|
|
|
- Create **focused agents** with single purposes
|
|
- Use **sub-agents** for parallel, isolated work
|
|
- **Delete agents** when their task is complete
|
|
- Treat agents as **temporary, deletable resources**
|
|
|
|
**Example:**
|
|
|
|
- ❌ Wrong: One agent that reads codebase, writes tests, updates docs, and deploys
|
|
- ✅ Right: Four focused agents - one for reading, one for tests, one for docs, one for deployment
|
|
|
|
---
|
|
|
|
### 5. Using Sub-Agents When Context Matters
|
|
|
|
**The Mistake:**
|
|
> "Sub-agents isolate and protect your context window... But of course, you have to be okay with losing that context afterward because it will be lost."
|
|
|
|
**Why it's wrong:**
|
|
|
|
- Sub-agent context is **isolated**
|
|
- You can't reference sub-agent work later without resumable sub-agents
|
|
- You lose the conversation history
|
|
|
|
**Correct approach:**
|
|
|
|
- Use sub-agents when:
|
|
- You need **parallelization**
|
|
- Context **isolation** is desired
|
|
- You're okay **losing context** after
|
|
- Use main conversation when:
|
|
- You need context later
|
|
- Work builds on previous steps
|
|
- Conversation continuity matters
|
|
|
|
**Example:**
|
|
|
|
- ❌ Wrong: Use sub-agent for research task, then try to reference findings 10 prompts later
|
|
- ✅ Right: Do research in main conversation if you'll need it later; use sub-agent only for isolated batch work
|
|
|
|
---
|
|
|
|
## Secondary Anti-Patterns
|
|
|
|
### 6. Confusing MCP with Internal Orchestration
|
|
|
|
**The Mistake:** Using MCP servers for internal workflows instead of external integrations.
|
|
|
|
**Why it's wrong:**
|
|
> "To me, there is very very little overlap here between agent skills and MCP servers. These are fully distinct."
|
|
|
|
**Clear rule:** External = MCP, Internal orchestration = Skills
|
|
|
|
**Example:**
|
|
|
|
- ❌ Wrong: Build MCP server to orchestrate your internal test suite
|
|
- ✅ Right: Build a skill for internal test orchestration; use MCP to connect to external CI/CD service
|
|
|
|
---
|
|
|
|
### 7. Forgetting the Core Four
|
|
|
|
**The Mistake:** Not monitoring Context, Model, Prompt, and Tools at critical moments.
|
|
|
|
**Why it's wrong:**
|
|
> "Context, model, prompt, tools. Do you know what these four leverage points are at every critical moment? This is the foundation."
|
|
|
|
**Correct approach:**
|
|
|
|
- Always know the state of the Core Four for your agents
|
|
- Monitor context window usage
|
|
- Understand which model is active
|
|
- Track what prompts are being used
|
|
- Know what tools are available
|
|
|
|
---
|
|
|
|
### 8. No Observability (Can't Measure, Can't Improve)
|
|
|
|
**The Mistake:** Running agents without logging, monitoring, or hooks.
|
|
|
|
**Why it's wrong:**
|
|
> "When it comes to agentic coding, observability is everything. If you can't measure it, you can't improve it. And if you can't measure it, you can't scale it."
|
|
|
|
**Correct approach:**
|
|
|
|
- Implement hooks for logging (post-tool-use, stop)
|
|
- Track agent performance and costs
|
|
- Monitor what files are read/written
|
|
- Capture chat transcripts
|
|
- Review agent behavior to improve prompts
|
|
|
|
---
|
|
|
|
### 9. Nesting Sub-Agents
|
|
|
|
**The Mistake:** Trying to spawn sub-agents from within other sub-agents.
|
|
|
|
**Why it's wrong:**
|
|
|
|
- Hard limit in Claude Code architecture
|
|
- Prevents infinite nesting
|
|
- Not supported by the system
|
|
|
|
**The restriction:**
|
|
> "Sub-agents cannot spawn other sub-agents. This prevents infinite nesting while still allowing Claude to gather necessary context."
|
|
|
|
**Correct approach:**
|
|
|
|
- Use orchestrator pattern instead
|
|
- Flatten your agent hierarchy
|
|
- Have main agent create all sub-agents
|
|
|
|
---
|
|
|
|
### 10. Over-Engineering Simple Problems
|
|
|
|
**The Mistake:** Building complex multi-agent orchestration for tasks that could be a single prompt.
|
|
|
|
**Why it's wrong:**
|
|
|
|
- Unnecessary complexity
|
|
- Maintenance burden
|
|
- Slower execution
|
|
- Higher costs
|
|
|
|
**The principle:** Start simple, scale only when needed.
|
|
|
|
**Decision checklist before scaling:**
|
|
|
|
- [ ] Have I tried solving this with a single prompt?
|
|
- [ ] Is this actually a repeat problem?
|
|
- [ ] Will the added complexity pay off?
|
|
- [ ] Am I solving a real problem or just playing with new features?
|
|
|
|
---
|
|
|
|
### 11. Agent Dependency Coupling
|
|
|
|
**The Mistake:** Creating agents that depend on the exact output format of other agents.
|
|
|
|
**Why it's wrong:**
|
|
|
|
- Creates **brittle coupling** between agents
|
|
- Changes to one agent's output **break downstream agents**
|
|
- Makes the system **hard to maintain** and evolve
|
|
- Creates a **hidden dependency graph** that's not explicit
|
|
|
|
**The problem:**
|
|
When Agent B expects Agent A to return data in a specific format (e.g., JSON with specific field names, or markdown with specific structure), you create tight coupling. If Agent A's output changes, Agent B silently breaks.
|
|
|
|
**Warning signs:**
|
|
|
|
- Agents parsing other agents' string outputs
|
|
- Hard-coded field names or output structure assumptions
|
|
- Agents that "expect" data in a certain format without validation
|
|
- No explicit contracts between agents
|
|
|
|
**Correct approach:**
|
|
|
|
**1. Use explicit contracts:**
|
|
|
|
```text
|
|
Agent A prompt:
|
|
"Return JSON with these exact fields: {id, name, status, created_at}"
|
|
|
|
Agent B prompt:
|
|
"You will receive JSON with fields: {id, name, status, created_at}
|
|
Validate the structure before processing."
|
|
```
|
|
|
|
**2. Use structured data formats:**
|
|
|
|
- Define JSON schemas explicitly
|
|
- Document expected fields
|
|
- Validate inputs before processing
|
|
- Handle missing or malformed data gracefully
|
|
|
|
**3. Minimize agent-to-agent communication:**
|
|
|
|
- Prefer orchestrator pattern (main agent coordinates)
|
|
- Pass data through orchestrator, not agent-to-agent
|
|
- Keep sub-agents independent when possible
|
|
|
|
**4. Version your agent contracts:**
|
|
|
|
```text
|
|
Agent output format v2:
|
|
{
|
|
"version": "2.0",
|
|
"data": {...},
|
|
"metadata": {...}
|
|
}
|
|
```
|
|
|
|
**Example:**
|
|
|
|
❌ **Wrong (Brittle Coupling):**
|
|
|
|
```text
|
|
Agent A: "Analyze files and report findings"
|
|
[Returns: "Found 3 issues in foo.py and 2 in bar.py"]
|
|
|
|
Agent B: "Parse Agent A's output and fix the issues"
|
|
[Expects: "Found N issues in X and Y in Z" format]
|
|
```
|
|
|
|
**Problem:** If Agent A changes its output format, Agent B breaks silently.
|
|
|
|
✅ **Right (Explicit Contract):**
|
|
|
|
```text
|
|
Agent A: "Analyze files and return JSON:
|
|
{
|
|
'files_analyzed': [...],
|
|
'findings': [
|
|
{'file': 'foo.py', 'line': 10, 'issue': '...'},
|
|
{'file': 'bar.py', 'line': 20, 'issue': '...'}
|
|
]
|
|
}"
|
|
|
|
Agent B: "You will receive JSON with fields: {files_analyzed, findings}.
|
|
First validate the structure. Then fix each issue in findings array."
|
|
```
|
|
|
|
**Better (Orchestrator Pattern):**
|
|
|
|
```text
|
|
Main Agent:
|
|
1. Spawn Agent A to analyze files
|
|
2. Parse Agent A's JSON output
|
|
3. Transform to format Agent B needs
|
|
4. Spawn Agent B with explicit data structure
|
|
5. Agent B doesn't need to know about Agent A
|
|
```
|
|
|
|
**Best practice:** The orchestrator (main agent) owns the contracts and data transformations. Sub-agents are independent and don't depend on each other's formats.
|
|
|
|
---
|
|
|
|
## Anti-Pattern Detection Checklist
|
|
|
|
Ask yourself these questions:
|
|
|
|
**Before creating a skill:**
|
|
|
|
- [ ] Is this a **repeat problem** that needs **management**?
|
|
- [ ] Have I solved this with a prompt/slash command first?
|
|
- [ ] Am I avoiding the mistake of converting simple commands to skills?
|
|
|
|
**Before using a sub-agent:**
|
|
|
|
- [ ] Do I need **parallelization** or **context isolation**?
|
|
- [ ] Am I okay **losing this context** afterward?
|
|
- [ ] Could this be done in the main conversation instead?
|
|
|
|
**Before using MCP:**
|
|
|
|
- [ ] Is this for **external** data/services?
|
|
- [ ] Am I not confusing this with internal orchestration?
|
|
|
|
**Before scaling to multi-agent orchestration:**
|
|
|
|
- [ ] Have I mastered custom agents first?
|
|
- [ ] Do I have observability in place?
|
|
- [ ] Am I solving a real scale problem?
|
|
|
|
---
|
|
|
|
## Recovery Strategies
|
|
|
|
**If you've fallen into these anti-patterns:**
|
|
|
|
1. **Converted slash commands to skills?**
|
|
- Evaluate each skill: Is it truly a repeat management problem?
|
|
- Downgrade skills that are just one-off tasks back to slash commands
|
|
- Keep your slash command library strong
|
|
|
|
2. **Context explosion in single agent?**
|
|
- Split work across focused sub-agents
|
|
- Use orchestrator pattern for complex workflows
|
|
- Delete agents when tasks complete
|
|
|
|
3. **No observability?**
|
|
- Add hooks immediately (start with stop and post-tool-use)
|
|
- Log chat transcripts
|
|
- Track tool usage
|
|
- Monitor costs
|
|
|
|
4. **Lost in complexity?**
|
|
- Step back to basics: What's the simplest solution?
|
|
- Remove unnecessary abstractions
|
|
- Return to prompts/slash commands
|
|
- Scale up only when proven necessary
|
|
|
|
---
|
|
|
|
## Remember
|
|
|
|
> "Have a strong bias towards slash commands. And then when you're thinking about composing many slash commands, sub-agents or MCPs, think about putting them in a skill."
|
|
>
|
|
> "If you can do the job with a sub-agent or custom slash command and it's a one-off job, do not use a skill."
|
|
>
|
|
> "Context, model, prompt, tools. This never goes away."
|
|
|
|
**The golden path:** Start with prompts → Scale thoughtfully → Add observability → Manage complexity
|