# 13 · 선행 PRD 분리 — 범위 · 소유권 벽 · PRD/plan 판정 (2026-08-11)

> **성격**: 실행 설계. 규약이 아니다. 어떤 산출물도 이 문서가 직접 고치지 않는다.
> **질문**: *"archived PRD 를 복원하지 않고 선행 작업을 따로 빼려면 무엇을 어디까지 만들어야 하는가.
> PRD 로 갈 것인가 plan 으로 갈 것인가."*
> **선행**: `12-flow-centric-restructure.md` — 개선 항목 A~K 의 정의는 그쪽. **이 문서는 그것을
> 병합 후 현실에 맞춰 재배치한다.**
> **입력**: `origin/main` `6d177fa` 실사 · `docs/_meta/ownership.md` · `docs/_meta/verify/verify.sh`
> `run_ownership_gate` 실측 · 우산 PRD §PRD 분할 맵.
> **기준점**: `origin/main` `6d177fa` · `docs/` 정책 문서 본문 **여전히 0건**.

---

## 0. 결론 요약

| # | 판정 | 근거 |
|---|---|---|
| 1 | **새 PRD 로 뺀다** — archived 복원 금지 | 복원은 drift status 정정 · receipt 재앵커 · archive 되돌리기를 동반한다. 게다가 이건 잔여 작업이 아니라 **새 요구에서 파생된 신규 범위**다 |
| 2 | **소유권 벽이 실재한다** | `run_ownership_gate` 검사 2c 가 우산 9행과 겹치는 소유 선언을 **무조건 거부**한다. 새 PRD 는 `docs/00-index.md`·`template-config.yaml` 을 소유할 수 **없다** |
| 3 | **경로가 3분류로 갈린다** | 자유(우산 표 밖) / 위임(00-protocol 소유) / 불가(하류 활성 PRD 소유). §3 |
| 4 | **위임 규약 1줄이 벽을 넘는다** | 게이트는 *표 정합*을 보지 "archived PRD 경로를 남이 쓰는가" 를 보지 않는다. 막는 것은 우산 **제약 #6**(사람 규약)이며, 우산은 활성이라 예외 조항을 넣을 수 있다 |
| 5 | **PRD 로 간다** | receipt 가 PRD 슬러그에 앵커된다. plan 만 만들면 `/mccp:plan` 이 대상 PRD 를 요구하고, archived 를 지목하는 순간 그게 곧 복원이다 |
| 6 | **golden 갱신은 절반만 필요** | 절 **추가**는 sha 불변(C·위임 규약). 트리 **개정**은 필수(H) |

---

## 1. 상태 실사 (`origin/main` `6d177fa`)

### 1-1. 병합 완료 · 아카이브 완료

| PRD | 상태 |
|---|---|
| `doc-template-kit` | **archived** |
| `insuniverse-docs-00-protocol` | **archived** |
| `insuniverse-docs-10-index-git` | **archived** |
| `insuniverse-docs-12-index-runtime` | **archived** |
| `insuniverse-docs-11-index-code` | 활성 (진행 중) |
| `20` · `30` · `40` · `50` · `60` · 우산 | 활성 (DRAFT) |
| `70-viewer` | **origin/main 에 없다** — `docs-viewer` worktree 에만 존재 |

`docs/` 추적 파일 60건 = `00-index.md` 1 + `_meta/**` 59. **정책 문서 본문은 여전히 0건이다.**

`12-flow-centric-restructure.md` §6 의 *"M5~M7 미병합이라 지금이 가장 싸다"* 는 **만료됐다.**
셋 다 병합됐다. 다만 **문서 본문 0건**이라는 더 중요한 조건은 그대로다 —
재작성 대상이 없다는 점에서 여전히 저비용 구간이다.

### 1-2. 복원의 실제 비용

archived PRD 를 되살리면 붙는 것:

| 항목 | 비용 |
|---|---|
| `archived/` → `prds/` 이동 | `/mccp:archive-complete` 가 세운 drift status 를 되돌린다 |
| 마일스톤 status | 전 마일스톤 complete 인 PRD 에 M8 을 붙이면 "완료 판정" 이 거짓이 된다 |
| receipt 체인 | `mccp-plan-codex/insuniverse-docs-00-protocol*.json` 이 이미 수렴 기록. 같은 slug 로 재진입하면 stale 또는 재앵커 필요 |
| 리포트 | `PRPs/reports/*-m7-report.md` 가 종료를 선언한 상태 |

그리고 **개념적으로도 복원이 아니다.** `00-protocol` 의 종료조건(manifest 2회 편차 0 + 온보딩 질문
승인)은 충족됐다. 지금 필요한 것은 그 산출물의 **개정**이고, 개정은 원 PRD 재개가 아니라 새 작업이다.

