Files
gh-basher83-lunar-claude-pl…/skills/multi-agent-composition/anti-patterns/common-mistakes.md
2025-11-29 18:00:36 +08:00

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