adr-index: Keeping AGENTS.md Small with ADRs + a Lightweight Index
요즘 Codex / Claude Code / Gemini 같은 AI 코딩 도구를 제대로 써보니, 의외로 빨리 부딪히는 문제가 하나 있었습니다.
AGENTS.md(또는 비슷한 에이전트 지침 파일)가 점점 커진다는 것.
처음에는 편해서 이것저것 다 적습니다.
- 지금 무엇을 하고 있는지
- 어떤 결정을 내렸는지
- 나중에 참고할 내용
- 완료된 작업들
그런데 프로젝트가 커질수록 AGENTS.md는:
- 컨텍스트를 계속 잡아먹고(= 토큰 낭비)
- 과거 기록이 섞여서 잡음이 늘고
- 에이전트가 핵심을 놓치기 쉬워지고
- 결국 “유지보수 대상”이 됩니다
그래서 방향을 바꿨습니다.
- AGENTS.md는 ‘현재 규칙 + 현재 컨텍스트’만
- 결정은 ADR(Architecture Decision Record)로 분리
- 에이전트가 ADR을 매번 전체 검색하지 않도록 가벼운 index.json을 생성
이 흐름을 도와주는 스킬이 adr-index입니다.
문제: 완료 로그가 쌓이면 AGENTS.md가 망가진다
AGENTS.md에 완료 로그를 계속 쌓는 방식은, 시간이 지날수록 이득보다 손해가 커집니다.
- 컨텍스트 비용 증가
- AGENTS.md가 커질수록 에이전트가 매번 읽어야 할 텍스트가 늘어납니다.
- 잡음 증가
- 과거 결정/완료 항목이 많아질수록 “지금 중요한 것”이 가려집니다.
- 유지보수 부담
- 규칙 문서였던 AGENTS.md가 ‘위키/로그’가 되어버리고, 결국 정리가 필요해집니다.
결국 AGENTS.md는 “누적형 문서”가 아니라 휘발되어야 하는 문서에 가깝습니다.
해결: 결정을 ADR로 남기고, 에이전트는 인덱스만 본다
여기서 핵심은 “히스토리를 버리자”가 아니라,
- 히스토리(결정)는 ADR로 남기고
- 찾기 쉽게 작은 인덱스(index.json)로 정리
하는 것입니다.
ADR에 남기면 좋은 것
- 왜 이 결정을 했는지 (Context)
- 무엇을 선택했는지 (Decision)
- 무엇이 달라지는지/대가(trade-off)는 무엇인지 (Consequences)
ADR에 굳이 안 남겨도 되는 것
- 시행착오 로그
- 디버깅 과정
- 커밋 내역 나열
- 단순 구현 체크리스트
adr-index가 하는 일 (기술적으로)
adr-index는 RAG/임베딩 없이, 아주 단순한 방식으로 “결정 인덱스”를 만듭니다.
- 입력:
docs/adr/*.md - 출력:
docs/adr/index.json
1) ADR 상단 메타만 스캔
ADR 전체를 읽지 않고, 파일 상단 일부(예: 60줄)만 읽습니다.
이유:
- 빨라야 하고
- 잡음을 줄여야 하고
- 인덱스는 항상 결정적으로(deterministic) 생성되어야 하니까요.
2) 헤더 형식 검증
ADR 파일 첫 줄은 아래 형식이어야 합니다.
# ADR-YYYYMMDD-####-XXX: <title>
예:
# ADR-20260203-0007-A9F: Use JSONB for event payload storage
이 포맷을 쓰면:
- 날짜 기준 정렬이 자연스럽고
- 같은 날 여러 ADR을 작성해도 충돌이 줄고
- 병렬 작업에도 안전합니다.
3) 메타데이터 파싱
상단에 있으면 읽고, 없으면 빈 값으로 둡니다.
Tags:Status:(Proposed | Accepted | Deprecated)Date:(YYYY-MM-DD)TL;DR:
4) 비-ADR 파일은 제외
docs/adr/README.md, 템플릿 같은 파일은 인덱싱 대상에서 제외합니다.
5) 인덱스 생성
docs/adr/index.json에 아래 필드만 저장합니다.
idtitletags(list)statusdatetldrpath
유니코드(한글)도 보존해서 diff가 깨끗하게 나옵니다.
워크플로: 언제 실행해야 하나?
정리하면 “ADR이 바뀌었을 때”만 실행하면 됩니다.
권장 타이밍
- ADR 추가/수정 직후
- git commit 전에 (ADR + index.json을 같이 커밋)
- PR 올리기 직전 (팀 작업이라면)
실행 명령
- Codex CLI:
$adr-index - Claude Code / Gemini CLI:
/adr-index
AGENTS.md는 어떻게 관리하나?
핵심 규칙은 간단합니다.
- AGENTS.md에는 완료 목록을 누적하지 않는다
- 결정은 ADR에 남긴다
- AGENTS.md에는 링크/짧은 요약만 남긴다(필요하면)
예를 들어,
- 작업 도중: AGENTS.md에 “현재 작업”이 있을 수 있음
- 결정 확정: ADR 작성
- adr-index 실행: index.json 갱신
- 작업 완료: AGENTS.md에서 완료 항목 제거 (또는 ADR 링크만 남김)
AGENTS.md는 이렇게 “자연스럽게 가벼워지는” 게 정상입니다.
ADR이 필요한지 판단하는 빠른 규칙
아래 중 하나라도 해당하면 ADR을 쓰는 쪽이 보통 이득입니다.
- 대안을 비교하고 하나를 선택했다
- 이후 작업에 제약을 만든다
- 나중에 되돌리기 어렵다
- 코드만 봐서는 ‘왜’가 명확하지 않다
- AGENTS.md에 적고 싶은 유혹이 든다
애매하면 ADR을 쓰는 편이 대체로 싸게 먹힙니다.
오픈소스 공개: adr-index v0.1.0
작고 단순하지만, “AGENTS.md 비대화” 문제를 해결 할 것으로 기대하고 있습니다.
- 결정은 ADR로 남고
- 에이전트는 index.json만 보고 필요한 ADR만 열고
- 토큰을 아끼면서도 맥락은 잃지 않습니다.
레포:
AI가 스스로 ‘이건 ADR 필요’라고 말하게 만드는 방법
아래는 GPT-5.2와 함께 정리한 내용입니다.
“AI가 스스로 이건 ADR이 필요해요라고 말하게 만드는 방법”은 프롬프트 트릭이 아니라 역할 설계 문제입니다.
아래는 실제로 잘 먹히는 방식으로 정리했어요.
⸻
AI가 스스로
“이건 ADR이 필요합니다”라고 말하게 만드는 방법
핵심 결론부터:
❌ “ADR이 필요하면 말해줘”라고 시키면 안 됩니다 ✅ AI에게 ‘ADR을 요구할 권한’이 아니라 ‘ADR 판단 책임’을 준다
⸻
1️⃣ 가장 중요한 전제: AI는 “결정”을 감지할 수 있다
AI는 생각보다 잘 압니다. • 지금 이게 단순 구현인지 • 설계 판단이 개입됐는지 • 되돌리기 어려운 선택인지
문제는 그걸 말할 자리가 없다는 것이에요.
그래서 우리는 AI에게 이 역할을 줍니다:
“나는 지금 구현자가 아니라, 결정 감시자(decision sentinel)다.”
⸻
2️⃣ AGENTS.md에 넣을 단 하나의 규칙
이걸 AGENTS.md에 넣어두면, 효과가 큽니다.
ADR Detection Rule
If you make or rely on a decision that:
- introduces architectural constraints,
- involves trade-offs,
- or is not obvious from code alone,
you MUST pause and explicitly state: “An ADR is required for this decision.”
포인트: • “may” ❌ • “MUST” ⭕ • 행동이 아니라 발화(say it) 를 강제
⸻
3️⃣ AI의 정상적인 행동 흐름 (이상적인 상태)
AI가 이렇게 말하면 성공입니다 👇
“This change introduces a new constraint on error handling. An ADR is required before proceeding.”
또는 작업 도중:
“Before implementing this, an ADR should be written to capture the decision.”
중요한 건: • 작업을 멈춘다 • 사람에게 판단을 넘긴다
이건 AI에게 굉장히 자연스러운 행동입니다.
⸻
4️⃣ 절대 시키면 안 되는 말
아래는 효과 없습니다. • “ADR이 필요하면 알아서 만들어” • “ADR 필요 여부 판단해” • “ADR 작성해도 될까?”
이건 전부 책임이 불분명합니다.
AI는: • 판단은 했는데 • 말하지 않고 • 그냥 진행해버립니다
⸻
5️⃣ AI가 ADR을 감지하는 “실제 신호들”
AI는 보통 아래 순간에 ADR이 필요하다는 걸 내부적으로 이미 알고 있습니다. • “There are a few options…” • “One approach is…, another approach is…” • “This trade-off means…” • “To avoid future issues…”
👉 이 문장들이 나오면 이미 결정 구간에 진입한 겁니다.
그래서 규칙은 이거예요:
옵션을 나열하기 시작하면 → ADR 후보
⸻
6️⃣ 한 단계 더: “ADR 후보”라는 말을 쓰게 만들기
조금 더 공격적으로 가고 싶으면:
If a decision meets the ADR criteria, label it explicitly as: “ADR candidate” and stop implementation until acknowledged.
AI는 이렇게 말하게 됩니다:
“This is an ADR candidate. Should I proceed with drafting the ADR?”
이게 되면: • ADR 누락 거의 0 • 사람은 “예/아니오”만 하면 됨
⸻
7️⃣ ADR을 AI가 대신 써도 되는 경계
이건 중요합니다.
AI가 ADR을 써도 되는 경우 ✅ • 사람이 “이 결정은 맞다”고 확인한 후 • 또는 사람이 “ADR 초안 써줘”라고 명시했을 때
AI가 하면 안 되는 경우 ❌ • 결정을 대신 내려버리는 것 • 합의 없이 ADR을 확정하는 것
AI는 기록자이지, 결정권자가 아니다
⸻
8️⃣ 실전용 초단축 규칙 (에이전트 머릿속용)
이걸 AI에게 먹이면 정말 잘 작동합니다:
If you have to explain why, not just how, stop and request an ADR.
⸻
한 문장으로 요약 • AI에게 ADR을 쓰게 하지 말고 • AI에게 ADR이 필요하다고 말하게 하라 • 말하는 순간, 사람에게 공이 넘어온다
이 구조가 잡히면: • ADR 누락 ↓ • AGENTS.md 비대화 ↓ • “이거 왜 이렇게 됐지?” ↓ • AI의 자율성은 유지되면서 사고는 통제됨
스킬 작성과 포스트 작성에 gpt의 도움을 받았습니다. GPT-5.2 물 올랐네요.