I made Claude Code worse at its job. On purpose.
Two things I love about working at Firecrawl: everyone around me looks like a coding genius, which constantly pushes me to grow, and using AI/agents is deeply encouraged. Every day we have a new discussion on improving the workflow with new tools.
But there's a problem with the second one.
When you're learning something you don't know yet, AI agents are a trap.
The problem with "code buddy" AI
Claude Code is fantastic at what it's built for: helping you ship faster. You hit a bug, you ask Claude, Claude fixes it. You're unblocked in 30 seconds.
The problem is you learned nothing. The bug is gone but the gap is still there. Next time you hit the same class of problem, you're back to point zero and asking Claude to fix it again. I learned how to code in python and js a decade ago, checking StackOverflow and almost experimenting with the code. This time I'm learning rust, a language with explicit memory management and different coding paradigms and I had the feeling that using Claude the same way as I do on work won't work at all if I want to truly understand this new language.
What I built
I created a small system that turns Claude Code into a Socratic tutor instead of a code buddy. The core idea: Claude is not allowed to write or fix my code. It can only guide me to fix it myself.
The system lives in CLAUDE.md at the root of my learning repo. Claude Code reads this file automatically and follows its rules for every session. Here's the key rule:
"Do NOT use Edit, Write, or any tool that changes code files. Do NOT provide copy-paste solutions. Guide the user to write the code themselves."
Instead of fixing bugs, Claude asks questions:
"What does the compiler error message tell you?" "What do you think &mut means here? How many mutable references can exist at once?" "What would happen if...?"
And there's a safety valve: if I'm genuinely stuck and say "I have no idea," it drops the Socratic loop and gives one concrete hint. Not the answer, just enough to get unstuck.
How it works end to end
The system has four moving pieces:
1. CLAUDE.md: the teaching rules
This is for Claude's behavior. Rules like: never explain a library without reading the actual docs first, proactively search the codebase rather than asking me to paste code, recognize when the Socratic loop is stalling. I update this file whenever I notice friction in the teaching.
2. KNOWLEDGE.md: my concept map
Claude reads this at the start of every session. It tracks my knowledge state per concept area with a dated history:
## Error Handling
**Status:** ✅ Solid
| Date | Update |
|------------|--------|
| 2026-04-01 | ❌ Knows Option/Result variants but unclear on semantic difference. Doesn't know what ? requires from the return type |
| 2026-04-02 | ⚠️ Solid on unwrap() vs ? (panic vs propagate). Still doesn't see that ? requires the function return type to be Result |
| 2026-04-09 | ✅ Correctly explained that ? requires the enclosing function to return Result. Rewrote handler return type unprompted. Concept is solid. |
This means Claude never wastes time re-explaining things I already know. It picks up exactly where we left off.
3. Session skills: /log-session, /review-session, /sync-knowledge
After each session:
-
/log-session: Claude reads the conversation and appends a session entry toSESSIONS.mdwith review questions graded Easy / Medium / Hard based on what came up- I answer the questions in the
SESSIONS.mdfile (wrong answers are more useful than blanks)
- I answer the questions in the
-
/review-session: Claude grades my answers and appends targeted feedback -
/sync-knowledge: Claude updatesKNOWLEDGE.mdwith my current state per concept
4. /improve-claude: the feedback loop
When Claude pisses me off with too many repetitive questions, wrong assumptions about my skill level, etc, I run /improve-claude. It reads the session, identifies the friction, and applies minimal targeted updates to CLAUDE.md. Teaching rules get better over time.
The full system (CLAUDE.md, skills, structure) is open. Link here: Claude Socratic
What changed
The clearest thing is that I know where my gaps are. Not in a vague "I should learn more about X" way, but in a tracked, dated, specific way. I can look at KNOWLEDGE.md and see exactly which concepts are shaky and which are solid. That makes it easy to know what to work on next.
The deeper thing is harder to describe. When I learned Python and JavaScript, I learned by repetition: copy, run, tweak, repeat until it works. I understood the patterns without really understanding why they worked. With this system, I can't do that. Claude won't let me skip the "why." And I'm finding that the concepts actually stick. I'm not memorizing syntax, I'm understanding the language.
Maybe that's how learning to code should have always worked?