Anthropic의 코딩 모델 Fable이 보여준 검증 규율을 Claude Code 훅으로 재현했습니다. 핵심은 고정 체크리스트가 아니라 작업 위험에 맞춰 매번 새로 세우는 완료 기준이고, 훅이 기계적으로 강제하는 것은 마지막 하나입니다. 검증 증거 없이는 작업을 끝내지 못합니다. 원본은 플라잉따릉이(Agent Korea)의 Codex 플러그인입니다. 이름·스킬·워크플로를 그대로 두고 Claude Code로 포팅했습니다.
목표 설정, 근거 수집, 작업 단위 정의, 탈출 기준 설정, 구현, 검증, 반례 탐색, 기준 재조정. 이 루프는 스킬이 안내하고, 훅은 마지막 게이트만 강제합니다.
들어온 요청을 quick normal deep blocked로 나눠 검증 깊이를 컨텍스트로 전달합니다. 파괴적·시크릿 노출 요청은 입력 단계에서 막습니다.
rm -rf, 재귀 Remove-Item, git push, terraform destroy, 시크릿 출력, .env·.pem·id_rsa 편집을 실행 전에 막습니다. 배포·마이그레이션·publish는 일부러 막지 않습니다. 검증 게이트이지 배포 게이트는 아니기 때문입니다.
바뀐 파일, 실행한 검증 명령, 실패를 JSON 장부에 남깁니다. 바뀐 파일이 실제 검증 대상에 포함됐는지(direct·generic·uncertain)까지 추적합니다. 실패로 끝난 검증은 성공으로 적지 않습니다.
코드를 바꿨는데 성공한 검증 증거가 없거나, 작업을 말로만 약속하고 끝내려 하면 종료를 막고 되돌립니다. 무한 루프 방지를 위해 최대 2회까지만 되돌립니다.
rm -r -f 플래그 분리나 base64 파이프 eval로 우회할 수 있습니다. 우회할 수 없는 강제 차단이 필요하면 Claude Code 네이티브 permissions.deny를 함께 설정합니다. 예제가 레포에 있습니다.| 훅 | 역할 |
|---|---|
UserPromptSubmit | 요청 분류와 컨텍스트 주입. blocked는 프롬프트 자체를 막음 |
PreToolUse / PermissionRequest | Bash·PowerShell 파괴적 명령과 시크릿 파일 편집을 실행·승인 전에 deny |
PostToolUse (+Failure) | 성공·실패 양쪽에서 바뀐 파일·검증 명령·커버리지·실패를 장부에 기록 |
Stop | 검증 없는 종료, 말로만 약속한 종료를 되돌림. 최대 2회 |
/fable-ish <작업>으로 직접 부르거나 "fable-ish로 끝까지 구현해"라고 말하면 스킬이 모드별 작업 루프·검증 사다리·최종 보고 형식을 안내합니다.
python3가 PATH에 있어야 합니다. Windows에서 python3가 없으면 hooks/hooks.json의 command를 바꾸면 됩니다.