# task-1915: 시스템3문서 전수조사 — 문서 vs 실제 구현 완전 검증

**팀**: dev5-team (마르둑 팀장)
**일시**: 2026-04-17
**검증 레벨**: critical
**작업 유형**: 조사 + 보고서 (코드 수정 없음)

---

## Situation (상황)
시스템3문서(cross-verification-workflow) 체크리스트에서 [x]로 체크된 항목 중 "문서에만 있고 실제 코드에 미반영"된 사례가 반복 발생. 제이회장님 직접 지시로 전수조사 실시.

## Complication (문제)
체크리스트 약 120개 [x] 항목의 신뢰성을 L1(코드 존재)/L2(기능 동작)/L3(통합 동작) 3단계로 검증해야 함. 문서 기술과 실제 구현이 일치하지 않는 항목을 발견하여 체크리스트 정정 필요.

## Question (질문)
각 [x] 항목은 실제로 코드에 구현되어 동작하고 있는가? FAIL 항목은 무엇이며 어떤 수정이 필요한가?

## Answer (답변)

### 종합 결과

**전체 항목: 29개 검증 / PASS 26개 / PARTIAL 2개 / FAIL 1개**

| 구분 | PASS | PARTIAL | FAIL | 합계 |
|------|------|---------|------|------|
| Phase 1 기반 인프라 | 5 | 0 | 0 | 5 |
| Phase 3 교차검증 | 7 | 0 | 0 | 7 |
| 3문서 체계 | 4 | 0 | 0 | 4 |
| 보고서≠구현 방지 | 5 | 1 | 0 | 6 |
| Phase 5 통합테스트 | 2 | 0 | 1 | 3 |
| 횡단 항목 | 3 | 1 | 0 | 4 |

---

## 상세 결과

### Phase 1 — 기반 인프라 (전체 PASS)

| # | 항목 | L1 | L2 | L3 | 판정 |
|---|------|----|----|----|----|
| 1.1 | gate_instructions.py 레벨별 게이트 프롬프트 삽입 | PASS | PASS | PASS | **PASS** |
| 1.2 | affected_files 겹침 감지 + Telegram 경고 | PASS | PASS | PASS | **PASS** |
| 1.3 | batch_id 배치 완료 조회 | PASS | PASS | PASS | **PASS** |
| 1.4 | 레벨 자동 추정 경고 출력 | PASS | PASS | PASS | **PASS** |
| 1.5 | 셀프 QC 의무 프롬프트 삽입 | PASS | PASS | PASS | **PASS** |

<details>
<summary>Phase 1 상세 증거</summary>

**1.1 gate_instructions.py**
- `prompts/gate_instructions.py`: GATE_INSTRUCTIONS dict (Lv.0~4), format_for_prompt(), get_gate_instructions(), should_run_codex_check() 존재
- team_prompts.py:22에서 import, 968~988행 _build_verification_section()에서 호출
- format_for_prompt(3) → G1(Codex+sanitize), G2(Gemini+로키), G3(독립검증) 모두 포함

**1.2 affected_files**
- dispatch.py:766 _parse_affected_files(), 874 _check_affected_files_overlap(), 910 _send_overlap_telegram_warning()
- ANU_BOT_TOKEN이 .env.keys에서 자동 로드 → 실제 Telegram API 호출 성공 확인
- 2664~2679행 통합 호출 흐름 확인

**1.3 batch_id**
- dispatch.py:1009 check_batch_completion(), 2688~2690 _patch_timer_metadata()
- batch-abc 2개 task 테스트 → done:1, running:1 → {complete: False, total: 2, done: 1, pending: ['task-1002']}

**1.4 레벨 자동 추정**
- dispatch.py:1074 _estimate_task_level(), 1051 _CORE_FILES, 1065 _HIGH_LEVEL_KEYWORDS
- '아키텍처' 키워드 → (3, "'아키텍처' 키워드 감지"), 5개 파일 → (3, '5개로 Lv.3 이상 권장')

**1.5 셀프 QC 의무**
- team_prompts.py:528 CRITICAL_SET에 "QC 의무" 텍스트 포함
- 968행 _build_verification_section()에서 QC-RULES.md 참조 삽입
</details>

---

### Phase 3 — 교차검증 파이프라인 (전체 PASS)

