CLAUDE.md 는 한 번 쓴다. 여섯 달 뒤 노트북에는 그 파일이 열여덟 개 있고, 어느 것이 맞는지 말할 수 없다.
가정이 아니다. 직접 쓰는 기기를 스캔해서 확인한 상태다. 아래는 그 일이 왜 일어나는지, 그리고 가장 먼저 떠오르는 해법이 왜 이 문제를 닫지 못하는지에 대한 기록이다.
에이전트마다 자기 소유의 경로에서 지시문을 읽는다.
| 도구 | 경로 |
|---|---|
| Claude Code | CLAUDE.md, ~/.claude/CLAUDE.md |
| Cursor | .cursor/rules/*.mdc |
| GitHub Copilot | .github/copilot-instructions.md |
| Codex / 그 외 | AGENTS.md |
사본을 네 벌 유지하겠다고 결정한 적은 없다. 도구를 네 개 쓰겠다고 결정했을 뿐이다. 사본은 도구에 딸려 왔다.
세 가지 기전이 드리프트를 만든다. 셋 다 누가 대충 일해서 생기는 것이 아니다.
사용 지점에서 고친다. 작업 도중 에이전트가 이상하게 움직인다. 지금 눈앞에 열려 있는 지시문 파일을 고친다. 그 파일은 넷 중 하나고, 수정도 하나에만 반영된다.
체크아웃은 단위가 아니다. 같은 리포지토리를 두 번 클론해 둔다. 하나는 메인 브랜치, 하나는 오래 끌고 가는 브랜치용이다. 양쪽 모두 지시문 파일을 갖고 있다. 어느 한쪽을 건드리는 순간 갈라진다.
홈 디렉터리 지침은 보이지 않는다. ~/.claude/CLAUDE.md 는 어느 리포지토리에도 속하지 않는다. 어떤 CI 에도 들어가지 않는다. 리뷰에서 논쟁하고 싶지 않았던 규칙이 결국 모이는 자리다.
자연스러운 대응은 사본 유지를 그만두는 것이다. AGENTS.md 를 한 번 쓰고 나머지를 생성한다.
그걸 만들어 봤다. 동작한다. agent-fanout 이다 — 단일 파일 파이썬, 의존성 없음, MIT.
python3 agent_fanout.py
create CLAUDE.md
create .cursor/rules/from-agents-md.mdc
create .github/copilot-instructions.md
생성된 파일에는 직접 수정하지 말라는 헤더가 붙고, CI 에서 --check 를 걸면 손으로 고친 파생 파일이 빌드를 실패시킨다.
이것이 덮는 범위는 CI 가 돌아가는 이 리포지토리 다. 전부처럼 들리지만, 바깥에 남는 것을 적어 보면 이렇다.
예방은 정책이고 탐지는 측정이다. 정책은 우회되며, 재지 않으면 우회된 사실 자체가 보이지 않는다.
agent-drift 는 리포지토리가 아니라 경로를 스캔하고, 파일명이 아니라 내용 유사도로 묶는다.
python3 agent_drift.py ~/work ~/side-projects
Scanned 47 instruction files.
DRIFT: 2 documents, 5 distinct versions between them.
claude-code:CLAUDE.md
6 copies, 3 versions
9b01aeaa204d 3 files, 406 lines
2dc3c616c279 2 files, 411 lines
여기서 파일명 매칭은 쓸모가 없다. 서로 무관한 프로젝트가 서로 다른 CLAUDE.md 를 갖는 것은 정상이고, 그것을 드리프트로 보고하는 도구는 아무도 안 보게 된다. 한 프로젝트가 아니라 작업 디렉터리 전체를 대상으로 돌려야 한다 — 의미 있는 결과는 리포지토리 경계를 넘는 쪽에서 나온다.
| 범위 | 답하는 질문 | |
|---|---|---|
| agent-fanout | 리포지토리 하나 | 파생 파일이 최신인가 |
| agent-drift | 기기 전체, 여러 경로 | 사본이 어디서 갈라졌는가 |
생성은 사본이 존재할 이유를 없앤다. 탐지는 예상하지 못한 이유로 존재하게 된 사본을 잡는다. 둘 중 하나만 하면 덮여 있다는 느낌 만 남는데, 이는 안 덮였다는 사실을 아는 것보다 나쁜 상태다. 내가 그대로 겪었다.
솔직한 종착점은 두 스크립트가 모두 필요 없어지는 것이다. 자산이 기기 위에 파일로 흩어져 있지 않고, 검토를 마친 사본 하나가 모든 기기에 닿는 상태다. 그것을 untactit 에서 만들고 있고, 아직 공개 전()이다. 파편화는 각자가 손대서 생긴다. untactit 은 손댈 필요를 없앤다.
스크립트는 제품에 의존하지 않는다. 쓸모 있는 쪽만 가져가면 된다.