# insuniverse 정책 정본 문서화 (우산 PRD)

> **이 문서는 우산(umbrella) PRD다.** 실행 단위는 아래 §PRD 분할 맵의 10개 자식 PRD이며, 각각 별도 git worktree에서 진행한다.
> 문제·사용자·가설·범위는 여기서 단 한 번 정의하고, 자식 PRD는 이것을 상속한다.
> 추출 규약·소스 등급·status 모델의 정본은 `.claude/meta/05-final-spec.md` (3라운드 적대적 검증 완료).
> 2026-08-03 3-agent 재검증(비판적 / 긍정적 / santa-loop[Opus+Codex])으로 8개 결함 정정. §부록 참조.

## Problem

insuniverse는 2년간 3개 저장소(`insuniverse-server`, `insuniverse-site`, `insuniverse-admin`)로 운영된 단일 서비스이나, 정책이 문서로 존재하지 않는다. 규칙·제약·판단 근거는 guard·상수·DB 스키마·한글 주석·커밋 제목에 파편화되어 있고, 그 중 어떤 것이 현재 유효한지 코드만으로는 판정할 수 없다.

곧 신입이 합류하지만 인수인계에 쓸 자료가 한 건도 없다. 이 상태로 온보딩하면 신입은 (a) 정책을 매번 코드에서 재발굴하고, (b) 이미 폐기된 규칙을 살아있는 것으로 학습하며, (c) "왜 이렇게 되어 있는가"에 답을 얻지 못한다. 유지보수자 본인도 같은 재발굴을 반복하고 있다.

## Evidence

- **인수인계 자료 부재 (관찰된 사실)** — 2년차 프로젝트, 신입 채용 임박, 넘겨줄 문서 0건. `docs/` 실측 파일 수 0.
- **정책 문서 자체가 없음** — ~~유일하게 정책 성격이던 `planning/` 은 사용자가 의도적으로 삭제(admin 34파일 / site 8파일). 참조 금지 대상.~~
  > **2026-08-11 사실 정정.** 삭제되지 않았다. 34·8 은 **HEAD 추적 파일 수**이며 양쪽 저장소(stg)
  > working tree clean, 삭제 커밋 없다. 그 안에 `admin/planning/서비스정책_사용자.md`(310행) ·
  > `서비스정책_관리자.md`(278행) 가 있다. 등급은 X → **L(legacy 참고)** 로 재판정됐다
  > (`05-final-spec.md` §6-4, 사용자 확정). **"정책 문서가 없다"는 Problem 의 전제는 여전히 유효하다**
  > — L 은 값 인용이 금지된 legacy 이고 신선도가 검증되지 않았으므로 정본이 아니다. 다만
  > **"참조할 것이 0건"이라는 서술은 과장이었다.** 근거: `.claude/meta/07~09`.
- **커밋이 근거가 되지 못함** — 본문 보유 커밋 349 / 118 / 152 (전체 6,190 중 약 10%). 나머지는 제목 한 줄. 태그 0개.
- **현행 여부를 코드만으로 판정 불가** — 정책성 env 게이트 11종이 기본 off 또는 값-의존(`ADMIN_VIEW_TOKEN_ENFORCE`, `RATE_LIMIT_CERTIFY_PER_MIN` 등). 11종 전부 코드 존재 실측 확인(2026-08-03). `prod`↔`stg` 가 양방향 발산(49↔61 / 18↔28 / 24↔53) — HEAD가 곧 운영 정책이 아니다.
- **정책이 실제로 3계층을 관통함** — `ANS001` 등 상태코드 59종이 server 발행 → site·admin 소비로 확인됨. 한 저장소만 봐서는 정책이 완성되지 않는다.
- **같은 대상을 재조사하면 수치가 달라짐** — 커밋 본문 351↔349, 한글 주석 9,462↔11,952, site 테스트 16↔0, **`@Roles` 136↔137**(2026-08-03 재측정). 규약이 고정되지 않은 직접 증거. 근거: `.claude/meta/04-round3-adjudication.md`.
- *Assumption — 온보딩 실패의 구체 지점(신입이 어디서 막히는지)은 아직 관측되지 않음. 첫 온보딩 시 실증 필요.*

