# Implementation Report: 00-protocol 마일스톤 5 — 템플릿 고유값 채우기

**Plan**: `.claude/plans/insuniverse-docs-00-protocol-m5.plan.md`
**Branch**: `feat/insuniverse-docs-00-protocol-m3-recheck`
**Date**: 2026-08-07

## Summary

doc-kit fixture `template-config.insuniverse.yaml` 를 `docs/_meta/template-config.yaml` 로 승격하고, 지표 #6("템플릿 적용 가능")을 `verify.sh` 게이트로 실제 자동화했다. 게이트는 세 층이다 — 예시 3종 실 배치 깊이 스테이징 lint · 정본 교차 대조 3종 · golden 파싱값 9행 동결.

값 9개 키는 한 글자도 바꾸지 않았다. 바뀐 것은 주석 3곳(헤더 · `evidence_grades` repo 접두어 · `actors` 미검증 표기)뿐이다.

## Assessment vs Reality

| Metric | Predicted (Plan) | Actual |
|---|---|---|
| Complexity | Small | Small |
| Files Changed | 5 | 5 (+ 게이트 산출물 3) |
| golden 행수 | 43 → 52 | 43 → 52 |
| 음성 대조 | 4종 | 5종 (4b 추가 — 아래 참조) |

## Tasks Completed

| # | Task | Status | Notes |
|---|---|---|---|
| 1 | config 승격 | 완료 | 값 9키 fixture 와 바이트 동일(`diff` 확인). 주석 3곳만 조정 |
| 2 | `run_template_config_gate()` 신설 | 완료 | `tc_list`/`tc_scalar` 는 `json_field` 옆(리포트 헬퍼 구역)에 배치 — `gen_report` 와 게이트가 둘 다 쓴다 |
| 3 | `validate_candidate` 배선 | 완료 | `run_lint_gate` 다음 |
| 4 | golden 9행 편입 | 완료 | 구분자 편차 있음 — 아래 Deviations |
| 5 | 결정성·selftest 회귀 | 완료 | 결정성 2회 diff 빈 출력 · 기존 selftest 11 단언 전부 통과 |
| 6 | PRD·백로그 갱신 | 완료 | 백로그 DEFER 2건은 계획 게이트에서 이미 기록돼 있어 행을 늘리지 않았다 |

## Validation Results

| Level | Status | Notes |
|---|---|---|
| 정적 (`bash -n`) | PASS | |
| selftest (`verify.sh --selftest`) | PASS | 기존 11 단언 회귀 0 |
| selftest (`lint-docs.mjs --selftest`) | PASS | doc-kit 무변동 (`git diff --stat` 빈 출력) |
| 통합 (`--check --bootstrap`) | PASS | `ok template-config 게이트 (예시 3종 lint + 정본 교차 대조 3종)` |
| 음성 대조 | PASS | 5종 전부 exit 1 · 원복 후 재 PASS |

### 음성 대조 — 어느 층이 잡았는지

| # | 변조 | 계획서 예측 층 | 실제로 잡은 층 |
|---|---|---|---|
| 1 | `statuses` 에서 `active-prod` 삭제 | lint `status-domain` + 교차 대조 2 | lint `status-domain` (`policy-example.md:22`) — 게이트에서 lint 가 교차 대조보다 먼저 돌아 여기서 끝난다 |
| 2 | `auth_layers:` 행 삭제 | lint `auth-layers` | lint `auth-layers` (`flow-example.md:1` — 조건부 필수 키 부재). flow 축이 실제로 검사됨을 확인 |
| 3 | `evidence_grades` `S-guard` → `S-guardX` | lint `evidence-domain` | lint `evidence-domain` (`policy-example.md:8`). 교체 드리프트가 개수 대조를 통과하는 층을 닫음 |
| 4 | `status_precedence` `active-prod` 맨 앞 | golden 행 | **lint `flow-refs`** — 예측과 다름. `active-prod` 는 flow 예시가 밟는 status 라 지배 계산이 흔들려 lint 가 먼저 잡았다 |
| 4b | `staged-only` ↔ `prod-hotfix-unreconciled` 스왑 (신설) | — | **golden 드리프트** — 게이트 3층 전부 통과(집합 동일 · flow 미사용 쌍)하고 golden 행만 잡았다. `diff` 가 바뀐 두 원소를 그대로 보여줌 |

4b 를 추가한 이유: 4 가 lint 에 먼저 걸려 *"순서를 잡는 것은 golden 행뿐"* 이라는 계획서의 주장이 실증되지 않은 채로 남았다. flow 예시가 밟지 않는 순서쌍을 뒤집어 golden 층이 단독으로 무는 것을 확인했다.

### Design Grounding

N/A — design trigger 미발동. `impeccable-detect --mode implement` 가 `design_signal=false` (reason `no-signal`). 산출물이 YAML 1 · bash 함수 1 · 텍스트 golden 9행이라 렌더링 표면이 0건이다. Phase 3.6 · 3.7 전부 no-op.

