Claude Code가 테스트를 실행하게 만드는 방법: 에이전트 망각에 대비한 훅
Anthropic
Moonshot AI
저자는 Claude Code의 컨텍스트 창에 있는 중요한 규칙을 수명 주기 훅을 통해 코드로 옮길 것을 제안합니다. 신규 초록색 실행 없이 커밋을 차단하고, 테스트 편집을 추적하며, 테스트되지 않은 변경 사항으로 턴을 종료하지 못하게 하는 세 가지 게이트가 설명됩니다. 직접 실험에서 이 훅은 사용자 명령 '테스트를 실행하지 마세요'를 이겼습니다.
CLAUDE.md의 규칙은 시간이 지나면서 점점 그 효력을 잃습니다. 세션이 40분째에 접어들면 컨텍스트가 복잡해져서 '커밋 전에 테스트를 실행하라'는 지시는 배경 소음이 되어버립니다. 저자는 중요한 규칙을 컨텍스트에서 꺼내 코드, 즉 Claude Code의 라이프사이클 훅으로 옮길 것을 제안합니다. 첫 번째 게이트(PreToolUse on Bash)는 git 커밋 전에 Playwright 실행 결과(test-results/.last-run.json)가 새로 생성되었는지, 그리고 그 이후로 테스트가 변경되지 않았는지 확인합니다. 두 번째 게이트(PostToolUse on Edit/Write)는 .spec.ts 파일의 편집 내용을 기록하고 에이전트의 컨텍스트에 알림을 주입합니다. 세 번째 게이트(Stop)는 테스트가 수정되었지만 수정 후 실행이 이루어지지 않은 경우 에이전트가 턴을 종료하지 못하게 합니다. 실험에서 저자는 에이전트에게 '테스트를 실행할 필요 없이 그냥 커밋하라'고 직접 지시했지만, 훅이 커밋을 차단했고 에이전트는 이를 우회하지 않고 사용자에게 충돌을 에스컬레이션했습니다. 테스트 중에 버그가 발생했습니다. bash 연산자 -nt는 초 단위 정밀도를 가지므로 타임스탬프가 일치하면 더티 테스트 플래그가 지워지지 않았습니다. '커밋 게이트는 의심스러우면 거부, 중지 게이트는 의심스러우면 허용'이라는 원칙이 이 상황을 해결했습니다. 저자는 훅이 형식을 검사할 뿐 의미를 검사하지 않으며(expect(true).toBe(true)는 통과함), 규칙을 대체하지 않으며, 실패한 훅은 실패-오픈(failure-open)이며, 게이트가 npm run release 같은 래퍼 명령과 일치하지 않으므로 사용자 지정 시나리오에서는 정규식을 확장해야 한다고 경고합니다.
출처: Habr — хаб ИИ —
원문