## Users

- **Primary — 신규 합류 개발자**: 인수인계를 받아 특정 서비스를 맡게 되는 사람. 선행 개념(용어·actor·권한) 없이 도메인 코드를 읽어야 하는 상황이 트리거.
- **Primary — 유지보수자 본인**: 몇 달 전 자신의 결정을 되짚어야 할 때. 정책 정본과 "왜"의 소재를 찾는 것이 트리거.
- **Secondary — AI 코딩 에이전트**: 작업 전 정책 컨텍스트를 로드. 문서가 기계 파싱 가능한 앵커·상태값을 가져야 한다는 제약을 만든다.
- **Secondary — 기획·운영 담당자**: 코드 심볼이 아니라 "어떤 조건에서 무엇이 막히는가" 수준의 서술을 필요로 함.
- **Not for**: 외부 공개 대상 독자, 영어권 독자, 감사·규제 기관 제출.

## Hypothesis

We believe **현행 유효성이 판정된 정책만을 담고, 기획 관점과 개발 관점을 한 문서 안 두 절로 분리해 서술하며, 각 정책이 코드 앵커와 변경 연혁으로 역추적되는 단일 정책 정본**이
**신입 온보딩 시 정책 재발굴·폐기 정책 오학습·변경 이유 소실 문제를 해소**할 것이라 믿는다.

We'll know we're right when **`docs/_meta/onboarding-questions.yaml`에 사전 고정된 질문 집합을 문서만으로 답변할 수 있고, 담당자(유지보수자)가 정책 후보 단위 리뷰에서 표기한 "사실과 다름/빠짐" 건수가 2라운드 연속 0으로 수렴할 때**.

## 핵심 제약 (전 자식 PRD 공통, 위반 시 산출물 거부)

1. **기획 서술과 개발 서술을 한 문서 안 두 절로 분리한다.** `## 정책 (기획)` = 어떤 조건에서 사용자에게 무엇이 일어나는가. `## 강제 지점 (개발)` = 어느 코드가 그것을 강제하는가. 섞지 않는다. **(2026-08-03 확정 — 더 이상 Open Question 아님)** **형식 정본은 `.claude/templates/doc-kit/` 이다** (2026-08-04 분리 · 산출 완료 — `policy-doc.template.md` · `ia-doc.template.md` · `lint-docs.mjs`). `05-final-spec.md` §4 공통형식 블록은 참고로 강등.
   **문서 타입은 3종이다** (2026-08-05 결정 · **같은 날 산출 완료**): `policy-doc@1`(규칙) · `ia-doc@1`(화면 구조) · **`flow-doc@1`(절차·권한 매뉴얼 — `flow-doc.template.md` · `examples/flow-example.md`, `doc-template-kit` M7 complete)**. 절차 서술은 `50-domain` 의 흐름·콘솔 문서 10개가 단독 소유하며 다른 PRD 는 링크만 한다.
   **단 `ia-doc@1` 은 현재 소비 문서가 0건이다** (2026-08-05 확인 — `05-final-spec.md` §4 docs 트리 50문서 중 IA 없음). 형식은 산출됐으나 insuniverse 에서 쓸지는 미정이며, 판정은 `00-protocol` 마일스톤 6 의 `onboarding-questions.yaml` 확정이 한다. **flow 의 화면 참조는 그때까지 선택이다** — 없는 IA 문서를 가리켜 `--strict-refs` 를 깨뜨리지 않는다 (`50-domain` §반드시 지킬 것).

