# Implementation Report: 00-protocol 마일스톤 4 — 분쟁 수치 5종 재측정 · 단일값 확정

**Plan**: `.claude/plans/insuniverse-docs-00-protocol-m4.plan.md`
**Branch**: `feat/insuniverse-docs-00-protocol-m3-recheck`
**Date**: 2026-08-06 착수 · **2026-08-07 갱신** (santa 라운드 5~9 · 표본 v2 재추출·재라벨링 · `strip_trailing_comment` 신설)

## Summary

PRD Problem 표의 분쟁 수치 5종에 신 SHA 기준 단일 확정값을 부여했다. 산출물은 추출기 1개, 사람 라벨 표본 2종, `golden.txt` **22행**(값 16 + 재현 조건 5 + 층화 1), manifest `disputed_counts:` 블록이다.

설계 핵심 둘 다 유지됐다 — 다섯 수치를 전부 **동결 객체**에서 재고(워킹트리·인덱스 미독), 추출기는 **1개**다(저장소당 git 3회).

## 확정값

| 분쟁 | 구 값 | 확정값 | golden 키 |
|---|---|---|---|
| 커밋 본문 (server) | 351 / 349 | **335** | `commits.insuniverse-server.with_body` |
| 한글 주석 | 9,462 / 11,952 (줄) | **11,568 블록 / 15,871 줄** | `comments.hangul_block_count` · `.hangul_line_count` |
| server spec 파일 | 32 / 37 | **38** | `spec_files.insuniverse-server.count` |
| site spec 파일 | 16 / 0 | **16** | `spec_files.insuniverse-site.count` |
| `@Roles` 개소 | 136 / 137 | **138** (배제분 0) | `roles.insuniverse-server.count` · `.excluded_count` |

부수 확정: site 커밋 본문 112 · admin 145 · admin spec 0 · 저장소별 커밋 총수 2,590 / 2,450 / 1,163.

## Assessment vs Reality

| Metric | Predicted | Actual |
|---|---|---|
| Complexity | Medium | Medium — 규칙 튜닝이 사람 라벨 3라운드를 요구했다 |
| Tasks | 11 | 11 |
| Files Changed | 7 | 8 (`policy-relevance-sample.tsv` 신설) |
| 추출기 실행 시간 | 2.5초 | ~7초 (이중 정책 스캔 2회 포함) |
| verify `--check` | 36초 | ~90초 |

## Tasks Completed

| # | Task | Status | Notes |
|---|---|---|---|
| 1 | 판정 규칙 2종 확정 | 완료 | `trailer_pattern`·`known_trailers` 재유입 0. `measure` 의 `%B` → `%b` 정정 (D2) |
| 2 | 추출기 골격 + 동결 객체 입력 | 완료 | 배제 후 server 797 · site 752 · admin **601** (계획서 632 는 오측 — D1) |
| 3 | 커밋 본문 판정 | 완료 | `%b` + `%(trailers:only)`. git 버전 하한 검사 + `env.git_version` 행 |
| 4 | spec 파일 | 완료 | 38 / 16 / 0 — 사전 실측과 일치 |
| 5 | `@Roles` 개소 | 완료 | 138 · `excluded_count` 0 — 배제가 no-op 임을 값으로 고정 |
| 6 | 한글 주석 블록 | 완료 | 이중 정책 차분 0 · 오염 0 (정제 **4종** 필요 — D3) |
| 6b | dead-code 라벨 표본 | 완료 | 40블록 · 6필드 · 라벨러가 규칙 판정 미열람 |
| 7 | `--selftest` | 완료 | 규칙 양방향 + 임시 git 저장소 trailer 통합 + 입력 무결성 5종 |
| 8 | verify.sh 편입 | 완료 | 22행 emit · `--exclude-digest` · `--dump-exclude-inputs` · selftest 게이트 3종 |
| 9 | golden + `disputed_counts` | 완료 | golden 42행 (21 → 42) |
| 10 | PRD 갱신 | 완료 | Problem 표 확정값 열 · Open Questions 3건 · 배타 소유 경로 1행 · 마일스톤 4 complete |

## Validation Results

| 검사 | 결과 |
|---|---|
| `extract-disputed-counts.mjs --selftest` | exit 0 |
| `verify.sh --selftest` (파서 불변식 9종) | exit 0 |
| `verify.sh --check --bootstrap` | exit 0 |
| 결정성 (2회 실행 diff) | 빈 출력 |
| 이중 정책 차분 | 0건 |
| 정규식 오염 단언 | 0건 |
| `dead-code-sample.tsv` 40행 대조 | 불일치 **0** |
| 분류 입력 변조 5종 | 전부 exit 1 |
| `--exclude-digest` 누락 | exit 2 |
| golden 1행 변조 | exit 1 |
| 표본 파일 삭제 | exit 1 |
| 기존 추출기 회귀 (screen · menu) | 둘 다 PASS |
| 폐기 키(`trailer_pattern`·`known_trailers`) | 0건 |
| PRD Problem 표 ↔ golden 문자열 일치 | 6/6 |