## Files Changed

| File | Action | 비고 |
|---|---|---|
| `docs/_meta/template-config.yaml` | CREATED | 74행. 값 9키는 fixture 와 바이트 동일 |
| `docs/_meta/verify/verify.sh` | UPDATED | 경로 상수 2 · 헬퍼 2 · 게이트 함수 1 · 배선 1 · golden emit 블록 1 |
| `docs/_meta/verify/golden.txt` | UPDATED | 43 → 52행 |
| `.claude/prds/insuniverse-docs-00-protocol.prd.md` | UPDATED | M5 행 complete · 지표 #6 판정 규칙 · Open Questions 1행 · footer · 개정 이력 |
| `.claude/plans/codex-findings-backlog.md` | (계획 게이트에서 갱신됨) | M5 DEFER 2건 존재 |
| `.claude/notes/insuniverse-docs-00-protocol-m5.md` | CREATED | Implement-Codex 리뷰 섹션 (게이트 산출물) |

## Deviations from Plan

1. **golden 리스트 구분자 — 공백 → 쉼표.** 계획서 Task 4 는 `tr '\n' ' '` 로 공백 조인을 지정했다. `auth_layers` 원소에 공백이 있어(`계정 종류`) 공백으로 이으면 `[인증, 계정 종류]` 와 `[인증, 계정, 종류]` 가 같은 행이 되고, 원소를 쪼개거나 합친 드리프트가 golden 을 그대로 통과한다. 값에 쉼표는 들어올 수 없다(YAML 흐름형 구분자). 이유를 코드 주석에 남겼다.

2. **음성 대조 4b 신설** — 위 표 참조. 계획서의 4는 golden 층을 실증하지 못했다.

3. **지표 #6 판정 규칙 문구 보강** (계획서 Task 6 열거 밖). 규칙이 `policy-example.md` 만 지목하는데 실제 게이트는 3종을 검사한다. PRD 가 실제와 갈라지는 것은 이 PRD 가 존재하는 이유의 실패 형태라 한 절만 덧붙였다. 새 샘플을 만들지 않았다는 지표의 단서는 그대로다.

4. **plan 을 `completed/` 로 아카이브하지 않았다.** M3·M4 plan 이 `.claude/plans/` 에 남아 있고 PRD Plan 셀이 그 경로를 가리키는 것이 이 PRD 의 확립된 형태다. 옮기면 방금 쓴 receipt 2건(`--plan` 경로)과 PRD Plan 셀이 동시에 깨진다.

## Issues Encountered

- **Implement-Codex R1 이 `needs-attention`** — MEDIUM 1건(`actors` 미검증 승격). 초점으로 넘긴 7개 구현시 결정에는 지적 0건이고, Plan-Codex R1-F1 과 같은 축이 재제기된 것이다. YAGNI triage 결과 DEFER(중복) + REJECT(기계 판독 provisional 표기 — 읽을 소비자가 0). 상세는 `.claude/notes/insuniverse-docs-00-protocol-m5.md`.
- **security-reviewer 미가용** — 이 세션은 Agent/Task tool 호출이 금지돼 auto-fallback. 영수증에 `security_skipped=true` 로 기록했고 이 상태는 downstream `/mccp:pr` 를 fail-closed 로 막는다. 새 코드의 셸 주입·경로 축 수동 대조는 notes 에 남겼다.

## Tests Written

프레임워크 없음 — 기존 규약대로 실행으로 판정한다.

| 대상 | 단언 | 커버 |
|---|---|---|
| `verify.sh --check --bootstrap` | 게이트 5층 `ok` + `check PASS` | 양성 경로 |
| 음성 대조 5종 | 각각 exit 1 · 원복 후 PASS | 어휘 축소 · 조건부 키 부재 · 교체 · 순서(lint 축) · 순서(golden 축) |
| `verify.sh --selftest` | 11 단언 | 기존 파서 불변식 회귀 |

## Next Steps

- [x] `/mccp:santa-loop` 실행 — 2026-08-10, 라운드 1~4. 흡수 6 · 기각 5, **미수렴 종료**(사용자 판단). 상세는 `.claude/notes/insuniverse-docs-00-protocol-m5.md` §santa 라운드 1~4
- [ ] `STATE.md` escalation 해제 — `mccp-implement-codex` receipt 는 `codex_verdict=divergent` 그대로다. santa 가 수렴이 아니라 판단으로 끝났으므로 receipt 를 갱신하지 않았다(`head_sha: c4243d8` stale). 갱신은 이 축의 구조적 해결(백로그 2026-08-10 HIGH) 이후에 한다
- [ ] `/mccp:pr` 는 `security_skipped=true` 로 막혀 있다 — Agent tool 가용 세션에서 security-reviewer 재실행 필요
- [ ] 마일스톤 6 (onboarding-questions 초안)