2. **현행 유효성이 판정되지 않은 정책은 본문에 넣지 않는다.** 판정 기준은 `.claude/meta/05-final-spec.md` §3 status 모델.
3. **정책은 단독 근거로 선언하지 않는다.** 최소 2개 이상의 서로 다른 증거원이 일치해야 한다. 주석 단독·커밋 제목 단독 금지.
4. **역추적 가능해야 한다.** 각 정책은 코드 앵커와 변경 연혁(언제·왜 바뀌었나)을 함께 갖는다.
5. **모든 수치는 `docs/_meta/extraction-manifest.yaml` 을 통해서만 산출한다.** 자체 grep으로 센 숫자를 문서에 쓰지 않는다.
6. **자기 PRD의 배타 소유 경로 밖을 쓰지 않는다.** 병렬 worktree 충돌 방지의 유일한 장치.

   **예외 — archived PRD 의 소유 경로 개정 (2026-08-11 신설)** — archived PRD 가 소유한 경로는
   그 PRD 를 복원하지 않고 다른 PRD 가 개정할 수 있다. **소유는 옮기지 않는다. 개정 권한만
   옮긴다** — 소유자 기록(아래 §PRD 분할 맵과 `docs/_meta/ownership.md` 의 두 소유 표)은 그대로
   두고, 위임 행은 `docs/_meta/ownership.md` §개정 위임에만 적는다. 소유 표에 넣으면 그 순간
   위임이 소유가 된다.
   신설 사유는 이 제약의 목적이다 — #6 이 막는 것은 **병렬 worktree 의 동시 쓰기**인데,
   archived PRD 에는 착수 중인 worktree 가 없으므로 그 위험이 성립하지 않는다. 반면 archived
   경로를 영구 동결하면 상류 규약을 세우는 후속 PRD 가 자기 전제를 고칠 수 없다.
   **예외는 archived 소유자에게만 열린다.** 활성 PRD 의 소유 경로는 여전히 #6 그대로다 —
   활성까지 넓히면 동시 쓰기 방지라는 이 제약의 목적 자체가 사라진다.