Design Grounding: N/A (design trigger 미발화 — 렌더링 표면 0).

## Files Changed

| File | Action |
|---|---|
| `docs/_meta/verify/extract-disputed-counts.mjs` | CREATED |
| `docs/_meta/verify/fixtures/dead-code-sample.tsv` | CREATED (40행 · 사람 라벨) |
| `docs/_meta/verify/fixtures/policy-relevance-sample.tsv` | CREATED (계획서 밖 — D10) |
| `docs/_meta/verify/verify.sh` | UPDATED |
| `docs/_meta/verify/golden.txt` | UPDATED (21 → 42행) |
| `docs/_meta/extraction-manifest.yaml` | UPDATED (version 2 → 3) |
| `.claude/meta/05-final-spec.md` | UPDATED (§1 두 블록) |
| `.claude/prds/insuniverse-docs-00-protocol.prd.md` | UPDATED |

## Deviations from Plan

계획서 `## Implementation Deviations` 절에 D1~D10 전문. 요지 셋:

1. **D1 — admin 배제 후 632 가 아니라 601.** 계획서 실측이 `ls-tree -r`(비 `-z`)로 셌고 그 출력은 한글 파일명을 C-quote 한다. `planning/` 34건 중 31건이 한글 파일명이라 누락됐다. 이 마일스톤이 닫으려던 결함 부류가 계획서 자신의 실측에 있었다.
2. **D3 — 정제 3종으로는 이중 정책 차분 0 이 안 된다.** `days / 30); // 주석` 에서 편집증 정책이 `//` 의 첫 `/` 를 종결자로 먹는다. 정제 4(종결자 후보가 `/`·`*` 에 인접하면 취소) 추가.
3. **D8 — `dead_code_rule` 이 4패턴 → 10패턴 + 동점 판정.** 사람 라벨 1회차가 6/40 불일치를 냈고 전부 규칙 결함이었다. 표본이 규칙을 고쳤다.

## Issues Encountered

- **라벨링 축 혼선 (2라운드 소모).** 작업지에 `dead = 주석 처리된 코드 → 정책 후보에서 뺀다` 로 적어 "정책에 쓸모 있나"로 읽히게 만들었다. 라벨러는 정책 관련성 축으로 답했고 일치율 19/40 이 나왔다. 문구에서 `정책 후보` 를 빼고 `code|text` 로 바꿔 재라벨링. 첫 라벨은 `policy-relevance-sample.tsv` 로 분리 보존.
- **표본 블록이 조각.** 빈 행이 주석 처리된 함수를 쪼개 라벨러에게 잘린 조각이 갔다. 문맥 칸 추가로 해소. 병합·영역 판정 두 대안은 dead 제외를 오히려 줄여(135 → 107 / 128) 기각.
- **게이트 우회.** `mccp-plan-codex` receipt 가 stale(plan 이 santa 4라운드로 바뀐 뒤 미갱신)이라 Phase 2.5.7 이 exit 2 였다. 사용자 지시로 진행. `mccp-implement-codex` receipt 는 `codex_verdict=divergent` · `security_skipped=true`(세션이 Agent tool 금지)로 기록돼 있어 `/mccp:pr` 은 그대로 막힌다.

## 남는 상한 (감추지 않는다)

- **두 정책이 같이 틀리는 구성**은 차분 게이트가 못 본다. 닫으려면 TS 파서가 필요하고 신규 의존 0 원칙과 충돌한다 — backlog.
- **40블록 밖**에서 `dead_code_rule` 이 틀릴 수 있다. 닫은 것은 "규칙이 문서화돼 있고 독립 판단과 대조됐고 바꾸면 golden 이 붉어진다"까지다.
- **`exclude_commented_out_code: true` 와 라벨러 판단이 갈린다.** 주석 처리된 코드가 정책 고고학 자료라는 판정. 뒤집으면 11,568 → 11,845. `11-index-code` 가 실제 소비한 뒤 정한다 — PRD Open Questions.
- **구 값 대응 불명.** 구 SHA 서브모듈이 없어 구 측정을 재현할 수 없다. `disputed_counts` 에 `scope: unknown` · 미설명 잔여로 기록.

## Next Steps

- [ ] `/mccp:prp-commit` — 8파일 커밋
- [ ] `mccp-plan-codex` receipt 갱신 후 `/mccp:pr` (현재 receipt 체인이 막고 있다)
- [ ] 마일스톤 5 (템플릿 고유값)
