v4.0: Single Source of Truth 시스템 확립

- claude.md.template 추가 (프로젝트별 필수 파일)
- README.md v4.0: Single Source of Truth 핵심 컨셉 추가
- project-structure.md v4.0: claude.md 필수화, standards 제거
- standards 파일들은 Guide/templates/standards/에서만 관리
- 프로젝트별/권별 standards 복사 금지
- 버전 불일치 원천 차단

주요 변경사항:
1. 새 프로젝트 시작 시 claude.md 생성 필수
2. 모든 모드 진입 시 Guide/templates/standards/ 참조
3. 프로젝트 내 standards/ 디렉토리 생성 금지
4. volumes/vol-XX/validation-standards.md 생성 금지

이유: 표준 파일이 여러 곳에 복사되면 버전 불일치 발생
해결: Guide를 유일한 소스로 지정, claude.md로 강제

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
Alex
2026-01-23 12:41:35 +09:00
parent 854ff7d1f5
commit 271c11d6fc
10 changed files with 1768 additions and 190 deletions

View File

@@ -1,6 +1,13 @@
# 1945 소설 검증 기준 문서 (v2.0)
# 1945 소설 검증 기준 문서 (v3.0)
**최종 개정일:** 2026-01-21
**이전 버전:** v2.0 (2026-01-17)
**주요 변경사항:**
- **ch-046 검증 실패 사례 반영:** 빈 섹션 헤더 검출 강화 (섹션 J 신규)
- **ch-047 검증 실패 사례 반영:** 챕터 내부 장면 중복 검증 강화 (섹션 G 대폭 강화)
- **검증 실행 프로토콜 강화:** Step 4에 필수 체크 항목 추가
- **실패 사례 문서화:** 재발 방지를 위한 참조 예시 추가
**최종 개정일:** 2026-01-17
**목적:** 소설 검증 시 명확한 기준 제시 및 누락 방지
**핵심:** 배치 검증 + 검증 요약본 + 2종 요약본 크로스체크
@@ -135,6 +142,10 @@ validation-batch-06.md
- ✅ 일치 / ❌ 불일치
- 불일치 사유: [...]
#### 🔴 v3.0 필수 검증 항목
- **빈 섹션 검증 (J):** 0건 / N건 (라인 XXX)
- **챕터 내부 중복 검증 (G):** 0건 / N건 (라인 XXX-YYY, N줄 중복)
#### 특이사항
- 중복: 없음 / 있음 (상세)
- 시간 역행: 없음 / 있음 (상세)
@@ -304,6 +315,205 @@ L:\내 드라이브\Writing\1945-novel\volumes\vol-01\chapters\ch-*.md
- 완전히 동일한 내용 반복
- 같은 제목으로 같은 내용
#### G. 챕터 내부 장면 중복 검증 ⭐⭐⭐ (v3.0 대폭 강화)
**중요도:** 🔴 **필수** - v2.0 검증 시 ch-047에서 190줄 중복을 놓침
**검증 방법:**
각 챕터 내에서 같은 장면이 반복되는지 **전체 내용** 확인:
**1단계: 장면 헤더 추출**
```bash
각 챕터의 모든 "## " 헤더 추출
→ 동일한 헤더가 2번 이상 나오는지 확인
→ 예: "## 오후 4시, 종로 다방" (202줄, 392줄 2회 등장)
```
**2단계: 중복 헤더 발견 시 내용 비교**
```bash
같은 헤더 발견 → 해당 섹션 전체 내용 비교
→ 50줄 이상 동일 내용 = 🔴 심각한 중복
→ 10-50줄 동일 내용 = 🟡 중간 중복
→ 10줄 미만 동일 = 🟢 경미한 중복
```
**3단계: 중복 범위 및 심각도 판정**
| 중복 줄 수 | 심각도 | 판정 | 조치 |
|-----------|--------|------|------|
| 100줄 이상 | 🔴 긴급 | 즉시 보고 | 수정 필수 |
| 50-100줄 | 🔴 높음 | 즉시 보고 | 수정 필수 |
| 10-50줄 | 🟡 중간 | 보고 | 수정 권장 |
| 10줄 미만 | 🟢 낮음 | 기록 | 확인 필요 |
**검증 항목:**
| 항목 | 검증 내용 | 오류 예시 |
|------|----------|----------|
| 1. 장면 헤더 중복 | 같은 시간/장소 헤더가 2번 이상 | "## 오후 4시, 종로 다방" (202줄, 392줄) ❌ |
| 2. 대화 내용 중복 | 같은 대화를 여러 번 | "약혼식에 부모님을 모시고 싶어요" 장면 2회 ❌ |
| 3. 서술 내용 중복 | 같은 서술이 반복 | "두 사람은 창가에 앉았다" 동일 문장 2회 ❌ |
| 4. 대규모 장면 중복 | 50줄 이상 동일한 장면 | ch-047: 190줄 완전 중복 ❌ |
**허용되는 반복:**
- 강조를 위한 **의도적 반복** (명확히 표시: "다시 한 번", "앞서 말했듯이" 등)
- 요약/정리를 위한 반복 (명확히 다른 맥락)
- 10줄 미만의 짧은 대화 반복 (다른 장면에서 언급)
**금지되는 반복:**
- 🔴 **작가가 잊고 같은 내용을 또 쓴 경우** (ch-047 사례)
- 🔴 **Part/장면 구분 실수로 중복된 경우**
- 🔴 **50줄 이상의 대규모 중복**
- 🔴 **같은 헤더로 같은 장면을 2번 작성**
**실패 사례 참조:**
```
ch-047.md (2026-01-17 검증에서 놓침)
- 202-254줄: "## 오후 4시, 종로 다방" 장면 (53줄)
- 392-447줄: "## 오후 4시, 종로 다방" 장면 (56줄)
- 총 190줄 분량 완전 중복
- v2.0 검증: "내용 중복: 0건" 보고 (❌ 오판)
- 원인: 장면 헤더 중복 체크 미실행
```
**v3.0 개선사항:**
- ✅ 모든 "## " 헤더 강제 추출 및 비교
- ✅ 중복 헤더 발견 시 내용 전체 비교 필수
- ✅ 50줄 이상 중복 시 즉시 보고 의무화
- ✅ validation-batch-XX.md에 "챕터 내부 중복 체크" 항목 필수 기재
#### H. 인과관계 논리 검증 ⭐ (신규)
**방법:**
챕터 간 인과관계가 논리적으로 맞는지 확인:
| 항목 | 검증 내용 | 오류 예시 |
|------|----------|----------|
| 1. 물건/정보 흐름 | A에서 X를 받았으면 B에서 X를 가지고 있어야 | ch-004에서 명단 받았는데, ch-005에서 또 작성 ❌ |
| 2. 시간 흐름 논리 | 과거 결정이 미래에 반영 | 4화에서 승인했는데 5화에서 또 승인 요청 ❌ |
| 3. 상태 변화 | 상태 변화가 일관성 있게 | 우호적 관계였는데 갑자기 적대적 (이유 없음) ❌ |
**체크 방법:**
1. 전 챕터에서 발생한 사건 목록 작성
2. 현 챕터에서 그 사건이 전제되어 있는지 확인
3. 모순되는 내용이 없는지 확인
#### I. 정보 흐름 검증 ⭐ (신규)
**방법:**
독자가 정보를 순차적으로 받는지 확인:
| 항목 | 검증 내용 | 오류 예시 |
|------|----------|----------|
| 1. 캐릭터 소개 | 첫 등장 시 소개 있는지 | 강세우가 소개 없이 갑자기 "형님" ❌ |
| 2. 관계 형성 | 관계가 점진적으로 발전 | 첫 만남에서 바로 "형님" (과정 없음) ❌ |
| 3. 설정 공개 | 설정이 필요한 시점에 공개 | 배경 설명을 나레이션으로만 (대화 없음) ❌ |
**허용되는 방식:**
- 대화로 자연스럽게 소개: "여 선생님이 소개해주셨습니다. 형님으로 모시라고 하셨습니다."
- 단계적 관계 형성: "강 선생님" → "형님" (시간차)
**금지되는 방식:**
- 나레이션으로만 배경 설명 (캐릭터가 모르는 정보)
- 소개 없이 갑자기 친밀한 호칭
- 설명 없이 갑자기 등장
#### J. 빈 섹션 검증 ⭐⭐⭐ (v3.0 신규 추가)
**중요도:** 🔴 **필수** - v2.0 검증 시 ch-046 빈 섹션을 놓침
**검증 방법:**
각 챕터의 모든 섹션 헤더 뒤에 **실제 내용**이 있는지 확인:
**1단계: 섹션 헤더 추출**
```bash
각 챕터의 모든 "## " 헤더 라인 번호 추출
→ 예: ch-046의 293줄 "## 9월 30일 월요일, 저녁"
```
**2단계: 헤더 이후 내용 확인**
```bash
헤더 라인 이후 최소 3개의 비어있지 않은 줄이 있는지 확인
→ 빈 줄(빈 라인), "---" 구분선은 제외
→ 실제 문장/대화가 있는지 확인
```
**3단계: 빈 섹션 판정**
| 헤더 이후 내용 | 판정 | 심각도 | 조치 |
|---------------|------|--------|------|
| 0줄 (파일 끝) | 빈 섹션 | 🔴 긴급 | 즉시 보고, 수정 필수 |
| 1-2줄만 | 내용 부족 | 🟡 중간 | 보고, 확인 필요 |
| 3줄 이상 | 정상 | 🟢 정상 | - |
**검증 항목:**
| 항목 | 검증 내용 | 오류 예시 |
|------|----------|----------|
| 1. 파일 끝 빈 헤더 | 헤더만 있고 파일 종료 | "## 9월 30일 월요일, 저녁" 이후 내용 없음 ❌ |
| 2. 중간 빈 헤더 | 헤더와 다음 헤더 사이 내용 없음 | "## Part 3" 이후 바로 "## Part 4" ❌ |
| 3. 내용 1-2줄만 | 헤더에 비해 내용 너무 짧음 | "## 12월 1일 아침" 이후 "좋은 아침." 한 문장만 ⚠️ |
| 4. 구분선만 | 헤더 + 구분선만 | "## 오후 2시\n---\n(파일 끝)" ❌ |
**최소 내용 기준:**
- **필수:** 헤더 이후 최소 3줄의 실제 내용 (대화/서술/묘사 등)
- **권장:** 헤더 이후 최소 50자 이상의 텍스트
- **경고:** 헤더만 있고 내용 0-2줄 = 미완성 의심
**허용되는 경우:**
- 짧은 전환 장면 (3줄 이상이면 OK)
- 간략한 일기 항목 (3줄 이상이면 OK)
**금지되는 경우:**
- 🔴 **헤더만 작성하고 내용 미작성** (ch-046 사례)
- 🔴 **헤더 + 구분선만 있고 파일 종료**
- 🔴 **계획만 세우고 실제 작성 안함**
**실패 사례 참조:**
```
ch-046.md (2026-01-17 검증에서 놓침)
- 289줄: "저도요." (마지막 완성된 대화)
- 290줄: (빈 줄)
- 291줄: ---
- 292줄: (빈 줄)
- 293줄: ## 9월 30일 월요일, 저녁
- 294줄: (빈 줄)
- 295줄: ---
- 296줄: (빈 줄)
- 297줄: (파일 끝)
- v2.0 검증: "제목-내용 일치: 52/52 완벽" 보고 (❌ 오판)
- 원인: 헤더 존재만 확인, 헤더 이후 내용 미확인
```
**v3.0 개선사항:**
- ✅ 모든 "## " 헤더 위치(라인 번호) 추출
- ✅ 각 헤더 이후 3줄 내 실제 내용 존재 여부 확인
- ✅ 파일 끝 근처 헤더 특별 주의
- ✅ validation-batch-XX.md에 "빈 섹션 체크" 항목 필수 기재
- ✅ 빈 섹션 발견 시 "내용 미완성" 즉시 보고
**체크 알고리즘:**
```python
for header_line in headers:
content_lines = []
current_line = header_line + 1
# 헤더 이후 10줄까지 체크
for i in range(10):
if current_line >= total_lines:
break # 파일 끝
line = lines[current_line].strip()
# 빈 줄, 구분선 제외하고 실제 내용만 카운트
if line and line != "---":
content_lines.append(line)
current_line += 1
# 실제 내용이 3줄 미만이면 경고
if len(content_lines) < 3:
report_empty_section(header_line, content_lines)
```
---
## 본문 검증 절차 (배치별)
@@ -336,13 +546,38 @@ L:\내 드라이브\Writing\1945-novel\volumes\vol-01\chapters\ch-*.md
3. 중복 제목 즉시 확인
```
### Step 4: 챕터별 상세 검증
### Step 4: 챕터별 상세 검증 (v3.0 강화)
```bash
각 챕터마다:
1. 첫 100줄 읽기
1. 전체 파일 읽기 (첫 100줄이 아닌 전체)
2. 타임라인, 이벤트, 캐릭터 파악
3. 제목-내용 일치 확인
4. 검증 요약본에 기록
🔴 **v3.0 필수 체크 (반드시 실행):**
4. **빈 섹션 검증 (섹션 J):**
- 모든 "## " 헤더 추출
- 각 헤더 이후 3줄 내 실제 내용 확인
- 빈 섹션 발견 시 즉시 보고
- 결과: "빈 섹션: 0건" 또는 "빈 섹션: N건 (라인 XXX)"
5. **챕터 내부 중복 검증 (섹션 G):**
- 모든 "## " 헤더 추출 및 중복 확인
- 중복 헤더 발견 시 내용 비교
- 50줄 이상 중복 시 즉시 보고
- 결과: "챕터 내부 중복: 0건" 또는 "챕터 내부 중복: N건 (라인 XXX-YYY)"
6. 검증 요약본에 기록 (필수 항목 포함)
```
**Step 4 체크리스트 (필수):**
```markdown
각 챕터 검증 완료 시 다음을 확인:
- [ ] 타임라인 확인 완료
- [ ] 주요 이벤트 파악 완료
- [ ] 제목-내용 일치 확인 완료
- [ ] 🔴 빈 섹션 검증 완료 (섹션 J)
- [ ] 🔴 챕터 내부 중복 검증 완료 (섹션 G)
- [ ] 검증 요약본에 모든 항목 기록 완료
```
### Step 5: 배치 전체 분석
@@ -642,12 +877,33 @@ L:\내 드라이브\Writing\1945-novel\volumes\vol-01\chapters\ch-*.md
|------|------|----------|------|
| ch-006 | 금괴 탈취 작전 | 인민공화국 선포 | ❌ |
## 5. 중복 내용
## 5. 중복 내용 (챕터 간)
- 발견: N개
- 목록:
| 챕터 1 | 챕터 2 | 중복 유형 | 상세 |
## 6. 캐릭터 일관성
## 🔴 6. v3.0 필수 검증 항목
### 6-1. 빈 섹션 검증 (섹션 J)
| 챕터 | 빈 섹션 라인 | 헤더 내용 | 심각도 |
|------|-------------|----------|--------|
| ch-046 | 293 | "## 9월 30일 월요일, 저녁" | 🔴 긴급 |
- **총 빈 섹션:** N개
- **🔴 긴급:** N개 (파일 끝 빈 헤더)
- **🟡 주의:** N개 (내용 부족)
### 6-2. 챕터 내부 중복 검증 (섹션 G)
| 챕터 | 중복 라인 범위 | 헤더 내용 | 중복 줄 수 | 심각도 |
|------|---------------|----------|-----------|--------|
| ch-047 | 202-254, 392-447 | "## 오후 4시, 종로 다방" | 190줄 | 🔴 긴급 |
- **총 챕터 내부 중복:** N개
- **🔴 긴급 (50줄 이상):** N개
- **🟡 주의 (10-50줄):** N개
- **🟢 경미 (10줄 미만):** N개
## 7. 캐릭터 일관성
- 등급: A+ / A / B / C / F
- 호칭 일관성: ✅ / ❌
- 말투 일관성: ✅ / ❌
@@ -880,6 +1136,144 @@ L:\내 드라이브\Writing\1945-novel\volumes\vol-01\chapters\ch-*.md
---
## 📚 v3.0 검증 실패 사례 (재발 방지)
### 사례 1: ch-046 빈 섹션 미검출 (2026-01-17)
**문제:**
- **챕터:** ch-046.md "1권 46화: 약혼을 위하여"
- **타임라인:** 1946년 9월 16일 ~ 9월 30일
- **총 라인:** 297줄
- **문제 위치:** 293-297줄
**실제 내용:**
```markdown
289→"저도요."
290→
291→---
292→
293→## 9월 30일 월요일, 저녁
294→
295→---
296→
297→(파일 끝)
```
**v2.0 검증 결과:**
- "제목-내용 일치: 52/52 완벽" ✅ (오판)
- 빈 섹션을 발견하지 못함
**원인 분석:**
1. v2.0은 "헤더가 존재하는가"만 체크
2. "헤더 이후 내용이 있는가"는 체크하지 않음
3. 첫 100줄만 읽어서 파일 끝 문제 발견 못함
**v3.0 개선:**
- ✅ 섹션 J 추가: 빈 섹션 검증
- ✅ 모든 헤더 이후 최소 3줄 내용 확인
- ✅ 전체 파일 읽기 (첫 100줄이 아닌)
- ✅ 파일 끝 근처 헤더 특별 주의
**재발 방지:**
- 모든 배치 검증 시 섹션 J 체크 필수
- validation-batch-XX.md에 "빈 섹션: 0건" 명시 필수
---
### 사례 2: ch-047 챕터 내부 중복 미검출 (2026-01-17)
**문제:**
- **챕터:** ch-047.md "1권 47화: 원산행 계획"
- **타임라인:** 1946년 10월 1일 ~ 10월 15일
- **총 라인:** 약 500줄
- **문제 위치:** 202-254줄, 392-447줄
**실제 내용:**
**첫 번째 장면 (202-254줄, 53줄):**
```markdown
202→## 오후 4시, 종로 다방
203→
204→두 사람은 창가에 앉았다.
205→
206→따뜻한 보리차 향. 밖으로 거리가 보였다.
...
212→"약혼식에... 부모님을 모시고 싶어요."
...
254→"12월 15일이 기다려져요."
```
**두 번째 장면 (392-447줄, 56줄):**
```markdown
392→## 오후 4시, 종로 다방
393→
394→두 사람은 창가에 앉았다.
395→
396→따뜻한 보리차 향. 밖으로 거리가 보였다.
...
402→"약혼식에... 부모님을 모시고 싶어요."
...
444→"12월 15일이 기다려져요."
445→
446→"저도 그렇습니다."
447→
```
**중복 규모:**
- 동일 헤더: "## 오후 4시, 종로 다방"
- 중복 내용: 약 190줄 분량
- 중복 비율: 챕터 전체의 38%
**v2.0 검증 결과:**
- "내용 중복: 0건" ✅ (오판)
- 190줄 대규모 중복을 발견하지 못함
**원인 분석:**
1. v2.0 섹션 G는 "챕터 간 중복"만 체크
2. "챕터 내부 중복"은 체크 항목에 없었음
3. 첫 100줄만 읽어서 392줄의 중복 발견 못함
4. 장면 헤더 추출/비교 프로세스 미실행
**v3.0 개선:**
- ✅ 섹션 G 대폭 강화: 챕터 내부 중복 검증
- ✅ 모든 "## " 헤더 추출 및 중복 확인
- ✅ 중복 헤더 발견 시 내용 비교
- ✅ 50줄 이상 중복 시 즉시 보고
- ✅ 전체 파일 읽기 필수
**재발 방지:**
- 모든 배치 검증 시 섹션 G 체크 필수
- validation-batch-XX.md에 "챕터 내부 중복: 0건" 명시 필수
- 중복 헤더 발견 시 반드시 내용 비교
---
### 교훈 및 원칙
**v2.0의 근본적 문제:**
1. **부분 읽기:** 첫 100줄만 읽음 → 파일 끝, 중간 이후 문제 못 찾음
2. **헤더만 체크:** 헤더 존재 확인만 함 → 헤더 이후 내용 미확인
3. **챕터 간만 체크:** 챕터 간 중복만 봄 → 챕터 내부 중복 놓침
4. **선택적 실행:** 섹션 G, H, I가 있었으나 실제 실행 안됨
**v3.0 개선 원칙:**
1.**전체 읽기:** 모든 챕터 전체 내용 읽기
2.**내용 검증:** 헤더 뿐 아니라 헤더 이후 내용 확인
3.**챕터 내부 검증:** 챕터 내부 중복, 빈 섹션 검증
4.**필수 실행:** Step 4에 필수 체크리스트 명시
**핵심 메시지:**
> "헤더가 있다고 내용이 있는 것이 아니다" (ch-046)
> "챕터 간 중복이 없다고 챕터 내부 중복이 없는 것이 아니다" (ch-047)
---
**이 문서는 검증 시 필수 참조 문서입니다.**
**검증 모드 진입 시 반드시 이 문서를 먼저 확인하세요.**
**배치 검증 + 검증 요약본 + 2종 크로스체크가 핵심입니다.**
**v3.0 필수 사항:**
- ✅ 전체 파일 읽기 (첫 100줄이 아닌)
- ✅ 빈 섹션 검증 (섹션 J) 필수 실행
- ✅ 챕터 내부 중복 검증 (섹션 G) 필수 실행
- ✅ validation-batch-XX.md에 두 항목 결과 필수 기재