Part 3 of 4 in the "Escaping the Dumbzone" series
In Part 2, we covered subagents—how to isolate exploration and keep your main context clean.
But here's another problem: you learn something useful during a session, and it stays trapped in that session. Next time you start Claude? Amnesia. You're explaining the same things again.
This part is about making knowledge stick — across sessions, across tasks, across your whole team.
The Crystallisation Problem
Every session, you discover things:
- "Oh, the auth module is in an unexpected place"
- "Tests need this specific env var set"
- "Don't touch that legacy file, it breaks everything"
These insights cost you context to discover. Then the session ends. Gone.
Next session, you (or Claude) rediscover them. Burning context again. It's like Groundhog Day but with tokens.
The fix is crystallisation — taking ephemeral learnings and storing them somewhere durable.
What to Call These Learnings?
You might call them "thoughts," but there are better names:
| Name | Vibe |
|---|---|
| Insights | Wisdom extracted from exploration |
| Learnings | Knowledge gained through work |
| Memory Crystals | Compressed, durable knowledge structures |
| Distillations | Essence from verbose exploration |
I'd go with "Insights" or "Learnings" — clear, unpretentious, and they convey that this is extracted knowledge, not raw data.
The Memory Bank Pattern
Cline popularised a structured approach with dedicated files:
memory-bank/
├── projectbrief.md # What is this project?
├── productContext.md # Business/user perspective
├── systemPatterns.md # Architecture decisions
├── techContext.md # Dev environment & stack
├── activeContext.md # Current focus area
└── progress.md # Status tracking
The workflow is dead simple:
- Start session → Read memory bank files
- Do work → Context accumulates as normal
- End session → Update relevant memory bank files
Your AI starts each session with project knowledge instead of a blank slate. The upfront token cost is small (a few hundred tokens) compared to re-discovering everything.
CLAUDE.md: Your Project's Brain
Claude Code has a built-in mechanism for this: CLAUDE.md. It's read automatically at session start and treated as high-priority instructions.
Basic Example
# Project: E-Commerce Platform
## Stack
- Next.js 14 with App Router
- PostgreSQL via Prisma
- Redis for sessions
## Commands
- `npm run dev` — Dev server (port 3000)
- `npm test` — Jest tests
- `npm run db:migrate` — Run Prisma migrations
## Gotchas
- Auth uses localStorage fallback for Safari (ITP issues)
- Don't modify /legacy — it's load-bearing spaghetti
- Tests require DATABASE_URL env var
## Current Focus
Migrating from JWT to session-based auth.
Why This Works
Here's the key insight from HumanLayer:
"Claude will ignore the contents of your CLAUDE.md if it decides that it is not relevant to its current task."
This sounds bad but it's actually good. Anthropic intentionally made Claude deprioritise irrelevant instructions. It means you can include project-wide context without bloating every single task.
But it also means: make your CLAUDE.md universally relevant, not stuffed with edge cases.
The 150-200 Rule
HumanLayer's research uncovered a crucial constraint: LLMs can reliably follow about 150-200 instructions.
Claude Code's built-in system prompt already uses ~50 of those. That leaves you with maybe 100-150 before reliability drops.
Keep CLAUDE.md under 300 lines. HumanLayer's is under 60.
Quality over quantity. Every line should earn its place.
CLAUDE.md Anti-Patterns
Don't Use Claude as a Linter
This is tempting but wrong:
## Code Style (DON'T DO THIS)
- Use 2-space indentation
- Maximum line length 80 characters
- Always use semicolons
- Prefer const over let
- Use arrow functions for callbacks
- ... (50 more rules)
This bloats your context and degrades performance. Claude isn't a linter. It's an AI.
"Never send an LLM to do a linter's job."
Use actual linters (Biome, ESLint) and run them through Claude Code hooks. The linter enforces style; Claude focuses on logic.
Don't Auto-Generate
It's tempting to run /init and call it done. Don't.
"CLAUDE.md is one of the highest leverage points of the harness."
Manually craft every line. You know your project better than any auto-generator. The few minutes spent writing a good CLAUDE.md pays dividends across hundreds of sessions.
Don't List Every Possible Command
## Commands (DON'T DO THIS)
- npm run dev
- npm run build
- npm run test
- npm run test:watch
- npm run test:coverage
- npm run lint
- npm run lint:fix
- npm run format
- npm run typecheck
- ... (20 more)
Claude doesn't need a reference manual. It can read package.json. Include the non-obvious stuff, skip the obvious.
Progressive Disclosure
Instead of cramming everything into CLAUDE.md, use separate files loaded on demand:
docs/
├── building.md # How to build & deploy
├── architecture.md # System design
├── conventions.md # Code patterns we use
└── testing.md # Test strategy & setup
Then in CLAUDE.md:
## Documentation
- Read `docs/architecture.md` when working on system design
- Read `docs/testing.md` before writing tests
- Read `docs/conventions.md` for code review
Context is loaded when needed, not upfront. Your baseline stays lean.
Session Hygiene
Even with great knowledge management, sessions get bloated. Here's how to stay clean.
The /compact Command
When context is getting full, /compact compresses your conversation. It keeps important stuff, drops the noise.
Timing matters: Compact at 70%, not 90%.
Why? You need room to finish your current task. If you compact at 90% and the task needs another 15% of context, you're stuck.
The /clear Command
Switching tasks? Use /clear to reset context within your session.
Less disruptive than starting a new session. Good for "I'm done with feature X, now working on feature Y."
Just Start Fresh
Real talk: if you've been debugging something for an hour and want to switch to documentation, open a new chat.
It feels wasteful. It's not. Each fresh session:
- Zero context rot
- No "lost in the middle" issues
- No cross-contamination from unrelated tasks
The best context management is sometimes no context at all.
Iterative Refinement
Your CLAUDE.md should evolve. Here's the loop:
- Add an instruction
- Give Claude a task that relies on it
- Watch what happens
- Refine if it didn't work
- Commit so teammates benefit
Claude Code has a shortcut: press # during a session to add instructions that get incorporated into CLAUDE.md automatically. Use it when you discover something worth remembering.
Hierarchical Summarisation
As sessions progress, use layered approaches:
| Age | Treatment |
|---|---|
| Last 10-15 messages | Keep verbatim |
| Earlier in session | Compress to summaries |
| Stable project facts | Move to CLAUDE.md |
| One-time learnings | Memory bank files |
Research suggests: prefer raw > compaction > summarisation. Each step loses fidelity. Only summarise when you must.
Key Takeaways
- Crystallise learnings — Don't rediscover the same things every session
- Memory bank files — Structured project knowledge that persists
- CLAUDE.md is high-leverage — Keep it under 300 lines, manually crafted
- Don't use Claude as a linter — Real linters via hooks, Claude for logic
- Progressive disclosure — Load detailed context only when needed
- Session hygiene — Compact at 70%, clear between tasks, start fresh when needed
- Iterate your config — CLAUDE.md should evolve with your project
What's Next
We've covered staying out of the Dumbzone (subagents) and making knowledge persist (crystallisation, CLAUDE.md).
But keep an eye out for part 4 where we will cover the more advanced patterns for serious context engineering.
Backpressure control, the Ralph Loop for long-running autonomous tasks, and the 12 Factor Agents framework.
Further Reading
- Writing a good CLAUDE.md — HumanLayer's definitive guide
- Memory Bank: Making Cline Never Forget — The original pattern
- Manage Claude's memory — Official docs




Top comments (0)