> `40-runtime-vendor-legal` 이 *"구 PRD 마일스톤 5 한 줄을 독립 PRD 로 승격"* 한 선례가 있고,
> `doc-template-kit` 이 *"`00-protocol` 마일스톤 4를 이관받아 선행 자산이 된"* 선례가 있다.
> **범위를 새 PRD 로 빼는 것은 이 프로젝트의 확립된 패턴이다.**

---

## 2. 소유권 벽 — `run_ownership_gate` 실측

`docs/_meta/verify/verify.sh` (2,826행)의 검사 구조:

| 검사 | 내용 | 새 PRD 에 대한 함의 |
|---|---|---|
| **1** | `ownership.md` §PRD별 배타 소유 경로 == 우산 §PRD 분할 맵, **행 단위 `diff`** (선행조건·경로·종료조건 결속) | 행을 추가하려면 **두 파일에 같은 행을 같은 순서로** 넣어야 한다 |
| **2** | 초과분(표 + §승계 시 추가) − 우산 pairs == 선언과 정확히 일치 | 선언 없는 초과는 실패 |
| **2b** | 각 선언의 **근거 PRD 파일 실재 + 그 PRD §배타 소유 경로에 첫 토큰 정확 일치 + 범위 한정 일치** | `prd_path` 가 **`archived/` 도 찾는다** — archived 근거는 통과한다 |
| **2c** | **우산 9행과 겹치면 무조건 거부** (우산 행은 한정 없음 = 전부 `전체`) | **`docs/00-index.md`·`template-config.yaml` 선언은 여기서 죽는다** |
| 2c-2 | 추가 행끼리도 상호 대조. 상하위 겹침은 상위의 범위 한정을 읽는다 | 하위 카브아웃은 상위가 한정을 가질 때만 가능 |

### 2-1. 게이트가 **보지 않는** 것

이것이 해법의 자리다.

- **"archived PRD 의 소유 경로를 다른 주체가 쓰는가"** — 검사하지 않는다. 게이트는 *표 정합*만 본다.
- **"소유자 PRD 가 활성인가"** — 검사하지 않는다. 2b 는 `archived/` 를 포함해 파일을 찾는다.
- **`ownership.md` 의 새 절** — `## PRD별 배타 소유 경로` · `## 승계 시 추가` · `## 공유 자산 충돌 방지
  프로토콜` · `### 승격 대상 목록` 네 절만 추출·해시한다. **다른 절을 추가해도 sha 가 안 바뀐다.**

따라서 실제로 막는 것은 게이트가 아니라 **우산 제약 #6** — *"자기 PRD의 배타 소유 경로 밖을 쓰지
않는다. 병렬 worktree 충돌 방지의 유일한 장치."* 그리고 그 제약의 목적(동시 쓰기 충돌 방지)은
**archived PRD 에 대해서는 이미 무의미하다.** 아무도 그 worktree 에서 쓰지 않는다.

---

## 3. 경로 3분류

새 PRD 가 건드려야 하는 경로를 소유 상태로 갈랐다.

### A. 자유 — 우산 표 밖, 소유 선언 없음

| 경로 | 현 소유 | 근거 |
|---|---|---|
| `.claude/templates/doc-kit/**` | `doc-template-kit`(archived) | **우산 §PRD 분할 맵에 없다** — 그 PRD 는 우산의 자식이 아니라 선행 자산이다 |
| `.claude/meta/05-final-spec.md` | 명시 소유자 없음 | 규약 정본. 우산 표·ownership 어디에도 행이 없다 |
| `.claude/prds/<새 PRD>.prd.md` | — | 신설 |

**2c 가 걸리지 않는다.** 새 PRD 가 `## 배타 소유 경로` 에 선언하고 `ownership.md` §승계 시 추가에
행을 넣으면 검사 2b·2c 를 통과한다.

### B. 위임 — 00-protocol(archived) 소유. 게이트가 이관을 거부한다

| 경로 | 필요한 개정 |
|---|---|
| `docs/_meta/template-config.yaml` | `statuses` 매핑 승격 (B) |
| `docs/00-index.md` | `## 흐름으로 읽기` 절 (C) · 문서 트리 +2행 (H) |
| `docs/_meta/onboarding-questions.yaml` | `ia_doc_consumed` 재판정 (G) |
| `docs/_meta/verify/golden.txt` · `verify.sh` | 게이트 갱신 + `--update` (B·G·H) |

