본문 바로가기
기타

Claude Code 고삐 채우기

by hjcode 2026. 4. 6.

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    # 피드백 분석 → 체크리스트 업데이트

 

반응형