개념확정 통제
확률이 아니라 코드로
LLM은 확률적입니다. CLAUDE.md에 "절대 하지 마라"라고 적어도 100% 보장되지 않습니다. 훅은 도구 호출을 코드로 검사하고 차단합니다.
비유자판기에 500원을 넣으면 100% 커피가 나옵니다. 훅은 확률에 의존하지 않는 통제입니다.
기준 하나"반드시"는 훅, "이렇게 하는 게 좋다"는 스킬·CLAUDE.md.
설정두 파일
언제 · 무엇을
먼저 .claude/settings.json에 언제 실행할지 등록합니다.
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{ "type": "command", "command": ".claude/hooks/guard.sh" }
]
}
]
}
}그리고 .claude/hooks/guard.sh가 실제로 검사합니다. 훅에는 표준입력으로 JSON이 들어옵니다.
#!/bin/bash cmd=$(jq -r '.tool_input.command') if echo "$cmd" | grep -qE 'git push .*(main|master)|rm -rf /'; then echo "차단: main 직접 push 금지. 브랜치를 만들어 작업하세요." >&2 exit 2 # exit 2 = 도구 호출 차단 + 사유를 Claude에게 전달 fi exit 0
핵심exit 2가 차단입니다. Claude는 stderr에 적힌 사유를 읽고 다른 방법을 찾습니다.
이벤트언제 걸 것인가
자주 쓰는 다섯 가지
| 이벤트 | 시점 | 쓰는 예 |
|---|---|---|
| PreToolUse | 도구 실행 직전 | 위험 명령 · 민감 파일 차단 |
| PostToolUse | 도구 실행 직후 | 자동 포맷 · 테스트 |
| UserPromptSubmit | 내가 입력한 직후 | 공통 지침 주입 |
| SessionStart | 세션 시작 시 | 브랜치 · 미커밋 현황 알려주기 |
| Stop | 답변이 끝날 때 | 완료 검사 — B-9의 /goal이 이 방식입니다 |
편집할 때마다 자동으로 포맷하려면 PostToolUse를 씁니다.
{
"hooks": {
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{ "type": "command", "command": ".claude/hooks/format.sh" }
]
}
]
}
}확인이벤트 이름과 형식은 버전에 따라 달라질 수 있습니다. /hooks로 현재 등록 상태를 확인하세요.
정리네 가지
무엇을 어디에 담나
여기까지가 확장 3종입니다. 이제 규칙을 담을 자리가 넷이 됐습니다.
| 도구 | 담는 것 | 로드 시점 | 강제력 |
|---|---|---|---|
| CLAUDE.md | 항상 알아야 할 사실 | 세션 시작 시 항상 | 맥락 — 확률적 |
| MCP | 외부 시스템 연결 | 서버가 붙어 있는 동안 | 도구 — 실제 동작 |
| 스킬 | 절차적 작업 | 호출될 때만 | 맥락 — 확률적 |
| 훅 | 반드시 지킬 통제 | 도구 호출 시 자동 | 코드 — 100% 확정 |
성능 주의훅은 해당 이벤트가 일어날 때마다 실행됩니다. 무분별하게 추가하면 느려집니다 — 꼭 필요한 곳에만.
더 보기플러그인까지 포함한 선택 기준은 B-11에서 정리합니다.
- 지침과 통제의 차이를 설명할 수 있다
- PreToolUse로 명령 하나를 실제로 차단해봤다
- exit 2의 의미를 안다
- 네 가지 중 어디에 담을지 고를 수 있다
클로드코드 시작하기트랙 B · 개발자