맥락/히스토리 기록 방법론
핵심 긴장: 인간 가독성 vs. LLM 가독성
Mermaid는 인간이 큰 흐름을 파악하기엔 좋지만, LLM이 "왜 이 결정을 했지?"를 추론하는 데는 텍스트가 더 효율적이다.
용도가 다르다:
| 형식 | 답하는 질문 | 적합한 내용 | |---|---|---| | Mermaid / 다이어그램 | 무엇이 무엇과 연결되는가 | 서비스 관계, 데이터 흐름, 레이어 구조 | | 텍스트 (ADR) | 왜 이 결정을 했는가 | 라이브러리 선택, 아키텍처 결정 근거 | | 코드 + 주석 | 어떻게 동작하는가 | 함수 레벨, 엣지 케이스 |
셋 다 필요하지만, 분리해야 어느 파일을 봐야 하는지 명확하다.
ADR — "왜"를 기록하는 표준 방법론
Architecture Decision Record. 결정 자체뿐 아니라 컨텍스트, 고려한 대안, 결과까지 기록한다.
Michael Nygard 최소 구조
# ADR-0001: SQLite를 주 DB로 선택
## Status
Accepted
## Context
어떤 문제가 있었나? 어떤 제약이 있었나?
## Decision
무엇을 선택했나? 왜?
## Consequences
### Positive
- 서버 프로세스 불필요, 파일 하나로 관리
### Negative
- 동시 쓰기 제한
핵심 원칙
- ADR은 결정을 기록하는 것, 구현 세부사항이 아니다
- ✅ "SQLite를 선택한 이유"
- ❌ "SQLite 설정 방법" (이건 다른 문서)
- 한 번 accepted되면 수정하지 않는다
- 변경이 생기면 새 ADR이 기존 것을 supersede한다
- 대안을 반드시 명시 — "A 대신 B를 선택했고, A를 안 선택한 이유는..."
LLM 소비를 위한 ADR 설계
LLM이 잘 읽는 ADR의 특징:
- 대안 명시: LLM이 미래에 비슷한 결정을 할 때 참조 가능
- 코드와 연결: 코드 주석에서 ADR로 링크 ("ADR-0003 참고")
- 일관된 섹션 헤딩: LLM이 파싱하기 쉬움
실용적인 계층 구조
docs/adr/ → 결정의 "왜" (ADR)
adr-0001-why-sqlite.md
adr-0002-why-sqlalchemy.md
README / AGENTS.md → 구조의 "무엇" (Mermaid + 개요)
큰 흐름, 레이어 관계
코드 주석 / docstring → 구현의 "어떻게"
함수 레벨 설명, 엣지 케이스
claude-progress.txt → 진행의 "지금까지"
히스토리 + 현재 상태
Mermaid의 현실적인 적용 범위
효과적인 용도:
- 서비스 간 관계
- 데이터 흐름
- 레이어 구조 (AGENTS.md의 "지도" 역할)
비효율적인 용도:
- 함수 내부 로직
- 라이브러리 선택 이유
- 세부 결정 근거
→ Mermaid는 구조 파악용 지도로 한정하고, 세부 결정은 ADR 텍스트로 관리하는 것이 현재 가장 정립된 방식.
관련 개념
- initializer-coding-agent-pattern — claude-progress.txt의 역할
- context-engineering — agent가 이 문서들을 어떻게 읽는가
- overview — Harness Engineering 전체 지도
대화 중 방향 전환 — Skill layer 관리
문제
대화 중 방향이 바뀌면 기존 ADR이 현실과 멀어진다.
해결 — ADR supersede 패턴
기존 ADR을 수정하지 않는다. 새 ADR을 만들고 기존 것을 supersede.
# ADR-0007: PostgreSQL로 전환
## Status
Accepted — supersedes ADR-0001
## Context
초기엔 SQLite를 선택했다 (ADR-0001).
v2에서 동시 접근 요구사항이 생겼다.
## 왜 방향이 바뀌었는가
[설계하자] 세션에서 v2 요구사항 검토 중 발견. 2025-11-20.
ADR-0001 상단에:
## Status
~~Accepted~~ → Superseded by ADR-0007
ADR은 불변 히스토리다. 과거를 지우지 않고 "그때는 그랬고, 지금은 이렇다"를 기록.
실용적 워크플로우
대화 중에 즉시 ADR을 만들기 어렵다. 대화 흐름 안에서 결정이 자연스럽게 흘러가기 때문.
대화 중 방향 전환 발생
↓
대화 직후 — decisions.md에 한 줄 메모
"2025-11-20: SQLite → PostgreSQL, 이유: 동시 접근"
↓
코딩 전 — 정식 ADR로 승격
↓
기존 ADR supersede 처리
decisions.md가 ADR 초안 대기열 역할을 한다.
AGENTS.md 포인터도 업데이트
- DB 관련: ~~docs/adr/0001~~ → docs/adr/0007-why-postgresql.md
GC agent가 "ADR-0001이 superseded인데 AGENTS.md가 아직 그걸 가리키고 있다"를 찾아내는 케이스. → AC, GC, ADR supersede 패턴이 여기서 연결된다.