| # | 항목 | L1 | L2 | L3 | 판정 |
|---|------|----|----|----|----|
| 3.1 | 사전 리서치 Codex/Gemini 호출 가능 | PASS | PASS | PASS | **PASS** |
| 3.2 | sanitize PII 마스킹 6종 | PASS | PASS | PASS | **PASS** |
| 3.3 | codex_gate_check.py 실행 + 결과 반환 | PASS | PASS | PASS | **PASS** |
| 3.4 | Gemini PR 리뷰 + severity 분류 | PASS | PASS | PASS | **PASS** |
| 3.5 | 3 Step Why 프롬프트 삽입 | PASS | PASS | PASS | **PASS** |
| 3.6 | HIGH/MEDIUM 자동 수정 + 분류 | PASS | PASS | PASS | **PASS** |
| 3.7 | CodeGraph AST 통합 | PASS | PASS | PASS | **PASS** |

<details>
<summary>Phase 3 상세 증거</summary>

**3.1 사전 리서치**
- Codex CLI: /home/jay/.nvm/versions/node/v24.14.0/bin/codex (v0.106.0)
- Gemini CLI: /home/jay/.nvm/versions/node/v24.14.0/bin/gemini (v0.31.0)
- engine_orchestrator.py에서 CLIRunner.run_claude/run_gemini/run_codex 분기 호출 확인

**3.2 sanitize**
- utils/sanitize_gate.py: 6종 패턴 (rrn, phone, email, apikey, account, policy)
- 실제 마스킹 테스트 전부 성공:
  - 900101-1234567 → [RRN-REDACTED]
  - 010-1234-5678 → [PHONE-REDACTED]
  - test@example.com → [EMAIL-REDACTED]
  - sk-abcdefghijklmnopqrst → [APIKEY-REDACTED]
  - 123-456789-12345 → [ACCOUNT-REDACTED]
  - AB12345678 → [POLICY-REDACTED]

**3.3 codex_gate_check.py**
- scripts/codex_gate_check.py: 201줄, argparse 진입점 포함
- 마아트 폴백: task_file 미존재 시 {"pass": False, "source": "maat_fallback"} 정상 반환
- _get_callers_context → ast_dependency_map.py subprocess 호출

**3.4 Gemini PR 리뷰**
- worktree_manager.py: _parse_gemini_comments, _auto_fix_high_comments, _classify_medium_comments
- severity 분류: "HIGH"/"CRITICAL" → high, "MEDIUM"/"WARNING" → medium, 나머지 → low
- gemini_rate_tracker.json으로 일일 33건 한도 추적

**3.5 3 Step Why**
- team_prompts.py:958 "3 Step Why 자문 (Lv.3+)" 삽입
- gate_instructions.py:22 "3 Step Why 2nd 검증" (G1), 28 "3 Step Why 3rd 검증" (G2)
- critical/security 레벨에서만 삽입, normal은 미삽입 (정상)

**3.6 HIGH/MEDIUM 자동 수정**
- _auto_fix_high_comments(): HIGH severity 자동 수정 (최대 3회 루프)
- _classify_medium_comments(): FIX/SKIP/DEFER 3분류 (MEDIUM_FIX_PATTERNS 15개, SKIP 6개)
- collect_mode=True(현재 기본): 프롬프트 생성만, 미실행

**3.7 CodeGraph AST**
- scripts/ast_dependency_map.py: AST 의존성 분석
- scripts/.codegraph-venv/: CodeGraph 2.1.0 설치
- test_ast_integration.py 15개 테스트 전체 PASS (0.09s)
</details>

---

### 3문서 체계 (전체 PASS)

| # | 항목 | L1 | L2 | L3 | 판정 |
|---|------|----|----|----|----|
| A | 자동 생성 (dispatch Lv.3) | PASS | PASS | PASS | **PASS** |
| B | team_prompts 3문서 섹션 삽입 | PASS | PASS | PASS | **PASS** |
| C | three_docs_check QC 검증기 | PASS | PASS | PASS | **PASS** |
| D | .done 전 3문서 검증 | PASS | PASS | PASS | **PASS** |

<details>
<summary>3문서 체계 상세 증거</summary>

