# Implementation Report: 13 · 관계 축 계약 — 마일스톤 1 (위임 규약 확립)

**Plan**: `.claude/plans/insuniverse-docs-13-relation-contract-m1-r2.plan.md`
**Branch**: `feat/insuniverse-docs-13-relation-contract`
**Date**: 2026-08-13

## Summary

archived PRD 소유 경로를 복원 없이 개정할 수 있는 위임 규약을 세우고, 그 인가 위에서 이 PRD 를
우산 §PRD 분할 맵과 `docs/_meta/ownership.md` §PRD별 배타 소유 경로 양쪽에 10번째 행으로 넣었다.
같은 창에서 `origin/main` 이 이미 갖고 있던 `10-index-git` 행 드리프트 3경로를 복구하고 golden 을
재동결했다. `bash docs/_meta/verify/verify.sh --check --bootstrap` **exit 0**, 하네스 **assert 실패 0 건**.

## Assessment vs Reality

| Metric | Predicted (Plan) | Actual |
|---|---|---|
| Complexity | Medium | Medium — 편집은 계획대로였고 비용은 전부 **환경 전제 2건**에서 났다 |
| 단언 정의 수 | 56 | 56 (`grep -cE '^[[:space:]]*assert_eq '`) |
| Files Changed | 6 (`.err` 2건 포함) | 8 — 아래 표. `70-viewer` PRD 와 `ownership.md` 승계 행 1건이 추가 |
| 롤백 발화 | 설계상 가능 | **1회 실제 발화** — 설계대로 두 파일 + 인가 커밋을 되돌리고 `exit 1` |

## Tasks Completed

| # | Task | Status | Notes |
|---|---|---|---|
| 0 | 서브모듈 초기화 | 완료 | 선행 판정 3조건 전부 참 → `update --init` **건너뜀** (M-c 가 요구한 경로) |
| 0b | 판정문 자체를 반증 | 완료 | 픽스처 20종 서명 일치 · 병합 3시점이 Task 8 표 뒤 3행과 행 단위 일치 |
| 1 | 기준선 실증 3단계 | 완료 | 아래 §Deviations 1 · §Issues 1 참조 |
| 2 | 13 PRD 소유 선언 정정 | 완료 | doc-kit 을 코드펜스에서 삭제 · 위임 표 5행 · `아래 넷` → `아래 다섯` |
| 3 | 우산 PRD 편집 | 완료 | (a) 예외 문단 (b) 분할 맵 10행 (c) 20~60 선행조건 (d) 다이어그램 (e) 개수 2곳 |
| 4 | `ownership.md` 편집 | 완료 | (a) 드리프트 복구 (b) 주 표 10행 (c) 선행조건 (d) 승계 **2행** (e) `9행` 3곳 |
| 5 | §개정 위임 절 신설 | 완료 | 파일 맨 끝 · 6열 7행 · 부트스트랩 2행 M1 종료 시 `완료` 전환 |
| 6 | findings 파일 생성 | 완료 | F-01 드리프트 · F-02·F-03 게이트 범위 회부 |
| 7 | 게이트 통과 확인 | 완료 | `ok ownership 게이트` · 최종 `check PASS` |
| 8 | golden 재동결 | 완료 | 가드 넷 조건식 집행 · 화이트리스트 5키 정확 일치 · 키 목록 불변 |
| 9 | PRD 갱신 | 완료 | OQ#1 닫음 · 답의 출처 정정 2곳 · 회부 장부 정합만 확인(8 ↔ 8 ↔ 8/8) · Status `in-progress` 유지 |

## Validation Results

| Level | Status | Notes |
|---|---|---|
| Static Analysis | PASS | 이 저장소에 별도 type-check/lint 툴체인이 없다. `verify.sh` 의 `lint 전수 게이트` 가 그 자리다 |
| Unit Tests | PASS | `verify.sh` 내장 selftest(추출기 3종 · md 파서) + Task 0b 픽스처 20종 |
| Build | N/A | 산출물이 마크다운·golden 텍스트다 |
| Integration | PASS | `--check --bootstrap` 전 게이트 통과 (exit 0) |
| Edge Cases | PASS | Task 0b 반례 열넷이 각각 지정된 자리에서 어긋남 · 정상 서명 4종(a1·a5·a17·a18) |
| 하네스 집계 | PASS | `assert 실패 0 건` (정의 56 · 런타임 발화 67) |

