에이전트를 9개로 줄이고 CLAUDE.md를 다이어트시킨 뒤, Compacting conversation...이 뜨는 간격이 눈에 띄게 길어졌다. 같은 작업을 시켜도 예전보다 한참을 더 버텼다. 뿌듯했다.
그런데 기능 추가를 요청하고 콘솔을 지켜보는 중이었다. 테스트가 돌아갔다. 케이스 30개, 전부 통과. 그런데 Claude가 성공한 테스트를 다시 언급하고 있었다. 간질간질하게 이상한 느낌이 들었다.
Claude에게 물어봤다. “방금 성공한 테스트를 왜 다시 언급해?” Claude는 도구라는 개념을 설명해줬다. Claude가 터미널 명령을 실행하거나 파일을 읽을 때, 그건 전부 “도구 호출"이다. 그리고 도구를 한 번 실행할 때마다 그 결과물이 통째로 대화 맥락에 쌓이는 구조였다. npm test 결과 30줄, Hugo 빌드 로그 180줄, 전부. 테스트가 전부 성공했으면 볼 게 없는데 30개를 전부 읽은 거다. 빌드 에러를 잡을 때도 필요한 건 마지막 5줄인데 180줄을 전부 올렸다.
새는 바가지는 하나가 아니었다.
가라사대, hooks를 따를지어다
구글링을 하다가 Claude Code의 hooks를 발견했다. PreToolUse — Claude가 도구를 실행하기 직전에 끼어드는 스크립트다. Bash 명령이 실행되기 전에 출력을 가공할 수 있고, 읽기 도구가 호출되기 전에 차단할 수도 있다.
my precious를 지킬 계명을 세울 수 있게 됐다.
첫 번째 계명: 성공한 것은 보지 말지어다
테스트 30개가 전부 통과했는데 다시 읽어들일 필요는 없다. 실패한 케이스만 골라서 보여주고 나머지는 버리는 hook을 만들었다. (Claude에게 만들어달라고 했다.)
| |
앞서 30개의 테스트를 Claude가 전부 살펴봤다면, 이젠 실패한 케이스만 살펴본다. 전부 통과하면 읽는 양이 0이다. 100%의 불필요한 읽기를 없앴다.
두 번째 계명: 에러 아닌 것은 올리지 말지어다
Hugo 빌드 로그 180줄, Docker 빌드 80줄 — 에러를 찾으려고 전부 올릴 필요가 없다. 같은 논리로 ERROR, WARN, failed만 걸러서 보여주는 hook을 만들었다.
| |
180줄이 5줄로 줄었다. 97%를 덜어냈다. Docker도 80줄이 10줄 안팎이 됐다.
세 번째 계명: 쓸모없는 것은 읽지도 말지어다
더 이상 쓰지 않는 아카이브 폴더가 있다. Claude가 파일 탐색 중에 이 폴더를 열어볼 이유가 없다. Read 도구 호출을 가로채고, 경로에 _archive가 포함되면 아예 거부하는 hook을 만들었다.
| |
단순하지만 확실하다.
그런데 말입니다
체감은 확실했다. Compacting conversation...이 뜨는 빈도가 줄었다. 빌드 한 번 돌려도 컨텍스트가 훨씬 가볍게 유지됐다. hook 3개로 Claude가 불필요한 정보를 읽는 걸 막았다.
근데 “체감"이었다. 정확히 얼마나 줄었는지는 몰랐다. 어제보다 오늘이 나은 것 같은데, 얼마나 줄었는지 자랑할 수가 없다! EP.1에서 “에이전트를 쪼개면 줄겠지"라고 근거 없이 믿었던 것과 뭐가 다른가.
측정하지 않으면 개선한 게 아니다. 정량 측정이 필요한 시점이다.
참고