- dispatch.py:1119 _create_task_docs(), 2803-2809 Lv.3+ 조건부 호출
- 템플릿 3개 존재: prompts/templates/task-docs/{plan,context-notes,checklist}.template.md
- test_dispatch_task_docs.py 5건 PASS, test_3docs_e2e.py 3건 PASS
- three_docs_check.py: dev1/dev6에 완전 구현 (dev4는 stub — 항상 SKIP)
- qc_verify.py ALL_CHECKS에 three_docs_check 포함
</details>

---

### 보고서≠구현 방지 (5 PASS / 1 PARTIAL)

| # | 항목 | L1 | L2 | L3 | 판정 | 위험도 |
|---|------|----|----|----|----|--------|
| 1-A | Edit grep 검증 지침 | PASS | PASS | PASS | **PASS** | - |
| 1-B | planned/verified 자동 검출 | PASS | PARTIAL | PARTIAL | **PARTIAL** | WARN |
| 2-A | Large-File Protocol 프롬프트 | PASS | PASS | PASS | **PASS** | - |
| 2-B | symbol_existence_check | PASS | PASS | PASS | **PASS** | - |
| 2-C | file_touch_ratio_check | PASS | PASS | PASS | **PASS** | - |
| 3-A | g3_independent_verifier | PASS | PASS | PASS | **PASS** | - |

**PARTIAL 항목 상세 — Tier 1-B: planned/verified 자동 검출**
- 상태: QC-RULES.md + team_prompts에 지침은 존재하나, qc_verify.py/g3_independent_verifier.py에서 보고서 내 "planned" 상태 항목을 자동 FAIL로 처리하는 로직 미구현
- g3_independent_verifier.py L140: `if entry["status"] != "verified": continue` — planned 항목을 건너뛸 뿐, FAIL로 차단하지 않음
- 현재 인적 의존성에만 의존
- 수정 범위: qc_verify.py 또는 g3_independent_verifier.py에 planned 항목 검출 → FAIL 로직 추가

---

### Phase 5 — 통합 테스트 + 효과 측정 (2 PASS / 1 FAIL)

| # | 항목 | L1 | L2 | L3 | 판정 | 위험도 |
|---|------|----|----|----|----|--------|
| 5.1 | 통합 테스트 10개 전부 PASS | PASS | FAIL | FAIL | **FAIL** | CRITICAL |
| 5.2 | auto_merge.py import 성공 | PASS | PASS | PASS | **PASS** | - |
| 5.3 | collect_metrics.py JSON 생성 | PASS | PASS | PASS | **PASS** | - |

**FAIL 항목 상세 — 5.1 통합 테스트**
- pytest tests/integration/ 결과: **126 passed, 1 FAILED**
- 실패 테스트: `test_phase1_integration.py::test_int03_rw_read_no_worktree`
- 원인: `worktree_manager.cmd_create(read_only=True)`가 `@validate_worktree_safety` 데코레이터를 거침 → /tmp/test-project가 git 저장소가 아니므로 `{"status": "error"}` 반환 → `worktree_path` 키 없음 → `KeyError`
- 수정 필요: `@validate_worktree_safety` 데코레이터 내부에서 `read_only=True` 경우 git 검증을 skip하거나, `read_only` 분기를 데코레이터 적용 전에 처리

---

### 횡단 항목 (3 PASS / 1 PARTIAL)

| # | 항목 | L1 | L2 | L3 | 판정 | 위험도 |
|---|------|----|----|----|----|--------|
| A | L1 스모크테스트 (DIRECT-WORKFLOW + QC-RULES + team_prompts) | PASS | PASS | PASS | **PASS** | - |
| B | 한정승인 × 게이트 (anu-guide + DIRECT-WORKFLOW) | PASS | PASS | PASS | **PASS** | - |
| C | 와치독 비활성화 (session-watchdog.sh 주석 처리) | PASS | PASS | PASS | **PASS** | - |
| D | dispatch Phase 감지 경고 (_warn_phase...) | PARTIAL | PASS | PASS | **PARTIAL** | INFO |

**PARTIAL 항목 상세 — dispatch Phase 감지 경고**
- 함수명 불일치: 체크리스트에 `_warn_phase_without_explicit_id`로 기재 → 실제 구현은 `_warn_phase_without_task_id`
- 기능 자체는 정상 동작 (dispatch.py 1479행, 1915행, 2452행에서 호출)
- 수정 필요: 체크리스트 문서에서 함수명을 `_warn_phase_without_task_id`로 정정