7. **산출물 Markdown 은 lint 를 통과해야 한다.** (2026-08-04 신설 · 2026-08-05 `--strict-refs` 추가)

   | 시점 | 명령 |
   |---|---|
   | 문서 작성 직후 (자체 실행) | `node .claude/templates/doc-kit/lint-docs.mjs <자기 소유 경로의 .md 전부>` |
   | **산출물 제출 전** | `node .claude/templates/doc-kit/lint-docs.mjs --strict-refs <자기 소유 경로의 .md 전부>` |

   **양쪽 다** 실행하며 어느 쪽이든 exit 0 이 아니면 제출하지 않는다.
   `--strict-refs` 는 `flow-doc@1` 의 미해결 문서 참조를 위반으로 승격시킨다 — 작성 중에는 관용하되
   제출 시점에는 통과시키지 않는다. **이 저장소에 CI 가 없으므로 이 제약이 유일한 강제 수단이다.**
   별도 worktree 의 에이전트는 서로의 산출물을 볼 수 없으므로 lint 가 유일한 형식 조율 수단이다.
   형식 정본은 `.claude/templates/doc-kit/`.

   **자율 실행을 보완하는 전수 게이트** (2026-08-05 신설) — 제약 #7 은 작성 주체가 실행하지 않으면
   아무것도 실패하지 않는다. `00-protocol` 의 `docs/_meta/verify/` 스크립트가 위 명령을 **전 문서에
   주기 실행**한다. 새 hook·새 CI 를 만들지 않는다 (`00-protocol` §lint 전수 게이트).

   **예외 — `docs/90-history/**` · `docs/99-deprecated/**` · `docs/00-service-overview.md` 는 lint 대상이 아니다.** (2026-08-05 확정 · 2026-08-11 개요 문서 추가)
   연대기·에픽 서사·발산 현황·폐기 목록은 3종 타입 어디에도 속하지 않는다. `policy-doc@1` 을 씌우면
   `## 정책 (기획)` 에 연대기를 쓰게 되어 `doc-template-kit` 최상위 Risk("절을 형식만 채우고 내용
   공허", 확률 높음 / 영향 매우 높음)가 그대로 발동한다. **4번째 템플릿 타입도 만들지 않는다** —
   문서 5건을 위한 형식 신설은 M7 이 되돌린 판단의 반복이다. 이 문서군은 프론트매터 `template:` 을
   넣지 않고, 형식 대신 `60-history-deprecated` 자체 지표(폐기 판정율 100% · SHA 병기)가 품질을 본다.

## Scope

**MVP** — `00-protocol` → (`10/11/12-index` 병렬) → `20-foundation-access`.
온보딩자가 도메인 문서를 읽기 전에 반드시 알아야 하는 선행 개념 전부(용어·식별자·오류코드)와, 실무에서 가장 자주 묻는 권한 판정까지.

**Out of scope**

- **코드 수정·리팩터링** — 문서화 중 발견한 버그·불일치(`CANCELED`/`CANCELLED` 철자 혼재 등)는 `docs/_meta/findings/<prd-id>.md` 에 기록만 하고 고치지 않는다.
- **영문화·외부 공개용 가공** — 내부 한국어 문서만.
- **운영 `.env` 실제값 확보** — 사용자 확정(2026-08-03): **현재 제공 불가**. 정책 게이트 11종은 전부 `conditional-unknown` 으로 `04-limits/04-feature-gates.md` 부록 격리. 값을 쫓지 않는다.
- **권한 DB 스냅샷 확보** — 사용자 확정(`05-final-spec.md` §6-2): **미제공 확정**. `tn_auth`/`tn_menu`/`tn_menu_auth_map` 은 구조·연결관계만 서술하고 실제 배분은 `data-dependent-unknown`. *(구 PRD의 "out-of-scope로 지정되지 않았다"는 서술은 정정됨)*
  > **2026-08-05 범위 정정 — 미확보는 `tn_menu_auth_map` 배분뿐이다.** 실측 결과 메뉴 권한 모델은
  > actor 마다 다르며, 셋 중 **둘은 코드에 하드코딩되어 있어 DB 없이 100% 확정된다**(sales 14코드 ·
  > corp 5코드). DB 조회는 **admin actor 전용**이다. 또한 메뉴 권한은 사이드바 렌더링과 로그인 직후
  > 진입 화면만 정하고 **서버 API 를 막지 않는다**. 근거·수치는 `.claude/meta/06-access-model-findings.md`.
  > 따라서 `data-dependent-unknown` 은 **admin 권한 그룹별 배분에만** 부여한다 — 메뉴 권한 전반에
  > 일괄 부여하면 확정 가능한 사실을 unknown 으로 잘못 강등하게 된다.
- **`planning/` 을 정본·근거로 쓰는 것** — 2026-08-11 재판정으로 **열람은 허용**된다(등급 L).
  다만 **값 인용 금지 · 본문 인용 금지**이며, 용어 존재 확인 · 분류 축 판단 ·
  `onboarding-questions.yaml` 초안 입력에만 쓴다. 값은 전부 코드에서 재확인한다. 규격은
  `05-final-spec.md` §6-4. **자동 추출 제외(`exclude_pathspec`/`exclude_glob`)는 그대로 유지**된다.
- **모바일 네이티브 축** — FCM 푸시 + 웹뷰만 존재. 각 문서의 `## 플랫폼 차이` 절로 처리.

### stg/prod 판정 규칙 (구 PRD 모순 정정)

구 PRD는 "stg 게이트 on/off 목록만 받으면 본문 승격"이라 썼으나, 같은 문서의 Evidence(prod↔stg 양방향 발산)와 충돌한다. **정정 확정**:

| 확보 자료 | 부여 status | 문서 처리 |
|---|---|---|
| 없음 (현재 상태) | `conditional-unknown` | 부록 격리 + 코드상 기본값만 기록 |
| stg 값만 | `conditional-enabled (stg)` | 본문 수록 + **"prod 미확인, 발산 가능" 경고 병기** |
| prod 값 (또는 stg+prod) | `conditional-enabled` / `active-prod` | 본문 수록 |

stg 단독으로 `active-prod` 를 선언하지 않는다.

## PRD 분할 맵

각 행이 별도 PRD 파일이자 별도 worktree. **배타 소유 경로가 겹치는 행은 없다** — 이것이 동시 작업의 유일한 보증이다.

```
[순차 게이트 — 단독]
  00-protocol

        │  (manifest 동결 후)
        ▼
[병렬 3 — 사실 인덱스]
  10-index-git      11-index-code      12-index-runtime

        │  (10·12 종료 후 — 11 과는 병렬)
        ▼
[순차 게이트 — 관계 축 계약]
  13-relation-contract

        │  (인덱스 3종 + 13 종료 후)
        ▼
[병렬 5 — 문서 생성]
  20-foundation-access   30-contracts-limits   40-runtime-vendor-legal
  50-domain              60-history-deprecated
```

| PRD 파일 | 선행조건 | 배타 소유 경로 | 종료조건 |
|---|---|---|---|
| `insuniverse-docs-00-protocol.prd.md` | 없음 | `docs/_meta/extraction-manifest.yaml`, `docs/_meta/verify/**`, `docs/_meta/onboarding-questions.yaml`, `docs/_meta/template-config.yaml`, `docs/_meta/ownership.md`, `docs/00-index.md` | manifest 2회 실행 수치 편차 0 + 온보딩 질문 사용자 승인 |
| `insuniverse-docs-10-index-git.prd.md` | 00 M2 | `docs/_meta/index/commits.*.jsonl`, `comments.*.jsonl`, `releases.yaml`, `cross-repo-days.csv`, `dead-candidates.yaml`, `policy-candidates.git.jsonl`, `README.10-index-git.md`, `cross-repo-days.md`, `index-pins.lock` | 재실행 시 diff 0 + 모든 후보에 status 부여 |
| `insuniverse-docs-11-index-code.prd.md` | 00 M2 | `docs/_meta/index/codes/*.yaml`, `constants.yaml`, `env-gates.yaml`, `policy-anchors.yaml`, `api-contracts.jsonl`, `schema-constraints.jsonl`, `tests.jsonl`, `policy-candidates.code.jsonl` | 동일 |
| `insuniverse-docs-12-index-runtime.prd.md` | 00 M2 | `docs/_meta/index/schedules.yaml`, `vendor-behaviors.yaml`, `legal-surfaces.yaml`, `policy-candidates.runtime.jsonl` | 동일 |
| `insuniverse-docs-13-relation-contract.prd.md` | 00·10·12 | `.claude/meta/05-final-spec.md`, `.claude/meta/12-flow-centric-restructure.md`, `.claude/meta/13-precursor-prd-scope.md`, `.claude/meta/14-doc-viewer-meta-analysis.md` | 사람이 쓴 링크 0 + 소유권 게이트 exit 0 |
| `insuniverse-docs-20-foundation-access.prd.md` | 10·11·12·13 | `docs/01-foundation/**`, `docs/02-access/**` | 온보딩 질문 중 해당 영역 100% 답변 가능 + 리뷰 불일치 0 (2라운드) |
| `insuniverse-docs-30-contracts-limits.prd.md` | 10·11·12·13 | `docs/03-contracts/**`, `docs/04-limits/**` | 동일 |
| `insuniverse-docs-40-runtime-vendor-legal.prd.md` | 10·11·12·13 | `docs/05-schedules/**`, `docs/06-vendors/**`, `docs/07-legal/**` | 동일 |
| `insuniverse-docs-50-domain.prd.md` | 10·11·12·13 | `docs/10-server/**`, `docs/20-site/**`, `docs/30-admin/**` | 동일 |
| `insuniverse-docs-60-history-deprecated.prd.md` | 10·11·12·13 | `docs/90-history/**`, `docs/99-deprecated/**` | 동일 |

### 공유 자산 충돌 방지 프로토콜

| 자산 | 소유자 | 나머지 PRD의 접근 |
|---|---|---|
| `docs/_meta/extraction-manifest.yaml` | `00-protocol` | **읽기 전용.** 수정 필요 시 작업 중단 후 사용자 판단 — 규약 변경은 모든 산출물을 무효화한다 |
| `docs/00-index.md` | `00-protocol` | **읽기 전용.** 미생성 문서 경로까지 전부 미리 확정되어 있으므로 나중에 손댈 일이 없다 |
| `docs/01-foundation/01-glossary.md` | `20-foundation-access` | 직접 편집 금지. 새 용어가 필요하면 자기 소유의 `docs/_meta/term-requests/<prd-id>.md` 에 한 줄 추가 → `20` 이 병합 |
| `policy-candidates.*.jsonl` | 축별 인덱스 PRD 각각 | 문서 PRD는 3개를 **읽어서** 사용. 중앙 병합 파일 없음 (`cat` 이 병합) |
| 발견한 버그·불일치 | 없음 | 각자 `docs/_meta/findings/<prd-id>.md` 에만 기록 |

**동시 실행 권장 상한: 3~5.** 그 이상은 리뷰(사용자 1인)가 병목이 되어 worktree가 대기 상태로 쌓인다.

## Success Metrics

| Metric | Target | 측정자 | 측정 시점 | 판정 규칙 |
|---|---|---|---|---|
| 추출 재현성 | 편차 0 | 자동(`docs/_meta/verify/`) | 각 인덱스 PRD 종료 시 + 주 1회 | manifest 기준 재실행 결과와 golden 값 `diff` 가 빈 출력 |
| 온보딩 질문 통과율 | 해당 영역 100% | 유지보수자 | 각 문서 PRD 종료 시 | `onboarding-questions.yaml` 중 해당 PRD 태그가 붙은 질문을, 문서만 보고 답변 가능한지 O/X. X 1건이라도 있으면 미종료 |
| 담당자 이해 일치 | 2라운드 연속 0건 | 유지보수자 | 문서 PRD 리뷰 라운드마다 | 문서 본문이 아니라 `policy-candidates.*.jsonl` 행 단위로 "사실과 다름/빠짐" 표기. 표기 건수 추이 |

> 커버리지 %는 지표로 쓰지 않는다 — 숫자는 쉽게 오르지만 "쓸모 있는 문서"를 보장하지 않는다.

## Open Questions

- [ ] **신입 합류 시점이 곧 마감인가?** 몇 명이 어느 서비스를 맡는지에 따라 `50-domain` 내부 우선순위(server/site/admin 중 무엇 먼저)가 바뀐다. → `50-domain` 착수 전 확정.
- [ ] **온보딩 질문 집합 초안의 규모** — 20~30개로 충분한가. `00-protocol` 이 초안을 내고 사용자가 확정한다. (누가·언제는 확정됨)
- [ ] 사전 분석 미해결 사실 항목 — 주석 정책성 비율 전수 확정, revert 미복원분, `Admin/Point` 폐기 여부, 오류코드 계층 규칙, `screen_codes` 정규식. (`.claude/meta/05-final-spec.md` §7) → 해당 인덱스 PRD가 각각 해소.

**해소된 Open Question** *(구 PRD에서 이월 종료)*
- ~~기획/개발 서술 분리 방식~~ → 한 문서 2개 절로 확정 (2026-08-03)
- ~~권한 DB 스냅샷 확보 가능 여부~~ → 미제공 확정, Out of scope로 이동
- ~~온보딩 질문 집합을 언제·누가 고정하나~~ → `00-protocol` 초안 → 사용자 확정
- ~~리뷰 종료 판정 방식~~ → `policy-candidates.*.jsonl` 행 단위, 2라운드 연속 0건

## Risks

| Risk | 확률 | 영향 | 발동 신호 (Trigger) | 완화책 | 소유자 |
|---|---|---|---|---|---|
| 폐기 정책이 본문에 혼입 → 신입이 죽은 규칙을 학습 | 중 | **매우 높음** | 문서 리뷰에서 "이거 지금 안 씀" 지적 1건 발생 | status 모델 + 5중 폐기 필터. 판정 안 된 것은 본문 금지. **이 실패는 문서가 없는 것보다 나쁘다** | 각 문서 PRD |
| worktree 간 산출물 충돌 | 중 | 높음 | `git merge` 시 `docs/` 하위 conflict 1건이라도 발생 | 배타 소유 경로표 + 공유 자산 프로토콜. 위반 발견 시 해당 worktree 즉시 중단 | 사용자 |
| manifest 동결 후 규약 변경 필요 발견 | 중 | 높음 | 인덱스 PRD가 manifest로 표현 불가한 케이스 보고 | 변경은 버전을 올려 기록하고 **모든 인덱스 재생성**. 부분 적용 금지 | `00-protocol` |
| 리뷰(사용자 1인)가 병목 | 높음 | 중 | 종료 대기 worktree가 3개 초과 | 동시 실행 3~5 상한. 초과분은 착수 보류 | 사용자 |
| 신입 합류 전에 MVP가 끝나지 않음 | 중 | 높음 | 합류 2주 전 시점에 `20-foundation-access` 미착수 | `00` → 인덱스 3 → `20` 만으로 온보딩 가능하도록 범위 설계. `30~60` 은 합류 후로 이월 | 사용자 |
| env 게이트·DB 권한 미확인 항목이 문서 신뢰도를 갉아먹음 | **확정** | 중 | — (이미 발생) | 숨기지 않고 한계로 명시. "모른다"고 쓴 문서가 틀리게 확신하는 문서보다 안전 | `30-contracts-limits`, `20-foundation-access` |
| 기획/개발 2절 분리가 실제 서술에서 지켜지지 않음 | 중 | 중 | 리뷰에서 개발 절에 기획 서술이 섞인 문서 2건 이상 | 템플릿을 기계 검증 가능하게 작성 (필수 절 존재 여부 lint) | `doc-template-kit` |

## Design Direction

> impeccable unavailable, skipped (auto-fallback): skill-missing
> 실질 사유 — 산출물이 Markdown 문서 트리이며 UI 표면이 없음.

---

## 부록. 2026-08-03 3-agent 재검증 정정 이력

| # | 정정 내용 | 지적자 |
|---|---|---|
| 1 | 권한 DB 스냅샷: Open Question("out-of-scope 아님") → **Out of scope 확정** (spec §6-2와 모순 해소) | 비판적 |
| 2 | stg env 승격 논리: "stg 목록만 받으면 본문 승격" → **stg 단독으로 `active-prod` 선언 금지**, 발산 경고 병기 규칙 신설 | 비판적 |
| 3 | 온보딩 질문 순환 의존: 지표 #1이 Open Question에 종속 → `00-protocol` 산출물로 이동, 지표에 측정자·시점·판정규칙 명시 | 3-agent 합의 |
| 4 | 마일스톤 표에 선행조건·배타 산출물·종료조건 없음 → **PRD 분할 맵**으로 대체 | 3-agent 합의 |
| 5 | 기획/개발 분리 형식 미확정이 M2~7 전부 블로킹 → **한 문서 2개 절로 확정**, Open Question에서 제거 | santa-loop |
| 6 | 지표 #2 gameable·판정자 미정 → 측정 단위를 문서 본문에서 `policy-candidates.*.jsonl` 행으로 변경 | santa-loop |
| 7 | 벤더 1,762회 / 법적 427회가 마일스톤 5 한 줄로 압축 → **독립 PRD** `40-runtime-vendor-legal` 로 승격 (spec §8 판정 반영) | 비판적 |
| 8 | Risks 완화책에 trigger·owner 없음 → 두 컬럼 신설 | santa-loop(Codex) |
| 9 | `@Roles` 136 vs 실측 137 → Evidence에 재현성 분쟁 사례로 편입. manifest 동결 시 단일값 확정 | 비판적(실측) |

**agent 지적 중 기각한 것**
- "`extraction-manifest.yaml` 미생성이 치명 결함" → 아니다. 그것은 `00-protocol` 의 산출물이다. PRD 결함이 아니라 미착수 상태.
- "폐기 필터 자동화 도구 부재" → 구현 상세. `/mccp:plan` 영역.
- "마일스톤 4~7이 placeholder" → PRD 단계에서는 정상. 자식 PRD로 구체화됨.
- 비판적 agent의 "안전 분할선 없음" → 과잉 보수. manifest 동결 후 인덱스 산출물은 파일 단위로 배타적이며, 긍정적·santa-loop 판정과 실측 파일 구조가 병렬 가능을 지지한다.

---
*Status: DRAFT — requirements only. 실행은 자식 PRD 10개로 분할됨.*
*Co-created with user on 2026-08-03. 3-agent 적대적 재검증 반영.*
