chore: 문서를 작성할 때 한국어의 표현 작성 스킬 추가 및 1인칭 관점의 글 작성 검증 테스트 추가

This commit is contained in:
DongHyeonka
2026-07-29 16:48:03 +09:00
parent c39406bbdd
commit 41501b5d06
520 changed files with 95494 additions and 2231 deletions
+273 -332
View File
@@ -1,385 +1,326 @@
# ClariDoc 설계 근거: 독자가 이해하는 기술 문서의 논리 구조
# ClariDoc 설계 근거: 근거를 숨기지 않되, 글쓰기 과정을 독자에게 노출하지 않는 방법
> 조사 기준일: 2026-07-23
> 적용 대상: 기술 블로그, 튜토리얼, 하우투, 설명, 참조, 트러블슈팅, 설계 문서
ClariDoc은 문장을 매끄럽게 생성하는 프롬프트 모음이 아니다. 기술 블로그와 기술 문서를 만들 때 다음 세 문제를 동시에 다루는 하네스다.
## 1. 이 연구가 답하려는 질문
1. 독자가 문제, 선택, 구현, 검증을 끊기지 않고 따라갈 수 있어야 한다.
2. 프로젝트의 선택 이유와 경계를 실제 근거 문서에서 회수해야 한다.
3. 출처 ID, 저장소 경로, 접근일, 작성 지시문 같은 내부 정보는 독자용 글에 섞이지 않아야 한다.
이 하네스는 “문장을 유창하게 만드는 프롬프트”가 아니라 다음 질문에 답하도록 설계했다.
## 1. 기존 방식에서 드러난 결함
1. 독자는 왜 이 문서를 읽는가?
2. 그 목적에 맞는 문서 유형은 무엇인가?
3. 독자의 머릿속 질문은 어떤 순서로 생기는가?
4. 주장, 예시, 절차, 근거, 한계는 어디에 놓여야 하는가?
5. 모델이 논리적 구조를 빠뜨리거나 그럴듯한 사실을 발명했을 때 어떻게 탐지하는가?
6. 문서가 “좋아 보인다”는 인상 대신 재현 가능한 품질 기준으로 통과했는지 어떻게 남기는가?
결론은 다음과 같다.
> 이해하기 쉬운 기술 문서는 미문보다 **정보 구조**가 먼저다. 독자의 작업 또는 이해 목표를 고정하고, 문서 유형에 맞는 질문 순서를 정하며, 각 섹션을 하나의 질문과 하나의 기능에 대응시키고, 구체적인 예시·검증·근거·한계를 통해 이해를 누적해야 한다.
## 2. 조사 방법
자료를 네 층으로 나누어 검토했다.
### 2.1 편집·콘텐츠 설계 지침
Google, GitHub, Microsoft의 공식 기술 문서 작성 지침을 검토했다. 반복해서 나타난 원칙은 독자와 목적의 선행 정의, 핵심 결론의 조기 제시, 한 문단 한 생각, 의미 있는 제목, 논리적 우선순위, 점진적 상세화, 스캔 가능한 형식이다.
### 2.2 정보 유형과 문서 아키텍처
Diátaxis, OASIS DITA, Kubernetes의 콘텐츠 유형을 비교했다. 서로 용어는 다르지만, 학습·작업 수행·개념 이해·정확한 조회·문제 복구는 서로 다른 독자 상태와 구조를 요구한다는 점이 공통적이다.
### 2.3 학습과 이해에 관한 연구
완성된 해결 과정을 따라가는 worked example 연구와, 제목·요약·인과 연결어 같은 구조 신호가 이해와 전이를 돕는 signaling 연구를 참고했다. 이 결과를 기술 문서에 그대로 일반화한 것이 아니라, “예시는 시작 상태에서 결과까지 끊기지 않아야 한다”와 “구조와 인과관계를 표면에 드러내야 한다”는 설계 가설로 번역했다.
### 2.4 실제 엔지니어링 글 표본
Netflix, Cloudflare, Dropbox, AWS Builders Library의 글을 표본으로 읽었다. 좋은 글에서 반복적으로 관찰된 흐름은 대체로 다음과 같다.
초기 버전은 근거 추적 가능성을 높이기 위해 본문에 source ID를 직접 쓰도록 했다. 그 결과 다음과 같은 문장이 최종 문서에 나타날 수 있었다.
```text
문제와 독자 약속
→ 실제 제약과 실패 양상
→ 선택 기준 또는 멘털 모델
→ 아키텍처·메커니즘
→ 구체적 사례나 데이터
→ 대안과 트레이드오프
→ 운영에서 드러난 한계·교훈
→ 적용 조건과 다음 행동
Retries can increase load on a dependency that is already failing. [S1]
제공된 근거 팩은 다음 사실을 확인 대상으로 제시한다.
예시는 특정 날짜 기준이다.
```
흐름은 보편 법칙이 아니라 표본 관찰에서 도출한 실무 패턴이다. 그래서 ClariDoc은 이를 `technical_blog`의 기본 구조로 사용하되, 브리프와 프로젝트별 스타일이 우선하도록 설계했다.
문장들은 사실 검증 과정에는 유용할 수 있지만 독자에게는 불필요하다. 독자는 source-pack의 형식이나 모델이 받은 지시를 알고 싶은 것이 아니라, 문제가 무엇이고 왜 그 선택을 했으며 어떤 비용을 감수했는지 알고 싶다.
## 3. 핵심 원칙과 하네스 번역
### 원칙 1. 문서의 시작점은 주제가 아니라 독자의 변화다
“재시도에 대해 쓴다”는 주제만으로는 구조가 결정되지 않는다. 독자가 개념을 이해하려는지, 특정 작업을 끝내려는지, 장애를 복구하려는지에 따라 필요한 정보와 순서가 달라진다.
**하네스 적용**
- `Brief.audience.roles`: 누가 읽는가
- `Brief.audience.prior_knowledge`: 무엇을 이미 아는가
- `Brief.audience.needs`: 어떤 판단 또는 행동이 필요한가
- `Brief.reader_goal`: 읽은 뒤 가능한 관측 가능한 변화
- `Brief.core_message`: 문서 전체가 증명해야 할 한 문장
### 원칙 2. 초안을 쓰기 전에 문서 유형을 고정한다
튜토리얼과 하우투는 모두 단계가 있지만 목적이 다르다. 튜토리얼은 안내받는 학습 경험이고, 하우투는 이미 목표가 있는 사용자가 과업을 끝내는 문서다. 설명 문서와 참조 문서도 각각 이해와 조회라는 다른 작업을 지원한다.
**하네스 적용**
`DocumentType`을 다음 일곱 유형으로 제한한다.
- `technical_blog`
- `tutorial`
- `how_to`
- `explanation`
- `reference`
- `troubleshooting`
- `design_doc`
각 유형은 `STRUCTURE_SPECS`에 필수 섹션 intent와 순서를 가진다. planner가 제목과 근거 배치를 개선할 수는 있지만 필수 intent를 삭제하거나 재배열할 수 없다.
### 원칙 3. 범위, 비범위, 선행지식, 버전을 초기에 노출한다
독자가 문서의 적용 가능성을 판단하지 못하면 세부 내용을 읽은 뒤에야 “내 상황과 다르다”는 사실을 알게 된다. 비범위와 버전 맥락은 내용 부족의 변명이 아니라 문서의 정확성 경계다.
**하네스 적용**
- `scope`, `non_scope`, `prerequisites`
- `constraints.version_context`
- 오프닝에서 이 정보가 드러나는지 린트
- 목표와 직접 관련 없는 섹션을 planner가 추가하지 못하도록 구조 병합 검증
### 원칙 4. 핵심 답을 먼저 주고 상세는 점진적으로 공개한다
복잡한 기술 글이 배경부터 길게 시작하면 독자는 무엇을 위해 정보를 유지해야 하는지 모른다. 먼저 결론 또는 독자 약속을 제시하고, 그 뒤에 필요한 맥락·원리·세부 구현을 확장한다.
**하네스 적용**
- `technical_blog`, `explanation`, `design_doc`의 첫 intent를 결론 또는 결정 요청으로 고정
- drafting prompt에서 “answer before detail” 요구
- 오프닝에 `reader_goal``core_message`의 의미가 나타나는지 휴리스틱 검사
### 원칙 5. 한 섹션은 하나의 독자 질문에 답한다
제목은 장식이 아니라 독자가 현재 어디에 있고 다음에 무엇을 알게 되는지 보여 주는 구조 신호다. 섹션마다 질문과 목적이 명시되면, 모델이 관련된 사실을 무작위로 나열하기 어렵다.
**하네스 적용**
모든 `OutlineSection`은 다음 필드를 가진다.
- `intent`: 섹션의 논리 기능
- `reader_question`: 이 섹션이 답할 질문
- `purpose`: 답이 전체 논증에서 수행하는 역할
- `must_include`: 반드시 다룰 정보
- `evidence_ids`: 연결할 근거
- `transition_to_next`: 다음 질문으로 넘어가는 이유
린터는 의미 없는 제목, 중복 제목, heading level 건너뛰기, 유형별 H2 순서 위반을 검사한다.
### 원칙 6. 개념 설명은 정의가 아니라 인과 모델을 만든다
용어를 각각 정의해도 구성요소 사이의 관계가 드러나지 않으면 독자는 새 상황에 적용하지 못한다. 좋은 설명은 입력, 상태, 결정, 변화, 결과, 관측을 연결한다.
**하네스 적용**
설명·기술 블로그·설계 문서의 구조에 다음 요소를 강제한다.
더 큰 결함은 근거가 있어도 **결정의 이유를 회수하지 못하는 것**이었다.
```text
익숙한 기준점
→ 핵심 용어와 경계
→ 구성요소
→ 데이터/제어 흐름
→ 불변조건과 실패 조건
→ 관측 가능한 결과
application-core는 Spring DI를 의도적으로 사용한다.
```
논리 reviewer는 전제 누락, 인과 점프, 순환 설명, 결론과 근거의 불일치를 찾도록 지시받는다.
이 문장은 현재 상태만 말한다. 다음 질문에는 답하지 않는다.
### 원칙 7. 예시는 전체 경로를 따라가야 한다
- 어떤 문제가 있었는가?
- Spring을 완전히 제거하는 대안은 왜 선택하지 않았는가?
- Spring DI를 허용하면서 어떤 비용을 받아들였는가?
- 허용 범위가 transaction, transport, persistence까지 번지지 않도록 무엇을 막았는가?
- 그 경계가 실제로 지켜지는지는 어떻게 확인하는가?
조각난 코드 블록이나 단편적인 명령은 문법을 보여 줄 수 있지만, 입력이 어떤 판단과 상태 변화를 거쳐 결과가 되는지 보여 주지 못한다. 학습 목적의 예시는 시작 상태, 실행, 중간 체크포인트, 결과, 실패 경계가 이어져야 한다.
ClariDoc 0.2.0은 이 두 결함을 각각 **출력 경계**와 **결정 근거 회수** 문제로 다룬다.
**하네스 적용**
## 2. 독자용 글과 내부 provenance를 분리한다
- `worked_example` 또는 대응 intent를 유형 계약에 포함
- 예시 또는 코드 존재 검사
- 튜토리얼에는 중간 checkpoint와 최종 verification 요구
- 명령 블록은 언어 태그, 사전 조건, 예상 결과와 연결하도록 prompt에 명시
작성 과정에는 출처 식별자가 필요하다. source chunk가 어느 문서의 어느 heading과 line range에서 왔는지 남겨야 이후 검토와 재현이 가능하다. 그러나 그 정보가 최종 글에 그대로 나타날 이유는 없다.
### 원칙 8. 절차는 행동뿐 아니라 안전 경계를 포함한다
작업 문서는 “무엇을 입력하라”만 알려 주면 부족하다. 시작 조건, 정상 결과, 중단 조건, 검증, 롤백을 함께 제공해야 실제 시스템에서 사용할 수 있다.
**하네스 적용**
절차형 문서에서 다음을 검사한다.
- 사전 조건
- 번호가 있는 단계
- 관측 가능한 검증
- 롤백 또는 복구
- 파괴적 명령 주변의 경고·백업·복구 경로
### 원칙 9. 참조 문서는 서술보다 조회 계약이 우선이다
참조 문서는 처음부터 끝까지 읽는 글이 아니라 정확한 값을 찾는 인터페이스다. 범위와 버전, 구문, 필드, 기본값, 동작, 오류, 최소 예시가 안정적으로 배치되어야 한다.
**하네스 적용**
`reference` 구조를 다음 순서로 고정한다.
따라서 산출물을 두 층으로 나눈다.
```text
범위/버전 → 구문 → 파라미터/필드 → 동작 → 오류 → 최소 예시 → 관련 항목
reader-facing layer
└─ document.md
문제, 제약, 대안, 선택 이유, 메커니즘, 검증, 한계만 노출
internal audit layer
├─ provenance.md
├─ evidence-map.json
├─ normalized inputs
├─ raw model responses
└─ manifest.json
source ID, relative path, heading, line range, status, hash 보존
```
테이블형 조회 표면이 없는 경우 경고하고, 버전 맥락과 미해결 placeholder를 검사한다.
기술 블로그의 기본 `citation_style``hidden`이다. 이 모드에서 다음 항목은 독자용 문서에 나타나면 오류다.
### 원칙 10. 주장은 출처 단위와 연결되어야 한다
- `[S1]` 같은 내부 source marker
- `raw/branch-notes/...` 같은 repository path
- source access date
- “제공된 근거”, “근거 팩”, “확인 대상으로 제시” 같은 작성 과정 설명
- planner가 만든 section intent나 prompt tag
URL 목록만 주면 모델은 출처가 실제로 무엇을 지지하는지 추정하게 된다. 따라서 출처별로 사용할 수 있는 사실을 분리하고, 본문의 주장에 ID를 붙이는 편이 감사 가능하다.
공개 링크나 각주가 필요한 문서는 `footnote` 또는 `inline_link`를 명시적으로 선택한다. 숨김 정책은 출처를 없애는 것이 아니라 **독자용 표현과 감사용 추적을 분리하는 것**이다.
**하네스 적용**
## 3. 프로젝트 문서를 같은 무게로 취급하지 않는다
`SourcePack`의 각 항목은 `facts``notes`를 가진다. 모델은 `[S1]` 같은 ID를 사용한다. 린터는 다음을 탐지한다.
로컬 저장소에는 현재 상태, 결정 과정, 외부 동작, 선례가 함께 존재할 수 있다. 단어가 겹친다는 이유만으로 모두 같은 근거로 사용하면 현재 구현과 과거 메모가 섞이고, 외부 사례가 프로젝트의 선택 이유로 둔갑한다.
- 존재하지 않는 출처 ID
- 인용이 필수인데 source pack이 비어 있음
- 출처가 있는데 아무 ID도 사용하지 않음
- 숫자·버전형 주장에 표식이 없음
- 사용되지 않은 출처
ClariDoc은 source type을 다음처럼 구분한다.
중요한 한계: 이 버전은 문장이 `facts`의 의미와 실제로 일치하는지 논리적으로 증명하지 않는다. evidence reviewer와 도메인 검토가 여전히 필요하다.
| source type | 답할 수 있는 질문 | 답할 수 없는 질문 |
|---|---|---|
| `canonical-project` | 현재 프로젝트에서 실제로 구현·검증된 것은 무엇인가 | 왜 최초에 그 선택을 했는가가 항상 기록돼 있지는 않다 |
| `canonical-concept` | 재사용 가능한 기술 개념과 일반 동작은 무엇인가 | 특정 프로젝트가 실제 채택했는가 |
| `branch-note` | 어떤 제약, 대안, 이유, 비용으로 결정을 내렸는가 | 최신 canonical과 충돌할 때 현재 상태의 최종 권위가 되지는 않는다 |
| `official-doc` | 프레임워크·프로토콜·제품이 어떻게 동작하는가 | 프로젝트의 의도와 채택 이유 |
| `company-tech-blog` | 다른 조직이 어떤 조건에서 무엇을 시도했는가 | 보편적인 표준 또는 현재 프로젝트의 사실 |
### 원칙 11. 선택은 대안, 기준, 비용, 실패 조건을 함께 설명한다
이 계층은 `llm-wiki-private``raw → canonical → external output` 흐름과 맞물린다. 공개 글은 canonical의 검증된 현재 상태를 중심으로 삼고, branch-note에서 선택 배경을 회수하며, official docs와 company tech blog는 동작 설명과 선례를 보조한다.
“우리는 X를 사용했다”만으로는 독자가 자신의 상황에서 같은 결정을 내려야 하는지 판단할 수 없다. 선택 기준과 제약, 버린 대안, 받아들인 비용, 운영에서 드러난 실패 조건이 있어야 판단이 전이된다.
## 4. 검색의 목표는 관련 문서가 아니라 결정 단위를 찾는 것이다
**하네스 적용**
- 기술 블로그·설명·설계 문서에 alternatives/tradeoffs/limits intent 포함
- `design_doc`에는 목표/비목표, 제약, 대안, 결정, failure mode, rollout, observability, open risks 포함
- trade-off 또는 한계 신호가 없으면 lint error
### 원칙 12. 작성자와 검토자의 관점을 분리한다
하나의 모델이 작성과 자기검토를 모두 수행하면 같은 전제와 누락을 반복할 수 있다. 완전한 독립성을 보장하지는 못해도, 역할과 가능하면 제공자를 분리하면 오류 표면을 넓힐 수 있다.
**하네스 적용**
기본 멀티 에이전트 배치는 다음과 같다.
- planner: Codex
- writer: Claude
- logic reviewer: Codex
- reader reviewer: Claude
- evidence reviewer: Antigravity
- operations reviewer: Antigravity
- reviser: Claude
리뷰는 자유 서술이 아니라 점수, 차원별 점수, severity, 문제, 영향, 수정안이 있는 JSON 계약으로 받는다.
### 원칙 13. 유창성 평가와 결정적 검사를 결합한다
LLM은 문맥과 논리를 평가하는 데 유용하지만 동일 입력에서도 판단이 달라질 수 있다. 반대로 정규식과 구조 검사는 참·거짓을 이해하지 못하지만 재현 가능하다. 두 종류를 결합해야 한다.
**하네스 적용**
일반적인 lexical search는 `application-core`, `Spring`, `DI`가 많이 등장하는 문서를 위로 올린다. 하지만 기술 글에 필요한 것은 이름의 공기(共起)가 아니라 다음 요소를 가진 문단이다.
```text
composite = deterministic_lint × weight + model_review_mean × weight
constraint
→ choice
→ reason
→ alternative
→ accepted cost
→ guardrail
→ verification
```
점수 외에도 blocker와 error 개수 한도를 동시에 적용한다. 점수가 높아도 파괴적 명령 안전 경계나 금지 주장이 blocker이면 통과할 수 없다.
ClariDoc의 local corpus collector는 Markdown heading 단위로 문서를 나누고 BM25 계열 점수에 다음 가중치를 더한다.
### 원칙 14. 결과뿐 아니라 과정도 감사 가능해야 한다
- canonical/project status
- decision, reason, alternative, trade-off, forbidden, verification 같은 용어
- brief의 required topic과 core message
- 한 파일이 결과 전체를 점유하지 않도록 하는 file diversity
좋은 문서가 한 번 생성되었다는 사실보다 어떤 브리프, 근거, 구성, 모델 응답, 리뷰, 수정으로 만들어졌는지 재현 가능한지가 중요하다.
검색 결과는 절대 경로가 아닌 repository-relative path와 line range를 가진다. 선택 이유가 없는 chunk는 기술 이름이 일치해도 decision section의 주요 근거로 사용하지 않는다.
**하네스 적용**
### `application-core` 사례
- 정규화된 입력 저장
- planner/writer/reviewer/reviser 원문 응답 보존
- 라운드별 초안·lint·review·gate 저장
- provider 이벤트와 실행시간 기록
- 최종 산출물의 SHA-256 manifest 생성
- Mock 실행은 합성 평가임을 자동 경고
프로젝트의 branch-note에는 다음 결정이 함께 기록돼 있었다.
## 4. 문서 유형별 질문 사슬
- `@Service`, `@Component`는 DI 등록 목적으로 허용한다.
- Spring DI까지 제거하면 use case마다 `@Configuration`에서 bean을 수동 등록해야 해 조립 코드가 늘어난다.
- 이 편의를 위해 `spring-context`, `spring-beans` 의존 비용은 수용한다.
- 대신 `spring-tx`, Spring Web, JPA annotation은 금지한다.
- transaction 의미는 `TransactionPort`로 표현한다.
- Gradle과 ArchUnit으로 build graph와 source dependency를 각각 검사한다.
### 4.1 기술 블로그
따라서 독자용 설명은 “Spring을 의도적으로 쓴다”에서 멈추지 않고, 수동 조립 비용을 줄이기 위한 제한적 허용과 그 대가를 함께 설명해야 한다.
반대로 SLF4J의 존재만 확인되고 선택 이유가 근거에서 발견되지 않았다면, “의도적으로 사용했다”는 이유를 추정해서는 안 된다. 주장을 제거하거나 확인되지 않은 범위로 남겨야 한다.
## 5. 기술적 선택은 하나의 완결된 설명 단위여야 한다
좋은 기술 문서는 선택을 제품 이름이나 annotation 이름으로 요약하지 않는다. 독자가 자신의 환경에 판단을 옮길 수 있도록 선택이 성립한 조건을 보여 준다.
ClariDoc의 decision unit은 다음 여섯 항목을 최소 계약으로 사용한다.
1. **맥락과 제약**: 무엇이 단순한 해법을 막았는가
2. **선택**: 무엇을 허용하거나 채택했는가
3. **이유**: 어떤 구체적 비용 또는 실패를 줄이려 했는가
4. **대안**: 현실적으로 가능한 다른 선택은 무엇이었는가
5. **수용 비용**: 선택 때문에 새로 생기는 결합·운영·학습 비용은 무엇인가
6. **가드레일**: 비용이 경계 밖으로 번지면 어떤 검사나 규칙이 실패하는가
운영 또는 설계 글에서는 검증과 적용하지 않을 조건까지 추가한다.
```text
무엇을 해결하는가?
→ 왜 어려운가?
→ 어떤 판단 모델이 필요한가?
→ 해결 방식은 어떻게 동작하는가?
→ 구체적 입력이 결과로 어떻게 변하는가?
→ 어떤 근거로 효과와 정확성을 판단하는가?
→ 무엇을 포기했고 언제 쓰지 말아야 하는가?
→ 독자는 다음에 무엇을 해야 하는가?
context → constraint → options → decision → mechanism
→ verification → accepted cost → not-applicable condition
```
### 4.2 튜토리얼
`RAT001`, `RAT002`, `RAT003` lint는 선택 선언 뒤 이유가 없는 문장, 대안·비용·가드레일 누락, 결정 섹션에 rationale evidence가 배치되지 않은 상태를 각각 탐지한다. 휴리스틱이므로 모델 reviewer와 도메인 소유자 검토를 대체하지는 않는다.
## 6. 우아한형제들 기술 블로그 표본에서 가져온 작성 패턴
우아한형제들의 공식 편집 규정을 확보한 것은 아니다. 공개된 기술 글 8편을 표본으로 읽고 반복되는 전개와 문장 형식을 운영 프로필로 추출했다. 표본은 2017~2025년에 공개된 Backend, Frontend, Data, AI, 장애 회고 글을 포함한다. 출처별 관찰과 일반화 경계는 `SOURCE_MATRIX.md`에 기록했다.
조사는 다음 두 층을 분리했다.
- **정보 전개 구조**: 문제, 제약, 대안, 선택 이유, 구현, 검증이 어떤 순서로 이어지는가
- **문장 형식**: 문단을 어떤 문장으로 시작하고, 앞 문장과 어떤 관계를 만들며, 순서·질문·선택 이유를 어떻게 표현하는가
`문제 → 제약 → 대안 → 선택 이유`는 첫 번째 층의 계약이다. 이 구조를 `첫 번째 제약은`, `두 번째 제약은`, `세 번째 제약은` 같은 문장 틀로 출력해야 한다는 뜻은 아니다.
### 6.1 팀과 시스템의 실제 맥락에서 시작한다
Polars 적용기는 팀이 어떤 크기와 형태의 데이터를 처리하는지 먼저 설명하고 예상 독자를 명시한다. B마트 OMS 글은 고객, 라이더, 현장 작업자의 서로 다른 목표와 물리적 제약을 구체적인 주문 장면으로 보여 준다.
하네스 적용:
- 첫 섹션을 추상적인 정의가 아니라 `problem_scene`으로 둔다.
- 팀, 시스템, 요청 흐름, 장애 증상, 반복 비용 중 최소 하나를 구체적으로 제시한다.
- “이 글에서는 무엇을 다룬다”보다 독자가 왜 이 문제를 읽어야 하는지가 먼저 드러나게 한다.
### 6.2 문제를 비용과 관측 가능한 증상으로 표현한다
B마트 OMS 글은 피크 시간대에 주문이 몰릴 때 출고 지연, 라이더 대기, 현장 부하가 어떻게 연결되는지 보여 준다. LLMOps 글은 provider 복잡성, 프롬프트 버전 추적, 장애, 비용, 실험 재현성 같은 운영 문제를 각각 구체적인 실패로 분해한다.
하네스 적용:
- “복잡했다”, “비효율적이었다”만 쓰지 않는다.
- 누가 어떤 작업을 반복했는지, 어떤 상태가 관측됐는지, 어느 경계에서 비용이 커졌는지 적는다.
- 근거가 없는 수치는 만들지 않는다. 숫자가 없다면 qualitative cost를 정확히 제한해 쓴다.
### 6.3 선택지를 보여 준 뒤 선택 이유를 설명한다
LLMOps 글은 Langfuse를 선택하기 전에 여러 후보와 각 후보의 한계를 비교한다. 기술 선택은 “유명해서”가 아니라 현재 조직의 요구와 맞지 않은 지점을 통해 설명된다.
하네스 적용:
- `options``decision_rationale`을 별도 intent로 둔다.
- 대안을 허수아비로 만들지 않는다.
- 비교 기준은 brief와 근거에서 회수한다.
- 선택의 장점과 함께 수용한 비용을 쓴다.
### 6.4 구현은 구성요소 목록이 아니라 흐름으로 설명한다
B마트 OMS 글은 주문, 출고, 배송, 시뮬레이션 시간과 비동기 작업이 어떤 순서로 이어지는지 보여 준다. 독자는 클래스 이름을 외우는 대신 입력이 결과로 변하는 경로를 따라간다.
하네스 적용:
```text
무엇을 완성하는가?
→ 무엇이 필요한가?
→ 전체 여정은 어떤 모습인가?
→ 어떤 순서로 따라가는가?
→ 각 단계가 맞는지 어떻게 확인하는가?
→ 최종 결과를 어떻게 검증하는가?
→ 무엇을 정리하고 다음에 무엇을 배우는가?
input → decision → state change → dependency call
→ observation → success / stop / recovery
```
### 4.3 하우투
- 메커니즘 섹션에 데이터 또는 제어 흐름을 요구한다.
- component 목록만 나열하면 reviewer가 인과 단절로 지적한다.
### 6.5 검증 결과와 한계를 같이 둔다
공개 기술 글은 시뮬레이션, 성능 지표, 파일럿 결과, 장애 회고처럼 선택이 실제로 무엇을 바꿨는지 보여 준다. 장애 회고는 시간 순서와 놓친 조건을 드러내고 이후의 리뷰·협업 개선으로 연결한다.
하네스 적용:
- test, build rule, metric, incident timeline 중 실제로 존재하는 검증만 사용한다.
- local verification을 production verification으로 확대하지 않는다.
- 정적 분석의 reflection 우회처럼 자동 검사가 보장하지 못하는 범위를 함께 쓴다.
### 6.6 개요의 분류명을 문장 머리에 반복하지 않는다
8편에서 `첫 번째 제약은`이라는 문장 형식은 확인되지 않았다. 순서 표현은 존재했지만 용도가 달랐다. 실제 처리 단계, 두 가지 입력 방법, 여러 레이어, 차트처럼 **순서 자체가 내용인 대상**을 구분할 때 사용했다. 반면 문제와 제약은 대체로 구체적인 상태와 그 결과를 바로 서술했다.
예를 들어 표본은 다음과 같은 관계를 문장에 드러낸다.
| 문장 역할 | 표본에서 관찰한 형식 | 적용 경계 |
|---|---|---|
| 문제 전환 | 정상적으로 보이던 상태 뒤에 달라진 조건과 비용을 `하지만`, `문제는`, `다만`으로 연결 | 접속어 자체를 의무화하지 않고 실제 역접 관계가 있을 때만 사용 |
| 인과 연결 | 앞 문장의 상태를 `이 때문에`, `그 결과`, `그래서`, `이에`로 다시 받아 선택이나 결과로 연결 | 지시어가 가리키는 원인이 바로 앞 문맥에 명확해야 함 |
| 선택 이유 | 후보나 기준을 먼저 제시하고, 선택 문장에서 현재 조건과 제외 이유를 함께 설명 | 제품 이름이나 장점 목록만으로 선택을 정당화하지 않음 |
| 질문 | 질문형 heading이나 짧은 전환 질문을 두고 바로 사례·설명·결과로 답함 | 답하지 않는 수사 질문을 장식처럼 반복하지 않음 |
| 순서 표현 | 실제 단계, 방법, 레이어, 도표의 순서를 구분 | 추상적인 section intent를 산문으로 읽어 주는 용도로 사용하지 않음 |
| 프로젝트 목소리 | `팀에서는`, `저희는`, `우리는`으로 판단 주체와 적용 범위를 밝힘 | 모든 문장을 1인칭으로 쓰거나 조직의 선택을 보편 법칙으로 확대하지 않음 |
하네스 적용:
- outline의 `constraints`, `options`, `decision_rationale`은 작성자가 충족해야 할 의미 계약이지 독자에게 그대로 읽어 줄 문장 표지가 아니다.
- 문단은 가능하면 행위자·상태·변화·영향 중 하나를 바로 제시한다.
- 연속된 병렬 항목이 실제로 필요하면 목록이나 의미 있는 소제목을 사용한다.
- `첫 번째/두 번째/세 번째 + 추상 분류명`으로 문단을 반복 시작하면 deterministic lint가 `STYLE001` warning을 낸다.
- editor reviewer는 정보 구조가 문장 템플릿으로 노출됐는지, 질문이 바로 답을 얻는지, 접속어가 실제 논리 관계를 가리키는지 별도로 검사한다.
이 규칙은 우아한형제들의 문장을 복제하기 위한 것이 아니다. 조사 표본에서 확인한 **구체성, 관계가 드러나는 전환, 판단 주체, 순서 표현의 제한된 용도**를 하네스의 작성·검토 기준으로 번역한 것이다.
## 7. 우아한테크코스와 Tecoble에서 가져온 학습형 글 패턴
우아한테크코스 조직은 교육 자료와 학습 기록을 공개하고 있으며, Tecoble에는 팀 프로젝트에서 겪은 문제를 출발점으로 단계적 해결 과정을 설명하는 글이 축적돼 있다. 이를 공식 글쓰기 교과과정 전체로 일반화하지 않고, 학습형 기술 글에서 유용한 다음 패턴만 반영했다.
- 자신이 놓였던 프로젝트 상황과 선행지식을 먼저 밝힌다.
- 작은 재현 사례에서 출발해 개념을 확장한다.
- 처음 시도와 실패 이유를 숨기지 않는다.
- 최종 코드만 보여 주지 않고 판단이 바뀐 과정을 설명한다.
- 독자가 따라 할 수 있도록 입력, 결과, 검증 지점을 제공한다.
이 패턴은 `tutorial`, `explanation`, 입문자 대상 `technical_blog`에 적용한다. 숙련 독자를 위한 reference 문서에는 같은 서사 구조를 강제하지 않는다.
## 8. 일반 기술 문서 원칙과의 결합
우아한형제들 표본의 문제 해결 서사만으로 모든 문서 유형을 설계할 수는 없다. 다음 공식·표준 자료를 함께 사용한다.
- Google Technical Writing: 독자, 범위, 문단 중심점, outline, 점진적 상세화
- GitHub Docs content design: 사용자 목표, 콘텐츠 유형, 결론 우선, 의미 있는 heading
- Diátaxis: tutorial, how-to, explanation, reference의 목적 분리
- OASIS DITA: concept, task, reference, troubleshooting의 정보 구조
- Kubernetes documentation types: task와 tutorial의 선행 조건, 단계, 검증
이를 바탕으로 ClariDoc은 일곱 문서 유형을 분리한다.
| 유형 | 독자가 끝내려는 일 | 핵심 질문 사슬 |
|---|---|---|
| `technical_blog` | 문제와 설계 판단 이해 | 문제 → 제약 → 대안 → 이유 → 구현 → 검증 → 비용 → 판단 |
| `tutorial` | 안내받으며 결과와 개념 학습 | 결과 → 준비 → 전체 경로 → 단계 → 체크포인트 → 검증 → 다음 학습 |
| `how_to` | 특정 작업 완료 | 적용 조건 → 사전 조건 → 절차 → 확인 → 롤백 → 문제 해결 |
| `explanation` | 개념과 인과 모델 이해 | 질문/답 → 기준점 → 모델 → 메커니즘 → 예시 → 대안 → 한계 |
| `reference` | 정확한 사실 조회 | 범위 → 구문 → 필드 → 동작 → 오류 → 최소 예시 → 관련 항목 |
| `troubleshooting` | 증상에서 원인과 복구로 이동 | 증상 → 영향 → 안전 → 진단 → 분기 → 조치 → 복구 → 예방 |
| `design_doc` | 대안을 비교하고 결정 | 요약 → 문제 → 목표 → 제약 → 대안 → 결정 → 구조 → 실패 → 배포 → 관측 → 위험 |
## 9. 모델 역할을 분리한다
하나의 모델이 작성과 자기검토를 모두 수행하면 같은 전제와 누락을 반복하기 쉽다. ClariDoc은 역할을 분리하고 자유 형식 감상이 아니라 JSON 계약으로 리뷰를 받는다.
| 역할 | 기본 provider | 검사 대상 |
|---|---|---|
| planner | Codex | 구조, reader question, evidence allocation |
| writer | Claude | 자연스러운 reader-facing prose |
| logic reviewer | Codex | 전제, 인과, 결론 |
| decision reviewer | Codex | 이유, 대안, 비용, 가드레일 |
| reader reviewer | Claude | 독자 맥락, 인지 부하, 정보 누락 |
| editor reviewer | Claude | 도입, 문단 초점, 전환, 반복, 상투 문구 |
| evidence reviewer | Antigravity | source fit, status, 과장, provenance 누출 |
| operations reviewer | Antigravity | 안전, 검증, 롤백, 실패 경로 |
| reviser | Claude | blocker와 error 수정 |
모델을 다르게 배치해도 진실이 자동으로 보장되는 것은 아니다. 결정적 lint, source hierarchy, manifest, 사람 검토가 함께 필요하다.
## 10. 품질 게이트가 증명하는 것과 증명하지 않는 것
품질 게이트는 다음을 재현 가능하게 확인한다.
- 문서 유형의 필수 섹션이 존재하고 순서를 지키는가
- 작성 과정의 메타 문장이 독자용 글에 누출됐는가
- 선택 선언에 이유, 대안, 비용, 가드레일이 있는가
- 절차에 사전 조건, 검증, 중단, 복구가 있는가
- provider 응답이 계약 형식을 지켰는가
- 산출물과 provenance의 hash가 일치하는가
다음은 증명하지 않는다.
- source 문장이 현실 세계에서 참이라는 것
- 모델 reviewer의 합의가 도메인 정답이라는 것
- 코드와 명령이 대상 시스템에서 안전하게 실행된다는 것
- local test 결과가 production 효과를 보장한다는 것
- 표본에서 추출한 글쓰기 패턴이 우아한형제들의 공식 규정이라는 것
Mock provider PASS는 파이프라인 배선과 검사기의 동작만 검증한다. 실제 문서 품질 점수로 사용하지 않는다.
## 11. 최종 작성 원칙
ClariDoc이 기술 글에 요구하는 핵심은 다음 한 문장으로 정리할 수 있다.
> 독자에게는 문제와 판단의 흐름만 보이고, 검토자에게는 그 판단이 어디에서 왔는지 끝까지 추적되어야 한다.
이를 위해 최종 글은 다음 순서를 지향한다.
```text
이 작업은 언제 적용하는가?
시작 조건은 무엇인가?
최소 절차는 무엇인가?
성공을 어떻게 확인하는가?
실패하면 어떻게 되돌리는가?
대표적인 문제는 어떻게 진단하는가?
실제 문제 장면
단순한 해결을 막은 제약
현실적인 대안과 실패 지점
선택과 선택 이유
받아들인 비용과 지킨 경계
코드·데이터·제어 흐름
→ 검증 결과와 검증하지 못한 범위
→ 다른 환경에 적용할 판단 기준
```
### 4.4 설명
```text
핵심 질문과 답은 무엇인가?
→ 무엇에 빗대어 이해할 수 있는가?
→ 핵심 모델은 무엇인가?
→ 원인과 결과는 어떻게 이어지는가?
→ 구체적인 사례는 무엇인가?
→ 대안과 다른 관점은 무엇인가?
→ 모델의 한계는 무엇인가?
→ 실무 판단에는 어떤 의미가 있는가?
```
### 4.5 참조
```text
어떤 버전과 범위를 다루는가?
→ 정확한 구문은 무엇인가?
→ 필드와 기본값은 무엇인가?
→ 정상 동작과 부작용은 무엇인가?
→ 어떤 오류가 발생하는가?
→ 최소 예시는 무엇인가?
→ 관련 항목은 무엇인가?
```
### 4.6 트러블슈팅
```text
정확한 증상은 무엇인가?
→ 영향 범위는 어디까지인가?
→ 증거와 복구점을 어떻게 보존하는가?
→ 가장 싼 비파괴 진단은 무엇인가?
→ 관측 결과에 따라 원인이 어떻게 갈리는가?
→ 확인된 원인에 어떤 최소 조치를 하는가?
→ 복구를 어떻게 검증하는가?
→ 재발을 어떻게 막고 언제 에스컬레이션하는가?
```
### 4.7 설계 문서
```text
어떤 결정을 요청하는가?
→ 해결할 문제는 무엇인가?
→ 목표와 비목표는 무엇인가?
→ 요구와 제약은 무엇인가?
→ 가능한 대안은 무엇인가?
→ 무엇을 선택하며 왜인가?
→ 아키텍처와 상태 흐름은 무엇인가?
→ 실패·보안·운영 위험은 무엇인가?
→ 어떻게 점진 배포하고 되돌리는가?
→ 성공을 무엇으로 관측하는가?
→ 열린 위험과 가정은 무엇인가?
```
## 5. 모델별 역할을 나눈 이유
모델 이름 자체가 품질을 보장하지는 않는다. 이 하네스는 제공자별 “성격”을 전제로 하지 않고, 역할 계약과 출력 검증으로 책임을 분리한다.
- Codex 어댑터는 반복 가능한 CLI 파이프라인에 적합한 `codex exec` 표면을 사용한다.
- Claude 어댑터는 stdin으로 긴 작업을 넘길 수 있는 `claude -p` print mode를 사용한다.
- Antigravity 어댑터는 Python SDK의 `Agent``LocalAgentConfig`를 사용한다.
- 실제 모델 ID는 구성에 명시할 수 있지만 기본 예제는 계정·조직별 가용성이 달라 빈 값으로 둔다.
- provider가 반환한 JSON은 내부 dataclass 계약으로 다시 파싱하며, 구조가 틀리면 폴백 또는 실패 정책을 적용한다.
## 6. 품질 평가가 의미하는 것
### PASS가 의미하는 것
- 문서 유형별 필수 구조가 존재한다.
- 설정한 lint와 독립 리뷰의 복합 기준을 만족한다.
- blocker/error 한도를 넘지 않았다.
- 실행 과정과 결과가 저장되었다.
### PASS가 의미하지 않는 것
- 모든 사실이 참이라는 보증
- 코드 예제가 실제 환경에서 동작한다는 보증
- 보안, 법률, 규제, 의료, 재무 적합성
- 독자 연구나 사용성 테스트를 대체한다는 의미
- Mock provider 점수가 실제 모델 또는 실제 문서 품질을 증명한다는 의미
## 7. 설계상 의도적인 한계
1. **웹 수집기는 포함하지 않았다.** URL을 자동 방문해 진실로 취급하는 대신, 작성자가 출처별 fact를 명시하게 했다.
2. **자연어 의미 검증은 완전하지 않다.** 인용 ID가 있어도 출처가 그 문장을 지지하는지는 reviewer와 사람이 확인해야 한다.
3. **휴리스틱은 언어별 오차가 있다.** 한국어와 영어의 길이·문장 분리·표현 차이를 완전히 모델링하지 않는다.
4. **다중 모델 합의는 진실의 증명이 아니다.** 서로 다른 모델이 같은 잘못된 전제를 공유할 수 있다.
5. **문서 유형은 시작점이다.** 큰 문서 세트는 여러 유형으로 분리하거나 명시적으로 조합해야 한다.
6. **실제 독자 검증이 최종 기준이다.** 검색 성공률, 과업 완료율, 오류율, 읽기 중 이탈, 지원 문의 감소 같은 운영 지표로 개선해야 한다.
## 8. 결론
ClariDoc의 핵심은 모델에게 “논리적으로 써 달라”고 부탁하는 것이 아니다. 논리의 구성요소를 계약으로 만들고, 독자 질문의 순서를 문서 유형별로 고정하며, 작성·검토·수정·감사의 경계를 코드로 분리하는 것이다.
이 구조는 문체를 획일화하기 위한 것이 아니라, 문체보다 먼저 충족되어야 할 이해 가능성의 최소 골격을 제공한다. 프로젝트별 용어, 브랜드 보이스, 실제 독자 데이터가 있으면 그 정보가 일반 규칙보다 우선한다.
전체 출처와 코드 대응표는 [`SOURCE_MATRIX.md`](SOURCE_MATRIX.md)를 참조한다.
이 구조는 미문을 보장하지 않는다. 대신 독자가 “무엇을 했는가”뿐 아니라 “왜 그랬고, 어디까지 믿어도 되는가”를 판단할 수 있는 최소 조건을 만든다.