### Design Grounding

N/A (no design trigger) — `impeccable-detect --mode implement` 가 `design_signal=false` ·
`silent_skip_reason=no-signal`. 렌더링 표면 0. receipt 에 `impeccable_silent_skip=true` 기록.

## Files Changed

| File | Action | Notes |
|---|---|---|
| `.claude/prds/insuniverse-docs-13-relation-contract.prd.md` | UPDATED | 소유 선언 정정 · 위임 표 5행 · OQ#1 · 답의 출처 2곳 |
| `.claude/prds/insuniverse-policy-docs.prd.md` | UPDATED | 제약 #6 예외 · 분할 맵 10행 · 선행조건 5행 · 다이어그램 · 개수 2곳 |
| `docs/_meta/ownership.md` | UPDATED | 주 표 10행 · 드리프트 복구 · 선행조건 5행 · 승계 2행 · §개정 위임 절 |
| `docs/_meta/findings/13-relation-contract.md` | CREATED | 발견 3건 (F-01 처리 결정됨 · F-02·F-03 미판정) |
| `docs/_meta/verify/golden.txt` | UPDATED | `--update --bootstrap` 으로만. 5키 |
| **`.claude/prds/insuniverse-docs-70-viewer.prd.md`** | **UPDATED (계획 밖)** | §Issues 2 |
| `.claude/notes/m1-baseline-check1.err` · `m1-baseline-check2e.err` | CREATED | 기준선 진단. 삭제하지 않는다 |
| `.claude/notes/insuniverse-docs-13-relation-contract-m1-r2.md` | CREATED | Implement-Codex 리뷰 기록 |

커밋 4개: `427e767`(70-viewer 선행 수리) · `ce2f576`(인가) · `a74b643`(본 편집) · 그리고
`c6a0b9e`(롤백 기록 — §Issues 1).

## Deviations from Plan

### 1. 모든 `verify.sh` 호출에 `--bootstrap` 이 붙는다

**WHAT** — 하네스의 `--check` 4곳과 `--update` 1곳 전부 `--check --bootstrap` / `--update --bootstrap`.
Acceptance 의 *"`--check` exit 0"* 도 그 형태로 읽는다.

**WHY** — `run_lint_gate`(verify.sh:2388)가 `run_ownership_gate`(:2402)보다 **앞**에 있고 lint 대상
0건을 거부한다. `docs/` 의 타입 문서는 마일스톤 3~6 이 만들므로 지금은 0건이다. `verify.sh` 헤더
16행이 바로 이 상태를 위해 `--bootstrap` 을 정의해 두었고, `bootstrap_permitted`(:2294)가 현재
허용한다 — *"감시 문서 PRD 4종 전부 DRAFT"*. 우회가 아니라 이 단계의 규정된 호출 형태다.

계획 GROUND 가 이것을 볼 수 없었던 이유는 G5 에 남아 있다 — 그때는 서브모듈 미초기화로 `--check`
가 더 앞에서 죽었다. `plan-conflict-detector` 판정 `conflict:false`.

### 2. §승계 시 추가가 1행이 아니라 2행

**WHAT** — Task 4(d) 는 *"1행만"* 이지만 `docs/_meta/findings/70-viewer.md` 행이 함께 들어갔다.

**WHY** — §Issues 2 의 연쇄다. 검사 2e 는 PRD 코드펜스 선언과 `ownership.md` 를 **양방향**으로
묶으므로, 70-viewer 가 그 절을 갖는 순간 그 행이 필수가 된다. 하네스에 §승계 시 추가 행 수를 세는
단언이 없고 golden 화이트리스트는 키 **이름** 집합만 보므로 56단언 중 어느 것도 깨지지 않았다.
사용자 판단으로 채택.

### 3. 계획을 `completed/` 로 아카이브하지 않았다

**WHY** — 계획 §Acceptance 마지막 항이 *"`mccp-plan-codex` receipt 를 현재 plan 본문에 재앵커"* 를
남은 항목으로 두고 있고, 그 수단은 `/mccp:plan` 재실행뿐이다. 지금 파일을 옮기면 `receipt validate
--plan <경로>` 가 두 receipt 에서 모두 끊긴다. 아카이브는 재앵커 뒤에 한다.

### 4. 마일스톤 Status 는 `in-progress` 로 남긴다

