내 패턴 · 컨텍스트·프롬프트 조립 (CLAUDE.md @-import 체인과 주입 헌법)
한 줄 요약
AI 코딩 도구는 작업을 시작할 때마다 CLAUDE.md라는 “지시문 정본”을 자동으로 시스템 프롬프트에 끼워 넣는데, 이 파일은 줄글 메모가 아니라 정해진 세 가지 꼴(참조 import / XML 태그 헌법 / SSoT 데이터 헌법) 중 하나를 띤다.
→ 왜 배우나: 이 파일의 형태를 의식적으로 고르면, 매번 같은 지시를 타이핑하지 않고도 모델이 “내 프로젝트의 규칙” 안에서 일관되게 움직이게 만들 수 있다.
그림
flowchart TD A[세션 시작] --> B["CLAUDE.md 수집: 현재폴더 + 상위폴더 + 홈"] A --> S[settings.json의 켜진 플러그인 목록] S --> P["플러그인 CLAUDE.md 합성<br/>OMC XML 태그 블록"] B --> C{"본문이 @import인가?"} C -- 예 --> D["@AGENTS.md 자리에 펼치기<br/>(체인 깊이 1, 끝단 파일)"] C -- 아니오 --> E["본문 그대로 넣기<br/>XML 태그 / SSoT 표·YAML"] D --> F[시스템 프롬프트로 합쳐짐] E --> F P --> F M[MEMORY.md 링크 인덱스] --> F F --> G["모델: 제약 안에서 행동·생성"] G --> H["산출물이 계약 준수<br/>frontmatter/커밋 trailer/위임 규칙"]
쉽게 풀기
비유 한 줄: CLAUDE.md는 신입사원이 출근 첫 순간 책상 위에서 보는 “근무 수칙판”이다. 매일 아침 누가 말로 알려주지 않아도, 그 판이 거기 붙어 있어 자동으로 읽힌다.
단계별로 풀어 보면 이렇다.
-
모델은 매 세션 “수칙판”을 먼저 먹는다. AI 코딩 도구(Claude Code / Codex)는 작업을 시작할 때 “이 프로젝트에서 어떻게 행동하라”는 지시문을, 사람이 매번 타이핑하지 않아도 자동으로 시스템 프롬프트에 끼워 넣는다. 그 정본이 프로젝트 폴더의
CLAUDE.md(또는 Codex용AGENTS.md)다. -
이 수칙판은 “자유 줄글”이 아니다. 핵심은 여기다. 내 저장소들에서 이 파일은 아무렇게나 쓴 메모가 아니라, 아래 세 가지 정해진 꼴 중 하나를 띤다.
- 꼴 ① 참조로 가져오기(import-by-reference): 본문은 딱 한 줄(
@AGENTS.md)뿐. “진짜 규칙은 저 파일을 읽어라”고 손가락으로 가리키기만 한다. 도서관 안내데스크가 “그 책은 3층 A칸”이라고 위치만 알려주는 것과 같다. - 꼴 ② XML 태그 헌법:
<operating_principles>같은 태그 블록으로 행동·도구·위임 규칙을 조항처럼 못박는다. 법전이 “제1조, 제2조”로 경계를 나누는 것과 같다. - 꼴 ③ SSoT 데이터 헌법: 데이터 스키마(frontmatter 계약), 관계 분류표, 통과 게이트를 본문에 통째로 박고 “이게 전 시스템의 단 하나뿐인 진실(SSoT)이다”라고 선언한다. 건물 1층 로비에 박아둔 “안전수칙 전문”과 같다.
- 꼴 ① 참조로 가져오기(import-by-reference): 본문은 딱 한 줄(
-
왜 줄글 대신 정해진 꼴을 쓰나? 줄글 메모는 모델이 “어디까지가 진짜 규칙인지” 경계를 못 잡는다. 반면 태그와 표는 경계가 자명하다. 또 import 한 줄(
@AGENTS.md)을 쓰면 Claude Code와 Codex 두 도구가 같은 한 파일을 보게 되어, 두 도구의 지시가 영원히 어긋나지 않는다(드리프트 제거).
SSoT란?
Single Source of Truth, 즉 “단 하나뿐인 진실의 출처”다. 같은 규칙을 여러 곳에 복사해두면 한쪽만 고쳐져 서로 어긋난다. 그래서 “진짜는 여기 하나”라고 못박는 설계다.
핵심 정리
컨텍스트 파일은 어디서 끌려오나 (실측)
| 이름 | 타입 | 역할 |
|---|---|---|
CLAUDE.md (루트) | 파일 | 세션 시작 시 자동 로드. import 패턴에선 단 11바이트(@AGENTS.md\n) |
AGENTS.md (루트) | 파일 | Codex 호환 이름. @로 끌려와 실제 규칙을 담는 정본 |
@<경로> | import 지시자 | 그 자리에 대상 파일 내용을 펼침. 실측상 체인 깊이 1(끝단) |
플러그인 CLAUDE.md | 파일 | enabledPlugins로 켜지면 합성됨(OMC XML 헌법 등) |
그 외 합성 대상
~/.claude/settings.json—model·enabledPlugins등으로 어떤 플러그인 CLAUDE.md가 끼어들지 결정.MEMORY.md+memory/*.md—- [라벨](파일.md) — 한줄요약형식의 링크 인덱스로 샤드 메모를 홈 레벨에서 자동 주입.
세 가지 본문 형식 한눈에
| 패턴 | 식별 마커 | 강제 대상 |
|---|---|---|
| (1) 참조 import | 본문이 @로 시작하는 단일 줄 | 정본을 한 곳으로 모으기 |
| (2) XML 태그 헌법 (OMC) | <태그>...</태그> + <!-- OMC:START/END --> | 행동·위임·도구·커밋 규약 |
| (3) SSoT 데이터 헌법 (akh2) | “단일 진실(SSoT)이다” 선언 + YAML/표 | 데이터 무결성·파이프라인 게이트 |
분산이냐 인라인이냐 — 설계 선택의 대비
같은 SSoT 사상도 두 갈래로 나뉜다.
- v1(
ai-knowledge-hub) — 본문이 “_meta/SCHEMA.md가 헌법이다”라며 SCHEMA/DOMAINS/INGEST/LINT/BUDGET로 흩어 가리킴(패턴 1에 가까움).- v2(
akh2) — 같은 내용을 한 파일에 인라인으로 통합(패턴 3 정석). 즉 패턴 1과 3은 양극단이고, 분산↔인라인은 의식적으로 고르는 선택지다.
실제 예시
패턴 1 — 참조 import (정본은 끌려오는 쪽):
// /home/seunghyeong/projects/conclave/CLAUDE.md (전체. 11바이트)
@AGENTS.md<!-- /home/seunghyeong/projects/conclave/AGENTS.md (전체. 327바이트, 끝단 파일) -->
<!-- BEGIN:nextjs-agent-rules -->
# This is NOT the Next.js you know
This version has breaking changes — APIs, conventions, and file structure may all differ from your training data. Read the relevant guide in `node_modules/next/dist/docs/` before writing any code. Heed deprecation notices.
<!-- END:nextjs-agent-rules -->image-platform의 CLAUDE.md / AGENTS.md는 바이트 단위까지 동일. CLAUDE.md(Claude Code용)와 AGENTS.md(Codex용) 두 도구가 같은 정본을 보게 하는 게 import 한 줄의 목적이다.
패턴 2 — XML 태그 행동헌법 (OMC 플러그인):
// /home/seunghyeong/.claude/plugins/marketplaces/omc/CLAUDE.md (발췌)
<!-- OMC:START -->
<!-- OMC:VERSION:4.9.1 -->
# oh-my-claudecode - Intelligent Multi-Agent Orchestration
<operating_principles>
- Delegate specialized work to the most appropriate agent.
- Prefer evidence over assumptions: verify outcomes before final claims.
</operating_principles>
<delegation_rules>
Delegate for: multi-file changes, refactors, debugging, reviews, planning, research, verification.
Work directly for: trivial ops, small clarifications, single commands.
Route code to `executor` (use `model=opus` for complex work).
</delegation_rules>
<agent_catalog>
explore (haiku), analyst (opus), planner (opus), executor (sonnet), verifier (sonnet), ...
</agent_catalog>
<commit_protocol>
Trailers: Constraint:, Rejected:, Directive:, Confidence:, Scope-risk:, Not-tested:
</commit_protocol>
<!-- OMC:END -->패턴 3 — SSoT 데이터 헌법 (akh2):
// /mnt/d/akh2/CLAUDE.md (발췌)
# akh2 — AI 지식 위키 v2 헌법
**이 문서가 전 시스템의 단일 진실(SSoT)이다.** 모든 작업 전에 읽고 준수한다.
## 3. Frontmatter 계약 (전 페이지 필수)
```yaml
slug: # 파일명과 일치. 전역 유일. kebab-case
kind: concept | summary | model-card | map | ...
confidence: # 0.9=독립 출처 2+교차검증 | 0.6=단일 출처
relations: # §4 타입만. references는 페이지당 ≤5
```
## 4. 관계 분류 (10종 — 이외 타입은 admit FAIL)
| 타입 | 의미 | evidence | 제약 |
| supersedes | 신 주장이 구 주장 대체 | **필수** | 비순환 |직접 만들 때 — 패턴 1 (작은 앱에 권장):
// <프로젝트>/CLAUDE.md
@AGENTS.md<!-- <프로젝트>/AGENTS.md -->
# <한 줄 정체성: 이 코드베이스의 함정>
<훈련데이터와 다른 점 1~3개. 코드 쓰기 전 읽어야 할 실제 경로.>직접 만들 때 — 패턴 2 (멀티에이전트/팀 운영 시):
<operating_principles>
- <원칙 1: 위임 기준>
- <원칙 2: 추측보다 증거>
</operating_principles>
<delegation_rules>
Delegate for: <목록>. Work directly for: <목록>.
</delegation_rules>
<commit_protocol>
Trailers: Constraint:, Rejected:, Confidence:, Scope-risk:
</commit_protocol>직접 만들 때 — 패턴 3 (파이프라인/위키 시):
# <시스템> 헌법
**이 문서가 단일 진실(SSoT)이다.**
## Frontmatter 계약
```yaml
<필드>: # <규칙·유일성·enum>
```
## 관계 분류 (N종 — 이외 FAIL)
| 타입 | 의미 | evidence | 제약 |
## 게이트 규칙
- <통과 없이는 exit 2로 거부>만들기 전 체크리스트
- CLAUDE.md가 자유 줄글이 아니라 위 세 꼴 중 하나인가
- import 패턴이면 CLAUDE.md와 AGENTS.md가 같은 정본을 가리키는가(두 도구 일치)
@체인 깊이를 의식적으로 관리하는가(실측은 깊이 1 끝단 — 순환·과중첩 회피)- 행동 규칙은 XML 태그로 경계를 명확히 했는가(
<delegation_rules>등)- 데이터 계약(frontmatter/관계/게이트)은 표·YAML로 박았는가
- 플러그인 헌법이 들어오면
settings.json의enabledPlugins로 켜져 있는가- 분산(v1
_meta/*참조) vs 인라인(v2 한 파일) 중 의도적으로 선택했는가
요약 & 셀프체크
3줄 요약
CLAUDE.md는 세션 시작 시 자동으로 시스템 프롬프트에 합쳐지는 “지시문 정본”이며, 줄글이 아니라 세 가지 정해진 꼴 중 하나를 띤다.- 세 꼴은 ① 참조 import(정본 한 곳으로 모으기) ② XML 태그 헌법(행동·위임 조항) ③ SSoT 데이터 헌법(스키마·게이트 인라인)이다.
- import 한 줄을 쓰면 Claude·Codex 두 도구가 같은 파일을 보게 되고, 태그·표를 쓰면 모델이 규칙 경계를 자명하게 파싱한다.
스스로 답해보기
@AGENTS.md한 줄짜리 CLAUDE.md를 쓰는 가장 큰 이득은 무엇이고, 왜 두 파일을 따로 두는가?- 줄글 메모 대신 XML 태그나 표를 쓰면 모델 입장에서 무엇이 좋아지는가?
- 같은 SSoT 사상인데 v1은 분산, v2는 인라인을 택했다. 어떤 상황에 어느 쪽이 유리할까?
근거 파일
/home/seunghyeong/projects/conclave/CLAUDE.md(@AGENTS.md, 11B)/home/seunghyeong/projects/conclave/AGENTS.md(Next.js 끝단 파일, 327B,@없음 확인)/home/seunghyeong/projects/image-platform/CLAUDE.md+AGENTS.md(conclave와 바이트 동일)/home/seunghyeong/.claude/plugins/marketplaces/omc/CLAUDE.md(OMC v4.9.1 XML 태그 헌법)/mnt/d/akh2/CLAUDE.md(SSoT 인라인 헌법 — frontmatter 계약·관계 10종·게이트)/mnt/d/ai-knowledge-hub/CLAUDE.md(v1 SSoT 분산 —_meta/SCHEMA.md등 참조)/mnt/d/human-token-workflow/AGENTS.md(역할별 지침형 — writer/reviewer/crawler 조항)/home/seunghyeong/.claude/settings.json(enabledPlugins로 합성 대상 결정)/home/seunghyeong/.claude/projects/-home-seunghyeong/memory/MEMORY.md(+memory/*.md링크 인덱스)
연결
MINE_개요 · _분석축_루브릭 · MINE_10_entrypoint-plugin-loading(플러그인 로딩·settings.json) · MINE_80_state-memory-persistence(MEMORY.md 메모리 주입)
Codex 교차검증 메모
이 노트의 핵심 사실 — ①
CLAUDE.md/AGENTS.md자동 로드와@-import의 자리 치환 전개, ② 내 저장소 실측 import 체인 깊이 1(끝단 leaf), ③ import의 목적이 Claude·Codex 두 진입점의 정본 단일화(드리프트 제거)라는 점, ④ 줄글보다 XML 태그/표가 모델에게 규칙 경계를 명확히 준다는 점, ⑤ v1 분산(_meta/*참조) vs v2 인라인의 설계 대비 — 은 위 근거 파일들의 실제 내용과 대조하여 교차검증된 항목이다. 바이트 수치(11B/327B 등)와 OMC 버전(4.9.1)은 실측 시점 값이므로, 파일이 갱신되면 다시 확인할 것.