Affaan Mustafa(@affaanmustafa)의 Shorthand Guide + Longform Guide를 한국어로 취합 정리한 글이다. 10개월 이상 매일 Claude Code를 사용하며 Anthropic 해커톤에서 우승한 개발자의 실전 노하우를 담았다.
원문 출처:
Shorthand Guide는 "뭘 설치하고 어떻게 설정하나"에 대한 가이드다. Skills, hooks, subagents, MCPs, plugins의 설정 패턴을 다룬다.
Skills은 특정 스코프와 워크플로우에 제한된 규칙처럼 동작한다. 특정 워크플로우를 실행할 때 프롬프트의 축약어(shorthand) 역할을 한다.
Opus 4.5로 긴 코딩 세션을 끝내고 데드 코드와 불필요한 .md 파일을 정리하고 싶다면? /refactor-clean을 실행하면 된다. 테스트가 필요하면? /tdd, /e2e, /test-coverage. 여러 커맨드를 하나의 프롬프트에서 체인으로 연결할 수도 있다.
둘은 겹치지만 저장 위치가 다르다:
~/.claude/skills — 더 넓은 워크플로우 정의~/.claude/commands — 빠르게 실행 가능한 프롬프트 (슬래시 커맨드로 실행)~/.claude/skills/
pmx-guidelines.md # 프로젝트 특화 패턴
coding-standards.md # 언어 베스트 프랙티스
tdd-workflow/ # 멀티파일 스킬 (README.md 포함)
security-review/ # 체크리스트 기반 스킬
codemap-updater.md # 체크포인트마다 코드맵 업데이트
코드맵 업데이트 스킬을 만들면 Claude가 컨텍스트를 탐색에 태우지 않고도 코드베이스를 빠르게 탐색할 수 있다. 체크포인트마다 자동으로 코드맵을 갱신하는 방식이다.
Hooks은 특정 이벤트에 트리거되는 자동화다. Skills과 달리 도구 호출과 라이프사이클 이벤트에 제한된다.
| Hook | 트리거 시점 | 활용 예시 |
|---|---|---|
PreToolUse | 도구 실행 전 | 검증, 리마인더, 위험 명령 차단 |
PostToolUse | 도구 실행 후 | 포매팅, 피드백 루프, 타입 체크 |
UserPromptSubmit | 메시지 전송 시 | 프롬프트 전처리 |
Stop | Claude 응답 완료 시 | 최종 감사, console.log 체크 |
PreCompact | 컨텍스트 압축 전 | 중요 정보 보존 |
Notification | 권한 요청 시 | 알림 커스터마이즈 |
{
"PreToolUse": [
{
"matcher": "tool == \"Bash\" && tool_input.command matches \"(npm|pnpm|yarn|cargo|pytest)\"",
"hooks": [
{
"type": "command",
"command": "if [ -z \"$TMUX\" ]; then echo '[Hook] Consider tmux for session persistence' >&2; fi"
}
]
}
]
}
npm, yarn 등 장시간 실행될 수 있는 명령을 쓸 때, tmux 세션 안이 아니면 리마인더를 띄워주는 훅이다.
💡 팁:
hookify플러그인을 사용하면 JSON을 직접 작성하지 않고 대화형으로 훅을 생성할 수 있다./hookify를 실행하고 원하는 걸 설명하면 된다.
오케스트레이터(메인 Claude)가 제한된 스코프로 작업을 위임할 수 있는 프로세스다. 백그라운드 또는 포그라운드에서 실행되며, 메인 에이전트의 컨텍스트를 절약해준다.
서브에이전트는 스킬과 잘 어울린다 — 특정 스킬의 부분 집합만 실행할 수 있는 서브에이전트를 만들어 위임하면, 그 스킬들을 자율적으로 사용한다. 도구 권한으로 샌드박싱도 가능하다.
~/.claude/agents/
planner.md # 기능 구현 계획 수립
architect.md # 시스템 설계 결정
tdd-guide.md # 테스트 주도 개발
code-reviewer.md # 품질/보안 리뷰
security-reviewer.md # 취약점 분석
build-error-resolver.md # 빌드 에러 해결
e2e-runner.md # Playwright 테스트
refactor-cleaner.md # 데드 코드 제거
doc-updater.md # 문서 동기화 유지
핵심: 서브에이전트마다 허용된 도구, MCP, 권한을 별도 설정해서 적절한 스코핑을 해야 한다.
.rules 폴더에 .md 파일로 Claude가 항상 따라야 하는 베스트 프랙티스를 저장한다.
방법 1: 단일 CLAUDE.md — 모든 것을 한 파일에 (유저 또는 프로젝트 레벨)
방법 2: Rules 폴더 — 관심사별로 모듈화된 .md 파일
~/.claude/rules/
security.md # 하드코딩된 시크릿 금지, 입력 검증
coding-style.md # 불변성 우선, 파일 구성 규칙
testing.md # TDD 워크플로우, 80% 커버리지
git-workflow.md # 커밋 포맷, PR 프로세스
agents.md # 서브에이전트 위임 규칙
performance.md # 모델 선택, 컨텍스트 관리
MCP는 Claude를 외부 서비스에 직접 연결한다. API의 대체가 아니라, API 주변에 프롬프트 기반 래퍼를 씌워서 정보 탐색에 더 유연성을 제공하는 것이다.
예시: Supabase MCP를 쓰면 Claude가 특정 데이터를 가져오거나, SQL을 직접 실행할 수 있다. 복사-붙여넣기 없이
Chrome in Claude: 내장 플러그인 MCP로, Claude가 자율적으로 브라우저를 제어한다 — 클릭하면서 어떻게 동작하는지 확인하는 방식
"200k 컨텍스트 윈도우가 너무 많은 도구가 활성화되면 실질적으로 70k까지 줄어든다. 성능이 심각하게 저하된다."
황금 규칙:
/plugins로 이동하거나 /mcp를 실행해서 현재 상태를 확인할 수 있다.
수동 설정의 번거로움 대신 도구를 쉽게 설치할 수 있게 패키징한 것이다. 스킬 + MCP 조합이거나, 훅/도구를 번들로 묶은 형태
# 마켓플레이스 추가
claude plugin marketplace add https://github.com/mixedbread-ai/mgrep
# Claude에서 /plugins 실행 → 새 마켓플레이스 찾기 → 설치
에디터 밖에서 Claude Code를 자주 실행한다면 특히 유용하다. Language Server Protocol이 IDE 없이도 실시간 타입 체크, go-to-definition, 자동 완성을 제공한다.
typescript-lsp@claude-plugins-official # TypeScript 지능
pyright-lsp@claude-plugins-official # Python 타입 체크
hookify@claude-plugins-official # 대화형 훅 생성
mgrep@Mixedbread-Grep # ripgrep보다 강력한 검색
⚠️ MCP와 마찬가지로 컨텍스트 윈도우를 주시할 것.
| 단축키 | 기능 |
|---|---|
Ctrl+U | 전체 줄 삭제 (백스페이스 연타보다 빠름) |
! | 빠른 bash 명령 접두사 |
@ | 파일 검색 |
/ | 슬래시 커맨드 시작 |
Shift+Enter | 멀티라인 입력 |
Tab | thinking 표시 토글 |
Esc Esc | Claude 중단 / 코드 복원 |
/fork — 대화를 분기해서 겹치지 않는 작업을 병렬로 처리. 큐에 메시지를 쌓는 것보다 효율적.
Git Worktrees — 겹치는 병렬 Claude 인스턴스들이 충돌 없이 작업할 수 있도록.
git worktree add ../feature-branch feature-branch
# 각 워크트리에서 별도의 Claude 인스턴스 실행
tmux — 장시간 실행 명령 관리:
tmux new -s dev
# Claude가 여기서 명령 실행, detach/reattach 가능
tmux attach -t dev
mgrep는 ripgrep/grep보다 상당한 개선이다. 플러그인 마켓플레이스로 설치 후 /mgrep 스킬 사용.
mgrep "function handleSubmit" # 로컬 검색
mgrep --web "Next.js 15 app router changes" # 웹 검색
| 커맨드 | 기능 |
|---|---|
/rewind | 이전 상태로 되돌리기 |
/statusline | 브랜치, 컨텍스트 %, 할 일 등으로 커스터마이즈 |
/checkpoints | 파일 레벨 undo 포인트 |
/compact | 수동 컨텍스트 압축 트리거 |
PR에 코드 리뷰를 GitHub Actions로 설정할 수 있다. Claude가 자동으로 PR을 리뷰하도록 구성 가능.
위험한 작업에는 샌드박스 모드를 사용한다 — Claude가 실제 시스템에 영향을 주지 않는 제한된 환경에서 실행된다.
--dangerously-skip-permissions는 반대로 Claude에게 자유를 주는 것인데, 주의하지 않으면 파괴적일 수 있다.
Rust 기반 에디터로 가볍고 빠르며, 대규모 코드베이스에서도 렉이 없다.
Zed가 Claude Code와 잘 맞는 이유:
에디터 연동 팁:
Ctrl+G — Claude가 현재 작업 중인 파일을 Zed에서 즉시 열기터미널 포맷으로 쓸 수도 있고(\ide로 에디터 자동 동기화 + LSP 기능 — 플러그인이 있는 지금은 다소 중복), 익스텐션으로 더 통합된 UI를 쓸 수도 있다.
ralph-wiggum@claude-code-plugins # 루프 자동화
frontend-design@claude-code-plugins # UI/UX 패턴
commit-commands@claude-code-plugins # Git 워크플로우
security-guidance@claude-code-plugins # 보안 체크
pr-review-toolkit@claude-code-plugins # PR 자동화
typescript-lsp@claude-plugins-official # TS 지능
hookify@claude-plugins-official # 훅 생성
code-simplifier@claude-plugins-official # 코드 단순화
feature-dev@claude-code-plugins # 기능 개발
explanatory-output-style@claude-code-plugins # 설명적 출력 스타일
code-review@claude-code-plugins # 코드 리뷰
context7@claude-plugins-official # 라이브 문서
pyright-lsp@claude-plugins-official # Python 타입 체크
mgrep@Mixedbread-Grep # 강화된 검색
{
"github": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-github"] },
"firecrawl": { "command": "npx", "args": ["-y", "firecrawl-mcp"] },
"supabase": {
"command": "npx",
"args": ["-y", "@supabase/mcp-server-supabase@latest", "--project-ref=YOUR_REF"]
},
"memory": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-memory"] },
"sequential-thinking": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-sequential-thinking"]
},
"vercel": { "type": "http", "url": "https://mcp.vercel.com" },
"railway": { "command": "npx", "args": ["-y", "@railway/mcp-server"] },
"cloudflare-docs": { "type": "http", "url": "https://docs.mcp.cloudflare.com/mcp" },
"cloudflare-workers-bindings": {
"type": "http", "url": "https://bindings.mcp.cloudflare.com/mcp"
},
"cloudflare-workers-builds": {
"type": "http", "url": "https://builds.mcp.cloudflare.com/mcp"
},
"cloudflare-observability": {
"type": "http", "url": "https://observability.mcp.cloudflare.com/mcp"
},
"clickhouse": { "type": "http", "url": "https://mcp.clickhouse.cloud/mcp" },
"AbletonMCP": { "command": "uvx", "args": ["ableton-mcp"] },
"magic": { "command": "npx", "args": ["-y", "@magicuidesign/mcp@latest"] }
}
프로젝트별 비활성화 (~/.claude.json의 projects.[path].disabledMcpServers):
{
"disabledMcpServers": [
"playwright",
"cloudflare-workers-builds",
"cloudflare-workers-bindings",
"cloudflare-observability",
"cloudflare-docs",
"clickhouse",
"AbletonMCP",
"context7",
"magic"
]
}
"14개 MCP를 설정해두지만, 프로젝트당 5~6개만 활성화한다. 이게 컨텍스트 윈도우를 건강하게 유지하는 핵심이다."
{
"PreToolUse": [
{ "matcher": "npm|pnpm|yarn|cargo|pytest", "hooks": ["tmux 리마인더"] },
{ "matcher": "Write && .md file", "hooks": ["README/CLAUDE 외 .md 생성 차단"] },
{ "matcher": "git push", "hooks": ["에디터에서 리뷰 열기"] }
],
"PostToolUse": [
{ "matcher": "Edit && .ts/.tsx/.js/.jsx", "hooks": ["prettier --write"] },
{ "matcher": "Edit && .ts/.tsx", "hooks": ["tsc --noEmit"] },
{ "matcher": "Edit", "hooks": ["console.log 경고"] }
],
"Stop": [
{ "matcher": "*", "hooks": ["수정된 파일에서 console.log 감사"] }
]
}
~/.claude/rules/
security.md # 필수 보안 체크
coding-style.md # 불변성, 파일 크기 제한
testing.md # TDD, 80% 커버리지
git-workflow.md # Conventional Commits
agents.md # 서브에이전트 위임 규칙
patterns.md # API 응답 포맷
performance.md # 모델 선택 (Haiku vs Sonnet vs Opus)
hooks.md # 훅 문서화
Longform Guide는 "설정한 걸 어떻게 잘 굴리나"에 대한 가이드다. 토큰 경제학, 메모리 지속성, 검증 패턴, 병렬화 전략, 재사용 워크플로우의 복리 효과를 다룬다.
전제조건: Shorthand Guide의 skills, agents, hooks, MCPs가 이미 설정되어 있어야 한다.
Claude Code는 세션이 끝나면 기억을 잃는다. 이를 해결하는 가장 좋은 방법:
.tmp 파일로 요약 저장파일에 반드시 포함할 내용:
~/.claude/sessions/2026-03-04-buryit-auth.tmp
~/.claude/sessions/2026-03-04-buryit-mapbox.tmp
~/.claude/sessions/2026-03-05-buryit-graphql.tmp
auto compact를 끄고, 논리적 분기점에서 수동으로 /compact를 실행한다.
왜?
PreToolUse 훅에 걸어서 도구 호출 50번마다 "compact 고려해봐"라고 알려주는 스크립트:
#!/bin/bash
# Strategic Compact Suggester
# PreToolUse on Edit/Write operations에 연결
COUNTER_FILE="/tmp/claude-tool-count-$$"
THRESHOLD=${COMPACT_THRESHOLD:-50}
if [ -f "$COUNTER_FILE" ]; then
count=$(cat "$COUNTER_FILE")
count=$((count + 1))
echo "$count" > "$COUNTER_FILE"
else
echo "1" > "$COUNTER_FILE"
count=1
fi
if [ "$count" -eq "$THRESHOLD" ]; then
echo "[StrategicCompact] $THRESHOLD tool calls reached - consider /compact if transitioning phases" >&2
fi
CLAUDE.md나 .claude/rules/에 모든 걸 넣는 대신, CLI 플래그로 동적으로 컨텍스트를 주입하는 패턴이다.
claude --system-prompt "$(cat memory.md)"
왜 @파일 참조와 다른가?
| 방법 | 작동 방식 | 우선순위 |
|---|---|---|
@memory.md 또는 .claude/rules/ | 대화 중 Read 도구로 읽음 | 도구 결과 (가장 낮음) |
--system-prompt | 대화 시작 전 시스템 프롬프트에 주입 | 시스템 레벨 (가장 높음) |
LLM의 지시 우선순위: 시스템 프롬프트 > 유저 메시지 > 도구 결과
절대 지켜야 하는 규칙이나 프로젝트 제약사항은 시스템 프롬프트에 넣는 게 더 확실하다.
실용적 설정 — 상황별 alias:
# 일반 개발
alias claude-dev='claude --system-prompt "$(cat ~/.claude/contexts/dev.md)"'
# PR 리뷰 모드
alias claude-review='claude --system-prompt "$(cat ~/.claude/contexts/review.md)"'
# 리서치/탐색 모드
alias claude-research='claude --system-prompt "$(cat ~/.claude/contexts/research.md)"'
dev.md → 구현에 집중review.md → 코드 품질/보안에 집중research.md → 행동 전 탐색에 집중단, Affaan 본인도 인정하듯 "대부분의 경우 차이가 미미하고, 오히려 설정 오버헤드가 더 클 수 있다."
대부분이 모르거나 활용하지 않는 훅들을 체인으로 연결:
세션 1 세션 2
───────── ─────────
[시작] [시작]
│ │
▼ ▼
SessionStart 훅 SessionStart 훅 ← 이전 컨텍스트 자동 로드
│ (읽을 것 없음) │
▼ ▼
[작업 중] [작업 중] (정보 있는 상태!)
│
▼
PreCompact 훅 → 압축 전에 중요 상태 저장
│
▼
[압축됨]
│
▼
Stop 훅 → ~/.claude/sessions/에 영구 저장 ──────►
Hook 설정:
{
"hooks": {
"PreCompact": [{
"matcher": "*",
"hooks": [{
"type": "command",
"command": "~/.claude/hooks/memory-persistence/pre-compact.sh"
}]
}],
"SessionStart": [{
"matcher": "*",
"hooks": [{
"type": "command",
"command": "~/.claude/hooks/memory-persistence/session-start.sh"
}]
}],
"Stop": [{
"matcher": "*",
"hooks": [{
"type": "command",
"command": "~/.claude/hooks/memory-persistence/session-end.sh"
}]
}]
}
}
각 스크립트의 역할:
pre-compact.sh — 압축 이벤트를 로그하고, 활성 세션 파일을 타임스탬프로 업데이트session-start.sh — 최근 7일 세션 파일을 확인하고, 사용 가능한 컨텍스트와 학습된 스킬을 알려줌session-end.sh — 일일 세션 파일을 템플릿으로 생성/업데이트, 시작/종료 시간 추적이 세 개를 체인으로 연결하면 수동 개입 없이 세션 간 기억이 지속된다.
"코르티솔이 치솟으면서 전 세션에서 이미 하지 말라고 했던 걸 Claude가 또 하는 걸 보며 답답하게 소리 지르는 상황."
토큰 낭비, 컨텍스트 낭비, 시간 낭비.
Claude Code가 사소하지 않은 것을 발견하면 — 디버깅 기법, 우회법, 프로젝트 특화 패턴 — 그 지식을 새 스킬로 저장한다. 다음에 비슷한 문제가 나오면 자동으로 로드.
작동 방식:
Stop 훅으로 세션 끝에 자동 실행. 세션을 분석해서 추출할 가치가 있는 패턴(에러 해결, 디버깅 기법, 우회법 등)을 ~/.claude/skills/learned/에 저장.
왜 Stop 훅인가? (UserPromptSubmit 대신)
UserPromptSubmit은 매 메시지마다 실행 — 모든 프롬프트에 지연이 생기고 과도한 오버헤드. Stop은 세션 끝에 한 번만 실행 — 가볍고, 전체 세션을 한꺼번에 평가할 수 있어서 더 효과적.
설치:
mkdir -p ~/.claude/skills/continuous-learning
curl -sL https://raw.githubusercontent.com/affaan-m/everything-claude-code/main/skills/continuous-learning/evaluate-session.sh \
> ~/.claude/skills/continuous-learning/evaluate-session.sh
chmod +x ~/.claude/skills/continuous-learning/evaluate-session.sh
Hook 설정:
{
"hooks": {
"Stop": [{
"matcher": "*",
"hooks": [{
"type": "command",
"command": "~/.claude/skills/continuous-learning/evaluate-session.sh"
}]
}]
}
}
세션 끝까지 기다릴 필요 없다. /learn 커맨드로 세션 중간에 "방금 해결한 거 기록해"를 할 수 있다. 패턴을 추출하고, 스킬 파일 초안을 작성하고, 확인 후 저장.
~/.claude/sessions/YYYY-MM-DD-topic.tmp — 세션당 하나. 현재 상태, 완료 항목, 차단 요소, 핵심 결정, 다음 세션을 위한 컨텍스트를 포함.
@RLanceMartin의 "일기(Diary)" 패턴:
세션 로그를 반성(reflection)해서 유저 선호를 추출한다. 매 세션 후 reflection agent가 잘 된 것, 실패한 것, 수정한 것을 추출 → memory 파일을 업데이트 → 다음 세션에 자동 로드.
@alexhillman의 선제적 제안 패턴:
15분마다 시스템이 선제적으로 개선점을 제안 → 승인/거부 → 시간이 지나면서 승인 패턴 자체를 학습.
작업별로 가장 저렴하면서 충분한 모델을 배정하는 것이 가장 중요하다.
| 상황 | 모델 | 이유 |
|---|---|---|
| 일반 코딩 90% | Sonnet | 기본값 |
| 첫 시도 실패, 5개+ 파일 수정, 아키텍처, 보안 | Opus | 어려운 작업 |
| 반복적, 지시 명확, 멀티에이전트 워커 | Haiku | 싸고 빠름 |
비용 분석:
에이전트 정의에서 모델 지정:
---
name: quick-search
description: Fast file search
tools: Glob, Grep
model: haiku # 싸고 빠름
---
잘 정의된 목표와 작업이 있는 레포를 준비한다. 각 git worktree에 하나의 모델만 할당:
이 과정이 가치 있는지는 본인의 비용 민감도에 달려 있다.
grep → mgrep 교체: 다양한 작업에서 토큰 소비가 평균 절반으로 줄어든다.
백그라운드 프로세스: Claude가 전체 출력을 스트리밍할 필요 없으면 tmux로 밖에서 돌리고, 필요한 부분만 복사해서 넘겨준다. 입력 토큰을 대폭 절약.
비용의 대부분은 입력 토큰에서 나온다고 생각하기 쉽지만, Opus 4.5 기준 입력 $5/M vs 출력 $25/M으로 출력이 5배 비싸다. 그래도 입력 볼륨이 훨씬 크기 때문에 입력 토큰 절약이 여전히 중요하다.
파일이 수천 줄이면:
파일을 수백 줄 단위로 모듈화하면 토큰 비용 절감 + 첫 시도 성공률 증가.
추천 모듈러 구조:
src/
├── apps/ # 진입점 (API, CLI, Workers)
│ ├── api-gateway/
│ └── cron-jobs/
├── modules/ # 핵심 시스템
│ ├── ordering/ # 자체 완결 모듈
│ │ ├── api/ # 다른 모듈을 위한 공개 인터페이스
│ │ ├── domain/ # 비즈니스 로직 (순수)
│ │ ├── infrastructure/ # DB, 외부 클라이언트
│ │ ├── use-cases/ # 애플리케이션 로직 (오케스트레이션)
│ │ └── tests/
│ ├── catalog/
│ └── identity/
├── shared/ # 모든 모듈이 공유
│ ├── kernel/ # 베이스 클래스
│ ├── events/ # 글로벌 이벤트 버스
│ └── utils/ # 범용 헬퍼
└── main.ts
코드베이스가 린할수록 토큰 비용이 줄어든다. 스킬과 커맨드로 지속적으로 리팩토링하고 데드 코드를 제거하는 것이 중요하다.
Claude Code의 시스템 프롬프트가 약 18k 토큰 (~200k의 9%). 패치로 ~10k까지 줄일 수 있다 — 정적 오버헤드의 41% 절약.
YK Sugi의 system-prompt-patches 참고. 단, Affaan 본인은 "나는 안 함"이라고.
같은 작업을 두 워크트리에서 돌려서 비교:
[같은 작업]
│
┌──────┴──────┐
▼ ▼
워크트리 A 워크트리 B
(스킬 있음) (스킬 없음)
│ │
▼ ▼
[결과 A] [결과 B]
│ │
└──────┬───────┘
▼
[git diff]
│
로그, 토큰 사용량,
출력 품질 비교
체크포인트 기반 Eval:
[작업 1] → [체크포인트 #1: 검증] → 통과? → [작업 2] → [체크포인트 #2] → ...
실패? → 수정 → 재검증
연속 Eval:
[작업] → [타이머/변경 감지] → [테스트 + 린트 실행]
통과 → 계속
실패 → 멈추고 수정
어떤 걸 선택해야 하나? 기능 구현처럼 단계가 명확하면 체크포인트 기반, 탐색적 리팩토링이나 유지보수처럼 마일스톤이 불명확하면 연속 기반.
Affaan: "약간의 개입으로, 검증 접근법은 대부분의 기술 부채를 피하기에 충분하다. Claude가 작업 완료 후 스킬과 PostToolUse 훅으로 검증하게 하고, 지속적인 코드맵 업데이트가 변경 로그 역할을 한다. 엄격한 규칙을 세우면 Claude가 무작위 .md 파일을 만들거나 중복 파일, 데드 코드의 황무지를 남기는 것도 방지된다."
| 지표 | 의미 | k=1 | k=3 | k=5 |
|---|---|---|---|---|
| pass@k | k번 중 하나라도 성공 | 70% | 91% | 97% |
| pass^k | k번 전부 성공 | 70% | 34% | 17% |
| 유형 | 방법 | 장점 | 단점 |
|---|---|---|---|
| 코드 기반 | 문자열 매칭, 이진 테스트, 정적 분석 | 빠르고 싸고 객관적 | 유효한 변형에 취약 |
| 모델 기반 | 루브릭 채점, 자연어 단언, 쌍 비교 | 유연하고 뉘앙스 처리 | 비결정적, 비쌈 |
| 인간 | SME 리뷰, 크라우드소싱, 샘플 체크 | 골드 스탠다드 | 비싸고 느림 |
출처: Anthropic — Demystifying evals for AI agents (2026.01)
"Boris가 로컬 5개 + 웹 5개를 제안했는데, 임의로 터미널 수를 정하는 것에 반대한다. 터미널 추가는 진짜 필요와 목적이 있을 때만."
"스크립트로 해결되면 스크립트를 써라. 메인 채팅에서 tmux로 인스턴스를 띄울 수 있으면 그렇게 해라. 목표는: 최소한의 병렬화로 얼마나 많이 해낼 수 있나."
코드 변경은 메인에서만 하고, 포크는 정보 수집용으로만.
여러 Claude를 돌릴 때의 조직 패턴:
겹치는 코드를 건드리는 인스턴스가 여러 개면:
/rename <이름>으로 모든 채팅에 이름 붙이기 — 어떤 워크트리가 뭔지 헷갈리지 않도록git worktree add ../project-feature-a feature-a
git worktree add ../project-feature-b feature-b
git worktree add ../project-refactor refactor-branch
# 각 워크트리에서 별도의 Claude 인스턴스
cd ../project-feature-a && claude
장점: git 충돌 없음, 깨끗한 작업 디렉토리, 출력 비교 용이, 같은 작업을 다른 접근으로 벤치마크 가능.
새 프로젝트를 시작할 때 빈 레포에서 2개의 Claude 인스턴스로 시작:
인스턴스 1: 스캐폴딩 에이전트 (왼쪽 터미널)
인스턴스 2: 딥 리서치 에이전트 (오른쪽 터미널)
시작 셋업: 왼쪽 터미널 = 코딩, 오른쪽 터미널 = 질문. /rename과 /fork 활용.
최소한으로 시작하는 게 더 빠르다. Context7을 매번 쓰거나 링크를 스크래핑하거나 Firecrawl MCP를 쓰는 건, 이미 깊이 파고든 상태에서 Claude가 문법을 틀리거나 구식 함수/엔드포인트를 쓸 때 효과적이다.
많은 문서 사이트가 LLM에 최적화된 깔끔한 문서 버전을 제공한다:
https://www.helius.dev/docs/llms.txt
https://docs.anthropic.com/llms.txt
문서 페이지의 URL 끝에 /llms.txt를 붙여보면 된다. 있으면 Claude에게 바로 먹일 수 있는 최적화된 버전을 얻을 수 있다.
서브에이전트는 컨텍스트를 아끼려고 요약을 반환하지만, 오케스트레이터가 가진 "왜 이걸 하는지"라는 맥락을 모른다. 서브에이전트는 문자 그대로의 쿼리만 알지, 요청 뒤의 목적/이유를 모른다.
@PerceptualPeak의 비유: "상사가 너를 회의에 보내서 요약해오라고 한다. 네가 요약하면 상사는 10번 중 9번은 추가 질문을 한다. 네 요약에는 상사가 알아야 할 모든 게 포함되지 않는다 — 상사의 암묵적 맥락이 없으니까."
오케스트레이터 (맥락 있음)
│ 쿼리 + 목적(objective)과 함께 전달
▼
서브에이전트 (맥락 없음)
│ 요약 반환
▼
평가: 충분한가?
├─ YES → 수락
└─ NO → 후속 질문
│
▼
서브에이전트가 다시 조사 → 반환
(최대 3사이클, 무한 루프 방지)
핵심: 쿼리만 주지 말고 broader objective도 같이 전달해야 서브에이전트가 요약에서 뭘 우선할지 안다.
Phase 1: RESEARCH (Explore agent)
→ 컨텍스트 수집, 패턴 식별
→ Output: research-summary.md
Phase 2: PLAN (planner agent)
→ research-summary.md 읽기
→ 구현 계획 작성
→ Output: plan.md
Phase 3: IMPLEMENT (tdd-guide agent)
→ plan.md 읽기
→ 테스트 먼저 작성
→ 코드 구현
→ Output: 코드 변경
Phase 4: REVIEW (code-reviewer agent)
→ 모든 변경 리뷰
→ Output: review-comments.md
Phase 5: VERIFY (build-error-resolver)
→ 테스트 실행
→ 이슈 수정
→ Output: 완료 or Phase 3으로 루프백
규칙:
/clear 로 컨텍스트 신선하게Tier 1: 바로 효과 (쉬움)
| 패턴 | 설명 |
|---|---|
| 서브에이전트 | 컨텍스트 오염 방지 + 즉석 전문화. 멀티에이전트의 절반 효과지만 복잡도는 훨씬 낮음 |
| 메타프롬프팅 | "3분 프롬프팅으로 20분짜리 작업을 안정적으로." 가정을 검증하고 안정성 향상 |
| 시작 시 질문 많이 받기 | Plan 모드에서 질문에 답하면 됨. 일반적으로 효과적 |
Tier 2: 숙련 필요 (어려움)
| 패턴 | 주의점 |
|---|---|
| 장시간 에이전트 | 15분 vs 1.5시간 vs 4시간 작업의 형태와 트레이드오프 이해 필요. 긴 시행착오 |
| 병렬 멀티에이전트 | 분산이 매우 높음. 고복잡도 OR 잘 분리된 작업에서만 유용. "2개 작업이 10분 걸리는데 프롬프팅이나 병합에 시간을 쓰면 역효과" |
| 역할 기반 멀티에이전트 | "모델이 너무 빨리 진화해서 하드코딩된 휴리스틱이 의미 없어진다." 테스트 어려움 |
| 컴퓨터 사용 에이전트 | 매우 초기 패러다임. 길들이기 필요 |
핵심: Tier 1을 마스터하고 나서, 진짜 필요할 때만 Tier 2로.
GitHub, Supabase, Vercel, Railway 같은 MCP들은 대부분 해당 플랫폼의 CLI를 래핑한 것일 뿐이다. MCP는 편리한 래퍼지만 컨텍스트 비용이 따른다.
MCP 기능을 스킬과 커맨드로 번들화한다. MCP가 노출하는 쉬운 도구들을 커맨드로 변환.
# GitHub MCP 대신
/gh-pr # gh pr create를 선호 옵션으로 래핑
# Supabase MCP 대신
/db-query # Supabase CLI를 직접 사용하는 스킬
기능은 같고, 편의성도 비슷한데, 컨텍스트 윈도우가 해방된다.
최근 Claude Code가 MCP 지연 로딩(lazy loading)을 도입해서 컨텍스트 윈도우 문제는 많이 개선되었다. 이전에는 MCP가 시작부터 윈도우를 잡아먹었지만 이제는 아니다.
그러나 토큰 사용량과 비용은 여전히 CLI + 스킬 방식이 유리하다. 특히 DB 쿼리나 배포 같은 무거운 MCP 작업에서 CLI로 실행하면 토큰 사용이 상당히 줄어든다.
"초기에 재사용 가능한 워크플로우/패턴을 만드는 데 시간을 썼다. 만들 때는 지루했지만, 모델과 에이전트 하네스가 개선될수록 미친 복리(compounding) 효과가 있었다."
"이 워크플로우들은 Codex 같은 다른 에이전트에도 그대로 전환 가능하다."
한 번 만들면 모델 업그레이드에도 그대로 작동한다. 패턴에 투자 > 특정 모델 트릭에 투자.
| 구성 요소 | 역할 | 핵심 |
|---|---|---|
| Skills | 워크플로우 축약어 | ~/.claude/skills/ |
| Commands | 슬래시로 실행하는 스킬 | ~/.claude/commands/ |
| Hooks | 이벤트 트리거 자동화 | PreToolUse, PostToolUse, Stop |
| Subagents | 제한된 스코프의 위임 에이전트 | ~/.claude/agents/ |
| Rules | 항상 따르는 규칙 | ~/.claude/rules/ 또는 CLAUDE.md |
| MCPs | 외부 서비스 연결 | 활성화 10개 미만 유지 |
| Plugins | 도구 패키지 | 동시 활성화 4~5개 |
| 테크닉 | 핵심 |
|---|---|
| 세션 요약 파일 | 세션마다 .tmp에 상태 저장 → 다음 세션에 로드 |
| 전략적 compact | auto 끄고 논리적 분기점에서 수동 /compact |
| 동적 시스템 프롬프트 | --system-prompt로 상황별 컨텍스트 주입 |
| 메모리 지속성 훅 | PreCompact → Stop → SessionStart 체인 |
| 지속적 학습 | Stop 훅으로 세션 분석 → 스킬 자동 생성 |
| 토큰 최적화 | Haiku+Opus 조합, mgrep, 모듈러 코드, 백그라운드 프로세스 |
| 검증 루프 | 체크포인트 기반 vs 연속 기반 eval |
| 병렬화 | 최소한의 인스턴스, 메인=코드/포크=리서치, 캐스케이드 |
| 프로젝트 시작 | Two-Instance Kickoff (스캐폴딩 + 딥 리서치) |
| 서브에이전트 고급 | 반복적 검색 패턴, 순차 페이즈, Tier 1부터 |
| MCP→CLI 대체 | CLI+스킬로 토큰 절약, 기능은 동일 |
| 복리 투자 | 패턴에 투자 > 모델 트릭에 투자 |
이 글은 Affaan Mustafa(@affaanmustafa)의 Shorthand Guide와 Longform Guide를 한국어로 취합 정리한 것입니다. 2026년 3월 기준.
https://roboco.io/posts/everything-claude-code-distilled/
https://digitalbourgeois.tistory.com/2636