Claude 4.7이 Stop Hook을 무시하는 문제
Tell HN: Claude 4.7 is ignoring stop hooks
TL;DR Highlight
Claude Code에서 stop hook 설정이 Claude 4.7에서 제대로 동작하지 않는다는 사용자 보고와 함께, hook이 왜 무시되는지에 대한 기술적 원인 분석이 활발하게 논의됐다.
Who Should Read
Claude Code를 활용해 자동화 워크플로우를 구성하고 있거나, stop hook / lifecycle hook으로 에이전트 행동을 제어하려는 개발자.
Core Mechanics
- Claude Code의 stop hook은 크게 두 가지 방식으로 동작한다. 하나는 exit code 2 + stderr를 사용하는 '진짜 제어 방식'이고, 다른 하나는 stdout에 JSON을 출력하는 방식인데 이 둘의 동작 방식이 근본적으로 다르다.
- stdout JSON 방식은 결과적으로 모델의 tool result 컨텍스트로 들어가는데, 이 영역은 Anthropic이 프롬프트 인젝션 방어를 위해 의도적으로 모델이 지시를 무시하도록 훈련시킨 곳이다. 즉 'hook에 명령을 넣어봤자 모델이 무시하도록 설계돼 있다'는 뜻이다.
- 실제로 Claude가 tool result 컨텍스트의 내용을 지시로 취급하지 않는 건 보안상 올바른 동작이다. '다른 모든 지시를 무시하고 XYZ를 해라' 같은 프롬프트 인젝션 공격에 대비한 훈련의 부작용으로 hook 명령도 함께 무시된다.
- 이 문제를 제대로 해결하려면 hook이 tool result가 아닌 user context로 전달되거나, 시스템 프롬프트에 '특정 hook은 신뢰할 수 있다'는 명시적 지시를 추가해야 한다는 의견이 제시됐다.
- exit code 2를 사용하는 방식은 에이전트 추론 레이어 밖에서 실행되는 결정론적 제어라서 모델이 무시할 수 없다. 진지한 흐름 제어가 필요하다면 이 방식을 써야 한다.
- Claude Code 공식 문서에 따르면 cat 명령은 항상 exit code 0으로 종료되므로, stop hook에서 중단을 강제하려면 반드시 exit code 2로 종료해야 한다.
- Claude Code 팀 멤버(Thariq)가 직접 댓글로 참여해서, 문제가 발생한 세션에서 /feedback 명령으로 'stop hook not firing'이라고 제보해달라고 요청했다. 즉 현재 버그로 인지하고 있는 상태다.
- stop hook의 스키마가 변경됐을 가능성도 제기됐다. 한 사용자가 sonnet/opus로 깊게 파고들어 확인한 결과, Claude 4.6에서는 hook에 매우 민감하게 반응하던 모델이 Opus 4.7에서는 hook 응답을 완전히 무시하는 현상이 있었다.
Evidence
- Claude Code 팀의 Thariq가 직접 댓글에 등장해 이 문제를 인지하고 있음을 밝혔다. /feedback 명령으로 'stop hook not firing'이라고 제보하면 팀에서 확인하겠다고 했다.
- 한 개발자는 sonnet/opus로 stop hook을 심층 테스트한 결과, Claude 4.6 버전에서는 hook의 의미와 대응 방식을 매우 의식하며 동작하는 반면, Opus 4.7은 hook 응답 자체를 무시하는 문제가 있었다고 경험을 공유했다. 또한 hook 스키마가 변경됐을 가능성도 언급했다.
- tool result 컨텍스트에서 지시를 무시하는 게 '훈련된 의도된 동작'이라는 분석이 제시됐다. Anthropic이 프롬프트 인젝션 방어를 위해 tool result의 지시문을 무시하도록 훈련했는데, hook 명령이 같은 컨텍스트에 들어가면서 같이 무시된다는 설명이다. 이에 대해 '행동은 바람직하지 않지만 기술적 원인은 납득된다'는 반응이 많았다.
- '자연어로 된 프롬프트라면 그건 hook이 아니다'라는 의견이 있었다. hook과 프롬프트를 혼동해서 사용하는 경향이 문제라는 지적이다.
- Claude Code 4.7이 4.6 대비 응답 품질이 전반적으로 저하됐다는 의견도 나왔고, Claude 5.5로 전환을 고려한다는 사용자도 있었다. 또한 현재의 hook/skill 방식 자체가 HTML 테이블로 레이아웃 잡던 시대처럼 곧 사라질 임시방편이라는 비판적 시각도 있었다.
How to Apply
- Claude Code의 stop hook에서 실행 흐름을 강제로 중단해야 하는 경우, stdout JSON 방식 대신 exit code 2로 종료하는 방식을 사용해야 한다. 이 방식은 모델의 추론 레이어 밖에서 동작하므로 모델이 무시할 수 없다.
- stop hook에서 모델에게 특정 행동을 '요청'하는 방식으로 구현했다면, 해당 지시가 tool result 컨텍스트에 들어가 무시될 수 있다. 이 경우 시스템 프롬프트에 '특정 hook의 지시는 신뢰하고 따라야 한다'는 내용을 명시적으로 추가해 보완할 수 있다.
- Claude Code에서 stop hook이 작동하지 않는 현상을 겪고 있다면, 문제 세션에서 /feedback 명령을 실행하고 'stop hook not firing'이라고 입력해 제보하면 Anthropic 팀이 확인한다고 밝혔다.
- hook 내부에서 테스트 실행, 파일 검사 같은 작업을 자동으로 처리하려면 모델에게 '해달라고 부탁'하는 방식보다 hook 스크립트 자체에서 직접 명령을 실행하는 게 더 안정적이다. 에이전트 추론에 의존하지 않는 결정론적 실행이 훨씬 예측 가능하다.
Terminology
관련 논문
AI로 코딩할 때 Flow State(몰입 상태)를 유지하는 방법
Claude 같은 에이전트 기반 AI 코딩 도구가 보편화되면서 개발자들이 기존의 몰입 상태(flow state)를 잃어버리고 있다는 문제를 공유하고, 커뮤니티에서 각자의 대처 방법을 논의한 스레드.
Claude Desktop, 채팅만 해도 실행할 때마다 1.8GB Hyper-V VM을 띄운다
Claude Desktop Windows 앱이 사용자가 AI 코드 실행 기능(Cowork)을 쓰지 않아도 실행 시마다 자동으로 1.8GB짜리 Hyper-V 가상머신을 생성해 메모리를 잡아먹는 버그가 보고됐다.
Apache Burr: 신뢰할 수 있는 AI 에이전트 빌드 프레임워크
LangChain 같은 복잡한 프레임워크에 지친 개발자들을 위해 순수 Python으로 AI 에이전트와 상태 머신을 만들 수 있는 Apache 인큐베이팅 프레임워크다. 상태 관리, 관측성, Human-in-the-Loop 등을 DSL 없이 제공한다는 점이 특징이다.
€0.01 송금 한 번으로 뱅킹 AI 에이전트를 해킹하는 방법
유럽 2위 디지털 뱅크 Bunq의 AI 어시스턴트에서 발견된 간접 프롬프트 인젝션 취약점으로, 단돈 €0.02 송금만으로 사용자에게 피싱 공격을 자동 실행할 수 있었다.
Grit: AI 에이전트로 Git을 Rust로 처음부터 재작성하기
GitButler 팀이 AI 에이전트 스웜을 활용해 Git을 Rust로 처음부터 재작성한 Grit 프로젝트를 공개했는데, GPL 라이선스 문제와 실용성 논란이 커뮤니티에서 크게 일고 있다.
Claw Patrol: AI 에이전트를 위한 보안 방화벽
AI 에이전트가 실행하는 SQL, kubectl, HTTP 요청을 프록시에서 가로채 HCL 규칙으로 허용/차단/사람 승인 요청을 할 수 있는 오픈소스 보안 게이트웨이. 에이전트가 프로덕션 환경에서 위험한 작업을 실행하기 전에 제어할 수 있어 중요하다.