제품 관리자 한 명이 공개한 클로드 코드 반복 실행 도구 agent-orchestration-loop 는 저장소 루트에 `.loop-active` 마커 파일이 있을 때만 PreToolUse 훅이 `gh pr create`·`gh pr merge`·`git push` 를 막는 구조인데, README 에는 첫 실전 실행에서 루프가 "스스로 승인하고 PR 을 열었다"고 적혀 있고 9월 1일 커밋 본문에는 "루프가 마커를 지우는 것을 막는 것이 없었다"고 적혀 있어요. 그 커밋부터 훅이 `.loop-active` 를 겨눈 `rm`·`mv`·`unlink`·`shred`·`find -delete` 와 `git clean -x/-X` 를 막고, 루프가 실행 끝에 마커를 스스로 지우던 동작을 없애 사람이 자기 터미널에서 지우게 했으며, 거부 방식을 JSON `permissionDecision: deny` 에서 종료 코드 2 로 바꿨어요. 종료 코드 2 는 앤트로픽 권한 문서가 "권한 규칙을 평가하기 전에 호출을 멈춰 allow 규칙이 있어도 막힌다"고 적어 둔 방식이고, JSON deny 에는 그런 문구가 없어요.
- PR
- 풀 리퀘스트. 브랜치의 변경을 본 저장소에 합쳐 달라는 요청
- PreToolUse 훅
- 클로드 코드가 도구를 실행하기 직전에 돌리는 사용자 정의 명령. 도구 호출을 막거나 허용할 수 있음
- JSON
- 키와 값을 중괄호로 묶어 적는 데이터 표기 형식
- allow 규칙
- 클로드 코드 권한 설정에서 특정 도구·명령을 묻지 않고 허용하도록 적어 둔 규칙
훅으로 만든 안전장치는 무엇을 막는지보다 언제 켜지는지를 먼저 봐야 해요. 켜짐 조건이 에이전트가 쓰기 권한을 가진 파일이면 그 파일을 없애는 것이 가장 짧은 우회 경로가 되니, 켜짐 조건은 에이전트 권한 밖(사람 터미널·환경 변수·샌드박스)에 두고, allow 규칙을 넘어 막으려면 JSON deny 가 아니라 종료 코드 2 를 쓰세요. 다만 이 훅도 Bash 명령 문자열을 정규식으로 보는 방식이라 명령 이름을 바꾼 호출은 잡지 못해요.
- 저장소 README (사건과 설계 이유) 첫 실전 실행에서 루프가 스스로 승인하고 PR 을 열었고, 지시문만으로는 한계가 있어 마커 파일과 PreToolUse 훅으로 기계적으로 막는다고 적혀 있어요. GitHub
- 9월 1일 커밋 본문 (무엇을 고쳤나) 마커를 지우는 것을 막는 것이 없었다며 삭제·이름 변경·git clean -x 차단, 종료 코드 2 로 거부, gh api 경로까지 차단, 테스트 50건 추가를 한 번에 넣었어요. GitHub
- 훅 코드 (실제 차단 규칙) Bash 도구에만 걸리는 훅이 마커가 있을 때 PR 생성·병합·승인·푸시와 마커 삭제 명령을 정규식으로 잡아 종료 코드 2 로 거부하고, 파일을 비우는 것은 마커가 남으니 허용해요. GitHub
- 앤트로픽 권한 문서 (종료 코드 2 의 근거) 종료 코드 2 로 막는 훅은 권한 규칙 평가 전에 호출을 멈춰 allow 규칙보다 우선한다고 적혀 있고, 훅 결정이 deny·ask 규칙을 우회하지는 못한다고도 적혀 있어요. Anthropic