
CLAUDE.md를 이층 구조로 나누기: '매번 복창하는 규칙'과 '폐지된 방침'을 별도로 관리하는 방식
요약
Claude Code의 CLAUDE.md를 '행동 규칙'과 '결정 이력'의 이층 구조로 관리하여 규칙 준수율을 높이는 기법을 소개합니다. 규칙을 매번 복창하게 함으로써 현재형 규칙을 유지하고, 폐지된 방침을 명시하여 과거의 잘못된 방식이 재발하는 것을 방지합니다.
핵심 포인트
- CLAUDE.md를 행동 규칙과 결정 이력으로 분리하여 관리
- 규칙 일체를 매번 출력하도록 하여 지시 사항의 휘발 방지
- 과거 방침을 삭제하지 않고 '폐지'로 기록하여 재발 방지
- 규칙 복창에 따른 컨텍스트 소비는 실제 운영 시 미미함
Claude Code에게 매번 규칙을 복창하게 하면, 결정한 사항을 더 잘 지키게 된다는 기법이 있습니다. CLAUDE.md 안에 "이 규칙 일체를 매번 응답 서두에 출력하라"라는 항목을 포함함으로써, 규칙의 존재 자체를 매 턴마다 상기시키는 방식입니다.
저도 이 메커니즘의 일부를 도입했습니다. 동작이 안정되었다는 느낌을 받고 있습니다 (정량적으로 측정하지 않은 체감상입니다). 걱정했던 컨텍스트 (Context) 소비도 실제로는 거의 신경 쓰이지 않았습니다.
하지만 1년간 운용해 보니, 이 방식으로는 유지할 수 없는 것이 있다는 것을 알게 되었습니다. 바로 과거에 버린 방침이 나중에 다시 돌아오는 현상입니다. 복창만으로는 이를 막을 수 없었습니다.
그래서 CLAUDE.md를 이층 구조로 나누어 관리하고 있습니다. 그 형태를 공유합니다.
다루는 대상이 성질이 다른 두 종류였기 때문입니다.
행동 규칙은 "어떻게 움직일 것인가"입니다. 실행 전에 확인을 받을 것, 마음대로 우회하지 말 것, 보고 형식을 지킬 것 등입니다. 이것은 매 턴 눈에 들어온다면 유지됩니다. 복창이 효과를 발휘하는 것은 바로 이 층입니다.
결정 이력은 "과거에 무엇을 선택했고, 무엇을 버렸는가"입니다. 이전에 A 방식으로 가기로 결정했다가, 나중에 A를 그만두고 B로 바꿨습니다. 이 "A를 버렸다"라는 사실은, B를 매번 복창한다고 해서 전달되지 않습니다. 시간이 지나면 다시 A가 돌아옵니다.
전자는 현재형 정보이고, 후자는 과거형 정보입니다. 같은 파일에 섞어서 작성했을 때는 후자가 제대로 기능하지 않았습니다.
<law>
# 작업 원칙
제1원칙: 파일 생성·갱신·명령 실행 전에 작업 계획을 제시하고,
...
이 형태의 핵심은 마지막 제5원칙입니다.
"매번 출력하라"라는 규칙을 평범하게 적으면, 그 규칙 자체를 잊어버리게 됩니다. 지시를 잊어버리는 것이니 당연합니다.
그 문제를 원칙 일체 안에 "원칙 일체를 매번 출력하라"를 포함시킴으로써 해결하고 있습니다. 원칙을 출력하면 그 안에 "매번 출력하라"도 포함되어 있으므로, 다음 턴에서도 출력해야 한다는 사실이 매번 눈에 들어옵니다. 스스로를 유지하는 형태가 됩니다.
내용은 자유롭게 교체해도 상관없지만, 이 제5원칙에 해당하는 항목만은 남겨두세요. 이것이 빠지면 다른 원칙들도 몇 턴 지나지 않아 희미해집니다.
원래 형태에는 없는 항목을 하나 추가했습니다. 제4원칙, "폐지된 방침에 적힌 방식은 사용하지 않는다"입니다.
이것이 없으면 이층 구조가 기능하지 않습니다. 파일 하단에 "폐지된 방침"을 적어 두어도, 그것을 볼 동기가 없기 때문입니다. 매번 복창되는 원칙 안에 폐지 리스트를 참조하라는 지시를 넣어둠으로써 두 층이 연결됩니다.
삭제가 아니라 '폐지'로서 남겨두는 것이 핵심입니다.
❌ 해당 행을 삭제한다
→ 손에 닿는 곳에서는 사라지지만, 동작에는 남아 있을 수 있다.
게다가 "A는 버렸다"라는 정보까지 사라지기 때문에, A가 돌아왔을 때
...
방침을 바꿀 때도 새로운 것만 추가하지 않도록 하고 있습니다.
❌ "앞으로는 B의 형태로 부탁합니다"
✅ "이전에는 A의 형태로 요청했으나, (이유) 때문에 A는 폐지했다.
앞으로는 B의 형태로 해주길 바란다.
...
예전 것을 명시적으로 부정하고 나서 새로운 것을 전달합니다. 단지 이뿐이지만, 다시 돌아오는 빈도가 줄었습니다.
매번 원칙을 출력하게 하면 컨텍스트를 압박하지 않을까 처음에는 생각했습니다.
실제로 운용해 보니 거의 신경 쓰이지 않았습니다. 원칙 일체는 기껏해야 수백 토큰 정도이며, 반복해도 쌓이는 양은 한정적입니다. 컨텍스트를 정말로 소비하는 것은 파일 읽기와 도구 (Tool) 실행 결과였습니다. 큰 파일 하나를 읽게 하는 것만으로도 수천에서 수만 토큰이 올라갑니다.
줄여야 한다면 그쪽입니다. 복창하는 분량을 아끼려고 원칙을 너무 짧게 만들면, 정작 중요한 규칙이 희미해져 본말전도가 됩니다.
다만, CLAUDE.md 전체를 부풀리는 것은 별개의 문제입니다.
저는 한때 이것저것 써넣다가 비대해져서, 가장 지켜주길 바라는 규칙이 묻혀버린 적이 있습니다. 긴 문서 속에서는 하나하나의 기술이 갖는 존재감이 옅어집니다.
상주시키는 것은 프로젝트 기간 내내 변하지 않는 것들로만 제한하고 있습니다. 특정 작업에서만 필요한 지시는 그때그때의 요청문에 전달합니다. 이 선을 긋고 나서 작성한 규칙이 먹히는 확률이 높아졌습니다.
"폐지된 방침"도 너무 많아지면 오래된 것부터 정리해 나갑니다. 반년 이상 나오지 않는 항목은 삭제해도 다시 돌아오지 않는 경우가 많습니다.
- CLAUDE.md는 이층 구조로 유지한다. 행동 규칙(현재형)과 결정 이력(과거형)
- 행동은 매번 복창하게 함으로써 유지된다. 원칙 내에 "매번 출력하라"를 포함하는 것이 핵심이다.
- 결정 이력은 복창만으로는 유지할 수 없다. 폐지 리스트 (deprecated list)로 남겨두고, 원칙에서 이를 참조하게 한다.
- 방침 변경 시에는 오래된 것을 명시적으로 부정(negate)한 뒤 새로운 것을 전달한다.
- 복창으로 인한 컨텍스트 (context) 소비는 오차 범위 내이다. 실제로 소비되는 것은 파일 읽기 (file reading)와 도구 출력 (tool output)이다.
- 전체 길이는 길게 하지 않는다. 상주 (resident)하는 것은 영원히 변하지 않는 것뿐이다.
행동이 안정적이지 않다고 느낄 때와, 결정했던 사항이 다시 돌아온다고 느낄 때는 취해야 할 조치가 다릅니다. 겉보기에는 똑같이 "지켜주지 않는다"라고 보일 수 있지만, 층(layer)이 다르기 때문입니다. 도움이 되었다면 저장해 두었다가, CLAUDE.md를 재구성할 때 다시 확인해 보세요.
평소에는 raplsworks.com에서 WordPress 플러그인 개발 및 Claude Code 관련 내용을 쓰고 있습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기