이 넷을 새 PRD 로 **이관할 수 없다** — 우산 9행의 `00-protocol` 행과 정확히 같은 경로이고
2c 가 무조건 거부한다. 이관하려면 우산 §분할 맵의 `00-protocol` 행에서 경로를 빼야 하는데,
그러면 archived PRD 본문(§배타 소유 경로)과 우산이 어긋난다.

> **이관하지 않고 위임한다.** §4 참조.

### C. 불가 — 활성 하류 PRD 소유. 손대지 않는다

| 경로 | 소유 | 이 PRD 는 |
|---|---|---|
| `docs/20-site/**` · `docs/30-admin/**` | `50-domain` | **회부만.** IA 2건 수용은 그 PRD 가 한다 |
| `docs/01-foundation/**` 등 | `20`~`60` | 무관 |
| `70-viewer` PRD 본문 | 그 PRD | **회부만.** 계약 요청 #6·#7 은 뷰어가 자기 파일에 쓴다 |

---

## 4. 위임 규약 설계

**필요한 것은 세 줄이다.**

### 4-1. 우산 PRD 제약 #6 에 예외 조항

우산은 활성이므로 편집 가능하다. 제약 #7 이 `doc-template-kit` M6 의 상류 정정으로 신설된 선례가 있다.

```
6. 자기 PRD의 배타 소유 경로 밖을 쓰지 않는다. 병렬 worktree 충돌 방지의 유일한 장치.

   예외 — archived PRD 의 소유 경로 개정 (2026-08-11 신설)
   PRD 가 archived 된 뒤 그 소유 경로에 개정이 필요하면, 원 PRD 를 복원하지 않고
   위임 PRD 가 수행한다. 위임은 `docs/_meta/ownership.md` §개정 위임에 행으로 남긴다.
   동시 쓰기 위험은 archived PRD 에 대해 성립하지 않는다 — 그 worktree 는 종료됐다.
   위임받은 경로의 소유자는 바뀌지 않는다. 개정 권한만 이동한다.
```

**소유가 아니라 개정 권한만 옮긴다**는 것이 요점이다. 그래서 검사 1·2c 가 건드려지지 않는다.

### 4-2. `ownership.md` 에 `## 개정 위임` 절 신설

게이트가 추출·해시하는 네 절이 아니므로 **`ownership.paths_sha256` 등 golden 값이 불변**이다.

| 원 소유자 | 경로 | 위임받은 PRD | 개정 사유 | 상태 |
|---|---|---|---|---|
| `00-protocol`(archived) | `docs/_meta/template-config.yaml` | `<새 PRD>` | `statuses` 매핑 승격 | 진행 |
| `00-protocol`(archived) | `docs/00-index.md` | `<새 PRD>` | 흐름 진입 절 · 트리 +2행 | 진행 |
| `00-protocol`(archived) | `docs/_meta/onboarding-questions.yaml` | `<새 PRD>` | `ia_doc_consumed` 재판정 | 진행 |
| `00-protocol`(archived) | `docs/_meta/verify/**` | `<새 PRD>` | 게이트 갱신 + golden | 진행 |
| `doc-template-kit`(archived) | `.claude/templates/doc-kit/**` | `<새 PRD>` | flow-exits · ia-exits 규칙 | 진행 |

### 4-3. 게이트 검사 추가 여부 — **하지 않는다**

`## 개정 위임` 절을 게이트가 검사하게 만들 수 있다(행의 원 소유자가 실제로 archived 인지 등).
**지금은 만들지 않는다.** 위임 행이 5개이고 archived PRD 가 4개인 규모에서 게이트를 하나 더
만드는 것은 `doc-template-kit` M7 이 되돌린 판단(문서 5건을 위한 형식 신설)과 같은 부류다.
위임이 10건을 넘거나 위임받은 PRD 가 둘 이상이 되면 그때 만든다.

<!-- ponytail: 위임 표는 사람 규약. 위임 PRD 가 둘 이상이 되면 게이트로 승격한다. -->

---

## 5. 새 PRD 범위

### 5-1. 이름과 자리

```
insuniverse-docs-13-relation-contract.prd.md
```

- **13** — `00`(프로토콜) · `10`·`11`·`12`(인덱스) 다음, `20`~`60`(문서) 앞. 실제 실행 순서와 같다
- `05-` 로 하지 않는 이유: `05-final-spec.md` 와 혼동되고, 번호가 인덱스 축 앞이라
  "인덱스보다 먼저" 로 오독된다. 인덱스는 이미 끝났다
- **우산의 자식이다** — `20`~`60` 의 선행조건이 되므로 분할 맵 안에 자리가 있어야 한다

### 5-2. 담는 것 / 담지 않는 것

