CLAUDE.md 가 안 지켜지는 이유 — 90KB 를 굴려보고 알게 된 것
규칙을 두 곳에 뒀는데 둘 다 안 걸렸다. 조건부로 내린 규칙은 한 번도 안 실렸다. 크기를 재보니 문서에 적힌 값이 낡아 있었다.
CLAUDE.md 에 분명히 적어뒀는데 그대로 안 한다 — 이 얘기가 익숙하면 이 글이 맞다.
나는 지금 클로드 코드 세션 하나에 90.9KB 짜리 규칙을 자동으로 물려서 쓴다(2026-08-11 실측). 공식 문서 권고는 파일당 200줄 미만이니 한참 넘겼다. 그 상태로 몇 달 굴리면서 같은 실수가 세 번 났다. 세 번 다 "규칙을 더 잘 쓰면 되겠지" 로 시작해서, 세 번 다 그게 답이 아니었다.
사고 ① 같은 규칙을 두 곳에 뒀는데, 둘 다 안 걸렸다
규칙 하나가 있었다.
「안 된다」를 말하기 전에 확인한다.
확인도 안 해보고 "그건 안 됩니다" 라고 단정하는 걸 막으려고 만든 것이다. 중요한 규칙이라고 생각해서 두 곳에 뒀다. 항상 실리는 지침 파일에 한 번, 메모리에 한 번.
그리고 하루에 두 번 걸렸다. "이건 이런 이유로 안 됩니다" 라고 답했고, 두 번 다 "검색해봐" 라는 말에 눌려서 확인해보니 둘 다 뒤집혔다.
여기서 처음엔 "규칙 문장이 약했나" 로 봤다. 그런데 두 곳에 있었다는 게 오히려 답이었다.
두 벌을 뒀다고 걸릴 확률이 두 배가 되지 않는다. 안 걸리는 이유가 「그 자리에 규칙이 없어서」가 아니라 「그 순간 규칙을 떠올릴 계기가 없어서」이기 때문이다. 계기가 없으면 열 곳에 적어도 열 번 다 안 걸린다. 대신 낡을 자리만 두 배가 된다 — 실제로 한쪽을 고치고 다른 쪽을 안 고쳐서, 나중에 서로 다른 말을 하는 두 규칙이 남았다.
한 사실은 한 곳에만 산다. 중복은 안전장치가 아니다.
지금은 두 곳 중 하나를 지웠다. 규칙을 강화한 게 아니라 줄였다.
사고 ② 조건부로 내린 규칙이 한 번도 안 실렸다
파일이 커지자 공식 문서가 권하는 대로 쪼갰다. .claude/rules/ 에 주제별로 나누고, paths: 를 붙여서 해당 파일을 열 때만 실리게 했다. 코드 규칙은 코드를 만질 때만 필요하니 원고 작업 세션에 실을 이유가 없다 — 맞는 판단으로 보였다.
그렇게 코드 규칙 하나를 조건부로 내렸다. 그리고 얼마 뒤 이 말을 들었다.
"이거 10번쯤 말한 것 같다."
같은 지적을 반복해서 듣고 있었다. 규칙에 분명히 적혀 있는 내용인데.
그래서 어떤 규칙이 실제로 실렸는지를 기록으로 남겨두고 세어봤다. 결과가 이랬다.
한 번도 안 실려 있었다. 조건 자체가 안 걸린 것이다.
여기가 무서운 자리다. 규칙을 지우면 없어진 걸 아는데, 조건부로 내리면 파일은 그대로 있어서 있는 줄 안다. 목록에 보이고, 열면 내용도 멀쩡하다. 안 실렸다는 사실은 어디에도 안 나타난다 — 에러도 경고도 없다.
조건부로 내리기 전에, 그 규칙이 「파일을 열 때」 걸리는지 확인한다.
지적을 받는 자리는 파일이 아니라 대화였다. 대화에서 걸려야 하는 규칙은 파일 조건으로 못 잡는다. 그 규칙은 지금 다시 항상 실리는 자리로 올라와 있다.
사고 ③ 문서에 적힌 크기가 낡아 있었다
세 번째는 숫자였다.
규칙이 무거워졌다는 얘기가 나올 때마다 문서에 적힌 값을 그대로 읽어서 답했다. "자동 로드는 71KB 입니다." 어느 날 우연히 실제로 재봤더니 82.6KB 였다. 같은 문서의 다른 줄에 적힌 자산 크기도 2.5G 라고 돼 있었는데 실제로는 2.7G 였다.
둘 다 매 세션 자동으로 실리는 자리에 있던 숫자다. 낡은 값이 매번 같이 실려 나가고 있었다.
"배포했다" 나 "아직 안 됐다" 같은 문장은 낡아 보인다. 시간이 지나면 의심이 켜진다. 그런데 71KB 는 낡아 보이지 않는다. 숫자라서 사실처럼 읽힌다.
그래도 숫자를 적어야 하면 잰 날짜를 붙인다.
71KB 는 사실처럼 보이고 71KB(8/7) 는 의심을 켠다. 여섯 글자가 다음 사람의 실측을 부른다. 이 글에 적은 90.9KB 에도 날짜를 붙여둔 이유가 그것이다.
세 번 다 같은 모양이었다
정리해보니 셋이 한 얘기였다.
| 내가 한 것 | 실제로 일어난 것 | |
|---|---|---|
| ① | 중요해서 두 곳에 뒀다 | 두 곳 다 안 걸리고, 낡을 자리만 둘이 됐다 |
| ② | 무거워서 조건부로 내렸다 | 한 번도 안 실렸는데 있는 줄 알았다 |
| ③ | 정확하라고 숫자를 적었다 | 그 숫자가 낡은 채로 매번 실렸다 |
셋 다 규칙을 더 쓰는 방향이었다. 그리고 셋 다 그래서 안 됐다.
지금 남은 판정은 두 줄이다.
자동으로 실리는 자리에는 「안 낡는 것」만 둔다. 낡는 것은 볼 때 실측한다.
한 사실은 한 곳에만 산다.
90.9KB 가 공식 권고보다 훨씬 큰 건 여전하다. 줄이는 작업은 계속하고 있고, 최근에도 한 프로젝트 규칙을 29.5KB 에서 18.5KB 로 내렸다. 다만 그때 한 일은 문장을 줄인 게 아니라 「이 줄이 낡나」를 하나씩 물어서 낡는 것을 딴 데로 옮긴 것이다. 크기는 결과였지 목표가 아니었다.
그리고 ②는 아직 완전히 안 풀렸다. 조건부 규칙이 안 실렸다는 걸 지금도 따로 기록을 남겨서 세어봐야 안다. 안 실린 것이 스스로 신호를 보내지 않는 한, 같은 사고는 다른 규칙에서 또 날 수 있다.