EDIBLOG · 2-MONTH RETRO · PART 1
2 Months on Claude Code — 5 Techniques That Actually Worked
Right now I’m running 12 projects, 30 slash commands, and 40 launchd automation jobs every day. You don’t need to be perfect from day one. The key is cycling fast.
Claude Code 2-month retro series
- 5 techniques that actually worked for me← NOW
- My CLAUDE.md evolution — from 10 lines to 300
- How I run 30 slash commands at once
- My harness engineering — splitting auto and review modes
- My 3-file pattern — building a Claude that writes like me
TIP 01 · CONTEXTCLAUDE.md — the file that stops you from repeating yourself to the AI
Bottom line. Once I dropped a CLAUDE.md into the folder, I stopped saying the same thing twice. Context started carrying over like a bridge between sessions.
When I first started running Claude Code, I introduced myself again every single day. A new session wasn’t an old friend — it was a complete stranger. Every rule and preference I’d agreed on yesterday was just gone.
Then I noticed something. If I dropped a CLAUDE.md file in the folder, every new session would automatically read the conventions I’d written there. I found the pattern documented in the official CLAUDE.md memory docs.
RULE
One context = one folder = its own CLAUDE.md
I keep a separate folder for each project and manage a separate CLAUDE.md per folder. Same Claude, different folder — completely different behavior. I tested this myself.
My folder layout
~/Documents/Claude/Projects/
├── automation/CLAUDE.md # Main ops rules
├── real-estate-blog/CLAUDE.md # RE tone & tax source rules
├── ediblog/CLAUDE.md # 1st-person 80% gate
└── jessinvestment/CLAUDE.md # EN mirror translation rules
After running it for a while, my CLAUDE.md naturally settled into 5 sections: Identity / Hard Rules / Soft Rules / Commands / Recent Changes.
My CLAUDE.md skeleton
# CLAUDE.md
## Identity
This folder runs the "[blog name]" blog / Operator: Eddie, solo
## Hard Rules (non-negotiable)
- No auto-publish (drafts only)
- API keys only loaded from secrets/ folder
## Soft Rules (preferred)
- 1st person 80%+ tone
- At least one official external source cited
## Commands (master index)
| Command | Description |
| /run-daily | Generate daily publish queue |
## Recent Changes
- 2026-05-12: Skills split out; CLAUDE.md slimmed down
I used to try to make it perfect from the start. That actually held me back. Once I started cycling result → review → refine a lot, CLAUDE.md grew on its own without me forcing it.
One trap I hit, though: when CLAUDE.md got too big, every new session loaded the whole thing and token cost kept piling up. That pushed me to adopt the Skills offload from TIP 03 as the next step.
→ The full story of how my CLAUDE.md grew from 10 lines to 300 is coming in Part 2.
TIP 02 · SHORTCUTSlash commands — if you’ve pasted the same prompt 3 times, extract it now
Bottom line. The moment I find myself typing the same prompt for the third time, I pull it into .claude/commands/ right there. That’s the essence of slash commands.
Before slash commands, I pasted the same prompt every single time. Time was one cost, but the bigger one was skipping one line by accident and getting a completely different result.
Now I just type /run-daily. I learned how to build them from the official docs on slash commands.
MY 4 OPS RULES
How I run 30 commands at once without losing track
1. Folder = context boundary. Each project gets its own commands folder. That way the automation folder’s commands don’t leak into the ediblog folder. Same /run-daily name, different folder, different behavior — I confirmed this myself.
2. Naming = consistent prefixes. I use prefixes like run-daily / run-weekly / run-market-daily. One glance and I know what it is. I never forget which of the 30 is which.
3. Description metadata is mandatory. Every .md file has a one-line description: at the top. Just typing / pops up the catalog, so I don’t need to memorize all 30.
4. Master index = 1-line table in CLAUDE.md. The last section of CLAUDE.md has every command as a one-line table. Even if I forget, the Claude I’m working with doesn’t.
My command skeleton, Part 1
---
description: Generate the daily publish-candidate queue and send a review request to Telegram
---
Follow this procedure:
1. Scan the drafts/ folder and count unpublished posts
2. If under 5, write a new post (trigger the blog-style-guide skill)
3. Send a preview of the new post to Telegram
4. On user approval, save it as a draft
Typing /run-daily kicks off exactly that. This is the actual command skeleton I use. I found that the one-line description is what decides whether the command gets triggered. The description field in the official frontmatter spec doubles as the trigger keyword:
Actual output when I run /run-daily
$ /run-daily
[Claude] Scanning drafts/ folder...
Found 3 unpublished posts. Queue under 5 → writing 1 new post.
Triggering blog-style-guide skill...
✅ Generated AI_update_20260515.html (8,234 chars)
Telegram preview sent ✓
Review requested — waiting up to 30 min for reply
→ My full playbook for running 30 commands is coming in Part 3.
TIP 03 · OFFLOADSkills — a heavy CLAUDE.md blows up your token bill
Bottom line. What I need every session goes into CLAUDE.md. What I need occasionally goes into Skills. That’s where my token diet started.
I knew CLAUDE.md was powerful, but I was slow to notice one trap: it gets loaded in full at the start of every session, burning tokens each time. The more ops rules I added, the more the cost compounded.
So now anything I don’t need on every turn lives in a Skill. Claude pulls it in only when it’s actually needed. The official Skills docs have the full pattern.
Right now I run 3 Skills to keep CLAUDE.md slim.
add-launch-job
I only call this when adding a new launchd job. No reason to load it every session.
blog-style-guide
My 8-pattern writing style guide. Triggered only when I’m actually writing a post.
captcha-recovery
Captcha & session-corruption recovery. Only activates when something breaks.
My SKILL.md skeleton
---
name: add-launch-job
description: Checklist for adding, editing, or removing launchd jobs (LaunchAgents).
Procedures for new blog/session setup, one-shot job cleanup, plist creation/deletion.
---
# launchd job ops checklist
...
MY DECISION TREE
CLAUDE.md vs. Skills — where does it go?
I decide with one line. Needed every session → CLAUDE.md. Needed occasionally → Skills.
Ops rules, 1st-person tone, command index → CLAUDE.md. Checklists, recovery procedures, style guides → Skills.
That one split shrank my CLAUDE.md from 300 lines to 80. The per-session cost dropped right alongside it.
Here’s the actual classification table I use. It follows the progressive disclosure pattern from the official Skills guide:
My decision tree — where each kind of info lives
Info type Goes in
─────────────────────────────────────────────────────
Ops rules · 1st-person tone guide CLAUDE.md (every session)
Master command index CLAUDE.md (every session)
New-job checklist Skills (occasional)
Incident · captcha recovery Skills (only when needed)
Blog writing style guide Skills (only when writing)
v2 infographic component rules Skills (only when designing)
Here’s an auto-trigger in action. I rely on description-keyword matching so the skill wakes up on its own:
add-launch-job auto-trigger, one turn
User: Add a new launchd job
Claude: [add-launch-job skill auto-triggered]
Applying checklist...
1. Write .job file (TIMES/COMMAND/WORKDIR)
2. Auto-generate plist — TCC policy compliant
3. ProgramArguments — no /bin/zsh -lc wrapping ✓
4. FD limit 65536, 3-layer defense ✓
5. launchctl unload && load to re-register
Done. Next run: 05:00 daily
→ The full power of Skills shows up alongside CLAUDE.md evolution in Part 2. They’re a pair.
TIP 04 · SAFETYHarness engineering — hand over every permission, but hardcode the non-negotiables
Bottom line. I give Claude Code every permission, but the “these things, absolutely not” lines are pinned in code. I call this harness engineering.
If I’m going to hand Claude Code full permissions, I needed non-negotiable lines to do it safely. Blind safe mode wasn’t what I wanted. The essence was branching on whether I could actively review or not.
DESTRUCTIVE GATE
The 6 commands my PreToolUse hook blocks
I have 6 block lines in a PreToolUse hook.
- Folder deletion
rm -rf - Git force push
push --force - Job deactivation
launchctl unload - Force-kill processes
kill -9 - Docker container removal
docker rm - DB table drop
DROP TABLE
It’s not locked all the time. It only blocks when the Telegram bot is running on its own while I’m away. When I’m sitting there reviewing, it lets things through.
My hook skeleton — branches on $CLAUDE_AUTOMATED
#!/bin/bash
# .claude/hooks/pretool-destructive.sh
CMD="$1"
DANGER="rm -rf|push --force|launchctl unload|kill -9|docker rm|DROP TABLE"
if echo "$CMD" | grep -qE "$DANGER"; then
if [ "$CLAUDE_AUTOMATED" = "1" ]; then
echo "❌ Blocked in auto mode: $CMD"
exit 1
fi
echo "⚠️ Dangerous command detected — allowed in review mode"
fi
exit 0
Every block fires a Telegram alert immediately. Thanks to the PreToolUse hook lifecycle, the command is stopped before it executes:
My block alert — actual Telegram message
🚫 PreToolUse block
Command: rm -rf ~/Documents/Claude/Projects/automation/sessions/
Time: 2026-05-12 03:22:14 KST
Mode: auto ($CLAUDE_AUTOMATED=1)
Reason: DESTRUCTIVE GATE — folder-deletion pattern
To retry in review mode:
$ unset CLAUDE_AUTOMATED && {original command}
My auto vs. review modes — policy matrix
Situation $CLAUDE_AUTOMATED Blocks Allows
─────────────────────────────────────────────────────────────────────
Telegram bot auto-run = 1 6 risky commands safe commands only
User review mode (not away) = 0 or unset (none) risky commands included
Emergency recovery (explicit OK) = 0 + user confirm (none) everything
The more permissions I delegate, the sharper the non-negotiable lines need to be. When I expand the automation surface, I scale the safety net at the same time — that’s the real order of operations.
→ The full auto/review split is coming in Part 4.
TIP 05 · IDENTITYThe 3-file pattern — building a Claude that writes like you
Bottom line. I registered 3 files — identity, voice, and don’t-write — as system prompts and got a real proxy of myself. Writing time dropped roughly in half.
I dropped 3 files into claude.ai Projects as system prompts. Every conversation now starts with identity, voice, and forbidden phrases baked in. After this, it really did feel like I’d built a proxy.
identity.md
Who you are. One paragraph like “I’m a solo operator running an IT blog out of Korea.” Mine is 5 lines.
voice.md
How you sound. 3 to 5 paragraphs of your most-you writing. No explanations — learn from samples.
anti-ai.md
What to avoid. Blocks AI-sounding phrases like “more efficiently” or “optimal solution.”
For voice.md I learned that samples teach better than explanations. So I just paste excerpts of my own writing.
My voice.md excerpt — samples, not explanations
# voice.md — Eddie's voice samples
## Sample 1 (failure retro)
The job died. I restarted it. It died again.
Same hook was hanging all three times.
## Sample 2 (tool review)
One Raycast shortcut is why I can't go back to Alfred.
Objectively they're a wash. It's just this one key.
anti-ai.md follows the same shape. Borrowing the “negative example” pattern from the Anthropic context engineering guide, I list only the phrases to block:
My anti-ai.md excerpt — phrases to never use
# anti-ai.md — phrases I will never write
## Marketing fluff
- "more efficiently"
- "optimal solution"
- "innovative ~"
- "surprisingly ~"
## Empty diagrams
- "[A] → [B] → [C]" arrow chains
- 4-quadrant matrices (when there's no real intent)
- Tidy analogies that explain nothing
## Absence of critical thinking
- "Overall, ~"
- "In conclusion, ~"
- "It seems likely that ~"
I baked the 3-file pattern into both claude.ai and Claude Code (via CLAUDE.md + Skills). Pinning it in both surfaces gave me results that matched or beat my own drafts. Writing one post used to take 30 minutes of hands-on time. Now it’s 12.
→ The full 3-file kit is coming in Part 5.
CODAThe 6th one is actually the most important
Two months in, I learned 5 things. Honestly it’s 6. The last one is meta.
#6 — I wasn’t perfect from day one either. I cycled request → result → review → revise a lot. At some point CLAUDE.md, Skills, slash commands, hooks, and the 3-file pattern had all grown up around me.
You don’t need a perfect CLAUDE.md on day one. Cycle request → result → review → revise a lot. At some point CLAUDE.md grows on its own. Grow alongside the AI.
— Eddie · after 2 months on Claude Code
In the AI era, the real edge isn’t which new model you’re using — it’s whether you have a system that carries yesterday’s you forward.
Sources · References
Anthropic official docs
Series · related posts
- The Context Engineering 3-file pattern — building a Claude that writes in your voice (prequel)
- Getting 100% out of Claude Code memory — don’t leave it on autopilot, pin it explicitly in the first 5 minutes
- Claude Code Routines in practice — 5 ways to hand off repetitive work to the AI
Disclaimer: personal 2-month operating log. No ads, no affiliates.
This post is part of an English mirror of a Korean dev experiments blog. Cross-posted for the global developer audience.