| # | 항목 | 담나 | 사유 |
|---|---|---|---|
| G | `ia_doc_consumed` 재판정 | **담는다** | 사용자 결정. H·I·J 가 전부 여기 종속 |
| A | flow `실패·이탈` 표 계약 + lint `flow-exits` | **담는다** | doc-kit 자유 경로 |
| I | `surfaces[].exits` 계약 + lint `ia-exits` | **담는다** | 동. G 확정 후 |
| B | `statuses` 매핑 승격 + lint config 파서 | **담는다** | 위임 경로 |
| H | 문서 트리 +2행 (`05-final-spec` §4 → `00-index` → golden) | **담는다** | 자유 + 위임 |
| C | `00-index` `## 흐름으로 읽기` 절 | **담는다** | 위임 경로 |
| — | 우산 제약 #6 예외 + 지표 #4 | **담는다** | 우산 편집. 상류 정정 선례 |
| D | `50-domain` 마일스톤 역전 | **회부** | 그 PRD 소유 |
| J | `50-domain` IA 2건 수용 | **회부** | 동 |
| E | `70-viewer` 표면·계약 갱신 | **회부** | 그 PRD 소유. origin/main 에 없다 |
| F | 우산 지표 #4 | 담는다 (위 참조) | — |
| K | `20`·`30`·`40`·`60` | 수정 없음 | — |

**회부 3건은 이 PRD 의 산출물이 아니다.** `12-index-runtime` 이 `.gitattributes` 를 `00-protocol` 에
회부하고 그쪽이 수용한 선례를 따른다 — 회부 문구를 자기 소유 파일(`findings/13-relation-contract.md`
또는 PRD 본문 §회부)에 적고, 수용은 대상 PRD 가 착수할 때 한다.

### 5-3. 배타 소유 경로 (선언안)

```
.claude/templates/doc-kit/**          ← doc-template-kit(archived) 에서 위임
.claude/meta/05-final-spec.md         ← 무소유. 이 PRD 가 최초 선언
docs/_meta/findings/13-relation-contract.md
```

`docs/_meta/template-config.yaml` · `docs/00-index.md` · `docs/_meta/onboarding-questions.yaml` ·
`docs/_meta/verify/**` 는 **소유 선언에 넣지 않는다** — §개정 위임으로 처리한다.
소유로 선언하면 검사 2c 가 즉시 거부한다.

### 5-4. 마일스톤안

| # | 마일스톤 | 종료조건 |
|---|---|---|
| 1 | **위임 규약 확립** — 우산 제약 #6 예외 · `ownership.md` §개정 위임 · 새 PRD 를 우산 분할 맵에 추가 | `verify.sh --check` exit 0 (검사 1 이 우산↔ownership 10행 정합을 확인) |
| 2 | **`ia_doc_consumed` 재판정** — 판정 입력을 소비자 2종으로. 게이트 로직 갱신 | 판정문에 근거 2줄 · 게이트가 `true` 를 받아들임 |
| 3 | **관계 계약 2종** — `flow-exits` · `ia-exits` lint 규칙 + fixture + 예시 갱신 | `lint-docs.mjs --selftest` 양방향 통과. 규칙 15 → 17 |
| 4 | **`statuses` 매핑 승격** — config + lint config 파서 + `placement` 검사 | 부록 격리 대상이 본문 절에 있으면 lint 위반. 예시로 양방향 검증 |
| 5 | **문서 트리 개정** — `05-final-spec` §4 +2행 → `00-index` 재생성 → `verify.sh --update` | `entry_count` 53 · `doc_count` 52 · 3단계 경로 준수 |
| 6 | **흐름 진입 절 + 회부** — `00-index` `## 흐름으로 읽기` · `50-domain`·`70-viewer` 회부 기록 | 회부 3건이 대상 PRD 가 읽을 수 있는 자리에 있음 |

**1 이 먼저다.** 위임 규약 없이 2~6 을 하면 전부 제약 #6 위반이다.

---

## 6. PRD 인가 plan 인가 — 판정

### 6-1. plan 단독이 성립하지 않는 이유