---

## 체크리스트 수정 제안

### FAIL → [ ] 되돌리기 제안

| 항목 | 현재 | 제안 | 사유 |
|------|------|------|------|
| 5.1 통합 테스트 10개 전부 PASS | [x] | **[ ]** | 1/127건 실패 (test_int03_rw_read_no_worktree) |

### PARTIAL → 비고 추가 제안

| 항목 | 제안 |
|------|------|
| Tier 1-B planned/verified | [x] 유지하되 비고에 "자동 검출 미구현, 인적 의존" 추가 |
| dispatch Phase 감지 경고 | [x] 유지하되 함수명 `_warn_phase_without_task_id`로 정정 |

---

## 발견 이슈 및 해결

### 이슈 1: test_int03_rw_read_no_worktree 실패 (CRITICAL)
- 현상: @validate_worktree_safety 데코레이터가 read_only 모드에서도 git 검증 수행
- 원인: 데코레이터가 read_only 파라미터를 인식하지 못함
- 해결: 본 작업 범위 외 (코드 수정 없음 원칙). 별도 수정 작업 필요
- 위험도: CRITICAL — 체크리스트 "전부 PASS" 주장이 거짓이 됨

### 이슈 2: planned 자동 검출 미구현 (WARN)
- 현상: planned 항목이 보고서에 있어도 자동 FAIL이 발생하지 않음
- 원인: g3_independent_verifier.py가 verified만 검증하고 planned를 무시
- 해결: qc_verify.py에 planned 검출 로직 추가 필요
- 위험도: WARN — 인적 의존성에 의한 누수 가능

### 이슈 3: 함수명 오기 (INFO)
- 현상: 체크리스트에 `_warn_phase_without_explicit_id` 기재
- 실제: `_warn_phase_without_task_id`
- 해결: 문서 정정 필요
- 위험도: INFO — 기능은 정상

---

## 모델 사용 기록

| 팀원 | 모델 | 역할 | 정당성 |
|------|------|------|--------|
| 엔키 | sonnet | Phase 1 기반 인프라 검증 | 코드 분석 + 실행 테스트 |
| 이쉬타르 | sonnet | Phase 3 교차검증 파이프라인 검증 | 복합 시스템 분석 |
| 나부 | sonnet | 3문서+보고서방지+Phase5 검증 | 대규모 분석 작업 |
| 닌기르수 | sonnet | 횡단 항목 검증 | 문서 연결 분석 |

---

## 셀프 QC 체크리스트

- [x] 1. 영향 파일: 없음 (조사 작업, 코드 수정 없음)
- [x] 2. 엣지 케이스: 파일 미존재 시 SKIP 처리, stub 파일 구분
- [x] 3. 작업 지시 일치: 전수조사 + 보고서 작성 완료
- [x] 4. 에러 처리/보안: N/A (코드 수정 없음)
- [x] 5. 테스트 커버: pytest 실행으로 실동작 확인
- [x] 6. 발견 이슈 해결: 3건 발견 (범위 외 — 코드 수정 없음 원칙)
- [x] 7. 아키텍처 원칙: N/A
- [x] 8. 인터페이스 변경: N/A
- [x] 9. PNG 렌더링: N/A
- [x] 10. CLAUDE.md 100줄: N/A
- [x] 11. 3문서 업데이트: plan.md → completed, context-notes.md → 3 Step Why 기록, checklist.md → 전항목 체크
- [x] 12. 3 Step Why: A→B→C 논리적 일관성 확인 (context-notes.md 기록)
- [x] 13. L1 스모크테스트: N/A (코드 수정 없음, 조사 작업)

---

## 산출물

- `/home/jay/workspace/memory/reports/task-1915.md` (본 보고서)
- `/home/jay/workspace/memory/reports/system3docs-full-audit.md` (전수조사 상세 보고서 — 동일 내용)
- `/home/jay/workspace/memory/plans/tasks/task-1915/plan.md` (계획서 — completed)
- `/home/jay/workspace/memory/plans/tasks/task-1915/context-notes.md` (맥락노트 — 3 Step Why 포함)
- `/home/jay/workspace/memory/plans/tasks/task-1915/checklist.md` (체크리스트 — 전항목 체크)
