TL;DR
Claude Code가 자꾸 "완료했습니다" 해놓고 안 돼있고, "확인해주세요"로 떠넘기고, 같은 실수를 반복해서 AI한테 사전에 자기 검열을 시키는 시스템을 만들어봤다.
계기
Claude Code를 쓰다 보면 반복되는 패턴이 있다.
작업 시킴 → "완료했습니다" → 확인해보면 안 돼있음 → 화남 → 다시 시킴 → 또 같은 실수 → 더 화남
이 루프를 끊고 싶었다. 그러다 Hugh Kim의 Harsh Critic 블로그를 읽고 "이거다" 싶어서 바로 적용해봤다.
사후 대응이 아니라 사전 차단이다. AI가 결과물을 나한테 보여주기 전에, 스스로 "이거 내가 봐도 욕 먹을 만한가?" 체크하게 만드는 것.
실제로 적용한 것
1차 방어 — Hook (HARD)
Claude Code의 hook 시스템을 사용했다. hook은 Claude Code가 도구를 실행하기 직전에 자동으로 돌아가는 셸 스크립트인데, 조건에 안 맞으면 exit 2로 물리적 차단을 한다. 약속이 아니라 강제다.
3개 hook을 만들었다.
protect-files.sh — .env, package-lock.json 같은 보호 파일을 수정하려고 하면 차단. "실수로 건드렸어요"가 원천적으로 불가능해진다.
block-dangerous-commands.sh — rm -rf, git push -f, git reset --hard 같은 파괴적 명령어를 차단. npm run dev 자동 실행도 막는다. (개발 서버는 이미 돌아가고 있으니까)
pre-commit-validation.sh — 커밋 메시지에 AI attribution이 들어가거나, 커밋과 푸시를 한 명령에 묶으려고 하면 차단.
설정은 .claude/settings.json에 넣으면 끝이다.
{
"hooks": {
"PreToolUse": [
{
"matcher": "Edit|Write",
"hooks": [{ "type": "command", "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/protect-files.sh" }]
},
{
"matcher": "Bash",
"hooks": [
{ "type": "command", "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/block-dangerous-commands.sh" },
{ "type": "command", "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/pre-commit-validation.sh" }
]
}
]
}
}
2차 방어 — 체크리스트 (SOFT)
CLAUDE.md에 자가 점검 체크리스트를 추가했다. 작업 완료 후, Code Review 전에 반드시 돌리게 만들었다.
3단계로 나뉜다.
EXTREME (즉시 수정) — 예외 지시 위반, 거짓 완료 보고, 검증 없이 PASS, 같은 실수 반복. 이건 절대 사용자한테 넘기면 안 되는 것들이다.
HIGH (수정 필수) — 떠넘기기, 범위 오해, 디자인 미달, 근거 없는 규칙, 테스트 없이 완료, 변경 범위 누락. 다 고쳐야 넘어갈 수 있다.
MEDIUM (경고) — 불필요한 허가 요청, 기존 인프라 무시, 형식적 사과. 자가 개선 영역이다.
FINDING 0이 될 때까지 반복 점검하게 했다.
3차 — 자가발전 루프
체크리스트가 정적이 아니라 알아서 진화한다.
UserPromptSubmit hook으로 사용자 메시지를 감시해서, "왜이래", "안돼", "또" 같은 불만 키워드가 2개 이상 감지되면 .claude/feedback.jsonl에 자동 기록한다.
{"timestamp":"2026-04-06T03:28:38Z","keywords":["왜이래","안돼","또"],"message_preview":"왜이래 또 안돼","resolved":false}
그리고 /self-improve 명령을 실행하면 쌓인 피드백을 분석해서 CLAUDE.md 체크리스트에 새 항목을 자동 추가한다.
Session N에서 화나면 → Session N+1에서 분석 → Session N+2에서 사전 차단 성공.
일주일 정도 쓰다가 /self-improve를 실행하면 된다. 그러면 feedback.jsonl에 쌓인 기록을 읽고, 기존 체크리스트와 비교해서 "이건 이미 있는 항목이네", "이건 새로운 패턴이다"를 판단한 다음, 필요하면 CLAUDE.md에 항목을 추가하고 결과를 보고해준다.
처리된 기록은 resolved: true 로 바뀌니까 다음에 또 분석되진 않는다.
최종 구조
.claude/
├── settings.json # hook 설정
├── feedback.jsonl # 불만 기록 (자동, .gitignore 등록)
├── hooks/
│ ├── protect-files.sh # 보호 파일 수정 차단
│ ├── block-dangerous-commands.sh # 위험 명령어 차단
│ ├── pre-commit-validation.sh # 커밋 규칙 검증
│ └── feedback-detector.sh # 불만 키워드 자동 감지
└── commands/
└── self-improve.md # 피드백 분석 → 체크리스트 업데이트
'기타' 카테고리의 다른 글
| 프론트엔드 개발자 관점으로 바라보는 관심사의 분리와 좋은 폴더 구조 (0) | 2024.09.24 |
|---|---|
| 아키텍처 FSD (1) | 2024.09.05 |
| SOLID 원칙으로 리액트 훅 작성하기 (0) | 2024.06.18 |
| Query Keys를 관리하는 기준과 방법 (0) | 2024.03.28 |
| [번역] React Query 적으로 사고하기 (0) | 2023.06.26 |