| 근거 | 내용 |
|---|---|
| **receipt 앵커** | `mccp-plan-codex/<decision_id>.json` 의 `decision_id` 가 PRD 슬러그다. plan 만 만들면 대상 PRD 가 필요하고, **archived 를 지목하는 순간 그것이 곧 복원이다** |
| **사용자 결정 포함** | 마일스톤 2(`ia_doc_consumed` 재판정)는 사용자 판단이다. `/mccp:plan-prd` 의 co-creation 단계가 그 자리이며, `/mccp:plan` 은 그 층이 없다 |
| **층이 다르다** | 위임 규약 신설 · 판정 입력 재설계 · 지표 신설은 *"무엇이 참이어야 하는가"* 다. plan 은 *"어떤 파일을 어떤 순서로"* 다 |
| **종료조건이 측정 대상** | 뷰어 3단이 데이터로 성립하는지를 판정해야 한다. Success Metrics 표가 필요하다 |
| **선행조건 선언** | `20`~`60` 이 이 작업을 선행조건으로 걸어야 한다. PRD 만이 분할 맵에 행을 가질 수 있다 |

### 6-2. PRD 를 과설계로 만들지 않는 선

- **PRD 1개.** 형식 계약(A·I·B)과 트리·판정(G·H·C)을 쪼개지 않는다 — 순차 의존이라 병렬 이득이
  0 이고, 쪼개면 배타 소유 경로만 두 배로 는다
- **마일스톤 6개.** `00-protocol`(7) · `doc-template-kit`(7) 과 같은 규모
- **회부 3건은 PRD 로 만들지 않는다.** 대상 PRD 가 이미 존재한다

### 6-3. 결정

> **`/mccp:plan-prd` 로 `insuniverse-docs-13-relation-contract.prd.md` 를 만든다.**
> 그 뒤 `/mccp:plan` 이 마일스톤 단위로 붙는다.

`/mccp:plan-prd` 는 receipt 를 쓰지 않으므로(PRD 단계는 receipt 없음) 기존 체인을 건드리지 않는다.
receipt 는 `/mccp:plan` 부터 새 슬러그로 시작한다 — **archived 체인과 완전히 분리된다.**

---

## 7. 남는 문제

| # | 문제 | 성격 |
|---|---|---|
| Q1 | **`70-viewer` 가 `origin/main` 에 없다** | `docs-viewer` worktree 에만 존재. 회부를 받을 파일이 병합돼야 한다. 병합 시점이 미정 |
| Q2 | **`11-index-code` 가 진행 중** | 유일한 활성 인덱스 PRD. 13 이 `docs/_meta/verify/**` 를 위임받아 고치면 그 worktree 와 겹칠 수 있다 — `verify/` 는 추출기 카브아웃으로 이미 다중 주체 경로다 |
| Q3 | **게이트 갱신이 santa 재수렴을 부를 수 있다** | `verify.sh` 는 selftest 를 가진 2,826행이다. 검사 추가·수정은 fixture 를 동반한다 |
| Q4 | **IA 2건의 적정 규모 미측정** | site 26 features / admin 라우트 282 에서 "흐름이 지나는 화면 + 이탈 대상" 이 몇 건인지는 흐름 문서를 써 봐야 안다 |
| Q5 | **위임 규약이 게이트로 강제되지 않는다** | 의도된 선택(§4-3). 위임 PRD 가 둘 이상이 되면 승격 필요 |

**Q2 가 실제 충돌 위험이다.** `11-index-code` 가 `docs/_meta/verify/build-code-index.mjs` 계열을
쓰고 있고, 13 은 `verify.sh` 본체(게이트)를 건드린다. 같은 디렉터리다.
**착수 전 `11-index-code` 종료를 기다리거나, `verify.sh` 개정을 마일스톤 5 로 미뤄 순서로 회피한다.**

---

## 8. 이 분석의 한계

- **`run_ownership_gate` 를 전수 읽지 않았다.** 검사 1·2·2b·2c·2c-2 의 주석과 코드 일부를 읽었고,
  그 뒤 검사(2d·2e 등)는 확인하지 않았다. 새 절 추가가 정말 무해한지는 `--check` 로 실증해야 한다.
- **`ownership.md` 의 golden 항목 4종이 새 절에 영향받지 않는다는 것은 추출 범위 인자로 판단했다.**
  실행 검증은 하지 않았다.
- **우산 §PRD 분할 맵에 10번째 행을 넣었을 때 검사 1 이 통과하는지 실증하지 않았다.**
  코드상 `diff` 는 두 파일 비교이므로 양쪽에 같은 행을 넣으면 통과해야 하나, `ow_rows` 의 정규화
  방식(파일명 추출 등)에 따라 달라질 수 있다. **마일스톤 1 의 첫 작업이 이 실증이어야 한다.**
- **`70-viewer` 병합 상태를 사용자에게 확인하지 않았다.** Q1 이 열린 이유다.
- 세션 중 `.claude/plans/insuniverse-docs-12-index-runtime*.plan.md` 2건이 사라졌다(세션 초 존재).
  병렬 세션의 조작으로 보이나 확인하지 않았다.