계획 Task 9(e) 그대로. `complete` 전환은 `/mccp:milestone-close` 소관이며, 손으로 찍으면 종료
acceptance 의 receipt 앵커가 빈다.

## Issues Encountered

### 1. 롤백이 실제로 발화했다 (설계대로)

첫 시도에서 §1-3 의 `2e 진단 관측` 이 실패했고 §1-4 의 `auth_rollback` 이 발화해 두 보호 파일과
인가 커밋을 되돌린 뒤 `exit 1` 했다(`c6a0b9e`). **P3 invariant CRITICAL 이 요구한 동작 그대로다** —
복원만 하고 흐름을 잇지 않았다. 실패 원인은 아래 2번이었고, 그것을 고친 뒤 재실행에서 통과했다.
경로 한정 복원(R7 CRITICAL)도 확인됐다 — 이 워킹트리의 다른 미커밋 작업은 그대로 남았다.

### 2. `70-viewer` 가 소유권 게이트를 전수 실패시키고 있었다 (계획 밖)

검사 2e 는 `.claude/prds/insuniverse-docs-*.prd.md` **전수**를 돌며 `## 배타 소유 경로` 절 부재를
하드 실패시킨다(verify.sh:2001-2005). 활성 PRD 8개 중 `70-viewer` 하나만 그 절이 없었다 — 소유
경로 3건을 §Scope 안에 **산문 한 줄**로 선언하고 있었다. 이 브랜치 자신의 커밋 `e352164` 가
docs-viewer worktree 에서 파일을 옮겨 오며 생긴 상태다.

`plan-conflict-detector` 는 `conflict:false` 를 냈으나 M1 종료조건(`--check` exit 0)이 이것에
막히므로 사용자에게 올렸고, **경로를 하나도 바꾸지 않고 선언 형식만 게이트 계약에 맞추는** 안이
선택됐다. 산문 쪽은 새 절을 가리키게 바꿔 정본을 하나로 남겼다. 별도 커밋(`427e767`)으로 분리해
M1 편집과 섞이지 않게 했다.

### 3. `---` 구분선이 열거 필드 본문으로 세어진다

findings 파일의 레코드 사이 `---` 가 `### 상태` 아래 비공백 행으로 계수돼 *"열거 필드인데 비공백
행이 2개"* 로 거부됐다. 구분선을 제거해 해소. `12-index-runtime.md` 미러가 이 함정을 안 보여 준
이유는 그 파일이 형식 전환 유예 명단에 있어 6항목 강제를 안 받기 때문이다.

## Codex Implementation Review

전문은 `.claude/notes/insuniverse-docs-13-relation-contract-m1-r2.md`. 1라운드, MEDIUM 2건, 둘 다
ACCEPT_NOW 로 **실행 산문 제약**에 흡수했다(계획 본문은 고치지 않는다 — 고치면 plan-codex receipt
가 stale 이 되고 재앵커 수단이 `/mccp:plan` 재실행뿐이다).

| Finding | 흡수 |
|---|---|
| 위임 절 도입부 산문이 `부트스트랩 2행` 계수를 오염시킨다 | 도입부에 `ownership.md`·`policy-docs.prd.md` 문자열을 쓰지 않았다 → `PASS 부트스트랩 2행 2` |
| findings 본문의 코드펜스가 레코드로 오계수된다 | 세 레코드 본문 어디에도 행 시작 `## ` 를 만들지 않았다 → `PASS findings 레코드 수 3` |

게이트 verdict 은 `divergent` 로 정직하게 기록됐다(구조화 `needs-attention`). `/mccp:pr` 의 교차
게이트 dedupe 는 이 값에서 fail-closed 된다 — 의도된 상태다.

## Next Steps

- [ ] `/mccp:plan .claude/plans/insuniverse-docs-13-relation-contract-m1-r2.plan.md` — `mccp-plan-codex`
      receipt 재앵커 (계획 §Acceptance 마지막 항. 이것만 남았다)
- [ ] `/mccp:milestone-close` — 마일스톤 1 을 `complete` 로. Status 를 손으로 찍지 않는다
- [ ] `/mccp:pr` — 단, implement receipt 의 `codex_verdict: divergent` 가 먼저 판정돼야 한다
- [ ] `11-index-code` 병합 시 통합 트리에서 `--update --bootstrap` → `--check --bootstrap` 재실행
      (계획 Task 8 병합 절. golden 을 텍스트로 병합하지 않는다)
