블로그

파일 하나에서 생성해도 어긋남은 멈추지 않았다

2026년 8월 11일untactit

「에이전트 지시문 파일이 자꾸 갈라진다」에 대해 가장 먼저 나오는 해법은 사본 유지를 그만두는 것이다. AGENTS.md 를 쓰고 거기서 CLAUDE.md.cursor/rules/*.mdc.github/copilot-instructions.md 를 생성하면 끝이다.

그걸 만들었다. 동작한다. 그리고 문제를 해결하지는 못한다. 이 두 문장 사이의 간격을 적어 둘 값어치가 있다 — 실제 기기에서 돌려 보고 나서야 보였기 때문이다.

생성이 실제로 덮는 범위

python3 agent_fanout.py

create    CLAUDE.md
create    .cursor/rules/from-agents-md.mdc
create    .github/copilot-instructions.md

원본 하나, 파생 파일 여럿, 그리고 파생본을 실수로 고치지 않도록 각 파일에 붙는 헤더다.

<!-- Generated from AGENTS.md by agent-fanout. Do not edit this file. -->

CI 에 넣으면 CLAUDE.md 를 직접 수정한 풀 리퀘스트가 빌드를 실패시킨다.

- run: python3 agent_fanout.py . --check

이것이 덮는 범위는 CI 가 도는 기기 위의, 이 리포지토리 다. 전부처럼 들리지만 덮이지 않는 것을 세어 보면 다르다.

덮이지 않는 것

다른 리포지토리. 팀에는 리포지토리가 하나가 아니다. 각각 자기 AGENTS.md 를 갖고 있고, 그 파일들은 어느 시점엔가 서로 복사·붙여넣기 된 것이다. 생성은 각 리포지토리의 내부 정합만 유지하고, 리포지토리들끼리는 그대로 벌어진다.

전역 설정. Claude Code 는 프로젝트 파일과 별개로 ~/.claude/CLAUDE.md 를 읽는다. Cursor 에도 사용자 레벨 지침이 있다. 이 파일들은 어느 리포지토리에도 속하지 않고, CI 에 들어간 적이 없으며, 리뷰에서 논쟁하고 싶지 않았던 규칙이 정확히 여기에 놓인다.

수정과 수정 사이의 구간. 생성은 누군가 실행할 때 돈다. 그 순간과 다음 CI 실행 사이에 파생 파일은 수정될 수 있고 그대로 사용된다. 에이전트는 즉시 읽고, CI 는 푸시 시점에 안다. 푸시가 있다면.

CI 가 없는 리포지토리. 프로토타입, 임시 클론, 지난 화요일에 누가 만든 것. 지시문이 가장 자유롭게 수정되는 자리이면서 게이트는 아예 없는 자리다.

단위는 리포지토리가 아니라 기기다. 에이전트를 돌리는 단위는 노트북이다. 노트북 한 대에는 여러 체크아웃과 같은 리포지토리의 사본 여럿, 그리고 홈 디렉터리가 있다. 리포지토리 단위로 동작하는 것은 그 전체를 볼 수 없다.

그래서 막는 것만으로는 부족하고, 봐야 한다

예방은 정책이고 탐지는 측정이다. 정책은 우회되며, 재기 전까지 우회된 사실은 보이지 않는다.

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 를 갖는 것은 드리프트가 아니고, 그것을 드리프트로 보고하면 출력 전체가 무의미해진다. (이 묶는 방식을 제대로 만드는 데 세 번을 다시 썼다. 같은 CLAUDE.md가 노트북 한 대에 18개 버전 있었다.)

한 프로젝트가 아니라 작업 디렉터리 전체에 대고 돌린다. 볼 만한 결과는 리포지토리 경계를 넘는 쪽에서 나온다.

둘은 짝이다

범위답하는 질문
agent-fanout리포지토리 하나「파생 파일이 최신인가?」
agent-drift기기 전체, 여러 경로「그럼에도 사본은 어디서 갈라졌는가?」

생성은 사본이 존재할 이유 를 없앤다. 탐지는 예상하지 못한 이유로 존재하게 된 사본을 잡는다. 어느 쪽도 잉여가 아니며, 앞의 것만 하면 덮였다는 착각이 생긴다 — 내가 그대로 빠졌던 실패 양상이라 경고해 두려는 것이 이 글의 목적이다.

둘 다 단일 파일 파이썬, 의존성 없음, 중요한 지점에서는 읽기 전용, MIT 다.

  • agent-fanoutAGENTS.md 를 한 번 쓰고 나머지를 생성한다
  • agent-drift — 더 이상 일치하지 않는 사본을 찾는다

이 다음

솔직한 종착점은 두 스크립트가 모두 불필요해지는 것이다. 자산이 노트북 위에 흩어진 파일로 존재하지 않고, 검토를 마친 한 자리에 있으면서 아무도 복사하지 않아도 모든 기기에 닿는 상태다. 그것을 untactit 에서 만들고 있고, 아직 공개 전(pre-launch)이다. 판단은 사람이, 전파는 무접촉이다.

스크립트는 그 자체로 성립하고 제품에 의존하지 않는다. 쓰고, 나머지는 무시해도 된다.

이 글은 DEV 에도 올려 두었습니다.

같이 읽기

에이전트가 무엇을 실행 중인지, 더는 추측하지 않습니다.

워크스페이스 하나만 연결하면 팀이 실제로 쓰는 스킬·규칙·메모리 전부가 보입니다. 약 10분이면 됩니다.

무료로 시작 문의하기

신용카드 없이 시작합니다. 지금 쓰는 툴 그대로 동작합니다.