# mccp 상태 · ⏱ toggle_usage 소스 손상

_마지막 갱신: 2026-10-20T02:14:14.810Z · 방금_

[verdict](#verdict) · [대시보드](#대시보드) · [파이프라인](#파이프라인) · [멀티세션](#멀티세션-진행) · [타임라인](#타임라인) · [마일스톤-기록](#마일스톤-기록) · [위험](#위험)

---

## Verdict

> ⏱ toggle_usage 소스 손상

---

## 대시보드

◐ 진행 중 0 · 🚫 차단 2 · ↪ 이월 finding 73 · ⚠ 위험 26 · → 다음 대기

진행 중 (0): 없음
차단 (2): insuniverse-docs-00-protocol-m4 · insuniverse-docs-30-contracts-limits-m6-reseal7
이월 finding (73): L2 test: Validation checks #1-#11 comprehensively validate that the plan was implemented correctly · 원문 .claude/reviews/plan-review-insuniverse-docs-60-history-deprecated-m1.md · id=898a3cb3 · L2 test: The plan's Acceptance criteria state that findings file `60-history-deprecated.md` will contain exactly observations G16 and G17 (line 431: '`findings/60-history-deprecated.md` 에 G16 · G17 두… · 원문 .claude/reviews/plan-review-insuniverse-docs-60-history-deprecated-m1.md · id=27024676 · **findings 파일의 내용 동일성을 보는 검사가 없다 (M1 구현 중 확인 · L2 test HIGH 판정 대조).** Acceptance 는 `findings/60-history-deprecated.md` 에 G16·G17 두 관측이 있다고 적고 게이트를 `#1` 로 단다. 그런데 `verify.sh` 가 보는 것은 `fixtask.findings_headings` 의 표제 **수**(=2)와 필수 6항목 구조뿐이다 , 다른 주제 2건도 같은 값을 낸다. 즉 그 Acceptance 항목은 실제로는 `(미검증)` 인데 그렇게 적혀 있지 않다. 계획서 본문은 `plan_hash` 로 receipt 에 결박돼 있어 이 창에서 고치지 않는다(고치면 plan-codex receipt 가 stale). 인수처: 이 PRD 의 M2 , 실 폐기 문서를 발행하면서 findings 항목↔관측 결속을 열 수 있는 첫 창 · id=27024676-adj

<details>
<summary>+70 더보기</summary>

- **이 창의 backlog 이월분이 `fixtask.cohort_*` 동결 밖이다 (M1 구현 중 실측).** m8 이 세운 코호트 동결은 `fixtask-projection.mjs` `parseBacklogRow` 가 읽는 **평문 행**만 담는다. 이 파일은 이제 mccp 소비자(`derive/sources/backlog.js` · `plan-review/backlog-append.js`)가 요구하는 표 형식 절을 함께 갖고, 신규 이월은 그 표로 들어간다 , `digest-set` 은 기준선 blob 과 현재 파일 양쪽에서 42건 동일을 내고 `fixtask.cohort_count`·`cohort_m8` 은 움직이지 않는다. 즉 **표에 적은 이월 행은 나중에 지워도 어떤 게이트도 붉어지지 않는다** , m8 관측 5 가 닫으려던 바로 그 자리가 새 형식에서 다시 열렸다. 계획서 G14(*backlog 한 행이 golden 2키를 움직인다*)는 평문 행에 한해 참이다. 검사 `#7` 이 그 발산을 `note` 행으로 드러내되 FAIL 로 두지는 않는다 , 해소 경로 둘(투영기가 표 행을 읽게 개정 · 형식 통일)이 각각 `docs/_meta/verify/**` 위임 사유(`--update` 재동결 한정) 밖과 §NOT Building 밖이다. 인수처: 이 PRD 의 M2 , `docs/_meta/verify/**` 위임 확장을 올리는 창과 같다 · id=60m1-cohort-blind
- **R-4 `sha` 는 형태만 검사되고 실재하는 커밋으로 해석되지 않는다 (PR-Codex R2 F2).** `FIELD_RE.sha` 가 7~40자리 hex 정규식뿐이라 `deadbee` 처럼 어느 저장소에도 없는 값이 `check10` 을 통과한다. 해석 축을 이 창에서 세우지 않는 근거 둘 (둘 다 실측): (a) **R-4 4필드에 저장소 식별자가 없다** , 대상은 서브모듈 3종(server·site·admin)이고 7자리 접두어는 셋에서 동시에 해석될 수 있어 *정확히 하나로 해석* 이 정의상 미결이다. 필드 추가는 13 에서 온 회부 계약의 개정이라 새 회부 라운드가 필요하다. (b) **저장소 안 커밋 인덱스가 이력의 부분집합이다** , 2026-08-25 실측: golden `commits.insuniverse-admin.total`·`-server`·`-site` 가 1163·2590·2450 인데 `docs/_meta/index/commits.{admin,server,site}.jsonl` 행수는 1157·2587·2446 (차 6·3·4). 그 인덱스로 대조하면 **유효한 sha 를 거짓 거부**한다. 서브모듈 이력 직접 조회는 워크트리에서 빈 디렉터리라 불가하고 INV2 가 포인터를 동결한다. M1 시점 실 폐기 문서는 0건이라 해석 대상도 0 이다. 인수처: 이 PRD 의 M2 , 실 sha 가 처음 생기는 창이며 저장소 식별자 회부와 앵커 선택을 같이 판정한다. **2026-08-28 (m2c) , M2 행은 `complete` 로 종료됐으나 이 이월은 닫히지 않았다.** `.claude/plans/insuniverse-docs-60-history-deprecated-m2c.plan.md` 창이 revert 축 확정 0건을 이유로 **발행을 하지 않았고**, 실 sha 가 하나도 생기지 않아 해석 규약을 판정할 대상이 여전히 0이다. 인수처는 revert 축에 새 확정이 생기는 창으로 넘어간다 · **2026-09-02 (m6) , 이 창도 두 행을 닫지 않는다.** 마일스톤 6 은 폐기 축이 아니라 연혁 축(등급 U `00-origin.md` · 등급 O `04-ops-intent.md` 자리)이고 `docs/99-deprecated/` 아래에 **0건 발행**했다. 그 디렉터리는 실측상 트리에 존재조차 하지 않으므로 판정 대상이 여전히 0이고 인수처는 그대로다. 검사 `#7` 이 발행 0건과 이 두 행의 열림을 함께 찍는다. · id=60m1-sha-unresolvable
- **`deprecated[]` 멤버십은 *판정 완료* 를 뜻하는데 그것을 증명하는 기계 근거가 없다 (PR-Codex R5 F1).** `validateDeprecated` 는 `reason` 의 존재와 비어있지 않음만 본다 , `reason: 미판정 , 근거 조사 중` 같은 산문이 그대로 통과하고, 그 항목은 형제 문서가 `supersedes` 로 가리키는 순간 *죽은 정책* 으로 가르쳐진다. UI5 가 발행 id 를 되돌릴 수 없게 만들므로 오판 비용이 비대칭이다. **금지어 목록은 답이 아니다** , INV4 가 겨냥하는 리터럴이고 다른 표현 한 번으로 우회된다. 필요한 것은 판정 레코드다: 후보(`docs/_meta/index/policy-candidates.*.jsonl`)에서 `deprecated-confirmed` 로 옮긴 근거가 기계로 읽히는 자리이며, 그 상태값은 이미 `index.status_legend` 에 있다(`golden.txt`). 그 결속은 실 폐기 노드가 없는 M1 에서는 대상이 0건이라 세울 수 없다. **다만 이 창이 남기는 것은 기록만이 아니다** , `check10` 의 발행 차단 축이 이 행의 닫힘을 요구하므로, 이 이월이 열려 있는 한 `docs/99-deprecated/**` 에 문서를 발행하면 게이트가 붉어진다(UI8). 인수처: 이 PRD 의 M2 , 후보↔노드 결속을 판정하는 첫 창. **2026-08-28 (m2c) , M2 행은 `complete` 로 종료됐으나 이 이월은 닫히지 않았다.** `.claude/plans/insuniverse-docs-60-history-deprecated-m2c.plan.md` 창이 확정 0건을 이유로 폐기 노드를 **0건 발행**했으므로 결속을 세울 실 노드가 없다. 인수처는 revert 축에 새 확정이 생기는 창으로 넘어간다 · **2026-09-02 (m6) , 이 창도 두 행을 닫지 않는다.** 마일스톤 6 은 폐기 축이 아니라 연혁 축(등급 U `00-origin.md` · 등급 O `04-ops-intent.md` 자리)이고 `docs/99-deprecated/` 아래에 **0건 발행**했다. 그 디렉터리는 실측상 트리에 존재조차 하지 않으므로 판정 대상이 여전히 0이고 인수처는 그대로다. 검사 `#7` 이 발행 0건과 이 두 행의 열림을 함께 찍는다. · id=60m1-adjudication-unproven
- L2 architect: Task 3 creates overlapping edit delegations without formal semantics: PRD 13 ('완료' status) and PRD 20 ('진행' status) will both have rows in §개정 위임 table for identical paths (docs/_meta/t… · 원문 .claude/reviews/plan-review-insuniverse-docs-20-foundation-access-m1.md · id=75d7e69e
- L2 test: The plan specifies exact code anchors for each actor term in Task 2 (lines 85-101) and checks will verify these anchors point to real files/lines via check#2 · 원문 .claude/reviews/plan-review-insuniverse-docs-20-foundation-access-m1.md · id=d7749bff
- L2 test: Gates.mjs file will be created in Task 1 and implement checks #1-#8, #13, #14 with specified behavior including markdown parsing, config comparison, and 10 selftest dual-contrast verificatio… · 원문 .claude/reviews/plan-review-insuniverse-docs-20-foundation-access-m1.md · id=0d1b12b4
- L2 invariant: Plan documents an unpreventable fail-open window in check6 that allows bad data to pass if both files agree · 원문 .claude/reviews/plan-review-insuniverse-docs-20-foundation-access-m1.md · id=b6aa7431
- L2 invariant: Plan gates are anchored to manually observed golden baseline, not machine-verified precondition · 원문 .claude/reviews/plan-review-insuniverse-docs-20-foundation-access-m1.md · id=e3505bd5
- L2 invariant: Plan assumes Task-level gate enforcement mechanism that is not specified or documented in mccp framework · 원문 .claude/reviews/plan-review-insuniverse-docs-20-foundation-access-m1.md · id=474113d0
- L2 invariant: Plan shifts critical correctness checks to external review marked (미검증), creating reviewer dependency for things that should be gated · 원문 .claude/reviews/plan-review-insuniverse-docs-20-foundation-access-m1.md · id=e3fbad37
- L2 invariant: Gate #1e is fail-open: it validates only format of D6 approval field, not truthfulness or actual user authorization · 원문 .claude/reviews/plan-review-insuniverse-docs-30-contracts-limits.md · id=8342cc04
- L2 invariant: Blocking precondition (D6 approval) cannot be enforced by Task 2's validation gate. Plan claims 'D6 은 이 계획서가 GROUND 에서 새로 찾아낸 것이며 승인되지 않았다' but gate accepts any conforming date string w… · 원문 .claude/reviews/plan-review-insuniverse-docs-30-contracts-limits.md · id=67586680
- L2 invariant: Receipt anchoring failure: plan claims approval is not yet received (line 24: 'D6 은...승인되지 않았다'), yet the plan's own execution path in Task 2 will accept any conforming date without bin… · 원문 .claude/reviews/plan-review-insuniverse-docs-30-contracts-limits.md · id=2f8a1336
- L2 invariant: User Intent UI2 vs Gate Behavior mismatch: UI2 (line 47) explicitly rejects gate escalation ('위임 규약을 게이트로 승격하지 않는다'), yet Task 2 Action requires a human judgment gate (D6 approval) that… · 원문 .claude/reviews/plan-review-insuniverse-docs-30-contracts-limits.md · id=9a371f46
- L2 invariant: No unknown-input path prevents false approval injection. Task 2 validation regex accepts any date YYYY-MM-DD (including future dates, meaningless dates) without semantic validation or t… · 원문 .claude/reviews/plan-review-insuniverse-docs-30-contracts-limits.md · id=2ac8ed87
- Plan-Codex R15 F2 (DEFER, Task 2·Task 8 실행 정확성): 하네스가 **위임 행의 단계를 모른다**. `sig` 가 `상태` 를 빼고(Task 8 이 뒤집으므로) `#1b` 는 `진행`·`완료` 둘 다 받으며 `#8b` 는 `완료` 6 만 센다 , Task 2 가 여섯 행을 **처음부터 `완료`** 로 적어도 정당한 Task 8 전환과 구별되지 않는다. 그러면 archived 경로를 편집하는 중에 장부가 위임 종료를 주장하고, `상태: 진행` 2개 이상이라는 재검토 조건도 발동하지 않는다. 두 수리 시도가 실측으로 무력했다 , (1) `완료` 를 green `#7` 에 묶기: **기준선 게이트가 이미 rc 0**(G1)이라 Task 2 시점에도 green. (2) 상태 전건 동일 요구: 공격 형태가 *전부 `완료`* 라 통과. 남는 `--sealed` 플래그는 이르게 `완료` 를 적을 실행자가 이르게 주므로 가정을 옮길 뿐이다. 조치: Task 2 직후 `--fast` 실행 출력에 6행 `진행` 을 사람이 확인하고, Task 8 전환 전 `--check --bootstrap` exit 0 을 사람이 확인한다 · run_nonce 93187d9d
- Plan-Codex R10 F0 (DEFER, Task 2 착수 전 필수): 게이트가 **기존 8행의 생존을 요구하지 않는다**. `#1a` 는 신규 30행 서명만, `#1c` 는 같은 경로 미완료 선행행만, `#2a` 는 (발신,#) 유일성만, `#2b` 는 신규 R-1 실재만 본다 , `ownership.md` §개정 위임 8행과 §회부 인계 8행을 통째로 지워도 전건 통과한다. 승인·회부 provenance 가 archived 소유 파일에서 소실되는 경로다. 수리는 `#1d`·`#6d` 와 같은 앵커(`m1-baseline.sha` 리비전 `git show`)로 기존 행 전건 잔존을 요구하는 것 · run_nonce 2865c7d1 , **해소됨(2026-08-24): `/mccp:plan` R11 이 흡수했다.** 검사 `#1f`(위임 8행)·`#2c`(회부 8행) 신설, 분모는 `#1d`·`#6d` 와 같은 `m1-baseline.sha` 리비전 `git show`. 반사실 실행 확인 , 수리 전에는 두 장부 16행 삭제가 게이트 출력을 전혀 바꾸지 않았고(`FAIL 누계 15` 동일), 수리 후 같은 입력이 `#1f want=0 got=8` · `#2c want=0 got=8` 로 뒤집힌다
- **revert `deprecated-confirmed` 2건이 5중 필터 1·2 를 못 넘어 M2 가 `deprecated[]` 를 0건으로 남겼다 (M2 구현 중 실측 · `docs/_meta/findings/60-history-deprecated.md` F-06).** 계획서 Task 2 는 *실측 posture 는 revert 확정 2건이 필터 4·5 를 넘고* 로 적었으나 필터 1·2 를 재지 않았다. 실측: 두 건의 env 게이트(`B2C_BYPASS_SLOT` 기본 `2` · `TREAT_POOL` 기본 `octover:30:3:1,coocon:30:3:1`)가 살아 있고 관련 코드가 동결 HEAD `4d798f55…` 에 실재한다 , 필터 1(env 기본값 off)·2(HEAD 코드 부재) 가 `pass` 가 아니다. UI8·UI9 로 발행이 막히고 M1 `check10` 이 빈 `deprecated[]` 를 거부하므로 `docs/99-deprecated/02-reverted-policies.md` 자체가 이 창에서 생성 불가다. 인수처: 사용자 판정 , (a) 필터 2 를 *되돌린 패치의 형태* 로 좁힐 것인가 *정책 재도입까지* 볼 것인가(PRD §Open Questions 의 재도입 항목과 같은 축) · (b) M2 를 판정 원장 없이 닫고 발행을 뒤 마일스톤으로 미룰 것인가 · id=60m2-revert-filters-fail
- **하네스 5검사가 계획서 음성 케이스를 통과로 뒤집었다 (M2 리뷰 실측).** `check10` 이 `Status !== "complete" && files === 0` 에서 `#10 ok 요구 꺼짐` 으로 조기 return 한다 , 계획서 Validation `# 음성:` 은 같은 상태를 `#10 FAIL: 요구가 켜지지 않았다` 로 적었고 §Risks 의 *Task 4 순서가 뒤집혀 check10 이 요구가 꺼진 채 초록이 된다* 완화 문면(`실 대상 <n>파일` 이 0이 아님을 함께 본다)도 그 통과 분기와 모순이다. 같은 `요구 꺼짐` 분기가 `#4`(이월 열림 2 를 ok) · `#5` · `#6` · `#11` 에도 있다. 발행 보류 판정 자체는 정당하나 **11검사 중 5개의 통과 조건이 계획서와 달라진 것이 §Deviations 5건 어디에도 없었다** , `check-all 10/10` 을 게이트 계약 충족으로 읽게 된다. 이 리뷰에서 구현 리포트 §Deviations 6번째 항목으로 명시했다. 계획서 본문은 `plan_hash` 결박이라 고치지 않는다. 인수처: 마일스톤 2b , 실 발행이 처음 생겨 `요구 꺼짐` 분기가 죽는 창이며, 그때 분기를 지우고 계획서 음성과 일치시킨다 **2026-08-26 (2b 실측) , 이 이월은 `2b` 에서 닫히지 않는다.** 인수처 문면은 *실 발행이 처음 생겨 `요구 꺼짐` 분기가 죽는 창* 을 전제했으나, 2b 는 6축 전부 `pass` 인 행이 0이라 확정이 0건이고 `docs/99-deprecated/` 아래 발행도 0건이다. 분기가 죽는 조건이 이 창에 없어 그 분기는 살아 있다. 남은 인수처는 실 발행이 처음 생기는 창이다 · id=60m2-gate-requirement-off
- **`docs/_meta/index/codes/screen.yaml` 의 화면 코드 집합이 동결 정본과 2건 어긋나고 두 pin 이 분기 관계다 (마일스톤 2 창 실측).** 사본에만 `admin:/alarm` 과 `admin:/alarm/:param` 이 있고 `docs/_meta/extraction-manifest.yaml` §screen_codes 재실행값(282 · `0471c759…`)에는 0건이다. 낡음이 아니다 , 사본 `source_sha.admin` `7df733a5` 와 manifest `repos[].head` `fb001e1d` 사이에 `git merge-base --is-ancestor` 가 거짓이고, `git show 7df733a5:src/app/router/routes/page.routes.tsx` 51행에 `path: "/alarm"` 이 있는데 `fb001e1d` 의 같은 파일에는 `alarm` 이 0건이다. 사본 헤더는 `route_count: 284` · `entry_count: 284` 인데 그 값을 담는 골든 키가 없어 매 실행 재검증되지 않는다. 이 PRD 는 사본을 고치지 않는다 , `docs/_meta/index/**` 는 `11-index-code` 소유다. 인수처: 그 PRD 의 화면 코드 축 재동결 창 · id=50m2-screen-yaml-divergence
- **오류 시나리오 테스터 컨트롤러에 계정 종류 층이 통째로 없다 (마일스톤 3 창 실측).** `insuniverse-server/apps/api/src/modules/treat-test/treat-test.controller.ts:16` 이 `@UseGuards(AdminJwtAuthGuard)` 하나만 달고 `RolesGuard` 도 `@Roles` 도 0건이다. 그래서 인증된 관리자면 계정 종류와 무관하게 이 모듈의 쓰기 핸들러(같은 파일 30·33·42·49·56·63·70행)를 부를 수 있다 , 시나리오 실행과 카탈로그 편집·삭제가 전부 그 층 아래 있다. 대응 화면은 이 창의 유일한 미배포 화면이며 라우트 등록이 환경 판정에 걸려 있으나, **그 판정은 화면 등록만 막고 서버 경로는 막지 않는다.** 문서 축의 조치는 끝났다: `docs/30-admin/05-treat-monitoring.md` 의 테스터 흐름이 권한 표에서 그 층을 `해당 없음 , 층 자체가 없다` 로 적고 이탈 표가 그 귀결을 낸다. 코드 수정은 이 PRD 범위 밖이다. 인수처: 관리자 API 인가 매트릭스를 소유한 창 · id=50m3-treat-test-no-roles-guard
- **PRD P-2 의 배치 예측이 후보 인덱스 규칙표로 반증됐다.** P-2 는 *"24개 입도면 격리가 `no_data` 3칸으로 국소화되고 본문에 21칸이 남는다"* 고 적었는데, 배치를 정하는 것은 `coverage`(resolved/unknown)가 아니라 `status` 이고 `status` 는 추출기 규칙표(`extract-runtime-policy-candidates.mjs` `RULE_TABLE.status_rules`)가 정한다. 실측(2026-08-26): `axis: vendor` 25행 중 V1 16행 전건 `conditional-unknown`(`assignment_state: assigned`) · V2 9행 전건 `null`(`pending` · `deployment-unproven`)이고, `template-config.yaml` 의 `conditional-unknown` `placement` 는 `appendix` 다. pending 9행을 M1 유도 규칙에 넣어도 `conditional-unknown` 이 나온다. **본문 자격 0건이므로 본문 정책 0건이며 예측과 반대다.** 마일스톤 3 은 그 실측대로 저작했고 게이트 `#3c` 가 항등을 문다. PRD 문면 정정은 이 창이 하지 않는다 , 같은 창이 판정 기준을 고치면 기준과 결과가 함께 움직인다. 인수처: 이 PRD 의 소유자 판단 · id=40m3-p2-placement-prediction-refuted
- L2 architect: Gate #2d prevents Axis 2 (code-only policy) omissions by scanning configuration.ts vendor keys. However, only 3 of 10 Axis 2 policies have configuration.ts anchors (30% coverage). The o… · 원문 .claude/reviews/plan-review-insuniverse-docs-40-runtime-vendor-legal-m4.md · id=ce608c82
- **PRD Evidence `[구-SHA]` 3행의 재측정 결과가 셋으로 갈린다 , 같은 어휘로 적으면 세 번째가 첫 번째처럼 읽힌다.** (1) 웹뷰 브리지 규모는 **정확히 일치**한다 , 동결 site `767d1e44` `front/src` 에서 `BRIDGE_NAME` 32회/20파일 · `postMessage` 9회/5파일이고 구값과 같다(게이트 `#14b` 가 매 실행 재계수한다). (2) FCM 파일 수는 **부분 일치**다 , server 는 `modules/fcm/` 4파일 · `modules/push/` 7파일로 구값과 같으나 site 푸시 표면은 구값 *1파일* 이 아니라 **3파일**이다(`PushEventConsentPopup.tsx` · `PushSettingsPage.tsx` · `PushConsentModal.tsx`). (3) 결제 벤더 모드는 **재현 불가**다 , 참조 지점 두 곳은 동결 site 에서 열리지만 그 트리에 `.env` 계열 파일이 0건이라 구값 두 개가 앵커로 결박되지 않는다. 구값은 워킹트리 독출이었다. 문서 `03-payments.md` §환경별 모드가 (3)을 그대로 적었고 값은 옮기지 않았다. PRD 규범 문면 정정은 이 창이 하지 않는다 , 같은 창이 판정 기준을 고치면 기준과 결과가 함께 움직인다. 인수처: 이 PRD 소유자 · id=40m4-old-sha-remeasure-three-ways
- **벤더 인덱스의 키워드 집합이 구조적 사각 넷을 만든다 (FCM 포함).** `extract-runtime-scale.mjs` 의 `VENDOR_KEYWORDS` 8원소가 `vendor-behaviors.yaml` 의 카디널리티 불변식과 묶여 있어 그 집합 밖 연동은 항목이 될 수 없다. 실측(게이트 `#14a`, 2026-08-26): `configuration.ts` 최상위 블록 키 중 **동결 server 트리에 같은 이름의 전용 통합 유닛(`libs/<키>/` 또는 `apps/api/src/modules/<키>/`)을 갖는 것**은 12종이고 키워드 8종을 뺀 차집합이 `{fcm, mailer, s3, user}` 다. `fcm` 은 설정 블록·통합 유닛·예외 형태 세 구조 시험을 전부 통과하는데 이름만으로 배제됐다. `mailer` 는 **발송 축이라 04-messaging 이 열 수도 있었던 연동**이며 이 창은 열지 않고 이월로 올린다. 문서는 넷 전건을 `## 인덱스 사각 , FCM` 에 기술했고(게이트 `#14` 가 전건 기술을 문다) 판별의 사각(블록 키와 유닛 디렉터리 **이름이 어긋나는** 연동 , 본인확인·챗봇 웹훅·동영상 API·CDN)도 같은 절에 적었다. 인수처: `12-index-runtime`(키워드 집합 소유) · 발송 축을 다시 여는 창(`mailer`) · id=40m4-vendor-keyword-blind-spots
- **이 마일스톤은 `divergent` 로 봉인된 계획 위에서 구현됐다.** `mccp-plan-codex` receipt 의 `resolution.review_verdict` 가 `divergent` 이고 L2 패널 quorum 이 3/4 에 미달했다(architect fail · security·test·invariant pass). 원인은 `MCCP_REVIEW_SINGLE_PASS=deadline_pressure` 로 라운드 캡이 1에 고정돼 **흡수 라운드 없이 반려가 그대로 봉인**된 것이다. 구현 창은 architect 4건·invariant 3건을 건별로 판정해 하네스로 흡수하거나(A1·A4 → `#2d` 사각 계수 자백 · I1 → `preflight` 재실행 가능 · I3 → `#0c` 동결 포인터 대조 신설) 설계대로임을 확인했고(A3), 그 판정은 `.claude/notes/insuniverse-docs-40-runtime-vendor-legal-m4.md` §반려 흡수에 있다. **봉인된 verdict 는 지우지 않았다.** 인수처: `MCCP_REVIEW_SINGLE_PASS` 를 풀고 `/mccp:plan` 을 재실행해 실제 verdict 로 재봉인하는 창 · id=40m4-plan-sealed-divergent
- **PRD Evidence F-13 행이 활성성이 서로 다른 두 사실을 한 근거로 묶었다 (마일스톤 5 실측).** 그 행은 *"약관 테이블에 버전 컬럼이 없다"* 와 *"두 unique 제약이 타입당 1행을 강제한다"* 를 하나의 `[신]` 근거로 적는다. 동결 트리 행 단위 blame 은 둘을 가른다 , 컬럼 부재는 `e9ae08db`(2024-09-02) · `78ca58ff`(2026-05-18) 로 운영 도달이고 두 제약은 `c577fd29`(2026-07-16) 하나로 운영 미도달이다. 이 창은 두 사실을 다른 정책으로 갈라 배치까지 다르게 했고(`terms:version-column-absent` 본문 · `terms:one-row-per-type` 부록) 그 판정은 게이트 `#5` 가 매 실행 재유도한다. PRD 규범 문면은 이 창이 고치지 않는다 , 같은 창이 자기 기준을 고치면 기준과 결과가 함께 움직인다. 인수처: 이 PRD 소유자 · id=40m5-f13-mixed-reachability
- **M4 하네스 `#15` 가 형제 창의 미커밋 PRD 편집에 죽는다 (마일스톤 5 구현 중 실측).** M4 `check15` 는 `git diff HEAD, <PRD>` 에 hunk 가 하나라도 있으면 그것을 **자기 갱신**으로 읽고 `Plan 셀이 M4 계획서 경로인 추가 행` 을 요구한다. M5 가 같은 표의 5행을 고치면 그 조건이 깨져 `#15b FAIL: 변경 행이 1개다 (기대 2)` 가 나고, M5 `#0a` 가 M4 `all` 을 요구하므로 **M5 의 모든 검사가 선행 검사에서 막힌다**(실측: `#0a FAIL: M4 rc=1 (검사 check15 에서)`). 모드 분기의 키가 *"이 파일에 diff 가 있는가"* 이지 *"내 행에 diff 가 있는가"* 가 아닌 것이 원인이다. 이 창의 해소는 순서다 , PRD 편집을 커밋한 뒤 `all` 을 돌리면 두 하네스가 함께 커밋 후 모드로 간다. M4 하네스는 이 창의 `## Files to Change` 밖이라 고치지 않는다. **M6 도 같은 자리에서 막힌다.** 인수처: 종료된 마일스톤 하네스의 모드 분기 키를 행 단위로 좁히는 창 · id=40m5-m4-gate15-sibling-prd-edit
- L2 test: Filter5 reference-count conjunct for rows 5-6 is marked n/a and won't affect judgment if resolver later, making all 8 rows permanently fail-containing · 원문 .claude/reviews/plan-review-insuniverse-docs-60-history-deprecated.md · id=41cebcae , RESOLVED 2026-08-26: 로컬 리뷰가 같은 축을 더 깊게 잡았다. 검사 `#8` 이 5축을 **완전 재유도 3축 · 부분 1축(필터3 0/8) · 사람 판정 10칸** 으로 쪼개서 출력하도록 바뀌었고, 필터5 conjunct 의 `n/a` 취급이 그 배분표에 명시된다. 진짜 하중 자리는 필터5 가 아니라 행 `8e03420` 의 필터4 오버라이드였고(그 행의 유일한 fail), 원장·`#8`·Acceptance 에 명문화됨
- **receipt 가 `converged: true` · `findings: []` · `open_questions: []` 인데 패널은 `divergent` 이다 (로컬 리뷰 실측).** `MCCP_REVIEW_SINGLE_PASS=deadline_pressure` 로 봉인되면서 L2 차단 2건(test/HIGH · test/FAIL)이 receipt 에 안 실렸다. `/mccp:code-review` Phase 2.5.4 와 implement preflight 는 `resolution.open_questions` 를 auto-CRITICAL 로 스캔하므로 빈 배열이면 **차단 지적이 하류 어느 게이트도 못 세운다**. 흔적은 backlog 2행뿐이고 그 2행은 어느 게이트도 안 읽는다. 인수처: mccp 본체 , single-pass 봉인 시 차단 finding 을 `open_questions` 로 싣는 경로가 없다 · id=60m2r-receipt-open-questions-empty
- **삭제 축 참조 카운트의 측정 시점이 정의되지 않았다 (2b 실측).** 5중 필터 5 의 참조 conjunct 는 *어느 시점의 트리에서 세는가* 를 정해야 값이 난다. 현재 유일한 산출 축인 코드 축은 동결 HEAD 에서 스캔하고 삭제 경로는 정의상 그 트리에 없어 `defined_in` 앵커 5,202건과 삭제 경로의 교집합이 0 이다(env 게이트 축도 앵커 15경로에 교집합 0). `05-final-spec.md` §3 은 그 시점을 정의하지 않는다. 열려면 측정 시점을 삭제 직전 부모 트리로 옮긴 새 유도가 필요하고 그 선택은 사용자 판정 사항이라 계획서가 대신 내리지 않는다(UI3). 인수처: 사용자 판정 , PRD §Open Questions *삭제 축 참조 카운트의 측정 시점* **2026-08-27 (m3 실측) , 이 이월은 이 창에서도 닫히지 않는다.** `.claude/plans/insuniverse-docs-60-history-deprecated-m3.plan.md` 는 삭제 축이 아니라 발산 축인데 **뿌리가 같다** , 두 축 다 하류 인덱스가 동결 stg HEAD 를 기준선으로 잡고, 삭제 경로는 정의상 그 트리에 없으며 prod-only 는 정의상 `--not <frozen head>` 다. 발산 축 실측: prod-only 102건 ∩ `commits.<repo>.jsonl` 6,190행 = 0 이고 `comments.*`·`code`·`runtime` 5축에는 커밋 앵커 필드 자체가 없다(findings F-11). 측정 시점이 판정되기 전에는 어느 축에서도 값이 나지 않는다 · id=60m2b-refcount-measurement-point
- **배포 승격 판정이 이 창 밖이고 저장소 안에 그것을 확증할 증거가 없다 (m3 실측).** `03-divergence.md` 가 커밋 단위 발산 257건을 발행하지만 그 항목들이 *실제로 배포됐는가* 는 판정하지 못한다. 3저장소 전부 태그 0개이고 `refs/replace/*` 도 비어 있어 릴리스를 확증할 독립 증거가 저장소 안에 없다. `releases.yaml` `prod_merge` 45건은 제목 일치(`release_note_pattern`)와 부모 토폴로지의 기록일 뿐 배포 승격 판정이 아니며 그 머리말이 판정을 `00-protocol` 소관으로 이미 밀었다. CI·PR 메타데이터는 이 저장소의 범위 밖이다. 그래서 이 문서는 배포 여부를 `unknown` 으로 적고 판정 주체의 이름만 남긴다. 인수처: `00-protocol` , 배포 승격 판정 절차를 정의하는 창 **이 창(m4)에서도 닫히지 않는다** , `01-timeline.md` 가 `prod_merge` 45건의 시점과 제목을 발행하지만 연대기 축에도 배포를 확증할 독립 증거가 없다. 3저장소 태그 0 · `refs/replace` 0 은 이 창에서 재유도해 같은 값이었고, `prod_merge` 는 여전히 제목 일치와 부모 토폴로지의 기록이다. 축이 발산에서 연대기로 바뀌어도 뿌리가 같다 **이 창(m5)에서도 닫히지 않는다** , `02-epics.md` 가 에픽 소속 커밋 185/185 와 랜딩 114/114 의 locked prod tip 도달을 재유도하지만 그것은 조상 관계의 관측이지 배포 승격의 판정이 아니다. 3저장소 태그 0 · `refs/replace` 0 을 이 창에서도 재유도해 같은 값이었다. 축이 연대기에서 에픽 경계로 바뀌어도 뿌리가 같다. · id=60m3-deploy-verdict-out-of-scope
- **발산 축의 참조 카운트가 구조적으로 부재라 PRD §Risks 완화책이 작동하지 않는다 (m3 실측).** *prod 발산 항목이 실제로는 미배포 코드* 리스크의 완화책이 *참조 카운트 병행 확인 · 둘이 어긋나면 `unknown`* 인데 그 입력이 없다. prod-only 102건 ∩ `commits.<repo>.jsonl` 6,190행 = **0** 이고(모든 하류 인덱스가 동결 stg HEAD 를 기준선으로 잡는데 prod-only 는 정의상 `--not <frozen head>` 다), `comments.server/site/admin.jsonl` 12,688행과 `policy-candidates.code.jsonl` 1,994행 · `.runtime.jsonl` 50행에는 커밋 앵커 필드 자체가 없다. `policy-candidates.git.jsonl` 2,870행의 적중 102건은 전부 `source: prod_only` 인 자기 행이라 외부 참조가 0 이다. **`교집합 0` 과 `축 부재` 를 한 칸에 접지 않는 것이 산출의 일부다** , 앞은 재봤는데 안 맞은 것이고 뒤는 잴 필드가 없는 것이다(findings F-11). 인수처: `id=60m2b-refcount-measurement-point` 가 닫히는 창 , 같은 뿌리(동결 HEAD 기준선)다 · id=60m3-divergence-refcount-structural
- **비발행 방향이 Outcome 의 문자열 토큰 하나로 켜진다 (m2c 실측 · 층위 6 잔여).** `m1.gates.mjs` `m2PublishedViolations` 는 M2 Outcome 이 `발행하지 않는다` 를 담는지로 요구 방향을 뒤집는다. 토큰은 문면 매치라 *뜻이 아니라 글자* 를 본다 , 무관한 문장이 우연히 그 어구를 담으면 방향이 뒤집힌다. **완화 방향의 우회는 닫혀 있다**: 토큰을 지우면 방향이 발행 요구로 돌아가 오히려 붉어지고, 토큰을 더해 방향을 뒤집으려면 `2r` 행이 `complete` 여야 한다(m2c `#3` 이 `2r=pending` 사본 rc 1 로 관측). 남은 것은 *강화 방향의 오탐* 뿐이며 그것은 게이트를 느슨하게 만들지 않는다. 정본 해소는 비발행을 문면이 아니라 **구조 필드**로 옮기는 것이고, 그것은 PRD 마일스톤 표 스키마 개정이라 이 창의 위임 밖이다. 인수처: PRD 표 스키마를 개정하는 창 · id=60m2c-nonpublish-token-surface
- **M2 인수처였던 발행 차단 이월 2건이 이 창에서도 닫히지 않고 다음으로 넘어간다 (m2c 실측).** `60m1-sha-unresolvable` 과 `60m1-adjudication-unproven` 은 둘 다 *M2 가 첫 실 sha / 첫 폐기 노드를 낼 때* 판정한다는 전제로 M2 를 인수처로 적었다. 그 전제가 깨졌다 , M2 는 확정 0건이라 **발행을 하지 않고** 종료했고, 판정 대상이 0인 채로 남는다. 두 행에 그 사실을 덧붙였고 인수처를 *revert 축에 새 확정이 생기는 창* 으로 옮겼다. **이 창은 그 둘을 닫을 자격이 없다** , 발행 0건인 창은 발행 차단 계약을 판정하지 못하며, 하네스 `#8` 이 닫힘 표식을 거부한다. 인수처: revert 축에 새 확정이 생기는 창 · id=60m2c-blocking-deferrals-carried
- **형제 하네스 3종이 착수 전부터 붉어 계획서 Task 6 의 *"네 하네스 전건 rc 0"* 전제가 거짓이었다 (m2c 실측 · 이 창의 인과 밖).** 이 창이 한 파일도 안 건드린 시점 실측: m1 5/10 (붉음 `verify.sh(rc 2)` `check1` `check3` `check4` `check6` `check7`) · m2 9/10 (`check7`) · m2b 7/10 (`findings` `golden` `tally`) · m3 13/13. 원인은 전부 이 창 밖이다 , `verify.sh --bootstrap` 만료(`60m3-m1-bootstrap-expired`) · `deferred_ref_targets` M2 재지정(`60m3-m1check6-deferred-residual`, **닫으면 m3 `#11`(a) 가 붉어진다**고 그 행에 못 박혀 있다) · golden·findings 를 후행 창이 움직임. 도달하려면 이 계획서 §NOT Building 이 금지한 일(`docs/_meta` 개정 · golden 재동결 · ownership 수정)을 해야 한다. **그래서 `#7` 을 회귀가 아니라 귀속으로 구현했다** , 기준선 실패 집합을 Task 0 커밋 blob 에 동결하고 현재 집합과 양방향 대조해 *이 창이 새 붉음을 만들지 않았는가* 만 판정하며, 이 창이 방향을 뒤집은 4검사(`m1:check10` `m2:check10` `m2b:prd` `m3:prd`)는 rc 0 을 강제한다. 계획서 Acceptance 의 해당 1줄은 사실과 다르다. 인수처: 형제 하네스의 회귀 기준선을 귀속 기준선으로 일괄 전환하는 창 , `60m2b-merge-reddens-golden` 과 같은 부류다 · id=60m2c-sibling-harness-baseline-red
- **게이트 봉인 후 계획서가 편집돼 receipt 두 장이 커밋 시점부터 stale 이었다 (마일스톤 6 종결 실측).** `mccp-plan-codex`(07:23:31Z) · `mccp-implement-codex`(07:39:09Z) 가 앵커 `sha256:82d7fff5…` 로 봉인됐는데 커밋 `d90a856` 의 계획서 blob 은 `sha256:74b67b7e…` 다. 계획서 이력에 커밋이 하나뿐이라 봉인 바이트는 어디에도 남아 있지 않다 , 구현 창이 봉인 뒤 본문을 더 고치고 재봉인 없이 함께 커밋했다. `stale` 에는 우회 env 가 없어 `/mccp:pr` 이 Phase 1.6 에서 막힌다. **조치**: tracked 덮어쓰기 가드가 지정한 경로(`use a NEW decision slug`)를 따라 슬러그 `insuniverse-docs-50-domain-m6-reseal` 로 두 게이트를 현재 본문에 재봉인했다. plan 게이트는 `/mccp:plan` Phase 5.2z 로 `plan-codex-runner.js` 를 실제로 돌렸고(`intent_gate_verdict=skipped` · `intent_skip_proof=codex_disabled` · `plan_digest=74b67b7e…`), implement 게이트는 Phase 2.5.6 의 write 만 돌렸다 , Phase 3 은 이미 완주했고 다시 걸으면 확정 산출물을 편집한다. 구 슬러그 두 장은 손대지 않았다(역사 기록이며 지금도 stale 로 읽힌다). **잔여**: `/mccp:pr` 의 슬러그는 브랜치에서 유도되므로 `insuniverse-docs-50-domain-m6-reseal` 로 손수 갈아끼워야 한다. 그리고 이 부류를 잡는 검사가 없다 , 어느 창의 하네스도 "계획서 해시 == receipt 앵커" 를 묻지 않아 봉인 후 편집이 조용히 통과한다. 인수처: 계획서↔receipt 앵커 검사를 게이트로 세우는 창 · id=50m6-receipt-anchor-drift
- **라운드 2 가 이 창에 없다 , 마일스톤 6 은 `in-progress` 로 남는다 (M6 UI2·UI3).** 종료 조건은 *표기가 2라운드 연속 0건* 이고 측정자가 사람이다. 이 창은 원장과 라운드 1 까지만 냈다. 라운드 1 결과는 수렴 계수(사실과다름+빠짐) 8 · 미검증 138 · ok 0 이며 검사 `#8` 이 두 계수를 따로 낸다. 인수처: 유지보수자 , 라운드 2 표기 · id=40m6-round2-pending
- **M1 하네스가 `적용 범위`·`예외·폴백`·`강제 지점` 을 어느 검사로도 읽지 않는다 (M6 라운드 1 실측).** m2~m5 는 각자 `check10` 이 그 세 절의 id 집합을 정책 집합과 양방향 대조하고 빈 칸 0 을 문다. M1 하네스 소스에는 `적용 범위`·`예외·폴백` 문자열이 0건이다. 결과로 `04-runtime-topology.md` 의 강제 지점 35 · 적용 범위 35 · 예외·폴백 53 = 123행이 미결박이고 원장에서 `미검증` 으로 표기됐다. 이 창이 기계로 확인한 것은 id 집합 정합(정책 35 == 강제 지점 35 == 적용 범위 35 · 예외·폴백 53행 전건이 정책 id · 누락 0)까지다. M1~M5 하네스는 종료된 창의 자산이라 이 창이 고치지 않는다. 인수처: M1 문서를 다시 여는 창 또는 이 축을 신설하는 창 · id=40m6-m1-unbound-common-sections
- **`--probe=history` 의 입력 계약이 `policy-doc@1` 뿐이라 관계 축 12종을 받지 못한다 (마일스톤 7 실측).** PRD §Success Metrics 는 연혁 조인 가능성의 측정자로 그 도구를 지목했는데, 12종을 그대로 넘기면 `ia-doc@1` 2종은 위치 인자 이전에 걸러지고 `flow-doc@1` 10종은 전건 `계약 부족  <경로>: template 이 policy-doc@1 이 아니다` 로 rc 1 이다. 지목이 도구 사정거리와 어긋난 것이며 도구를 넓히든 측정자 지목을 정정하든 정본이 정해야 한다. 이 창은 하네스가 조인을 독립 재현해 지표를 실측했고(217행 · matched 200 · orphan 17 · unknown 0) 그것은 우회이지 해소가 아니다. 해소 소유 축: `docs/_meta/verify/**` · `.claude/templates/doc-kit/**`. 회부 `R-50-4` (2)번 항목과 같은 건이다. 인수처: 없음 , 기록만 · id=50m7-probe-history-out-of-range
- **값 우연 일치가 산문 필드를 엣지 운반체로 승격해 빌드를 중단시킨다 (PR-Codex 라운드 1 · gpt-5.6-sol).** 운반체 채택이 `classified >= 1` 이라 `config.surface_exit_kinds` 의 `없음` 처럼 한국어 레코드의 흔한 부재 값 하나만 겹쳐도 그 필드가 통째로 후보가 되고 나머지 산문 전건이 미분류 fail-closed 를 때려 exit 1 이 된다. 정상 문서 편집 하나가 뷰어 출하를 막을 수 있다. 이 자리는 notes §이탈 1 이 잔여 위험으로 이미 적었고 로컬 리뷰 M2 가 실패 메시지에 승격 사유를 병기하는 것으로 흡수했다 , 조용하지 않다는 것이 그때의 판정 근거였다. Codex 판정은 그보다 강하다: 진단 가능해도 빌드는 멈춘다. 인수처: 운반 필드를 `lint-docs.mjs` 나 템플릿 계약에서 export 해 값 형태 유도를 대체하는 창 · id=70m4-value-shape-carrier-promotion
- **PRD Success Metric *리뷰 불일치 수렴 = 2라운드 연속 0건* 이 M7 종료 시점에도 미충족이다.** 라운드 1 수렴 계수가 8 이고 라운드 2 가 0 이어도 수열은 `8, 0` 이라 연속 0건 2회는 라운드 3 이 있어야 성립한다. M7 은 궤도의 두 번째 점을 실측으로 찍을 뿐 지표를 충족시키지 못하며, 게이트 `#13` 이 그 상태를 `미충족` 으로 출력한다. 인수처: 이 PRD 의 후속 창 , 라운드 3 원장을 세우는 첫 창 · id=40m7-round3-pending
- **`docs/_meta/findings/40-runtime-vendor-legal.md` 개설이 다섯 번째 창에서도 막혔다 (M7 Task 0 프로브 실측).** `golden.txt` 101행 `findings.files` 동결 8건에 이 파일이 없고, `verify.sh` 는 그 값을 `find docs/_meta/findings -maxdepth 1 -type f` 로 유도하므로 파일을 세우는 순간 유도 집합이 9가 돼 `--check` 가 어긋난다. 해소에 필요한 `verify.sh --update` 는 `docs/_meta/verify/**` 위임분이고 이 PRD 는 그 위임을 받지 않았다. 같은 golden 파일 95행 `ownership.inherited_additions` 는 반대로 이 파일을 이미 싣는다 , 한 파일 안에서 두 키가 서로 반대를 말한다. 인수처: `00-protocol` 의 golden 개정 위임을 받는 창 · id=40m7-findings-file-still-blocked
- **이 원장을 읽는 두 소비기의 파싱 규칙이 정확히 반대라 어느 쪽에서도 전건이 보이지 않는다 (M7 게이트 `#12` 실측).** mccp `derive/sources/backlog.js` 는 표 헤더를 찾아 그 **아래**만 스캔하고, 저장소 `docs/_meta/verify/fixtask-projection.mjs` 의 `parseBacklogRow` 는 행이 날짜로 **시작**할 것을 요구해 헤더 **위**만 읽는다. 이 PRD 행 기준 각각 43·21 이고 교집합은 0 이다. 두 파서의 통일은 한쪽이 저장소 밖(mccp)이고 다른 쪽이 `docs/_meta/verify/**` 소유라 이 PRD 범위 밖이다. 인수처: `00-protocol` , `docs/_meta/verify/**` 개정 위임을 여는 창 · id=40m7-backlog-parser-split
- **`#7a` 가 gate 값의 형태와 실재만 보고 그 검사가 그 행을 실제로 덮는지는 묻지 않는다 (PR-Codex 라운드 1 · gpt-5.6-sol).** 검사는 `<하네스키>#<검사이름>` 정규식과 그 하네스 서브커맨드 열거의 실재 두 가지만 본다. 그러므로 미검토 행에 무관한 실재 검사명(예 `m6#check1` , `--help` rc 검사)을 적어도 통과하고, `#8` 의 표기 요구는 `gate === null` 인 행에만 걸리므로 그 행은 리뷰 분모에서 조용히 빠진다. 즉 `#8` 이 내는 `미검증 127 · 수렴 계수 1` 은 저작이 성실하다는 전제 위에서만 참이다. 실측으로 현재 원장에서 오귀속은 확인되지 않았다(결박 770건 전건이 형태·실재 통과). 해소는 검사마다 자기가 덮은 행 id 를 내고 원장 집합과 양방향 대조하는 축이며, 13검사 전건의 출력 계약을 바꾸는 새 축이라 이 창에서 열지 않는다. 인수처: 리뷰 원장을 다시 여는 창 · id=20m6-gate-binding-is-not-coverage
- **릴리스 내용(`p1..p2` 델타)의 균일 유도가 부모 토폴로지 때문에 불가하다 (m4 실측).** 3저장소 `rev-list --first-parent <locked prod tip>` 재유도상 `prod_merge` 45건의 사슬 적중이 넷으로 갈린다 , server `(1,1,0)` 24 · site `(0,0,1)` 7 · admin `(0,0,1)` 10 · admin `(0,0,0)` 4. `p1` 이 사슬 밖인 것이 21건이고 그중 4건은 두 부모가 다 사슬 밖이다. `parents_on_prod_first_parent` 로 방향을 갈라 쓰는 우회가 남지만 그 필드가 빈 4건에는 답이 없고, 빈 값을 한쪽으로 채우는 것은 추론의 사실화(UI3)다. 그래서 `01-timeline.md` 는 릴리스 시점과 제목만 싣는다. 인수처: 없음 , 저장소 밖 증거(CI·PR 메타데이터)가 생기거나 부모 토폴로지가 균일해지는 시점까지 구조적으로 해소 불가이며 그것이 판정이다 · id=60m4-release-content-topology
- **연대기가 이력 708일 중 13일만 덮어 Q28 의 시점 축이 이 문서로 닫히지 않는다 (m4 실측).** 릴리스 노트 커밋 45건은 8일(`2026-06-06` ~ `2026-06-19`, 폭 13일)에만 있고 `commits.<repo>.jsonl` 3파일은 `2024-08-27` ~ `2026-08-05` 폭 708일 · 6,190행이다. 그 6,190행 중 릴리스 창 안이 264행이고 창 밖이 5,926행이다. `01-timeline.md` 는 창 밖에 대해 어떤 주장도 하지 않으며 태그 0 · `refs/replace` 0 이라 다른 축을 대신 세울 수도 없다. 인수처: 형제 문서 `## 연혁` 절(`13-relation-contract` M5 의 `anchors[]` 계약) · 이 PRD 마일스톤 5 `02-epics.md` , 두 자리가 창 밖 구간의 시점 역추적을 나눠 진다 · id=60m4-timeline-coverage-gap
- **2단 빌드가 최종 자리에 바로 발행해 실패 시 롤백 경계가 없다 (Plan-Codex 라운드 1 · gpt-5.6-sol).** 앞단이 `anchor-freshness.json` 을 최종 산출 디렉터리에 먼저 쓰고 뒷단 `build-docs.mjs` 가 HTML 과 색인을 점진적으로 덮으므로, 뒷단이 중간에 죽으면 새 앵커 데이터 옆에 옛 지면이 남고 독자는 내부적으로 어긋난 뷰어를 계속 읽는다. 게이트는 non-zero 만 보고할 뿐 이전 완전 산출을 보존하지 않는다. **마일스톤 6 이 절반을 닫았다** , Task 4 의 프로브 선행이 형식 위반을 산출 이전으로 옮겨 그 경로에서는 한 바이트도 쓰이지 않는다. 남는 절반은 비-형식 실패에서의 부분 발행이며, 스테이징 디렉터리 + 사후 교체가 필요하고 Windows 에서 기존 디렉터리 위 교체는 원자가 아니라 2단 스왑이라 그 스왑 자신의 실패 창을 갖는다. `70m4-shrinking-rebuild-leaves-stale-pages` 와 **같은 구조 축**이고 두 행은 같은 창에서 함께 닫아야 한다. 인수처: 산출 발행을 스테이징 + 교체로 바꾸는 창 , ABSORBED-M8 2026-08-31: 두 생성기를 `<out>/.staging/<runId>` 에 돌리고 성공 뒤에만 락 아래에서 소유 집합을 교체한다. 뒷단 실패는 스테이징만 버리고 live 를 한 바이트도 안 건드린다(검사 `#4`). 교체 중간의 잡을 수 있는 실패는 저널을 역순으로 되돌린다(`#9`). Windows 2단 스왑 자신의 실패 창은 per-move WAL + 출발지·목적지 실재 기반 복구로 멱등이 됐다(`#15`) · id=70m6-two-stage-publish-no-rollback
- **두 단계가 가변 문서 트리를 다시 읽어 낡은 앵커 상태를 출하한다 (Plan-Codex 라운드 8 · gpt-5.6-sol).** `gate.mjs build` 는 앵커 생성기(약 5.4초)와 문서 생성기를 잇달아 돌리고 둘 다 문서 트리를 각자 다시 읽는다. 그 사이에 문서가 저장되면 두 단계가 서로 다른 입력을 본다. 현행 `--freshness` 대조는 `{doc, axis, item}` **집합**만 보므로 같은 항목의 `anchors` 값만 바뀐 경우 집합은 그대로 일치하고, 새 문서 내용에 이전 앵커 상태가 결합된 산출이 rc 0 으로 나간다 , 조용한 정합성 실패다. 크기는 작다(1단계 전 문서 트리 digest 를 재고 2단계 직전 다시 재어 갈리면 이름 있는 실패). **이 라운드에서 못 들인 이유**: plan-codex 게이트가 리뷰와 봉인 사이의 계획서 본문 변경을 `incomplete` 로 막아, 흡수는 매번 재진입 라운드를 요구하고 라운드 1~7 이 이미 그 경로를 돌았다. `70m6-two-stage-publish-no-rollback` 과 같은 **체인 정합** 축이며 두 행은 함께 닫는 것이 맞다. 인수처: 산출 발행 축을 여는 창 , ABSORBED-M8 2026-08-31: 선언된 입력(문서 트리 `.md` 전건 · `docs/_meta/template-config.yaml` · `docs/_meta/extraction-manifest.yaml`)의 digest 를 앞단 전 · 뒷단 전 · 교체 전 세 번 재고 갈리면 이름 있는 실패로 멈추며 스테이징을 버린다. 항목 집합 대조가 못 보는 값 변화를 이 fence 가 문다 , 검사 `#7` 이 `pre-lock` barrier 로 시간에 기대지 않고 주입한다 · id=70m6-mutable-docs-between-stages
- **동시 빌드는 앵커 중간산출뿐 아니라 산출 디렉터리 전체를 공유한다 (Implement-Codex 라운드 1 · gpt-5.6-sol).** 마일스톤 6 이 실행별 freshness 이름으로 닫은 것은 앵커 중간산출 한 파일뿐이고, `build-docs.mjs` 는 여전히 같은 `--out` 아래에 문서 지면·색인·검색 데이터·metrics 를 순차로 쓴다. 서로 다른 저장소 팁이나 문서 스냅숏을 가진 두 게이트가 겹치면 그 파일들이 교차로 섞이고, 그 뒤 서로 다른 정본 freshness JSON 을 승격하려 다툰다 , 지면과 앵커 데이터가 어긋난 뷰어가 rc 0 으로 남는다. 잠금을 두지 않는다는 마일스톤 6 의 결정(Task 4)이 이 경로를 연 채로 둔다. **새 축이 아니라 `70m6-two-stage-publish-no-rollback` 의 확장이다** , 그 행은 실패 시 부분 발행을 적었고 이 행은 성공한 동시 발행도 같은 자리에서 깨진다는 관측을 더한다. 두 행은 함께 닫는다. **id 는 공유하지 않는다** , 같은 축이라도 id 로 키잉하는 소비기는 두 행 중 하나를 잃는다. 인수처: 산출 발행을 실행별 스테이징 디렉터리 + 직렬화된 교체로 바꾸는 창 , ABSORBED-M8 2026-08-31: `mkdir` 원자성 락 + 소유자 pid 생존 판정으로 발행자를 직렬화한다. 외부 호출은 대상이 무엇이든 보호 발행이라 마커 부트스트랩 구멍이 없고, 검사 `#16` 이 좌표 없는 기존 산출 트리에서 두 발행을 barrier 로 결정적으로 부딪혀 한쪽 거절과 live 의 섞임 0 을 잰다. **읽기 측 원자성은 안 닫았다** , 새 행 `70m8-reader-sees-torn-tree` · id=70m6-concurrent-publish-crosses-outputs
- **에픽 23건 중 18건의 "왜"가 등급 C 단독이라 서사로 승격할 수 없다 (m5 실측).** 저장소 자신의 등급표(`.claude/meta/01-meta-search-report.md` §4)가 Era A 커밋 제목을 *시점 추정용. 단독 근거 금지* 로 판정해 뒀고, 에픽별 최고 등급이 A 4 · B 1 · C 18 이다. 등급 A·B 가 닿는 5건만 등급 표기 서사를 쓰고 18건은 제목·모듈 축 재료만 싣는다. 보강할 축(등급 A·B 소스)이 그 18건에 닿지 않으므로 이 창에서 해소 불가다. 인수처: 마일스톤 6 이후 , `planning/` 밖 문서나 사람 구술처럼 등급 C 를 보강할 축을 찾는 창 · id=60m5-epic-why-grade-c-only
- **마일스톤 5 Outcome 의 *서사* 부분 개정과 §Open Questions 종결이 이 창 밖이다 (m5 실측).** Outcome 은 *"`feat/*` 8개 에픽의 '왜'가 서사로 남음"* 인데 `8개` 는 사실 정정으로 23 이 됐고, *서사* 는 등급표로 재면 5/23 에만 선다. 후자는 범위 축소라 승인 사항이고, 승인 신호를 이 저장소가 기계로 들고 있지 않다 , Outcome 문면과 OQ 체크박스가 둘 다 이 창이 쓰는 같은 PRD 안의 값이라 게이트가 그것으로 승인을 읽으면 자기 주장을 자기가 검사한다. 새 승인 아티팩트를 이 창에서 정의하는 것도 답이 아니다(INV4 , 선례가 없어 형식 자체가 검사 없는 규범이 된다). 게이트 `#13` 은 Task 0 blob 과의 귀속 diff 로 *이 창의 무변동* 만 판정해 후속 창의 승인된 개정을 막지 않는다. 인수처: 사용자 판정 , 경로 (a) Outcome 개정 · (b) 18건 서사 축 이월 · id=60m5-outcome-change-out-of-window
- **제목 축 23 에픽이 server 도메인 51 중 31만 덮고 20이 결손이다 (m5 실측 · F-23).** 에픽 발견 축은 제목 하나뿐이라 세 정규식에 맞지 않는 방식으로 들어온 작업은 모집단에서 사라진다. 파일경로 축으로 독립 유도하면 `fax` 53 · `disease` 45 · `medication-standard` 31 을 포함한 20 도메인이 에픽 축 밖이고, 그중 셋은 상위 에픽에 필적하는 규모다. 게이트 `#9` 가 결손을 이름으로 양방향 대조하고 문서가 그것을 자기 고지로 싣지만, **결손 도메인이 왜 랜딩 없이 갔는지는 판정하지 않는다** , 이 문서의 축으로는 볼 수 없다. site·admin 은 `modules/` 대응물이 없어 대조 자체가 성립하지 않는다. 인수처: 없음 , 제목 축의 구조적 한계이며 다른 발견 축을 세우는 것이 별건이다 · id=60m5-epic-axis-domain-gap
- **`BASE` 가 허용 밖 경로를 건드린 커밋을 지나 전진할 수 있고 네 단언이 그 전진을 통과시킨다 (Implement-Codex 라운드 1 · gpt-5.6-sol).** `BASE` 유일화 등식 `BASE == WINDOW_START^` 에서 `WINDOW_START` 는 *그 커밋부터 `HEAD` 까지 전 커밋이 허용 경로만 건드리는 가장 이른 커밋* 이므로 **움직이는 접미 경계**다. 허용 목록 밖 경로를 건드린 커밋 X 가 창 안에 생기면 가장 이른 깨끗한 접미가 X 뒤로 밀리고, 그때 하네스의 `BASE` 리터럴을 새 `WINDOW_START^` 로 올리면 네 단언이 전건 통과하면서 X 와 그 앞의 이 창 커밋들이 검사 구간에서 통째로 빠진다 , `#6`·`#12`·`#13` 이 전진한 기준선 위에서 초록이 된다. 권고(receipt `base_sha` 를 판정 축으로 결박)는 계획서 §GROUND 가 이미 판정해 기각한 경로다 , 그 값은 봉인 시점 `HEAD` 라 흡수마다의 재봉인이 앵커를 창 안으로 옮긴다. 값싼 절반은 이 창이 닫는다: F-29 가 경계를 미는 원인을 *면제 목록 확대* 와 *허용 밖 커밋* 둘로 적고 `#13` 이 `BASE..HEAD` 커밋 목록을 경로와 함께 출력해 전진이 diff 와 게이트 출력 양쪽에 남는다. 무거운 절반(외부 불변 앵커)은 이 저장소에 CI 도 보호 ref 도 없어 구조적으로 해소 불가이며, 앞 창들이 같은 축으로 올린 앵커 이월과 같은 부류다. 인수처: 외부 앵커(보호 ref·CI)가 생기는 시점 · id=60m6-base-can-advance-past-violation
- **`verify.sh --update` 가 저장소 전체에서 불가하다 , 온보딩 커버리지 게이트가 문서 PRD 5종을 요구하는데 4종만 남았다 (m6 실측).** `verify.sh` 는 `ls .claude/prds | sed -nE 's/^insuniverse-docs-([2-6]0-[a-z-]+)\.prd\.md$/\1/p'` 로 하류 문서 PRD 를 유도하고 그 계수가 정확히 5가 아니면 `문서 PRD 를 5종 추출하지 못했다` 로 rc 1 을 낸다. 40축 PRD 가 완료되어 `archived/` 로 옮겨진 뒤(이 창보다 앞선 커밋) 실제 계수는 **4**다 , 20 · 30 · 50 · 60. 70축은 정규식 `[2-6]0` 밖이라 애초에 세어지지 않는다. 그래서 `--update` 도 `--check` 도 그 지점에서 떨어지고, golden 재동결의 정식 경로가 **`BASE` 시점부터** 막혀 있다. 이 창은 `--update` 가 그 키에 쓰는 것과 같은 알고리즘으로 `fixtask.findings_headings` 한 키를 재유도해 갱신했고 검사 `#12` 가 변동 키 집합과 `index.*` 3키 불변을 양방향으로 문다. 해소는 두 갈래다 , 정규식을 archived 를 아는 형태로 고치거나, 계수 5를 `.claude/prds/**` 실측에서 유도하는 것. 둘 다 `verify.sh` 상시 층 개정이라 이 PRD 의 위임 밖이다(UI13). 인수처: `00-protocol` , `verify.sh` 소유 창 · id=60m6-verify-update-blocked-by-prd-count
- **게이트 결박 술어가 무관한 실재 검사를 축복한다 (Implement-Codex R1 F2).** 원장 `gate` 결박은 그 하네스가 읽는 문서 집합에 그 행의 `doc` 이 들고 그 검사 설명에 `kind` 축이 들면 통과인데, 그것은 *그 검사가 그 행을 실제로 읽는다* 를 증명하지 않는다. `#8` 은 `gate: null` 행만 표기를 요구하므로 무관한 실재 검사 하나가 주장 하나를 사전검토에서 지운다. 이 계획서 `#7` 기대와 Acceptance 가 이미 사각지대로 공시했고 완전 해소는 검사별 커버리지 증거 , 검사에서 문서 집합으로, 다시 행 id 로 가는 사상 , 를 요구한다. 인수처: 마일스톤 종료 창
- **저장소 공용 게이트가 red 이고 이 PRD 가 고칠 수 없다 (관측 2).** `verify.sh --check` 가 rc=1 이며 원인은 `docs/_meta/verify/verify.sh` 1902~1904행 의 *문서 PRD 5종* 단언이다 , 정규식이 `[2-6]0` 이라 70축을 세지 않고 40축 PRD 는 archived 로 옮겨져 재열거값이 4다. PRD §Success Metrics 의 *트리 정합* 행이 결박한 명령이므로 그 지표는 마일스톤 8 에서 **미충족**이다. 수정 대상 경로가 `docs/_meta/verify/**` 이고 `docs/_meta/ownership.md` 184행 이 그 슬롯을 `20-foundation-access` 앞으로 상태 `진행` 으로 열어 둬 이 PRD 는 새 위임 행을 세우지 못한다. 인수처: 그 경로의 소유 PRD
- **공용 검증기의 조기 실패가 뒤 네 게이트를 통째로 가린다 (관측 14).** `verify.sh` 3052행 이 `run_onboarding_gate` 뒤에 단락 연산자가 붙어 rc 가 0 이 아니면 즉시 return 1 이라 3055·3058·3066·3070행 의 index·ownership·lint-coverage·fixtask 네 게이트가 아예 돌지 않는다. 그중 `run_ownership_gate` 는 이 PRD 가 직접 건드리는 축이라 그 축의 회귀를 저장소 게이트로 확인할 수 없다. 계획서는 `verify.sh --check` 로부터 어떤 저장소 전역 회귀 보증도 주장하지 않으며 `check0` 의 `#0b` 가 침묵 구간을 이름으로 낸다. **판단 요청**: 소유자의 수정을 마일스톤 선행 의존으로 걸지 말지는 사용자 몫이다 , 걸면 종료 조건이 이 PRD 가 통제하지 못하는 조건이 된다
- **정본 후보 축 1637행 중 278행이 9문서에 안 닿는다 (관측 13).** `policy-candidates.code.jsonl` 을 읽기 전용으로 재열거하면 이 PRD 축(contract·data·value)이 1637행이고 경로 입도로 덮음 1359 · 미덮음 278(contract 255 · value 23)이다. 그 덮음의 1265 가 `insuniverse-server/drizzle/schema.ts` 한 경로에서 나오므로 그 경로 밖은 덮음 94 미덮음 278 이다. `check13` 이 그 계수를 매 실행 공시하고 **0 으로 접지 않는다**. 판단 요청: 미덮음이 정책적 의미가 없어 안 실린 것인지, 아니면 문서가 놓친 것인지는 유지보수자 몫이다
- **유지보수자 라운드 원장 체이닝이 아직 없다.** 마일스톤 종료 조건은 *리뷰 불일치가 2라운드 연속 0건* 이고 측정자가 유지보수자다. 이 창은 `round: 0` 사전검토만 냈고 `check8` 의 `#8b` 는 원장의 `round` 전건이 0 임만 증명한다 , **뒤에 올 두 판정이 서로 다른 라운드인지는 그 검사의 사정거리 밖이다**. 설계는 `prior_ledger_sha256` · 후보 집합 digest · 순차 종료 게이트 셋이며 옳지만, 사람이 쓰지 않은 원장을 검사가 요구하는 상태가 되므로 이 창이 만들지 않았다. 인수처: 마일스톤 종료 창 · **인수: 마일스톤 9** , 스키마(`meta` 의 `prior_ledger`·`prior_ledger_sha256`·`candidate_set_digest`·`round`·`maintainer_provenance`)와 검증기(`insuniverse-docs-30-contracts-limits-m9.gates.mjs` 의 `verify-chain`)와 첫 실사용(그 창의 판정 원장이 앞 원장을 가리키는 `round: 0` 체인 앵커)까지 냈다. 마일스톤 8 이 미룬 이유인 *사람이 쓰지 않은 원장을 검사가 요구하는 상태* 는 검증기를 원장 실재와 분리해 피했다 , 부재는 통과이고 계수로 공시한다. **라운드 자체는 사람 몫으로 남는다** · 원장 `carry-462`
- **온보딩 3문항의 화면 표시 축이 이 9문서로 답해지지 않는다 (관측 11).** Q30·Q32·Q37 은 *site 와 admin 이 그 코드를 각각 어떻게 표시하는가* · *남은 대기 시간이 표시되는가* · *정산 뒤 취소의 분기* 를 함께 묻는데 그 축은 `50-domain` 배타 소유다. 값·단위·응답 코드까지는 이 PRD 문서가 담지만 표시 축은 담지 못한다. 원장 `onboarding` 행에 좌표 대신 **차단 사유**로 적었고 `check10` 이 좌표·차단·O/X 미기입 세 계수를 따로 낸다 , 차단은 통과가 아니다. 인수처: 화면 축 소유 PRD
- **[부분 해소]** `#7a` 가 gate 값의 형태와 실재만 보고 그 검사가 그 행을 실제로 덮는지는 묻지 않던 축을 마일스톤 7 이 **부분만** 닫았다. m6 네 검사(`check5`·`check6`·`check9`·`check10`)가 판정한 원장 행 id 를 실행 중에 수집해 `covered` 부수 채널로 내고, M7 `#4` 가 원장 `gate` 매핑과 **양방향** 대조한다 , 736건(95.6%)이 실행 관측으로 실증됐다(실측). **닫지 않은 것은 나머지 34건이다.** 그 행들의 `gate` 하네스키는 방출자 집합 밖(`m1#check5` 3 · `m3#check9` 8 · `m4#check13` 12 · `m5#check17` 11)이고, 선행 하네스 넷에 방출 경로를 붙이려면 그 검사 본문을 유도부와 단언부로 쪼개야 하는데 그 편집이 m6 `#0a` 의 부류 토큰 단언 사정거리에 들어간다. 그래서 잔여를 숨기지 않고 m6 `#8` 의 **셋째 계수**(`커버리지 미실증 결박 34`)로 매 실행 드러낸다. 인수처: 선행 하네스 넷의 출력 계약을 여는 창 · id=20m6-gate-binding-is-not-coverage
- **사용자 결정 필요 , `docs/_meta/ownership.md` 자기 위임 행이 누락돼 있다.** 그 파일을 쓴 형제 셋(`13`·`30`·`60`)은 전부 §개정 위임 표에 자기 행을 갖는데 `20` 앞으로는 없다. `git log -L 184,184:docs/_meta/ownership.md` 가 그 행을 고친 커밋 셋을 내고 전부 이 PRD 의 마일스톤 커밋이다(`00b99f3` M5 · `9a7a7e7` M4 · `17b296c` M3) , 즉 쓰기는 있었고 위임 행만 없다. **신설의 값을 실측했다.** 상태 3건만 옮기면 m6 `check0` 이 rc 0 (기대 12건 == 실측 12건 · 새 붉음 0건)이지만, 여기에 자기 위임 행을 더하면 rc 1 이고 새 붉음이 **5건**이다 , `m1#check6` · `m2#check11` · `m3#check12` · `m4#check16` · `m5#check20`. 다섯 창이 전부 *위임받은 PRD 가 20 인 행은 3개* 를 리터럴로 물기 때문이다(첫 문면 `check6 FAIL: delegation rows=4`). 선택지는 둘이다 , (가) 행을 신설하고 다섯 하네스의 행 수 리터럴을 함께 유도로 바꾼다(편집 6자리 · 앞 창 하네스 5개 수술) · (나) 신설하지 않고 드리프트를 문서로 남긴다(현행 · 형제 셋과 형식이 어긋난 채로 유지). 마일스톤 7 은 값을 매긴 채 (나)를 유지하고 판정을 사용자에게 올린다. 인수처: 사용자 결정 후 그 결정을 집행하는 창 · id=20m7-ownership-self-row-missing
- **정본 후보 미덮음 278행 중 196행이 미판정으로 남는다 (m9 실측).** 마일스톤 9 는 §User Intent UI5 로 **표본까지**만 판정했다 , 상위 다섯 경로 82행(모집단의 29.5%)을 원장 `sample` 부류로 판정했고 나머지는 손대지 않았다. 표본 판정 어휘는 `정책성 없음`·`문서가 놓침`·`판정 불가` 셋이고 이 창의 결과는 정책성 없음 4 · 판정 불가 1 이다. 전수 판정은 동결 pin 에 맞춘 인덱스 재생성을 요구하고 그 경로는 인덱스 축 PRD 소유다. 인수처: 미덮음 전수 판정을 여는 창 · id=30m9-uncovered-population-remainder
- **게이트 결박의 행 id 결속이 여전히 없다 , 열린 이월의 계승 (m9 실측 · 입도 축약 실측 동봉).** 마일스톤 9 의 검사 `#7` 은 결박된 검사를 **실제로 실행해** 그 행의 `doc`+`subject` 가 표준출력에 등장하는지 보지만, 그 입도는 행 id 가 아니다. 실측: 결박 행 958개가 `doc`+`subject` 조합 328개로 접히고 둘 이상이 든 군이 149개, 최대 군이 70개다 , 한 검사의 평범한 출력 한 줄이 최대 70행을 축복할 수 있다. 행 id 결속은 앞 하네스들이 행 id 를 출력하도록 고쳐야 가능하고 그것은 종료된 창의 자산이다. 마일스톤 9 는 이 사각지대의 **크기만 재고** 닫지 않았으며 그 사실이 원장 `carry-454` 에도 `open` 으로 서 있다. 인수처: 앞 창 하네스에 행 id 출력을 신설하는 창 · id=30m9-gate-binding-row-id
- **유지보수자 라운드 두 번이 이 창 밖이다 (§User Intent UI3).** 마일스톤 9 는 체이닝 스키마·검증기·첫 앵커 원장까지 냈고 라운드를 0회 냈다. 순차 종료 술어는 *`round>=1` 이고 `maintainer_provenance` 를 가진 원장 둘이 연속이고 그 둘의 `candidate_set_digest` 가 같고 양쪽 `mark` 에 `사실과다름`·`빠짐` 이 0건* 이며, 현재 그 분모는 0 이다 (앵커는 분자에도 분모에도 들지 않는다). 검사 `#6` 이 앵커 수와 라운드 수를 **따로** 내어 이 부재를 매 실행 공시한다 , 부재는 FAIL 이 아니다. 측정자가 사람이므로 이 저장소가 기계로 만들 수 없는 잔여다. 인수처: 유지보수자 · id=30m9-maintainer-rounds-outstanding
- **발행 차단 이월 2건이 이 창에서도 해소되지 않는다 (m7).** `60m1-sha-unresolvable` (R-4 `sha` 가 형태만 검사되고 실재 커밋으로 해석되지 않는다)와 `60m1-adjudication-unproven` (`deprecated[]` 멤버십이 *판정 완료* 를 뜻하는데 `reason` 비어 있지 않음만 통과한다) 둘 다 열린 채다. 이 창의 재판정 결과가 **확정 폐기 0건**이라 `deprecated[]` 가 비고, 실 노드 0건에서는 판정 레코드 결속을 세울 수 없다 , 두 이월이 요구하는 증명 대상 자체가 없다. 따라서 `docs/99-deprecated/` 발행 조건은 그대로 닫혀 있고 이 창은 아무것도 발행하지 않았다(게이트 `#8`). id=60m7-publication-blockers-still-open
- **golden 재동결이 공용 검증기의 선재 결함으로 차단됐다 (m7 실측).** 이 창은 자기 findings 표제를 31 → 37 로 늘렸으므로 `fixtask.findings_headings` 가 움직여야 하는데, `bash docs/_meta/verify/verify.sh --update` 가 rc 1 로 죽어 기록을 남기지 못한다. 원인은 그 스크립트 1902~1904 행의 *문서 PRD 5종* 단언이다 , 열거 정규식이 `[2-6]0` 이라 `70-viewer` 를 안 세고 `40-runtime-vendor-legal` 은 archived 로 빠져 재열거값이 4다. `.claude/prds/` 파일 집합은 이 창의 `BASE` 와 동일하므로 원인은 창 밖이며, 같은 축이 이미 HIGH 로 열려 있다(공용 게이트 red · 인수처 `20-foundation-access` 앞 `docs/_meta/verify/**` 위임). 이 PRD 의 `docs/_meta/verify/**` 위임 사유는 `--update` 재동결 한정이라 스크립트 수정은 위임 밖이다(UI15). 게이트 `#13` 은 차단을 팔 B 로 기계 증명하고 golden 을 손대지 않았음을 함께 문다 , 상류가 정규식을 고치면 팔 A 로 자동 복귀한다. id=60m7-golden-refreeze-blocked
- **`#14` 의 계획서 술어와 구현이 갈리고 Acceptance 두 항이 실측에 반증된다 (m7 리뷰 실측).** 계획서 §Validation `# 검사 #14:` 는 *"신규 붉음 1건이면 실패다"* 로 적었으나 하네스는 신규 붉음을 **귀속으로 통과**시킨다 , 선언 토큰 보유 또는 `OQ 원소` 문면 + PRD 에서 기존 원소 축자·순서 보존 재유도, 두 부류다. 실행 결과는 `신규 3 전건 귀속 {m5:prd(OQ신설 9→10) m6:ledger(선언 6) m6:sibling(OQ신설 9→10)} · 해소 {}` 이고, 그래서 Acceptance 의 *"앞 창 8하네스 재실행의 신규 붉음이 0 이고, 해소는 m6:prd 한 건뿐"* 은 두 절이 다 거짓이다. 해소가 0 인 이유는 `m6` 의 `prd` 가 `CHAIN_BASELINE.m6` 에 애초에 없어서다 , `BASE` 시점에는 이 PRD 마일스톤 7 행이 pending 이라 그 검사가 초록이었고, 이 창이 고쳐도 *사라진 붉음* 으로 잡히지 않는다. 계획서는 `plan_hash` 결박이라 이 창에서 못 고친다. 다음 창이 술어를 *귀속 통과* 로 다시 쓰고 Acceptance 를 실측 형태로 바꿔야 한다. id=60m7-chain-predicate-diverges-from-plan
- **`#14` 고유 로직에 음성 프로브가 0건이고 해소 인과 필터는 한 번도 실행되지 않았다 (m7 리뷰 실측).** `MUTATIONS` id 14 는 `cmd` 가 `golden` 이라 두 검사가 공유하는 `baseAssert` 축만 겨눈다 , 사유는 주석이 밝힌다(`chain` 은 형제 8하네스를 인자 형태 전건으로 돌아 사본·실 트리 2회 실행이 완주 불가다). 그래서 `chain` 만의 로직 , 형제 재실행 · 기준선 양방향 대조 · **신규 붉음 귀속 필터** · 해소 인과 필터 , 은 변조 프로브 대상이 아니다. 계획서 `#15` 술어는 *"기능 서브커맨드 #1~#14 각각에 대해 사본을 변조해 실제로 돌린다"* 라고 적어 이 예외를 담지 않는다. 더구나 실행 결과가 `해소 {}` 라 인과 필터(행 동결 진단 정규식 · 자기 행보다 뒤인지의 순서 비교 · `BASE` 시점 사본 재실행)는 한 줄도 안 돌았다 , 지금의 초록은 그 구간에 대해 아무것도 말하지 않는다. 값싼 절반은 형제 1종만 도는 축소 모드를 두고 그 모드에 프로브를 붙이는 것이다. id=60m7-chain-logic-unprobed

</details>
위험 (26): 테스트 발송이 실 Google Chat 으로 나간다 · admin `npm run lint` 가 사전 파손 상태다 · jest 가 Redis 6380 없이 떨어진다

<details>
<summary>+23 더보기</summary>

- `destinationsFor` 에 빈 finding 을 넘기면 `channelHint` 분기가 예상 밖으로 돈다
- CSS 중복이 나중에 갈린다
- `treat-vendor` 가 OFF 라 테스트 화면에서 오해를 부른다
- 환경 라벨 제거 후 **배포별 fail-closed 경계가 0**이 된다
- 테스트 문면이 실제 문면이라 수신자가 진짜 장애로 읽는다
- 합성 menuItem 이 다른 경로의 브레드크럼을 흔든다
- ms↔초 · 0~1↔% 왕복에서 값이 흔들린다
- 환경 라벨 제거가 spec 4파일을 깨서 회귀가 섞인다
- KV 편집기가 빈 키·중복 키를 직렬화해 값을 덮어쓴다
- `Collapsed` 재작성이 다섯 표의 렌더를 바꾼다
- 게이트 `#7` 의 표제 문자열 검사가 문구를 조금만 바꿔도 통과한다
- `positionStrategy="fixed"` 가 실제 팝오버에는 안 먹는다 (프로브는 raw div 였다)
- `react-tooltip` 기본 스타일이 `.al-tip-pop` 을 특이도로 이긴다
- 공유 호스트 `render` 가 `activeAnchor` 키를 못 찾아 빈 팝오버가 뜬다
- 비활성 탭이 `--al-ink` 라 활성/비활성이 덜 갈린다
- `--al-sub` 를 쓰는 다른 자리(마커·라벨)도 3:1 대인데 이번에 안 건드린다
- **이 계층이 mccp 개선의 대체재가 되어 상류가 안 고쳐진다**
- mccp loop review 가 "표준 이탈" 을 blocker 로 올려 계층이 해체된다
- 규칙이 형식만 봐서 "명령 ≠ 게이트"(층 3)를 못 잡는다
- `PL10` 완전성 어휘 오탐이 잦아 규칙 전체를 무시하게 된다
- 마커 규약이 기존 계획서와 불일치
- 소급 적용으로 `plan_hash` stale
- 규칙 10개가 저작 부담이 되어 라운드보다 비싸진다

</details>

다음: 대기

진행 중 마일스톤 (worktree별):

- 🚫 차단됨 · feat/monitoring-alert-review · implement-codex ⚠ · 8분 전
- 🚫 차단됨 · feat/admin-rbac · implement-codex ⚠ · 50분 전
- 🚫 차단됨 · docs/security-structure-research · pr-codex ⚠ · 4일 전
- … 외 +5 (활동 · 기록 참조)

---

## 파이프라인

- `insuniverse-docs-30-contracts-limits-m6-reseal7` · plan ◐ → impl ◐ → pr ⚠
- `insuniverse-docs-00-protocol-m4` · plan ◐ → impl ⚠ → pr ○
- `insuniverse-docs-70-viewer-m9` · plan ✓ → impl ◉ → pr ○
- `insuniverse-docs-30-contracts-limits-m8` · plan ✓ → impl ◐ → pr ◐
- `insuniverse-docs-60-history-deprecated-m6` · plan ✓ → impl ◐ → pr ○
- `insuniverse-docs-60-history-deprecated-m5` · plan ✓ → impl ✓ → pr ◐
- `insuniverse-docs-30-contracts-limits-m7` · plan ✓ → impl ◐ → pr ✓
- `insuniverse-docs-20-foundation-access-m7` · plan ✓ → impl ◉ → pr ○
- `insuniverse-docs-70-viewer-m6` · plan ◐ → impl ◐ → pr ◐
- `insuniverse-docs-60-history-deprecated-m4` · plan ✓ → impl ✓ → pr ◐
- `insuniverse-docs-40-runtime-vendor-legal-m7` · plan ✓ → impl ✓ → pr ◐
- `insuniverse-docs-20-foundation-access-m6` · plan ✓ → impl ✓ → pr ◐
- `insuniverse-docs-30-contracts-limits-m6-reseal6` · plan ◐ → impl ○ → pr ○
- `insuniverse-docs-30-contracts-limits-m6-reseal5` · plan ◐ → impl ○ → pr ○
- `insuniverse-docs-30-contracts-limits-m6-reseal4` · plan ◐ → impl ○ → pr ○
- `insuniverse-docs-30-contracts-limits-m6-reseal3` · plan ◐ → impl ○ → pr ○
- `insuniverse-docs-30-contracts-limits-m6-reseal2` · plan ◐ → impl ○ → pr ○
- `insuniverse-docs-30-contracts-limits-m6-reseal` · plan ◐ → impl ◐ → pr ○
- `insuniverse-docs-30-contracts-limits-m6` · plan ✓ → impl ◐ → pr ◐
- `insuniverse-docs-70-viewer-m4-ship` · plan ✓ → impl ✓ → pr ◐
- `insuniverse-docs-70-viewer-m4` · plan ✓ → impl ◉ → pr ○
- `insuniverse-docs-70-viewer-m3` · plan ✓ → impl ◉ → pr ○
- `insuniverse-docs-50-domain-m6` · plan ✓ → impl ◉ → pr ○
- `insuniverse-docs-20-foundation-access-m5` · plan ✓ → impl ◉ → pr ○
- `insuniverse-docs-60-history-deprecated-m3` · plan ✓ → impl ◉ → pr ○
- `insuniverse-docs-40-runtime-vendor-legal-m4` · plan ◐ → impl ✓ → pr ✓
- `insuniverse-docs-60-history-deprecated` · plan ◐ → impl ○ → pr ○
- `insuniverse-docs-40-runtime-vendor-legal` · plan ◉ → impl ○ → pr ○
- `insuniverse-docs-50-domain-m1` · plan ◐ → impl ⚠ → pr ✓
- `insuniverse-docs-20-foundation-access-m1` · plan ◐ → impl ◐ → pr ✓
- `insuniverse-docs-60-history-deprecated-m1` · plan ◐ → impl ◐ → pr ◐
- `insuniverse-docs-40-runtime-vendor-legal-m1` · plan ✓ → impl ◐ → pr ✓
- `insuniverse-docs-30-contracts-limits-m1` · plan ✓ → impl ◉ → pr ○
- `insuniverse-docs-30-contracts-limits` · plan ◐ → impl ○ → pr ○
- `insuniverse-docs-13-relation-contract-m8` · plan ✓ → impl ◐ → pr ◐
- `alert-console-redesign-r3` · plan ✓ → impl ◐ → pr ◐
- `monitoring-alert` · plan ◉ → impl ○ → pr ○
- `alert-console-redesign-r2` · plan ◐ → impl ◐ → pr ○
- `insuniverse-docs-13-relation-contract-m7` · plan ◐ → impl ◐ → pr ○
- `push-deeplink-almtype` · plan ✓ → impl ◉ → pr ○
- `insuniverse-docs-13-relation-contract-m6` · plan ✓ → impl ◐ → pr ○
- `alert-console-redesign` · plan ◐ → impl ◐ → pr ○
- `insuniverse-docs-13-relation-contract-m5` · plan ◐ → impl ◐ → pr ○
- `insuniverse-docs-13-relation-contract` · plan ✓ → impl ◉ → pr ○
- `insuniverse-docs-13-relation-contract-m4` · plan ✓ → impl ◐ → pr ○
- `treat-monitor` · plan ◉ → impl ○ → pr ○
- `insuniverse-docs-11-index-code-m6b-ship` · plan ◐ → impl ◐ → pr ✓
- `insuniverse-docs-11-index-code-m6b` · plan ◐ → impl ◐ → pr ○
- `insuniverse-docs-13-relation-contract-m3` · plan ✓ → impl ◐ → pr ○
- `ops-alert-system-m4-r2` · plan ◐ → impl ◐ → pr ◐
- `insuniverse-docs-13-relation-contract-m2` · plan ◐ → impl ◐ → pr ○
- `insuniverse-docs-11-index-code-m6-r12` · plan ✓ → impl ◐ → pr ○
- `insuniverse-docs-11-index-code-m6-r11` · plan ◐ → impl ○ → pr ○
- `insuniverse-docs-11-index-code-m6-r10` · plan ◐ → impl ○ → pr ○
- `insuniverse-docs-11-index-code-m6-r9` · plan ◐ → impl ○ → pr ○
- `insuniverse-docs-11-index-code-m6-r8` · plan ◐ → impl ○ → pr ○
- `insuniverse-docs-11-index-code-m6-r7` · plan ◐ → impl ○ → pr ○
- `insuniverse-docs-11-index-code-m6-r6` · plan ◐ → impl ○ → pr ○
- `insuniverse-docs-11-index-code-m6-r5` · plan ◐ → impl ○ → pr ○
- `insuniverse-docs-11-index-code-m6-r4` · plan ◐ → impl ○ → pr ○
- `insuniverse-docs-11-index-code-m6-r3` · plan ◐ → impl ○ → pr ○
- `insuniverse-docs-11-index-code-m6-r2` · plan ◐ → impl ○ → pr ○
- `insuniverse-docs-11-index-code-m6` · plan ◐ → impl ○ → pr ○
- `ops-alert-system-m4` · plan ◐ → impl ◐ → pr ○
- `insuniverse-docs-11-index-code-m5a-fix-2` · plan ◐ → impl ◐ → pr ○
- `insuniverse-docs-11-index-code-m5b-r3` · plan ✓ → impl ◐ → pr ○
- `insuniverse-docs-13-relation-contract-m1-r2` · plan ◐ → impl ◐ → pr ○
- `insuniverse-docs-11-index-code-m5a-fix` · plan ◐ → impl ◐ → pr ○
- `ops-alert-system-m3` · plan ◐ → impl ◐ → pr ○
- `insuniverse-docs-11-index-code-m5b-r2` · plan ◐ → impl ○ → pr ○
- `insuniverse-docs-13-relation-contract-m1` · plan ◐ → impl ○ → pr ○
- `insuniverse-docs-11-index-code-m5a-r2` · plan ✓ → impl ◐ → pr ○
- `ops-alert-system-m2-5` · plan ✓ → impl ◐ → pr ○
- `insuniverse-docs-11-index-code-m5a` · plan ◐ → impl ○ → pr ○
- `insuniverse-docs-11-index-code-m5b` · plan ◐ → impl ○ → pr ○
- `insuniverse-docs-10-index-git-m8` · plan ◐ → impl ◐ → pr ✓
- `insuniverse-docs-00-protocol-m7` · plan ◐ → impl ◐ → pr ◐
- `insuniverse-docs-12-index-runtime-m5` · plan ◐ → impl ◐ → pr ✓
- `ops-alert-system-m2` · plan ◐ → impl ◉ → pr ○
- `ops-alert-system-m1` · plan ✓ → impl ◐ → pr ○
- `insuniverse-docs-10-index-git-m7` · plan ◐ → impl ◐ → pr ○
- `insuniverse-docs-12-index-runtime-m4-r2` · plan ◐ → impl ◐ → pr ○
- `insuniverse-docs-10-index-git-m6-santa` · plan ✓ → impl ◉ → pr ○
- `insuniverse-docs-12-index-runtime-m4` · plan ◐ → impl ◐ → pr ○
- `ops-alert-system` · plan ◐ → impl ○ → pr ○
- `insuniverse-docs-10-index-git-m6` · plan ◐ → impl ◐ → pr ○
- `insuniverse-docs-12-index-runtime-m3` · plan ◐ → impl ◐ → pr ○
- `insuniverse-docs-10-index-git-m5-santa` · plan ✓ → impl ◉ → pr ○
- `insuniverse-docs-00-protocol-m6` · plan ◐ → impl ◐ → pr ○
- `insuniverse-docs-10-index-git-m5` · plan ◐ → impl ◐ → pr ○
- `insuniverse-docs-11-index-code-m4` · plan ◐ → impl ◐ → pr ○
- `insuniverse-docs-00-protocol-m5` · plan ◐ → impl ◐ → pr ○
- `insuniverse-docs-12-index-runtime-m2` · plan ◐ → impl ◐ → pr ○
- `insuniverse-docs-11-index-code-m3` · plan ◐ → impl ◐ → pr ○
- `insuniverse-docs-12-index-runtime-m1-r2` · plan ◐ → impl ◉ → pr ○
- `insuniverse-docs-11-index-code-m2` · plan ◐ → impl ◐ → pr ○
- `insuniverse-docs-10-index-git-m4` · plan ◐ → impl ◐ → pr ○
- `insuniverse-docs-10-index-git-m3` · plan ◐ → impl ◐ → pr ○
- `insuniverse-docs-12-index-runtime-m1` · plan ◐ → impl ◐ → pr ○
- `insuniverse-docs-11-index-code-m1` · plan ◐ → impl ◉ → pr ○
- `insuniverse-docs-10-index-git-m2` · plan ◐ → impl ◐ → pr ○
- `insuniverse-docs-00-protocol-m3-recheck` · plan ✓ → impl ◉ → pr ○
- `insuniverse-docs-10-index-git` · plan ◐ → impl ◐ → pr ○
- `insuniverse-docs-11-index-code` · plan ◐ → impl ◐ → pr ○
- `insuniverse-docs-12-index-runtime` · plan ◐ → impl ◐ → pr ○
- `insuniverse-docs-00-protocol-m3` · plan ◐ → impl ◐ → pr ○
- `insuniverse-docs-00-protocol` · plan ✓ → impl ◉ → pr ○
- `main.legacy` · plan ◐ → impl ○ → pr ○
- `doc-template-kit-m7` · plan ◐ → impl ◐ → pr ○
- `doc-template-kit` · plan ◐ → impl ◐ → pr ○
- _+30 더보기_

---

## 멀티세션 진행

| worktree | 브랜치 | 진행 | 상태 | 활동 |
|---|---|---|---|---|
| **이 worktree** | main | pr-codex | · 대기 | 35일 전 |
| security-hotfix-m10 | fix/security-hotfix-m10 | plan-codex | ◐ 진행 중 | 4일 전 |
| security-hotfix-prd | docs/security-hotfix-prd | pr-codex ⚠ · 🚫 gate mccp-pr-codex codex_verdict=divergent | 🚫 차단됨 | 12일 전 |
| admin-rbac | feat/admin-rbac | implement-codex ⚠ · 🚫 gate mccp-implement-codex codex_verdict=divergent | 🚫 차단됨 | 50분 전 |
| bg-1015-5 | ccapi/bg-1015-5 | plan-codex | ◐ 진행 중 | 4일 전 |
| monitoring-alert | feat/monitoring-alert-review | implement-codex ⚠ · 🚫 gate mccp-implement-codex codex_verdict=divergent | 🚫 차단됨 | 8분 전 |
| samsung-account-intake | meta/samsung-account-intake | implement-codex | · 대기 | 19일 전 |
| security-hotfix | fix/security-hotfix-m1-m10 | plan-codex | ◐ 진행 중 | 20시간 전 |
| security-structure-research | docs/security-structure-research | pr-codex ⚠ · 🚫 gate mccp-pr-codex codex_verdict=divergent | 🚫 차단됨 | 4일 전 |
| refactor-prd | docs/refactor-prd | pr-codex ⚠ · 🚫 gate mccp-pr-codex codex_verdict=divergent | 🚫 차단됨 | 6일 전 |

- **이 worktree**
  - 경로: `.`
  - HEAD: `3666cd5a`
  - 게이트: mccp-pr-codex (통과)
  - receipts: 311
- security-hotfix-m10
  - 경로: `.claude/worktrees/security-hotfix-m10`
  - HEAD: `706471b2`
  - 게이트: mccp-plan-codex (통과)
  - receipts: 491
- security-hotfix-prd
  - 경로: `.claude/worktrees/security-hotfix-prd`
  - HEAD: `7a3580a3`
  - 게이트: mccp-pr-codex (보류)
  - receipts: 490
  - 차단 사유: gate mccp-pr-codex codex_verdict=divergent
- admin-rbac
  - 경로: `.worktrees/admin-rbac`
  - HEAD: `d7d308d0`
  - 게이트: mccp-implement-codex (보류)
  - receipts: 498
  - 차단 사유: gate mccp-implement-codex codex_verdict=divergent
- bg-1015-5
  - 경로: `.worktrees/bg-1015-5`
  - HEAD: `b9eb0718`
  - 게이트: mccp-plan-codex (통과)
  - receipts: 490
- monitoring-alert
  - 경로: `.worktrees/monitoring-alert`
  - HEAD: `38b7ab14`
  - 게이트: mccp-implement-codex (보류)
  - receipts: 317
  - 차단 사유: gate mccp-implement-codex codex_verdict=divergent
- samsung-account-intake
  - 경로: `.worktrees/samsung-account-intake`
  - HEAD: `713e42b9`
  - 게이트: mccp-implement-codex (통과)
  - receipts: 490
- security-hotfix
  - 경로: `.worktrees/security-hotfix`
  - HEAD: `2a5692d4`
  - 게이트: mccp-plan-codex (통과)
  - receipts: 497
- security-structure-research
  - 경로: `.worktrees/security-structure-research`
  - HEAD: `61161d6b`
  - 게이트: mccp-pr-codex (보류)
  - receipts: 490
  - 차단 사유: gate mccp-pr-codex codex_verdict=divergent
- refactor-prd
  - 경로: `.worktrees/security-structure-research/.claude/worktrees/refactor-prd`
  - HEAD: `6e483bfd`
  - 게이트: mccp-pr-codex (보류)
  - receipts: 489
  - 차단 사유: gate mccp-pr-codex codex_verdict=divergent

---

## 타임라인

_(최근 7일 활동 없음)_

---

## 마일스톤 기록

- **생성기 진입 계약 봉인** · 45일 전 (insuniverse-docs-70-viewer-m9.plan.md)
  - 요약:
    두 생성기(`docs/viewer/build-docs.mjs` · `docs/viewer/anchor-freshness.mjs`)의 **외부 CLI 가 정본 산출 좌표를 표적으로 삼지 못하게** 한다. 정본 자리는 `docs/viewer/gate.mjs build` 만 채운다. 지금은 두 생성기의 머리 주석이 정본을 덮는 호출을 사용법으로 싣고 있고, 그 경로가 게이트의 계약 넷(프로브 선행 · 호출 순서 · 문서 트리 digest fence · 앵커 신선도 조인)을 전건 건너뛴다.

    **마일스톤 8 이 절반만 닫았다.** 8 은 `build-docs.mjs` 의 외부 호출을 무조건 보호 발행으로 바꿔 *원자성* 을 세웠으나 *계약* 은 그대로 두었고, `anchor-freshness.mjs` 는 아예 손대지 않아 **원자성조차 없다**(관측 1). 그래서 8 의 *"외부 호출은 대상이 무엇이든 보호 발행이다"* 는 한 생성기에만 참이다.

    **이 창은 새 표면을 만들지 않는다.** 재료는 `.claude/plans/codex-findings-backlog.md` 의 `70m6-child-cli-bypasses-single-entry` 한 행이고, 그 행이 인수처를 *"생성기 CLI 계약을 게이트 소유로 좁히는 창"* 으로 지목한다. 봉인의 형태는 새로 발명하지 않고 마일스톤 8 이 `--staging-internal` 에 쓴 **좌표 기반 인가**를 그대로 뒤집어 쓴다 , 토큰이 아니라 목적지가 판정한다.

    **마일스톤 7 은 이 창에서도 열리지 않는다.** 행 조건인 계약 #1(`repos[].url_template`)이 `docs/_meta/template-config.yaml:15` 에서 여전히 스칼라 흐름 리스트 한 줄이고, PRD §NOT Building 이 앵커 URL 링크를 명시적으로 자른다. 9 는 7 에 의존하지 않는다 , 번호가 뒤인 것은 순서가 아니라 신설 시점이다.
- 형제 findings 회수 + 재판정 · 45일 전 (insuniverse-docs-60-history-deprecated-m7.plan.md)
  - 요약:
    형제 PRD 가 `docs/_meta/findings/<prd-id>.md` 에 남긴 발견을 **기계로 회수**하고, 그중 폐기 축에
    닿는 것을 5중 필터로 **재판정**한다. 이 창은 문서를 발행하지 않는다 , 발행 차단 이월 2건
    (`60m1-sha-unresolvable` · `60m1-adjudication-unproven`)이 열린 채이고, 재판정 결과도 확정 폐기 0건이다.

    이 창이 내는 것은 **회수 원장 하나와 그것을 늙지 않게 하는 결박 하나**다. 원장은
    `.claude/plans/insuniverse-docs-60-history-deprecated-m7.ledger.jsonl` 이고, 스윕 우주 6파일의
    sha256 을 meta 레코드에 실어 **형제가 findings 를 신설하거나 개정하는 순간 게이트가 rc 1** 이 되게 한다.
    PRD §Risks 가 이 마일스톤을 *"형제 전체 종료 이후"* 라는 **일정 가정**에 걸어 뒀는데, 실측상
    `50-domain`(M7 in-progress · M8 pending)과 `70-viewer`(M7 pending, 조건부)가 열려 있어 그 가정은
    지금 참이 아니다. 가정을 기계 결박으로 바꾸는 것이 사용자 판정이며(UI18), 그래서 이 창이 착수한다.

    회수 대상은 두 채널로 **유도**한다 , 본문이 이 PRD 를 지목한 것(A)과 `05-final-spec.md` §3 status
    어휘를 든 것(B). A 5건 · B 4건 · 합집합 **8건**이다. 그 8건을 4종으로 갈라 실 후보 1건과 판정 요청
    1건만 5중 필터에 넣고, 방법론 3건 · 계약 3건은 인수처를 이름으로 결박한다.
- 개정 위임 집행 , D5 먼저, 그다음 D1~D4 · 46일 전 (insuniverse-docs-30-contracts-limits-m1.plan.md)
  - 요약:
    `ownership.md` §개정 위임 표에 이 PRD 의 위임 행을 세우고(D5), 그 권한으로 `docs/00-index.md` ·
    `.claude/meta/05-final-spec.md` · `docs/_meta/onboarding-questions.yaml` 의 낡은 문면 12자리를
    정정한 뒤 `verify.sh --update` 로 golden 을 재동결한다. 종료조건은
    `bash docs/_meta/verify/verify.sh --check --bootstrap` exit 0 이다.

    **GROUND 가 PRD 문면 5건을 반증했다.** (1) 위임 5행으로는 부족하다 , golden 재동결이
    `docs/_meta/verify/**` 를 쓰는데 그 경로 위임 행이 D1~D5 에 없다(**D6 신설**). (2) D2 는
    "D1 과 같은 1행" 이 아니다 , `verify.sh` 2760~2761행이 두 트리를 **설명 열까지 raw 로** 대조하므로
    설명 열 정정도 같이 가야 한다. (3) 움직이는 golden 키는 3개가 아니라 **6개**다. (4) D3 이 지목한
    5개 행 번호 중 `§MVP` src 는 3곳이고 213행은 다른 절 인용이다. (5) PRD 가 제안한 새 재검토 조건
    (`상태: 진행` 위임 행 2개 이상)은 **이 마일스톤 자신이 즉시 발동시킨다** , 축을 *서로 다른 PRD* 로
    고쳐야 한다.

    ### 차단 선행조건 , D6 은 2026-08-24 에 승인됐다 (해소)

    **두 승인 경로를 이름 붙여 갈라 적는다.** D1~D5 는 `사용자 PRD 승인 2026-08-24` 이고, D6 은 이
    계획서가 GROUND 에서 새로 찾아낸 것이라 별도 발화가 필요했다 , 2026-08-24 `/mccp:prp-implement`
    Phase 2.5 에서 사용자가 `사용자 plan 승인 2026-08-24` 를 **리터럴로** 주었다. 그 문자열이 Task 2 가
    장부에 옮겨 적는 값이며, 실행자가 유도하거나 지어내지 않는다. 형식은
    `docs/_meta/ownership.md:119` 의 기존 8행이 이미 쓰는 것이다(`사용자 plan 승인 2026-08-11`).

    D6 없이 마일스톤 1 은 닫히지 않았다 , 종료조건이 `verify.sh --check` exit 0 이고 그러려면
    `--update` 가 `docs/_meta/verify/golden.txt` 를 다시 써야 하는데, 그 경로는 archived `00-protocol`
    소유이고 위임은 `13` 앞으로 **완료**로 닫혀 있다(G11). 위임 행 없이 쓰면 우산 §핵심 제약 6 위반이다.
    판정 기록은 §Open Questions 맨 앞 항목에 있다.

    **이 차단은 절차적이다 , 기계 게이트가 아니다.** 저장소의 어떤 검사도 "사용자가 승인했다" 를
    판정하지 못한다: `run_ownership_gate` 는 §개정 위임 을 읽지 않고(G2), UI2 가 2026-08-24 에 그
    승격을 기각했으며, 기존 8행도 전부 같은 평문 필드다. 그래서 이 계획서는 **집행되는 만큼만
    주장한다** , `#1e` 가 닫는 것은 D6 행의 `승인` 열이 **비어 있지 않고 · 형식에 맞고 · 미래 날짜가
    아닌가** 셋뿐이고, 그 값의 진위는 사람이 든다(층위 8, §Risks 한 행). 승인 발화 없이 날짜를 채우면
    검사는 통과하고 장부에는 거짓 승인이 남는다 , 그 사실을 숨기지 않고 여기 적는 것이 이 계층이 할 수
    있는 전부다. (비미래 경계는 Implement-Codex R1 F4 와 L2 R5 invariant 지적의 흡수분이다. 그
    지적의 나머지 , *"진위를 기계가 판정하라"* , 는 UI2 를 깨야만 해소되므로 `out_of_scope` 다.)
- 종결 후 잔여 , 하네스 3결함 · closure 해시 축 · 위임 슬롯 · 46일 전 (insuniverse-docs-20-foundation-access-m7.plan.md)
  - 요약:
    마일스톤 6 이 닫히고 PR `#51` 이 main 에 들어간 뒤에도 네 자리가 남았다. 이 창은 그 넷을 **검사로** 닫는다.

    첫째는 PR-Codex 라운드 1 이 낸 지적 3건이다. 셋 다 *"검사가 자기가 본다고 말한 것을 실제로는 안 본다"* 는 같은 부류다 , `resolveCitation` 이 행 범위의 **위쪽만** 보고(`insuniverse-docs-20-foundation-access-m6.gates.mjs` 562행), 원장 meta 레코드를 **어느 검사도** 재산출과 대조하지 않으며(`#2` 는 데이터 행의 기계 필드 6종만 본다), `#7a` 는 gate 값의 **형태와 실재**만 보고 그 검사가 그 행을 덮는지는 묻지 않는다. 셋째가 특히 무겁다 , `#8` 이 내는 `미검증 127 · 수렴 계수 1` 이 저작 성실성 위에서만 참이라는 뜻이고, 그 두 수가 마일스톤 6 종료 판정의 실질이었다. **이 창은 셋째를 부분만 닫는다.** 결박 770건 중 736건은 실행 관측으로 실증하고, 선행 하네스에 흩어진 34건은 실증 밖에 남는다 , 그래서 `#8` 이 `커버리지 미실증 결박` 을 **셋째 계수**로 따로 내고, 이 계획서는 그 축을 닫았다고 쓰지 않는다.

    둘째는 저장소 전역이다. `.claude/milestone-closures/**` 는 `.gitattributes` 밖이고 이 저장소는 `core.autocrlf=true` 다. 형제 40축 하네스 셋이 closure 문서를 **raw 바이트**로 해시하므로 저작 머신 밖에서는 전건 붉다. 20축은 마일스톤 6 종결 창이 EOL 정규화로 이미 닫았고, 이 창이 그 형태를 40축 셋에 포팅한다. 그 셋은 재병합 뒤 `.claude/PRPs/plans/archived/` 로 옮겨졌고 지금은 closure 해시 앞의 import 에서 먼저 죽으므로 이 창이 두 층을 함께 연다(관측 1·9).

    셋째도 저장소 전역이고 이 창이 재병합에서 새로 만났다. 형제 축의 **아카이브 이동이 남긴 낙진**이다 , `docs/_meta/verify/verify.sh` 가 문서 PRD 수를 리터럴 `5` 와 정규식 `[2-6]0` 으로 물고 있어 40축 PRD 가 `archived/` 로 간 순간 `origin/main` 자체가 붉다. 그 경로는 `20` 앞 위임 슬롯이고 상태가 `진행` 이라 이 창의 소관이다(관측 6·9).

    셋째는 위임이다. `docs/_meta/ownership.md:184` 의 `docs/_meta/verify/**` 슬롯이 `20` 앞으로 상태 `진행`인 채인데 이 PRD 는 여섯 마일스톤이 전부 `complete` 다. `70-viewer` 가 그 슬롯을 이름으로 기다리고(`.claude/prds/insuniverse-docs-70-viewer.prd.md` 420행) `50-domain` 은 같은 벽을 다섯 PRD 공통 문제로 적었다. **이 창이 슬롯 셋을 `완료` 로 옮긴다.** 권한 근거는 위임 표 자신의 `승인` 열이다 , 그 열이 `사용자 plan 승인` · `사용자 PRD 개정` 으로 채워져 있으므로 이 계획서의 승인이 곧 그 쓰기의 승인이다. 실측으로 그 편집은 선행 검사를 한 건도 붉히지 않는다(관측 6 프로브 A). 게이트는 스냅샷이 아니라 **불변식**을 문다 , 마일스톤 표가 전건 종료인 소유 PRD 앞으로 상태 `진행`인 슬롯이 0건이어야 하고, 종료 전에 미리 옮겨도 실패다. 누락된 `ownership.md` 자기 위임 행은 값을 실측으로 매겨(선행 5검사가 붉는다) 사용자 결정으로 올린다.

    넷째는 이 창 자신이 만드는 것이다. 마일스톤 표에 7행이 서는 순간 하네스 **둘**이 `rows.length !== 6` 으로 죽는다 , `insuniverse-docs-20-foundation-access-m5.gates.mjs` 1603행과 `insuniverse-docs-20-foundation-access-m6.gates.mjs` 1337행이다. 그리고 m5 쪽이 더 나쁘다: 그 검사는 이미 붉은

    … (요약이 길어 잘렸습니다. 전문은 plan 원문 참조)
- 최종 수정 , 열린 질문 판정 · 이월 인수 · 하네스 수리 · 46일 전 (insuniverse-docs-30-contracts-limits-m9.plan.md)
  - 요약:
    마일스톤 8 이 종결되며 세 종류의 잔여를 남겼고, 그 셋의 인수처가 이 창이다. (1) PRD §Open Questions 여섯 항목이 착수 이래 한 번도 판정되지 않은 채 `- [ ]` 로 남아 있다 , 그중 넷은 산출 9문서가 이미 답했고 그 사실이 어디에도 적히지 않았다. (2) `codex-findings-backlog.md` 가 인수처를 `마일스톤 종료 창` 으로 명시한 행이 둘 있다 , 게이트 결박 술어의 사각지대(454행)와 유지보수자 라운드 원장 체이닝의 부재(462행). **이 창이 닫는 것은 462 하나다** , 454 는 행 id 결속을 요구하는데 그것은 종료된 창들의 하네스를 고쳐야 가능하다. 이 창은 그 사각지대의 **크기를 재고** 454 를 열린 이월로 남긴다 (Plan-Codex R2 F3 흡수). (3) `m8.gates.mjs` `check12` 가 `--expect` 인자를 받지 않아 마일스톤 8 이 `complete` 로 전이한 순간 영구히 붉다 , 종결 문서가 그 붉음을 예정된 결과로 귀속했으나 귀속은 수리가 아니다.

    **이 창의 산출은 판정이지 문서 저작이 아니다.** 9문서 본문은 한 바이트도 바뀌지 않는다. 산출은 넷이다 , 판정 원장 `.claude/plans/insuniverse-docs-30-contracts-limits-m9.ledger.jsonl`, 그 원장이 앞 원장을 가리키는 **체이닝 스키마와 그 검증기**, `m8.gates.mjs` `check12` 의 `--expect` 수리, 그리고 하네스 `.claude/plans/insuniverse-docs-30-contracts-limits-m9.gates.mjs` , 검사 건수는 그 파일의 등록부가 분모이고 계획서 문면에 리터럴로 싣지 않는다 (UI11 · INV4).

    **체이닝은 스키마와 검증기와 첫 실사용까지다.** backlog 462행 이 그 구현을 이 창에 넘기며 *"사람이 쓰지 않은 원장을 검사가 요구하는 상태"* 를 이유로 마일스톤 8 이 만들지 않았다고 적었다. 이 창은 그 함정을 검증기를 원장 실재와 분리해 피한다 , 검증기는 체인이 **있을 때** 그것이 옳은지만 보고, 부재는 통과시키되 계수로 공시한다. 그리고 이 창의 원장 자신이 마일스톤 8 원장을 `prior_ledger_sha256` 으로 가리켜 스키마의 첫 실사용이 된다. **그 원장은 `round: 0` 의 체인 앵커이지 라운드가 아니다** (Plan-Codex R1 F0 흡수) , `round: 1` 을 주면 이 관리 원장 하나와 뒤에 올 사람 판정 하나가 *연속 두 라운드* 로 계수되어, 사람이 한 번만 판정하고도 종료 술어가 성립한다. 마일스톤 8 이 실행자 표기에 `round: 0` 을 준 것과 같은 구분이다. 뒤에 올 유지보수자 두 라운드는 같은 스키마를 `round: 1`·`2` 로 이어 붙인다.

    **이 창이 닫지 못하는 것을 이름으로 남긴다.** `verify.sh --check` 는 rc=1 이고 원인 경로의 위임 슬롯이 형제 PRD 앞으로 `진행` 이라 이 창이 통제하지 못한다 , 사용자 판정으로 마일스톤 종료 조건에 **걸지 않는다**. 정본 후보 미덮음 278행은 상위 다섯 경로를 표본으로 판정하며 전수는 다음 창이다. 유지보수자 라운드 두 번은 여전히 이 창 밖이다.

<details>
<summary>+87 더보기</summary>

- `00-origin.md` + `04-ops-intent.md` · 46일 전 (insuniverse-docs-60-history-deprecated-m6.plan.md)
  - 요약:
    `docs/90-history/00-origin.md`(등급 U)와 `docs/90-history/04-ops-intent.md`(등급 O)를 발행한다. 이
    PRD 가 실 문서를 내는 **네 번째** 창이고, 앞 세 창(M3·M4·M5)과 성격이 근본적으로 다르다 , **재유도할
    인덱스 축이 없다.**

    M3·M4·M5 는 `releases.yaml`·`commits.<repo>.jsonl` 에서 값을 유도하고 3저장소 git 으로 재유도해
    대조했다. 이 창의 두 문서에는 그 상대가 없다. `00-origin.md` 의 소스는 저장소 밖 구술
    1건(`.claude/meta/10-user-oral-source.md` `[History]` 절 · 4원소)이고, `04-ops-intent.md` 의 소스는
    **이 브랜치에 존재하지 않는** 형제 우산의 원장(`ops/reconcile/reconcile.jsonl`)이다. 그래서 이 창의
    게이트는 *값을 재유도해 대조* 하는 형태가 아니라 **소스 귀속 · 등급 고지 · 규약 문면 · 비발행 결박**
    네 축으로 선다.

    **`00-origin.md` 는 얇을 수밖에 없고 그것이 정확한 상태다.** `[History]` 절 전체가 bullet **3개**이고
    PRD §반드시 지킬 것이 지목한 네 주제(창업 경위 · 영업대리점 추가 사유 · 머니 기원 · 사용처 확대
    지연)가 그 안에 있다 , 셋째 bullet 하나가 뒤의 두 주제를 *이후* 로 잇는다.

    **서사 블록은 폐쇄 스키마다.** 각 블록은 대응 bullet 의 **축자 전체 인용**과 앵커 한 줄만 갖고 그
    밖의 문장을 갖지 않는다. 자유 산문을 한 줄이라도 허용하면 검사가 무너진다 , *"이 문장이 구술에서
    왔는가"* 는 기계로 결정할 규칙이 없고, 승인된 블록 안에 출처 없는 문장을 끼우는 순간 고지가 거짓이
    되기 때문이다. 부분 문자열도 거부하므로 셋째 bullet 의 *법적 지연* 절을 잘라내는 우회가 닫히고,
    그 결과 **시간 관계는 인용 자체로 보존된다** , 원소를 넷으로 쪼개 순서를 잃는 경로가 애초에 없다.
    등급 U 의 위험은 결손이 아니라 **증식**이고, 폐쇄 스키마가 증식의 기계적 형태다.

    **다만 폐쇄 스키마는 서사 블록만 문다.** 규약 · 사정거리 · 못하는 판정 세 절은 저자 문장이라, 그
    셋이 같은 문서에 있는 한 최상단 전칭 고지는 그 절들에 대해 거짓이다 , 코드 값 혼입을 막는 근거와
    같은 결함이 다른 자리에 남아 있었다. 그래서 고지 직후에 **지시 대상 행**을 한 줄 두어 고지가
    말하는 *진술* 이 서사 블록임을 명시하고 메타 절을 이름으로 선언한다. 검사 `#1` 은 그 행을 파싱해
    메타 절 집합을 유도하고 문서 **전 비공백 행**을 {고지 · 메타 절 · 서사 블록} 셋으로 구획해 어느
    쪽에도 안 드는 행 0 을 문다 , 선언 없이 절을 늘리는 우회가 구획 밖 행으로 떨어진다. 고지 문면
    자체는 UI3 이 요구한 대로 축자 유지된다. 좁히는 것은 고지가 아니라 지시 대상의 명시다.

    **그 문서에 코드 값을 넣지 않는다.** 최상단 고지가 *"모든 진술은 구술이며 저장소로 검증되지
    않는다"* 인데 저장소로 검증된 진술을 같은 문서에 섞으면 고지가 **문서 자신에 대해 거짓**이 된다.
    `[History]` 3번 원소(*"포인트는 FAX 호출에서 추가"*)와 `07-domain-knowledge-gap.md` §2-2 의 코드
    실측(*"일부 경로에서만 강제"*)은 대조 가능한 유일한 쌍이지만 **어긋남이 아니다** , 앞은 *기원* 축이고
    뒤는 *현재 강제* 축이라 동시에 참이다. 그 대조는 findings 로만 적고 문서에는 등급 U 3규칙의 규약
    문면만 남긴다. 검사 `#2` 는 그 대조가 문서에 없음을 **음성으로** 문다.

    **`04-ops-intent.md` 는 값 0건으로 연다.** `ops-30-reconcile` 은 M0 만 complete 이고 M1~M4 가
    pending 이라 `ops-only` verdict 가 0건이며, 그 원장 파일(`ops/

    … (요약이 길어 잘렸습니다. 전문은 plan 원문 참조)
- **산출 발행 원자화** · 47일 전 (insuniverse-docs-70-viewer-m8.plan.md)
  - 요약:
    `docs/viewer/gate.mjs` 의 `build` 가 두 생성기를 **최종 산출 자리에 직접** 쓰는 것을, 배타 소유 경로 안의 공유 발행 원시연산(`docs/viewer/publish.mjs`)을 통한 스테이징 발행 + 저널 기반 교체로 바꾼다. 지금은 뒷단이 중간에 죽으면 지면 42건과 `index.html` 이 정본 자리에 남고 검색 색인과 `metrics.json` 은 없으며(관측 2), 어휘가 줄어든 재빌드는 폐기 지면을 지우지 않고 rc 0 으로 나간다(관측 3).

    **이 창은 새 표면을 만들지 않는다.** 재료는 이미 `.claude/plans/codex-findings-backlog.md` 에 쌓인 발행 축 4행이고 네 행 전부가 인수처를 *"산출 발행을 스테이징 + 교체로 바꾸는 창"* 으로 지목하며 **함께 닫는다** 고 적는다 , `70m6-two-stage-publish-no-rollback` · `70m6-mutable-docs-between-stages` · `70m6-concurrent-publish-crosses-outputs` · `70m4-shrinking-rebuild-leaves-stale-pages`.

    **Plan-Codex 세 라운드가 초판 설계를 세 번 뒤집었고 이 본문은 그 뒤의 것이다.** R1 은 (a) 락 미회수 + 복구 부재 + 강제 종료 미검증이 겹쳐 **복구 가능한 부분 발행을 복구 불가능한 정지로** 바꾼다는 것과 (b) 생성기 직접 호출을 문면으로만 좁히면 backlog 동시 발행 행을 닫을 근거가 못 된다는 것을 잡았다. R2 는 **그 흡수가 연 세 자리**를 잡았다 , 저널 완료 표시가 rename 뒤에 있어 기록이 거짓이 될 수 있다는 것, 마커 기반 우회는 마커가 아직 없는 현행 트리에서 부트스트랩 구멍을 갖는다는 것, 그리고 최상위 전건 교체가 다른 생성기 소유인 `anchor-freshness.json` 을 지운다는 것. R3 은 렌즈를 설계에서 **생산 가능성**으로 옮겨 다섯 자리를 잡았다 , `#1` 의 음성 픽스처가 UI6 이 금지한 파일을 실제로 만들라고 지시하고 있었다는 것, `#15`·`#16` 이 결정적 경계 제어 없이 시간·출력에 의존해 거짓 초록을 낸다는 것, 완주 레시피가 스위트를 두 번 돌린다는 것, `#14` 가 자기가 인용된 Acceptance 를 검증하지 않는다는 것, 그리고 receipt 가 이전 본문을 증명하고 있다는 것. **열 건 전부 ACCEPT_NOW** 이며 §Codex Adversarial Review 가 원문과 판정을 진다.

    **마일스톤 7 을 건너뛴 이유는 실측이다.** 7 의 행 조건인 계약 #1(`repos[].url_template`)이 `docs/_meta/template-config.yaml:15` 에서 여전히 스칼라 리스트 한 줄이라 미반영이고, PRD §NOT Building 이 앵커 URL 링크를 명시적으로 자른다.
- 리뷰 2라운드 수렴 · 47일 전 (insuniverse-docs-30-contracts-limits-m8.plan.md)
  - 요약:
    마일스톤 8 의 종료 조건은 *"리뷰 불일치가 2라운드 연속 0건"* 이고 측정자가 **사람**이다. 이 창은 그것을 닫지 못한다. 닫을 수 있는 것은 **표기가 앉을 자리를 만들고 라운드 1 을 돌리는 것**이다.

    산출은 넷이다. (1) 9문서의 검증 가능한 주장을 기계로 뽑은 행 단위 **원장** `.claude/plans/insuniverse-docs-30-contracts-limits-m8.ledger.jsonl`. (2) 그 전 행의 **사전검토 표기** , `ok` · `사실과다름` · `빠짐` · `미검증` 넷. **이것은 라운드 1 이 아니라 `round: 0` 이다** (Plan-Codex R1 F1 흡수) , PRD §Success Metrics 가 측정자를 유지보수자로 못 박았으므로 실행자 표기를 라운드로 세면 사람이 한 번만 판정하고도 *2라운드 연속 0건* 이 성립한다. (3) 앞 일곱 창 중 **어느 하네스도 9문서를 함께 보지 않는다**는 사실이 만든 공백 두 축의 신설 검사 , 본문 코드 인용의 동결 트리 해석(`docs/04-limits/**` 네 문서는 지금 어느 게이트도 안 본다)과 `## 연혁` SHA 의 이름공간 판정. (4) 온보딩 9문항의 **답변 좌표 대응표** , PRD §Success Metrics 열 행 중 게이트가 없는 두 자리 중 하나다.

    라운드 1 의 실질은 관측 8 이 이름으로 낸다 , PRD 자신이 §A8 과 §개정 위임 두 자리에서 문서 트리 동결값을 `entry_count 53` · `doc_count 52` 로 싣는데 `docs/_meta/verify/golden.txt` 의 정본은 `56` · `55` 다. 흡수는 그 네 리터럴을 골든 키 이름 인용으로 바꾸는 것이고, 신설 검사 `#12` 가 리터럴 재발생 자체를 막는다 (INV4).

    **이 창이 닫지 못하는 것을 이름으로 남긴다.** `verify.sh --check` 가 rc=1 이고 그 원인은 이 PRD 밖이며(관측 2), R-1 회부 사실을 적을 `docs/_meta/findings/30-contracts-limits.md` 는 위임 슬롯이 막혀 열 수 없다(관측 9). 정본 후보 축 1637행 중 278행은 9문서가 닿지 않으며 그 수를 0 으로 접지 않는다(관측 13). 전부 이월 행으로 올린다.

    **유지보수자 라운드는 이 창에 0회다.** 이 창이 내는 것은 `round: 0` 사전검토뿐이고, 종료 조건이 요구하는 2회 연속 0건은 그 뒤 사용자의 두 판정으로만 성립한다. PRD 마일스톤 표 8행은 `complete` 가 아니라 `in-progress` 로 간다.
- `02-epics.md` · 48일 전 (insuniverse-docs-60-history-deprecated-m5.plan.md)
  - 요약:
    `docs/90-history/02-epics.md` 를 발행한다. 이 PRD 가 실 문서를 내는 **세 번째** 창이고, 발행 대상은
    제목 축이 유도한 에픽 이름 **23건**, 그 랜딩 커밋 **114건**, 랜딩의 둘째 부모 계보에서 유도한 에픽
    소속 커밋 **185건**, 랜딩을 닮았으나 아닌 **6건**, 그리고 파일경로 축이 낸 **결손 20 도메인**이다.
    값은 리터럴이 아니라 유도값이며 3저장소 git `rev-list` 로 재유도해 대조한다. 앞 두 창의 산출물
    (M3 발산 257 · M4 릴리스 45+5)과 sha 교집합이 **0** 이다.

    **PRD §Evidence 의 두 문장이 실측에서 틀렸다.** (1) *"`feat/*` 8개 에픽"* 은
    `.claude/meta/01-meta-search-report.md` 73행의 **상위 8 절단**이고 그 절단은 랜딩 형식 한
    종(`Merge branch`)만 본 20 이름의 상위 8 이다 , 8개 계수는 실측과 축자로 같으므로 그 보고서는
    자기 축 안에서 옳고, 틀린 것은 **표본을 모집단으로 인용한** PRD 다(층위 6). (2) 같은 절의
    *"Era B 는 conventional + scope, Era A 는 자유형식"* 도 뒤집힌다 , 관례 형식은 두 era 다
    지배적이고(A 3,482/5,070 · B 1,006/1,120) 갈리는 것은 **`scope`** 다(A 5 · B 598).

    **"왜"의 가부는 본문 계수가 아니라 저장소 자신의 등급표가 정한다.** `01-meta-search-report.md`
    §4 가 `Merge pull request` 본문을 **등급 A**, Era B 제목을 **등급 B**(why 근거), Era A 제목을
    **등급 C**(시점 추정용 · **단독 근거 금지**)로 이미 판정해 뒀다. 그 세 축을 에픽 축과 교차하면
    23 에픽의 최고 등급이 **A 5 · B 1 · C 17** 이다. 그래서 이 문서는 6개 에픽에 등급을 표기한 서사를
    쓰고, 나머지 17개에는 등급 C 재료를 싣되 등급표 규칙에 따라 **단독 서술로 승격하지 않는다.**
    UI3 은 등급 표기한 추정을 허용하는 조항이지 추정을 금지하는 조항이 아니다.

    **제목 축 하나로는 모집단을 닫지 못한다.** 파일경로 축으로 독립 유도하면 server
    `apps/api/src/modules/` 아래 도메인이 **51개**인데 에픽 23이 닿는 것은 **31개**이고 **20개가 안
    닿는다** , 그중 `fax` 53 · `disease` 45 · `medication-standard` 31 은 상위 에픽에 필적하는 규모다.
    문서는 그 결손을 이름으로 싣고, 에픽 축이 이력의 작업 단위를 다 덮는다고 주장하지 않는다.

    **마일스톤 Outcome 의 *서사* 부분 개정과 §Open Questions 종결은 이 창의 범위 밖이다.** 17/23 이
    등급 C 단독이라는 실측이 그 문면을 건드리지만, Outcome 을 고쳐 쓰는 것은 **범위 축소**이고 승인
    사항이다(UI14). 이 창은 사실 정정 두 건만 집행하고 두 경로를 상신 문면으로 남긴다.
- 기능 게이트 , `04-feature-gates.md` · 48일 전 (insuniverse-docs-30-contracts-limits-m7.plan.md)
  - 요약:
    `docs/04-limits/04-feature-gates.md` 한 문서를 만든다. PRD §Delivery Milestones 7행이 정한 결과는
    **"`known_gates` 전건이 실리고 각 표기가 확보 근거와 일치한다"** 이며, 판정선은 온보딩 Q14
    *"env 게이트의 운영 활성 여부를 이 문서로 알 수 있는가. 알 수 없다면 그 사실이 문서에 명시돼
    있는가"* 다.

    이 마일스톤의 하중은 값이 아니라 **표기와 근거의 일치**다. 두 방향의 실패가 대칭으로 있고 PRD 가
    둘 다 최상위 Risk 로 든다 , 모르는 것을 안다고 쓰는 것과 **아는 것을 모른다고 쓰는 것**. 실측이 그
    대칭을 확정했다. 게이트 집합은 균질하지 않다 , **stg 값이 이미 손에 있는 부분집합**(G6) · **독출
    코드가 prod 에 아직 닿지 않은 부분집합**(G8) · **스캔 우주 밖이지만 저장소 안에 선언이 실재하는
    부분집합**(G7) 이 각각 비어 있지 않다. **전건을 `게이트 미상` 부록으로 미는 문서는 이 셋을 전부
    지운다.** 세 부분집합은 정본에서 유도되며 이 계획서도 문서도 그 크기를 리터럴로 싣지 않는다
    (UI9 · INV4 · Plan-Codex R2 F2) , 크기는 하네스 출력이 매 실행에 낸다.

    방법론 축도 실측이 정했다. 이 축의 생성 인덱스 `docs/_meta/index/env-gates.yaml` 은 **다른 SHA 에서
    생성됐고 그 앵커와 독출 형태가 동결 기준점과 어긋나는 자리가 실재한다**(G5). 그 파일을 베끼면
    문서가 존재하지 않는 행을 가리키거나, 기본값이 실재하는 게이트를 *없음* 으로 적는다.
    값·앵커·미설정 동작은 전부 동결 blob 에서 재유도하고, 그 인덱스는 **어휘와 집합 이름만** 읽는다.

    형식 검사는 `13-relation-contract` 가 만든 `lint-docs.mjs` 가 전부 진다(UI2). 이 마일스톤이 새로
    만드는 검사는 그 lint 가 보지 않는 축이다 , 정본 재열거와 문서 정책 집합의 3자 대조, 게이트 이름의
    문서 횡단 누출, 표기와 확보 근거의 양방향 결속, 미배포 사실의 보존.
- **빌드 게이트 승격** · 49일 전 (insuniverse-docs-70-viewer-m6.plan.md)
  - 요약:
    두 생성기(`docs/viewer/anchor-freshness.mjs` → `docs/viewer/build-docs.mjs`)를 순서째 묶는 단일 진입 `docs/viewer/gate.mjs` 를 만들고, 두 소스가 머리 주석에 산문으로 선언한 fail-closed 계약을 **매 실행 재현하는 음성 프로브**로 내린다. PRD §Success Metrics 의 가드레일 행 *"뷰어 산출이 형식 위반 문서에서 실패해야 한다"* 가 이 창의 대상이다.

    **이 창이 만드는 것은 실패 동작이 아니다.** 관측 3 이 그것을 실측했다 , 형식 위반은 이미 이름 있는 실패이고 rc 1 이다. 없는 것은 그 주장을 재현하는 검사와, 재현하지 못한 지점이 몇 개인지 말하는 출력이다. 앞 창 하네스들이 음성 프로브 11건을 이미 갖고 있으나 네 계획서 창에 흩어져 있고 배타 소유 경로 밖이며, 그것이 `fail(` 지점 76 중 어디를 덮는지 세는 자리가 없다(관측 4·5).

    **순서 계약도 같은 자리에 있다.** 커밋된 `docs/viewer/build/anchor-freshness.json` 은 이 시점에 이미 낡았고 `--freshness` 빌드가 rc 1 로 거부한다(관측 2). 그 순서는 지금 `.claude/plans/insuniverse-docs-70-viewer-m4.gates.mjs` 검사 `#15` 안에 살아 있다 , 계획서 창이 끝나면 아무도 지지 않는 계약이다. backlog 이월 2건이 이 창을 인수처로 지목했다.
- `01-timeline.md` · 49일 전 (insuniverse-docs-60-history-deprecated-m4.plan.md)
  - 요약:
    `docs/90-history/01-timeline.md` 를 발행한다. 이 PRD 가 실 문서를 내는 **두 번째** 창이고,
    발행 대상은 `releases.yaml` 의 릴리스 노트 커밋 45건(`prod_merge` server 24 · site 7 · admin 14)과
    그것을 닮았으나 아닌 5건(`release_like_unmatched`)이다. 두 버킷은 마일스톤 3 이 발행한 발산
    257건과 sha 교집합이 0 이므로 이 창은 앞 창의 산출물을 다시 싣지 않는다.

    **이 연대기의 값어치는 그 사정거리를 함께 적을 때만 정직하다.** 릴리스 노트 커밋은 8일
    (2026-06-06 ~ 06-19, 폭 13일)에만 있고 인덱스 6,190행 중 그 창 안은 264행이다. 나머지 5,926행은
    연대기 축이 덮지 못한다 , 이력 자체는 708일이다. Q28(*"이 기능이 왜 이런 형태가 됐는지 역추적할
    수 있는가"*)의 시점 축이 이 문서 하나로 닫히지 않는다는 뜻이고, 그 사실을 문서가 스스로 적는다.

    **못 하는 판정이 둘이다.** (1) **릴리스 내용** , 병합의 `p1..p2` 로 유도하려면 두 부모 중 어느
    쪽이 prod 계보인지가 균일해야 하는데 저장소마다 갈린다: server 24건은 병합 자신과 첫 부모가
    prod 1차 부모 사슬 위에 있고, site 7 + admin 10 은 **둘째 부모만** 위에 있으며, admin 4건은
    **두 부모 다 사슬 밖**이다. (2) **배포 승격** , 태그 0 · `refs/replace` 0 이라 `prod_merge` 는
    제목 일치와 부모 토폴로지의 기록일 뿐이며 판정은 `00-protocol` 소관이다. 두 건은 이월로 올린다.
- 수치 한도 , `01-amounts-and-quotas.md` + `02-ttl-and-timeouts.md` + `03-rate-limits-and-batch.md` · 49일 전 (insuniverse-docs-30-contracts-limits-m6.plan.md)
  - 요약:
    `docs/04-limits/` 를 개설하고 세 문서를 만든다. PRD §Delivery Milestones 6행이 정한 결과는
    **"금액·시간·빈도 한도가 한 곳에"** 이며, 판정선은 온보딩 Q13 *"금액 상한·토큰 유효시간·요청 빈도
    한도가 각각 얼마이고 초과하면 사용자에게 무엇이 보이는가"* 다. 마일스톤 5 와 달리 이 마일스톤에는
    소유 온보딩 질문이 실재한다(G20).

    실측이 세 문서의 축을 하나로 묶는다. **한도의 하중은 값이 아니라 강제 층이다.** 충전 최소액은 admin
    입력 화면 상수로만 인덱스에 실려 있으나 실제 강제는 server DTO 두 자리와 서비스 가드 한 자리이며, 그
    셋은 **이름 없는 숫자 리터럴**이라 상수 인덱스가 한 건도 담지 않았다(G9). 반대로 금액 상한은 업무
    한도처럼 이름이 붙어 있으나 값이 부호 있는/없는 32비트 정수 경계이고 저장 칸의 폭 그대로다(G7·G8).
    **이름만 보면 정책이 아닌 것이 정책으로, 정책인 것이 이름 없이 사라진다.**

    실측이 문서 트리 설명 행을 반증하는 자리가 셋이다. `AUTH_TIMEOUT` 은 시간 상수가 아니라 오류 분류
    enum 멤버이고(G11), `VENDOR_TIMEOUTS` 는 실재하나 관리자 전용 시험 표면의 **산문 참조표**이며 아무것도
    강제하지 않는다(G12). `RATE_LIMIT_CERTIFY_PER_MIN` 은 `known_gates` 원소라 **이 PRD 자신의 횡단 누출
    규칙이 그 이름을 세 문서에서 금지한다**(G13). 세 문서는 자기 트리 설명 행을 그대로 쓸 수 없다.

    형식 검사는 `13-relation-contract` 가 만든 `lint-docs.mjs` 가 전부 진다(UI2). 이 마일스톤이 새로 만드는
    검사는 그 lint 가 보지 않는 축이다 , 값과 강제 층이 동결 SHA 에서 재유도되는가, 세 문서가 서로를 다시
    쓰지 않는가, `status` 가 prod 도달성과 맞는가, 게이트 이름과 형제 축 값이 새어 들어왔는가.
- 미결 처분 원장 + 리뷰 라운드 2 · 49일 전 (insuniverse-docs-40-runtime-vendor-legal-m7.plan.md)
  - 요약: 이 PRD 는 마일스톤 6행까지 `complete` 로 봉인됐으나 **자기 Success Metric 하나를 만족하지 않은 채 닫혔다** , *"리뷰 불일치 수렴 = 2라운드 연속 0건"* 인데 M6 원장은 `round: 1` 하나뿐이고 수렴 계수가 8, 미검증이 138 이다. 동시에 backlog 에 이 PRD 를 출처로 적은 행이 64건 쌓였고 그중 41건만 `id=` 를 갖고, 두 소비기(mccp `backlog.js` · 저장소 `fixtask-projection.mjs`)가 파싱 규칙이 반대라 **어느 쪽에서도 64행 전체가 보이지 않는다**(각각 43·21, 교집합 0). M7 은 새 문서를 쓰지 않는다 , **쌓인 미결에 판정을 붙이고, 라운드 2 를 실제로 돌리고, 4마일스톤 연속 막혔다고 기록된 회부 기록 자리를 연다.**
- 리뷰 2라운드 수렴 · 50일 전 (insuniverse-docs-20-foundation-access-m6.plan.md)
  - 요약:
    마일스톤 6 의 종료 조건은 *"유지보수자 표기가 2라운드 연속 0건"* 이고 측정자가 **사람**이다. 이 창은 그것을 닫지 못한다. 닫을 수 있는 것은 **표기가 앉을 자리를 만들고 라운드 1 을 돌리는 것**이다.

    산출은 넷이다. (1) 8문서의 검증 가능한 주장을 기계로 뽑은 행 단위 **원장** `.claude/plans/insuniverse-docs-20-foundation-access-m6.ledger.jsonl`. (2) 그 전 행의 **라운드 1 표기** , `ok` · `사실과다름` · `빠짐` · `미검증` 넷. (3) M1~M5 어느 게이트도 읽지 않던 축 **둘의 신설 검사** , 본문 코드 인용 405건의 동결 트리 해석과 `## 연혁` SHA 46건의 이름공간 판정. (4) 온보딩 10문항의 **답변 좌표 대응표** , PRD §Success Metrics 아홉 행 중 게이트가 없는 두 자리 중 하나다.

    라운드 1 의 실질은 관측 6 이 이름으로 낸다 , `01-glossary.md` 의 `## 연혁` 이 인용한 SHA `b674f52` 는 세 서브모듈 어디에도 없고 이 저장소 커밋이며, 그 커밋은 `.claude/settings.json` 한 줄만 바꾼 `chore` 다. 그 행이 요약하는 *"문서 신설"* 을 실제로 한 커밋은 `007c14b` 다. 흡수는 그 한 행의 SHA 를 정정하는 것이고, 신설 검사 `#9` 가 그 정정을 결박한다.

    라운드 2 는 사용자 몫이며 이 창에 없다. PRD 마일스톤 표 6행은 `complete` 가 아니라 `in-progress` 로 간다.
- **연결 탐색** · 52일 전 (insuniverse-docs-70-viewer-m4.plan.md)
  - 요약:
    마일스톤 2·3 이 세운 항목 카드에 **연결 축 둘**을 붙인다. 첫째는 **엣지 그래프** , `surfaces[].exits` 와 `flows[].refs`·`status_source` 를 정방향으로 해결하고 그 **역방향을 유도**해 두 방향을 함께 카드에 싣는다. 둘째는 **actor × 서비스 역인덱스** , 두 운반체(`flows[].actor` 필드 · `## 적용 범위` 표 헤더 열)에서 축을 유도해 관측 어휘마다 지면을 하나씩 낸다. 지표 B2 는 B1 과 같은 방식으로 **정의를 문면에 고정**하고 산출이 실행마다 다시 잰다.

    **이 창의 실측이 PRD 의 두 전제를 정정한다.** (1) `exits` 575건은 **전건 문서 안** 엣지다 , 문서를 건너는 `exits` 는 0건이고 그래프 운반 문서는 IA 2건뿐이다(관측 2). (2) `## 적용 범위` 표의 열은 다수가 서비스이고 actor 열을 가진 문서는 21 중 15 다 , actor 축은 항목 492 중 195 만 덮는다(관측 4). 그러므로 이 창의 산출은 "전 항목이 역으로 찾힌다" 가 아니라 **덮은 부분집합과 못 덮은 부분집합이 각각 계수로 보이는 표면**이다. 평균 조작 수 하나로 접으면 못 덮은 297건이 그 평균 뒤로 사라진다.

    계약 #6(actor 어휘 정규화)은 `00-protocol` 소유이며 미반영이다. 이 창은 어휘를 **정규화하지 않는다** , 관측 어휘 9종이 각자 지면을 갖고, config 밖 4종은 그 사실이 표기된 채 남는다.
- 리뷰 2라운드 수렴 · 52일 전 (insuniverse-docs-40-runtime-vendor-legal-m6.plan.md)
  - 요약:
    마일스톤 6 의 종료 조건은 *"표기가 2라운드 연속 0건"* 이고 측정자가 **사람**이다. 이 창은 그것을 닫지 못한다. 닫을 수 있는 것은 **표기가 앉을 자리를 만들고 라운드 1 을 돌리는 것**이다.

    산출은 넷이다. (1) 11문서의 검증 가능한 주장을 기계로 뽑은 행 단위 **원장** `.claude/plans/insuniverse-docs-40-runtime-vendor-legal-m6.ledger.jsonl`. (2) 그 전 행의 **라운드 1 표기** , `ok` · `사실과다름` · `빠짐` · `미검증` 넷. (3) M1~M5 어느 게이트도 읽지 않던 축의 **신설 검사** , 본문이 `<파일>:<행>` 으로 부르는 코드 인용 296건을 동결 트리에 해석한다. (4) 온보딩 10문항의 **답변 좌표 대응표** , PRD Success Metrics 아홉 행 중 유일하게 게이트가 없던 자리다.

    라운드 1 의 무게중심은 lint 도 M1~M5 하네스도 보지 않는 자리다. 관측 4 가 그 자리를 이름으로 낸다 , 프론트매터 앵커 238건은 전건 해석되고 다섯 하네스가 그것을 이미 물지만, **본문 코드 인용 296건은 어느 검사도 읽지 않는다.** 읽어 보니 288건이 정확 경로로 풀리고 8건은 기저명만 적혀 있어 탐색 없이는 안 풀린다. 흡수는 그 8건을 저장소 상대 경로로 정규화하는 것이고, 그 뒤 296/296 이 결정적으로 풀린다.

    라운드 2 는 사용자 몫이며 이 창에 없다. PRD 마일스톤 표 6행은 `complete` 가 아니라 `in-progress` 로 간다.
- `04-authz-db-menu.md` + `05-admin-view-token.md` · 52일 전 (insuniverse-docs-20-foundation-access-m5.plan.md)
  - 요약:
    `docs/02-access/` 의 마지막 두 문서를 `policy-doc@1` 로 저작해 이 PRD 의 산출 문서 8종을 닫는다. `04-authz-db-menu.md` 가 `auth_layers` 5층(메뉴 노출 · **비차단**)을, `05-admin-view-token.md` 가 층 축 밖의 개별 guard 를 맡는다. 온보딩 질문 `Q07`·`Q08`·`Q45` 가 이 두 문서의 종료 판정 대상이다.

    **메뉴 축의 핵심은 소스가 actor 마다 다르다는 것이다.** admin 만 운영 DB 트리를 런타임에 조회하고, sales·corp 는 프론트 상수 배열을 브라우저에서 필터링하며 트리 조회를 아예 하지 않는다. corp 는 코드 네임스페이스까지 다르다. 셋을 한 문서 안에 나란히 놓는 것이 PRD §반드시 지킬 것의 확정 사항이며, 문서를 쪼개면 8종 상한이 깨지고 `00-index.md` 트리 개정이 붙는다.

    **비차단성을 정책으로 세운다.** PRD §Risks 가 이 축의 최대 오독으로 지목한 것이 *"메뉴 권한을 API 인가로 오해한 채 서술"* 이고, 온보딩 질문 `Q07` 이 그것을 직접 묻는다. 산문 문단으로만 두면 게이트가 보지 못하므로 `MENU_LAYER_NONBLOCKING` 을 본문 첫 정책으로 세워 앵커와 예외 행을 갖게 한다. PRD §형식 계약 증분의 정책 표는 admin 분할을 정한 표이지 정책 **개수**를 닫은 표가 아니다 , 그 표의 4행은 이 문서 정책 집합의 부분집합으로 그대로 실린다.

    **admin 축만 정책 둘로 갈린다.** 트리 구조와 런타임 조회 경로는 코드가 말하므로 본문 `active-prod` 이고, 권한그룹 → 메뉴 배분은 운영 DB 행이라 `data-dependent-unknown` 으로 `## 부록` 에 격리한다(C1 `placement` · C2 `unknown_reason`). 그래야 본문의 actor 3절이 나란히 선 채로 미확보분만 빠진다. 승격 게이트 G1~G4 는 이 PRD 소유 밖이며 이 마일스톤은 그것을 기다리지 않는다.

    **corp 필터가 착수 시점 실측에서 2축으로 넓어졌다.** 프론트 상수 필터가 기업역할과 기업 노출 등급 두 값을 함께 읽어 메뉴 집합을 줄인다. 그 두 값은 3·4층 소관(`03-authz-capabilities.md`)이므로 이 문서는 **읽는다는 사실과 그 자리**까지만 쓰고 층 자체를 다시 서술하지 않는다(UI6). 그리고 저장소 안 동결 추출기는 corp 실효 집합을 그 두 값과 **무관하게** 산출한다 , 그 갈림이 이 창의 findings 관측이다.

    **`supersedes` 는 쓰지 않는다** (PRD 마지막 Open Question 의 답). 유예 원소는 `60-history-deprecated` 마일스톤 2 가 2026-08-25 에 키트 fixture 스펠링으로 **재지정**했고 같은 창에서 `legacy-admin-view.md` 를 placeholder 로 판정했다. PRD C5 행과 Open Question 이 적은 `../99-deprecated/legacy-admin-view.md#…` 는 그 재지정 이전 값이다. 승계 대상이 될 폐기 배치 정책이 저장소에 없고 `docs/99-deprecated/**` 는 `60` 소유라 이 PRD 가 만들 수 없다. 코드 안 구판 토큰 호환은 폐기 문서가 아니라 이 문서의 `## 예외·폴백` 행으로 적는다.

    **단명토큰의 강제는 환경 게이트에 걸려 있고 그 값이 저장소에 없다.** 게이트가 켜지지 않은 동안 미검증 요청은 경고 로그만 남기고 통과한다. 그래서 그 정책은 `conditional-unknown` 이고 `## 부록` 이다. 발급·결박·전달·신원 복원·서명키 다섯은 코드가 말하므로 본문 `active-prod` 이다.

    **계수는 manifest 를 통해서만 인용한다.** 하드코딩 메뉴 축은 `extraction-manifest.yaml` 이 `code_count` 와 `set_sha256` 을 본문에 싣고 커밋된 추출기가 그것을

    … (요약이 길어 잘렸습니다. 전문은 plan 원문 참조)
- site 흐름 5종 + 리뷰 · 52일 전 (insuniverse-docs-50-domain-m6.plan.md)
  - 요약:
    이 마일스톤은 `docs/20-site/` 의 흐름 문서 5편(`flow-doc@1`)을 쓰고, 그 5편에 대해 리뷰 라운드 1 을 원장으로 돌린다. 마일스톤 3(admin 흐름 저작)과 마일스톤 4(admin 리뷰 원장)가 두 창에 나뉘어 있던 것이 여기서는 한 창에 있다 , 마일스톤 표 6행이 그렇게 정해져 있다.

    **입력의 성질이 마일스톤 3 과 두 자리에서 다르다.** 첫째, 총론이 이제 실재한다 , 마일스톤 3 창에는 `docs/02-access/**` · `docs/03-contracts/**` · `docs/06-vendors/**` 가 한 파일도 없어 링크를 걸 수 없었는데(그 창의 관측 4) 지금은 lint glob 아래 24문서가 있고 그중 벤더 정책 4편이 전부 `conditional-unknown` 이다. 그래서 이 창의 흐름 대부분은 지배자가 `conditional-unknown` 이고 `unknown_reason` 이 필수다. 둘째, 이 창은 마일스톤 5 가 남긴 이월 2건을 인수처로 지목받았다 , `id=50m5-exits-page-file-scoped`(exits 유도가 페이지 파일 한 겹에서만 돌았다)와 `id=50m5-dangling-navigate-targets`(등록 라우트가 없는 이동 대상 4건).

    산출은 흐름 문서 5편 · 게이트 하네스 1개 · 리뷰 원장 1개 · 용어 요청 1건 · 발신 회부 1건 · backlog 이월 · PRD 두 자리 전이다. `docs/20-site/00-ia.md` 는 읽기 전용이며 바이트 동일을 게이트가 문다.
- 대외 계약 , `05-external-client-api.md` · 52일 전 (insuniverse-docs-30-contracts-limits-m5.plan.md)
  - 요약:
    `docs/03-contracts/05-external-client-api.md` 한 건을 만든다. PRD §Delivery Milestones 5행이 정한
    결과는 **"고객사 API 의 에러 규약 층 분리가 문서로 존재한다"** 이며, PRD §신설 사유 가 그 첫 절을
    `E0001` 3중 의미로 지목한다.

    실측은 그 지목을 확인하면서 두 자리를 넓힌다. 첫째, 같은 **코드값**이 세 표에서 갈리는 것만이
    아니라 같은 **심볼 이름**이 두 표에서 서로 다른 값으로 export 된다(G8). 둘째, 이 축을
    `docs/01-foundation/03-error-codes.md` 가 스스로 열어 두었다 , 그 문서의 `ERROR_CODE_NOT_UNIQUE` 는
    `limitations` 에 *"파일을 건너선 중복은 이 문서가 열거하지 않는다"* 를 명시한다(G12). 이 문서가
    채우는 자리는 그 문장이 비워 둔 자리다.

    실측이 PRD 문면을 반증하는 자리도 둘이다. **대외 표면은 `modules/client/` 디렉터리가 아니다**
    , 그 아래 아홉 컨트롤러 중 대외 자격 증명 관문을 다는 것은 하나뿐이고, 관문을 다는 또 하나는
    그 디렉터리 **밖**에 있다(G3·G4). 그리고 껍데기 컨트롤러는 PRD 가 적은 한 건이 아니라 두 건이다
    (G5).

    형식 검사는 `13-relation-contract` 가 만든 `lint-docs.mjs` 가 전부 진다(UI2). 이 마일스톤이 새로
    만드는 검사는 그 lint 가 보지 않는 축뿐이다 , 표면 경계·라우트·계약 옵션 결속이 동결 SHA 에서
    재유도되는가, 문서가 주장하는 **층 분리가 세 상수 표의 실측으로 재구성되는가**, `status` 가 prod
    도달성과 맞는가, 형제 문서 소유의 값이 새어 들어왔는가, 기획 절 서술이 순수한가.
- `02-reverted-policies.md` · 52일 전 (insuniverse-docs-60-history-deprecated-m2.plan.md)
  - 요약:
    `docs/99-deprecated/` 아래 첫 문서를 발행한다. 발행은 **M1 이 심어 둔 차단 2건을 먼저 닫아야**
    가능하다 , `check10` 의 `PUBLICATION_BLOCKING_DEFERRALS` 가 `60m1-sha-unresolvable`·
    `60m1-adjudication-unproven` 두 backlog 행의 닫힘 표식을 요구하고, 그것 없이 `DEP_DIR` 아래
    문서가 하나라도 생기면 게이트가 붉어진다.

    **이 창은 `02-reverted-policies.md` 하나만 낸다.** 초안은 `01-removed-features.md` 를 함께 냈으나
    실측이 그것을 기각했다 , 삭제 축의 `deprecated-confirmed` 4건은 근거가
    `deletion:absent-and-prod-unreached`, 즉 **삭제 커밋이 prod 에 안 갔다**는 뜻이고(G21), 그중 둘은
    삭제 커밋이 곧 동결 HEAD 다. PRD 필터 5(*prod 배포에 포함됐는가*) 기준으로 그 4건은 확정 불가이며
    *"미판정을 폐기로 쓰지 않는다"*(UI8)가 그것을 막는다. 삭제 축 전체(확정 후보 4 + `dead-code-candidate`
    809)는 참조 카운트 축을 기다리므로 **새 마일스톤 2b** 로 뺀다(UI17).

    **판정 원장은 인덱스가 아니라 이 PRD 가 쓴다.** `policy-candidates.git.jsonl` 은 전 행이
    `requires_corroboration: true` 이고 그 README 가 *"이 파일들의 어떤 값도 단독으로 결론이 아니다"* 로
    못 박는다(G22). 인덱스의 `status: deprecated-confirmed` 는 **git 축 관측**이지 PRD 5중 필터의 확정이
    아니다. 그래서 `02-reverted-policies.md` **본문**에 5중 필터 원장을 두고 축마다 근거 앵커를 인용한다 ,
    그 원장이 `60m1-adjudication-unproven` 이 요구한 후보↔노드 결속이고, 소비자(이 PRD)가 소유한다.

    **R-4 프론트매터는 4필드 그대로다.** 초안은 `candidate:` 를 5번째 필드로 두었으나
    `ownership.md` R-4 수용 셀이 발신 계약을 *필드 4종* 으로 못 박고 60 의 재량을 **그 필드들의 형태
    제약**으로 한정한다(G20). 필드 추가는 계약 개정이라 13 앞으로 새 회부 라운드가 필요하다 , 결속은
    프론트매터가 아니라 본문 원장이 지므로 R-4 는 손대지 않고 회부도 열지 않는다.

    **`sha` 는 형태가 아니라 해석으로 닫는다.** 발행한 단축 SHA 를 같은 생성 행의 필드와 비교하는 것은
    자기정합 검사이지 해석 검사가 아니다 , 낡거나 재생성으로 어긋난 행이 스스로를 통과시킨다. `check5`
    가 원장의 `repo` 를 manifest 3저장소로 제한하고 그 서브모듈에 `git cat-file -e <sha>^{commit}` 을
    돌려 실 커밋 객체임을 증명하며, 단축형이 **정확히 그 객체로** 해석되는지까지 본다(G23). 서브모듈은
    이 워크트리에서 초기화돼 있어 실행 가능하다(G24).

    **유예 원소는 (b) 경로로 연다**(UI13). `deferred_ref_targets` 의
    `../99-deprecated/legacy-admin-view.md#LEGACY_ADMIN_VIEW_TOKEN` 을 키트 자기완결 스펠링으로
    **교체**하고 그 스펠링을 드는 doc-kit 3파일을 함께 고친다. 두 표면(`--selftest` · 스테이징 재현)
    양쪽에서 rc 0 임을 실측했다(G8·G9).

    **M1 하네스는 이 창에서 `check3` 이 붉어진다 , 그것이 정상이다.** `check3` 은 M1 기준선 커밋의 PRD
    blob 에서 위임 경로 집합을 유도하는데 이 창이 6행째를 더한다. M2 가 인수한 것은 PRD §Delivery
    Milestones M2 행이 명시한 **`check10` 하나**이고, 위임 축은 이 창의 하네스 `#3` 이 자기 기준선으로
    다시 진다(G1

    … (요약이 길어 잘렸습니다. 전문은 plan 원문 참조)
- **신뢰 등급 가시화** · 52일 전 (insuniverse-docs-70-viewer-m3.plan.md)
  - 요약:
    마일스톤 2 의 생성기 `docs/viewer/build-docs.mjs` 가 내는 카드에 **신뢰 등급 축 둘**을 세운다. 첫째는 `status` , `template-config.yaml` 의 `statuses` 8종과 `status_precedence` 에서 유도한 시각 위계, 그리고 `placement` 3어휘(`body`·`appendix`·`deprecated`)에 따른 **같은 페이지 별도 지면 격리 + 필터**. 둘째는 **앵커 신선도** , 마일스톤 5 의 `anchor-freshness.json` 을 선택 입력으로 받아 항목별 `intact`·`modified`·`deleted` 를 status 와 **직교하는 별개 배지**로 낸다. `flows[].status_source` 승계는 승계원 문서·항목·status 와 지배 판정을 표면에 드러낸다.

    앵커 축을 이 창이 지는 것은 사용자 판정이며 근거는 두 인계다 , `.claude/plans/insuniverse-docs-70-viewer-m2.plan.md` §NOT Building 이 *"배지는 배지 축(마일스톤 3)에 붙는다"* 로 넘겼고, PRD §Open Questions 의 `anchors_qualified` 종결 항이 *"렌더 형태 자체는 마일스톤 2·3 소관"* 으로 적었다. 남은 마일스톤 어디에도 이 축의 인수처가 없다(4=연결 · 6=빌드 게이트 · 7=앵커 링크).
- `01-terms-and-agreements.md` + `02-privacy-and-masking.md` + `03-audit.md` · 53일 전 (insuniverse-docs-40-runtime-vendor-legal-m5.plan.md)
  - 요약:
    이 창은 법적 표면 7키(`legal-surfaces.yaml` `surface_traceability`)를 문서로 옮기고, 인덱스가 구조적으로 보지 못한 감사 축을 코드에서 직접 연다. PRD Success Metric 이 이 창만 겨냥해 신설한 검사가 **7키 대응**이고, 그 규약이 `absent-in-repo` 를 **본문**으로 지시한다 , 즉 이 마일스톤은 배치 규약상 본문 정책을 낼 수밖에 없는 첫 창이다.

    **M1~M4 가 본문 0건이었던 이유가 이 축에서는 성립하지 않는다.** 앞 네 창의 미판정은 전부 *배포 환경이 정하는 값*(env 게이트 · DB 편성)에 걸려 있었고 그 값은 저장소 밖이었다. 법적 축의 핵심 사실은 **저장 계층의 선언**이다 , 컬럼이 있는가 없는가, 제약이 걸려 있는가. 그것은 `docs/03-contracts/03-data-model.md` 가 이미 `active-prod` 9건으로 문서화한 것과 같은 부류이며(형제 PRD 선례), 활성성 판정의 오라클도 그 문서가 쓴 것과 같다 , `releases.yaml` `reachability.unreached` 와 앵커 blame 의 대조다.

    **그래서 이 창의 status 는 두 외부 오라클의 곱으로 나온다.** (1) `legal-surfaces.yaml` 의 `state` 가 어휘 자격을 정하고, (2) 앵커 blame × `unreached` 가 활성성을 정한다. 저자는 어느 쪽도 고르지 않고 `derive` 출력을 전사한다. 검사 `#3` 과 `#5` 가 같은 유도기를 다시 돌려 대조한다.

    **그 곱이 PRD Evidence 의 `[신]` 한 행을 둘로 가른다.** F-13 행은 *"약관 테이블에 버전 컬럼이 없다"* 와 *"`uniq_*` 이 타입당 1행 강제"* 를 한 근거로 묶었는데, 동결 트리 blame 은 둘을 갈라 놓는다 , 컬럼 부재는 `e9ae08db`(2024-09-02) · `78ca58ff`(2026-05-18) 로 **운영 도달**이고, 두 unique 제약은 `c577fd29`(2026-07-16) 하나로 **운영 미도달**이다(관측 3). 같은 문장 안의 두 절이 다른 활성성을 갖는다. 한 정책으로 묶으면 도달한 절이 미도달 절에 끌려 부록으로 사라진다 , PRD P-2 가 벤더 24 입도로 이미 판정한 실패 형태의 반복이다.

    **같은 갈림이 동의 기록에서 한 번 더 나온다.** 동의 5필드를 모두 갖는 유일한 경로 `tn_treat_car_request` 는 `8507677b`(2026-07-20) 라 **운영 미도달**이고, 운영에 도달한 동의 기록은 시각도 판도 없는 boolean 한 칸(`bod_marketing_agree`)뿐이다(관측 4). 즉 **"동의 시각이 부분적으로 기록된다" 는 인덱스의 `partial` 은 stg 문면이고, 운영 문면은 그보다 얇다.**

    **감사 축은 인덱스가 구조적으로 못 본 자리다.** `legal-surfaces.yaml` `blind_spots` 가 `audit-log-table` 을 스스로 적었고 후보 인덱스에 `axis: legal` 7행 중 감사 행이 없다. 그런데 형제 PRD 산출물이 이미 그 자리를 비워 두고 회부했다 , `docs/30-admin/01-admin-console.md` 가 어휘 3종 스캔 0건을 적고 *"이력의 소재가 이 문서에 없다"* 로 닫았다(관측 8). `03-audit.md` 는 그 스캔을 **재현**하고 우주를 넓혀 실제 소재를 낸다: 행위자 컬럼 9자리 · 운영 로그 5표 · 업무 이력 7표, 그리고 **열람은 어느 표에도 남지 않는다.**
- 상태 전이 , `04-state-transitions.md` · 53일 전 (insuniverse-docs-30-contracts-limits-m4.plan.md)
  - 요약:
    `docs/03-contracts/04-state-transitions.md` 한 건을 만든다. 온보딩 Q12 , *"분석·주문·구독·결제
    상태가 어떤 순서로 전이되고 그 값을 site 와 admin 이 각각 어떻게 소비하는가"* , 가 이 문서의
    판정선이다.

    PRD §Delivery Milestones 4행이 정한 결과는 **"ANS/ODD/SUB/PAY 전이가 3계층 관통으로 닫힘"**
    이다. 그런데 실측은 그 네 갈래 중 하나를 반증한다 , 분석 타입 어휘는 상태가 아니고 전이가
    없다(G6). 문서는 없는 전이를 그리지 않고 **왜 그것이 상태가 아닌지**를 쓴다. 나머지 세 갈래는
    전이가 실재하고, 그 값을 소비하는 두 저장소의 사전이 발행자와 어긋나는 자리가 실측으로 다섯
    군데 있다(G9~G12). PRD §반드시 지킬 것 의 *"한 저장소만 보면 전이가 안 닫힌다"* 가 가리키는 것이
    그 자리다.

    형식 검사는 `13-relation-contract` 가 만든 `lint-docs.mjs` 가 전부 진다(UI2). 이 마일스톤이 새로
    만드는 검사는 그 lint 가 보지 않는 축뿐이다 , 문서가 든 코드값 집합이 동결 SHA 세 저장소에서
    재유도되는가, 문서가 주장하는 **불일치가 양측 실측으로 실재하는가**, `status` 가 prod 도달성과
    맞는가, 형제 마일스톤 소유의 값이 새어 들어왔는가, 기획 절 서술이 순수한가.
- `03-divergence.md` · 53일 전 (insuniverse-docs-60-history-deprecated-m3.plan.md)
  - 요약:
    이 PRD 가 **실 문서를 처음 발행하는 창**이다. 앞의 세 창(M1·2r·2b)은 계약·판정 원장만 냈고
    확정 0건이라 발행하지 않았다. `docs/90-history/` 는 그 창들을 막던 두 조건 어느 쪽에도 걸리지
    않는다 , 발행 차단 이월 2건의 사정거리가 `docs/99-deprecated` 뿐이고
    (`insuniverse-docs-60-history-deprecated-m1.gates.mjs` 609행 `PUBLICATION_BLOCKING_DEFERRALS` ·
    같은 파일 50행 `DEP_DIR`), R-4 프론트매터 계약도 그 디렉터리 전용이며, 두 경로 다 lint glob 밖이다
    (`golden.txt` `lint.glob_exceptions`).

    산출은 커밋 단위 발산 **257건 전건**(prod-only 102 · stg-only 155)이고, 그 위에 **이 문서가 내리지
    못하는 판정 두 개**를 이름으로 남긴다.

    1. **prod 도달은 배포됨이 아니다.** 3저장소 태그 0개 · `refs/replace/*` 0개라 저장소 안에 릴리스를
       확증할 독립 증거가 없다. `releases.yaml` 머리말이 그 판정을 `00-protocol` 소관으로 이미 밀었다.
    2. **발산 축의 참조 카운트가 구조적으로 비어 있다.** prod-only 102건이 `commits.<repo>.jsonl` 에
       **0/102** 이고, `comments.*.jsonl`·`policy-candidates.code.jsonl`·`.runtime.jsonl` 에는 커밋 앵커
       필드 자체가 없다. 모든 하류 인덱스가 동결 stg HEAD 를 기준선으로 잡는데 prod-only 는 정의상
       `--not <frozen_head>` 이다. PRD §Risks 의 완화책 *"참조 카운트 병행 확인"* 은 이 창에서 작동하지
       않으며 그 사실을 숨기지 않는 것이 산출의 일부다.

    발행이 시작되므로 **M1 하네스 `check6` 의 *M1 무산출* 불변식이 downstream 전체를 막는다.** 지우지
    않고 귀속 검사로 옮긴다 , 2b 가 M2 `check9` 에 한 것과 같은 수술이다.
- site 화면 축 · 53일 전 (insuniverse-docs-50-domain-m5.plan.md)
  - 요약:
    이 마일스톤은 `docs/20-site/00-ia.md`(`ia-doc@1`) 한 편을 쓴다. 마일스톤 2 의 admin 판과 산출 형식은 같지만 **입력의 성질이 다르다** , admin 은 `extraction-manifest.yaml` §screen_codes 라는 동결 인벤토리를 `verify.sh` 가 매 실행 재검증해 주는 땅 위에 섰고, site 에는 그런 인벤토리가 저장소 어디에도 없다.

    그래서 이 창은 화면 집합을 **동결 blob 에서 직접** 유도한다. site 의 라우트 정본은 객체 배열이 아니라 `insuniverse-site` 동결 HEAD 의 `front/src/App.tsx` 안 JSX `<Routes>` 트리 하나이며, 그것을 읽는 추출기는 이 마일스톤의 게이트 하네스가 자체로 갖는다. 그 결과 집합은 저장소 상시 게이트가 아니라 이 일회용 하네스만 재검증한다 , 그 사실이 마일스톤 5 의 Outcome 이 요구하는 **동결 대조 부재**이며, 문서 본문과 게이트 출력 양쪽에 이름으로 나온다.

    산출은 IA 문서 1편 · 게이트 하네스 1개 · PRD 두 자리 전이(마일스톤 4행 종료 · `*Status:` 이동) · 발신 회부 1건 · backlog 이월이다. 마일스톤 표 5행의 `in-progress` 와 Plan 셀은 `/mccp:plan` 이 착수 시점에 이미 썼고, 이 창의 전이는 나머지 두 자리다. site 흐름 5종은 한 편도 쓰지 않는다.
- **읽는 표면 최소본** · 53일 전 (insuniverse-docs-70-viewer-m2.plan.md)
  - 요약:
    문서 18건(741.8 KB · 항목 310)을 정적 HTML 로 렌더하는 생성기를 `docs/viewer/build-docs.mjs` 에 세운다. 산출은 `docs/viewer/build/` 안에서 끝나고 `.gitignore` 59행의 `build/` 가 덮는다. 표면 2(기획/개발 lane 토글) · 표면 4(전문 검색) · 템플릿 3종 전건 렌더 · 항목 단위 조립 뷰가 이 창의 산출이며, 신뢰 등급 배지(마일스톤 3) · 연결 그래프(마일스톤 4) · 빌드 게이트 승격(마일스톤 6)은 범위 밖이다.

    사용자 판정으로 **선행조건 1 을 우회한다** , `docs/_meta/findings/70-viewer.md` 신설과 `ownership.md` §승계 시 추가 등재는 golden 을 움직이므로 이 창에서 하지 않고, 형제 PRD `20-foundation-access` 가 재동결 슬롯을 놓을 때까지 이월한다. 남은 선행조건 2·3 은 "대상 PRD 착수 시점" 조건이라 이 창의 Task 2 가 이행한다.
- `02-authz-roles.md` + `03-authz-capabilities.md` · 53일 전 (insuniverse-docs-20-foundation-access-m4.plan.md)
  - 요약:
    `docs/02-access/` 의 두 번째·세 번째 문서를 `policy-doc@1` 로 저작한다. PRD §형식 계약 증분 표가 정한 `auth_layers` 대응대로 `02-authz-roles.md` 가 2층(계정 종류 · 403)을, `03-authz-capabilities.md` 가 3층(쓰기 스코프)과 4층(기업 노출 등급)을 맡는다. 온보딩 질문 `Q05`·`Q06`·`Q38` 이 이 두 문서의 종료 판정 대상이다.

    착수 전 실측이 두 문서의 축을 정했다. **역할 층의 강제는 데코레이터가 아니라 가드 결선이 정한다.** 역할 어휘는 세 값으로 닫혀 있으나, 그 값을 읽는 가드가 컨트롤러마다 `@UseGuards` 로 개별 결선되고 전역 등록이 없다. 그리고 그 가드는 역할 메타데이터가 없으면 **통과시킨다** , 가드는 붙었는데 역할 선언이 0건인 표면이 실재한다. 그래서 "역할 선언 개소" 를 모집단으로 잡으면 그 표면이 통째로 사라진다.

    **모집단 정정 (코드리뷰 흡수).** 가드 결선으로 잡아도 부족하다 , 역할 가드를 **아예 걸지 않은** 콘솔 표면이 따로 있고, 그 표면은 인증만으로 통과한다. 결선 모집단에서는 그 자리가 표에 나타나지 않아 모듈 합집합의 필요조건 주장이 두 모듈에서 거짓이 됐다. 모집단은 **콘솔 인증 층을 건 컨트롤러 전건**이며, 통째로 주석 처리된 죽은 컨트롤러는 제외한다.

    **요약 축은 모듈 단위 합집합 표다** (PRD Open Question 1건의 답). 핸들러 단위 전수는 이미 `docs/_meta/index/policy-anchors.yaml` 의 `role_matrix` 가 들고 있고, 문서가 그것을 전사하면 두 번째 정본이 생겨 드리프트한다. 문서는 모듈 축 합집합 표(36행)와 핸들러 단위 판정 절차를 쓰고, 표가 **셋째 열이 빈 모듈에서만 필요조건**임을 명시한다 , 그 모듈에 한해 역할이 집합 밖이면 확실히 차단이고, 안이면 핸들러를 확인해야 한다. 클래스 선언과 메서드 선언이 섞여 있어 합집합이 개별 핸들러보다 넓기 때문이다.

    **능력 층은 이름이 둘이고 폴백 방향이 표면마다 반대다.** 같은 기업역할 축이 응답 본문과 토큰 payload 에서 서로 다른 필드 이름을 쓴다. 쓰기 스코프 가드는 조직 스코프가 아닌 주체를 통과시키고(서버 쪽 관대), 관리자 콘솔 화면은 판정 불가한 기업 주체를 조회전용으로 접는다(클라이언트 쪽 보수). 노출 등급은 척도(코드)와 기업별 배정값(운영 DB)이 갈리므로 **정책을 둘로 쪼갠다** , 척도는 본문 `active-prod`, 배정값은 `data-dependent-unknown` 으로 **`## 부록`** 에 격리한다(PRD §형식 계약 증분 C1 `placement` · C2 `unknown_reason`). PRD Open Question 의 *"후자면 `data-dependent-unknown`"* 은 이 분할로 답한다 , 척도는 코드에 있고 배정값만 데이터 의존이다.

    **계수를 적지 않는다.** `extraction-manifest.yaml` 이 이 축에서 동결하는 것은 역할 선언 자리 집합(`roles.set_sha256`)과 그 계수 하나뿐인데, 그 계수는 토큰 출현 수라 주석 언급 1건을 포함한다. 저장소 안 읽기 전용 자산 두 자리는 또 다른 값을 적고 있다. 문서는 세 값 중 어느 것도 인용하지 않고 **집합만** 대조하며, 세 자리 갈림은 findings 관측으로 남긴다.
- `01-treat-providers.md` + `03-payments.md` + `04-messaging.md` · 54일 전 (insuniverse-docs-40-runtime-vendor-legal-m4.plan.md)
  - 요약:
    M3 가 벤더의 **응답 의미**를 열었다면 이 창은 그 앞 단계, **연동 자체가 무엇에 걸려 있는가**를 연다. `vendor-behaviors.yaml` 은 벤더 8종에 대해 `outcomes` 말고도 `timeout` · `fallback` · `normalization` · `exception` · `env_gates` 를 갖는데 M3 는 `outcomes` 만 소비했다. 남은 층이 35칸이고 그것이 이 창의 뼈대다 , treat 5벤더 × 4층 = 20 · smartro/toss 2벤더 × 5층 = 10 · aligo 1벤더 × 5층 = 5(관측 3).

    **이 창이 더하는 판정은 "미판정" 이 한 종류가 아니라는 것이다.** M1~M3 는 미판정 전건을 `conditional-unknown` 하나로 닫았다. 그 세 창의 게이트가 전부 env 였기 때문이고, env 게이트의 값은 EventBridge 규칙·실 task-def 와 함께 이 PRD 범위 밖이라 **닫을 경로가 없다**(우산 §Out of scope). 그런데 진료 공급자 축은 다르다 , 풀 구성도 자동차 수집 범위도 **DB 설정이 정본이고 env 는 폴백**이다(관측 5·6). DB 는 저장소 밖이지만 **닫을 경로가 이름을 갖고 있다**: PRD §저장소 밖 근거 축이 `ops-40-db-snapshot` 을 그 경로로 이미 지목했다. 어휘 8종에 `data-dependent-unknown` 이 이미 있으므로 신설 없이(UI12) 두 미판정을 가른다. 그 갈림이 이 마일스톤의 산출물이고, 검사 `#5` 가 동결 트리 재스캔으로 그 분류를 다시 만든다 , 저자가 고르지 않는다.

    **배치는 다시 전건 부록이고 본문 정책은 0건이다.** `conditional-unknown` 과 `data-dependent-unknown` 둘 다 `placement: appendix` 이고, 본문 배치를 갖는 3값은 전부 도달·활성을 주장하는데 이 축에 도달 증거가 없다. **네 번째 반복이며 그 사실을 숨기지 않는다** , 다만 이 창의 `## 정책 (기획)` 산문은 M1~M3 의 논거를 복제하지 않고 *연동 층의 발효가 벤더 응답이 아니라 편성 값에 걸려 있다* 는 이 문서군 고유의 사유를 적는다.

    **FCM 은 인덱스가 벤더로 보지 않는다 , 그 사각을 04-messaging.md 가 진다.** `extract-runtime-scale.mjs` 의 `VENDOR_KEYWORDS` 는 8원소이고 `fcm` 이 없다(관측 8). 그래서 `vendor-behaviors.yaml` 의 카디널리티 불변식 *"vendors 키 8 == VENDOR_KEYWORDS 원소"* 가 FCM 을 구조적으로 배제한다. 그런데 `configuration.ts 135행` 에 `fcm:` 블록이 있고 `FcmException` 의 형태는 `ALigoException` · `TossException` · `SmartroException` 과 같다. **인덱스가 적용하는 구조 시험을 전부 통과하는데 키워드 집합 밖이라 항목이 안 된 것**이며, 이 문서는 그 층을 코드에서 직접 유도하고 검사 `#14` 가 차집합을 매 실행 출력에 낸다.

    **수치는 옮기지 않는다.** `VENDOR_TIMEOUTS` 류 상수의 정의는 `30-contracts-limits` 소유이고(UI5) `docs/04-limits/` 는 아직 없어 참조도 못 건다. 그래서 이 창은 타임아웃을 **해석**만 한다 , 만료되면 디스패처가 어느 분기로 가는가. 검사 `#6` 이 인덱스의 `timeout` · `stage_ttl_ms` 수치 전건을 재유도해 세 문서에서 0회임을 문다. 값을 옮기지 않았다는 주장이 산문이 아니라 게이트가 되는 자리다.

    **PRD Evidence 의 `[구-SHA]` 3행이 이 창의 재측정 대상이고 결과가 셋으로 갈린다.** 웹뷰 브리지 규모는 동결 site `767d1e44` 에서 `BRIDGE_NAME` 32회 · `postMessage` 9회로 **구값과 정확히 일치**했고(관

    … (요약이 길어 잘렸습니다. 전문은 plan 원문 참조)
- 데이터 모델 , `03-data-model.md` · 54일 전 (insuniverse-docs-30-contracts-limits-m3.plan.md)
  - 요약:
    `docs/03-contracts/03-data-model.md` 한 건을 만든다. 온보딩 Q11 , *"이 테이블에서 정책적 의미를
    갖는 제약은 무엇인가. 단순 기술적 기본값과 어떻게 구별하는가"* , 이 이 문서의 판정선이다.

    PRD §Delivery Milestones 3행이 정한 결과는 **"데이터 제약이 정책으로 읽힘 (테이블 목록이 아니라)"**
    이다. 따라서 이 문서는 테이블을 열거하지 않는다. 제약의 **갈래**와 그 갈래가 이용자에게 만드는
    결과를 쓰고, 어느 테이블·컬럼이 그 갈래에 속하는지는 앵커로만 답한다.

    형식 검사는 `13-relation-contract` 가 만든 `lint-docs.mjs` 가 전부 진다(UI2). 이 마일스톤이 새로
    만드는 검사는 그 lint 가 보지 않는 축뿐이다 , 앵커가 동결 SHA 에서 해석되는가, `status` 가 prod
    도달성 실측과 맞는가, 문서에 실린 계수가 **인덱스가 아니라 소스**에서 재유도되는가, 형제
    마일스톤 소유의 값(상태 코드값·한도값)이 새어 들어왔는가, 기획 절 서술이 순수한가.
- admin 리뷰 2라운드 수렴 · 54일 전 (insuniverse-docs-50-domain-m4.plan.md)
  - 요약:
    마일스톤 4 의 종료 조건은 *"유지보수자 표기가 2라운드 연속 0건"* 이고 측정자가 **사람**이다. 이 창은 그것을 닫지 못한다. 대신 닫을 수 있는 것을 닫는다 , **표기가 앉을 자리를 만들고 라운드 1 을 돌린다.**

    산출은 셋이다. (1) admin 6문서의 검증 가능한 주장을 기계로 뽑은 **행 단위 원장** `.claude/plans/insuniverse-docs-50-domain-m4.ledger.jsonl`. (2) 그 전 행에 붙인 **라운드 1 표기** , `ok` · `사실과다름` · `빠짐` · `미검증` 넷이며 뒤의 둘은 사유를 함께 진다. (3) `사실과다름`·`빠짐` 판정분의 **흡수와 반사실 확인**.

    라운드 1 의 무게중심은 lint 도 마일스톤 3 하네스도 보지 않는 자리다. 관측 4 가 그 자리를 이름으로 낸다 , 본문이 `<파일>.ts:<행>` 형태로 부르는 코드 코드스팬 90건 중 29건이 그 흐름의 `anchors[]` 에 없다. 앵커가 없으면 동결 SHA 에 결박되지 않고, 결박되지 않으면 코드가 움직여도 아무 게이트가 붉어지지 않는다.

    라운드 2 는 사용자 몫이며 이 창에 없다. PRD 마일스톤 표 4행은 `complete` 가 아니라 `in-progress` 로 간다.
- **앵커 신선도** · 54일 전 (insuniverse-docs-70-viewer-m5.plan.md)
  - 요약:
    문서 프론트매터의 코드 앵커가 동결 기준점 이후 어떻게 됐는지를 `intact`·`modified`·`deleted` 로 계수하는 생성기 하나를 만든다. 입력은 manifest `repos[].head` 와 서브모듈 저장소뿐이고 데이터 계약 의존이 0 이라, 마일스톤 2 의 선행조건 3개가 형제 PRD 에 막힌 상태에서 병렬로 선다 , PRD §Delivery Milestones 가 그 병렬성을 직접 선언했다.

    **이 창의 실측이 PRD 기준선을 정정한다.** PRD §Success Metrics 의 `rot 24.7% (앵커 162 중 40)` 는 `policies[]` 축만의 수치였다. 이 창에서 `lint-docs.mjs` `parseDoc` 으로 3축 전부를 세니 앵커는 **566건 · 대상 파일 263건**이고, `surfaces[]` 362 · `flows[]` 42 가 기준선 밖에 있었다. 마일스톤 5 의 모집단은 162 가 아니라 566 이다.

    산출은 생성기 1개(`docs/viewer/anchor-freshness.mjs`) · 게이트 하네스 1개 · PRD 두 자리 전이 · 이월이다. **생성물은 커밋하지 않는다** , PRD §Open Questions 의 "뷰어 산출물을 커밋하는가" 가 마일스톤 2 판단으로 미결이고, 같은 절이 *"산출물을 커밋하면 앵커 rot 배지가 커밋 시점에 동결되어 24.7%/21일 속도로 거짓이 된다"* 를 적었다.
- `01-authn.md` · 54일 전 (insuniverse-docs-20-foundation-access-m3.plan.md)
  - 요약:
    `docs/02-access/` 의 첫 문서 `01-authn.md` 를 `policy-doc@1` 로 저작한다. 온보딩 질문 `Q04`("로그인 후 무엇으로 인증이 유지되고 언제 만료되며 어떻게 갱신되는가. 앱 웹뷰에서 달라지는 것이 있는가")가 이 문서의 종료 판정 대상이며, PRD §형식 계약 증분 표의 `auth_layers` 1층(인증 · 차단 401)이 이 문서 몫이다.

    착수 전 실측이 문서의 축을 정했다. **인증 표면이 둘이고 두 표면이 만료·갱신·실패코드에서 각각 다르다.** 이용자 표면은 쿠키 `_aT` 에 후보 여러 개를 허용하고 `Authorization` 헤더까지 후보로 받으며, 관리자 콘솔 표면은 쿠키 `_aaT` 하나만 읽는다. 갱신 토큰은 **앱 환경 로그인에서만** 발급되고 서버 DB 에 저장된다 , 웹과 관리자 콘솔에는 갱신 경로 자체가 없다. 인증 실패는 둘 다 401 이지만 실리는 코드값이 다르다(이용자 축 `E0001` · 관리자 축 `E0601`, 같은 심볼 이름 `UNAUTHORIZED` 로 서로 다른 파일에 선언). 이것이 마일스톤 2 의 `03-error-codes.md` `ERROR_CODE_NOT_UNIQUE` 가 규칙으로 쓴 것의 인증 축 사례다.

    **만료는 하나가 아니라 세 자리에 따로 산다.** 쿠키 수명은 코드에 12시간으로 박혀 있고(이용자 1자리 · 관리자 4자리), 클라이언트 저장 만료도 12시간으로 따로 박혀 있으며(2자리), **토큰 자체의 만료값은 배포 환경변수라 저장소에서 판정되지 않는다.** 앞 둘은 동결 SHA 에서 재유도되므로 본문 `active-prod` 이고, 셋째는 `conditional-unknown` 으로 **`## 부록`** 에 격리한다(PRD §형식 계약 증분 C1 `placement` · C2 `unknown_reason`). 개발 편의 우회 2종도 활성 여부가 같은 환경변수 값에 걸려 있어 같은 자리로 간다.

    수치는 우산 제약 #5 대로 다루되, `extraction-manifest.yaml` 은 인증 축의 어떤 계수도 동결하지 않는다. 그래서 이 문서는 **계수를 적지 않고** 자리를 앵커로 연다 , 검사 `#5`~`#8` 이 그 자리 집합을 동결 SHA 소스에서 다시 유도해 문서와 대조한다.
- 입력·응답 계약 , `01-input-validation.md` + `02-api-response.md` · 54일 전 (insuniverse-docs-30-contracts-limits-m2.plan.md)
  - 요약:
    이 PRD 의 **첫 산출 문서 2건**을 만든다. 마일스톤 1 이 트리 자리와 위임 장부를 세웠고 문서는 0건이었다.
    `docs/03-contracts/01-input-validation.md` 는 "이 값을 넣으면 통과하는가"(온보딩 Q09)에,
    `docs/03-contracts/02-api-response.md` 는 "성공·실패 응답의 공통 형태가 무엇인가"(Q10)에 답한다.

    두 문서는 `policy-doc@1` 계약을 타며 형식 검사는 `13-relation-contract` 가 만든 `lint-docs.mjs` 가
    전부 진다(UI2). 이 마일스톤이 **새로 만드는 검사**는 그 lint 가 보지 않는 축뿐이다 , 앵커가 동결 SHA
    에서 해석되는가, `status` 가 prod 도달성 실측과 맞는가, 게이트 이름이 새어나갔는가, `## 정책 (기획)`
    서술에 코드 심볼이 섞였는가.

    첫 문서가 lint 를 통과하므로 PRD `*Status:` 를 DRAFT 밖으로 옮기는 A9 조건이 이 마일스톤에서
    처음 성립한다(UI3).
- `02-failure-semantics.md` · 54일 전 (insuniverse-docs-40-runtime-vendor-legal-m3.plan.md)
  - 요약:
    이 마일스톤이 만드는 것은 문서 1건이고, 그 문서가 지는 계약은 **`vendor-behaviors.yaml` 을 다시 적지 않는 것**이다. 그 인덱스는 24칸을 이미 채웠다(21 resolved + 3 unknown). 이 창이 더하는 것은 **어떤 응답을 장애로 보고 어떤 것을 자료없음으로 볼 것인가, 그리고 그 판단이 사용자 화면과 관리자 화면에 도달하는가**다. 온보딩 질문 Q17(*"장애를 자료없음으로 오처리하지 않으려면 무엇을 보아야 하는가"*)와 Q40(*"결과가 갈리면 무엇을 채택하는가 · 자료없음과 장애가 사용자 화면에서 구별되는가"*)의 답은 인덱스 어디에도 없다.

    **두 축은 표 두 개로 분리되고, 각 표의 벤더 집합은 문서가 주장하지 않는다.** `vendor-behaviors.yaml` 의 `axis: treat` 5종과 `axis: non-treat` 3종이 각 표의 오라클이고 검사 `#4` 가 exact 로 문다. PRD Success Metric *"벤더 두 축 분리 , 축 2 · 뭉침 0"* 이 산문이 아니라 게이트가 되는 자리다.

    **정책 id 는 벤더 × 결과이고 전수는 후보 인덱스가 정한다.** PRD P-2 가 입도를 24로 확정했고, 후보 인덱스 `policy-candidates.runtime.jsonl` 의 `axis: vendor` 는 **25행**이다 , 24 = 벤더×결과, 1 = 벤더에 귀속되지 않는 라우팅 행 `vendor:__dispatch__:fallback`(관측 2). 그 25번째가 Q40 전반부(*"결과가 갈리면 무엇을 채택하는가"*)의 답을 지므로 이 문서가 소유한다. P-2 의 24는 **입도 판정**(벤더당 1건 대 벤더×결과)이지 문서의 정책 총수 선언이 아니다.

    **배치는 전건 부록이고 본문 정책은 0건이다 , 그리고 이것은 PRD P-2 의 예측과 반대다.** P-2 는 *"24개 입도면 격리가 `no_data` 3칸으로 국소화되고 본문에 21칸이 남는다"* 고 적었다. 그 예측은 `vendor-behaviors.yaml` 의 `coverage`(resolved/unknown)를 배치의 오라클로 본 것인데, `placement` 를 정하는 것은 `status` 이고 `status` 는 후보 인덱스의 규칙표가 정한다. 실측은 treat 15건 전건 `conditional-unknown`(규칙 V1) · non-treat 9건 전건 `null`(규칙 V2, `assignment_state: pending`)이고 `conditional-unknown` 의 `placement` 는 `appendix` 다(관측 3·4). 남은 6값은 전부 도달·활성·삭제 이력을 주장하는데 25행 전건이 `deployment_evidence: false` 라 서지 않는다. **그래서 M1·M2 와 같은 형태가 된다** , `## 정책 (기획)` 절은 비고, 왜 비었는가를 산문으로 적는 것이 그 절의 내용이다. P-2 문면 정정은 이 창이 하지 않고 이월로 올린다(Task 7).

    **이 창이 더하는 판정은 신호의 도달 여부이고, 그 값은 자기 단언이 아니라 동결 3트리 재계수로 선다.** 택소노미 18값은 `userMessage` · `alimtalkMessage` · `audience` · `retryable` 네 필드를 갖는데, **사용자 분석 응답 경로에 도달하는 것은 뒤의 하나와 `category` 뿐이다.** `resolveTreatError` 의 프로덕션 소비자는 `codef-exception.filter.ts:57` 하나이고 그 필터가 응답에 붙이는 것은 `category` 와 `retryable` 이다(`:100-104`). site 는 `NO_DATA` 를 0회 참조하고 `isRetryableTreatError` 로만 분기한다(관측 8·9). **그래서 Q40 후반부의 답은 "구별되지 않는다" 이고**, 그 답은 문서가 주장하는 것이 아니라 검사 `#6` 이 동결 stg `4d798f55` · site `767d1e44` · admin `fb001

    … (요약이 길어 잘렸습니다. 전문은 plan 원문 참조)
- admin 흐름·관리 5종 · 54일 전 (insuniverse-docs-50-domain-m3.plan.md)
  - 요약:
    마일스톤 2 가 만든 `docs/30-admin/00-ia.md`(화면 181개) 위에 흐름 문서 5종을 얹는다 , `01-admin-console` · `02-corp-console` · `03-sales-console` · `04-authority-management` · `05-treat-monitoring` 이고 전부 `flow-doc@1` 이다.

    흐름의 `status` 는 고르는 값이 아니라 **유도되는 값**이다. `flow-refs` 가 `refs` 대상들의 status 를 `config.status_precedence` 로 줄 세워 지배자를 뽑고 `flow.status` 와 `status_source` 를 그것에 결박한다. 이 창의 참조 가능 대상은 정책 52건과 화면 181건이며 그 status 분포가 이미 결정돼 있으므로(관측 2), 어느 흐름이 `active-prod` 이고 어느 흐름이 `conditional-unknown` 인지는 저작 전에 정해져 있다.

    게이트의 무게중심은 lint 가 **보지 않는** 축이다 , `flow-refs` 는 `refs` 가 1건이면 통과하므로 본문이 지목한 화면을 참조에서 빼도 조용하다. 검사 `#7` 이 본문 코드스팬과 `refs` 를 양방향으로 물어 그 구멍을 닫는다.

    산출은 흐름 문서 5편 · 게이트 하네스 1개 · PRD 두 자리 전이 · backlog 이월이다. 리뷰 2라운드 수렴은 마일스톤 4 이고 이 창에 없다.
- `02-identifier-namespaces.md` + `03-error-codes.md` · 55일 전 (insuniverse-docs-20-foundation-access-m2.plan.md)
  - 요약:
    `docs/01-foundation/` 의 남은 두 문서를 `policy-doc@1` 로 저작한다. `02-identifier-namespaces.md` 는 `extraction-manifest.yaml` `code_namespaces` 가 정한 namespace 5종과 서브레벨 접미(`ANS003A`/`ANS003B`)를, `03-error-codes.md` 는 E 코드 앞 두 자리 기능 블록 규칙과 그 규칙이 코드값을 유일 키로 만들지 못한다는 사실을 쓴다. 온보딩 질문 `Q02`·`Q03` 이 이 두 문서의 종료 판정 대상이다.

    착수 전 실측이 이 계획서의 축을 바꿨다. **코드 인덱스(`docs/_meta/index/codes/*.yaml`)의 `source_sha` 가 manifest `repos[].head` 와 3/3 다르다** , 인덱스는 `c7597fc7`·`b9a90a42`·`7df733a5`, manifest 는 `4d798f55`·`767d1e44`·`fb001e1d` 이며 전자가 후자의 후손이다. 그 상태에서 `verify-code-index.mjs` 는 문서화된 두 호출 형태 양쪽에서 exit 1 이다(2026-08-25 실측). 앵커 필드별로 갈라 재면 `defined_in` 은 611 중 604 가 동결 기준선에서 해석되고 `consumed_by` 는 4,655 중 3,919 다.

    그래서 두 문서는 **인덱스에서 앵커를 옮겨 오지 않는다.** 앵커는 동결 SHA 기준 소스에서 다시 유도하고 검사 `#3` 이 파일·행·심볼까지 확인한다. 수치는 우산 제약 #5 대로 `extraction-manifest.yaml` 을 통해서만 쓰고, manifest 가 동결하지 않은 축(`error_codes`·`domain_status_codes`·`vendor_codes` 의 계수)은 **문서에 수를 적지 않는다** , 규칙과 명명된 사례만 쓰고 전수는 인덱스 파일로 링크한다. 관측한 기준선 어긋남 자체는 `docs/_meta/findings/20-foundation-access.md` 에 사실로 남긴다.
- revert 축 판정 완결 · 55일 전 (insuniverse-docs-60-history-deprecated-m2r.plan.md)
  - 요약:
    `dead-candidates.yaml` 의 `revert_groups` **8그룹 전건**에 5중 필터를 적용해 판정을 확정하고,
    그 원장을 이 계획서 본문에 고정한다. 판정 결과는 **확정 0건**이며, 8행 전부가 `unknown` 이
    아니라 **최소 1축의 `fail`** 로 떨어진다 , 참조 카운트 축이 나중에 열려도 결과가 바뀌지 않는다.

    **그 주장은 8행 중 1행 위에 서 있다.** `8e03420` 의 유일한 `fail` 은 필터 4 이고, 그 값은 인덱스
    `state` 재유도(`unresolved` → `unknown`)가 아니라 UI4 사람 판정이다. 원장은 그 칸을
    `UI4-override(state=unresolved)` 로 표기해 **무엇을 뒤집는지 인용**하고, `#8` 이 그 인용값을 인덱스
    실값과 대조한다. 표기를 지우면 `#8` 이 재유도로 떨어져 그 행이 붉고, 값을 인덱스에 맞추면
    `#1` 의 *행마다 fail ≥ 1* 이 붉는다 , 어느 쪽으로도 조용히 통과하지 않는다.

    **기계가 5축을 다 보는 것이 아니다.** 기계 재유도는 3축(필터 1·4·5, 필터 4 는 6/8 , 그래서 *완전* 이 아니다), 부분 재유도는
    1축(필터 3 , 지금 8/8 이 `unknown` 이라 사실상 전건 미검증), 사람 판정이 10칸(필터 2 전건 8 +
    오버라이드 2)이다. `#8` 이 이 배분을 축별로 출력에 적는다.

    **이 창은 `docs/99-deprecated/02-reverted-policies.md` 를 발행하지 않는다.** M1 하네스
    `check10` 이 빈 `deprecated[]` 를 거부하므로(`insuniverse-docs-60-history-deprecated-m1.gates.mjs`
    1326 행 `0건은 통과가 아니다`) 확정 0건이면 그 문서를 만들 수 없다. 발행을 억지로 하려면
    살아 있는 정책을 폐기 노드로 가리켜야 하고 그것이 PRD §Risks 최상위 항목(영향 **매우 높음**)이다.

    **M2 행의 Status 는 `pending` 그대로 둔다.** M1 `m2PublishedViolations` 가 `status === "complete"`
    일 때 M2 Milestone 셀이 지목한 `.md` 의 실재를 요구한다 , 발행 없이 complete 로 넘기면
    `check10` 이 붉어진다. 마일스톤 표에 **`2r` 행을 신설**해 이 창을 담고, M2 행은 발행 조건이
    붙은 채 열려 있다. 선례는 같은 표의 `2b` 행이다.

    **이 결정은 M2 계획서의 지시를 덮는다 , 그 사실을 여기에 적는다.**
    `.claude/plans/insuniverse-docs-60-history-deprecated-m2.plan.md` §Task 4 는 *M2 행 Status 를 `complete` 로*
    올리라 지시하고 같은 계획서 §Acceptance 가 그것을 인수 항목으로 건다. 그 지시는 **발행이 있는 세계**의
    것이고 이 창의 실측은 확정 0건이다. 따라서 M2 계획서의 그 항목은 이 창에서 이행되지 않고 **발행 창까지
    열린 채 남는다** , 폐기가 아니라 유예다. 기계는 이 어긋남을 안 잡는다: M2 하네스 `check9` 는
    `status === "complete"` 이면서 Plan 셀이 빌 때만 붉고(`insuniverse-docs-60-history-deprecated-m2.gates.mjs`
    867 행), `pending` 은 그대로 통과시킨다. 그래서 산문이 진다.

    **M2 하네스를 다시 짜지 않는다.** `insuniverse-docs-60-history-deprecated-m2.gates.mjs` 의
    `#4`·`#5`·`#6`·`#11` 은 발행 0건이면 스스로 `요구 꺼짐` 을 찍도록 이미 설계돼 있다. 이 창의
    하네스는 그 8검사를 **위임 실행**하고, 그것이 못 보는 축(계획서 본문 원장 · `2r` 행 · 새 findings ·
    이 창의 golden 델타)만 새로 진다.

    ### 세 판정 축 , 사용자 확정 (2026-08-26)

    … (요약이 길어 잘렸습니다. 전문은 plan 원문 참조)
- admin 화면 축 · 55일 전 (insuniverse-docs-50-domain-m2.plan.md)
  - 요약:
    이 마일스톤은 이 PRD 의 **첫 산출 문서** `docs/30-admin/00-ia.md`(`ia-doc@1`) 한 편을 쓴다. 화면 집합은 지어내지 않고 동결 라우트 인벤토리에서 유도한다 , 비param 라우트가 `surfaces[]` 가 되고 `:param` 상세 라우트는 부모 surface 의 `### <id>` 본문으로 접히며, 어느 쪽도 아닌 코드는 사유가 붙은 제외 원장으로 간다. 게이트가 그 세 부류의 합이 동결 집합과 **정확히 일치**하는지를 양방향으로 문다.

    첫 문서가 생기는 창이므로 착수 조건 4 가 여기서 발동한다 , `*Status:` 를 DRAFT 밖으로 옮기고 마일스톤 표 2행을 함께 뒤집는다. 두 자리는 게이트 `#10` 이 결박한다.

    산출은 IA 문서 1편 · 게이트 하네스 1개 · PRD 두 자리 전이 · backlog 이월 1행이다. 흐름·콘솔 5종은 한 편도 쓰지 않는다.
- `01-retention.md` + `02-billing-cycles.md` + `03-monitoring.md` · 55일 전 (insuniverse-docs-40-runtime-vendor-legal-m2.plan.md)
  - 요약:
    이 마일스톤이 만드는 것은 `docs/05-schedules/` 아래 문서 3건이고, 그 셋이 지는 계약은 **M1 이 쓰지 않은 것을 쓰는 것**이다. M1 은 스케줄러 17종의 *선언 상태*와 *활성 판정 가능 범위*를 확정했고 그 배치가 **무엇을 하는지는 한 줄도 적지 않았다.** 온보딩 질문 Q16(*"어떤 데이터가 언제 자동 삭제되는가"*) · Q33(*"정산 회차가 잡는 대상의 경계"*) · Q31(*"stall 감시가 잡은 건은 어떤 상태로 바뀌는가"*)의 답은 M1 산출물 어디에도 없다.

    **정책 id 는 스케줄러 1종당 1건이고, 그 집합은 문서가 주장하지 않는다.** 세 문서의 배분은 PRD §MVP 펜스가 정하고 M1 배치표 `담당 문서` 열이 그것을 전사하며 M1 게이트 `#12b` 가 둘을 exact 로 묶어 놨다. M2 는 그 두 오라클을 **각각** 대조한다(검사 `#2`) , 한쪽만 보면 배치표를 고치는 것으로 정책 집합을 움직일 수 있다.

    **배치는 전건 부록이고 본문 정책은 0건이다.** PRD §반드시 지킬 것이 `05-schedules/**` 에 대해 그렇게 못 박았고(D-1, 2026-08-25 개정) 근거는 M1 실측이다 , 후보 인덱스 `axis: schedule` 17/17 이 `deployment_evidence: false` 다. 보존 규칙의 *발효*는 담당 배치의 활성에 걸려 있으므로 규칙만 본문에 올리면 독자가 지금 걸려 있는 규칙으로 읽는다. 대신 **각 정책의 `unknown_reason` 이 M1 의 격리 항목을 이름으로 가리킨다**(검사 `#6`) , PRD 마일스톤 2 Outcome 의 *"활성 미판정은 1 의 격리를 참조"* 가 산문이 아니라 결속이 되는 자리다.

    **이 창이 더하는 판정은 규칙의 값이고, 그 값은 자기 단언이 아니라 동결 트리 대조로 선다.** 문서는 규칙마다 `기준값`과 그것이 나온 **코드 행의 원문**을 나란히 싣고, 게이트가 동결 stg `4d798f55` 트리의 그 행을 읽어 원문 일치를 보고 **원문에서 `(수량, 단위)` 정규 쌍을 다시 유도해 `기준값` 과 문자열 대조**한다(검사 `#4`). 숫자 토큰이 들어 있기만 하면 통과하는 형태는 반례가 있어 기각됐다(관측 13).

    **주석과 코드가 갈리는 자리가 실측으로 둘이고, 그것이 이 창의 가장 큰 값이다.** `fax-status.schedule.ts:12` 는 *"3시간 초과 시 FAILED"* 인데 실제 임계는 `fax.service.ts:1195` 의 `TIMEOUT_MS = 1 * 60 * 60 * 1000` 즉 1시간이다. `order-detail.repository.ts:259` 는 *"5분이상"* 인데 265행이 `.subtract(10, 'minute')` 이고 같은 오기가 `order-detail.service.ts:411` 에도 있다. 문서는 어느 쪽이 옳은지 판정하지 않고 **둘 다 앵커와 함께 싣고 갈림을 표기**한다.

    **갈림을 숨기는 경로는 비교 규칙이 아니라 완전성 검사가 막고, 그 검사의 입력은 문서 밖에 있다.** 인용할 주석을 저자가 고르면 유리한 짝만 실을 수 있다. 그래서 검사 `#12` 는 기대 집합을 **문서에서 유도하지 않는다** , 각 정책의 스케줄러 파일 앵커는 그 배치의 **동작 행** 집합(28행)과 exact 로 묶이고, 대조 대상은 계획서 §근거 대조 로케이터가 선언한 `(파일, 심볼)` 19건에서 게이트가 **스팬을 풀어** 전수 유도한다. 앵커 주변 창으로 유도하려던 초안은 순환이었다(관측 14). 커버리지 단위는 `(정책 id, 파일, 정규 쌍, 측면)` 이라 `3시간` 과 `1시간` 이 각각 강제되고 같은 값의 반복 서술은 요구되지 않는다.

    **활성 부정은 여전히 금지어다.** 삭제 배치 4종이 첫 문서에 통째로 들어오므로 UI1 의 사정거리가 M1 보다 넓다. 검사 `#7` 이 어휘를 계수하되 어휘 목록이 수렴하지 않는 축이라 **긍정 요구**를 짝으로 둔다 , `#6` 이 모든 정책에 미판정 참조를

    … (요약이 길어 잘렸습니다. 전문은 plan 원문 참조)
- 착수 게이트 · 55일 전 (insuniverse-docs-50-domain-m1.plan.md)
  - 요약:
    이 마일스톤은 문서를 한 편도 쓰지 않는다. 착수 조건 4항을 **기계가 매 실행 대조하는 상태**로 바꾸고, 이 PRD 앞으로 온 미판정 이월분(회부 2건 · 형제 findings 3건 · backlog 7행)에 판정을 단다. 그리고 산출 집합 20종이 어느 템플릿을 받고 그 결과로 신설 lint 규칙 4종·config 키 5종이 어디에 걸리는지를 **소거로 확정**한다 , 20종 중 8종(`docs/10-server/`)의 템플릿이 지금까지 어디에도 적혀 있지 않았다.

    산출은 게이트 하네스 1개와 두 원장(PRD · backlog)의 판정 기록뿐이다. `docs/` 아래에는 아무것도 만들지 않는다 , 그것이 착수 조건 4(`*Status:` 전환은 첫 문서 병합 창에서)의 반대편이며, 게이트 `#11` 이 그것을 본다.
- `01-glossary.md` + `term-requests` 병합 + config `actors` 정정 · 55일 전 (insuniverse-docs-20-foundation-access-m1.plan.md)
  - 요약:
    `docs/01-foundation/01-glossary.md` 를 `policy-doc@1` 로 저작해 이 저장소 최초의 lint 대상 문서를 만들고, 형제 축이 낸 용어 요청 2건(`T-01`·`T-02`)을 판정해 되돌려 적으며, `docs/_meta/template-config.yaml` 의 fixture `actors:` 6종을 glossary A축 정본에서 유도한 값으로 정정한다. 이 마일스톤이 끝나는 순간 저장소 전체의 `verify.sh --check --bootstrap` 이 만료되고 `--check` 단독이 성립한다 , 그 전이가 이 계획서의 마지막 게이트다.

    형식 위험은 착수 전에 실측으로 내렸다. `policy-doc@1` 스켈레톤에 A축 표를 넣은 프로토타입이 `lint-docs.mjs --root <스테이징> --strict-refs` 에서 위반 0 으로 통과한다(2026-08-24, 스크래치 트리). **그 관측은 형식이 가능하다는 것만 말하며 산출물을 판정하지 않는다** , 판정은 검사 `#1` 이 실제 파일에 대해 한다. 남은 위험은 형식이 아니라 **값의 정당성**이고, 그래서 A·B 축의 행 집합과 앵커를 아래 Task 2 가 문자열로 고정한다. 행 집합을 Task 에 고정하지 않으면 Task 5 와 검사 `#3` 이 정의되지 않은 것을 대조하게 된다.
- 선행 계약 수용 · 정본 반영 · 55일 전 (insuniverse-docs-60-history-deprecated-m1.plan.md)
  - 요약:
    `13-relation-contract` 가 남긴 회부 2건(R-4 폐기 문서 프론트매터 · R-8 등급 O 기록 자리)을 수용하고,
    문서 7종을 `.claude/meta/05-final-spec.md` §4 트리와 `docs/00-index.md` 사본 양쪽에 반영한 뒤
    `verify.sh --update` 로 golden 을 재동결한다. 실 문서는 만들지 않는다 , M1 이 세우는 것은 **자리와
    계약**이고 값은 M2~M6 소관이다.

    **GROUND 에서 기준선이 green 임을 실증했다.** `bash docs/_meta/verify/verify.sh --check --bootstrap`
    는 지금 exit 0 이다 (2026-08-24 · HEAD `b674f52` · 서브모듈 초기화 후). 그래서 이 창의 red 는 전부
    이 창이 만든 것이고, 13 의 M1 처럼 기존 드리프트를 함께 복구할 필요가 없다.

    **게이트 밖 축이 셋 있다.** §개정 위임 · §회부 인계 · R-4 프론트매터 형태는 `verify.sh` 의 어떤 절
    범위에도 걸리지 않는다(G6·G7). 저장소 게이트가 보지 않는 그 셋을 계획서 전용 하네스가 진다 ,
    `verify.sh` 자체를 고치는 것은 이 PRD 가 받은 위임 사유(`--update` 재동결)의 밖이다(G12).

    **R-4 는 "수용된다" 와 "강제된다" 가 다르다(G18).** `supersedes` 규칙은 대상에서 `id` 만 찾고
    `at`·`sha`·`reason` 을 요구하지 않는다 , `{id, reason}` 두 필드짜리 표본이 지금 `--strict-refs`
    를 통과한다. 계약을 문면으로만 두면 M2 가 SHA 없이 발행해도 초록이므로, 4필드 강제는 이 창의
    하네스 검사 `#10` 이 지고 M2 가 실 문서에 바인딩한다.

    **계약은 도달 가능하고, 막힌 것은 게이트의 스테이징이다(G19~G21).** 대상 문서를 4필드로 두고
    유예 원소를 뺀 트리에서 lint 는 `위반 0` 을 낸다 , R-4 계약 자체는 M2 에서 성립한다. 그런데
    `run_template_config_gate` 는 `docs/_meta` 와 `docs/20-site` 만 스테이징하고 `docs/99-deprecated/**`
    를 복사하지 않아, 실 저장소에 대상을 발행해도 그 게이트의 사본에는 없다. 그래서 원소를 빼는
    순간 그 게이트가 붉어지고, 해소 경로 둘(`verify.sh` 스테이징 · doc-kit 예시)은 **둘 다 60 의
    위임 밖**이다. M1 은 그 자리를 **양면 프로브로 관측 가능하게** 만들고(검사 `#6`) 위임 확장을
    열린 질문으로 올린다 , 없는 경로를 있는 척 계획하지 않는다.
- `04-runtime-topology.md` · 55일 전 (insuniverse-docs-40-runtime-vendor-legal-m1.plan.md)
  - 요약:
    이 마일스톤이 만드는 것은 `docs/05-schedules/04-runtime-topology.md` 1건이고, 그 문서가 지는 계약은 두 가지다 , **스케줄러 17종 전수의 선언 상태를 인덱스와 대조 가능한 형태로 확정**하는 것, 그리고 **활성 판정 17건 전부가 미판정임을 사유와 함께 부록으로 격리**하는 것.

    **선언과 활성은 다른 정책 id 로 쪼갠다.** PRD §Risks 가 못 박은 자리다 , 한 id 로 묶으면 배치 규칙(`placement`)이 정책 id 단위로 돌기 때문에 `## 정책 (기획)` 절이 통째로 비고 `docs/05-schedules/**` 가 부록만 남는다.

    **입도는 두 축이 각자의 외부 기준을 그대로 따르고, 둘 다 항목 단위다.** 활성 축은 `docs/_meta/index/policy-candidates.runtime.jsonl` 의 `axis: schedule` 후보 17행을 **id 까지 그대로** 승계한다 , 변환이 없으면 어긋날 자리도 없다. 선언 축은 `docs/_meta/index/schedules.yaml` 의 **선언 단위** 18개를 따른다: 배포 스케줄러는 `variants[].label` 하나가 한 단위(17개), 인프로세스 `push.scheduler` 는 라벨이 없으므로 스케줄러 id 자신이 한 단위(1개). PRD P-3 이 요구한 *"samsung-s2-report 라벨 2개 → 정책 id 2개"* 는 이 규칙의 특례가 아니라 **결과**다. 조합으로 접지 않는 이유는 관측 10 에 있다 , PRD §Users 가 뷰어 입력을 `policies[]` 로 못 박았고 본문 산문은 입력이 아니라고 명시했으므로, 그룹 id 는 스케줄러별 판정을 유일한 소비 계약 밖으로 밀어낸다.

    **본문에 놓을 수 있는 것은 그 주장이 동결 기준점에서 증명되는 정책뿐이고, 지금 그런 정책은 0건이다.** 후보 인덱스 17행이 **전건** `deployment_evidence: false` 이고 배포 스케줄러 16종은 `status_basis: gate-value-unknown` 이다(관측 13). 정본 어휘에서 `active-prod` 는 *"prod 도달 + 게이트 없음/활성"* 인데 **두 다리가 다 안 선다.** 그래서 선언 정책 18건도 활성 정책 17건도 `conditional-unknown` 이며 35건 전부가 부록이다.

    **본문이 비는 것은 이 창의 산출이 아니라 이 창의 관측이다.** PRD §Risks 는 그 상태를 발동 신호로 적고 완화책으로 *"선언 상태는 `active-prod` 로 본문"* 을 지시했는데, 그 지시는 실측이 반증한다 , 저장소는 어떤 스케줄러의 prod 도달도 증명하지 못한다. 근거 없이 `active-prod` 를 15건에 찍는 것이 곧 PRD Hypothesis 주석이 지목한 *"근거 없는 단정으로 닫는다"* 이고 우산 최상위 Risk 의 발동 경로다. **id 분리(UI2)는 그대로 살아 있다** , 두 축이 다른 `unknown_reason` 을 갖고, prod 기준점이 동결되면 선언 축만 본문으로 올라간다. 게이트 `#14` 가 그 승격 조건을 fail-closed 로 들고 있으므로 리터럴 예외 목록이 필요 없다. PRD 의 `active-prod` 지시 2곳은 Task 6 이 실측으로 정정한다.

    **12 산출물의 재서술이 아니라 그 산출물이 비운 칸을 채우는 것이 이 창의 값이다.** 후보 인덱스는 `push.scheduler` 를 `assignment_state: pending` 으로 남겼고(status 값이 비어 있다), PRD P-1 이 그 칸을 `conditional-unknown` + 게이트 부재 사유로 닫으라고 판정했다. 그 한 칸이 이 문서가 인덱스에 더하는 유일한 판정이며, 게이트 `#6` 이 *"인덱스와 다른 칸은 pending 이었던 칸뿐"* 을 기계로 묶는다.

    **활성 부정은 문서에서 금지어다.** 삭제 배치 4종의 활성 여부가 데이터 보존 정책이라 틀리면 위험하고, 저장소에는 그것을

    … (요약이 길어 잘렸습니다. 전문은 plan 원문 참조)
- **위임 규약 확립** , 우산 제약 #6 예외 · `ownership.md` §개정 위임 · 이 PRD 를 우산 §분할 맵과 `ownership.md` **§PRD별 배타 소유 경로** 양쪽에 10번째 행으로 추가(§승계 시 추가에 들어가는 것은 `findings/13-relation-contract.md` 1행뿐이다 , 위임받은 경로는 두 소유 표 어디에도 넣지 않는다) · 57일 전 (insuniverse-docs-13-relation-contract-m1-r2.plan.md)
  - 요약:
    archived PRD 소유 경로를 복원 없이 개정할 수 있는 규약을 세우고, 이 PRD 를 우산 §PRD 분할 맵과
    `ownership.md` §PRD별 배타 소유 경로 양쪽에 10번째 행으로 넣는다. 종료조건은
    `bash docs/_meta/verify/verify.sh --check --bootstrap` exit 0 이다. **`--bootstrap` 은 생략할 수 없다** ,
    lint 대상 문서는 마일스톤 3~6 이 만들고, 그때까지 `--check` 단독은 `lint.files 0` 에서 rc=1 이다
    (만료는 `bootstrap_permitted` 가 집행한다. Validation 프렐류드 `gate()` 참조).

    GROUND 에서 **기준선이 이미 red 임을 실증했다.** `run_ownership_gate` 검사 1 은 오늘
    `origin/main` 내용만으로 실패하고(우산↔`ownership.md` 의 `10-index-git` 행 경로 3건 불일치),
    검사 2e 는 이 PRD 가 선언한 `findings/13-relation-contract.md` 가 정본에 없어 실패한다. 따라서
    M1 은 "행 하나 추가" 가 아니라 **기존 드리프트 복구 + 신규 행 추가 + golden 재동결** 이다.

    **위임은 소유가 아니다.** `ownership.md` 의 두 표(주 표 · §승계 시 추가)는 둘 다 게이트가
    `owner|path` 쌍으로 펼쳐 소유 정본으로 쓴다. 그래서 위임받은 경로는 **어느 쪽에도 넣지 않는다** ,
    게이트 밖 §개정 위임 절에만 기록한다(UI2).
- **`ia_doc_consumed` 재판정** , 판정 입력을 소비자 2종(온보딩 질문 · 뷰어)으로. 게이트 로직이 그 근거를 받아들이도록 · 57일 전 (insuniverse-docs-13-relation-contract-m2.plan.md)
  - 요약:
    `ia_consumed` 는 지금 **한 축**이 결정한다 , `docs/_meta/verify/verify.sh:1633` 이 `screen_inventory: true` 질문의 존재만 보고 선언과 대조한다. M6 판정(2026-08-07 `false`)은 그 스코프 안에서 옳았고, 틀린 것은 소비자가 둘인데 입력이 하나였던 설계다(PRD §Evidence · `.claude/meta/12-flow-centric-restructure.md` §1-2 개정).

    이 마일스톤은 판정을 **두 축의 OR** 로 분해한다: 온보딩 축(기존 대조 그대로 유지)과 뷰어 축(근거 문서에 결박된 사람 판단). `ia_consumed: true` 로 뒤집고, 게이트가 그 근거를 기계로 받아들이며, 근거가 사라지면 게이트가 붉어지게 한다.
- **관계 계약 2종** , 흐름 이탈(`실패·이탈` 표 · `config.exit_kinds` 어휘 + 형태 , 라운드 4 가 6종이라 적은 것은 어휘 4 + 형태 2 를 키 하나로 접은 문면이고, 구현은 어휘 4 + 형태 3 이다)과 화면 전이(`surfaces[].exits` · `config.surface_exit_kinds`)를 기계 판독 가능한 형태로 고정. 분석 정본의 3형태 표도 함께 갱신 · 57일 전 (insuniverse-docs-13-relation-contract-m3.plan.md)
  - 요약:
    그래프의 엣지가 나오는 두 자리를 산문에서 계약으로 옮긴다 , flow 의 `실패·이탈` 표 `결과` 열(`flow-exits`)과 IA 의 화면 전이(`surfaces[].exits` · `ia-exits`). 어휘는 lint 가 아니라 `config.exit_kinds` 에 두어 `auth_layers` 와 같은 자리를 쓰고, 정상 예시 3건이 그 계약을 통과하도록 `flow-example.md` 결과 열 7행의 **형태만** 고친다(사실·앵커 불변).

    그 위에 지표 #1(관계 계산 가능성)의 판정 도구 `lint-docs.mjs --probe=relation` 과 동결 기대값을 만든다. 계약이 섰다는 주장과 그 계약만으로 도달 경로가 계산된다는 주장이 분리되어 각각 게이트를 갖는다.
- **status 배치 승격 + ops 수용 3건** , `statuses` 를 `label`·`placement` 로. 같은 창에서 O-2(`05-final-spec.md` §2 등급 O 신설) · O-4(`evidence_grades` 에 `O-ops`) · O-6(§6-2 권한 DB 전제 정정) · 57일 전 (insuniverse-docs-13-relation-contract-m4.plan.md)
  - 요약:
    우산 제약 #2(*"현행 유효성이 판정되지 않은 정책은 본문에 넣지 않는다"*)를 사람 준수에서 기계 검사로 옮긴다. `config.statuses` 를 평탄 스칼라 리스트에서 `id`·`label`·`placement` 맵 리스트로 승격하고, `placement` 가 `appendix` 인 정책이 본문 절에 있으면 lint 위반이 되게 한다. 배치의 정본은 config 가 아니라 `.claude/meta/05-final-spec.md` §3 이며, 그 표에 `라벨`·`배치` 2열을 추가해 config 가 정본의 **전사**임을 게이트가 대조한다.

    같은 창에서 `ops-doc-reconcile` 수용 3건을 처리한다 , O-2(§2 등급 표에 등급 **O** 신설) · O-4(`evidence_grades` 에 `O-ops`) · O-6(§6-2 권한 DB 전제 정정). O-2·O-4 는 한 쌍이라 한쪽만 하면 근거 없는 등급이 통과하거나 lint 가 그 값을 거부한다 , 두 방향을 게이트가 함께 문다.
- **시간 축 계약** , `## 연혁` 표 열 계약 · `policies[].supersedes` · 계산 연혁의 지위 명문화 · 57일 전 (insuniverse-docs-13-relation-contract-m5.plan.md)
  - 요약:
    `status` 는 *지금 유효한가* 에 답하지만 *언제부터 언제까지였나* 는 어느 필드도 답하지 않는다. 이 마일스톤이 그 축을 계약으로 고정한다 , 이미 템플릿 3종에 있는 `## 연혁` 4열을 **강제만** 하고(5-1), 활성 → 폐기 단방향 승계 필드 `policies[].supersedes` 를 전용 해석 경로와 함께 넣고(5-2), 계산 연혁이 정본이 아니라 **대조용**임을 분석 정본에 못 박고(5-3), 앵커 × 커밋 인덱스 조인의 **방법**을 계약에 적는다(5-4).

    판정 도구는 `lint-docs.mjs --probe=history` 다. `--probe=relation` 과 같은 자리이며 저장·렌더·캐시가 없다. 인덱스에 의존하므로 위상 하나가 더 붙는다 , 동결 기대값이 `extraction-manifest.yaml` 의 `repos[].head` 에 결박되고, 기준 HEAD 가 움직이면 오답(exit 2)이 아니라 `stale-oracle`(exit 3)로 갈린다.

    같은 창에서 backlog 가 **인수처를 이 마일스톤으로 지목한** 세 건을 흡수한다 , 관계 축 엣지 튜플의 `지점` 열 누락(HIGH) · `isRelativeRef` 의 `..` 탈출(HIGH) · `docs/_meta/verify/verify.sh` ownership 게이트의 낡은 `9행` 리터럴(MEDIUM). 앞의 둘은 M5 가 같은 코드 경로를 다시 열기 때문에 지금이 가장 싸다.
- **문서 트리 개정** , IA 문서 2건의 자리를 정본과 사본 양쪽에 · 57일 전 (insuniverse-docs-13-relation-contract-m6.plan.md)
  - 요약:
    IA 문서 2건(`docs/20-site/00-ia.md` · `docs/30-admin/00-ia.md`)의 **자리**를 트리 정본과 사본 양쪽에 만든다. 문서 본문은 만들지 않는다 , 그것은 회부 R-1 이고 `50-domain` 이 수용한다. M2 가 `ia_doc_consumed` 를 재판정해 화면 축을 열었고 M3 이 `surfaces[].exits` 로 그 축의 엣지를 계약했는데, 정작 그 문서가 앉을 자리가 트리에 없다.

    경로는 `00-index.md` 자신이 열어 둔 **3단계**다 , 정본(`05-final-spec.md` §4) 개정 → 사본(`docs/00-index.md` §문서 트리) 갱신 → `verify.sh --update`. **순진한 우회 둘이 막힌다는 것까지가 실측이다** , 정본만 고치면 `run_index_gate` 검사 1 이 `00-index.md 트리가 05-final-spec.md §4 와 다르다` 로 exit 1 이고, 둘 다 고치고 `--update` 를 안 돌리면 golden 드리프트로 exit 1 이다. **게이트가 증명하는 것은 경로가 아니라 종점의 자기정합성이다** , `golden.txt` 를 `gen_report` 가 낼 값으로 손수 적으면 `--update` 없이도 같은 종점이고 이 저장소의 어떤 검사도 둘을 구별하지 못한다(Plan-Codex R1 F1). 그 사각지대를 게이트 `#4` 의 출력에 적어 둔다.

    같은 창에서 **계수 산문의 stale 창을 닫는다.** `index.entry_count` 51 · `index.doc_count` 50 은 지금 `docs/00-index.md` 와 분석 정본에 리터럴로 박혀 있고 **어떤 게이트도 그것을 golden 과 대조하지 않는다.** 값만 53·52 로 고치면 다음 트리 개정에서 같은 결함이 재발한다 , 게이트를 함께 만든다(INV4).
- **흐름 진입 경로 + 회부** , 읽는 축에 흐름 진입점 추가 · 회부 8건 기록(`50-domain` 2 · `70-viewer` 2 · `60-history-deprecated` 2 · `10-index-git` 1 · `ops-doc-reconcile` 1) · 57일 전 (insuniverse-docs-13-relation-contract-m7.plan.md)
  - 요약:
    읽기 축을 하나 더 연다. 소유 축(주제별 배타 소유 경로)은 그대로 두고 `docs/00-index.md` 에 `## 흐름으로 읽기` 절을 신설해 독자가 흐름 → 화면 → 정책 세 단으로 들어올 수 있게 한다. 파일은 옮기지 않는다 , 진입점만 하나 더 둔다(분석 정본 §3-1).

    같은 창에서 **회부 8건을 대상 PRD 가 읽는 자리에 앉힌다.** 실측으로 대상 PRD 3종(`50-domain` · `70-viewer` · `60-history-deprecated`) 본문에 이 PRD 를 가리키는 참조가 **0건**이고, 그중 형제 findings 회수를 계약한 것은 `60` 하나뿐이다. 활성 PRD 본문에 직접 쓰는 것은 우산 제약 #6 위반이므로(예외는 archived 소유자에게만 열린다) 기록은 **모든 PRD 가 읽는 소유 정본** `docs/_meta/ownership.md` 의 새 `## 회부 인계` 절로 간다 , 이 PRD 위임 경로이고 어떤 게이트 슬라이스도 그 파일 말미를 EOF 앵커로 잡지 않는다(실측).

    **이 마일스톤은 `--update` 를 부르지 않는다.** M6 과 다른 점이다. 실측으로 두 편집을 다 얹은 상태에서 `verify.sh --check --bootstrap` 이 exit 0 이고 `golden.txt` 는 **한 키도 움직이지 않는다** , 새 절은 어떤 추출 계약과도 겹치지 않기 때문이다. 분석 정본 §4 C 행이 비용을 `절 1개 + golden --update` 로 적어 둔 것은 그 실측 이전 서술이며 M7 이 정정한다.
- **이월분 판정·소거** , `codex-findings-backlog.md` 의 이 PRD 소속 행과 `.claude/state/fix-task.d/` 투영 전건에 판정 마커와 인수처를 붙이고, 소유·위임 경로 안의 것만 실제로 닫는다. fix-task 투영 검사(같은 축 3회차)를 재사용 검증기로 승격 · EOL 측정 관용구의 blind 정정 · findings 항목 존재 검사 신설 · 59일 전 (insuniverse-docs-13-relation-contract-m8.plan.md)
  - 요약:
    M1~M7 이 각자의 창에서 밀어낸 범위 밖 결함이 `codex-findings-backlog.md` 에 이 PRD 소속으로 **35행** 쌓여 있다(기계 유도값, 아래 §GROUND). 전역 규약(2026-08-18)이 진행을 허용한 조건은 *"조용히 통과시키지는 않는다"* 였고, 조건의 나머지 절반 , *나중에 loop 를 한 번 더 돌려 수정한다* , 이 이 마일스톤이다.

    **이 창이 만드는 것은 판정이지 일괄 수정이 아니다.** 열린 행 다수는 이 PRD 의 소유·위임 경로 밖이고(mccp 본체 · 우산 PRD 본문 · 수신 PRD 착수 시점) 거기를 고치는 것은 B1 이나 우산 제약 #6 위반이다. 그래서 판정 어휘 4종을 backlog 행 자체에 달아 **어느 쪽인지를 기계가 볼 수 있게** 만들고, 안쪽인 것만 실제로 닫는다.

    **동결된 계획서 Validation 블록은 손대지 않는다.** 열린 행의 큰 덩어리(M6 게이트 `#1`·`#2`·`#6` · M7 게이트 `#2`·`#8`)가 그 안에 있고 그 블록은 `mccp-plan-codex` receipt 의 `plan_hash` 에 결박돼 있다. 대신 같은 축의 검사를 `docs/_meta/verify/`(이 PRD 위임 경로)의 **추적되는 상시 검사**로 다시 세운다. 계획서별 일회용 검사가 매번 같은 사각을 재생산한 것이 이 축이 세 번 재제기된 이유이며, 상시 층으로 올리면 재생산이 멈춘다.

    **판정은 대체 검사에 기계로 결박된다.** 초안은 M6 `#1`(트리 설명 열)과 M7 `#2`(소절 배치)를 대체 없이 이름만 불렀고, 그 다음 판은 대체 검사 id 를 요구하되 **어떤 id 든** 받았다 , 트리 행이 무관한 EOL 게이트를 대도 통과했다. 그래서 `(행 digest → 대체 검사 id)` 매핑을 착수 시점에 동결하고 종료 시 그 매핑대로 명명됐는지, 명명된 검사가 상시 경로에 **실재하는지**까지 본다.

    **그 매핑의 기준선도 판정보다 앞선다.** 매핑을 같은 창에서 만들고 같은 창에서 대조하면 매핑·판정·fixture·golden 을 함께 바꿔 자기일관으로 통과한다(층위 7). Task 0 은 스냅샷·매핑·계보를 담고 **backlog 판정 행을 하나도 건드리지 않는** 기준선 커밋으로 끝나며, 게이트는 워킹트리가 아니라 그 커밋에서 매핑을 읽는다.
- 공용 알림 기반 + 다중 채널 + 최상위 관리자 설정 · 60일 전 (ops-alert-system-m1.plan.md)
  - 요약:
    `apps/api/src/modules/alert/` 에 **알림의** 단일 발송 경로를 만든다(전역 웹훅 발신자 단일화가 아니다 , §D10). 알림 타입은 배열 1곳에 등록하고(M6), 노이즈 억제 4원칙은 순수 함수로 분리하며(교체 가능), 웹훅 채널과 **공용 노브**(억제창·주기·지속성 횟수·타입 ON/OFF)는 신규 KV 테이블에 저장해 재배포 없이 바꾼다(M11 , 진료 규칙의 내부 임계는 범위 밖, §D10-b). 기존 `TreatAlertService` 는 이 기반의 첫 번째 규칙으로 흡수한다 , 현재 발송량 0이라 회귀 대상이 없다.

    M1 은 **기반과 설정만** 만든다. P0 알림 4종(A1/A3/A4/A6)과 헬스체크 실측화는 마일스톤 2다. M1 완료 시점의 유일한 실사용 규칙은 흡수된 진료 알림이며, 이것으로 전 경로(등록 → 판정 → 억제 → 다중채널 발송 → 복구)를 검증한다.
- P0 알림 4종 + 헬스체크 실측 엔드포인트 · 60일 전 (ops-alert-system-m2.plan.md)
  - 요약:
    M1 이 만든 단일 발송 경로(`apps/api/src/modules/alert/`) 위에 **규칙 4개를 등록**한다 , A1 정기결제 실패율, A3 스케줄러 하트비트 부재, A4 API 5xx 비율, A6 인프라 헬스. 판정·억제·복구·다중채널 발송은 `AlertService.run()` 이 이미 하므로 각 규칙은 `evaluate()` 하나만 구현한다. 이것이 M6("등록 1건")의 실측 기회이기도 하다.

    신규 테이블은 **0개**, 신규 스케줄러도 **0개**다. 신호 저장소는 이미 있는 것만 쓴다 , 하트비트·다이제스트 상태는 `tn_alert_setting` KV, 5xx·요청수·결제예외 카운터는 Redis(`configuration.ts:31` 이 "멀티 분산 카운터/큐"로 선언), 결제 실패율은 `tn_payment ⋈ tn_order` 읽기 전용 집계. warn 다이제스트 발송은 기존 5분 `analysis-status` 회차에 얹는다(M1 이 큐잉만 하고 미룬 것).

    기반(`alert.service.ts`)을 만지는 지점은 **정확히 세 곳**이다: (1) warn 다이제스트 발송 블록, (2) `type:'json'` 설정 타입, (3) **DB 장애 폴백 경로** , DB 가 끊기면 알림 상태 저장소가 같이 끊겨 A6 의 핵심 대상인 "DB 연결 실패"를 한 건도 못 보내는 구조적 구멍을, Redis last-known-good 스냅샷으로 닫는다(§D7).

    헬스체크는 **PRD 요구를 이번 마일스톤에 완전히 충족하지 못한다.** `GET /health` 를 실측 응답으로 바꾸려면 ALB 타깃그룹 프로브 경로를 먼저 확인해야 하는데(Q7) 그 설정이 저장소 밖이다. 미확인 상태로 바꾸면 DB 순단이 태스크 순환을 유발한다. M2 는 `/health/detail` 을 먼저 만들고, Q7 확정 후 `/live` 분리 + `/health` 실측화를 **같은 마일스톤 안에서** 마무리한다 , 미충족을 완료로 보고하지 않는다(§D6).
- 배포 · 강제 주입 검증 + 헬스체크 실측화 마무리 · 60일 전 (ops-alert-system-m2-5.plan.md)
  - 요약:
    마일스톤 1·2 가 만든 코드는 **단위 spec 과 실 MySQL 하네스까지만 검증돼 있다.** 이 마일스톤은 그 위에 **강제 장애 주입 실측**을 얹어 PRD §Success Metrics M1~M13 을 판정한다. 새 기능은 만들지 않는다.

    두 가지가 착수 시점에 이미 바뀌어 있다. **(1) Q7 이 닫혔다** , 사용자 확인 결과 이 프로젝트를 프로브하는 ALB 타깃그룹이 없다. **(2) 그 결과 Task 10(헬스체크 실측화)이 이미 랜딩됐다** , `insuniverse-server@4ada8658` 이 `GET /live`(상수)를 신설하고 `GET /health` 를 DB·Redis 실측 + 실패 시 503 으로 교체했다. 따라서 M2.5 에서 헬스체크는 **구현 대상이 아니라 검증 대상**이며, UI3 충족 여부는 이번 주입 실측이 판정한다.

    판정 환경은 **local 단독**이다(사용자 결정). stg 배포 수단이 없어 마일스톤 1·2 가 무기한 멈춰 있던 상태를 이 결정이 푼다. 다만 판정 **권위**는 그대로 M2.5 에 있다 , 이 마일스톤은 리포트 말미에 `APPROVED` · `APPROVED_WITH_CONDITIONS` · `DENIED` 중 하나를 발급하며, 게이트 밖으로 나가는 것은 승인이 아니라 배포 실행뿐이다(§D1). 대가는 정직하게 적는다 , local 판정은 **코드·배선·규칙 동작**을 증명하지만 **EventBridge 실주기·ECS 태스크 순환·CDN/WAF 경로·실환경 설정**은 증명하지 못하며, 그것들이 조건부 승인의 조건 목록이 된다. 목표치는 하나도 완화하지 않았다.

    산출물은 셋이다: 주입 하네스 `scripts/alert-inject.ts` 1개, 실측 리포트 1개, PRD 정정 1건.
- 알림 시스템 자기감시 화면 · 60일 전 (ops-alert-system-m3.plan.md)
  - 요약:
    M1·M2 가 만든 단일 발송 경로 위에 **관측 계층 하나와 화면 하나**를 얹는다. 신규 규칙 0개, 신규 스케줄러 0개, 신규 테이블은 발송 이력용 **추가 전용 1개**다. 화면이 답해야 하는 질문은 하나다 , "알림이 안 오는 게 정상이라서인가, 알림 시스템이 죽어서인가."

    그 질문은 지금 **기계적으로 답할 수 없다.** `alert:lastRunAt` 은 전체 OFF·환경라벨 미설정 회차에서 갱신되지 않고(`alert.service.ts:338-355` 가 `writeMetrics` 에 `lastRunAt` 을 넘기지 않는다), 규칙별 점검 시각은 어디에도 없으며, 발송 이력과 채널별 결과는 저장되지 않는다. 그래서 M3 의 실체는 화면이 아니라 **런너 생존·실측 주기 신호(`alert:tick`) · 규칙별 점검 기록(`alert:ruleStat`) · 발송 이력(`tn_alert_history`)** 세 가지를 만드는 일이고, 화면은 그 위의 얇은 렌더러다.

    스누즈는 시간 상한 24시간이 걸린 **전달 차단**이다 , 평가는 계속 돌고 목적지 전개부터 막으며, 그 구간의 경과를 `alert:snoozeLog` 에 남겨 해제 시 요약 1건으로 낸다. 억제 상태 보존은 기존 `unevaluated` 격리와 같은 방식이되 집합을 갈라 지속성 streak 은 정상 진행시킨다. 무기한 침묵 경로는 만들지 않는다.
- api-contracts + schema-constraints · 62일 전 (insuniverse-docs-11-index-code-m4.plan.md)
  - 요약:
    산출물 2개는 둘 다 **계약 축**이지만 마일스톤 3 과 달리 **소스가 하나도 겹치지 않는다.** 계약 축은 3저장소 `src_roots` 의 데코레이터 1,700여 파일에서 나오고, 스키마 축은 `src_roots` **밖**의 생성 파일 `insuniverse-server/drizzle/schema.ts` **1개**에서 나온다. 같은 walk·같은 exclude·같은 앵커 규칙을 공유하지 않으므로 마일스톤 3 의 통합 근거(Task 0-c)가 여기서는 성립하지 않는다 , **생성기 2 + 검증기 2, 4파일**로 간다. 그 결정의 조건은 마일스톤 3 이 이미 문서로 남겼다: "스키마가 갈라지면 그때 쪼갠다".

    착수 전에 닫아야 할 구조 문제가 셋이고, 셋 다 **naive 전수 스캔이 조용히 거짓을 만드는** 부류다.

    1. **DTO 의 과반이 자기 파일에 속성을 하나도 안 갖는다.** `*.dto.ts` 의 `export class` 765 중 **416(54%)** 이 `IntersectionType`/`OmitType`/`PartialType`/`PickType` 합성이고, 실제 속성·검증기는 `*.entity.ts`(`@ApiProperty` 793 · class-validator 1,132)에 있다. `CreateAdminDto`(`admin.dto.ts:51-54`)는 본문이 `{}` 다 , 데코레이터를 파일 단위로만 세면 이 DTO 의 계약이 **0건**으로 기록되고, `03-contracts/01-input-validation.md` 가 "이 엔드포인트에는 검증이 없다" 를 게시하게 된다. 누락이 아니라 **거짓**이다.
    2. **상태 컬럼을 이름으로 판정하면 241 중 대부분이 오분류된다.** `*_status|*_state|*_type|*_code` 로 잡으면 `dsn_major_code`·`dfc_minor_code` 같은 **질병 분류 코드** 컬럼이 통째로 상태 컬럼이 된다. 발견 9(`menu_codes` 정규식이 서버 에러 상수를 과매칭)·19(`*_KEY` 로 메타키 축을 잡으면 브라우저 저장소 키가 섞임)·24(`*_TIMEOUT` 이 enum 멤버를 잡음)와 정확히 같은 부류다. **이름 모양은 소속의 근거가 아니다.**
    3. **엔드포인트 인구가 `policy-anchors.yaml` 과 다르다.** 라우트 데코레이터는 **656**, `policy-anchors.yaml` `role_matrix` 는 **355** 다. 후자의 모집단은 "RolesGuard 가 유효 적용되는 핸들러"(마일스톤 2 발견 15)이므로 차집합은 **결손이 아니라 가드가 없는 표면**이다. 두 수를 같은 것으로 놓으면 어느 쪽이든 오판이 나온다 , 이 마일스톤은 `symbol` 을 조인 키로 공유하되 **모집단이 다르다는 사실 자체를 파일에 적는다.**

    네 번째로, 이 마일스톤은 **JSONL 이 처음**이다. 마일스톤 0~3 은 전부 YAML 이었고 헤더(`namespace`·`source_sha`·`complete`·`gap`·`entry_count`·`set_sha256`)를 파일 상단 키로 실었다. JSONL 에는 그 자리가 없으므로 **첫 줄을 `{"kind":"meta", …}` 레코드로 두고** 나머지 줄을 `id` 정렬로 쓴다. 검증기는 첫 줄이 meta 가 아니면 error 다. 파싱은 `JSON.parse` 한 줄씩이라 `parseYamlSubset` 을 쓰지 않는다 , 새 파서를 만드는 것이 아니라 **표준 파서를 쓰는 쪽이 라인 수가 줄어든다.**
- **테스트 축 판정 정본** , `tests-vocab.mjs` · `tests-hop.mjs` · `verify-tests.mjs` (산출물에 `tests.jsonl` 없음) · 62일 전 (insuniverse-docs-11-index-code-m5a-r2.plan.md)
  - 요약:
    원래 마일스톤 5 를 둘로 갈랐다. **5a 는 판정 규칙을 코드로 확정하고, 5b 가 그것을 import 해 `tests.jsonl` 을 만든다.** 산출물에 `tests.jsonl` 은 **없다** , 이 계획은 인라인 픽스처만으로 완결된다.

    가른 이유는 실측된 실패다. 통합 계획(`insuniverse-docs-11-index-code-m5.plan.md`, 1098행)은 Codex 게이트를 **21라운드** 돌고도 승인 receipt 를 못 받았다. R19~R21 findings 14건 중 **9건이 직전 라운드 흡수가 만든 것**이었고, 셋 다 같은 모양이었다 , 검증기와 생성기가 **같은 판정 규칙을 문면으로 두 번** 적고 있었고, 그 둘을 문면으로 동기화하려고 얹은 장치가 다음 라운드의 지적을 낳았다. 21라운드가 문면으로 달성하려던 "정본 1벌" 을 **마일스톤 경계**로 만드는 것이 이 분할이다: 5b 가 착수할 때 규칙은 문면이 아니라 **이미 존재하는 코드**다.

    **결정의 근거는 여기 다시 적지 않는다.** 각 규칙이 왜 그 형태인지는 통합 계획의 `## Codex Adversarial Review` 와 Task 1 이 라운드별로 기록하고 있고, 그 파일은 폐기하지 않고 **결정 기록**으로 남긴다. 이 계획은 **결정만** 싣는다 , 근거를 다시 적는 것이 드리프트의 발생원이었다.
- **테스트 축 판정 정본 교정** , 블록 스칼라 앵커 · 스칼라 스타일 보존 · 호출별 typed 잔여 (5b 착수 전제) · 62일 전 (insuniverse-docs-11-index-code-m5a-fix.plan.md)
  - 요약:
    5b 계획의 게이트 5라운드가 5a 계약에서 결함 셋을 실코드 대조·실행으로 재현했다. 5b 는 그것을 우회하려다 매번 더 나쁜 규칙을 만들었고, 마지막 라운드에서 우회를 전부 삭제한 뒤 착수를 차단한 채 결정 D 로 올렸다. **사용자가 D1(별도 correction 계획)을 승인했다.** 이 계획이 그 교정이다.

    **5a 를 다시 열지 않는다.** 5a 의 PRD 행은 `complete` 로 남고, 교정은 **자기 마일스톤**으로 선다 , UI10 의 봉인은 "고치지 말라" 가 아니라 "범위를 뭉개지 말라" 였고, 별도 행 + 별도 receipt 가 그 요구를 정확히 만족한다.

    **결함 셋은 오늘 실측에 절대 안 드러난다.** 3저장소 CI 의 테스트 호출이 0건이라 세 경로 모두 관측으로는 도달할 수 없고, 기존 픽스처 A61 은 인라인 `npm test` 만 통과시켜 이 경로를 검증하지 않는다. **그래서 이 마일스톤의 수용 조건은 전부 픽스처다** , 산출물 수치가 아니다.
- **컨테이너 좌표 정본화** , Dockerfile 을 논리 명령으로 읽는 정본 파서 + 컨테이너 호출 좌표를 `null` + typed 잔여로 · 호출 앵커 토큰 채널 분기 (발견 54·55) · 62일 전 (insuniverse-docs-11-index-code-m5a-fix-2.plan.md)
  - 요약:
    `verify-tests.mjs` 가 자기 재열거가 만든 Dockerfile 호출을 자기 앵커 검사(발견 54)와 자기 좌표
    검사(발견 55)로 거부해 5b 산출이 막혀 있다. 게이트는 그 둘을 검증기 쪽에서 우회하려는 시도가
    **매번 더 나쁜 규칙**을 만든다는 것을 보였다 , 채널을 파일 이름에서 뽑으면 워크플로가 컨테이너로
    둔갑하고, 행 확정을 검증기에서 막으면 생산자가 만족시킬 수 없는 규칙(발견 54 와 같은 형태)이
    되며, 파리티는 같은 파서 두 벌의 자기일치라 아무것도 보증하지 않는다.

    **뿌리는 하나다: 컨테이너 경로를 저장소 좌표인 척 싣고 있다.** 그것을 `null` + typed 잔여로
    정직하게 바꾸면 발견 55 도, 행 확정 방벽도, 극성 오염도 **함께 사라진다.** 남는 것은 발견 54 의
    앵커 토큰과 Dockerfile 을 논리 명령으로 읽는 일뿐이다.
- tests.jsonl (skip·CI 여부 포함) , 5a 모듈을 import · 62일 전 (insuniverse-docs-11-index-code-m5b-r3.plan.md)
  - 요약:
    r2 는 5a 계약의 결함 셋(블록 스칼라 앵커 · 스칼라 스타일 소실 · 잔여 결속) 때문에 **착수를 차단한 채** 결정 D 로 올렸다. 사용자가 D1 을 승인했고 5a-fix 가 그 셋을 닫았다. r3 는 그 차단을 푸는 재앵커이며, 두 가지를 한다.

    1. **차단문을 fail-closed preflight 로 바꾼다.** "착수 경로가 존재하지 않는다" 는 선언이지 게이트가 아니다(r2 R5 F3 이 스스로 지적했다). 생성기가 `CONTRACT_VERSION === 2` · 픽스처 id 12종 · probe 3종을 확인하고 어긋나면 0건 쓰기 + 비영 종료한다.
    2. **r2 가 승인 전에 임시로 적어 둔 계약 문면을 배달된 계약으로 교체한다.** r2 는 typed 잔여를 `{invocation_id, code, kind, detail}` 로 적었고 생성기가 `classifyStepCondition` 을 직접 부르라고 적었다. 배달된 것은 `bind` discriminated 잔여이고 `if:` 결합은 `resolveInvocationContext` 안이다. **r2 대로 짜면 검증기가 거부한다.**

    **판정 규칙을 다시 적지 않는다** , 어휘는 `tests-vocab.mjs`, hop·호출 맥락 판정은 `tests-hop.mjs`, 스키마·불변식·독립 재열거는 `verify-tests.mjs` 가 정본이다. 이 계획이 그것들을 문면으로 재기술하면 그 자체가 결함이고, 통합 계획이 21라운드 동안 실패한 지점이 정확히 그 재기술이었다.

    **이 마일스톤이 확인하지 못하는 것을 먼저 적는다.** PRD Outcome 문면은 "S등급 근거의 **실제 유효성**이 확인됨" 인데 정적 인덱스는 그것을 확인할 수 없다 , 테스트가 로드되는지, 러너가 무엇을 수집하는지, redis 의존 때문에 실패하는지는 **실행해야** 알 수 있고, 실행 결과는 머신 상태에 의존해 재현성 지표(UI5)와 원리적으로 양립하지 않는다. 런타임 유효성은 `gap` 에 미측정으로 명시하고, 그 차이를 아래 `## 사용자 결정 요청` 으로 올린다. **Outcome 문면은 고치지 않고 `Status` 도 `complete` 로 넘기지 않는다.**
- **정책 후보 통합** , `policy-candidates.code.jsonl`(확정) + `candidates-unqualified.code.jsonl`(잠정 , 이름이 `policy-candidates.*` glob 밖인 것이 요구사항) + 판정기·생성기 2종 · 62일 전 (insuniverse-docs-11-index-code-m6-r12.plan.md)
  - 요약:
    마일스톤 1~5b 가 만든 코드 축 인덱스 13종(8,143항목)을 **집행 지점 단위**로 통합한다. 소스
    저장소를 다시 스캔하지 않는다 , 입력은 전부 `docs/_meta/index/**` 의 커밋된 산출물이고, 이
    마일스톤은 그 위의 **순수 함수**다.

    실측으로 확인된 심볼 조인은 하나다: `api-contracts.jsonl` 의 endpoint 652행 중 **356행이
    `policy_anchor` 로 `policy-anchors.yaml` 의 356행 전수를 정확히 가리킨다.** 그 밖의 축 사이에는
    조인이 성립하지 않는다.

    후보 자격이 확정되지 않는 항목(`api-contracts.jsonl` 의 property **3,208행 전수** , endpoint 결합도
    입출력 방향도 안 풀리고, `meta.global_validation` 의 `forbidNonWhitelisted: true` 때문에 validator
    없는 속성도 선언 자체가 집행이다)은 **버리지도, 확정으로 세지도 않는다.** 넷째 라운드가 계수 분리도 레코드 분리도
    생산자 자기 기록일 뿐임을 세웠고, 그래서 **산출물을 둘로 가른다** , 확정은
    `policy-candidates.code.jsonl`, 잠정은 `candidates-unqualified.code.jsonl` 이다.
    **이름이 `policy-candidates.*` 밖인 것이 요구사항이다** , 부모 PRD 145 행이 그 glob 을 `cat` 으로
    병합하므로 같은 stem 을 쓰면 잠정분이 확정 소비 경로에 그대로 쓸려 들어간다(R5 F0, 검증됨).

    **큐레이션 이전 프로토콜은 만들지 않는다.** 다섯 라운드에 걸쳐 제거·remap 기전을 정교하게 다듬다가
    R5 가 뿌리를 짚었다 , 6a 는 파일을 **처음** 만들고 보존할 큐레이션이 0이다. 없는 것을 위한 이전
    절차를 설계하는 대신, 큐레이션 필드를 가진 id 가 재생성에서 사라지면 **플래그 없이 무조건 중단**한다.
    실제 큐레이션이 생긴 뒤 실데이터를 보고 설계하는 것이 맞고, 그때는 별도 correction 마일스톤이다.

    **status 값 확정은 이 마일스톤이 아니다.** spec §3 폐기 판정 5중 필터 중 3·4·5 가 git·릴리스 축
    소관이라 코드 축 단독으로는 **5,199 중 11(0.21%)** 만 확정된다 , 확정 11 · 미확정 5,188. PRD 마일스톤 6 을 6a/6b 로 쪼개
    (2026-08-14, Plan-Codex R4 F1) 미완 status 작업이 표에 남게 했다 , 5a/5b 분할과 같은 형태다.
    6a 는 `status` **필드를 닫힌 어휘로 세우고** 도달 가능한 값만 채운다. `10-index-git` 이 나오면
    6b 가 재생성으로 채운다.
- **스크래치 승격** , `admin-corp.temp.md` §13(+본문 실측)을 신 SHA 재확인 후 편입. §14·§11 은 실물 불일치로 승격 없음(위 각주) · 62일 전 (insuniverse-docs-11-index-code.plan.md)
- **status 확정** , 폐기 판정 5중 필터 3(삭제 이력)·4(revert)·5(prod 도달)을 채운다 · 62일 전 (insuniverse-docs-11-index-code-m6b.plan.md)
  - 요약:
    6a 는 코드 축이 단독으로 도달 가능한 것만 확정하고 나머지 5,188행을 `status: null` + 닫힌 사유로
    남겼다. 6b 는 그 사유가 **거짓이었다는 것**을 고친다.

    당초 계획은 git·릴리스 축을 병합해 필터 3·4·5 를 값으로 채우는 것이었다. 4라운드 게이트가 그것을
    무너뜨렸다 , 코드 축 후보는 신 SHA(`c7597fc7`/`b9a90a42`/`7df733a5`)에서 추출됐는데 git·릴리스 축
    산출물은 구 SHA(`4d798f55`/`767d1e44`/`fb001e1d`)에서 끝나고, 그 사이를 설명하는 **소유 산출물이
    저장소에 없다**. 코드 축이 직접 계산하는 길은 UI3 가 배제한 git 이력 추출이다 (D4).

    그래서 6b 가 내는 것은 값이 아니라 **정직한 사유**다.

    | | 6a | 6b |
    |---|---|---|
    | `status` 값 있는 행 | 11 | **15** (Task 1 이 env-gate 를 4종 늘린다) |
    | `status: null` | 5,188 | 5,188 (모집단이 5,203 으로 늘어 같은 수) |
    | 그 사유 | `release_axis_absent`(축이 없다 , **거짓**) · `reference_count_absent`(결손 , **오분류**) | `baseline_drift_unverified`(축은 왔는데 기준선이 다르다) · `candidate_qualification_unresolved` · `reference_count_ambiguous` |

    숫자로는 4행이 늘 뿐이다. 바뀌는 것은 **왜 모르는지를 소비 PRD 5개가 기계로 읽을 수 있게
    되는가**이고, 그 사유마다 **어느 축이 답할 문제인지**가 붙는다는 것이다. 필터 3·4 의 판정 결과와
    참조 계측 결과는 status 로 승격되지 않더라도 `status_basis` 에 근거로 남아, 기준선 불일치가
    해소되면 재조사 없이 승격된다.

    `10-index-git` 은 이미 complete 지만 `main` 에 archived 돼 있고 이 브랜치에는 산출물이 없다.
    Task 0 이 `main` 을 병합해 입력을 확보한다. 병합은 manifest 를 v2 → v9 로 올리고
    `env_gate_rules.known_gates` 를 11 → 15 로 만드는데,
    `docs/_meta/verify/verify-policy-values.mjs:471` 이 그것을 **하한**으로 강제하므로
    `env-gates.yaml` 재생성이 선행 작업으로 딸려 온다.

    > **이 리비전은 Plan-Codex R1~R10 흡수판이다 (2026-08-18).** 31건 전부 ACCEPT_NOW 였고
    > (DESIGN 24 · LOCAL 7), 그중 스물하나는 **앞 라운드의 흡수가 새로 만들어 넣은 오류**였다.
    > 라운드별 내역과 착지점은 맨 아래 `## Codex Adversarial Review` 에 있다.
- 벤더 비교 지표 + 발송 임계 산출 · 62일 전 (ops-alert-system-m4.plan.md)
  - 요약:
    M1~M3 이 만든 단일 발송 경로 위에 **알림 규칙 1개와 산출 스크립트 1개**를 얹는다. 신규 테이블 0개, 신규 스케줄러 0개, 관리자 화면 변경 0개다 , 규칙 설정은 `rule.settings` 메타에서 자동으로 폼이 파생되고(`alert.entity.ts:26-36`), 자기감시 화면은 `ruleCatalog` 에서 파생되므로(M3 §D3) 규칙 등록 1건이 화면 두 곳에 동시에 나타난다.

    규칙이 답하는 질문은 하나다 , **"한 벤더가 죽은 것인가, 수집 풀 전체가 죽은 것인가."** 지금은 구분되지 않는다. 벤더가 전부 나빠지면 `treat-monitor.service.ts:531-533` 이 벤더 수만큼 개별 `warn` 을 내고, 같은 사건이 `:529-530` 에서 전역 `critical` 로 한 번 더 나간다. 수신자는 같은 장애를 N+1 건으로 받고 어느 쪽이 원인인지 알 수 없다.

    **임계 산출은 이번에 완결되지 않는다.** 연결된 DB 의 표본이 통계적으로 부족하다는 것을 GROUND 단계에서 실측했다(§실측 근거). 그래서 M4 가 내놓는 것은 확정 수치가 아니라 **(1) 벤더 비교 판정 규칙, (2) 전 임계의 설정화, (3) 백분위 산출 스크립트와 표본 충분성 판정**이며, 스크립트를 연결 DB 로 1회 돌린 결과를 "표본 부족"으로 리포트에 명시한다. 확정 수치는 prod 데이터 확보 시점으로 이월하고 PRD Q3 를 열어 둔다. 수치가 도착하면 재배포 없이 설정 화면에서 넣는다(UI6).

    **그래서 규칙은 기본 OFF 로 시드해 배포한다**(§D9). `isRuleEnabled()` 는 설정 행이 없으면 **켜짐**으로 읽으므로(`alert-settings.service.ts:117`), 등록만 하면 승계 기본값이 배포 즉시 실운영 판정값이 된다. 측정되지 않은 값이 조용히 판정에 들어가는 것은 UI4 가 금지한 그것이다. 켜는 것은 산출 수치가 나온 뒤의 별도 결정이고 **토글 하나가 아니다** , 산출값을 임계·오버라이드에 반영하고 승인 벤더를 기록한 다음 마지막에 켜는 5단계이며, 재배포는 어느 단계에도 필요 없다(§D9 활성화 표).
- comments.jsonl ×3 (5단계 전수 분류, `exclude_glob` 적용) · 69일 전 (insuniverse-docs-10-index-git-m2.plan.md)
  - 요약:
    `docs/_meta/index/extract-comments.mjs` 추출기 1개를 커밋하고 그것으로 `comments.{server,site,admin}.jsonl` 을 산출한다. 한글 주석 **블록** 1개 = 1행이며 각 행에 manifest `comment_rules.classification` 5단계 태그가 전수로 박힌다. 마일스톤 1 의 `commits.jsonl` 이 커밋 축을 닫은 것과 같은 형태로 주석 축을 닫는다.

    이 마일스톤의 고유 위험은 **exclude 층위**다. 주석 추출은 git 명령이 아니라 파일 내용 스캔이므로 `exclude_pathspec`(14항목)이 아니라 `exclude_glob`(11항목)을 쓴다. 실측으로 admin 은 `public/_statics/` 아래에만 tracked 파일이 **4,500개**, `pdfjs-dist/` 아래에 350개 있다 , manifest 가 *"이것이 137 이 나온 경로다"* 라고 지목한 바로 그 표면이다.

    부산물로 spec §7 이월 1번(*"주석 5단계 전수 분류 → 정책 후보 실수치 확정"*)이 닫히고, PRD §Evidence 항목 2 의 `25~40% 추정치`가 실수치로 교체된다.
- releases.yaml · 69일 전 (insuniverse-docs-10-index-git-m3.plan.md)
  - 요약:
    추출기 `docs/_meta/index/extract-releases.mjs` 1개를 커밋하고 그것으로 `docs/_meta/index/releases.yaml` 을 산출한다.
    manifest `release_rules` 의 3버킷(`prod_merge` · `prod_only` · `stg_only`)과 SHA별 prod 배포 도달성을 담는다.
    마일스톤 1·2 가 커밋 축·주석 축을 닫은 것과 같은 형태 , 커밋되는 추출기 + 산출물 + `--selftest` 로 닫는다.

    이 마일스톤의 고유 위험은 **기준점이 두 개인데 하나만 동결돼 있다**는 것이다. `stg` 쪽은 manifest 가
    `repos[].head` 로 동결하지만 `origin/prod` 는 동결 대상이 아니다. 게다가 로컬 `refs/heads/stg` 는 이미
    동결 HEAD 에서 이동했다(실측: server `6fcf9794` ≠ `4d798f55`, site `f29b04dd` ≠ `767d1e44`).
    manifest `release_rules.compare` 는 그 이동 가능한 ref 이름을 문자 그대로 쓴다. 규약을 문자대로 실행하면
    동결이 깨진 값이 나온다.

    부산물로 폐기 5중 필터의 5번(도달성 , prod 배포에 포함됐는가)이 기계 판독 가능해지고,
    마일스톤 4(`dead-candidates.yaml`)의 입력 3종 중 1종이 확보된다.
- dead-candidates.yaml + revert 미복원 확정 + **manifest `orphans` 정정 보고** · 69일 전 (insuniverse-docs-10-index-git-m4.plan.md)
  - 요약:
    추출기 `docs/_meta/index/extract-dead-candidates.mjs` 1개를 커밋하고 그것으로
    `docs/_meta/index/dead-candidates.yaml` 을 산출한다. 폐기 5중 필터(spec §3) 중 git 축 3종 ,
    **삭제 이력**(`--diff-filter=D`) · **revert 미복원** · **prod 미도달** , 을 담는다.
    마일스톤 1~3 과 같은 형태다: 커밋되는 추출기 + 산출물 + `--selftest` 2층.

    이 마일스톤의 고유 위험은 **삭제가 곧 폐기가 아니라는 것**이다. 실측상 삭제된 경로의
    과반이 이름을 바꿔 살아 있다. `-M50%` rename 검출은 그중 일부만 잡는다 , `Admin/Point` 사례가
    정확히 그 구멍이다(아래 §착수 전 실측 3). 그래서 M3 이 `prod_merge` 에서 "승격" 주장을 뺀 것과
    같은 방식으로, 이 산출물도 **"폐기다"라고 판정하지 않는다.** 각 행은 관측 사실과 후속 흔적 3층만
    담고, 판정은 소비자(`60-history-deprecated`)와 `00-protocol` 로 넘긴다.

    새 git 호출은 대부분 필요 없다. 삭제 이력은 이미 `commits.*.jsonl` 의 `files[]` 안에 있다 ,
    마일스톤 1 이 `--full-history` + `-M50%` + `exclude_pathspec` 14항목으로 뽑아 둔 원자료다.
- cross-repo-days.csv + `_site/` 중복 사본 매핑 (`site_path_duplicates`) · 69일 전 (insuniverse-docs-10-index-git-m5.plan.md)
  - 요약:
    추출기 `docs/_meta/index/extract-cross-repo-days.mjs` 1개를 커밋하고 그것으로
    `docs/_meta/index/cross-repo-days.csv` 를 산출한다. 동시에 PRD §필수 해소 항목 2건을 닫는다 ,
    **`_site/ → front/` 경로 매핑**(항목 4)과 **3-repo 동시 커밋일 조인의 표본 검증**(항목 5).

    착수 전 실측이 **두 전제를 모두 뒤집었다.** 아래 §착수 전 실측에 전부 실려 있다.

    1. **`_site/ → front/` 는 이동이 아니다.** rename 검출 **0건**이고, `_site/` 는 2025-01 한 달에만
       4커밋으로 등장했다 나갔다. 478개 경로 전부가 접두어를 떼면 **같은 커밋에 실재하는 경로**이고
       blob 이 바이트 동일하다. 매핑의 실체는 `_site/X → X` 접두어 제거 한 줄이지만
       **PRD 가 요구한 테이블은 그대로 만든다** , 478행 전건을 `dead-candidates.yaml` 최상위
       `site_path_duplicates:` 섹션으로 낸다.
    2. **동시 커밋일은 조인 키로 쓰기엔 정밀도가 낮다.** 3-repo 동시일 151일은 독립 가정 대비 3.75배지만
       **평일 효과를 통제하면 2.09배**로 내려간다. 세 저장소가 같은 날 *같은 주제*를 만졌다는 직접 증거가
       있는 날은 **151일 중 27일(17.9%)** 뿐이다(대조군 0.0~0.7%).

    그래서 이 산출물도 M3·M4 와 같은 자세를 취한다 , **관측을 내고 판정하지 않는다.**
    `_site/` 478건을 "허위 후보" 라 부르지 않는다(경로는 실제로 삭제됐다). 중립 분류
    `duplicate_of_tracked_path` 로 두고, 배포 노출 여부는 **저장소 안 증거로 단정할 수 없다**고 적는다(§실측 1-h).
    CSV 는 PRD 계약대로 **동시일 151행만** 낸다 , 분모(활동일 392)와 배수는 `--print-provenance` 와
    findings 로 내고 행으로 섞지 않는다.
- policy-candidates.git.jsonl + status · 69일 전 (insuniverse-docs-10-index-git-m6.plan.md)
  - 요약:
    마일스톤 1~5 가 낸 6개 산출물을 **정책 후보 1건 = 1행**으로 통합하고, 각 행에 `05-final-spec.md` §3
    status 를 부여한다. 이 축은 git 이므로 §3 의 8개 값 중 **git 단독으로 닫히는 4개만** 확정하고
    나머지는 `status: null` + `status_resolution: "git-axis-incomplete"` + `status_open` 으로 남긴다.
    **§3 에 9번째 값을 만들지 않는다** , 게이트(env)·참조 카운트
    (code)는 형제 PRD `11`·`12` 소관이라 여기서 단정하면 부모 PRD 제약 2 위반이다.

    `releases.yaml`·`dead-candidates.yaml` 을 읽어야 하는데 이 저장소에는 YAML 파서가 없다
    (PRD §착수 전제 2). **파서를 조달하지 않는다.** 두 추출기의 sink 를 분리(`emit` 파라미터)하고 `--json` 을 붙여
    자기 모델을 그대로 내게 한다 , YAML 텍스트 생성은 건드리지 않으므로 기존 산출물은 바이트 무변경이다.
- **소비자 계약 확정** , 인덱스 필드 사전 · `cross-repo-days.csv` 한계 표기 · 00-protocol 인계 목록 · backlog 종결 · 69일 전 (insuniverse-docs-10-index-git-m7.plan.md)
  - 요약:
    산출물 10개를 만드는 일은 마일스톤 0~6 이 끝냈다. 이 마일스톤은 **한 바이트도 새로 만들지 않는다.**
    소비자(`20`~`60` 문서 PRD 5개)가 추출기 소스와 85KB findings 를 읽지 않고도 인덱스를 올바로 쓰게 하는
    **계약 문서**를 만들고, 규약 판단이 `00-protocol` 소관인 항목을 한 표로 모으고, 열린 채 남은 backlog
    1행과 선언만 되고 없는 파일 1개를 닫는다.

    해소 대상은 최종 검토 9건 중 **R-01 · R-02 · R-04 · R-07 · R-09**(전부 해소) +
    **R-06**(**부분** , 아래) (`.claude/notes/insuniverse-docs-10-index-git-final-review.md`).
    나머지 R-03 · R-05 · R-08 은 산출물 재생성이 필요하므로 마일스톤 8 이다.

    - **R-04 해소** , 색인 23건 전건 + 최종 검토가 **이미 고른 8건을 출처 밝혀 인용**한다.
      이 판정은 **Task 3 이 지시한 문장이 실제로 그렇게 쓰였다는 전제**에 선다 , Validation 4 는
      8개 식별자와 출처 파일명의 **존재만** 보므로 뜻이 반대인 문장도 통과한다 (Codex R14 F2).
      의미 검증은 잔여 3 이다.
      초안은 이 인용을 "새 분류" 로 오해해 빼고 R-04 를 부분으로 적었는데, 8건은 최종 검토 문서
      `:100-106` 에 이미 열거된 문자열이라 옮기는 것이 UI6 위반이 아니다 (Codex R7 F3).
      남는 것은 목록이 아니라 `00-protocol` 의 **판단 자체**이며 그것은 원래 이 축 소관이 아니다.
    - **R-06 부분** , 이 마일스톤은 `release_like_pattern` 을 **문서화만** 한다(Task 1 §알려진 한계 ·
      Task 3 색인). manifest 승격도 추출기 수정도 하지 않으므로 **닫히지 않는다.** 남은 판단은
      00-protocol 소관이고 R-04 색인이 그 회부 경로다. 초안이 이것을 "전부 해소" 로 적은 것은
      과다 주장이었다 (santa R1 B-F4).
- verify 스크립트 + golden 수치 , exclude 두 목록 정합 검사 포함 · 69일 전 (insuniverse-docs-00-protocol-m3.plan.md)
  - 요약:
    manifest 가 동결한 값(저장소 SHA 3 · exclude 두 목록 · screen_codes 282 · menu 하드코딩 18)을 **다시 만들어 대조하는 셸 스크립트 1개**와 그 출력의 동결본 `golden.txt` 를 만든다. 재현성 판정은 프레임워크가 아니라 `diff` 빈 출력이다. 같은 스크립트가 doc-kit lint 전수 실행을 겸해, CI 없는 저장소에서 우산 PRD 제약 #7 을 강제하는 유일한 실행 지점이 된다.

    핵심 설계 결정 하나: **golden 에 담는 것과 게이트로만 두는 것을 나눈다.** 추출 수치·SHA·exclude 집합은 golden 에 동결하고, lint 결과와 selftest 는 exit code 게이트로만 둔다. 후속 8개 PRD 가 문서를 추가할 때마다 golden 이 흔들리면 8개 worktree 가 매번 golden 을 만지게 되고, 그 순간 golden 은 동결본이 아니게 된다.
- **분쟁 수치 5종 재측정 · 단일값 확정** , 신 SHA 기준. 구 SHA 실측치는 출처 주석과 함께 병기 · 69일 전 (insuniverse-docs-00-protocol-m4.plan.md)
  - 요약:
    PRD Problem 표의 5개 분쟁 수치를 신 SHA 기준으로 다시 재고, 각각에 단일 확정값을 부여한다. 산출물은 추출기 1개(`extract-disputed-counts.mjs`)와 그 결과가 편입된 `golden.txt` 행, 그리고 구↔신 값을 출처와 함께 병기한 manifest `disputed_counts:` 블록이다.

    핵심 설계 결정 둘.

    **(1) 다섯 수치를 전부 동결 객체에서 잰다 , 워킹트리도 인덱스도 읽지 않는다.** PRD Problem 이 SHA 동결의 구멍으로 지목한 것이 *"`@Roles` 개소·spec 파일 수 같은 파일 스캔 기반 수치는 커밋이 아니라 워킹트리를 읽는다"* 였다. 목록은 `git ls-tree -r <manifest SHA>`, 내용은 `git cat-file --batch` 에 `<manifest SHA>:<path>` 를 넣어 받는다. 워킹트리 상태·인덱스 플래그·빌드 여부가 값에 닿는 경로가 남지 않는다. 실측 2.5초(3개 저장소 전체).

    **(2) 추출기는 5종이 아니라 1개다.** 다섯 수치 중 넷(spec 파일 · `@Roles` · 한글 주석 · 그 sha256)이 **같은 트리 목록 한 번**에서 떨어진다. 저장소당 git 호출 3회(`ls-tree` · `cat-file --batch` · `log`)면 전부 끝난다. 추출기를 나누면 같은 목록을 5번 만든다.
- 템플릿 고유값 채우기 , 키트 fixture `.claude/templates/doc-kit/examples/template-config.insuniverse.yaml` 를 `docs/_meta/template-config.yaml` 로 복사·조정 (필수 키 7개는 `template-config.schema.md` 참조). 필수 절 상한 5 는 정책·IA 템플릿이 공유하므로 유지 · 69일 전 (insuniverse-docs-00-protocol-m5.plan.md)
  - 요약:
    doc-kit fixture `.claude/templates/doc-kit/examples/template-config.insuniverse.yaml` 를 `docs/_meta/template-config.yaml` 로 승격한다. 값은 이미 채워져 있으므로 이 마일스톤의 실질은 복사가 아니라 **세 가지**다.

    **(1) 값마다 정본 소스를 대고, 댈 수 있는 것은 게이트로 만든다.** fixture 는 마일스톤 1(서브모듈 전환) 이전에 작성됐고 그 안의 근거 앵커는 구 SHA 실측을 옮긴 것이다. PRD §스크래치 승격 규약이 "승격 시 신 SHA 로 값을 다시 확인한다"를 의무로 걸었다. 9개 키 전부에 정본 소스와 검증 방법을 붙이고(§키별 파생 근거), 그중 기계 대조가 가능한 3종(`repos`↔manifest · `statuses`↔spec §3 · `status_precedence` 집합↔`statuses`)은 **주장이 아니라 검사**로 만든다.

    **(2) Success Metric #6 을 실제로 자동화한다.** PRD 는 이 지표의 측정자를 `자동`으로 적었지만 현 `verify.sh` 의 lint 게이트는 `docs/0*/` 등 **아직 0건인 경로**만 본다. `--bootstrap` 으로 통과 중이라 lint 는 지금 아무것도 검사하지 않는다. 파일을 만들어 두고 지표를 손으로 판정하면 마일스톤 3 이 세운 원칙("동결값을 사람이 눈으로 대조하면 그 판정은 실행되지 않는다")이 여기서만 깨진다.

    **(3) 값을 전수로 동결한다.** golden 에 파싱된 값 9행을 싣는다. 요약 다이제스트 1행이 아니다 , `verify.sh:348-349` 가 이미 *"집합은 개수가 아니라 전수로 싣는다. 개수만 실으면 항목 하나가 다른 항목으로 바뀐 교체 드리프트가 통과한다"* 로 같은 판단을 내려 뒀다.

    산출물은 config 파일 1개 + `verify.sh` 게이트 함수 1개 + golden 9행이다.
- onboarding-questions 초안 → 사용자 확정 · 69일 전 (insuniverse-docs-00-protocol-m6.plan.md)
  - 요약:
    `docs/_meta/onboarding-questions.yaml` 에 온보딩 질문 20~30개 초안을 싣고, 각 질문에 담당 PRD 태그를 붙인다. 이 파일은 **하류 5개 문서 PRD 전부의 종료 조건**이다 , 우산 PRD 지표 #2("온보딩 질문 통과율")의 측정 단위가 여기 적힌 태그이고, `20`~`60` 각각의 Success Metrics 첫 행이 이 파일을 이름으로 지목한다.

    그래서 이 마일스톤의 실질은 질문을 쓰는 것이 아니라 **넷**이다.

    **(1) 질문을 지어내지 않고 PRD 에서 파생시킨다.** 5개 문서 PRD 는 각각 Problem 에 "신입이 무엇에서 막히는가"를 이미 적어 뒀다(20: `ANS001`·`E0401`·`agcRole` / 30: "이 값을 넣으면 통과하는가" / 40: "코드에 있으니 도는 줄 알았다" / 50: "이 도메인에서 무슨 일이 일어나는가" / 60: "이 규칙이 지금 살아 있는가"). 질문마다 `src:` 로 그 PRD 절을 대고, **그 `src` 가 `owner` 와 같은 PRD 를 가리키는지 게이트가 대조한다.** 책상에서 질문을 만들면 `menu_codes` 정규식이 실측 5행을 탈락시킨 실패를 반복한다(PRD §Evidence).

    **(2) 지표가 vacuous 하게 통과하는 경로를 닫되, 결손은 명시로 허용한다.** 태그가 하나도 안 붙은 PRD 는 "해당 태그 질문 전부 O"가 **질문 0건으로 자동 성립**한다. 종료 조건이 공집합에서 참이 되는 것은 이 저장소가 `run_lint_gate` 에서 이미 실패로 규정한 형태다(*"매칭 0건은 통과가 아니라 실패"*). 5개 PRD 와 `50-domain` 의 서비스 3종 전수를 요구하되, 사용자가 어느 축을 제외하기로 하면 `coverage_exceptions:` 에 **사유와 함께** 적는다 , `menu_codes` DB 축을 `complete: false` + `db.gap` 으로 닫은 것과 같은 처리다.

    **(3) 승인이 파일 안에서 측정되고 PRD 상태와 교차 대조된다.** 지표 #5 는 *"사용자가 명시적 승인. 미승인 항목 0"* 이다. 승인이 대화 로그에 있으면 셀 수 없다. `approved:` 를 질문마다 두고 `approved_at:` 을 파일 머리에 둔 뒤, **PRD 의 마일스톤 6 행이 `complete` 면 게이트가 승인 완료를 요구한다**(§승인은 PRD 상태와 묶는다).

    **(4) `ia-doc@1` 소비 판정을 기계적으로 남긴다.** PRD 는 *"화면 목록류 질문이 1건이라도 포함되면 IA 소비 문서가 필요하고, 없으면 `ia-doc@1` 은 타 프로젝트용 자산으로 남는다"* 로 판정 규칙을 이미 확정했다. 판정 결과를 산문으로 적으면 질문 목록이 바뀔 때 조용히 어긋난다. 파일이 `ia_consumed:` 를 **선언**하고 게이트가 `screen_inventory: true` 질문의 존재와 **대조**한다.

    산출물은 yaml 1개 + `verify.sh` 파서·게이트 + golden 8행이다.
- **입력 동결 확인** , `submodule update --init` + 3개 HEAD ↔ manifest `repos[].head` 문자열 대조 · 69일 전 (insuniverse-docs-10-index-git.plan.md)
  - 요약:
    마일스톤 0 은 추출 대상 자체를 복원하고 동결이 깨지지 않았음을 증명하는 fail-closed 게이트다 , 현재 3개 서브모듈이 전부 미초기화이므로 이것 없이는 어떤 추출도 시작할 수 없다. 마일스톤 1 은 `docs/_meta/index/extract-commits.mjs` 추출기 1개를 커밋하고 그것으로 `commits.{server,site,admin}.jsonl` 을 산출한 뒤, PRD §Evidence 의 구 SHA 수치 4항목에 신 SHA 실측값을 병기한다.

    0 과 1 을 한 plan 으로 묶는 이유: 0 은 명령 2줄짜리 게이트이고 1 의 전제이며, 0 의 산출물(복원된 3개 워킹트리)은 다른 소비자가 없다. 00-protocol 이 마일스톤 1·2 를 한 plan 으로 처리한 선례를 따른다.
- **재현 고정 + 후보 정제** , prod tip 핀 파일 · 법정 고지 보일러플레이트 태그 · 전건 재생성 · 69일 전 (insuniverse-docs-10-index-git-m8.plan.md)
  - 요약:
    마일스톤 7 이 문서로 닫은 것과 달리 이 마일스톤은 **산출물 바이트를 바꾼다.** 두 가지다.

    1. **실행과 실행 사이의 `origin/prod` 드리프트를 닫는다** (R-03). 한 실행 *안의* 드리프트는
       이미 닫혀 있고(F-10-12 · m6 notes F1), 닫히지 않은 것은 **다음 실행이 다른 prod 를 볼 때**다.
       `--prod-tip` 인자는 이미 있는데 그 값을 담은 **커밋된 파일이 없어서** 재현 절차가 사람이
       SHA 를 손으로 옮겨 적기를 요구한다. 핀 파일을 만들고 추출기 3종이 그것을 기본값으로 쓴다.
    2. **법정 고지 문구를 제품 정책과 구별한다** (R-05). `policy-candidates.git.jsonl` 의 `comment`
       소스 1,370행 중 개인정보처리방침·제3자 제공 동의문·이용약관 문구가 섞여 있고 대부분
       `class: 1_policy` 로 붙었다. **후보에서 빼지 않는다** , `20`~`60` 이 인용 여부를 스스로
       판단하도록 **표시만** 한다.

    그리고 두 변경 뒤에 전건 재생성 + 재현성 2회 실행을 다시 돌려 Success Metrics 7종이 유지됨을
    확인한다. 해소 대상은 최종 검토 9건 중 **R-03 · R-05**(전부 해소) + **R-08**(판단만 , 아래).

    - **R-08 은 "판단 기록" 으로 닫고 receipt 를 만들지 않는다.** 돌지 않은 리뷰의 receipt 를
      오늘 날짜로 쓰는 것은 없는 증거를 만드는 것이다 (UI4). 사유를 notes 에 남기고, 리뷰가
      필요하면 **최종 산출물 전체에 대한 m8 시점 리뷰 1건**이지 m0~m5 소급분이 아니다.
- **저장소 서브모듈 재구성** , 로컬 변경 보존 판단 → **제자리 전환** (`.gitmodules` + `submodule init` + `absorbgitdirs`, `stg` 최신) → 커밋 · 69일 전 (insuniverse-docs-00-protocol.plan.md)
  - 요약:
    3개 저장소를 복원 가능한 서브모듈로 만들고, 그 SHA 를 `extraction-manifest.yaml` 에 문자열로 고정한다. 마일스톤 1 은 마일스톤 2 의 유일한 입력(복원 가능한 SHA)을 만들 뿐 단독 산출물이 없고, 마일스톤 2 완료가 `10`·`11`·`12` 병렬 착수의 게이트이므로 둘을 한 plan 으로 묶는다.

    마일스톤 3~7 은 이 plan 범위 밖이다.
- `00-index` + `ownership`(스크래치 승격 규약 포함) + `findings/` 개설 및 06 §2-1 이관 · 69일 전 (insuniverse-docs-00-protocol-m7.plan.md)
  - 요약:
    이 PRD 의 마지막 마일스톤이자, 하류 8개 worktree 가 착수 전에 읽어야 할 세 가지를 고정한다 , 문서가 **어디에 놓이는지**(`docs/00-index.md`), **누가 무엇을 소유하는지**(`docs/_meta/ownership.md`), **발견한 사실을 어디에 흘리지 않고 적는지**(`docs/_meta/findings/`).

    세 산출물은 성질이 서로 다르고, 그 차이가 게이트 형태를 가른다.

    - `00-index.md` 는 **전사**다. `05-final-spec.md` §4 가 정본으로 남고 인덱스는 그 사본이므로, 게이트는 사본이 정본과 같은지를 본다(M5 의 `config.statuses ↔ 05-final-spec.md §3` 과 같은 형태).
    - `ownership.md` 는 전사가 아니라 **정본 승계**다. PRD §Risks 가 이미 규정했다 , *"`ownership.md`(마일스톤 7)가 늦게 나오므로 **그 전까지는** 부모 PRD 분할 맵이 정본"*. 즉 이 파일이 생기는 순간 소유권 정본은 우산 표에서 이 파일로 넘어온다. 승계를 전사처럼 대조하면 승계된 정본을 폐지된 소스에 영구히 묶게 되므로, 게이트는 동등성이 아니라 **무손실 승계**를 본다(우산 9행 전수 보존 + 추가분은 사유·근거와 함께 명시 선언).
    - `findings/` 는 신설이다. 디렉터리와 기록 형식만 만들고 본문은 각 PRD 가 채운다 , 단 첫 항목 하나(`06-access-model-findings.md` §2-1 무인증 노출)는 이 마일스톤이 이관한다.
- schedules.yaml + CI 주입값 연계 · 69일 전 (insuniverse-docs-12-index-runtime-m1-r2.plan.md)
  - 요약: 마일스톤 0 이 규모(`inventory` 17 · `declared` 15)를 확정했다. 마일스톤 1 은 그 17종 **각각에 배포 선언 상태를 매핑**해 `docs/_meta/index/schedules.yaml` 로 고정한다 , **활성 조건이 아니라 선언 상태다.** 활성 조건은 저장소 안에 존재하지 않고(F-02·F-03), 그래서 이 마일스톤의 정직한 결과는 **선언 17/17 · 활성 0/17** 이다. Task 3 의 "이 마일스톤의 정체 재정의" 와 같은 것을 말한다. 착수 그라운딩에서 마일스톤 0 이 보지 않은 축이 하나 드러났다 , **`declared` 는 브랜치별로 다르다.** `origin/prod` 의 선언은 15가 아니라 17이며, 그 차이가 F-01 의 해석을 뒤집는다. 마일스톤 0 의 잔여 차단(회부 1)도 이 계획의 Task 0 으로 닫는다.
- **vendor-behaviors.yaml** · 69일 전 (insuniverse-docs-12-index-runtime-m2.plan.md)
  - 요약: 마일스톤 1 이 스케줄러 축을 닫았다. 마일스톤 2 는 벤더 축을 닫는다 , 8개 벤더 각각의 **성공/자료없음/실패 의미 + timeout + fallback + 응답 정규화**를 `docs/_meta/index/vendor-behaviors.yaml` 로 고정한다. 착수 그라운딩에서 PRD 가 전제하지 않은 구조가 드러났다: **8개 벤더는 한 축이 아니라 두 축이다.** 진료수집 5종에는 코드 안에 이미 통합 택소노미(`TreatErrorCategory` 18값)가 있어 의미가 기계 추출 가능하고, 결제·발송 3종에는 그런 것이 없다. 그리고 진료수집 5종 중 **기본 공급자 `codef` 만 `NO_DATA` 로 분류된 코드가 0건**이다 , PRD "반드시 답할 것" 2번("자료없음과 실패를 구분하는가")의 답이 그라운딩에서 이미 나왔고, 그것이 이 마일스톤의 헤드라인이다.
- legal-surfaces.yaml · 69일 전 (insuniverse-docs-12-index-runtime-m3.plan.md)
  - 요약:
    PRD MVP 표는 `legal-surfaces.yaml` 의 내용으로 7항목을 열거한다 , 약관 버전 · 동의 시각 · 기업별 문구 · 철회 · 재동의 · 마스킹 · 수탁업체. 조사 기준점(`4d798f55`·`767d1e44`·`fb001e1d`)에서 실측하면 **그 7항목은 한 축이 아니다.** 4개는 저장소 안에 실체가 있고, 2개는 코드·스키마에 존재하지 않으며(재동의 · 수탁업체), 1개는 서로 다른 두 뜻으로 쓰인다(철회). 그리고 "약관 **버전**" 은 제품 전역 개념이 아니라, 선언된 탐색 universe 안에서는 **자동차 카나리 경로에서만 관측된다.**

    마일스톤 2 가 벤더 8종을 `axis` 로 갈라 coverage 를 분리한 것과 같은 처방을 쓴다. 한 스키마에 7항목을 욱여넣으면 부재가 빈칸으로 보이고 "7/7 완결" 로 읽힌다. 부재를 **값**으로 적는다.

    산출물은 **소재(location)** 를 고정하고 법적 해석은 하지 않는다. PRD Risks 의 "법적 표면 오기술 = 영향 매우 높음 · 불확실하면 `unknown`, 추정 금지" 가 이 마일스톤의 지배 제약이며, PRD 마일스톤 3 Outcome 자체가 "규칙의 **소재가 확정**됨" 이다.

    ---
- policy-candidates.runtime.jsonl + status · 69일 전 (insuniverse-docs-12-index-runtime-m4-r2.plan.md)
  - 요약:
    마일스톤 1~3 이 세 인덱스를 만들었다 , `schedules.yaml`(17) · `vendor-behaviors.yaml`(8벤더 24칸) · `legal-surfaces.yaml`(7항목). 마일스톤 4 는 **소스를 다시 스캔하지 않는다.** 세 산출물을 정책 후보 단위 행으로 통합하고 각 행에 `05-final-spec.md` §3 의 status 를 부여한다 , **부여 조건이 문자 그대로 성립할 때만**이며, 성립하지 않는 행은 미부여로 남긴다(아래).

    핵심 관측이 하나 있고 그것이 이 마일스톤의 결론을 미리 정한다 , **spec §3 status 모델은 배포 도달 증거를 전제하는데 이 축에는 그 증거가 저장소 안에 존재하지 않는다**(회부 3 미해결). 5중 필터 5번(도달성 = "prod 배포에 포함됐는가")을 통과하는 행이 0이므로 `active-prod` 와 `conditional-enabled` 는 **한 행도 부여되지 않는다.**

    그래서 **도달성을 status 축에 욱여넣지 않고 직교 축으로 분리한다.** `status` 는 spec §3 의 조건이 **문자 그대로 성립할 때만** 8값 중 하나가 들고, 성립하지 않으면 `null` 이다. 부여 여부는 별도 필드 `assignment_state`(`assigned`|`pending`) 가, 도달 등급은 `reachability` 가, 관측 여부는 `observability` 가 진다. 마일스톤 1 이 계약 필드 `active` 를 그대로 두고 `activation_grade` 를 덧붙인 것, 마일스톤 3 이 `no_data_discrimination: unmapped` 로 갈라지지 않음을 값으로 적은 것과 같은 처방이다. **소유된 8값 어휘에 9번째를 만들지 않는다** , `"unassigned"` 같은 토큰을 `status` 에 넣으면 부정해도 사실상 enum 확장이고 8값을 검증하는 하류 소비자가 그 행을 거절한다(Codex R2 F2).

    **그 결과 PRD Success Metric 하나가 현 문구대로는 성립하지 않는다.** "status 부여율 100% · `status` 없는 행 0" 인데 정직한 산출은 33/49 다. 이것은 지표 **목표값의 변경**이므로 계획이 단독으로 정하지 않는다 , 두 읽기를 아래 Open Questions 에 적고 **사용자 결정을 받은 뒤** Task 4 가 반영한다. 산출물 자체는 어느 결정에서도 같다(정직값을 그대로 방출한다).

    status 는 손으로 부여하지 않는다. **선언된 규칙표에서 소스 YAML 필드로부터 파생**되며 규칙표는 sha256 으로 산출물에 실린다. 마일스톤 1 의 `active_reason`(판단 문장 금지 · `kind` 에서 파생되는 고정 문자열) 과 마일스톤 3 의 `SENTENCES` 테이블이 같은 처방이다.

    ---
- **신 기준점 규모 재측정** , 벤더 분기 · 약관 표면 · 스케줄러 종수 · CI 파일 수. manifest `exclude_glob` 11항목 강제 적용 · 70일 전 (insuniverse-docs-12-index-runtime.plan.md)
  - 요약:
    마일스톤 0 은 마일스톤 1~3 전부의 선행이다. 구 기준점 수치(벤더 1,762 · 약관 427 · 스케줄러 16)를 신 기준점 SHA + manifest `exclude_glob` 11항목 강제 적용으로 재측정하고, 구값과의 차이를 **exclude 결함 교정**과 **정의 차이 + stg 진행량**으로 갈라 기록한다. 산출물은 커밋되는 추출기 `extract-runtime-scale.mjs` 1개 + `findings/12-index-runtime.md` + PRD Evidence 표 갱신이다.

    그라운딩 단계에서 이미 **스케줄러 축의 3중 불일치**를 실측했다 , 소스 16 · dockerfile CMD case 15 · CI `TYPES` 15. 이것이 PRD Open Question 3("정본이 CI 와 dockerfile 두 곳")의 답이며, 마일스톤 0 의 실질 산출물이다.
- **최종 감사 정정** , 계약 표 정합 · 마일스톤 0 재현 오라클 · 유출 경계의 채널 정의 · 70일 전 (insuniverse-docs-12-index-runtime-m5.plan.md)
  - 요약:
    마일스톤 0~4 가 전부 `complete` 로 선언된 뒤 PRD **전체**를 대상으로 최종 감사를 돌렸다.
    **산출물 자체는 건전하다** , 4종 전부 재방출 바이트 일치, `--selftest` 7/7, `--selftest-leak`
    2/2, `--leak-check` 3/3, `--schema-check` 1/1, locale/TZ 를 흔들어도 바이트 일치.

    **결함은 전부 그 바깥에 있다.** 실재 확정 **7건**(F-24~F-30) 중 둘은 이 PRD 가 가장 중요하다고
    선언한 두 축을 정통으로 겨눈다 , **계약 표(MVP 산출물 표)가 산출물과 어긋나 있고**, **신 기준점
    4축을 정한 마일스톤 0 만 커밋된 재현 오라클이 없다.** 나머지는 유출 경계의 채널 미정의,
    manifest 메타데이터 자기모순, findings 상태 어휘 이탈, 그리고 **santa 정정이 한 채널에만
    도달해 리포트와 코드 주석에 남은 갱신 누락 2건**이다.

    **이 마일스톤은 새 스캔을 열지 않고 새 인덱스도 만들지 않는다.** 이미 참인 것을 참이라고
    강제하는 층만 보탠다 , 마일스톤 4 santa 루프가 *"바뀐 것은 그 값들이 참임을 무엇이
    보증하는가뿐"* 이라고 적은 것과 같은 성격이다.

    ---
- constants.yaml + env-gates.yaml · 74일 전 (insuniverse-docs-11-index-code-m3.plan.md)
  - 요약:
    산출물 2개는 둘 다 **수치·게이트 값 축**이고 같은 스캔 1회에서 나온다. 그래서 본체는 마일스톤 2 와 같은 모양 , **생성기 1개 + 검증기 1개**이며, 파일 4개가 아니라 2개다(사유는 Task 0-c).

    착수 전에 닫아야 할 것이 셋인데 전부 **정본끼리 어긋나는** 문제다.

    1. **게이트 개수**: PRD·manifest v2 는 11종, `05-final-spec.md` §1 은 2026-08-05 개정으로 **version 3 · 15종**이다(`RUN_MODE`·`SCHEDULER_TYPE`·`REACT_APP_SMARTRO_MODE`·`REACT_APP_TOSS_CLIENT_KEY` 추가). 넷 다 코드에 실재한다(실측 확인). PRD 헤더는 manifest 를 **v2 읽기 전용**으로 못박았고 manifest 는 `00-protocol` 소유라 이 PRD 가 못 고친다 , **그러나 PRD 헤더는 spec 도 같은 줄에서 정본으로 지정했고, 둘 중 spec 이 더 최신이다.** 마일스톤 2 가 PRD ↔ spec 충돌에서 spec 을 택한 것과 같은 판단으로 **15종을 인덱스한다**. manifest 미등록분 4종은 `pending_manifest_registration: true` 로 표시해 지연이 파일에 드러나게 한다 (Codex R1 F1 , 상세는 Task 0-b).
    2. **상수 범위**: PRD Scope 의 5패턴(`MAX_MONEY_*`·`*_TTL_MS`·`RATE_LIMIT_*`·`BATCH_SIZE`·`*_TIMEOUT`)은 spec §2:188 에서 **"…등"** 이 붙은 **예시**다. 5패턴을 닫힌 목록으로 읽으면 SCREAMING_SNAKE 수치 선언 56 중 **40 이 빠지고**, 그 안에 `MAX_CHARGE_AMOUNT`·`MAX_CORP_MONEY_AMOUNT`·`MIN_AGE` 같은 금액·자격 상한이 들어 있다 , spec §4:261 이 `01-amounts-and-quotas.md` 로 요구한 바로 그 부류다.
    3. **이름 모양 ≠ 의미**: `*_TIMEOUT` 이 잡는 `AUTH_TIMEOUT` 18개소는 **수치 상수가 아니라 `TreatErrorCategory` enum 멤버(문자열)** 다. spec §4:262 가 이것을 `02-ttl-and-timeouts.md` 에 배치했으므로 **spec 자체가 오분류**했다. 같은 줄의 `VENDOR_TIMEOUTS` 는 3저장소에 **0건**이다. `CORP_FORBIDDEN` 을 역할로 오분류한 전례(마일스톤 2)와 같은 부류이고, 정규식을 소유권 주장으로 쓰면 반드시 재발한다.

    네 번째로, 이 마일스톤에는 마일스톤 1·2 에 없던 **오염원**이 있다. 3저장소 체크아웃에 `.env` 가 **3개 다 실재**하고(`insuniverse-server/.env` · `insuniverse-site/front/.env` · `insuniverse-admin/.env`) 전부 `.gitignore` 대상이다. manifest 의 exclude 2목록 어디에도 `.env` 가 없다. 게이트 축 스캔이 이걸 읽으면 (a) 로컬 개발 시크릿이 커밋되는 인덱스로 새고 (b) 다른 머신엔 없는 파일이 소스가 되어 재현성 지표가 처음부터 거짓이 된다. spec §6-1 은 "insuniverse-server 에 `.env` 가 없다" 를 전제로 `conditional-unknown` 을 확정했는데 그 전제는 낡았다 , **결론(`conditional-unknown`)은 그대로 유지하되 이유가 바뀐다**: 없어서가 아니라, 있는 것이 운영값이 아니고 재현 가능하지도 않아서다.
- codes/*.yaml **6분할** + 서브레벨 전수 · 74일 전 (insuniverse-docs-11-index-code-m1.plan.md)
  - 요약:
    마일스톤 0 은 스크래치 39항목을 **손으로** 승격했다. 마일스톤 1 은 같은 방식으로 못 간다 , 아래 실측표만으로도 `screen` 282 · `domain_status` 73 · `vendor(CF-)` 29 이고, `error` 는 저장소별 67/22/13 이다. 항목은 코드값이 아니라 **심볼** 단위라 그보다 많다(`E0202` 하나가 4심볼). 손으로 적으면 재현성 지표(추출 2회 `diff` 빈 출력)가 처음부터 성립하지 않는다.

    그래서 이 마일스톤의 본체는 YAML 을 손으로 쓰는 것이 아니라 **생성기 1개를 만드는 것**이다. 기존 추출기 2종(`extract-menu-codes.mjs` · `extract-screen-codes.mjs`)을 소비하고, 심볼 스캐너·참조 계수기·큐레이션 병합을 한 파일에 넣어 6개 YAML 을 결정적으로 쓴다. 마일스톤 0 이 손으로 확정한 필드(`message` 판단 · `note` · `promoted_from` · `evidence_grade`)는 id 기준으로 보존한다 , 재생성이 승격 이력을 지우면 안 된다.

    검증기 `verify-code-index.mjs` 는 이미 스키마·배타성·앵커·재현성을 판정하지만 **`cross_source` 는 판정하지 않는다.** PRD Success Metric 이 "`cross_source: true` 누락이 위반"이라고 명시한 축이 지금 무검사다. 이것을 먼저 닫고 생성기를 만든다.
- **계약 요청 제출** · 날짜 미상
- **재분석 · PRD 고도화** · 날짜 미상
- 절 구조 + 절별 작성 규칙 확정 · 날짜 미상 (doc-template-kit.plan.md)
- **`flow-doc@1` 신설** , 절차·권한 매뉴얼 형식 · 날짜 미상 (doc-template-kit-m7.plan.md)
- policy-anchors.yaml (4축 분리) · 날짜 미상 (insuniverse-docs-11-index-code-m2.plan.md)

</details>

---

## 계측

| 지표 | 값 | 상태 | 커버리지 |
|---|---|---|---|
| **B3** · 토글 사용 커버리지 | N/A | 무효 | toggle-usage |
| **A4** · 인계 항목 복원율 | 100% | 산출됨 | state-journal |
| **B1** · 진행 상태 drift | 2건 (대조 21/35) | 산출됨 | milestone-evidence |

<details><summary>추가 지표 7개 보기</summary>

| 지표 | 값 | 상태 | 커버리지 |
|---|---|---|---|
| **C1** · 피드백 폐쇄율 | N/A | 불충분 | findings-registry |
| **A1** · 세션 착수 안정성 | - | 전향만 | session-activity |
| **A2** · 세션 종료 컨텍스트 잔여% | - | 전향만 | session-activity |
| **A3** · 상시 지시문 점유율 | - | 전향만 | instruction-cost |
| **B2** · 증거 덮어쓰기율 | - | 전향만 | session-activity |
| **C2** · 게이트 헛발화율 | - | 전향만 | n/a |
| **C3** · 누출 결함율 | - | 전향만 | n/a |

A1 커버리지: 봉인 후 완주 미기록 0건 · 관측된 산문 누락 없음

A2 상세: 세션 바인딩 표본 0건 · 관측 세션 42개

B1 상세: drift 2건 · 관계 축 종료 판정 (문서 in-progress · 증거 shipped) · `01-removed-features.md` (문서 in-progress · 증거 shipped)

B1 커버리지: 대조 21/35 행 · 증거 미확정 14건 · 비정규 status 0건 (분모 제외) · plan 미연결 5건 · 원시 행 35개 · 아카이브 PRD 제외 9개

C2/C3 귀속: 차단 판정 연결 0건 · 해소 PR 연결 0건 · finding 전수 0건 · 값 미산출 유지 (label-protocol 계약)

</details>

---

## 위험

- 🟠 **HIGH** · 테스트 발송이 실 Google Chat 으로 나간다
  - 관련 결정: `alert-console-redesign`
  - 가능성: High
  - 완화책: 이미 그런 상태다. 화면에 목적지 마스킹과 채널 수를 발송 **전에** 보여 오발송을 줄인다. 규칙별로 좁아지므로 현재보다 발송량은 준다
  - 다음 액션: `/codex:rescue "리스크 완화: 테스트 발송이 실 Google Chat 으로 나간다, 제안 mitigation: 이미 그런 상태다. 화면에 목적지 마스킹과 채널 수를 발송 전에 보여 오발송을 줄인다. 규칙별로 좁아지므로 현재보다 발송량은 준다"`
- 🟠 **HIGH** · admin `npm run lint` 가 사전 파손 상태다
  - 관련 결정: `alert-console-redesign`
  - 가능성: High
  - 완화책: lint 를 게이트에 넣지 않는다. 타입 검사(`tsc --noEmit`)만 건다(검사 `#6`)
  - 다음 액션: `/codex:rescue "리스크 완화: admin npm run lint 가 사전 파손 상태다, 제안 mitigation: lint 를 게이트에 넣지 않는다. 타입 검사(tsc --noEmit)만 건다(검사 #6)"`
- 🟠 **HIGH** · jest 가 Redis 6380 없이 떨어진다
  - 관련 결정: `alert-console-redesign`
  - 가능성: High
  - 완화책: CI 규약이다(`.github/workflows/api.yml`). 검사 `#7` 실행 전 `redis-server --port 6380` 을 띄운다
  - 다음 액션: `/codex:rescue "리스크 완화: jest 가 Redis 6380 없이 떨어진다, 제안 mitigation: CI 규약이다(.github/workflows/api.yml). 검사 #7 실행 전 redis-server --port 6380 을 띄운다"`

<details>
<summary>+23 더보기</summary>

- 🟡 **MEDIUM** · `destinationsFor` 에 빈 finding 을 넘기면 `channelHint` 분기가 예상 밖으로 돈다
  - 관련 결정: `alert-console-redesign`
  - 가능성: Medium
  - 완화책: `channelHint` 를 `undefined` 로 두면 375~388행의 힌트 분기가 통째로 건너뛰어진다. 유닛 테스트로 고정한다(검사 `#7`)
  - 다음 액션: `/codex:rescue "리스크 완화: destinationsFor 에 빈 finding 을 넘기면 channelHint 분기가 예상 밖으로 돈다, 제안 mitigation: channelHint 를 undefined 로 두면 375~388행의 힌트 분기가 통째로 건너뛰어진다. 유닛 테스트로 고정한다(검사 #7)"`
- 🟡 **MEDIUM** · CSS 중복이 나중에 갈린다
  - 관련 결정: `alert-console-redesign`
  - 가능성: Medium
  - 완화책: D1 의 대가로 수용. 토큰 값이 `--tm-*` 와 같은지는 리뷰 몫이며 기계 검사는 없다 `(미검증)`
  - 다음 액션: `/codex:rescue "리스크 완화: CSS 중복이 나중에 갈린다, 제안 mitigation: D1 의 대가로 수용. 토큰 값이 --tm-* 와 같은지는 리뷰 몫이며 기계 검사는 없다 (미검증)"`
- 🟡 **MEDIUM** · `treat-vendor` 가 OFF 라 테스트 화면에서 오해를 부른다
  - 관련 결정: `alert-console-redesign`
  - 가능성: Medium
  - 완화책: D7 대로 `OFF` 배지를 같은 행에 붙인다. 발송 자체는 막지 않는다
  - 다음 액션: `/codex:rescue "리스크 완화: treat-vendor 가 OFF 라 테스트 화면에서 오해를 부른다, 제안 mitigation: D7 대로 OFF 배지를 같은 행에 붙인다. 발송 자체는 막지 않는다"`
- 🟡 **MEDIUM** · 환경 라벨 제거 후 **배포별 fail-closed 경계가 0**이 된다
  - 관련 결정: `alert-console-redesign-r2`
  - 가능성: **상**
  - 완화책: 사용자 결정이며 근거는 채널 URL 분리다(UI15). 다만 `alert_enabled` 는 fail-open 이고 로컬·stg 가 같은 DB·같은 실채널을 본다는 것을 실측으로 확인해 §D9 에 이름으로 적었다(Plan-Codex R1 F1). 완화가 아니라 **기록**이며 대체 경계는 backlog 다 , 잃는 것을 숨기지 않는다
  - 다음 액션: `/codex:rescue "리스크 완화: 환경 라벨 제거 후 배포별 fail-closed 경계가 0이 된다, 제안 mitigation: 사용자 결정이며 근거는 채널 URL 분리다(UI15). 다만 alert_enabled 는 fail-open 이고 로컬·stg 가 같은 DB·같은 실채널을 본다는 것을 실측으로 확인해 §D9 에 이름으로 적었다(Plan-Codex R1 F1). 완화가 아니라 기록이며 대체 경계는 backlog 다 , 잃는 것을 숨기지 않는다"`
- 🟡 **MEDIUM** · 테스트 문면이 실제 문면이라 수신자가 진짜 장애로 읽는다
  - 관련 결정: `alert-console-redesign-r2`
  - 가능성: 중
  - 완화책: 배너를 본문 **첫 줄**에 두고 구분선을 넣는다(§D6). 실발송 1건으로 실제 채널에서 육안 확인한다(Task 14)
  - 다음 액션: `/codex:rescue "리스크 완화: 테스트 문면이 실제 문면이라 수신자가 진짜 장애로 읽는다, 제안 mitigation: 배너를 본문 첫 줄에 두고 구분선을 넣는다(§D6). 실발송 1건으로 실제 채널에서 육안 확인한다(Task 14)"`
- 🟡 **MEDIUM** · 합성 menuItem 이 다른 경로의 브레드크럼을 흔든다
  - 관련 결정: `alert-console-redesign-r2`
  - 가능성: 낮
  - 완화책: 분기가 `/site/alert` 접두에서만 걸린다. `/corp/my-page` 선례와 같은 형태이고 게이트 `#1` 이 숨김 경로 유지를 함께 본다
  - 다음 액션: `/codex:rescue "리스크 완화: 합성 menuItem 이 다른 경로의 브레드크럼을 흔든다, 제안 mitigation: 분기가 /site/alert 접두에서만 걸린다. /corp/my-page 선례와 같은 형태이고 게이트 #1 이 숨김 경로 유지를 함께 본다"`
- 🟡 **MEDIUM** · ms↔초 · 0~1↔% 왕복에서 값이 흔들린다
  - 관련 결정: `alert-console-redesign-r2`
  - 가능성: 중
  - 완화책: 변환을 `alertUnits.ts` 한 곳에 가두고 `min`/`max` 도 같은 변환을 태운다. 항등은 렌더 실측이 관측한다(게이트 `#16`) , admin 에 러너가 없어 단위 테스트로 못 잡는다
  - 다음 액션: `/codex:rescue "리스크 완화: ms↔초 · 0~1↔% 왕복에서 값이 흔들린다, 제안 mitigation: 변환을 alertUnits.ts 한 곳에 가두고 min/max 도 같은 변환을 태운다. 항등은 렌더 실측이 관측한다(게이트 #16) , admin 에 러너가 없어 단위 테스트로 못 잡는다"`
- 🟡 **MEDIUM** · 환경 라벨 제거가 spec 4파일을 깨서 회귀가 섞인다
  - 관련 결정: `alert-console-redesign-r2`
  - 가능성: 상
  - 완화책: 기준선을 먼저 고정했다(suites=17 tests=338 passed=338). 게이트 `#11` 이 pending·todo 0 까지 요구해 "지워서 통과" 를 막는다
  - 다음 액션: `/codex:rescue "리스크 완화: 환경 라벨 제거가 spec 4파일을 깨서 회귀가 섞인다, 제안 mitigation: 기준선을 먼저 고정했다(suites=17 tests=338 passed=338). 게이트 #11 이 pending·todo 0 까지 요구해 \"지워서 통과\" 를 막는다"`
- 🟡 **MEDIUM** · KV 편집기가 빈 키·중복 키를 직렬화해 값을 덮어쓴다
  - 관련 결정: `alert-console-redesign-r2`
  - 가능성: 중
  - 완화책: 화면에서 저장 전에 막는다(§D11). 서버 계약(원문 JSON 문자열)은 안 바꾸므로 서버 검증이 최종 방어로 남는다
  - 다음 액션: `/codex:rescue "리스크 완화: KV 편집기가 빈 키·중복 키를 직렬화해 값을 덮어쓴다, 제안 mitigation: 화면에서 저장 전에 막는다(§D11). 서버 계약(원문 JSON 문자열)은 안 바꾸므로 서버 검증이 최종 방어로 남는다"`
- 🟡 **MEDIUM** · `Collapsed` 재작성이 다섯 표의 렌더를 바꾼다
  - 관련 결정: `alert-console-redesign-r2`
  - 가능성: 중
  - 완화책: 다섯 표가 같은 컴포넌트를 지나므로 회귀 반경이 한 곳이다. 열 폭 일치를 확장 후 실측한다(`OBS-expand-cols`)
  - 다음 액션: `/codex:rescue "리스크 완화: Collapsed 재작성이 다섯 표의 렌더를 바꾼다, 제안 mitigation: 다섯 표가 같은 컴포넌트를 지나므로 회귀 반경이 한 곳이다. 열 폭 일치를 확장 후 실측한다(OBS-expand-cols)"`
- 🟡 **MEDIUM** · 게이트 `#7` 의 표제 문자열 검사가 문구를 조금만 바꿔도 통과한다
  - 관련 결정: `alert-console-redesign-r2`
  - 가능성: 중
  - 완화책: 알려진 한계다 , 표제와 대체 문구를 짝으로 보지만 본문 문구까지는 못 본다. 문구 축의 최종 판정은 렌더 실측과 리뷰가 진다
  - 다음 액션: `/codex:rescue "리스크 완화: 게이트 #7 의 표제 문자열 검사가 문구를 조금만 바꿔도 통과한다, 제안 mitigation: 알려진 한계다 , 표제와 대체 문구를 짝으로 보지만 본문 문구까지는 못 본다. 문구 축의 최종 판정은 렌더 실측과 리뷰가 진다"`
- 🟡 **MEDIUM** · `positionStrategy="fixed"` 가 실제 팝오버에는 안 먹는다 (프로브는 raw div 였다)
  - 관련 결정: `alert-console-redesign-r3`
  - 가능성: 중
  - 완화책: Task 6 이 실제 팝오버로 같은 자리를 다시 잰다. 안 먹으면 `.al-table-wrap` 을 `overflow:visible` 로 되돌리는 것이 대안인데 그건 표 가로 스크롤을 깬다 , 그때는 사용자에게 되돌아간다
  - 다음 액션: `/codex:rescue "리스크 완화: positionStrategy=\"fixed\" 가 실제 팝오버에는 안 먹는다 (프로브는 raw div 였다), 제안 mitigation: Task 6 이 실제 팝오버로 같은 자리를 다시 잰다. 안 먹으면 .al-table-wrap 을 overflow:visible 로 되돌리는 것이 대안인데 그건 표 가로 스크롤을 깬다 , 그때는 사용자에게 되돌아간다"`
- 🟡 **MEDIUM** · `react-tooltip` 기본 스타일이 `.al-tip-pop` 을 특이도로 이긴다
  - 관련 결정: `alert-console-redesign-r3`
  - 가능성: 중
  - 완화책: 라이브러리가 노출한 `--rt-color-dark`·`--rt-opacity` 를 쓴다(값 덮어쓰기가 아니라 라이브러리의 손잡이). 남으면 Task 6 관측에서 색으로 드러난다
  - 다음 액션: `/codex:rescue "리스크 완화: react-tooltip 기본 스타일이 .al-tip-pop 을 특이도로 이긴다, 제안 mitigation: 라이브러리가 노출한 --rt-color-dark·--rt-opacity 를 쓴다(값 덮어쓰기가 아니라 라이브러리의 손잡이). 남으면 Task 6 관측에서 색으로 드러난다"`
- 🟡 **MEDIUM** · 공유 호스트 `render` 가 `activeAnchor` 키를 못 찾아 빈 팝오버가 뜬다
  - 관련 결정: `alert-console-redesign-r3`
  - 가능성: 중
  - 완화책: 등록이 `useEffect` 라 첫 페인트와 한 틱 어긋난다. 툴팁은 클릭으로 열리므로 마운트 이펙트 뒤이지만, Task 6 (d) 가 실제로 열어 본문 유무를 확인한다. 비면 등록을 렌더 시점으로 올린다
  - 다음 액션: `/codex:rescue "리스크 완화: 공유 호스트 render 가 activeAnchor 키를 못 찾아 빈 팝오버가 뜬다, 제안 mitigation: 등록이 useEffect 라 첫 페인트와 한 틱 어긋난다. 툴팁은 클릭으로 열리므로 마운트 이펙트 뒤이지만, Task 6 (d) 가 실제로 열어 본문 유무를 확인한다. 비면 등록을 렌더 시점으로 올린다"`
- 🟡 **MEDIUM** · 비활성 탭이 `--al-ink` 라 활성/비활성이 덜 갈린다
  - 관련 결정: `alert-console-redesign-r3`
  - 가능성: 하
  - 완화책: 구분은 색값이 아니라 채움이 진다(D2). Task 6 관측 스크린샷으로 사람이 판정한다
  - 다음 액션: `/codex:rescue "리스크 완화: 비활성 탭이 --al-ink 라 활성/비활성이 덜 갈린다, 제안 mitigation: 구분은 색값이 아니라 채움이 진다(D2). Task 6 관측 스크린샷으로 사람이 판정한다"`
- 🟡 **MEDIUM** · `--al-sub` 를 쓰는 다른 자리(마커·라벨)도 3:1 대인데 이번에 안 건드린다
  - 관련 결정: `alert-console-redesign-r3`
  - 가능성: 중
  - 완화책: 의도된 범위 밖이다 , NOT Building 에 적고 backlog 로 넘긴다. 탭만 고치는 이유는 사용자가 지적한 자리가 탭이기 때문이다
  - 다음 액션: `/codex:rescue "리스크 완화: --al-sub 를 쓰는 다른 자리(마커·라벨)도 3:1 대인데 이번에 안 건드린다, 제안 mitigation: 의도된 범위 밖이다 , NOT Building 에 적고 backlog 로 넘긴다. 탭만 고치는 이유는 사용자가 지적한 자리가 탭이기 때문이다"`
- 🟡 **MEDIUM** · **이 계층이 mccp 개선의 대체재가 되어 상류가 안 고쳐진다**
  - 관련 결정: `review-round-remediation`
  - 가능성: 높음
  - 완화책: B4 철거 조건을 3곳에 박고 `#7` 로 검사. B5 , 로컬 실측을 상류 이슈에 환류
  - 다음 액션: `/codex:rescue "리스크 완화: 이 계층이 mccp 개선의 대체재가 되어 상류가 안 고쳐진다, 제안 mitigation: B4 철거 조건을 3곳에 박고 #7 로 검사. B5 , 로컬 실측을 상류 이슈에 환류"`
- 🟡 **MEDIUM** · mccp loop review 가 "표준 이탈" 을 blocker 로 올려 계층이 해체된다
  - 관련 결정: `review-round-remediation`
  - 가능성: 높음
  - 완화책: §0 리뷰 수용 규약. 전제 부정형 지적은 `out_of_scope_observations` 로 분리
  - 다음 액션: `/codex:rescue "리스크 완화: mccp loop review 가 \"표준 이탈\" 을 blocker 로 올려 계층이 해체된다, 제안 mitigation: §0 리뷰 수용 규약. 전제 부정형 지적은 out_of_scope_observations 로 분리"`
- 🟡 **MEDIUM** · 규칙이 형식만 봐서 "명령 ≠ 게이트"(층 3)를 못 잡는다
  - 관련 결정: `review-round-remediation`
  - 가능성: 확실
  - 완화책: `# 기대:` 로 **저자에게 기록을 강제**할 뿐이라고 README 한계 절에 명시. 판별은 리뷰 몫
  - 다음 액션: `/codex:rescue "리스크 완화: 규칙이 형식만 봐서 \"명령 ≠ 게이트\"(층 3)를 못 잡는다, 제안 mitigation: # 기대: 로 저자에게 기록을 강제할 뿐이라고 README 한계 절에 명시. 판별은 리뷰 몫"`
- 🟡 **MEDIUM** · `PL10` 완전성 어휘 오탐이 잦아 규칙 전체를 무시하게 된다
  - 관련 결정: `review-round-remediation`
  - 가능성: 높음
  - 완화책: 경고 등급 고정(stderr, exit 미반영). 강등 경로를 README 에
  - 다음 액션: `/codex:rescue "리스크 완화: PL10 완전성 어휘 오탐이 잦아 규칙 전체를 무시하게 된다, 제안 mitigation: 경고 등급 고정(stderr, exit 미반영). 강등 경로를 README 에"`
- 🟡 **MEDIUM** · 마커 규약이 기존 계획서와 불일치
  - 관련 결정: `review-round-remediation`
  - 가능성: 확실
  - 완화책: A1 과 동일하게 **미소급**. 기존 계획서는 기준선 측정 대상일 뿐
  - 다음 액션: `/codex:rescue "리스크 완화: 마커 규약이 기존 계획서와 불일치, 제안 mitigation: A1 과 동일하게 미소급. 기존 계획서는 기준선 측정 대상일 뿐"`
- 🟡 **MEDIUM** · 소급 적용으로 `plan_hash` stale
  - 관련 결정: `review-round-remediation`
  - 가능성: 중간
  - 완화책: 이 계획은 허용 4경로만 건드리고 기존 `.plan.md` 는 읽기만 한다. `#5` 가 기계로 잡는다
  - 다음 액션: `/codex:rescue "리스크 완화: 소급 적용으로 plan_hash stale, 제안 mitigation: 이 계획은 허용 4경로만 건드리고 기존 .plan.md 는 읽기만 한다. #5 가 기계로 잡는다"`
- 🟡 **MEDIUM** · 규칙 10개가 저작 부담이 되어 라운드보다 비싸진다
  - 관련 결정: `review-round-remediation`
  - 가능성: 중간
  - 완화책: 전부 행 존재/부재 급. 기준선 측정으로 다음 마일스톤에서 비용 대 효과를 잰다
  - 다음 액션: `/codex:rescue "리스크 완화: 규칙 10개가 저작 부담이 되어 라운드보다 비싸진다, 제안 mitigation: 전부 행 존재/부재 급. 기준선 측정으로 다음 마일스톤에서 비용 대 효과를 잰다"`

</details>

<details>
<summary>보관됨 329건</summary>

- 🟡 **MEDIUM** · glossary 를 `policy-doc@1` 에 억지로 얹어 절 구성이 뒤틀린다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m1`
  - 가능성: 낮음
  - 완화책: 착수 전 프로토타입으로 실측 통과 확인 완료(스크래치 트리, `--strict-refs` 위반 0). 그 관측은 가능성만 말하며 판정은 검사 `#1` 이 산출물에 대해 한다
  - 다음 액션: `/codex:rescue "리스크 완화: glossary 를 policy-doc@1 에 억지로 얹어 절 구성이 뒤틀린다, 제안 mitigation: 착수 전 프로토타입으로 실측 통과 확인 완료(스크래치 트리, --strict-refs 위반 0). 그 관측은 가능성만 말하며 판정은 검사 #1 이 산출물에 대해 한다"`
- 🟡 **MEDIUM** · `actors` 정정값이 자기 산출물에서만 유도돼 순환이 된다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m1`
  - 가능성: 중
  - 완화책: 검사 `#3` 이 config 와 glossary 를 두 산출물로 대조하고, 더해 A축 각 행의 용어가 강제 지점 블록에서 앵커를 갖는지 본다. 그 앵커의 실재는 검사 `#2` 가 동결 SHA 에서 확인한다 , 순환을 끊는 것은 코드다. 남은 한계: 앵커가 그 용어를 정말 뒷받침하는지는 기계가 못 본다
  - 다음 액션: `/codex:rescue "리스크 완화: actors 정정값이 자기 산출물에서만 유도돼 순환이 된다, 제안 mitigation: 검사 #3 이 config 와 glossary 를 두 산출물로 대조하고, 더해 A축 각 행의 용어가 강제 지점 블록에서 앵커를 갖는지 본다. 그 앵커의 실재는 검사 #2 가 동결 SHA 에서 확인한다 , 순환을 끊는 것은 코드다. 남은 한계: 앵커가 그 용어를 정말 뒷받침하는지는 기계가 못 본다"`
- 🟡 **MEDIUM** · `verify.sh --update` 가 기대 밖 golden 키를 움직인다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m1`
  - 가능성: 중
  - 완화책: 검사 `#8` 이 HEAD 대비 변경 키 집합을 기대 집합과 정확 일치로 대조한다. HEAD golden 이 최신이라는 것은 착수 전 `check PASS` 실측이 근거다
  - 다음 액션: `/codex:rescue "리스크 완화: verify.sh --update 가 기대 밖 golden 키를 움직인다, 제안 mitigation: 검사 #8 이 HEAD 대비 변경 키 집합을 기대 집합과 정확 일치로 대조한다. HEAD golden 이 최신이라는 것은 착수 전 check PASS 실측이 근거다"`
- 🟡 **MEDIUM** · 개정 위임 3 행이 소유 표 해시를 건드린다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m1`
  - 가능성: 낮음
  - 완화책: 검사 `#14` 가 golden ownership 접두 8 키를 HEAD 값과 대조한다. `verify.sh` 1207~1225 행 실측: 그 8 키는 §PRD별 배타 소유 경로 · §승계 시 추가 · §공유 자산 · §승격 대상 목록 네 절에서만 나오고 §개정 위임 은 해시 대상이 아니다
  - 다음 액션: `/codex:rescue "리스크 완화: 개정 위임 3 행이 소유 표 해시를 건드린다, 제안 mitigation: 검사 #14 가 golden ownership 접두 8 키를 HEAD 값과 대조한다. verify.sh 1207~1225 행 실측: 그 8 키는 §PRD별 배타 소유 경로 · §승계 시 추가 · §공유 자산 · §승격 대상 목록 네 절에서만 나오고 §개정 위임 은 해시 대상이 아니다"`
- 🟡 **MEDIUM** · 위임 등재 전에 위임받은 경로를 쓴다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m1`
  - 가능성: 중
  - 완화책: Task 4·5·7 의 Validate 가 자기 검사 앞에 `check6` 을 돌린다 , 위임 행이 없으면 그 Task 가 자기 검증 시점에 떨어지고 완료로 선언되지 못한다. 잔존 한계: 종료 상태 검사라 쓰기 자체를 막지는 못하고 인증을 거부할 뿐이며, 노출 창은 그 Task 하나의 편집 구간이다. 창 0 은 쓰기 전 훅이 필요하고 §NOT Building 이다
  - 다음 액션: `/codex:rescue "리스크 완화: 위임 등재 전에 위임받은 경로를 쓴다, 제안 mitigation: Task 4·5·7 의 Validate 가 자기 검사 앞에 check6 을 돌린다 , 위임 행이 없으면 그 Task 가 자기 검증 시점에 떨어지고 완료로 선언되지 못한다. 잔존 한계: 종료 상태 검사라 쓰기 자체를 막지는 못하고 인증을 거부할 뿐이며, 노출 창은 그 Task 하나의 편집 구간이다. 창 0 은 쓰기 전 훅이 필요하고 §NOT Building…"`
- 🟡 **MEDIUM** · 이미 `13` 앞으로 완료된 위임 경로에 `20` 위임을 겹쳐 연다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m1`
  - 가능성: 중
  - 완화책: Task 3 이 두 위임의 관계(완료↔열림 · `verify/**` ⊃ `verify/golden.txt`)를 행과 재검토 문단에 명시하고, 그 절이 정한 "위임 PRD 둘 이상이면 재검토" 조건을 실제로 발화시킨다. 검사 `#6` 은 행 수와 PRD 문면 수만 보고 관계 서술의 타당성은 못 본다 , §Acceptance 에 `(미검증)` 으로 남긴다
  - 다음 액션: `/codex:rescue "리스크 완화: 이미 13 앞으로 완료된 위임 경로에 20 위임을 겹쳐 연다, 제안 mitigation: Task 3 이 두 위임의 관계(완료↔열림 · verify/** ⊃ verify/golden.txt)를 행과 재검토 문단에 명시하고, 그 절이 정한 \"위임 PRD 둘 이상이면 재검토\" 조건을 실제로 발화시킨다. 검사 #6 은 행 수와 PRD 문면 수만 보고 관계 서술의 타당성은 못 본다 , §Acceptance 에 (미검증) 으로 남긴다"`
- 🟡 **MEDIUM** · 상태 행 이탈이 다른 워크트리의 `--bootstrap` 을 함께 만료시킨다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m1`
  - 가능성: **확정**
  - 완화책: 의도된 전이다(PRD §Risks). 만료 시점에 lint 대상이 실제로 1 건 생기는 것이 유일한 정상 경로이며 검사 `#11`·`#12` 가 그 두 사실을 한 쌍으로 본다
  - 다음 액션: `/codex:rescue "리스크 완화: 상태 행 이탈이 다른 워크트리의 --bootstrap 을 함께 만료시킨다, 제안 mitigation: 의도된 전이다(PRD §Risks). 만료 시점에 lint 대상이 실제로 1 건 생기는 것이 유일한 정상 경로이며 검사 #11·#12 가 그 두 사실을 한 쌍으로 본다"`
- 🟡 **MEDIUM** · 용어 요청 판정이 형제 PRD 의 소유 파일을 쓴다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m1`
  - 가능성: 중
  - 완화책: `12-index-runtime` 은 archived 이므로 우산 §핵심 제약 6 의 archived 예외가 성립한다. Task 3 이 위임 행을 먼저 등재한다
  - 다음 액션: `/codex:rescue "리스크 완화: 용어 요청 판정이 형제 PRD 의 소유 파일을 쓴다, 제안 mitigation: 12-index-runtime 은 archived 이므로 우산 §핵심 제약 6 의 archived 예외가 성립한다. Task 3 이 위임 행을 먼저 등재한다"`
- 🟡 **MEDIUM** · 하네스가 자기를 검증하는 순환
  - 관련 결정: `insuniverse-docs-20-foundation-access-m1`
  - 가능성: 중
  - 완화책: `selftest` 를 양성·음성 이중 대조로 만들어 "항상 통과" 와 "항상 실패" 를 둘 다 잡고, 검사 `#10` 이 서브커맨드 열거를 계획서와 대조한다. 남은 한계: 두 대조가 같은 코드 경로를 쓰므로 그 경로 전체가 위조되면 못 잡는다 , 리뷰 몫이다
  - 다음 액션: `/codex:rescue "리스크 완화: 하네스가 자기를 검증하는 순환, 제안 mitigation: selftest 를 양성·음성 이중 대조로 만들어 \"항상 통과\" 와 \"항상 실패\" 를 둘 다 잡고, 검사 #10 이 서브커맨드 열거를 계획서와 대조한다. 남은 한계: 두 대조가 같은 코드 경로를 쓰므로 그 경로 전체가 위조되면 못 잡는다 , 리뷰 몫이다"`
- 🟡 **MEDIUM** · 검사 `#4` 가 단일 산출물 자기 형태 검사라 값의 정당성을 못 본다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m1`
  - 가능성: **확정**
  - 완화책: 명시적 한계다. GA 가 정말 저장소 근거 없는 유일 용어인지는 리뷰 몫이며 §Acceptance 에 `(미검증)` 으로 남긴다
  - 다음 액션: `/codex:rescue "리스크 완화: 검사 #4 가 단일 산출물 자기 형태 검사라 값의 정당성을 못 본다, 제안 mitigation: 명시적 한계다. GA 가 정말 저장소 근거 없는 유일 용어인지는 리뷰 몫이며 §Acceptance 에 (미검증) 으로 남긴다"`
- 🟡 **MEDIUM** · 검사 `#6` 이 수만 대조하고 위임 사유·관계 서술의 타당성은 못 본다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m1`
  - 가능성: **확정**
  - 완화책: `#6` 은 PRD 문면 수 ↔ ownership 행 수의 두 산출물 대조까지가 사정거리다. 사유가 타당한지, 완료↔열림 관계 서술이 옳은지는 기계가 못 본다 , 리뷰 몫이며 §Acceptance 에 `(미검증)` 으로 남긴다
  - 다음 액션: `/codex:rescue "리스크 완화: 검사 #6 이 수만 대조하고 위임 사유·관계 서술의 타당성은 못 본다, 제안 mitigation: #6 은 PRD 문면 수 ↔ ownership 행 수의 두 산출물 대조까지가 사정거리다. 사유가 타당한지, 완료↔열림 관계 서술이 옳은지는 기계가 못 본다 , 리뷰 몫이며 §Acceptance 에 (미검증) 으로 남긴다"`
- 🟡 **MEDIUM** · 인덱스에서 앵커를 그대로 옮겨 와 동결 기준선에서 깨진다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m2`
  - 가능성: **높음**
  - 완화책: 실측: `consumed_by` 4,655 중 736 이 manifest head 에서 해석되지 않는다(2026-08-25). 두 문서는 `defined_in` 축만 참고하고 앵커는 소스에서 다시 유도하며, 검사 `#3` 이 파일·행·**그 행의 심볼 포함**까지 본다. 남은 한계: 앵커가 그 정책을 실제로 뒷받침하는지는 기계가 못 본다
  - 다음 액션: `/codex:rescue "리스크 완화: 인덱스에서 앵커를 그대로 옮겨 와 동결 기준선에서 깨진다, 제안 mitigation: 실측: consumed_by 4,655 중 736 이 manifest head 에서 해석되지 않는다(2026-08-25). 두 문서는 defined_in 축만 참고하고 앵커는 소스에서 다시 유도하며, 검사 #3 이 파일·행·그 행의 심볼 포함까지 본다. 남은 한계: 앵커가 그 정책을 실제로 뒷받침하는지는 기계가 못 본다"`
- 🟡 **MEDIUM** · 자체 grep 으로 센 수를 문서에 써 우산 제약 #5 를 깬다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m2`
  - 가능성: 중
  - 완화책: 검사 `#5` 가 문서 수치 리터럴을 manifest 대응 키와 값으로 대조한다. manifest 에 대응 키가 없는 축은 문서가 수를 적지 않는 쪽으로 설계했다(Task 2·3 Action). 남은 한계: 문서가 수를 산문에 풀어 쓰면(`예순일곱 가지`) 리터럴 대조를 빠져나간다 , 리뷰 몫
  - 다음 액션: `/codex:rescue "리스크 완화: 자체 grep 으로 센 수를 문서에 써 우산 제약 #5 를 깬다, 제안 mitigation: 검사 #5 가 문서 수치 리터럴을 manifest 대응 키와 값으로 대조한다. manifest 에 대응 키가 없는 축은 문서가 수를 적지 않는 쪽으로 설계했다(Task 2·3 Action). 남은 한계: 문서가 수를 산문에 풀어 쓰면(예순일곱 가지) 리터럴 대조를 빠져나간다 , 리뷰 몫"`
- 🟡 **MEDIUM** · `03-error-codes.md` 가 블록 규칙을 legend 주석 하나로 선언해 근거 단독이 된다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m2`
  - 가능성: 중
  - 완화책: 근거 등급을 `[S-constant, A-comment]` 로 고정해 주석 단독을 구조적으로 막고, 검사 `#6` 이 legend 와 **인라인 마커** 두 계열을 각각 재유도해 표와 대조한다. 두 계열이 어긋나는 자리가 문서의 핵심 정보다
  - 다음 액션: `/codex:rescue "리스크 완화: 03-error-codes.md 가 블록 규칙을 legend 주석 하나로 선언해 근거 단독이 된다, 제안 mitigation: 근거 등급을 [S-constant, A-comment] 로 고정해 주석 단독을 구조적으로 막고, 검사 #6 이 legend 와 인라인 마커 두 계열을 각각 재유도해 표와 대조한다. 두 계열이 어긋나는 자리가 문서의 핵심 정보다"`
- 🟡 **MEDIUM** · `data-dependent-unknown` 정책을 본문에 두어 `placement` 가 붉어진다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m2`
  - 가능성: 중
  - 완화책: Task 2 가 `MENU_CODE_DB_ENUMERATION` 하나만 `## 부록` 으로 못박고 나머지 넷을 본문에 둔다. 규칙은 양방향이라 반대 실수도 잡힌다. 검사 `#2` 가 lint 두 모드를 실제 파일에 돌린다
  - 다음 액션: `/codex:rescue "리스크 완화: data-dependent-unknown 정책을 본문에 두어 placement 가 붉어진다, 제안 mitigation: Task 2 가 MENU_CODE_DB_ENUMERATION 하나만 ## 부록 으로 못박고 나머지 넷을 본문에 둔다. 규칙은 양방향이라 반대 실수도 잡힌다. 검사 #2 가 lint 두 모드를 실제 파일에 돌린다"`
- 🟡 **MEDIUM** · findings 파일 신설이 기대 밖 golden 키를 움직인다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m2`
  - 가능성: 중
  - 완화책: 검사 `#15` 가 기준선 blob 대비 필수 2키의 이동을 요구하고 허용 4키 밖을 0개로 본다. 두 키가 findings 파일 목록·파일별 표제 수에서 나온다는 것은 `verify.sh` 1231·1195 행 실측이다
  - 다음 액션: `/codex:rescue "리스크 완화: findings 파일 신설이 기대 밖 golden 키를 움직인다, 제안 mitigation: 검사 #15 가 기준선 blob 대비 필수 2키의 이동을 요구하고 허용 4키 밖을 0개로 본다. 두 키가 findings 파일 목록·파일별 표제 수에서 나온다는 것은 verify.sh 1231·1195 행 실측이다"`
- 🟡 **MEDIUM** · 리뷰 라운드가 backlog 에 행을 붙여 `fixtask.cohort_*` 가 함께 움직인다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m2`
  - 가능성: **높음**
  - 완화책: `verify.sh` 1170 행이 코호트 분모를 `.claude/plans/codex-findings-backlog.md` 에서 읽는다 , 그 파일은 implement 라운드가 쓰는 원장이라 이 마일스톤이 막을 수 없다. 검사 `#15` 가 그 2키를 **허용하되 계수를 출력에 드러내** 묵인과 구별한다. 남은 한계: 허용된 이동이 정당한 backlog 추가에서 왔는지는 기계가 못 본다 , §Acceptance `(미검증)`
  - 다음 액션: `/codex:rescue "리스크 완화: 리뷰 라운드가 backlog 에 행을 붙여 fixtask.cohort_* 가 함께 움직인다, 제안 mitigation: verify.sh 1170 행이 코호트 분모를 .claude/plans/codex-findings-backlog.md 에서 읽는다 , 그 파일은 implement 라운드가 쓰는 원장이라 이 마일스톤이 막을 수 없다. 검사 #15 가 그 2키를 허용하되 계수를 출력에 드러내 묵인과 구별한다. 남은 한계: 허용된 이동이 정당한 backlog 추가에서 왔는지는…"`
- 🟡 **MEDIUM** · findings 6항목 형식을 못 맞춰 저장소 게이트가 막힌다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m2`
  - 가능성: 중
  - 완화책: 이 파일은 `FINDINGS_FORMAT_DEFERRED`(`10-index-git` · `11-index-code` · `12-index-runtime`) 밖이라 전면 강제 대상이다. 검사 `#9` 가 항목 순서와 각 표제 아래 내용 유무를 보고, 그것이 `#16` 저장소 게이트보다 먼저 돈다
  - 다음 액션: `/codex:rescue "리스크 완화: findings 6항목 형식을 못 맞춰 저장소 게이트가 막힌다, 제안 mitigation: 이 파일은 FINDINGS_FORMAT_DEFERRED(10-index-git · 11-index-code · 12-index-runtime) 밖이라 전면 강제 대상이다. 검사 #9 가 항목 순서와 각 표제 아래 내용 유무를 보고, 그것이 #16 저장소 게이트보다 먼저 돈다"`
- 🟡 **MEDIUM** · 가독성용 `---` 구분자가 열거 필드를 깬다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m2`
  - 가능성: 중
  - 완화책: 실측 선례가 있다 , `60-history-deprecated` M2 가 발견 사이에 `---` 를 넣어 `상태` 비공백 행이 2개가 됐고 `--update` 가 rc 1 로 떨어졌다. 이 마일스톤은 발견이 1건이라 구분자를 쓸 자리 자체가 없고, Task 4 Action 이 그것을 명문으로 금지한다. 검사 `#9` 가 각 표제 아래 내용을 보므로 재발하면 `#16` 보다 먼저 걸린다
  - 다음 액션: `/codex:rescue "리스크 완화: 가독성용 --- 구분자가 열거 필드를 깬다, 제안 mitigation: 실측 선례가 있다 , 60-history-deprecated M2 가 발견 사이에 --- 를 넣어 상태 비공백 행이 2개가 됐고 --update 가 rc 1 로 떨어졌다. 이 마일스톤은 발견이 1건이라 구분자를 쓸 자리 자체가 없고, Task 4 Action 이 그것을 명문으로 금지한다. 검사 #9 가 각 표제 아래 내용을 보므로 재발하면 #16 보다 먼…"`
- 🟡 **MEDIUM** · `--update` 가 실패했는데 golden 무변동으로 읽힌다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m2`
  - 가능성: 중
  - 완화책: `--update` 는 전 검증 통과 시에만 golden 을 쓰므로 실패하면 파일이 그대로다. 검사 `#15` 는 변경 키 집합을 `{findings.files, fixtask.findings_headings}` 와 **정확 일치**로 보므로 무변동(∅)도 불일치로 떨어진다. 다만 진단문이 "기대 밖 키" 가 아니라 "기대 키 부재" 로 나오므로 Task 7 은 `--update` 의 rc 를 출력 문면에서 함께 읽는다
  - 다음 액션: `/codex:rescue "리스크 완화: --update 가 실패했는데 golden 무변동으로 읽힌다, 제안 mitigation: --update 는 전 검증 통과 시에만 golden 을 쓰므로 실패하면 파일이 그대로다. 검사 #15 는 변경 키 집합을 {findings.files, fixtask.findings_headings} 와 정확 일치로 보므로 무변동(∅)도 불일치로 떨어진다. 다만 진단문이 \"기대 밖 키\" 가 아니라 \"기대 키 부재\" 로 나오므로 Task 7 은 --upd…"`
- 🟡 **MEDIUM** · 발견 기록에 원인 귀속·수정 제안이 섞인다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m2`
  - 가능성: 중
  - 완화책: `findings/README.md` §적지 않는 것이 명문으로 금지한다. Task 4 Action 이 쓰지 않을 것을 열거한다. **기계 검사 없음** , 검사 `#9`·`#10` 은 형식과 계수만 본다. §Acceptance 에 `(미검증)` 으로 남긴다
  - 다음 액션: `/codex:rescue "리스크 완화: 발견 기록에 원인 귀속·수정 제안이 섞인다, 제안 mitigation: findings/README.md §적지 않는 것이 명문으로 금지한다. Task 4 Action 이 쓰지 않을 것을 열거한다. 기계 검사 없음 , 검사 #9·#10 은 형식과 계수만 본다. §Acceptance 에 (미검증) 으로 남긴다"`
- 🟡 **MEDIUM** · 위임 사유 갱신이 워킹트리 자기 대조로 무력화된다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m2`
  - 가능성: 중
  - 완화책: 검사 `#11`·`#12` 가 기준선 커밋 `323dcfc` 의 blob 을 원본으로 읽는다. 같은 창에서 표와 근거를 함께 넓히는 자기승인이 그래서 걸린다
  - 다음 액션: `/codex:rescue "리스크 완화: 위임 사유 갱신이 워킹트리 자기 대조로 무력화된다, 제안 mitigation: 검사 #11·#12 가 기준선 커밋 323dcfc 의 blob 을 원본으로 읽는다. 같은 창에서 표와 근거를 함께 넓히는 자기승인이 그래서 걸린다"`
- 🟡 **MEDIUM** · 기준선 커밋 리터럴이 main 병합으로 깨진다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m2`
  - 가능성: 중
  - 완화책: 마일스톤 1 에서 실제로 발생했다(`5f72874` 가 `check8` 기준선을 재지정). 병합이 들어오면 `#11`·`#12`·`#15` 의 기준선을 병합해 들인 main 팁으로 다시 지정하고 그 사실을 계획서에 적는다. 자동 추적 장치는 두지 않는다
  - 다음 액션: `/codex:rescue "리스크 완화: 기준선 커밋 리터럴이 main 병합으로 깨진다, 제안 mitigation: 마일스톤 1 에서 실제로 발생했다(5f72874 가 check8 기준선을 재지정). 병합이 들어오면 #11·#12·#15 의 기준선을 병합해 들인 main 팁으로 다시 지정하고 그 사실을 계획서에 적는다. 자동 추적 장치는 두지 않는다"`
- 🟡 **MEDIUM** · 상태 행 전이가 마일스톤 1 행을 되돌린다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m2`
  - 가능성: 중
  - 완화책: 검사 `#13` 이 상태 행 값과 마일스톤 표 **2행** Status 를 결박하면서 1행이 `complete` 인지 함께 본다. 마일스톤 1 의 게이트는 1행을 봤고 이 마일스톤은 두 행을 본다
  - 다음 액션: `/codex:rescue "리스크 완화: 상태 행 전이가 마일스톤 1 행을 되돌린다, 제안 mitigation: 검사 #13 이 상태 행 값과 마일스톤 표 2행 Status 를 결박하면서 1행이 complete 인지 함께 본다. 마일스톤 1 의 게이트는 1행을 봤고 이 마일스톤은 두 행을 본다"`
- 🟡 **MEDIUM** · `_unclassified.yaml` 을 6번째 namespace 로 오독한다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m2`
  - 가능성: 중
  - 완화책: 검사 `#4` 가 문서 namespace 집합을 manifest `code_namespaces` 중 `pattern` 보유 키와 정확 일치로 본다. `_unclassified` 는 manifest 에 키가 없어 넣으면 n=6 으로 떨어진다
  - 다음 액션: `/codex:rescue "리스크 완화: _unclassified.yaml 을 6번째 namespace 로 오독한다, 제안 mitigation: 검사 #4 가 문서 namespace 집합을 manifest code_namespaces 중 pattern 보유 키와 정확 일치로 본다. _unclassified 는 manifest 에 키가 없어 넣으면 n=6 으로 떨어진다"`
- 🟡 **MEDIUM** · 검사 `#7` 이 집합만 보고 각 충돌의 의미는 못 본다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m2`
  - 가능성: **확정**
  - 완화책: 명시적 한계다. 여섯 코드값이 정말 같은 파일 안에서 서로 다른 뜻으로 쓰이는지는 리뷰 몫이며 §Acceptance 에 `(미검증)` 으로 남긴다
  - 다음 액션: `/codex:rescue "리스크 완화: 검사 #7 이 집합만 보고 각 충돌의 의미는 못 본다, 제안 mitigation: 명시적 한계다. 여섯 코드값이 정말 같은 파일 안에서 서로 다른 뜻으로 쓰이는지는 리뷰 몫이며 §Acceptance 에 (미검증) 으로 남긴다"`
- 🟡 **MEDIUM** · 하네스가 자기를 검증하는 순환
  - 관련 결정: `insuniverse-docs-20-foundation-access-m2`
  - 가능성: 중
  - 완화책: `selftest` 를 양성·음성 이중 대조로 만들어 "항상 통과" 와 "항상 실패" 를 둘 다 잡고, 검사 `#18` 이 서브커맨드 열거를 계획서와 대조한다. 남은 한계: 두 대조가 같은 코드 경로를 쓰므로 그 경로 전체가 위조되면 못 잡는다 , 리뷰 몫
  - 다음 액션: `/codex:rescue "리스크 완화: 하네스가 자기를 검증하는 순환, 제안 mitigation: selftest 를 양성·음성 이중 대조로 만들어 \"항상 통과\" 와 \"항상 실패\" 를 둘 다 잡고, 검사 #18 이 서브커맨드 열거를 계획서와 대조한다. 남은 한계: 두 대조가 같은 코드 경로를 쓰므로 그 경로 전체가 위조되면 못 잡는다 , 리뷰 몫"`
- 🟡 **MEDIUM** · 마일스톤 2 병합 전에 착수해 기준선이 형제 델타를 내 탓으로 만든다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m3`
  - 가능성: **높음**
  - 완화책: 사용자 판정 UI2 다. 검사 `#1` 이 그 선행조건을 게이트로 세운다 , `origin/main` 이 마일스톤 2 산출 2문서를 담지 않으면 `m2-docs` 값이 어긋나 exit 1 이다. 2026-08-26 착수 전 실측으로 지금은 실제로 떨어진다
  - 다음 액션: `/codex:rescue "리스크 완화: 마일스톤 2 병합 전에 착수해 기준선이 형제 델타를 내 탓으로 만든다, 제안 mitigation: 사용자 판정 UI2 다. 검사 #1 이 그 선행조건을 게이트로 세운다 , origin/main 이 마일스톤 2 산출 2문서를 담지 않으면 m2-docs 값이 어긋나 exit 1 이다. 2026-08-26 착수 전 실측으로 지금은 실제로 떨어진다"`
- 🟡 **MEDIUM** · 기준선 커밋 리터럴이 main 병합으로 다시 깨진다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m3`
  - 가능성: **높음**
  - 완화책: 마일스톤 2 에서 두 번 발생했다(`323dcfc` → `c7341bb` → `3657aa9`). 이 계획서는 리터럴을 본문에 박지 않고 검사 `#1` 이 핀의 성질 넷을 본다 , 재지정도 같은 넷을 다시 만족시켜야 한다. 남은 한계: 성질을 만족하는 커밋이 여럿이면 어느 것을 골랐는지는 기계가 못 가린다
  - 다음 액션: `/codex:rescue "리스크 완화: 기준선 커밋 리터럴이 main 병합으로 다시 깨진다, 제안 mitigation: 마일스톤 2 에서 두 번 발생했다(323dcfc → c7341bb → 3657aa9). 이 계획서는 리터럴을 본문에 박지 않고 검사 #1 이 핀의 성질 넷을 본다 , 재지정도 같은 넷을 다시 만족시켜야 한다. 남은 한계: 성질을 만족하는 커밋이 여럿이면 어느 것을 골랐는지는 기계가 못 가린다"`
- 🟡 **MEDIUM** · `conditional-unknown` 정책을 본문에 두어 `placement` 가 붉어진다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m3`
  - 가능성: 중
  - 완화책: Task 2 가 `TOKEN_EXPIRY_CONFIG`·`NONPROD_AUTH_BYPASS` 둘만 `## 부록` 으로 못박고 나머지 여섯을 본문에 둔다. 규칙은 양방향이라 반대 실수도 잡힌다. 검사 `#3` 이 lint 두 모드를 실제 파일에 돌리고 `#9` 가 부록 정책이 적용 범위 표에도 실렸는지 본다
  - 다음 액션: `/codex:rescue "리스크 완화: conditional-unknown 정책을 본문에 두어 placement 가 붉어진다, 제안 mitigation: Task 2 가 TOKEN_EXPIRY_CONFIG·NONPROD_AUTH_BYPASS 둘만 ## 부록 으로 못박고 나머지 여섯을 본문에 둔다. 규칙은 양방향이라 반대 실수도 잡힌다. 검사 #3 이 lint 두 모드를 실제 파일에 돌리고 #9 가 부록 정책이 적용 범위 표에도 실렸는지 본다"`
- 🟡 **MEDIUM** · 인증 문서가 403 층을 함께 서술해 축이 섞인다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m3`
  - 가능성: **중**
  - 완화책: PRD §형식 계약 증분 표가 층↔문서 대응을 고정했고 UI4·UI5 가 사용자 진술이다. Task 2 Action 이 경계 문장을 명문으로 요구한다. **기계 검사 없음** , 서술이 어느 층인지는 리뷰 몫이며 §Acceptance 에 `(미검증)` 으로 남긴다
  - 다음 액션: `/codex:rescue "리스크 완화: 인증 문서가 403 층을 함께 서술해 축이 섞인다, 제안 mitigation: PRD §형식 계약 증분 표가 층↔문서 대응을 고정했고 UI4·UI5 가 사용자 진술이다. Task 2 Action 이 경계 문장을 명문으로 요구한다. 기계 검사 없음 , 서술이 어느 층인지는 리뷰 몫이며 §Acceptance 에 (미검증) 으로 남긴다"`
- 🟡 **MEDIUM** · `## 정책 (기획)` 절에 코드 심볼이 새어 들어간다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m3`
  - 가능성: 중
  - 완화책: 템플릿이 명문으로 금지한다(*"본문 서술에 코드 심볼이 1개라도 등장하면 이 절을 잘못 쓴 것이다"*). 쿠키 이름·환경변수 키가 특히 새기 쉽다. **lint 규칙이 없다** , `### <id>` 제목이 예외라 기계 판정이 정의되지 않는다. §Acceptance `(미검증)`
  - 다음 액션: `/codex:rescue "리스크 완화: ## 정책 (기획) 절에 코드 심볼이 새어 들어간다, 제안 mitigation: 템플릿이 명문으로 금지한다(*\"본문 서술에 코드 심볼이 1개라도 등장하면 이 절을 잘못 쓴 것이다\"*). 쿠키 이름·환경변수 키가 특히 새기 쉽다. lint 규칙이 없다 , ### <id> 제목이 예외라 기계 판정이 정의되지 않는다. §Acceptance (미검증)"`
- 🟡 **MEDIUM** · 자체 grep 으로 센 수를 문서에 써 우산 제약 #5 를 깬다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m3`
  - 가능성: 중
  - 완화책: manifest 가 인증 축의 어떤 계수도 동결하지 않으므로 **수를 적지 않는** 설계다(Task 2 Action). 검사 `#5`~`#8` 은 계수가 아니라 자리 집합을 대조한다. 남은 한계: 문서가 수를 산문에 풀어 쓰면 대조를 빠져나간다 , 리뷰 몫
  - 다음 액션: `/codex:rescue "리스크 완화: 자체 grep 으로 센 수를 문서에 써 우산 제약 #5 를 깬다, 제안 mitigation: manifest 가 인증 축의 어떤 계수도 동결하지 않으므로 수를 적지 않는 설계다(Task 2 Action). 검사 #5~#8 은 계수가 아니라 자리 집합을 대조한다. 남은 한계: 문서가 수를 산문에 풀어 쓰면 대조를 빠져나간다 , 리뷰 몫"`
- 🟡 **MEDIUM** · 만료 세 자리 중 하나를 빠뜨려 "12시간" 이 한 값으로 읽힌다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m3`
  - 가능성: **중**
  - 완화책: 이것이 이 문서의 핵심 정보다. 검사 `#5` 가 계수가 아니라 **집합**을 보므로 자리를 하나 빠뜨리면 걸린다. server 축 5자리 중 spec 파일 1자리를 제외하는 규칙도 그 집합에 박힌다
  - 다음 액션: `/codex:rescue "리스크 완화: 만료 세 자리 중 하나를 빠뜨려 \"12시간\" 이 한 값으로 읽힌다, 제안 mitigation: 이것이 이 문서의 핵심 정보다. 검사 #5 가 계수가 아니라 집합을 보므로 자리를 하나 빠뜨리면 걸린다. server 축 5자리 중 spec 파일 1자리를 제외하는 규칙도 그 집합에 박힌다"`
- 🟡 **MEDIUM** · 갱신 비대칭의 "없다" 를 검사가 못 본다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m3`
  - 가능성: 중
  - 완화책: 부재는 종료코드가 아니라 캡처한 수로 판정한다 , 검사 `#6` 이 관리자 축 `jwt.refreshTokenExpiry` 를 `0` 으로 **찍는다**. `grep -c` 는 0건에 exit 1 이라 그대로 쓰면 검사가 뒤집힌다
  - 다음 액션: `/codex:rescue "리스크 완화: 갱신 비대칭의 \"없다\" 를 검사가 못 본다, 제안 mitigation: 부재는 종료코드가 아니라 캡처한 수로 판정한다 , 검사 #6 이 관리자 축 jwt.refreshTokenExpiry 를 0 으로 찍는다. grep -c 는 0건에 exit 1 이라 그대로 쓰면 검사가 뒤집힌다"`
- 🟡 **MEDIUM** · 발견 기록에 원인 귀속·수정 제안이 섞인다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m3`
  - 가능성: **중**
  - 완화책: 이 창의 관측은 우회 경로라 특히 그렇게 되기 쉽다. `findings/README.md` §적지 않는 것이 명문으로 금지하고 Task 3 Action 이 쓰지 않을 것을 열거한다. **기계 검사 없음** , 검사 `#10`·`#11` 은 형식과 앵커만 본다. §Acceptance `(미검증)`
  - 다음 액션: `/codex:rescue "리스크 완화: 발견 기록에 원인 귀속·수정 제안이 섞인다, 제안 mitigation: 이 창의 관측은 우회 경로라 특히 그렇게 되기 쉽다. findings/README.md §적지 않는 것이 명문으로 금지하고 Task 3 Action 이 쓰지 않을 것을 열거한다. 기계 검사 없음 , 검사 #10·#11 은 형식과 앵커만 본다. §Acceptance (미검증)"`
- 🟡 **MEDIUM** · 발견 추가가 기대 밖 golden 키를 움직인다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m3`
  - 가능성: 중
  - 완화책: 검사 `#16` 이 기준선 blob 대비 필수 1키의 이동을 요구하고 허용 3키 밖을 0개로 본다. 새 문서가 `index.*` 를 움직이지 않는다는 판단은 `verify.sh` 1140 행이 트리 경로를 **00-index.md 텍스트에서** 유도하고 디스크를 보지 않는다는 실측에 근거한다
  - 다음 액션: `/codex:rescue "리스크 완화: 발견 추가가 기대 밖 golden 키를 움직인다, 제안 mitigation: 검사 #16 이 기준선 blob 대비 필수 1키의 이동을 요구하고 허용 3키 밖을 0개로 본다. 새 문서가 index.* 를 움직이지 않는다는 판단은 verify.sh 1140 행이 트리 경로를 00-index.md 텍스트에서 유도하고 디스크를 보지 않는다는 실측에 근거한다"`
- 🟡 **MEDIUM** · 리뷰 라운드가 backlog 에 행을 붙여 `fixtask.cohort_*` 가 함께 움직인다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m3`
  - 가능성: **높음**
  - 완화책: `verify.sh` 1170 행이 코호트 분모를 `.claude/plans/codex-findings-backlog.md` 에서 읽는다 , implement 라운드가 쓰는 원장이라 이 마일스톤이 막을 수 없다. 검사 `#16` 이 그 2키를 **허용하되 계수를 출력에 드러내** 묵인과 구별한다
  - 다음 액션: `/codex:rescue "리스크 완화: 리뷰 라운드가 backlog 에 행을 붙여 fixtask.cohort_* 가 함께 움직인다, 제안 mitigation: verify.sh 1170 행이 코호트 분모를 .claude/plans/codex-findings-backlog.md 에서 읽는다 , implement 라운드가 쓰는 원장이라 이 마일스톤이 막을 수 없다. 검사 #16 이 그 2키를 허용하되 계수를 출력에 드러내 묵인과 구별한다"`
- 🟡 **MEDIUM** · `--update` 가 실패했는데 golden 무변동으로 읽힌다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m3`
  - 가능성: 중
  - 완화책: `--update` 는 전 검증 통과 시에만 golden 을 쓰므로 실패하면 파일이 그대로다. 검사 `#16` 은 필수 키의 이동을 요구하므로 무변동(∅)도 불일치로 떨어진다. 다만 진단문이 "기대 키 부재" 로 나오므로 Task 6 은 `--update` 의 rc 를 출력 문면에서 함께 읽는다
  - 다음 액션: `/codex:rescue "리스크 완화: --update 가 실패했는데 golden 무변동으로 읽힌다, 제안 mitigation: --update 는 전 검증 통과 시에만 golden 을 쓰므로 실패하면 파일이 그대로다. 검사 #16 은 필수 키의 이동을 요구하므로 무변동(∅)도 불일치로 떨어진다. 다만 진단문이 \"기대 키 부재\" 로 나오므로 Task 6 은 --update 의 rc 를 출력 문면에서 함께 읽는다"`
- 🟡 **MEDIUM** · 위임 사유 갱신이 워킹트리 자기 대조로 무력화된다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m3`
  - 가능성: 중
  - 완화책: 검사 `#12`·`#13` 이 `BASE_SHA` 의 blob 을 원본으로 읽는다. 같은 창에서 표와 근거를 함께 넓히는 자기승인이 그래서 걸린다
  - 다음 액션: `/codex:rescue "리스크 완화: 위임 사유 갱신이 워킹트리 자기 대조로 무력화된다, 제안 mitigation: 검사 #12·#13 이 BASE_SHA 의 blob 을 원본으로 읽는다. 같은 창에서 표와 근거를 함께 넓히는 자기승인이 그래서 걸린다"`
- 🟡 **MEDIUM** · 상태 행 전이가 마일스톤 2 행을 되돌린다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m3`
  - 가능성: 중
  - 완화책: 검사 `#14` 가 상태 행 값과 마일스톤 표 **3행** Status 를 결박하면서 1·2행이 `complete` 인지 함께 본다. 마일스톤 2 의 게이트는 두 행을 봤고 이 마일스톤은 세 행을 본다
  - 다음 액션: `/codex:rescue "리스크 완화: 상태 행 전이가 마일스톤 2 행을 되돌린다, 제안 mitigation: 검사 #14 가 상태 행 값과 마일스톤 표 3행 Status 를 결박하면서 1·2행이 complete 인지 함께 본다. 마일스톤 2 의 게이트는 두 행을 봤고 이 마일스톤은 세 행을 본다"`
- 🟡 **MEDIUM** · Open Question 해소가 문면만 뒤집고 문서에 절이 없다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m3`
  - 가능성: 중
  - 완화책: 검사 `#15` 가 `- [x]` 전이와 함께 해소문이 `## 플랫폼 차이` 를 명시하는지 보고, 그 절의 실재는 검사 `#3` lint 대상 파일 안에서 확인된다. 남은 한계: 절이 있어도 내용이 비면 lint `no-empty-section` 몫이고 이 검사는 안 본다
  - 다음 액션: `/codex:rescue "리스크 완화: Open Question 해소가 문면만 뒤집고 문서에 절이 없다, 제안 mitigation: 검사 #15 가 - [x] 전이와 함께 해소문이 ## 플랫폼 차이 를 명시하는지 보고, 그 절의 실재는 검사 #3 lint 대상 파일 안에서 확인된다. 남은 한계: 절이 있어도 내용이 비면 lint no-empty-section 몫이고 이 검사는 안 본다"`
- 🟡 **MEDIUM** · 하네스가 자기를 검증하는 순환
  - 관련 결정: `insuniverse-docs-20-foundation-access-m3`
  - 가능성: 중
  - 완화책: `selftest` 를 양성·음성 이중 대조로 만들어 "항상 통과" 와 "항상 실패" 를 둘 다 잡고, 검사 `#19` 가 서브커맨드 열거를 계획서와 대조한다. 남은 한계: 두 대조가 같은 코드 경로를 쓰므로 그 경로 전체가 위조되면 못 잡는다 , 리뷰 몫
  - 다음 액션: `/codex:rescue "리스크 완화: 하네스가 자기를 검증하는 순환, 제안 mitigation: selftest 를 양성·음성 이중 대조로 만들어 \"항상 통과\" 와 \"항상 실패\" 를 둘 다 잡고, 검사 #19 가 서브커맨드 열거를 계획서와 대조한다. 남은 한계: 두 대조가 같은 코드 경로를 쓰므로 그 경로 전체가 위조되면 못 잡는다 , 리뷰 몫"`
- 🟡 **MEDIUM** · 기준선 커밋 리터럴이 형제 마일스톤 병합으로 다시 깨진다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m4`
  - 가능성: **높음**
  - 완화책: 마일스톤 2 에서 두 번 발생했다. 이 계획서는 리터럴을 본문에 박지 않고 검사 `#1` 이 핀의 성질 넷을 본다 , 재지정도 같은 넷을 다시 만족시켜야 한다. 남은 한계: 성질을 만족하는 커밋이 여럿이면 어느 것을 골랐는지는 기계가 못 가린다
  - 다음 액션: `/codex:rescue "리스크 완화: 기준선 커밋 리터럴이 형제 마일스톤 병합으로 다시 깨진다, 제안 mitigation: 마일스톤 2 에서 두 번 발생했다. 이 계획서는 리터럴을 본문에 박지 않고 검사 #1 이 핀의 성질 넷을 본다 , 재지정도 같은 넷을 다시 만족시켜야 한다. 남은 한계: 성질을 만족하는 커밋이 여럿이면 어느 것을 골랐는지는 기계가 못 가린다"`
- 🟡 **MEDIUM** · 역할 선언 계수 세 자리 중 하나가 문서로 새어 UI3·UI8 이 깨진다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m4`
  - 가능성: **높음**
  - 완화책: 세 자리가 저장소 안 읽기 전용 자산에 그대로 있어 인용 유혹이 크다. 검사 `#5` 가 계수를 **출력하지 않고** 집합만 대조하도록 설계했고, 갈림 자체는 findings 로 격리했다. 남은 한계: 문서가 수를 산문에 풀어 쓰면 대조를 빠져나간다 , 리뷰 몫
  - 다음 액션: `/codex:rescue "리스크 완화: 역할 선언 계수 세 자리 중 하나가 문서로 새어 UI3·UI8 이 깨진다, 제안 mitigation: 세 자리가 저장소 안 읽기 전용 자산에 그대로 있어 인용 유혹이 크다. 검사 #5 가 계수를 출력하지 않고 집합만 대조하도록 설계했고, 갈림 자체는 findings 로 격리했다. 남은 한계: 문서가 수를 산문에 풀어 쓰면 대조를 빠져나간다 , 리뷰 몫"`
- 🟡 **MEDIUM** · 모듈 합집합 표를 충분조건으로 읽는다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m4`
  - 가능성: **중**
  - 완화책: 이 표의 최대 오독이다. 클래스 선언과 메서드 선언이 섞여 합집합이 개별 핸들러보다 넓다. Task 2 Action 이 필요조건 문장을 명문으로 요구하고 판정 절차를 함께 싣게 한다. **기계 검사 없음** , 서술의 강도는 게이트가 못 본다. §Acceptance `(미검증)`
  - 다음 액션: `/codex:rescue "리스크 완화: 모듈 합집합 표를 충분조건으로 읽는다, 제안 mitigation: 이 표의 최대 오독이다. 클래스 선언과 메서드 선언이 섞여 합집합이 개별 핸들러보다 넓다. Task 2 Action 이 필요조건 문장을 명문으로 요구하고 판정 절차를 함께 싣게 한다. 기계 검사 없음 , 서술의 강도는 게이트가 못 본다. §Acceptance (미검증)"`
- 🟡 **MEDIUM** · 모집단을 역할 선언으로 잡아 통과 표면이 사라진다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m4`
  - 가능성: **중**
  - 완화책: 생성 인덱스가 이미 같은 함정을 기록했고 이 계획서가 그 판정을 계승한다. 검사 `#7` 이 두 집합의 차집합을 값으로 찍어 0건이면 문서 주장이 근거를 잃는 것을 드러낸다
  - 다음 액션: `/codex:rescue "리스크 완화: 모집단을 역할 선언으로 잡아 통과 표면이 사라진다, 제안 mitigation: 생성 인덱스가 이미 같은 함정을 기록했고 이 계획서가 그 판정을 계승한다. 검사 #7 이 두 집합의 차집합을 값으로 찍어 0건이면 문서 주장이 근거를 잃는 것을 드러낸다"`
- 🟡 **MEDIUM** · 노출 등급 정책을 쪼개지 않아 `placement` 가 붉어진다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m4`
  - 가능성: 중
  - 완화책: 척도와 배정값을 한 정책으로 두면 그 정책이 `data-dependent-unknown` 이 되어 척도까지 부록으로 끌려간다. Task 3 이 둘로 못박고 검사 `#11` 이 본문·부록 앵커를 함께 보며 규칙은 양방향이라 반대 실수도 잡힌다
  - 다음 액션: `/codex:rescue "리스크 완화: 노출 등급 정책을 쪼개지 않아 placement 가 붉어진다, 제안 mitigation: 척도와 배정값을 한 정책으로 두면 그 정책이 data-dependent-unknown 이 되어 척도까지 부록으로 끌려간다. Task 3 이 둘로 못박고 검사 #11 이 본문·부록 앵커를 함께 보며 규칙은 양방향이라 반대 실수도 잡힌다"`
- 🟡 **MEDIUM** · 능력 문서가 2층(계정 종류)을 함께 서술해 축이 섞인다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m4`
  - 가능성: **중**
  - 완화책: PRD §형식 계약 증분 표가 층↔문서 대응을 고정했고 UI5·UI6 이 사용자 진술이다. Task 3 Action 이 경계 문장을 명문으로 요구한다. **기계 검사 없음** , 서술이 어느 층인지는 리뷰 몫이며 §Acceptance 에 `(미검증)` 으로 남긴다
  - 다음 액션: `/codex:rescue "리스크 완화: 능력 문서가 2층(계정 종류)을 함께 서술해 축이 섞인다, 제안 mitigation: PRD §형식 계약 증분 표가 층↔문서 대응을 고정했고 UI5·UI6 이 사용자 진술이다. Task 3 Action 이 경계 문장을 명문으로 요구한다. 기계 검사 없음 , 서술이 어느 층인지는 리뷰 몫이며 §Acceptance 에 (미검증) 으로 남긴다"`
- 🟡 **MEDIUM** · `## 정책 (기획)` 절에 코드 심볼이 새어 들어간다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m4`
  - 가능성: **높음**
  - 완화책: 이 두 문서는 마일스톤 3 보다 위험이 크다 , 모듈 합집합 표의 모듈 열이 디렉터리명이라 예외를 문서 안에 밝혀야 하고, 그 예외가 다른 심볼의 통로가 되기 쉽다. 템플릿이 명문으로 금지하나 **lint 규칙이 없다**. §Acceptance `(미검증)`
  - 다음 액션: `/codex:rescue "리스크 완화: ## 정책 (기획) 절에 코드 심볼이 새어 들어간다, 제안 mitigation: 이 두 문서는 마일스톤 3 보다 위험이 크다 , 모듈 합집합 표의 모듈 열이 디렉터리명이라 예외를 문서 안에 밝혀야 하고, 그 예외가 다른 심볼의 통로가 되기 쉽다. 템플릿이 명문으로 금지하나 lint 규칙이 없다. §Acceptance (미검증)"`
- 🟡 **MEDIUM** · 4축 오염 , 역할 목록에 에러상수·메타키가 섞인다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m4`
  - 가능성: **중**
  - 완화책: PRD Problem 이 지목한 실제 전례다. 검사 `#8` 이 역할 목록 블록에서 그 두 이름의 등장 수를 0 으로 본다. 남은 한계: 이름이 아니라 뜻으로 섞이면 못 잡는다 , 리뷰 몫
  - 다음 액션: `/codex:rescue "리스크 완화: 4축 오염 , 역할 목록에 에러상수·메타키가 섞인다, 제안 mitigation: PRD Problem 이 지목한 실제 전례다. 검사 #8 이 역할 목록 블록에서 그 두 이름의 등장 수를 0 으로 본다. 남은 한계: 이름이 아니라 뜻으로 섞이면 못 잡는다 , 리뷰 몫"`
- 🟡 **MEDIUM** · 미결선 컨트롤러 관측이 판단으로 미끄러진다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m4`
  - 가능성: **중**
  - 완화책: 이 창의 관측은 접근 제어 공백처럼 읽히는 자리라 특히 그렇게 되기 쉽다. `findings/README.md` §적지 않는 것이 명문으로 금지하고, 그 관측은 findings 가 아니라 문서 `## 예외·폴백` 에 사실로만 싣는다. **기계 검사 없음**. §Acceptance `(미검증)`
  - 다음 액션: `/codex:rescue "리스크 완화: 미결선 컨트롤러 관측이 판단으로 미끄러진다, 제안 mitigation: 이 창의 관측은 접근 제어 공백처럼 읽히는 자리라 특히 그렇게 되기 쉽다. findings/README.md §적지 않는 것이 명문으로 금지하고, 그 관측은 findings 가 아니라 문서 ## 예외·폴백 에 사실로만 싣는다. 기계 검사 없음. §Acceptance (미검증)"`
- 🟡 **MEDIUM** · 층 순서 주장이 부분집합 결선을 못 본다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m4`
  - 가능성: 중
  - 완화책: 전체 결선만 확인하면 "어떤 표면은 2·3층을 건너뛴다" 는 주장이 근거를 잃는다. 검사 `#12` 가 위반 0 과 부분집합 결선 1건 이상을 **함께** 요구한다
  - 다음 액션: `/codex:rescue "리스크 완화: 층 순서 주장이 부분집합 결선을 못 본다, 제안 mitigation: 전체 결선만 확인하면 \"어떤 표면은 2·3층을 건너뛴다\" 는 주장이 근거를 잃는다. 검사 #12 가 위반 0 과 부분집합 결선 1건 이상을 함께 요구한다"`
- 🟡 **MEDIUM** · 발견 추가가 기대 밖 golden 키를 움직인다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m4`
  - 가능성: 중
  - 완화책: 검사 `#20` 이 기준선 blob 대비 필수 1키의 이동을 요구하고 허용 3키 밖을 0개로 본다. 두 신규 문서가 `index.*` 를 움직이지 않는다는 판단은 `00-index.md` 트리가 두 경로를 이미 싣고 있고 트리 경로가 그 텍스트에서만 유도된다는 실측에 근거한다
  - 다음 액션: `/codex:rescue "리스크 완화: 발견 추가가 기대 밖 golden 키를 움직인다, 제안 mitigation: 검사 #20 이 기준선 blob 대비 필수 1키의 이동을 요구하고 허용 3키 밖을 0개로 본다. 두 신규 문서가 index.* 를 움직이지 않는다는 판단은 00-index.md 트리가 두 경로를 이미 싣고 있고 트리 경로가 그 텍스트에서만 유도된다는 실측에 근거한다"`
- 🟡 **MEDIUM** · 리뷰 라운드가 backlog 에 행을 붙여 `fixtask.cohort_*` 가 함께 움직인다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m4`
  - 가능성: **높음**
  - 완화책: 코호트 분모를 `.claude/plans/codex-findings-backlog.md` 에서 읽는다 , implement 라운드가 쓰는 원장이라 이 마일스톤이 막을 수 없다. 검사 `#20` 이 그 2키를 **허용하되 계수를 출력에 드러내** 묵인과 구별한다
  - 다음 액션: `/codex:rescue "리스크 완화: 리뷰 라운드가 backlog 에 행을 붙여 fixtask.cohort_* 가 함께 움직인다, 제안 mitigation: 코호트 분모를 .claude/plans/codex-findings-backlog.md 에서 읽는다 , implement 라운드가 쓰는 원장이라 이 마일스톤이 막을 수 없다. 검사 #20 이 그 2키를 허용하되 계수를 출력에 드러내 묵인과 구별한다"`
- 🟡 **MEDIUM** · `--update` 가 실패했는데 golden 무변동으로 읽힌다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m4`
  - 가능성: 중
  - 완화책: `--update` 는 전 검증 통과 시에만 golden 을 쓰므로 실패하면 파일이 그대로다. 검사 `#20` 은 필수 키의 이동을 요구하므로 무변동도 불일치로 떨어진다. 다만 진단문이 "기대 키 부재" 로 나오므로 Task 7 은 `--update` 의 rc 를 출력 문면에서 함께 읽는다
  - 다음 액션: `/codex:rescue "리스크 완화: --update 가 실패했는데 golden 무변동으로 읽힌다, 제안 mitigation: --update 는 전 검증 통과 시에만 golden 을 쓰므로 실패하면 파일이 그대로다. 검사 #20 은 필수 키의 이동을 요구하므로 무변동도 불일치로 떨어진다. 다만 진단문이 \"기대 키 부재\" 로 나오므로 Task 7 은 --update 의 rc 를 출력 문면에서 함께 읽는다"`
- 🟡 **MEDIUM** · 위임 사유 갱신이 워킹트리 자기 대조로 무력화된다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m4`
  - 가능성: 중
  - 완화책: 검사 `#16`·`#17` 이 `BASE_SHA` 의 blob 을 원본으로 읽는다. 같은 창에서 표와 근거를 함께 넓히는 자기승인이 그래서 걸린다
  - 다음 액션: `/codex:rescue "리스크 완화: 위임 사유 갱신이 워킹트리 자기 대조로 무력화된다, 제안 mitigation: 검사 #16·#17 이 BASE_SHA 의 blob 을 원본으로 읽는다. 같은 창에서 표와 근거를 함께 넓히는 자기승인이 그래서 걸린다"`
- 🟡 **MEDIUM** · 상태 행 전이가 마일스톤 3 행을 되돌린다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m4`
  - 가능성: 중
  - 완화책: 검사 `#18` 이 상태 행 값과 마일스톤 표 **4행** Status 를 결박하면서 1~3행이 `complete` 인지 함께 본다
  - 다음 액션: `/codex:rescue "리스크 완화: 상태 행 전이가 마일스톤 3 행을 되돌린다, 제안 mitigation: 검사 #18 이 상태 행 값과 마일스톤 표 4행 Status 를 결박하면서 1~3행이 complete 인지 함께 본다"`
- 🟡 **MEDIUM** · Open Question 해소가 문면만 뒤집는다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m4`
  - 가능성: 중
  - 완화책: 검사 `#19` 가 두 항목의 `- [x]` 전이와 각 해소문의 표식어를 함께 보고 나머지 미해소 수를 값으로 찍는다. 남은 한계: 표식어가 있어도 해소문이 답이 아닐 수 있다 , 리뷰 몫
  - 다음 액션: `/codex:rescue "리스크 완화: Open Question 해소가 문면만 뒤집는다, 제안 mitigation: 검사 #19 가 두 항목의 - [x] 전이와 각 해소문의 표식어를 함께 보고 나머지 미해소 수를 값으로 찍는다. 남은 한계: 표식어가 있어도 해소문이 답이 아닐 수 있다 , 리뷰 몫"`
- 🟡 **MEDIUM** · 하네스가 자기를 검증하는 순환
  - 관련 결정: `insuniverse-docs-20-foundation-access-m4`
  - 가능성: 중
  - 완화책: `selftest` 를 양성·음성 이중 대조로 만들어 "항상 통과" 와 "항상 실패" 를 둘 다 잡고, 검사 `#23` 이 서브커맨드 열거를 계획서와 대조한다. 남은 한계: 두 대조가 같은 코드 경로를 쓰므로 그 경로 전체가 위조되면 못 잡는다 , 리뷰 몫
  - 다음 액션: `/codex:rescue "리스크 완화: 하네스가 자기를 검증하는 순환, 제안 mitigation: selftest 를 양성·음성 이중 대조로 만들어 \"항상 통과\" 와 \"항상 실패\" 를 둘 다 잡고, 검사 #23 이 서브커맨드 열거를 계획서와 대조한다. 남은 한계: 두 대조가 같은 코드 경로를 쓰므로 그 경로 전체가 위조되면 못 잡는다 , 리뷰 몫"`
- 🟡 **MEDIUM** · 실패한 검사가 fixture 디렉터리에 임시 파일을 남긴다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m4`
  - 가능성: 중
  - 완화책: `die` 경로는 `finally` 를 건너뛴다. Task 1 이 `TEMPS` 등록부 + exit 훅 + sweep 을 요구하고 마일스톤 3 하네스가 같은 장치를 이미 쓴다
  - 다음 액션: `/codex:rescue "리스크 완화: 실패한 검사가 fixture 디렉터리에 임시 파일을 남긴다, 제안 mitigation: die 경로는 finally 를 건너뛴다. Task 1 이 TEMPS 등록부 + exit 훅 + sweep 을 요구하고 마일스톤 3 하네스가 같은 장치를 이미 쓴다"`
- 🟡 **MEDIUM** · 메뉴 층을 API 인가로 읽히게 서술한다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m5`
  - 가능성: **높음**
  - 완화책: PRD §Risks 가 이 축의 최대 오독으로 지목했다. 산문 문단이 아니라 본문 첫 정책 `MENU_LAYER_NONBLOCKING` 으로 세워 앵커와 예외 행을 갖게 했고 검사 `#8` 이 그 처리기의 결선 층 집합에서 계정 종류 층이 0건임을 값으로 찍는다. 남은 한계: 다른 절의 서술이 뜻으로 오독을 만들면 못 잡는다 , 리뷰 몫
  - 다음 액션: `/codex:rescue "리스크 완화: 메뉴 층을 API 인가로 읽히게 서술한다, 제안 mitigation: PRD §Risks 가 이 축의 최대 오독으로 지목했다. 산문 문단이 아니라 본문 첫 정책 MENU_LAYER_NONBLOCKING 으로 세워 앵커와 예외 행을 갖게 했고 검사 #8 이 그 처리기의 결선 층 집합에서 계정 종류 층이 0건임을 값으로 찍는다. 남은 한계: 다른 절의 서술이 뜻으로 오독을 만들면 못 잡는다 , 리뷰 몫"`
- 🟡 **MEDIUM** · actor 3분기를 하나로 뭉뚱그린다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m5`
  - 가능성: **중**
  - 완화책: PRD §Risks 의 두 번째 지목이다. 검사 `#5` 가 세 분기 자리와 진입 자리를 재유도 집합과 대조하고 `#11` 이 본문 3블록의 인접과 순서를 본다. 남은 한계: 블록이 존재하고 인접해도 내용이 같은 모델을 반복하면 못 잡는다 , 리뷰 몫
  - 다음 액션: `/codex:rescue "리스크 완화: actor 3분기를 하나로 뭉뚱그린다, 제안 mitigation: PRD §Risks 의 두 번째 지목이다. 검사 #5 가 세 분기 자리와 진입 자리를 재유도 집합과 대조하고 #11 이 본문 3블록의 인접과 순서를 본다. 남은 한계: 블록이 존재하고 인접해도 내용이 같은 모델을 반복하면 못 잡는다 , 리뷰 몫"`
- 🟡 **MEDIUM** · corp 게이팅 서술이 3·4층을 대신 서술해 축이 섞인다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m5`
  - 가능성: **중**
  - 완화책: 필터가 두 층의 값을 읽으므로 그 층을 설명하고 싶어지는 자리다. 검사 `#10` 이 위임 문장의 존재를 요구하지만 **그 문장이 있어도 다른 문단이 층을 설명할 수 있다.** §Acceptance `(미검증)`
  - 다음 액션: `/codex:rescue "리스크 완화: corp 게이팅 서술이 3·4층을 대신 서술해 축이 섞인다, 제안 mitigation: 필터가 두 층의 값을 읽으므로 그 층을 설명하고 싶어지는 자리다. 검사 #10 이 위임 문장의 존재를 요구하지만 그 문장이 있어도 다른 문단이 층을 설명할 수 있다. §Acceptance (미검증)"`
- 🟡 **MEDIUM** · 배분 정책을 쪼개지 않아 `placement` 가 붉어지거나 트리 구조까지 부록으로 끌려간다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m5`
  - 가능성: 중
  - 완화책: admin 을 한 정책으로 두면 그 정책이 통째로 미상이 되어 판정된 트리 구조까지 부록으로 간다. Task 2 가 둘로 못박고 검사 `#11` 이 본문·부록 배치와 사유 필드를 함께 보며 lint 규칙은 양방향이라 반대 실수도 잡힌다
  - 다음 액션: `/codex:rescue "리스크 완화: 배분 정책을 쪼개지 않아 placement 가 붉어지거나 트리 구조까지 부록으로 끌려간다, 제안 mitigation: admin 을 한 정책으로 두면 그 정책이 통째로 미상이 되어 판정된 트리 구조까지 부록으로 간다. Task 2 가 둘로 못박고 검사 #11 이 본문·부록 배치와 사유 필드를 함께 보며 lint 규칙은 양방향이라 반대 실수도 잡힌다"`
- 🟡 **MEDIUM** · 강제 게이트 정책의 status 를 `conditional-enabled` 로 잡아 본문에 둔다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m5`
  - 가능성: **중**
  - 완화책: 게이트가 켜져 있다고 단정하면 본문 배치가 되고 독자가 차단이 기본이라고 읽는다. 검사 `#14` 가 그 게이트 값을 정하는 자리가 저장소에 0건임을 값으로 찍어 부록 배치의 근거를 매 실행 재확인한다
  - 다음 액션: `/codex:rescue "리스크 완화: 강제 게이트 정책의 status 를 conditional-enabled 로 잡아 본문에 둔다, 제안 mitigation: 게이트가 켜져 있다고 단정하면 본문 배치가 되고 독자가 차단이 기본이라고 읽는다. 검사 #14 가 그 게이트 값을 정하는 자리가 저장소에 0건임을 값으로 찍어 부록 배치의 근거를 매 실행 재확인한다"`
- 🟡 **MEDIUM** · DB 축 계수가 문서로 샌다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m5`
  - 가능성: **중**
  - 완화책: manifest 가 그 축을 `complete: false` 로 선언했는데 같은 파일이 `row_count`·`second_level` 을 싣고 있어 인용 유혹이 크다. 검사 `#6` 이 문서 안 계수 리터럴을 0 으로 보되 **하드코딩 축 계수는 manifest 인용 경로로 허용**한다. 남은 한계: 수를 산문에 풀어 쓰면 대조를 빠져나간다 , 리뷰 몫
  - 다음 액션: `/codex:rescue "리스크 완화: DB 축 계수가 문서로 샌다, 제안 mitigation: manifest 가 그 축을 complete: false 로 선언했는데 같은 파일이 row_count·second_level 을 싣고 있어 인용 유혹이 크다. 검사 #6 이 문서 안 계수 리터럴을 0 으로 보되 하드코딩 축 계수는 manifest 인용 경로로 허용한다. 남은 한계: 수를 산문에 풀어 쓰면 대조를 빠져나간다 , 리뷰 몫"`
- 🟡 **MEDIUM** · `## 정책 (기획)` 절에 코드 심볼이 새어 들어간다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m5`
  - 가능성: **높음**
  - 완화책: 이 두 문서는 마일스톤 4 보다 위험이 크다 , 메뉴 코드 자체가 식별자이고 토큰 축은 전달 헤더·질의 인자 이름이 서술을 지배하기 쉽다. 템플릿이 명문으로 금지하나 **lint 규칙이 없다**. §Acceptance `(미검증)`
  - 다음 액션: `/codex:rescue "리스크 완화: ## 정책 (기획) 절에 코드 심볼이 새어 들어간다, 제안 mitigation: 이 두 문서는 마일스톤 4 보다 위험이 크다 , 메뉴 코드 자체가 식별자이고 토큰 축은 전달 헤더·질의 인자 이름이 서술을 지배하기 쉽다. 템플릿이 명문으로 금지하나 lint 규칙이 없다. §Acceptance (미검증)"`
- 🟡 **MEDIUM** · 토큰 문서가 재현 가능한 위조 절차로 읽힌다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m5`
  - 가능성: **중**
  - 완화책: 서명 알고리즘·키 폴백·만료 기본값을 본문에 값으로 적으면 그렇게 된다. Task 3 이 값이 아니라 **자리**만 열도록 못박았고 검사 `#13` 이 만료 기본값을 출력하지 않는다. 남은 한계: 강제 지점 절의 앵커는 코드로 이어지며 그것이 이 문서의 존재 이유다 , 저장소 접근 통제 밖의 축이다
  - 다음 액션: `/codex:rescue "리스크 완화: 토큰 문서가 재현 가능한 위조 절차로 읽힌다, 제안 mitigation: 서명 알고리즘·키 폴백·만료 기본값을 본문에 값으로 적으면 그렇게 된다. Task 3 이 값이 아니라 자리만 열도록 못박았고 검사 #13 이 만료 기본값을 출력하지 않는다. 남은 한계: 강제 지점 절의 앵커는 코드로 이어지며 그것이 이 문서의 존재 이유다 , 저장소 접근 통제 밖의 축이다"`
- 🟡 **MEDIUM** · PRD C5 문면 정정이 지난 판정을 되돌린 것으로 읽힌다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m5`
  - 가능성: 중
  - 완화책: 그 행이 적은 경로는 재지정 이전 값이라 지금은 거짓이다. Task 6 (d)가 초판 문면을 취소선으로 남기고 재지정이 형제 PRD 의 판정임을 함께 적는다. 검사 없음 , 문면 판정은 리뷰 몫이며 §Acceptance `(미검증)`
  - 다음 액션: `/codex:rescue "리스크 완화: PRD C5 문면 정정이 지난 판정을 되돌린 것으로 읽힌다, 제안 mitigation: 그 행이 적은 경로는 재지정 이전 값이라 지금은 거짓이다. Task 6 (d)가 초판 문면을 취소선으로 남기고 재지정이 형제 PRD 의 판정임을 함께 적는다. 검사 없음 , 문면 판정은 리뷰 몫이며 §Acceptance (미검증)"`
- 🟡 **MEDIUM** · 발견 두 행 중 하나가 사라져 관측이 근거를 잃는다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m5`
  - 가능성: 중
  - 완화책: 검사 `#19` 가 두 축을 **함께** 요구하고 둘 다 0 이면 exit 1 이다. 남은 한계: 한 축만 남아도 통과하므로 관측 문면이 두 행을 모두 주장하면 그 강도는 게이트 밖이다
  - 다음 액션: `/codex:rescue "리스크 완화: 발견 두 행 중 하나가 사라져 관측이 근거를 잃는다, 제안 mitigation: 검사 #19 가 두 축을 함께 요구하고 둘 다 0 이면 exit 1 이다. 남은 한계: 한 축만 남아도 통과하므로 관측 문면이 두 행을 모두 주장하면 그 강도는 게이트 밖이다"`
- 🟡 **MEDIUM** · 발견 추가가 기대 밖 golden 키를 움직인다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m5`
  - 가능성: 중
  - 완화책: 검사 `#24` 가 기준선 blob 대비 필수 1키의 이동을 요구하고 허용 3키 밖을 0개로 본다. 두 신규 문서가 `index.*` 를 움직이지 않는다는 판단은 `00-index.md` 트리가 두 경로를 이미 싣고 있고 트리 경로가 그 텍스트에서만 유도된다는 실측에 근거한다
  - 다음 액션: `/codex:rescue "리스크 완화: 발견 추가가 기대 밖 golden 키를 움직인다, 제안 mitigation: 검사 #24 가 기준선 blob 대비 필수 1키의 이동을 요구하고 허용 3키 밖을 0개로 본다. 두 신규 문서가 index.* 를 움직이지 않는다는 판단은 00-index.md 트리가 두 경로를 이미 싣고 있고 트리 경로가 그 텍스트에서만 유도된다는 실측에 근거한다"`
- 🟡 **MEDIUM** · 리뷰 라운드가 backlog 에 행을 붙여 `fixtask.cohort_*` 가 함께 움직인다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m5`
  - 가능성: **높음**
  - 완화책: 코호트 분모를 `.claude/plans/codex-findings-backlog.md` 에서 읽는다 , implement 라운드가 쓰는 원장이라 이 마일스톤이 막을 수 없다. 검사 `#24` 가 그 2키를 **허용하되 계수를 출력에 드러내** 묵인과 구별한다
  - 다음 액션: `/codex:rescue "리스크 완화: 리뷰 라운드가 backlog 에 행을 붙여 fixtask.cohort_* 가 함께 움직인다, 제안 mitigation: 코호트 분모를 .claude/plans/codex-findings-backlog.md 에서 읽는다 , implement 라운드가 쓰는 원장이라 이 마일스톤이 막을 수 없다. 검사 #24 가 그 2키를 허용하되 계수를 출력에 드러내 묵인과 구별한다"`
- 🟡 **MEDIUM** · `--update` 가 실패했는데 golden 무변동으로 읽힌다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m5`
  - 가능성: 중
  - 완화책: `--update` 는 전 검증 통과 시에만 golden 을 쓰므로 실패하면 파일이 그대로다. 검사 `#24` 는 필수 키의 이동을 요구하므로 무변동도 불일치로 떨어진다. 다만 진단문이 "기대 키 부재" 로 나오므로 Task 7 은 `--update` 의 rc 를 출력 문면에서 함께 읽는다
  - 다음 액션: `/codex:rescue "리스크 완화: --update 가 실패했는데 golden 무변동으로 읽힌다, 제안 mitigation: --update 는 전 검증 통과 시에만 golden 을 쓰므로 실패하면 파일이 그대로다. 검사 #24 는 필수 키의 이동을 요구하므로 무변동도 불일치로 떨어진다. 다만 진단문이 \"기대 키 부재\" 로 나오므로 Task 7 은 --update 의 rc 를 출력 문면에서 함께 읽는다"`
- 🟡 **MEDIUM** · 위임 사유 갱신이 워킹트리 자기 대조로 무력화된다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m5`
  - 가능성: 중
  - 완화책: 검사 `#20`·`#21` 이 `BASE_SHA` 의 blob 을 원본으로 읽는다. 같은 창에서 표와 근거를 함께 넓히는 자기승인이 그래서 걸린다
  - 다음 액션: `/codex:rescue "리스크 완화: 위임 사유 갱신이 워킹트리 자기 대조로 무력화된다, 제안 mitigation: 검사 #20·#21 이 BASE_SHA 의 blob 을 원본으로 읽는다. 같은 창에서 표와 근거를 함께 넓히는 자기승인이 그래서 걸린다"`
- 🟡 **MEDIUM** · 상태 행 전이가 마일스톤 4 행을 되돌린다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m5`
  - 가능성: 중
  - 완화책: 검사 `#22` 가 상태 행 값과 마일스톤 표 **5행** Status 를 결박하면서 1~4행이 `complete` 인지, 6행이 `pending` 인지 함께 본다
  - 다음 액션: `/codex:rescue "리스크 완화: 상태 행 전이가 마일스톤 4 행을 되돌린다, 제안 mitigation: 검사 #22 가 상태 행 값과 마일스톤 표 5행 Status 를 결박하면서 1~4행이 complete 인지, 6행이 pending 인지 함께 본다"`
- 🟡 **MEDIUM** · 기준선 커밋 리터럴이 형제 마일스톤 병합으로 다시 깨진다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m5`
  - 가능성: **높음**
  - 완화책: 마일스톤 2 에서 두 번 발생했다. 이 계획서는 리터럴을 본문에 박지 않고 검사 `#1` 이 핀의 성질 넷을 본다 , 재지정도 같은 넷을 다시 만족시켜야 한다. 남은 한계: 성질을 만족하는 커밋이 여럿이면 어느 것을 골랐는지는 기계가 못 가린다
  - 다음 액션: `/codex:rescue "리스크 완화: 기준선 커밋 리터럴이 형제 마일스톤 병합으로 다시 깨진다, 제안 mitigation: 마일스톤 2 에서 두 번 발생했다. 이 계획서는 리터럴을 본문에 박지 않고 검사 #1 이 핀의 성질 넷을 본다 , 재지정도 같은 넷을 다시 만족시켜야 한다. 남은 한계: 성질을 만족하는 커밋이 여럿이면 어느 것을 골랐는지는 기계가 못 가린다"`
- 🟡 **MEDIUM** · 하네스가 자기를 검증하는 순환
  - 관련 결정: `insuniverse-docs-20-foundation-access-m5`
  - 가능성: 중
  - 완화책: `selftest` 를 양성·음성 이중 대조로 만들어 "항상 통과" 와 "항상 실패" 를 둘 다 잡고, 검사 `#27` 이 서브커맨드 열거를 계획서와 대조한다. 남은 한계: 두 대조가 같은 코드 경로를 쓰므로 그 경로 전체가 위조되면 못 잡는다 , 리뷰 몫
  - 다음 액션: `/codex:rescue "리스크 완화: 하네스가 자기를 검증하는 순환, 제안 mitigation: selftest 를 양성·음성 이중 대조로 만들어 \"항상 통과\" 와 \"항상 실패\" 를 둘 다 잡고, 검사 #27 이 서브커맨드 열거를 계획서와 대조한다. 남은 한계: 두 대조가 같은 코드 경로를 쓰므로 그 경로 전체가 위조되면 못 잡는다 , 리뷰 몫"`
- 🟡 **MEDIUM** · 실패한 검사가 fixture 디렉터리에 임시 파일을 남긴다
  - 관련 결정: `insuniverse-docs-20-foundation-access-m5`
  - 가능성: 중
  - 완화책: `die` 경로는 `finally` 를 건너뛴다. Task 1 이 `TEMPS` 등록부 + exit 훅 + sweep 을 요구하고 마일스톤 4 하네스가 같은 장치를 이미 쓴다
  - 다음 액션: `/codex:rescue "리스크 완화: 실패한 검사가 fixture 디렉터리에 임시 파일을 남긴다, 제안 mitigation: die 경로는 finally 를 건너뛴다. Task 1 이 TEMPS 등록부 + exit 훅 + sweep 을 요구하고 마일스톤 4 하네스가 같은 장치를 이미 쓴다"`
- 🟡 **MEDIUM** · 하네스가 파싱하는 표(ownership · PRD · backlog)의 형식이 바뀌어 검사가 조용히 0건을 세고 통과한다
  - 관련 결정: `insuniverse-docs-50-domain-m1`
  - 가능성: 높음
  - 완화책: 모든 추출은 **0건을 실패로** 취급한다. `#3`~`#6` 은 추출 개수를 출력에 싣고, `#6` 은 전수를 golden `index.entry_count` 와 맞춘 뒤에야 부분집합을 믿는다
  - 다음 액션: `/codex:rescue "리스크 완화: 하네스가 파싱하는 표(ownership · PRD · backlog)의 형식이 바뀌어 검사가 조용히 0건을 세고 통과한다, 제안 mitigation: 모든 추출은 0건을 실패로 취급한다. #3~#6 은 추출 개수를 출력에 싣고, #6 은 전수를 golden index.entry_count 와 맞춘 뒤에야 부분집합을 믿는다"`
- 🟡 **MEDIUM** · 마크다운 표 파서가 매 라운드 새 반례를 낸다 (실측: 이 저장소에서 6라운드)
  - 관련 결정: `insuniverse-docs-50-domain-m1`
  - 가능성: 높음
  - 완화책: 근사하지 않는다 , 헤더 셀 수·구분자 형태·바깥 파이프 생략·표 종료 후 파이프 줄을 계약으로 못 박고 그 밖은 실패로 낸다. 3회차 지적이 나오면 구조 선택지로 올린다
  - 다음 액션: `/codex:rescue "리스크 완화: 마크다운 표 파서가 매 라운드 새 반례를 낸다 (실측: 이 저장소에서 6라운드), 제안 mitigation: 근사하지 않는다 , 헤더 셀 수·구분자 형태·바깥 파이프 생략·표 종료 후 파이프 줄을 계약으로 못 박고 그 밖은 실패로 낸다. 3회차 지적이 나오면 구조 선택지로 올린다"`
- 🟡 **MEDIUM** · CRLF 때문에 값 비교가 거짓 통과한다
  - 관련 결정: `insuniverse-docs-50-domain-m1`
  - 가능성: 중
  - 완화책: 이 창에서 실제로 겪었다 , `deferred_ref_targets` 블록 제거 정규식이 `\r` 때문에 매치되지 않아 프로브가 두 번 같은 결과를 냈다. 하네스는 모든 입력에서 `\r` 을 먼저 제거한다
  - 다음 액션: `/codex:rescue "리스크 완화: CRLF 때문에 값 비교가 거짓 통과한다, 제안 mitigation: 이 창에서 실제로 겪었다 , deferred_ref_targets 블록 제거 정규식이 \r 때문에 매치되지 않아 프로브가 두 번 같은 결과를 냈다. 하네스는 모든 입력에서 \r 을 먼저 제거한다"`
- 🟡 **MEDIUM** · `docs/` 무변경 주장이 자기 단언으로 남는다
  - 관련 결정: `insuniverse-docs-50-domain-m1`
  - 가능성: 중
  - 완화책: `#11` 이 `git status --porcelain docs/` 로 본다. verify 게이트는 이 축을 보지 않는다(관측 2)
  - 다음 액션: `/codex:rescue "리스크 완화: docs/ 무변경 주장이 자기 단언으로 남는다, 제안 mitigation: #11 이 git status --porcelain docs/ 로 본다. verify 게이트는 이 축을 보지 않는다(관측 2)"`
- 🟡 **MEDIUM** · 템플릿 소거 판정이 틀린다 , server 8종이 실은 flow 여야 한다
  - 관련 결정: `insuniverse-docs-50-domain-m1`
  - 가능성: 낮음
  - 완화책: 소거의 전제는 §회부 R-2(관계 축 12종이 site·admin 에만 있다)이며 이미 수용된 판정이다. 뒤집히면 마일스톤 8 이 판정표 3행 중 2행을 고치고 `#6`·`#7` 이 그 즉시 붉어진다
  - 다음 액션: `/codex:rescue "리스크 완화: 템플릿 소거 판정이 틀린다 , server 8종이 실은 flow 여야 한다, 제안 mitigation: 소거의 전제는 §회부 R-2(관계 축 12종이 site·admin 에만 있다)이며 이미 수용된 판정이다. 뒤집히면 마일스톤 8 이 판정표 3행 중 2행을 고치고 #6·#7 이 그 즉시 붉어진다"`
- 🟡 **MEDIUM** · 이 마일스톤이 판정한 backlog 행 두 건을 `70-viewer` 가 통째로 닫힌 것으로 읽는다
  - 관련 결정: `insuniverse-docs-50-domain-m1`
  - 가능성: 중
  - 완화책: 마커에 `(50-domain 분)` 과 잔존 수신처를 명기하고 `#5` 가 그 문자열을 검사한다
  - 다음 액션: `/codex:rescue "리스크 완화: 이 마일스톤이 판정한 backlog 행 두 건을 70-viewer 가 통째로 닫힌 것으로 읽는다, 제안 mitigation: 마커에 (50-domain 분) 과 잔존 수신처를 명기하고 #5 가 그 문자열을 검사한다"`
- 🟡 **MEDIUM** · 하네스가 스스로 옳은지를 아무것도 보지 않는다 (L2 R1 F3·F6)
  - 관련 결정: `insuniverse-docs-50-domain-m1`
  - 가능성: 중
  - 완화책: `#13` 이 `--selfprobe` 로 표 추출기 전수의 0건 방어를 매번 뒤집어 보고, 그 전수를 등록부와 **독립 재유도**(공용 표 파서를 소비하는 검사) 양쪽에서 만들어 차집합을 이름으로 낸다. 하네스 코드 자체는 계획서에 싣지 않는다 , CLAUDE.md §1 의 200행 규약이며 선례 4건
  - 다음 액션: `/codex:rescue "리스크 완화: 하네스가 스스로 옳은지를 아무것도 보지 않는다 (L2 R1 F3·F6), 제안 mitigation: #13 이 --selfprobe 로 표 추출기 전수의 0건 방어를 매번 뒤집어 보고, 그 전수를 등록부와 독립 재유도(공용 표 파서를 소비하는 검사) 양쪽에서 만들어 차집합을 이름으로 낸다. 하네스 코드 자체는 계획서에 싣지 않는다 , CLAUDE.md §1 의 200행 규약이며 선례 4건"`
- 🟡 **MEDIUM** · 단일통과 토글이 발화하지 못해 이견이 backlog 로 자동 적재되지 않는다 (관측 14)
  - 관련 결정: `insuniverse-docs-50-domain-m1`
  - 가능성: 높음
  - 완화책: 이번 라운드가 실제로 겪었다. 판정은 계획서 §GROUND 관측 13 에 손으로 남기고 사실은 backlog 신규 1행으로 올린다 , 자동 적재 복구는 backlog 헤더 정규화가 필요하고 그것은 이 PRD 축이 아니다
  - 다음 액션: `/codex:rescue "리스크 완화: 단일통과 토글이 발화하지 못해 이견이 backlog 로 자동 적재되지 않는다 (관측 14), 제안 mitigation: 이번 라운드가 실제로 겪었다. 판정은 계획서 §GROUND 관측 13 에 손으로 남기고 사실은 backlog 신규 1행으로 올린다 , 자동 적재 복구는 backlog 헤더 정규화가 필요하고 그것은 이 PRD 축이 아니다"`
- 🟡 **MEDIUM** · golden 재동결 벽이 마일스톤 6·8 에서 다시 나타나 그때 막힌다
  - 관련 결정: `insuniverse-docs-50-domain-m1`
  - 가능성: 중
  - 완화책: 우회가 아니라 **기록**으로 처리했다 , backlog HIGH 1행 + PRD Open Question 1건. 20·30·40·60·70 도 같은 벽에 선다는 사실을 그 행에 적는다
  - 다음 액션: `/codex:rescue "리스크 완화: golden 재동결 벽이 마일스톤 6·8 에서 다시 나타나 그때 막힌다, 제안 mitigation: 우회가 아니라 기록으로 처리했다 , backlog HIGH 1행 + PRD Open Question 1건. 20·30·40·60·70 도 같은 벽에 선다는 사실을 그 행에 적는다"`
- 🟡 **MEDIUM** · **surface 181건 규모에서 evidence·anchors 가 형식만 채워진다**
  - 관련 결정: `insuniverse-docs-50-domain-m2`
  - 가능성: 높음
  - 완화책: `anchors` 를 손으로 짓지 않고 추출기 `anchors[].file`·`.line` 에서 유도한다. `S-component` 를 붙일 근거가 없는 라우트는 등급을 낮추고 `limitations` 에 적는다 , 게이트 `#6` 이 그 예외에 `limitations` 가 붙어 있는지를 문다
  - 다음 액션: `/codex:rescue "리스크 완화: surface 181건 규모에서 evidence·anchors 가 형식만 채워진다, 제안 mitigation: anchors 를 손으로 짓지 않고 추출기 anchors[].file·.line 에서 유도한다. S-component 를 붙일 근거가 없는 라우트는 등급을 낮추고 limitations 에 적는다 , 게이트 #6 이 그 예외에 limitations 가 붙어 있는지를 문다"`
- 🟡 **MEDIUM** · **exits 가 근거 없이 `막다름` 으로 채워진다**
  - 관련 결정: `insuniverse-docs-50-domain-m2`
  - 가능성: 높음
  - 완화책: 관측 4 의 3소스 밖에서는 `막다름` 을 쓰지 않고 전수 미검증을 `limitations` 로 적는다. 이 축은 기계 검사가 없다 , 리뷰 몫이며 Acceptance 에 `(미검증)` 으로 남긴다
  - 다음 액션: `/codex:rescue "리스크 완화: exits 가 근거 없이 막다름 으로 채워진다, 제안 mitigation: 관측 4 의 3소스 밖에서는 막다름 을 쓰지 않고 전수 미검증을 limitations 로 적는다. 이 축은 기계 검사가 없다 , 리뷰 몫이며 Acceptance 에 (미검증) 으로 남긴다"`
- 🟡 **MEDIUM** · **`screen.yaml` 델타 2건을 정본으로 오인해 화면 2개를 지어낸다**
  - 관련 결정: `insuniverse-docs-50-domain-m2`
  - 가능성: 중
  - 완화책: 파티션 입력이 추출기 재실행값이며 `screen.yaml` 이 아니라는 것을 Task 3 이 못 박고 게이트 `#4` 의 역방향이 동결집합 밖 path 를 잡는다
  - 다음 액션: `/codex:rescue "리스크 완화: screen.yaml 델타 2건을 정본으로 오인해 화면 2개를 지어낸다, 제안 mitigation: 파티션 입력이 추출기 재실행값이며 screen.yaml 이 아니라는 것을 Task 3 이 못 박고 게이트 #4 의 역방향이 동결집합 밖 path 를 잡는다"`
- 🟡 **MEDIUM** · **두 자리 전이가 갈려 중간 상태가 통과한다**
  - 관련 결정: `insuniverse-docs-50-domain-m2`
  - 가능성: 중
  - 완화책: 게이트 `#10` 이 마일스톤 표 2행과 `*Status:` 를 함께 보고 Task 7 이 둘을 한 번에 뒤집는다
  - 다음 액션: `/codex:rescue "리스크 완화: 두 자리 전이가 갈려 중간 상태가 통과한다, 제안 mitigation: 게이트 #10 이 마일스톤 표 2행과 *Status: 를 함께 보고 Task 7 이 둘을 한 번에 뒤집는다"`
- 🟡 **MEDIUM** · **backlog 이월 행이 이름만으로 동결 코호트에 합류한다**
  - 관련 결정: `insuniverse-docs-50-domain-m2`
  - 가능성: 중
  - 완화책: Task 2 가 종료된 축의 slug 를 산문에 담지 않고 게이트 `#9` 가 `fixtask.cohort_count` 를 따로 이름 내어 관측한다
  - 다음 액션: `/codex:rescue "리스크 완화: backlog 이월 행이 이름만으로 동결 코호트에 합류한다, 제안 mitigation: Task 2 가 종료된 축의 slug 를 산문에 담지 않고 게이트 #9 가 fixtask.cohort_count 를 따로 이름 내어 관측한다"`
- 🟡 **MEDIUM** · **strict 아래에서 exits 가 없는 문서를 가리켜 lint 가 붉어진다**
  - 관련 결정: `insuniverse-docs-50-domain-m2`
  - 가능성: 중
  - 완화책: Task 6 이 문서 간 참조를 이 창에서 만들지 않는다. 반대 방향의 참조는 마일스톤 3 이 건다
  - 다음 액션: `/codex:rescue "리스크 완화: strict 아래에서 exits 가 없는 문서를 가리켜 lint 가 붉어진다, 제안 mitigation: Task 6 이 문서 간 참조를 이 창에서 만들지 않는다. 반대 방향의 참조는 마일스톤 3 이 건다"`
- 🟡 **MEDIUM** · **마일스톤 1 하네스가 `*Status:` 전이로 붉어진다**
  - 관련 결정: `insuniverse-docs-50-domain-m2`
  - 가능성: 낮음
  - 완화책: 마일스톤 1 하네스는 그 창의 일회용 도구이며 종료된 마일스톤의 상태를 검사한다. 이 창은 그것을 다시 돌리지 않고 그 사실을 구현 리포트에 적는다
  - 다음 액션: `/codex:rescue "리스크 완화: **마일스톤 1 하네스가 *Status: 전이로 붉어진다**, 제안 mitigation: 마일스톤 1 하네스는 그 창의 일회용 도구이며 종료된 마일스톤의 상태를 검사한다. 이 창은 그것을 다시 돌리지 않고 그 사실을 구현 리포트에 적는다"`
- 🟡 **MEDIUM** · 흐름이 지나는 화면을 `refs` 에서 빼 lint 를 통과시킨다
  - 관련 결정: `insuniverse-docs-50-domain-m3`
  - 가능성: 높음
  - 완화책: 검사 `#7` 이 본문 코드스팬과 `refs` 를 양방향으로 문다. lint 는 이 축을 보지 않는다(관측 3)
  - 다음 액션: `/codex:rescue "리스크 완화: 흐름이 지나는 화면을 refs 에서 빼 lint 를 통과시킨다, 제안 mitigation: 검사 #7 이 본문 코드스팬과 refs 를 양방향으로 문다. lint 는 이 축을 보지 않는다(관측 3)"`
- 🟡 **MEDIUM** · 총론 부재 상태에서 총론 링크를 걸어 dangling 이 남는다
  - 관련 결정: `insuniverse-docs-50-domain-m3`
  - 가능성: 높음
  - 완화책: 검사 `#12` 가 본문 링크 대상 실재를 문다. 부재 문서는 산문으로 경로만 적는다(관측 4)
  - 다음 액션: `/codex:rescue "리스크 완화: 총론 부재 상태에서 총론 링크를 걸어 dangling 이 남는다, 제안 mitigation: 검사 #12 가 본문 링크 대상 실재를 문다. 부재 문서는 산문으로 경로만 적는다(관측 4)"`
- 🟡 **MEDIUM** · 감시 흐름을 `active-prod` 로 적어 미상 상태를 감춘다
  - 관련 결정: `insuniverse-docs-50-domain-m3`
  - 가능성: 중
  - 완화책: lint `flow-refs` 가 먼저 막고 검사 `#8` 이 독립 재계산으로 다시 문다(관측 2)
  - 다음 액션: `/codex:rescue "리스크 완화: 감시 흐름을 active-prod 로 적어 미상 상태를 감춘다, 제안 mitigation: lint flow-refs 가 먼저 막고 검사 #8 이 독립 재계산으로 다시 문다(관측 2)"`
- 🟡 **MEDIUM** · 권한 표에 5층을 적기만 하고 판정을 비운다
  - 관련 결정: `insuniverse-docs-50-domain-m3`
  - 가능성: 중
  - 완화책: 검사 `#9` 가 셀 공백을 문다. `auth-layers` 는 첫 열 집합만 본다
  - 다음 액션: `/codex:rescue "리스크 완화: 권한 표에 5층을 적기만 하고 판정을 비운다, 제안 mitigation: 검사 #9 가 셀 공백을 문다. auth-layers 는 첫 열 집합만 본다"`
- 🟡 **MEDIUM** · 5문서 규모로 창 안에 완주하지 못한다
  - 관련 결정: `insuniverse-docs-50-domain-m3`
  - 가능성: 중
  - 완화책: 흐름 수를 질문 배정 원장이 정한다 , 14 질문을 덮는 최소 집합이 하한이고 그 이상은 이 창의 목표가 아니다
  - 다음 액션: `/codex:rescue "리스크 완화: 5문서 규모로 창 안에 완주하지 못한다, 제안 mitigation: 흐름 수를 질문 배정 원장이 정한다 , 14 질문을 덮는 최소 집합이 하한이고 그 이상은 이 창의 목표가 아니다"`
- 🟡 **MEDIUM** · `verify.sh --check` 30분 소요로 재시도 비용이 크다
  - 관련 결정: `insuniverse-docs-50-domain-m3`
  - 가능성: 중
  - 완화책: Task 8 의 서열이 전이 전 스위트를 한 번만 돌게 배치돼 있고 되돌리기 지점이 명시돼 있다
  - 다음 액션: `/codex:rescue "리스크 완화: verify.sh --check 30분 소요로 재시도 비용이 크다, 제안 mitigation: Task 8 의 서열이 전이 전 스위트를 한 번만 돌게 배치돼 있고 되돌리기 지점이 명시돼 있다"`
- 🟡 **MEDIUM** · 온보딩 답변 성립을 이 창이 판정한 것처럼 보고한다
  - 관련 결정: `insuniverse-docs-50-domain-m3`
  - 가능성: 중
  - 완화책: Acceptance 에 `(미검증)` 으로 명시한다. 총론 0건이라 성립 판정의 입력이 없다(관측 6)
  - 다음 액션: `/codex:rescue "리스크 완화: 온보딩 답변 성립을 이 창이 판정한 것처럼 보고한다, 제안 mitigation: Acceptance 에 (미검증) 으로 명시한다. 총론 0건이라 성립 판정의 입력이 없다(관측 6)"`
- 🟡 **MEDIUM** · 관측 7 의 부재 관측(감사 로그·낙관적 잠금)을 부재 증명으로 적는다
  - 관련 결정: `insuniverse-docs-50-domain-m3`
  - 가능성: 중
  - 완화책: 검색어를 함께 적고 그 밖은 못 본다는 한계를 `limitations` 에 남긴다
  - 다음 액션: `/codex:rescue "리스크 완화: 관측 7 의 부재 관측(감사 로그·낙관적 잠금)을 부재 증명으로 적는다, 제안 mitigation: 검색어를 함께 적고 그 밖은 못 본다는 한계를 limitations 에 남긴다"`
- 🟡 **MEDIUM** · **JSX 스캐너가 손으로 짠 것이라 조용히 틀린다**
  - 관련 결정: `insuniverse-docs-50-domain-m5`
  - 가능성: 높음
  - 완화책: 검사 `#3` 이 태그 전수 == 잎 + 비잎 항등식을 매 실행 낸다 , 태그를 조기 종료하면 이 등식이 먼저 깨진다. `--selfprobe` 가 스캐너에 빈 입력과 변이 입력을 먹인다. 그래도 문법 변형(자기닫힘 없는 중첩, 주석 안 태그)은 남는 사각지대이며 그 사실을 게이트 출력에 적는다
  - 다음 액션: `/codex:rescue "리스크 완화: JSX 스캐너가 손으로 짠 것이라 조용히 틀린다, 제안 mitigation: 검사 #3 이 태그 전수 == 잎 + 비잎 항등식을 매 실행 낸다 , 태그를 조기 종료하면 이 등식이 먼저 깨진다. --selfprobe 가 스캐너에 빈 입력과 변이 입력을 먹인다. 그래도 문법 변형(자기닫힘 없는 중첩, 주석 안 태그)은 남는 사각지대이며 그 사실을 게이트 출력에 적는다"`
- 🟡 **MEDIUM** · **동결 대조가 없어 화면을 지어내거나 잃어도 안 잡힌다**
  - 관련 결정: `insuniverse-docs-50-domain-m5`
  - 가능성: 높음
  - 완화책: 검사 `#4` 의 양방향이 이 축을 진다. 다만 **비교 대상이 저장소 골든이 아니라 같은 창의 추출기**라는 한계가 admin 판과 결정적으로 다르다 , 추출기가 틀리면 문서와 추출기가 함께 틀리고 게이트는 초록이다. 이것이 R-50-2 회부의 사유이며 Acceptance 에 `(미검증)` 으로 남는다
  - 다음 액션: `/codex:rescue "리스크 완화: 동결 대조가 없어 화면을 지어내거나 잃어도 안 잡힌다, 제안 mitigation: 검사 #4 의 양방향이 이 축을 진다. 다만 비교 대상이 저장소 골든이 아니라 같은 창의 추출기라는 한계가 admin 판과 결정적으로 다르다 , 추출기가 틀리면 문서와 추출기가 함께 틀리고 게이트는 초록이다. 이것이 R-50-2 회부의 사유이며 Acceptance 에 (미검증) 으로 남는다"`
- 🟡 **MEDIUM** · **exits 가 근거 없이 `막다름` 으로 채워진다**
  - 관련 결정: `insuniverse-docs-50-domain-m5`
  - 가능성: 높음
  - 완화책: 관측 7 의 3소스 밖에서는 `막다름` 을 쓰지 않고 전수 미검증을 `limitations` 로 적는다. 기계 검사가 없다 , 리뷰 몫이며 Acceptance 에 `(미검증)` 으로 남긴다
  - 다음 액션: `/codex:rescue "리스크 완화: exits 가 근거 없이 막다름 으로 채워진다, 제안 mitigation: 관측 7 의 3소스 밖에서는 막다름 을 쓰지 않고 전수 미검증을 limitations 로 적는다. 기계 검사가 없다 , 리뷰 몫이며 Acceptance 에 (미검증) 으로 남긴다"`
- 🟡 **MEDIUM** · **admin 판 문안을 복사해 site 에 거짓인 고지가 들어온다**
  - 관련 결정: `insuniverse-docs-50-domain-m5`
  - 가능성: 중
  - 완화책: 검사 `#7` 이 admin 전용 테스트 부재 문장의 유입을 문자열 부재로 막는다. 관측 8 이 그 문장이 site 에서 거짓임을 실측했다
  - 다음 액션: `/codex:rescue "리스크 완화: admin 판 문안을 복사해 site 에 거짓인 고지가 들어온다, 제안 mitigation: 검사 #7 이 admin 전용 테스트 부재 문장의 유입을 문자열 부재로 막는다. 관측 8 이 그 문장이 site 에서 거짓임을 실측했다"`
- ⚪ **검사 `#10` 이 세 자리를 함께 보고 `--EXPECT PRE** · **전이가 갈려 중간 상태가 통과한다**
  - 관련 결정: `insuniverse-docs-50-domain-m5`
  - 영향: 검사 `#10` 이 세 자리를 함께 보고 `--expect pre
  - 가능성: 중
  - 완화책: post` 로 방향을 가른다. Task 8 이 남은 두 자리를 한 번에 뒤집고 Recovery 가 재시도 경로를 못박는다
  - 다음 액션: `/codex:rescue "리스크 완화: 전이가 갈려 중간 상태가 통과한다, 제안 mitigation: post` 로 방향을 가른다. Task 8 이 남은 두 자리를 한 번에 뒤집고 Recovery 가 재시도 경로를 못박는다"`
- 🟡 **MEDIUM** · **마일스톤 4 하네스가 전이로 붉어진 것을 사고로 오인한다**
  - 관련 결정: `insuniverse-docs-50-domain-m5`
  - 가능성: 중
  - 완화책: 검사 `#11` 이 예정된 붉음을 지정 문자열로 확인하고 나머지 12검사의 초록을 함께 요구한다. 그 사실을 backlog 이월 행으로도 남긴다
  - 다음 액션: `/codex:rescue "리스크 완화: 마일스톤 4 하네스가 전이로 붉어진 것을 사고로 오인한다, 제안 mitigation: 검사 #11 이 예정된 붉음을 지정 문자열로 확인하고 나머지 12검사의 초록을 함께 요구한다. 그 사실을 backlog 이월 행으로도 남긴다"`
- 🟡 **MEDIUM** · **고아 param 29건이 화면으로 승격되며 문서가 admin 판보다 얇아진다**
  - 관련 결정: `insuniverse-docs-50-domain-m5`
  - 가능성: 중
  - 완화책: 고아는 제외가 아니라 화면이라는 규칙이 admin 판과 같다(관측 5). 각 고아의 `limitations` 에 부모가 레이아웃이라 접을 자리가 없다는 사실을 적어 승격 사유가 문서에 남게 한다
  - 다음 액션: `/codex:rescue "리스크 완화: 고아 param 29건이 화면으로 승격되며 문서가 admin 판보다 얇아진다, 제안 mitigation: 고아는 제외가 아니라 화면이라는 규칙이 admin 판과 같다(관측 5). 각 고아의 limitations 에 부모가 레이아웃이라 접을 자리가 없다는 사실을 적어 승격 사유가 문서에 남게 한다"`
- 🟡 **MEDIUM** · **backlog 이월 행이 이름만으로 동결 코호트에 합류한다**
  - 관련 결정: `insuniverse-docs-50-domain-m5`
  - 가능성: 중
  - 완화책: Task 6 이 종료된 축의 slug 를 산문에 담지 않고 검사 `#9` 가 golden 무변동을 따로 이름 내어 관측한다
  - 다음 액션: `/codex:rescue "리스크 완화: backlog 이월 행이 이름만으로 동결 코호트에 합류한다, 제안 mitigation: Task 6 이 종료된 축의 slug 를 산문에 담지 않고 검사 #9 가 golden 무변동을 따로 이름 내어 관측한다"`
- 🟡 **MEDIUM** · **발신 R-50-2 가 아무 데도 도달하지 않는다**
  - 관련 결정: `insuniverse-docs-50-domain-m5`
  - 가능성: 중
  - 완화책: 도달 경로가 없다는 것이 이미 PRD Open Question 의 내용이다. 이 창은 기록까지만 지고 그 한계를 Acceptance 에 `(미검증)` 으로 남긴다
  - 다음 액션: `/codex:rescue "리스크 완화: 발신 R-50-2 가 아무 데도 도달하지 않는다, 제안 mitigation: 도달 경로가 없다는 것이 이미 PRD Open Question 의 내용이다. 이 창은 기록까지만 지고 그 한계를 Acceptance 에 (미검증) 으로 남긴다"`
- 🟡 **MEDIUM** · **저작 5편 + 리뷰 원장이 한 창에 안 끝난다**
  - 관련 결정: `insuniverse-docs-50-domain-m6`
  - 가능성: 높음
  - 완화책: 마일스톤 3 과 4 가 두 창에 나눠 했던 일이다. `미검증` 이 일급 표기이므로 못 본 행을 `ok` 로 채우지 않고 사유와 함께 남기며, 검사 `#9` 가 그 계수를 수렴 계수 뒤에 숨기지 않는다. 라운드 2 는 애초에 이 창 밖이다(UI10)
  - 다음 액션: `/codex:rescue "리스크 완화: 저작 5편 + 리뷰 원장이 한 창에 안 끝난다, 제안 mitigation: 마일스톤 3 과 4 가 두 창에 나눠 했던 일이다. 미검증 이 일급 표기이므로 못 본 행을 ok 로 채우지 않고 사유와 함께 남기며, 검사 #9 가 그 계수를 수렴 계수 뒤에 숨기지 않는다. 라운드 2 는 애초에 이 창 밖이다(UI10)"`
- 🟡 **MEDIUM** · **`status` 지배 계산을 손으로 틀린다**
  - 관련 결정: `insuniverse-docs-50-domain-m6`
  - 가능성: 높음
  - 완화책: `flow-refs` 가 `flow.status !== dom.status` 와 순위 불일치를 각각 위반으로 내고 검사 `#5` 가 같은 계산을 독립 재열거한다. 벤더 정책 참조가 `conditional-unknown` 을 강제한다는 것은 관측 2 의 실측이다
  - 다음 액션: `/codex:rescue "리스크 완화: status 지배 계산을 손으로 틀린다, 제안 mitigation: flow-refs 가 flow.status !== dom.status 와 순위 불일치를 각각 위반으로 내고 검사 #5 가 같은 계산을 독립 재열거한다. 벤더 정책 참조가 conditional-unknown 을 강제한다는 것은 관측 2 의 실측이다"`
- 🟡 **MEDIUM** · **import 그래프 귀속기가 손으로 짠 것이라 조용히 틀린다**
  - 관련 결정: `insuniverse-docs-50-domain-m6`
  - 가능성: 높음
  - 완화책: 검사 `#4` 가 해결·미해결·유도 불가를 **각각 이름으로** 낸다. 0 을 요구하지 않는 것이 핵심이다 , 0 을 요구하면 저자가 범위를 좁혀 0 을 만든다. `--selfprobe` 가 배럴 해석기에 빈 입력과 변이 입력을 먹인다. 그래도 백틱 템플릿과 변수 대상은 사각지대이며 그 사실이 게이트 출력과 문서 `limitations` 양쪽에 남는다
  - 다음 액션: `/codex:rescue "리스크 완화: import 그래프 귀속기가 손으로 짠 것이라 조용히 틀린다, 제안 mitigation: 검사 #4 가 해결·미해결·유도 불가를 각각 이름으로 낸다. 0 을 요구하지 않는 것이 핵심이다 , 0 을 요구하면 저자가 범위를 좁혀 0 을 만든다. --selfprobe 가 배럴 해석기에 빈 입력과 변이 입력을 먹인다. 그래도 백틱 템플릿과 변수 대상은 사각지대이며 그 사실이 게이트 출력과 문서 limitations 양쪽에 남는다"`
- 🟡 **MEDIUM** · **총론 링크가 dangling 으로 남는다**
  - 관련 결정: `insuniverse-docs-50-domain-m6`
  - 가능성: 중
  - 완화책: 관측 2 대로 총론 24문서가 실재하고 검사 `#8` 이 `--strict-refs` 로 돈다. 본문 마크다운 링크는 lint 밖이므로 검사 `#6` 이 따로 대상 실재를 문다
  - 다음 액션: `/codex:rescue "리스크 완화: 총론 링크가 dangling 으로 남는다, 제안 mitigation: 관측 2 대로 총론 24문서가 실재하고 검사 #8 이 --strict-refs 로 돈다. 본문 마크다운 링크는 lint 밖이므로 검사 #6 이 따로 대상 실재를 문다"`
- 🟡 **MEDIUM** · **term-requests 파일 개설이 golden 을 움직인다**
  - 관련 결정: `insuniverse-docs-50-domain-m6`
  - 가능성: 중
  - 완화책: 관측 9 가 키 부재를 확인했지만 그것은 정적 관측이다. 검사 `#10` 이 `verify.sh --check` 완주 뒤 `golden.txt` 무변동을 이름으로 낸다. 붉으면 파일을 지우고 backlog 이월 행으로 내린다 , 마일스톤 1~5 가 findings 축에서 택한 대안 C 와 같은 형태다
  - 다음 액션: `/codex:rescue "리스크 완화: term-requests 파일 개설이 golden 을 움직인다, 제안 mitigation: 관측 9 가 키 부재를 확인했지만 그것은 정적 관측이다. 검사 #10 이 verify.sh --check 완주 뒤 golden.txt 무변동을 이름으로 낸다. 붉으면 파일을 지우고 backlog 이월 행으로 내린다 , 마일스톤 1~5 가 findings 축에서 택한 대안 C 와 같은 형태다"`
- 🟡 **MEDIUM** · **IA `exits` 잔여를 해소한 것처럼 읽힌다**
  - 관련 결정: `insuniverse-docs-50-domain-m6`
  - 가능성: 중
  - 완화책: 관측 5 의 판정 근거 셋을 계획서 본문에 적고, 이월 행에 *흐름 문서에서 해소 · IA 잔여는 마일스톤 7* 접미를 잇는다. 검사 `#7` 이 그 접미의 존재를 문다
  - 다음 액션: `/codex:rescue "리스크 완화: IA exits 잔여를 해소한 것처럼 읽힌다, 제안 mitigation: 관측 5 의 판정 근거 셋을 계획서 본문에 적고, 이월 행에 *흐름 문서에서 해소 · IA 잔여는 마일스톤 7* 접미를 잇는다. 검사 #7 이 그 접미의 존재를 문다"`
- 🟡 **MEDIUM** · **`actor` 를 아무 값이나 써도 통과한다**
  - 관련 결정: `insuniverse-docs-50-domain-m6`
  - 가능성: 중
  - 완화책: 관측 8 이 lint 부재를 실측했다. 검사 `#5` 가 `config.actors` 밖 값을 **세어서 출력**하고, 규약(로그인 주체로 적고 비로그인 보행자는 `limitations`)을 어긴 자리는 리뷰 몫이다. 검사 부재 자체를 이월 행으로 올린다
  - 다음 액션: `/codex:rescue "리스크 완화: actor 를 아무 값이나 써도 통과한다, 제안 mitigation: 관측 8 이 lint 부재를 실측했다. 검사 #5 가 config.actors 밖 값을 세어서 출력하고, 규약(로그인 주체로 적고 비로그인 보행자는 limitations)을 어긴 자리는 리뷰 몫이다. 검사 부재 자체를 이월 행으로 올린다"`
- 🟡 **MEDIUM** · **admin 판 문안을 복사해 site 에 거짓인 고지가 들어온다**
  - 관련 결정: `insuniverse-docs-50-domain-m6`
  - 가능성: 중
  - 완화책: 검사 `#7` 이 admin 전용 테스트 부재 문장의 유입을 문자열 부재로 막는다. 관측 7 이 site 테스트 16건을 실측했다
  - 다음 액션: `/codex:rescue "리스크 완화: admin 판 문안을 복사해 site 에 거짓인 고지가 들어온다, 제안 mitigation: 검사 #7 이 admin 전용 테스트 부재 문장의 유입을 문자열 부재로 막는다. 관측 7 이 site 테스트 16건을 실측했다"`
- ⚪ **검사 `#11` 이 세 자리를 함께 보고 `--EXPECT PRE** · **전이가 갈려 중간 상태가 통과한다**
  - 관련 결정: `insuniverse-docs-50-domain-m6`
  - 영향: 검사 `#11` 이 세 자리를 함께 보고 `--expect pre
  - 가능성: 중
  - 완화책: post` 로 방향을 가른다. Task 10 이 남은 두 자리를 한 번에 뒤집고 Recovery 가 재시도 경로를 못박는다
  - 다음 액션: `/codex:rescue "리스크 완화: 전이가 갈려 중간 상태가 통과한다, 제안 mitigation: post` 로 방향을 가른다. Task 10 이 남은 두 자리를 한 번에 뒤집고 Recovery 가 재시도 경로를 못박는다"`
- 🟡 **MEDIUM** · **m5 하네스가 전이로 붉어진 것을 사고로 오인한다**
  - 관련 결정: `insuniverse-docs-50-domain-m6`
  - 가능성: 중
  - 완화책: 검사 `#12` 가 예정된 붉음 셋을 지정 문자열로 확인하고 나머지 8검사의 초록을 함께 요구한다. `#1` 이 이 창 이전부터 붉었다는 사실도 함께 낸다
  - 다음 액션: `/codex:rescue "리스크 완화: m5 하네스가 전이로 붉어진 것을 사고로 오인한다, 제안 mitigation: 검사 #12 가 예정된 붉음 셋을 지정 문자열로 확인하고 나머지 8검사의 초록을 함께 요구한다. #1 이 이 창 이전부터 붉었다는 사실도 함께 낸다"`
- 🟡 **MEDIUM** · **`실패·이탈` 이 근거 없이 `막다름` 으로 채워진다**
  - 관련 결정: `insuniverse-docs-50-domain-m6`
  - 가능성: 중
  - 완화책: 관측 4 의 귀속 범위 밖에서는 `막다름` 을 쓰지 않고 전수 미검증을 `limitations` 로 적는다. 기계 검사가 없다 , 리뷰 몫이며 Acceptance 에 `(미검증)` 으로 남긴다
  - 다음 액션: `/codex:rescue "리스크 완화: 실패·이탈 이 근거 없이 막다름 으로 채워진다, 제안 mitigation: 관측 4 의 귀속 범위 밖에서는 막다름 을 쓰지 않고 전수 미검증을 limitations 로 적는다. 기계 검사가 없다 , 리뷰 몫이며 Acceptance 에 (미검증) 으로 남긴다"`
- 🟡 **MEDIUM** · `--probe=history` 부적용을 "지표 통과" 로 접는다
  - 관련 결정: `insuniverse-docs-50-domain-m7`
  - 가능성: 높음
  - 완화책: 검사 `#6` 이 조인을 직접 재현해 계수를 내고, 도구 사정거리 밖이라는 사실은 회부 R-50-4 와 backlog 이월로 따로 남긴다. 판정 원장에 `(도구 밖)` 을 명시한다
  - 다음 액션: `/codex:rescue "리스크 완화: --probe=history 부적용을 \"지표 통과\" 로 접는다, 제안 mitigation: 검사 #6 이 조인을 직접 재현해 계수를 내고, 도구 사정거리 밖이라는 사실은 회부 R-50-4 와 backlog 이월로 따로 남긴다. 판정 원장에 (도구 밖) 을 명시한다"`
- 🟡 **MEDIUM** · 동결 파일이 저장소 상시 게이트가 아니다
  - 관련 결정: `insuniverse-docs-50-domain-m7`
  - 가능성: 높음
  - 완화책: 마일스톤 5 가 R-50-2 에서 만난 것과 같은 벽이다. 회부 R-50-4 (1)번 항목으로 내보내고 한계를 판정 원장에 적는다. 이 창의 하네스가 무는 것까지가 사정거리다
  - 다음 액션: `/codex:rescue "리스크 완화: 동결 파일이 저장소 상시 게이트가 아니다, 제안 mitigation: 마일스톤 5 가 R-50-2 에서 만난 것과 같은 벽이다. 회부 R-50-4 (1)번 항목으로 내보내고 한계를 판정 원장에 적는다. 이 창의 하네스가 무는 것까지가 사정거리다"`
- 🟡 **MEDIUM** · 온보딩 답변 원장이 저자 자기 단언이 된다
  - 관련 결정: `insuniverse-docs-50-domain-m7`
  - 가능성: 높음
  - 완화책: 질문 집합을 `onboarding-questions.yaml` 에서 매 실행 유도해 양방향 대조하고, 좌표에 타 서비스 각론이 있으면 붉힌다. 미성립을 0 으로 요구하지 않는다 , 사유 보유만 요구한다
  - 다음 액션: `/codex:rescue "리스크 완화: 온보딩 답변 원장이 저자 자기 단언이 된다, 제안 mitigation: 질문 집합을 onboarding-questions.yaml 에서 매 실행 유도해 양방향 대조하고, 좌표에 타 서비스 각론이 있으면 붉힌다. 미성립을 0 으로 요구하지 않는다 , 사유 보유만 요구한다"`
- 🟡 **MEDIUM** · `origin/main` 병합에서 backlog 표 충돌로 행을 잃는다
  - 관련 결정: `insuniverse-docs-50-domain-m7`
  - 가능성: 중
  - 완화책: M6 §main 병합 관측 4회차 규약을 따른다 , 문면이 아니라 `id=` 축으로 양방향 유실 0 을 확인한다
  - 다음 액션: `/codex:rescue "리스크 완화: origin/main 병합에서 backlog 표 충돌로 행을 잃는다, 제안 mitigation: M6 §main 병합 관측 4회차 규약을 따른다 , 문면이 아니라 id= 축으로 양방향 유실 0 을 확인한다"`
- 🟡 **MEDIUM** · 상태 전이를 한 자리만 뒤집는다
  - 관련 결정: `insuniverse-docs-50-domain-m7`
  - 가능성: 중
  - 완화책: 검사 `#11` 이 표 6행·7행과 `*Status:` 토큰 세 자리를 함께 문다. M6 가 같은 형태로 이미 한 번 겪었다
  - 다음 액션: `/codex:rescue "리스크 완화: 상태 전이를 한 자리만 뒤집는다, 제안 mitigation: 검사 #11 이 표 6행·7행과 *Status: 토큰 세 자리를 함께 문다. M6 가 같은 형태로 이미 한 번 겪었다"`
- 🟡 **MEDIUM** · M6 하네스 붉음을 회귀로 오독한다
  - 관련 결정: `insuniverse-docs-50-domain-m7`
  - 가능성: 중
  - 완화책: 검사 `#12` 가 붉은 집합과 계획서 지정 사유를 문자열로 대조한다. 붉음 자체는 금지하지 않는다
  - 다음 액션: `/codex:rescue "리스크 완화: M6 하네스 붉음을 회귀로 오독한다, 제안 mitigation: 검사 #12 가 붉은 집합과 계획서 지정 사유를 문자열로 대조한다. 붉음 자체는 금지하지 않는다"`
- 🟡 **MEDIUM** · 동결 838행이 흐름 서술 변경마다 깨진다
  - 관련 결정: `insuniverse-docs-50-domain-m7`
  - 가능성: 낮음
  - 완화책: 이 창은 문서를 고치지 않는 것이 기본이다. `#7` 이 미성립을 내 문서를 고치면 동결을 다시 뜨고 `#10` 이 그 변경을 이름으로 낸다
  - 다음 액션: `/codex:rescue "리스크 완화: 동결 838행이 흐름 서술 변경마다 깨진다, 제안 mitigation: 이 창은 문서를 고치지 않는 것이 기본이다. #7 이 미성립을 내 문서를 고치면 동결을 다시 뜨고 #10 이 그 변경을 이름으로 낸다"`
- 🟡 **MEDIUM** · 정본만 고치고 사본을 안 고쳐 `--update` 가 막힌다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m1`
  - 가능성: 중
  - 완화책: Task 2·3 을 한 창에서 끝낸다. 3단계 경로의 정상 중간 상태이고 검사 `#1` 이 그 자리를 이름으로 지목한다(G5 실측)
  - 다음 액션: `/codex:rescue "리스크 완화: 정본만 고치고 사본을 안 고쳐 --update 가 막힌다, 제안 mitigation: Task 2·3 을 한 창에서 끝낸다. 3단계 경로의 정상 중간 상태이고 검사 #1 이 그 자리를 이름으로 지목한다(G5 실측)"`
- 🟡 **MEDIUM** · 이월분 backlog 기록이 `--update` 뒤로 밀려 최종 게이트가 붉어진다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m1`
  - 가능성: 중
  - 완화책: Task 5 가 이월 기록을 `--update` 앞에 둔다. 검사 `#7` 이 `fixtask.cohort_*` 를 기대 집합에 조건부로 담는다(G14)
  - 다음 액션: `/codex:rescue "리스크 완화: 이월분 backlog 기록이 --update 뒤로 밀려 최종 게이트가 붉어진다, 제안 mitigation: Task 5 가 이월 기록을 --update 앞에 둔다. 검사 #7 이 fixtask.cohort_* 를 기대 집합에 조건부로 담는다(G14)"`
- 🟡 **MEDIUM** · PRD 4열 위임 표를 정본 6열에 그대로 붙여 13 의 8행이 깨진다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m1`
  - 가능성: 중
  - 완화책: 검사 `#3` 이 열 수와 기존 행 보존을 함께 본다. `없으면` 열은 표에 싣지 않는다
  - 다음 액션: `/codex:rescue "리스크 완화: PRD 4열 위임 표를 정본 6열에 그대로 붙여 13 의 8행이 깨진다, 제안 mitigation: 검사 #3 이 열 수와 기존 행 보존을 함께 본다. 없으면 열은 표에 싣지 않는다"`
- 🟡 **MEDIUM** · §개정 위임·§회부 인계가 저장소 게이트 밖이라 주장만 남는다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m1`
  - 가능성: **높음**
  - 완화책: 그 둘이 이 계획서 하네스의 존재 이유다(G6·G7). 하네스가 없으면 검사 `#8` 이 먼저 떨어진다
  - 다음 액션: `/codex:rescue "리스크 완화: §개정 위임·§회부 인계가 저장소 게이트 밖이라 주장만 남는다, 제안 mitigation: 그 둘이 이 계획서 하네스의 존재 이유다(G6·G7). 하네스가 없으면 검사 #8 이 먼저 떨어진다"`
- 🟡 **MEDIUM** · 위임 사유를 넘겨 `verify.sh` 나 doc-kit 을 고친다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m1`
  - 가능성: 중
  - 완화책: §NOT Building 에 인수처와 함께 적었다. `git diff --name-only` 가 §Files to Change 9경로 밖을 내면 흡수 전에 멈춘다
  - 다음 액션: `/codex:rescue "리스크 완화: 위임 사유를 넘겨 verify.sh 나 doc-kit 을 고친다, 제안 mitigation: §NOT Building 에 인수처와 함께 적었다. git diff --name-only 가 §Files to Change 9경로 밖을 내면 흡수 전에 멈춘다"`
- 🟡 **MEDIUM** · `04-ops-intent.md` 가 트리에만 있고 오래 비어 있다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m1`
  - 가능성: 중
  - 완화책: 회부가 요구한 상태다(UI9). 트리 등재가 곧 자리이며 값은 `ops-30-reconcile` M1~M4 를 기다린다
  - 다음 액션: `/codex:rescue "리스크 완화: 04-ops-intent.md 가 트리에만 있고 오래 비어 있다, 제안 mitigation: 회부가 요구한 상태다(UI9). 트리 등재가 곧 자리이며 값은 ops-30-reconcile M1~M4 를 기다린다"`
- 🟡 **MEDIUM** · 유예 원소 파일명(`legacy-admin-view.md`)이 트리와 어긋난 채 M2 로 넘어간다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m1`
  - 가능성: 중
  - 완화책: G16 을 findings 로 남긴다. 판정은 M2 실측이며 검사 `#6` 이 M1 동안 그 파일이 생기지 않음을 본다
  - 다음 액션: `/codex:rescue "리스크 완화: 유예 원소 파일명(legacy-admin-view.md)이 트리와 어긋난 채 M2 로 넘어간다, 제안 mitigation: G16 을 findings 로 남긴다. 판정은 M2 실측이며 검사 #6 이 M1 동안 그 파일이 생기지 않음을 본다"`
- 🟡 **MEDIUM** · 서브모듈 미초기화 상태로 `--update` 를 돌려 `actual_head` 가 빈 채 동결된다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m1`
  - 가능성: 낮
  - 완화책: Task 0 이 조작 전에 읽기만으로 판정하고, 셋 중 하나라도 거짓일 때만 초기화한다(INV2)
  - 다음 액션: `/codex:rescue "리스크 완화: 서브모듈 미초기화 상태로 --update 를 돌려 actual_head 가 빈 채 동결된다, 제안 mitigation: Task 0 이 조작 전에 읽기만으로 판정하고, 셋 중 하나라도 거짓일 때만 초기화한다(INV2)"`
- 🟡 **MEDIUM** · **R-4 가 문면 계약으로만 남아 M2 가 SHA 없이 발행한다**
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m1`
  - 가능성: 중
  - 완화책: lint 는 `id` 만 본다(G18). 검사 `#10` 이 4필드의 존재·형태를 지고 fixture 4종이 그 이빨을 준다. 상시 층 승격은 위임 확장이 필요하며 §NOT Building 에 인수처를 적었다
  - 다음 액션: `/codex:rescue "리스크 완화: R-4 가 문면 계약으로만 남아 M2 가 SHA 없이 발행한다, 제안 mitigation: lint 는 id 만 본다(G18). 검사 #10 이 4필드의 존재·형태를 지고 fixture 4종이 그 이빨을 준다. 상시 층 승격은 위임 확장이 필요하며 §NOT Building 에 인수처를 적었다"`
- 🟡 **MEDIUM** · **M2 가 유예 원소를 못 닫아 그 마일스톤이 멈춘다**
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m1`
  - 가능성: **중**
  - 완화책: 계약은 도달 가능하고(G20) 막힌 자리는 `verify.sh` 스테이징 목록이다(G21). 검사 `#6` 의 양면 프로브가 둘을 갈라 보여 주고, Task 5 가 metric 셀에 선행조건과 §Open Questions 를 단다. 해소 경로 둘 다 위임 밖이라 승인은 사용자 몫이다
  - 다음 액션: `/codex:rescue "리스크 완화: M2 가 유예 원소를 못 닫아 그 마일스톤이 멈춘다, 제안 mitigation: 계약은 도달 가능하고(G20) 막힌 자리는 verify.sh 스테이징 목록이다(G21). 검사 #6 의 양면 프로브가 둘을 갈라 보여 주고, Task 5 가 metric 셀에 선행조건과 §Open Questions 를 단다. 해소 경로 둘 다 위임 밖이라 승인은 사용자 몫이다"`
- 🟡 **MEDIUM** · **4필드 강제가 이 창에서 끝나고 M2 가 표준 검증만으로 초록이 된다**
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m1`
  - 가능성: **중**
  - 완화책: `#10` 은 계획서 하네스라 M1 과 함께 동결된다. Task 5 가 PRD M2 행 Outcome 에 그 실행을 인수 조건으로 박고 검사 `#11` 이 그 문장과 하네스 경로 실재를 본다
  - 다음 액션: `/codex:rescue "리스크 완화: 4필드 강제가 이 창에서 끝나고 M2 가 표준 검증만으로 초록이 된다, 제안 mitigation: #10 은 계획서 하네스라 M1 과 함께 동결된다. Task 5 가 PRD M2 행 Outcome 에 그 실행을 인수 조건으로 박고 검사 #11 이 그 문장과 하네스 경로 실재를 본다"`
- 🟡 **MEDIUM** · **위임 게이트가 같은 창의 PRD 를 기준 삼아 자기승인이 된다**
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m1`
  - 가능성: 중
  - 완화책: 검사 `#3` 이 워킹트리가 아니라 Task 0 기준선 커밋의 PRD blob 을 읽고, 그 커밋이 `ownership.md` 무편집임을 함께 본다. 이력 재작성으로 우회 가능한 잔여는 CI·보호 ref 부재 때문이며 backlog 와 `(미검증)` 로 남긴다
  - 다음 액션: `/codex:rescue "리스크 완화: 위임 게이트가 같은 창의 PRD 를 기준 삼아 자기승인이 된다, 제안 mitigation: 검사 #3 이 워킹트리가 아니라 Task 0 기준선 커밋의 PRD blob 을 읽고, 그 커밋이 ownership.md 무편집임을 함께 본다. 이력 재작성으로 우회 가능한 잔여는 CI·보호 ref 부재 때문이며 backlog 와 (미검증) 로 남긴다"`
- 🟡 **MEDIUM** · **Task 순서가 자기 게이트를 못 돌게 한다**
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m1`
  - 가능성: **중**
  - 완화책: 실제로 그랬다(Plan-Codex R3 F0). 트리 두 편집을 한 Task 로 합치고, golden 을 움직이는 편집을 전부 `--update` 와 같은 Task 에 모았다. `--check` 는 golden 재동결 뒤에만 부른다
  - 다음 액션: `/codex:rescue "리스크 완화: Task 순서가 자기 게이트를 못 돌게 한다, 제안 mitigation: 실제로 그랬다(Plan-Codex R3 F0). 트리 두 편집을 한 Task 로 합치고, golden 을 움직이는 편집을 전부 --update 와 같은 Task 에 모았다. --check 는 golden 재동결 뒤에만 부른다"`
- 🟡 **MEDIUM** · **계획이 지시한 성공 경로가 검사 `#7` 에 걸린다**
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m1`
  - 가능성: 중
  - 완화책: backlog 이월은 `cohort` 2키를 반드시 움직인다(G14). 기대 집합을 backlog 편집 여부로 조건부 확장하고 부분집합이 아니라 정확 집합으로 본다
  - 다음 액션: `/codex:rescue "리스크 완화: 계획이 지시한 성공 경로가 검사 #7 에 걸린다, 제안 mitigation: backlog 이월은 cohort 2키를 반드시 움직인다(G14). 기대 집합을 backlog 편집 여부로 조건부 확장하고 부분집합이 아니라 정확 집합으로 본다"`
- 🟡 **MEDIUM** · **재시작이 golden 감사 기준선을 지운다**
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m1`
  - 가능성: 중
  - 완화책: 기준선을 파일 스냅샷이 아니라 Task 0 커밋의 blob 으로 둔다 , 재시작이 덮어쓸 수 없다. 정확 집합 대조가 *빠진 변경*도 함께 잡는다
  - 다음 액션: `/codex:rescue "리스크 완화: 재시작이 golden 감사 기준선을 지운다, 제안 mitigation: 기준선을 파일 스냅샷이 아니라 Task 0 커밋의 blob 으로 둔다 , 재시작이 덮어쓸 수 없다. 정확 집합 대조가 *빠진 변경*도 함께 잡는다"`
- 🟡 **MEDIUM** · **원장이 합의되지 않은 계약과 실행되지 않은 인수를 완료로 적는다**
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m1`
  - 가능성: **중**
  - 완화책: R-4 셀은 발신 4필드와 60 이 정한 형태 제약을 갈라 적고 `sha` 형태가 이 PRD 결정임을 밝힌다(G23). R-8 셀은 `자리 확정` 이고 문서는 M6 이다. 검사 `#4` 가 두 문면을 본다
  - 다음 액션: `/codex:rescue "리스크 완화: 원장이 합의되지 않은 계약과 실행되지 않은 인수를 완료로 적는다, 제안 mitigation: R-4 셀은 발신 4필드와 60 이 정한 형태 제약을 갈라 적고 sha 형태가 이 PRD 결정임을 밝힌다(G23). R-8 셀은 자리 확정 이고 문서는 M6 이다. 검사 #4 가 두 문면을 본다"`
- 🟡 **MEDIUM** · **아무도 안 가리키는 발행 id 가 조용히 사라진다**
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m1`
  - 가능성: 중
  - 완화책: G9 는 참조된 id 만 지킨다(G22). `#10` 이 직전 커밋의 발행 집합을 읽어 부분집합을 요구한다 , 삭제·rename 이 이름으로 떨어진다
  - 다음 액션: `/codex:rescue "리스크 완화: 아무도 안 가리키는 발행 id 가 조용히 사라진다, 제안 mitigation: G9 는 참조된 id 만 지킨다(G22). #10 이 직전 커밋의 발행 집합을 읽어 부분집합을 요구한다 , 삭제·rename 이 이름으로 떨어진다"`
- 🟡 **MEDIUM** · **이월 항목이 받을 곳 없이 영구 고아가 된다**
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m1`
  - 가능성: 중
  - 완화책: 인수처를 활성 PRD 의 명명된 마일스톤(이 PRD 의 M2 · M6)으로 바꾸고, `00-protocol` 재개봉을 인수처에서 뺐다(UI7). 받을 곳이 없는 항목은 그렇게 적는다
  - 다음 액션: `/codex:rescue "리스크 완화: 이월 항목이 받을 곳 없이 영구 고아가 된다, 제안 mitigation: 인수처를 활성 PRD 의 명명된 마일스톤(이 PRD 의 M2 · M6)으로 바꾸고, 00-protocol 재개봉을 인수처에서 뺐다(UI7). 받을 곳이 없는 항목은 그렇게 적는다"`
- 🟡 **MEDIUM** · **인덱스의 `deprecated-confirmed` 를 PRD 확정으로 오인해 미확증 노드를 발행한다**
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m2`
  - 가능성: **높음**
  - 완화책: 실제로 초안이 그랬다(Plan-Codex R1 F1). 근거식이 *삭제 커밋 prod 미도달* 이고 전 행이 `requires_corroboration: true` 다(G21·G22). Task 2 가 원장을 소비자 소유로 두고 `#6` 이 인덱스 status 를 확정 근거로 쓰지 못하게 한다
  - 다음 액션: `/codex:rescue "리스크 완화: 인덱스의 deprecated-confirmed 를 PRD 확정으로 오인해 미확증 노드를 발행한다, 제안 mitigation: 실제로 초안이 그랬다(Plan-Codex R1 F1). 근거식이 *삭제 커밋 prod 미도달* 이고 전 행이 requires_corroboration: true 다(G21·G22). Task 2 가 원장을 소비자 소유로 두고 #6 이 인덱스 status 를 확정 근거로 쓰지 못하게 한다"`
- 🟡 **MEDIUM** · **발행 차단 이월을 안 닫고 문서를 발행해 게이트가 붉어진다**
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m2`
  - 가능성: **높음**
  - 완화책: M1 이 심은 자리다(G4). Task 2 가 Task 3 앞이고 `#4` 가 닫힘 표식의 **형태와 사유 문면**을 함께 본다
  - 다음 액션: `/codex:rescue "리스크 완화: 발행 차단 이월을 안 닫고 문서를 발행해 게이트가 붉어진다, 제안 mitigation: M1 이 심은 자리다(G4). Task 2 가 Task 3 앞이고 #4 가 닫힘 표식의 형태와 사유 문면을 함께 본다"`
- 🟡 **MEDIUM** · **유예 스펠링을 잘못 골라 두 표면 중 하나가 붉어진다**
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m2`
  - 가능성: **높음**
  - 완화책: 실측이 답을 좁혔다(G8·G9) , `../X/…` 만 두 키가 같다. `#2` 가 키트 selftest 와 스테이징 재현을 **둘 다** 돌린다. `good-supersedes-absent.md` 누락은 실제로 재현된 실패다(G10)
  - 다음 액션: `/codex:rescue "리스크 완화: 유예 스펠링을 잘못 골라 두 표면 중 하나가 붉어진다, 제안 mitigation: 실측이 답을 좁혔다(G8·G9) , ../X/… 만 두 키가 같다. #2 가 키트 selftest 와 스테이징 재현을 둘 다 돌린다. good-supersedes-absent.md 누락은 실제로 재현된 실패다(G10)"`
- 🟡 **MEDIUM** · **R-4 에 5번째 필드를 더해 계약을 조용히 개정한다**
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m2`
  - 가능성: **중**
  - 완화책: 초안이 그랬다(Plan-Codex R1 F0). 수용 셀이 발신 계약을 4필드로 못 박는다(G20). 결속을 본문 원장으로 옮겨 필요 자체를 없앴고 §NOT Building 이 그것을 이월이 아니라 해소로 적는다
  - 다음 액션: `/codex:rescue "리스크 완화: R-4 에 5번째 필드를 더해 계약을 조용히 개정한다, 제안 mitigation: 초안이 그랬다(Plan-Codex R1 F0). 수용 셀이 발신 계약을 4필드로 못 박는다(G20). 결속을 본문 원장으로 옮겨 필요 자체를 없앴고 §NOT Building 이 그것을 이월이 아니라 해소로 적는다"`
- 🟡 **MEDIUM** · **sha 검사가 자기정합에 그쳐 이월이 거짓으로 닫힌다**
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m2`
  - 가능성: **중**
  - 완화책: 초안이 그랬다(Plan-Codex R1 F2). `#5` 가 manifest 3저장소로 제한하고 `cat-file -e` + 단축 해석 일치까지 본다. 서브모듈을 못 읽으면 **통과가 아니라 실패**이고 이월을 닫지 않는다
  - 다음 액션: `/codex:rescue "리스크 완화: sha 검사가 자기정합에 그쳐 이월이 거짓으로 닫힌다, 제안 mitigation: 초안이 그랬다(Plan-Codex R1 F2). #5 가 manifest 3저장소로 제한하고 cat-file -e + 단축 해석 일치까지 본다. 서브모듈을 못 읽으면 통과가 아니라 실패이고 이월을 닫지 않는다"`
- 🟡 **MEDIUM** · **사용자 확인 없이 확정 2건이 발행된다**
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m2`
  - 가능성: **중**
  - 완화책: UI9 가 확인을 필터의 대체가 아니라 추가 조건으로 둔다. `#6` 이 확인 표식 없는 행의 발행을 이름으로 떨어뜨린다
  - 다음 액션: `/codex:rescue "리스크 완화: 사용자 확인 없이 확정 2건이 발행된다, 제안 mitigation: UI9 가 확인을 필터의 대체가 아니라 추가 조건으로 둔다. #6 이 확인 표식 없는 행의 발행을 이름으로 떨어뜨린다"`
- 🟡 **MEDIUM** · **M2 를 좁혔는데 `check10` 요구가 두 경로로 남는다**
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m2`
  - 가능성: **중**
  - 완화책: 요구 경로는 Milestone 셀의 백틱 이름에서 유도된다(G5). Task 4 가 셀을 먼저 좁히고 `#9` 가 백틱 경로가 1건임을 본다
  - 다음 액션: `/codex:rescue "리스크 완화: M2 를 좁혔는데 check10 요구가 두 경로로 남는다, 제안 mitigation: 요구 경로는 Milestone 셀의 백틱 이름에서 유도된다(G5). Task 4 가 셀을 먼저 좁히고 #9 가 백틱 경로가 1건임을 본다"`
- 🟡 **MEDIUM** · **2b 행이 번호로 진입 불가라 영구히 착수되지 않는다**
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m2`
  - 가능성: **중**
  - 완화책: `#` 가 `2b` 라 mccp 마일스톤 선택이 정수로 못 찾는다. Task 4 가 PRD §Delivery Milestones 도입 문단에 **이름 부분일치로 지정한다**를 적는다. `#9` 가 2b 행의 존재와 Outcome 문면을 본다
  - 다음 액션: `/codex:rescue "리스크 완화: 2b 행이 번호로 진입 불가라 영구히 착수되지 않는다, 제안 mitigation: # 가 2b 라 mccp 마일스톤 선택이 정수로 못 찾는다. Task 4 가 PRD §Delivery Milestones 도입 문단에 이름 부분일치로 지정한다를 적는다. #9 가 2b 행의 존재와 Outcome 문면을 본다"`
- 🟡 **MEDIUM** · **M1 `check3` 이 붉어지는 것을 결함으로 오인해 M1 하네스를 고친다**
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m2`
  - 가능성: **중**
  - 완화책: 설계된 결과다(G13). §NOT Building 과 Acceptance 양쪽에 관측으로 적는다
  - 다음 액션: `/codex:rescue "리스크 완화: M1 check3 이 붉어지는 것을 결함으로 오인해 M1 하네스를 고친다, 제안 mitigation: 설계된 결과다(G13). §NOT Building 과 Acceptance 양쪽에 관측으로 적는다"`
- 🟡 **MEDIUM** · **Task 4 순서가 뒤집혀 `check10` 이 요구가 꺼진 채 초록이 된다**
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m2`
  - 가능성: **중**
  - 완화책: PRD Status 를 먼저 올린 뒤 호출한다. `#10` 이 rc 뿐 아니라 출력의 `실 대상 <n>파일` 이 0이 아님을 함께 본다
  - 다음 액션: `/codex:rescue "리스크 완화: Task 4 순서가 뒤집혀 check10 이 요구가 꺼진 채 초록이 된다, 제안 mitigation: PRD Status 를 먼저 올린 뒤 호출한다. #10 이 rc 뿐 아니라 출력의 실 대상 <n>파일 이 0이 아님을 함께 본다"`
- 🟡 **MEDIUM** · **표에 계수 리터럴이 박혀 인덱스와 발산한다**
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m2`
  - 가능성: 중
  - 완화책: INV4. `#11` 이 문서의 수를 인덱스에서 다시 세어 대조한다. 외부 기준 대조라 자기 단언이 아니다
  - 다음 액션: `/codex:rescue "리스크 완화: 표에 계수 리터럴이 박혀 인덱스와 발산한다, 제안 mitigation: INV4. #11 이 문서의 수를 인덱스에서 다시 세어 대조한다. 외부 기준 대조라 자기 단언이 아니다"`
- 🟡 **MEDIUM** · **backlog 편집이 `--update` 뒤로 밀려 최종 게이트가 붉어진다**
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m2`
  - 가능성: 중
  - 완화책: Task 5 가 이월 기록을 `--update` 앞에 둔다. `#7` 기대 집합이 `cohort` 2키를 확정으로 담는다
  - 다음 액션: `/codex:rescue "리스크 완화: backlog 편집이 --update 뒤로 밀려 최종 게이트가 붉어진다, 제안 mitigation: Task 5 가 이월 기록을 --update 앞에 둔다. #7 기대 집합이 cohort 2키를 확정으로 담는다"`
- 🟡 **MEDIUM** · **재시작이 golden 감사 기준선을 지운다**
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m2`
  - 가능성: 중
  - 완화책: 기준선을 파일 스냅샷이 아니라 Task 0 커밋의 blob 으로 둔다. 정확 집합 대조가 *빠진 변경* 도 함께 잡는다
  - 다음 액션: `/codex:rescue "리스크 완화: 재시작이 golden 감사 기준선을 지운다, 제안 mitigation: 기준선을 파일 스냅샷이 아니라 Task 0 커밋의 blob 으로 둔다. 정확 집합 대조가 *빠진 변경* 도 함께 잡는다"`
- 🟡 **MEDIUM** · **위임 게이트가 같은 창의 PRD 를 기준 삼아 자기승인이 된다**
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m2`
  - 가능성: 중
  - 완화책: `#3` 이 Task 0 커밋의 PRD blob 을 읽고 그 커밋이 `ownership.md` 무편집임을 함께 본다. 이력 재작성 잔여는 CI·보호 ref 부재 탓이며 backlog 와 `(미검증)` 로 남긴다
  - 다음 액션: `/codex:rescue "리스크 완화: 위임 게이트가 같은 창의 PRD 를 기준 삼아 자기승인이 된다, 제안 mitigation: #3 이 Task 0 커밋의 PRD blob 을 읽고 그 커밋이 ownership.md 무편집임을 함께 본다. 이력 재작성 잔여는 CI·보호 ref 부재 탓이며 backlog 와 (미검증) 로 남긴다"`
- 🟡 **MEDIUM** · **위임 경로를 doc-kit 전체로 넓혀 `lint-docs.mjs` 까지 열린다**
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m2`
  - 가능성: 중
  - 완화책: 6행째 경로를 `examples/**` 로 좁힌다. `#3` 이 경로 셀을 PRD blob 과 exact 대조한다
  - 다음 액션: `/codex:rescue "리스크 완화: 위임 경로를 doc-kit 전체로 넓혀 lint-docs.mjs 까지 열린다, 제안 mitigation: 6행째 경로를 examples/** 로 좁힌다. #3 이 경로 셀을 PRD blob 과 exact 대조한다"`
- 🟡 **MEDIUM** · **형제가 확정 밖의 폐기를 가리키려는데 노드가 없다**
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m2`
  - 가능성: 중
  - 완화책: 유예 경로(`config.deferred_ref_targets`)가 그 자리를 받는다 , 형제가 원소를 선언하면 lint 가 통과하고, 이 PRD 가 2b·M7 에서 판정해 발행하면 그때 원소를 닫는다. M2 가 미판정을 앞당겨 발행하지 않는다(UI8)
  - 다음 액션: `/codex:rescue "리스크 완화: 형제가 확정 밖의 폐기를 가리키려는데 노드가 없다, 제안 mitigation: 유예 경로(config.deferred_ref_targets)가 그 자리를 받는다 , 형제가 원소를 선언하면 lint 가 통과하고, 이 PRD 가 2b·M7 에서 판정해 발행하면 그때 원소를 닫는다. M2 가 미판정을 앞당겨 발행하지 않는다(UI8)"`
- 🟡 **MEDIUM** · **독자가 8그룹 표를 폐기 목록으로 읽는다**
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m2`
  - 가능성: 중
  - 완화책: 문서 최상단 고지가 `deprecated[]` 는 5축 통과 + 사용자 확인분만이고 나머지 행은 관측이며 삭제 축은 2b 소관임을 적는다
  - 다음 액션: `/codex:rescue "리스크 완화: 독자가 8그룹 표를 폐기 목록으로 읽는다, 제안 mitigation: 문서 최상단 고지가 deprecated[] 는 5축 통과 + 사용자 확인분만이고 나머지 행은 관측이며 삭제 축은 2b 소관임을 적는다"`
- 🟡 **MEDIUM** · **착수 자체가 M2 `check9` 를 붉힌다** , `/mccp:plan` 이 `2b` Status 를 `in-progress` 로 올리는 순간 `st2b !== "pending"` 단언이 걸린다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m2b`
  - 가능성: **확정** (이미 발생)
  - 완화책: Task 1 이 첫 실행 Task 다. 그 사이 창은 계획 저작 ~ Task 1 사이이며 `check9` 는 상시 게이트가 아니라 계획서 로컬 하네스라 `verify.sh --check` 에는 안 실린다
  - 다음 액션: `/codex:rescue "리스크 완화: 착수 자체가 M2 check9 를 붉힌다 , /mccp:plan 이 2b Status 를 in-progress 로 올리는 순간 st2b !== \"pending\" 단언이 걸린다, 제안 mitigation: Task 1 이 첫 실행 Task 다. 그 사이 창은 계획 저작 ~ Task 1 사이이며 check9 는 상시 게이트가 아니라 계획서 로컬 하네스라 verify.sh --check 에는 안 실린다"`
- 🟡 **MEDIUM** · 사정거리를 좁힌 두 제외층이 실제로는 판정 대상을 버린다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m2b`
  - 가능성: 중
  - 완화책: 두 층 다 인덱스 자신의 문면이 근거다(`dead-candidates.yaml:30` 소비자 필터 요구 · `renamed_to` non-null). 검사 `#1` 이 **제외 계수를 각각 출력에 적어** 조용한 축소를 막는다
  - 다음 액션: `/codex:rescue "리스크 완화: 사정거리를 좁힌 두 제외층이 실제로는 판정 대상을 버린다, 제안 mitigation: 두 층 다 인덱스 자신의 문면이 근거다(dead-candidates.yaml:30 소비자 필터 요구 · renamed_to non-null). 검사 #1 이 제외 계수를 각각 출력에 적어 조용한 축소를 막는다"`
- 🟡 **MEDIUM** · `unknown` 331행이 "안 재봤다" 로 읽힌다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m2b`
  - 가능성: 중
  - 완화책: 검사 `#2` 가 세 축의 앵커 **총수와 교집합**을 둘 다 찍는다. 총수 0은 실패로 떨어뜨려 파서 파손이 교집합 0으로 위장하는 자리를 막는다
  - 다음 액션: `/codex:rescue "리스크 완화: unknown 331행이 \"안 재봤다\" 로 읽힌다, 제안 mitigation: 검사 #2 가 세 축의 앵커 총수와 교집합을 둘 다 찍는다. 총수 0은 실패로 떨어뜨려 파서 파손이 교집합 0으로 위장하는 자리를 막는다"`
- 🟡 **MEDIUM** · 예시 판정 1건을 331행의 표본으로 오독
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m2b`
  - 가능성: 중
  - 완화책: §GROUND 와 findings 양쪽이 *이 성질이 증명된 것은 이 그룹뿐* 을 명시한다. 검사 `#1` 의 분해 계수가 331 을 `unknown` 전용으로 따로 센다
  - 다음 액션: `/codex:rescue "리스크 완화: 예시 판정 1건을 331행의 표본으로 오독, 제안 mitigation: §GROUND 와 findings 양쪽이 *이 성질이 증명된 것은 이 그룹뿐* 을 명시한다. 검사 #1 의 분해 계수가 331 을 unknown 전용으로 따로 센다"`
- 🟡 **MEDIUM** · M2 `check9` 개정이 단언을 옮기는 대신 지운다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m2b`
  - 가능성: 중
  - 완화책: 검사 `#8` 이 3방향 반사실이다 , 개정 전에는 통과였던 `complete`+미발행이 rc 1 이 되고, 기존 이빨(2b 행 삭제)은 그대로 rc 1 이다
  - 다음 액션: `/codex:rescue "리스크 완화: M2 check9 개정이 단언을 옮기는 대신 지운다, 제안 mitigation: 검사 #8 이 3방향 반사실이다 , 개정 전에는 통과였던 complete+미발행이 rc 1 이 되고, 기존 이빨(2b 행 삭제)은 그대로 rc 1 이다"`
- 🟡 **MEDIUM** · Task 0 기준선 앵커가 변경 창 안이다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m2b`
  - 가능성: **확정**
  - 완화책: `id=60m1-anchor`·`id=60m2-anchor` 와 같은 부류. 저장소에 CI 도 보호 ref 도 없어 구조적 미해소이며 Task 6 이 `id=60m2b-anchor` 로 이월한다. 없는 앵커를 있는 척 검사하지 않는다(INV4)
  - 다음 액션: `/codex:rescue "리스크 완화: Task 0 기준선 앵커가 변경 창 안이다, 제안 mitigation: id=60m1-anchor·id=60m2-anchor 와 같은 부류. 저장소에 CI 도 보호 ref 도 없어 구조적 미해소이며 Task 6 이 id=60m2b-anchor 로 이월한다. 없는 앵커를 있는 척 검사하지 않는다(INV4)"`
- 🟡 **MEDIUM** · 인수처가 `2b` 로 적힌 이월 2건이 안 닫혀 원장이 늘기만 한다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m2b`
  - 가능성: 중
  - 완화책: 검사 `#7` 이 두 id 를 이름으로 확인하고 미해소 사유를 요구한다. 닫히는 조건(실 발행)이 이 창에 없다는 사실이 원장에 남는다
  - 다음 액션: `/codex:rescue "리스크 완화: 인수처가 2b 로 적힌 이월 2건이 안 닫혀 원장이 늘기만 한다, 제안 mitigation: 검사 #7 이 두 id 를 이름으로 확인하고 미해소 사유를 요구한다. 닫히는 조건(실 발행)이 이 창에 없다는 사실이 원장에 남는다"`
- 🟡 **MEDIUM** · golden 기대가 형제 창 병합 델타를 못 본다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m2b`
  - 가능성: 중
  - 완화책: `id=60m2-merge-delta` 와 같은 축. 검사 `#6` 은 기대 **집합** 대조라 기대 밖 키를 이름으로 떨어뜨린다 , 병합이 들어오면 조용히 통과하지 않고 붉어져 사람이 판정한다
  - 다음 액션: `/codex:rescue "리스크 완화: golden 기대가 형제 창 병합 델타를 못 본다, 제안 mitigation: id=60m2-merge-delta 와 같은 축. 검사 #6 은 기대 집합 대조라 기대 밖 키를 이름으로 떨어뜨린다 , 병합이 들어오면 조용히 통과하지 않고 붉어져 사람이 판정한다"`
- 🟡 **MEDIUM** · **비발행 선언 토큰이 문자열 매치라 우회된다**
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m2c`
  - 가능성: 높음
  - 완화책: 층위 6 이다. 토큰 하나로는 안 걸고 `2r` 행 `complete` 를 함께 문다(`#3`) , 확정 0을 증명한 창이 닫혀 있어야 방향이 뒤집힌다. 잔여는 인정하고 이월로 올린다: 토큰을 문면에서 지우면 방향이 발행 요구로 돌아가 오히려 붉어지므로 **완화 방향의 우회는 닫혀 있고** 강화 방향만 열려 있다
  - 다음 액션: `/codex:rescue "리스크 완화: 비발행 선언 토큰이 문자열 매치라 우회된다, 제안 mitigation: 층위 6 이다. 토큰 하나로는 안 걸고 2r 행 complete 를 함께 문다(#3) , 확정 0을 증명한 창이 닫혀 있어야 방향이 뒤집힌다. 잔여는 인정하고 이월로 올린다: 토큰을 문면에서 지우면 방향이 발행 요구로 돌아가 오히려 붉어지므로 완화 방향의 우회는 닫혀 있고 강화 방향만 열려 있다"`
- 🟡 **MEDIUM** · 네 하네스 중 하나만 고쳐 부분 초록이 된다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m2c`
  - 가능성: 중
  - 완화책: `#7` 이 넷을 전건 완주시킨다. 한 곳이라도 붉으면 `#7` 이 그 이름과 rc 를 찍는다
  - 다음 액션: `/codex:rescue "리스크 완화: 네 하네스 중 하나만 고쳐 부분 초록이 된다, 제안 mitigation: #7 이 넷을 전건 완주시킨다. 한 곳이라도 붉으면 #7 이 그 이름과 rc 를 찍는다"`
- 🟡 **MEDIUM** · M1 하네스를 고치는 것이 M1 창의 봉인을 건드린다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m2c`
  - 가능성: 중
  - 완화책: 마일스톤 3 이 M1 `check6` 에 같은 수술을 한 선례가 있다(`#11` 이 3방향 반사실로 옮김과 삭제를 구별). `gates.mjs` 는 `planAwareMarkdownHash` 사정거리 밖이라 receipt 체인은 안 움직인다
  - 다음 액션: `/codex:rescue "리스크 완화: M1 하네스를 고치는 것이 M1 창의 봉인을 건드린다, 제안 mitigation: 마일스톤 3 이 M1 check6 에 같은 수술을 한 선례가 있다(#11 이 3방향 반사실로 옮김과 삭제를 구별). gates.mjs 는 planAwareMarkdownHash 사정거리 밖이라 receipt 체인은 안 움직인다"`
- 🟡 **MEDIUM** · 프로브가 실 PRD 를 훼손하고 못 되돌린다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m2c`
  - 가능성: 중
  - 완화책: 사본으로만 돈다. 실 파일을 건드려야 하는 프로브는 `trap` 으로 복원하고 **복원 후 양성 재실행**까지 검사에 넣는다
  - 다음 액션: `/codex:rescue "리스크 완화: 프로브가 실 PRD 를 훼손하고 못 되돌린다, 제안 mitigation: 사본으로만 돈다. 실 파일을 건드려야 하는 프로브는 trap 으로 복원하고 복원 후 양성 재실행까지 검사에 넣는다"`
- 🟡 **MEDIUM** · 적대 리뷰 0라운드
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m2c`
  - 가능성: **확정**
  - 완화책: 전역 `MCCP_CODEX_DISABLED=1` + Agent 툴 금지로 Codex·L2 패널·santa-loop 세 경로가 다 닫혀 있다. 이 창도 형식 검사만 받는다. 사실로 기록하고 넘어간다 , 완화책이 없다
  - 다음 액션: `/codex:rescue "리스크 완화: 적대 리뷰 0라운드, 제안 mitigation: 전역 MCCP_CODEX_DISABLED=1 + Agent 툴 금지로 Codex·L2 패널·santa-loop 세 경로가 다 닫혀 있다. 이 창도 형식 검사만 받는다. 사실로 기록하고 넘어간다 , 완화책이 없다"`
- 🟡 **MEDIUM** · 이 창이 발행 차단 이월을 닫고 싶어진다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m2c`
  - 가능성: 낮
  - 완화책: `#8` 이 닫힘 표식을 거부한다. 두 건은 archived PRD 소유라 개정 위임 확장이 선행이다
  - 다음 액션: `/codex:rescue "리스크 완화: 이 창이 발행 차단 이월을 닫고 싶어진다, 제안 mitigation: #8 이 닫힘 표식을 거부한다. 두 건은 archived PRD 소유라 개정 위임 확장이 선행이다"`
- ⚪ **높음** · 원장 축 값을 근거 없이 채운다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m2r`
  - 영향: 높음
  - 가능성: 중
  - 완화책: `#1` 이 축 셀마다 경로 토큰을 뽑아 `exists()` 로 전건 확인한다. 앵커 없는 축은 이름으로 떨어진다
  - 다음 액션: `/codex:rescue "리스크 완화: 원장 축 값을 근거 없이 채운다, 제안 mitigation: #1 이 축 셀마다 경로 토큰을 뽑아 exists() 로 전건 확인한다. 앵커 없는 축은 이름으로 떨어진다"`
- ⚪ **높음** · M2 행을 complete 로 올려 `check10` 이 붉어진다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m2r`
  - 영향: 높음
  - 가능성: 중
  - 완화책: `#3` 이 M2 Status 를 `pending` 으로 못 박고, `#6` 위임 `check10` 이 같은 축을 다시 본다
  - 다음 액션: `/codex:rescue "리스크 완화: M2 행을 complete 로 올려 check10 이 붉어진다, 제안 mitigation: #3 이 M2 Status 를 pending 으로 못 박고, #6 위임 check10 이 같은 축을 다시 본다"`
- ⚪ **중** · `2r` 행 신설이 다른 소비자의 마일스톤 표 파싱을 깬다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m2r`
  - 영향: 중
  - 가능성: 낮
  - 완화책: 표 헤더 5열은 그대로다. `#6` 위임 `check9` 가 `2`·`2b` 행을 이름으로 다시 찾는다
  - 다음 액션: `/codex:rescue "리스크 완화: 2r 행 신설이 다른 소비자의 마일스톤 표 파싱을 깬다, 제안 mitigation: 표 헤더 5열은 그대로다. #6 위임 check9 가 2·2b 행을 이름으로 다시 찾는다"`
- ⚪ **중** · 확정 0건을 "판정 못 함" 으로 오독한다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m2r`
  - 영향: 중
  - 가능성: 중
  - 완화책: 원장 8행이 전부 최소 1축 `fail` 이고 `#1` 이 그 사실을 출력에 적는다. F-07 이 같은 관측을 저장소에 남긴다
  - 다음 액션: `/codex:rescue "리스크 완화: 확정 0건을 \"판정 못 함\" 으로 오독한다, 제안 mitigation: 원장 8행이 전부 최소 1축 fail 이고 #1 이 그 사실을 출력에 적는다. F-07 이 같은 관측을 저장소에 남긴다"`
- ⚪ **높음** · `60m2-revert-filters-fail` 을 닫으면서 M1 이월 2건까지 닫는다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m2r`
  - 영향: 높음
  - 가능성: 중
  - 완화책: `#2` 가 세 id 를 각각 이름으로 판정한다 , 닫힘 1 · 열림 2 를 정확 집합으로 본다
  - 다음 액션: `/codex:rescue "리스크 완화: 60m2-revert-filters-fail 을 닫으면서 M1 이월 2건까지 닫는다, 제안 mitigation: #2 가 세 id 를 각각 이름으로 판정한다 , 닫힘 1 · 열림 2 를 정확 집합으로 본다"`
- ⚪ **중** · golden 델타가 기대 밖으로 벌어진다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m2r`
  - 영향: 중
  - 가능성: 중
  - 완화책: `#5` 가 부분집합이 아니라 정확 집합으로 본다. 형제 창 델타가 섞이면 이월로 닫고 기준선을 옮기지 않는다
  - 다음 액션: `/codex:rescue "리스크 완화: golden 델타가 기대 밖으로 벌어진다, 제안 mitigation: #5 가 부분집합이 아니라 정확 집합으로 본다. 형제 창 델타가 섞이면 이월로 닫고 기준선을 옮기지 않는다"`
- ⚪ **낮** · M2 하네스 `#3`·`#7` 이 붉은 채로 남는다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m2r`
  - 영향: 낮
  - 가능성: **확정**
  - 완화책: 이미 발생했고 backlog 에 있다. `#6` 이 미실행 2건을 사유와 함께 출력한다 , 조용한 초록이 되지 않는다
  - 다음 액션: `/codex:rescue "리스크 완화: M2 하네스 #3·#7 이 붉은 채로 남는다, 제안 mitigation: 이미 발생했고 backlog 에 있다. #6 이 미실행 2건을 사유와 함께 출력한다 , 조용한 초록이 되지 않는다"`
- ⚪ ****높음**** · 구현자가 필터 4 오버라이드 2칸을 인덱스 `state` 에 맞춰 "고친다"
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m2r`
  - 영향: **높음**
  - 가능성: 중
  - 완화책: 행 `8e03420` 의 유일한 fail 이 사라져 이 창의 중심 주장이 무너진다. `#1` 의 *행마다 fail ≥ 1* 이 그 자리를 잡고, 원장 아래 주석이 왜 그 행이 하중 행인지 적는다. `#8` 은 오버라이드 표기를 **요구**하지 제거를 허용하지 않는다
  - 다음 액션: `/codex:rescue "리스크 완화: 구현자가 필터 4 오버라이드 2칸을 인덱스 state 에 맞춰 \"고친다\", 제안 mitigation: 행 8e03420 의 유일한 fail 이 사라져 이 창의 중심 주장이 무너진다. #1 의 *행마다 fail ≥ 1* 이 그 자리를 잡고, 원장 아래 주석이 왜 그 행이 하중 행인지 적는다. #8 은 오버라이드 표기를 요구하지 제거를 허용하지 않는다"`
- ⚪ ****높음**** · SHA 열이 다원소 그룹에서 첫 원소만 담는다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m2r`
  - 영향: **높음**
  - 가능성: **높음**
  - 완화책: 실현된 적 있는 위험이다 , 계획 저작 시점 원장의 `26508c3`·`8e03420` 두 행이 `targets` 3원소 중 첫 원소만 담고 있었고, 그때 G13 은 다원소를 `3aa7570` 1건으로 적고 있어 이 손실을 가리켰다(santa R0 흡수). 해당 그룹은 `reverts` 1 · `targets` 5 다. `#8` 이 집합 대조라 누락이 `누락 <sha>` 로 떨어진다
  - 다음 액션: `/codex:rescue "리스크 완화: SHA 열이 다원소 그룹에서 첫 원소만 담는다, 제안 mitigation: 실현된 적 있는 위험이다 , 계획 저작 시점 원장의 26508c3·8e03420 두 행이 targets 3원소 중 첫 원소만 담고 있었고, 그때 G13 은 다원소를 3aa7570 1건으로 적고 있어 이 손실을 가리켰다(santa R0 흡수). 해당 그룹은 reverts 1 · targets 5 다. #8 이 집합 대조라 누락이 누락 <sha> 로 떨어진다"`
- ⚪ **중** · 필터 3 이 전건 `unknown` 이라 축 자체가 무의미해진다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m2r`
  - 영향: 중
  - 가능성: **확정**
  - 완화책: 이미 그 상태다(G16). 감추지 않고 `#8` 이 `필터3 0/8 기계확인` 을 찍는다. 축을 지우지는 않는다 , 5중 필터는 spec 계약이고 값이 바뀌는 창에서 검사가 살아 있어야 한다
  - 다음 액션: `/codex:rescue "리스크 완화: 필터 3 이 전건 unknown 이라 축 자체가 무의미해진다, 제안 mitigation: 이미 그 상태다(G16). 감추지 않고 #8 이 필터3 0/8 기계확인 을 찍는다. 축을 지우지는 않는다 , 5중 필터는 spec 계약이고 값이 바뀌는 창에서 검사가 살아 있어야 한다"`
- 🟡 **MEDIUM** · M1 `check6` 개정이 단언을 옮기는 대신 지운다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m3`
  - 가능성: 중
  - 완화책: 검사 `#11` 이 3방향 반사실이다 , 귀속 이빨과 부분집합 이빨을 각각 물리고, (a) 는 개정 후 실패 사유가 (2) 로 **바뀌었음**을 요구해 (1) 이 그냥 빠진 경우와 구별한다
  - 다음 액션: `/codex:rescue "리스크 완화: M1 check6 개정이 단언을 옮기는 대신 지운다, 제안 mitigation: 검사 #11 이 3방향 반사실이다 , 귀속 이빨과 부분집합 이빨을 각각 물리고, (a) 는 개정 후 실패 사유가 (2) 로 바뀌었음을 요구해 (1) 이 그냥 빠진 경우와 구별한다"`
- 🟡 **MEDIUM** · 발행이 다른 앞 창 하네스도 붉힌다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m3`
  - 가능성: 중
  - 완화책: m2·m2b 하네스에 `90-history` 참조가 0건임을 착수 전 실측했다. 새로 붉어지면 검사 `#13` 이 아니라 그 하네스가 이름을 낸다 , 이 창은 M1 하나만 수술하고 나머지는 이월로 올린다
  - 다음 액션: `/codex:rescue "리스크 완화: 발행이 다른 앞 창 하네스도 붉힌다, 제안 mitigation: m2·m2b 하네스에 90-history 참조가 0건임을 착수 전 실측했다. 새로 붉어지면 검사 #13 이 아니라 그 하네스가 이름을 낸다 , 이 창은 M1 하나만 수술하고 나머지는 이월로 올린다"`
- 🟡 **MEDIUM** · 257행 축자 대조가 사람 손 오타로 무한 루프
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m3`
  - 가능성: 중
  - 완화책: 문서는 손으로 쓰되 `#2`·`#3` 이 **양방향 집합 + 필드 축자**를 본다. 결손·초과를 각각 sha 로 이름 붙이므로 수정 위치가 출력에 직접 나온다
  - 다음 액션: `/codex:rescue "리스크 완화: 257행 축자 대조가 사람 손 오타로 무한 루프, 제안 mitigation: 문서는 손으로 쓰되 #2·#3 이 양방향 집합 + 필드 축자를 본다. 결손·초과를 각각 sha 로 이름 붙이므로 수정 위치가 출력에 직접 나온다"`
- 🟡 **MEDIUM** · `unknown` 이 "안 재봤다" 로 읽힌다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m3`
  - 가능성: 중
  - 완화책: 검사 `#5` 가 축별 앵커 총수와 교집합을 둘 다 찍고, 앵커 0 인 축을 *축 부재* 로 따로 센다. 총수 0 을 교집합 0 으로 접으면 실패다
  - 다음 액션: `/codex:rescue "리스크 완화: unknown 이 \"안 재봤다\" 로 읽힌다, 제안 mitigation: 검사 #5 가 축별 앵커 총수와 교집합을 둘 다 찍고, 앵커 0 인 축을 *축 부재* 로 따로 센다. 총수 0 을 교집합 0 으로 접으면 실패다"`
- 🟡 **MEDIUM** · `releases.yaml` 생성물의 결함이 그대로 문서로 간다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m3`
  - 가능성: 중
  - 완화책: 검사 `#4` 가 3저장소 git 으로 6개 rev-list 를 재유도한다 , 생성물이 아니라 원천과 대조하는 유일한 지점이다
  - 다음 액션: `/codex:rescue "리스크 완화: releases.yaml 생성물의 결함이 그대로 문서로 간다, 제안 mitigation: 검사 #4 가 3저장소 git 으로 6개 rev-list 를 재유도한다 , 생성물이 아니라 원천과 대조하는 유일한 지점이다"`
- 🟡 **MEDIUM** · locked tip 이 아니라 로컬 `refs/heads/prod` 로 재유도해 값이 갈린다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m3`
  - 가능성: **확정**
  - 완화책: 실측상 server·site 의 로컬 ref 가 이미 이동했고 admin 은 로컬 브랜치가 없다. `#4` 가 locked SHA 로만 풀고, `#1` 이 그 3상태를 문서 기술과 대조한다. F-12 가 사실을 남긴다
  - 다음 액션: `/codex:rescue "리스크 완화: locked tip 이 아니라 로컬 refs/heads/prod 로 재유도해 값이 갈린다, 제안 mitigation: 실측상 server·site 의 로컬 ref 가 이미 이동했고 admin 은 로컬 브랜치가 없다. #4 가 locked SHA 로만 풀고, #1 이 그 3상태를 문서 기술과 대조한다. F-12 가 사실을 남긴다"`
- 🟡 **MEDIUM** · 미수록 5건에 제목이 실려 INV5 를 깬다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m3`
  - 가능성: 중
  - 완화책: 검사 `#3` 이 그 절의 **열 수 2** 를 요구한다. 열이 늘면 sha 가 맞아도 실패다
  - 다음 액션: `/codex:rescue "리스크 완화: 미수록 5건에 제목이 실려 INV5 를 깬다, 제안 mitigation: 검사 #3 이 그 절의 열 수 2 를 요구한다. 열이 늘면 sha 가 맞아도 실패다"`
- 🟡 **MEDIUM** · Task 0 기준선 앵커가 변경 창 안이다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m3`
  - 가능성: **확정**
  - 완화책: `id=60m1-anchor`·`id=60m2-anchor`·`id=60m2b-anchor` 와 같은 부류. 저장소에 CI 도 보호 ref 도 없어 구조적 미해소이며 Task 9 가 `id=60m3-anchor` 로 이월한다. 없는 앵커를 있는 척 검사하지 않는다(INV4)
  - 다음 액션: `/codex:rescue "리스크 완화: Task 0 기준선 앵커가 변경 창 안이다, 제안 mitigation: id=60m1-anchor·id=60m2-anchor·id=60m2b-anchor 와 같은 부류. 저장소에 CI 도 보호 ref 도 없어 구조적 미해소이며 Task 9 가 id=60m3-anchor 로 이월한다. 없는 앵커를 있는 척 검사하지 않는다(INV4)"`
- 🟡 **MEDIUM** · golden 기대가 형제 창 병합 델타를 못 본다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m3`
  - 가능성: 중
  - 완화책: `id=60m2b-merge-flips-check6` 과 같은 축. 검사 `#10` 은 기대 **집합** 대조라 기대 밖 키를 이름으로 떨어뜨린다 , 병합이 들어오면 조용히 통과하지 않고 붉어져 사람이 판정한다
  - 다음 액션: `/codex:rescue "리스크 완화: golden 기대가 형제 창 병합 델타를 못 본다, 제안 mitigation: id=60m2b-merge-flips-check6 과 같은 축. 검사 #10 은 기대 집합 대조라 기대 밖 키를 이름으로 떨어뜨린다 , 병합이 들어오면 조용히 통과하지 않고 붉어져 사람이 판정한다"`
- 🟡 **MEDIUM** · M1 `check6` (2) 잔여가 이 창의 결함으로 읽힌다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m3`
  - 가능성: 중
  - 완화책: `#11` (a) 의 기대 출력이 그 사유를 **명시적으로 요구**하고, Task 9 가 `id=60m3-m1check6-deferred-residual` 로 원인(M2 UI13 재지정)과 위임 밖임을 함께 적는다
  - 다음 액션: `/codex:rescue "리스크 완화: M1 check6 (2) 잔여가 이 창의 결함으로 읽힌다, 제안 mitigation: #11 (a) 의 기대 출력이 그 사유를 명시적으로 요구하고, Task 9 가 id=60m3-m1check6-deferred-residual 로 원인(M2 UI13 재지정)과 위임 밖임을 함께 적는다"`
- 🟡 **MEDIUM** · 릴리스 내용을 `p1..p2` 로 균일 유도해 21건에서 반대 집합을 싣는다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m4`
  - 가능성: 중
  - 완화책: §NOT Building 이 델타 유도를 금지하고 검사 `#5`·`#7` 이 4패턴 분포를 재유도해 균일 불가를 출력에 남긴다. 문서는 시점과 제목만 싣는다
  - 다음 액션: `/codex:rescue "리스크 완화: 릴리스 내용을 p1..p2 로 균일 유도해 21건에서 반대 집합을 싣는다, 제안 mitigation: §NOT Building 이 델타 유도를 금지하고 검사 #5·#7 이 4패턴 분포를 재유도해 균일 불가를 출력에 남긴다. 문서는 시점과 제목만 싣는다"`
- 🟡 **MEDIUM** · 연대기가 이력 전체를 덮는 것처럼 읽힌다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m4`
  - 가능성: **확정**
  - 완화책: 8일 / 708일 이 실측이다. 검사 `#6` 이 창 안·밖 계수를 인덱스에서 재유도하고 합 항등을 함께 물며, 인수처 2곳이 문면으로 요구된다
  - 다음 액션: `/codex:rescue "리스크 완화: 연대기가 이력 전체를 덮는 것처럼 읽힌다, 제안 mitigation: 8일 / 708일 이 실측이다. 검사 #6 이 창 안·밖 계수를 인덱스에서 재유도하고 합 항등을 함께 물며, 인수처 2곳이 문면으로 요구된다"`
- 🟡 **MEDIUM** · `releases.yaml` 생성물의 결함이 그대로 문서로 간다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m4`
  - 가능성: 중
  - 완화책: 검사 `#5` 가 3저장소 git 으로 두 버킷과 사슬 적중을 재유도한다 , 생성물이 아니라 원천과 대조하는 유일한 지점이다
  - 다음 액션: `/codex:rescue "리스크 완화: releases.yaml 생성물의 결함이 그대로 문서로 간다, 제안 mitigation: 검사 #5 가 3저장소 git 으로 두 버킷과 사슬 적중을 재유도한다 , 생성물이 아니라 원천과 대조하는 유일한 지점이다"`
- 🟡 **MEDIUM** · near-miss 5건의 분류 근거가 인덱스 계약 밖이다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m4`
  - 가능성: **확정**
  - 완화책: `release_like_pattern` 이 manifest 에 없는 추출기 국소 상수다(F-10-10). 검사 `#1` 이 그 문면을 요구하고 Task 10 이 `id=60m4-release-like-pattern-local` 로 이월한다
  - 다음 액션: `/codex:rescue "리스크 완화: near-miss 5건의 분류 근거가 인덱스 계약 밖이다, 제안 mitigation: release_like_pattern 이 manifest 에 없는 추출기 국소 상수다(F-10-10). 검사 #1 이 그 문면을 요구하고 Task 10 이 id=60m4-release-like-pattern-local 로 이월한다"`
- 🟡 **MEDIUM** · 전이(`complete`) 직후 게이트 `#8` 이 붉어져 별도 창을 소비한다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m4`
  - 가능성: 중
  - 완화책: `#8` 을 모드로 갈랐다 , `in-progress` 통과 · `complete` 면 산출물 실재와 45행을 함께 문다. 앞 창(`m2c`)이 사후에 한 수술을 저작 시점에 넣는다
  - 다음 액션: `/codex:rescue "리스크 완화: 전이(complete) 직후 게이트 #8 이 붉어져 별도 창을 소비한다, 제안 mitigation: #8 을 모드로 갈랐다 , in-progress 통과 · complete 면 산출물 실재와 45행을 함께 문다. 앞 창(m2c)이 사후에 한 수술을 저작 시점에 넣는다"`
- 🟡 **MEDIUM** · 45+5행 축자 대조가 사람 손 오타로 무한 루프
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m4`
  - 가능성: 중
  - 완화책: `#3`·`#4` 가 양방향 집합 + 필드 축자를 본다. 결손·초과를 sha 로 이름 붙이므로 수정 위치가 출력에 직접 나온다
  - 다음 액션: `/codex:rescue "리스크 완화: 45+5행 축자 대조가 사람 손 오타로 무한 루프, 제안 mitigation: #3·#4 가 양방향 집합 + 필드 축자를 본다. 결손·초과를 sha 로 이름 붙이므로 수정 위치가 출력에 직접 나온다"`
- 🟡 **MEDIUM** · 착수 전 붉은 10자리가 이 창의 결함으로 읽힌다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m4`
  - 가능성: 중
  - 완화책: 검사 `#12` 가 회귀가 아니라 **귀속**이다. 기준선 집합을 Task 0 blob 에 동결하고 신규 붉음 0 만 판정하며, 기준선 공집합은 실패다
  - 다음 액션: `/codex:rescue "리스크 완화: 착수 전 붉은 10자리가 이 창의 결함으로 읽힌다, 제안 mitigation: 검사 #12 가 회귀가 아니라 귀속이다. 기준선 집합을 Task 0 blob 에 동결하고 신규 붉음 0 만 판정하며, 기준선 공집합은 실패다"`
- 🟡 **MEDIUM** · Task 0 기준선 앵커가 변경 창 안이다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m4`
  - 가능성: **확정**
  - 완화책: `id=60m1-anchor`·`id=60m2-anchor`·`id=60m2b-anchor`·`id=60m3-anchor`·`id=60m2c-anchor` 와 같은 부류. CI 도 보호 ref 도 없어 구조적 미해소이며 Task 10 이 `id=60m4-anchor` 로 이월한다. 없는 앵커를 있는 척 검사하지 않는다(INV4)
  - 다음 액션: `/codex:rescue "리스크 완화: Task 0 기준선 앵커가 변경 창 안이다, 제안 mitigation: id=60m1-anchor·id=60m2-anchor·id=60m2b-anchor·id=60m3-anchor·id=60m2c-anchor 와 같은 부류. CI 도 보호 ref 도 없어 구조적 미해소이며 Task 10 이 id=60m4-anchor 로 이월한다. 없는 앵커를 있는 척 검사하지 않는다(INV4)"`
- 🟡 **MEDIUM** · golden 기대가 형제 창 병합 델타를 못 본다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m4`
  - 가능성: 중
  - 완화책: `id=60m2b-merge-reddens-golden` 과 같은 축. 검사 `#11` 은 기대 **집합** 대조라 기대 밖 키를 이름으로 떨어뜨린다 , 병합이 들어오면 조용히 통과하지 않고 붉어져 사람이 판정한다
  - 다음 액션: `/codex:rescue "리스크 완화: golden 기대가 형제 창 병합 델타를 못 본다, 제안 mitigation: id=60m2b-merge-reddens-golden 과 같은 축. 검사 #11 은 기대 집합 대조라 기대 밖 키를 이름으로 떨어뜨린다 , 병합이 들어오면 조용히 통과하지 않고 붉어져 사람이 판정한다"`
- 🟡 **MEDIUM** · 이 창에 적대 리뷰가 0라운드다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m4`
  - 가능성: **확정**
  - 완화책: `MCCP_CODEX_DISABLED=1` 이 전역이고 Agent·Workflow 호출이 금지라 Codex·L2 패널·santa-loop 세 경로가 다 닫혀 있다. §Codex Adversarial Review 가 그 사실을 남기고 receipt 가 `codex_verdict=skipped` 로 봉인된다
  - 다음 액션: `/codex:rescue "리스크 완화: 이 창에 적대 리뷰가 0라운드다, 제안 mitigation: MCCP_CODEX_DISABLED=1 이 전역이고 Agent·Workflow 호출이 금지라 Codex·L2 패널·santa-loop 세 경로가 다 닫혀 있다. §Codex Adversarial Review 가 그 사실을 남기고 receipt 가 codex_verdict=skipped 로 봉인된다"`
- 🟡 **MEDIUM** · 제목 축 하나로 모집단을 닫고 결손을 완전성으로 보고한다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m5`
  - 가능성: **확정**
  - 완화책: 실측에서 server 도메인 51 중 20 이 에픽 축 밖이었다. 검사 `#9` 가 파일경로 축으로 결손을 독립 유도해 양방향으로 물고 `51-31=20` 항등을 단언한다
  - 다음 액션: `/codex:rescue "리스크 완화: 제목 축 하나로 모집단을 닫고 결손을 완전성으로 보고한다, 제안 mitigation: 실측에서 server 도메인 51 중 20 이 에픽 축 밖이었다. 검사 #9 가 파일경로 축으로 결손을 독립 유도해 양방향으로 물고 51-31=20 항등을 단언한다"`
- 🟡 **MEDIUM** · 제목 모양을 랜딩으로 사실화해 모집단이 오염된다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m5`
  - 가능성: **확정**
  - 완화책: 이 축은 **네 번** 지적됐고 네 번 다 다른 변종이었다(목적지가 에픽 · 부모 1개 · 랜딩 직후 후속 · 다른 에픽에 병합). 판정을 제목에서 토폴로지 고정점으로 옮긴 것이 그 답이고, `#5` 가 배제 사유 3유형을, `#7` 이 수렴 라운드 수를, `#1` 이 분류 항등을 문다
  - 다음 액션: `/codex:rescue "리스크 완화: 제목 모양을 랜딩으로 사실화해 모집단이 오염된다, 제안 mitigation: 이 축은 네 번 지적됐고 네 번 다 다른 변종이었다(목적지가 에픽 · 부모 1개 · 랜딩 직후 후속 · 다른 에픽에 병합). 판정을 제목에서 토폴로지 고정점으로 옮긴 것이 그 답이고, #5 가 배제 사유 3유형을, #7 이 수렴 라운드 수를, #1 이 분류 항등을 문다"`
- 🟡 **MEDIUM** · `body_present` 로 "왜 없음"을 증명한다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m5`
  - 가능성: **확정**
  - 완화책: 정규화 후 구문 판정이라 raw 와 1+1 건 갈린다. 검사 `#7` 이 git `%B` 로 재유도하고 두 값을 나란히 출력하며 F-21 이 기록한다
  - 다음 액션: `/codex:rescue "리스크 완화: body_present 로 \"왜 없음\"을 증명한다, 제안 mitigation: 정규화 후 구문 판정이라 raw 와 1+1 건 갈린다. 검사 #7 이 git %B 로 재유도하고 두 값을 나란히 출력하며 F-21 이 기록한다"`
- 🟡 **MEDIUM** · 등급표를 안 보고 서사 가부를 자체 판정한다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m5`
  - 가능성: **높음**
  - 완화책: 저장소가 이미 A/B/C 를 판정해 뒀다. 검사 `#8` 이 등급표 용도 문면 3종을 축자로 요구하고 최고 등급 분포를 양방향 대조한다
  - 다음 액션: `/codex:rescue "리스크 완화: 등급표를 안 보고 서사 가부를 자체 판정한다, 제안 mitigation: 저장소가 이미 A/B/C 를 판정해 뒀다. 검사 #8 이 등급표 용도 문면 3종을 축자로 요구하고 최고 등급 분포를 양방향 대조한다"`
- 🟡 **MEDIUM** · 서사 부재 판정이 오탐·미탐한다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m5`
  - 가능성: **확정**
  - 완화책: 에픽 이름은 소속 절과 등급 표에도 나타나 전역 검색이 오탐한다. 검사 `#8` 은 `## 등급 A·B 가 닿는 6건` 의 **직계 `### ` 제목 집합**만 읽고 그 집합을 양방향 대조한다
  - 다음 액션: `/codex:rescue "리스크 완화: 서사 부재 판정이 오탐·미탐한다, 제안 mitigation: 에픽 이름은 소속 절과 등급 표에도 나타나 전역 검색이 오탐한다. 검사 #8 은 ## 등급 A·B 가 닿는 6건 의 직계 ### 제목 집합만 읽고 그 집합을 양방향 대조한다"`
- 🟡 **MEDIUM** · 마일스톤 범위를 계획서가 조용히 축소한다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m5`
  - 가능성: **확정**
  - 완화책: 승인 신호가 PRD 안의 값이면 게이트가 자기 주장을 자기가 검사한다(층위 7). 범위 축소를 이 창 밖으로 빼고 검사 `#13` 이 `서사로 남음` 문면 유지와 OQ 열림을 **요구**한다 , 닫으면 붉어진다
  - 다음 액션: `/codex:rescue "리스크 완화: 마일스톤 범위를 계획서가 조용히 축소한다, 제안 mitigation: 승인 신호가 PRD 안의 값이면 게이트가 자기 주장을 자기가 검사한다(층위 7). 범위 축소를 이 창 밖으로 빼고 검사 #13 이 서사로 남음 문면 유지와 OQ 열림을 요구한다 , 닫으면 붉어진다"`
- 🟡 **MEDIUM** · 소속 커밋을 계수로만 실어 게이트가 볼 대상이 없다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m5`
  - 가능성: **확정**
  - 완화책: 계수와 파일 기수를 보존한 오배정이 통과한다. 검사 `#6` 이 에픽별 sha 집합을 git 재유도와 양방향 대조하고 `#2` 의 열과 두 자리에서 같은 값을 요구한다
  - 다음 액션: `/codex:rescue "리스크 완화: 소속 커밋을 계수로만 실어 게이트가 볼 대상이 없다, 제안 mitigation: 계수와 파일 기수를 보존한 오배정이 통과한다. 검사 #6 이 에픽별 sha 집합을 git 재유도와 양방향 대조하고 #2 의 열과 두 자리에서 같은 값을 요구한다"`
- 🟡 **MEDIUM** · Task 단위 검증이 선언한 게이트를 다 안 돌린다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m5`
  - 가능성: **확정**
  - 완화책: R2 에서 한 Task 가 세 게이트를 걸고 하나만 불렀다. Task 를 절 단위로 쪼개 Task 마다 게이트 하나를 갖게 했고 `#18` 이 마커 집합 동일성으로 그 대응을 문다
  - 다음 액션: `/codex:rescue "리스크 완화: Task 단위 검증이 선언한 게이트를 다 안 돌린다, 제안 mitigation: R2 에서 한 Task 가 세 게이트를 걸고 하나만 불렀다. Task 를 절 단위로 쪼개 Task 마다 게이트 하나를 갖게 했고 #18 이 마커 집합 동일성으로 그 대응을 문다"`
- 🟡 **MEDIUM** · 에픽 축이 M4 창 밖을 덮는 것처럼 읽힌다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m5`
  - 가능성: **확정**
  - 완화책: 5.05% 가 실측이다. 검사 `#10` 이 합 항등을 전건 재유도하고 인수처 문면을 요구한다
  - 다음 액션: `/codex:rescue "리스크 완화: 에픽 축이 M4 창 밖을 덮는 것처럼 읽힌다, 제안 mitigation: 5.05% 가 실측이다. 검사 #10 이 합 항등을 전건 재유도하고 인수처 문면을 요구한다"`
- 🟡 **MEDIUM** · 인덱스 생성물의 결함이 그대로 문서로 간다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m5`
  - 가능성: 중
  - 완화책: 검사 `#7` 이 3저장소 git 으로 매치·부모 수·p2 계보·prod 도달·raw body 를 재유도한다
  - 다음 액션: `/codex:rescue "리스크 완화: 인덱스 생성물의 결함이 그대로 문서로 간다, 제안 mitigation: 검사 #7 이 3저장소 git 으로 매치·부모 수·p2 계보·prod 도달·raw body 를 재유도한다"`
- 🟡 **MEDIUM** · prod 도달 100% 를 배포 승격으로 읽는다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m5`
  - 가능성: 중
  - 완화책: 검사 `#11` 이 태그 0 · `refs/replace` 0 을 git 에서 재유도하고 판정 주체 문면 4종을 요구한다
  - 다음 액션: `/codex:rescue "리스크 완화: prod 도달 100% 를 배포 승격으로 읽는다, 제안 mitigation: 검사 #11 이 태그 0 · refs/replace 0 을 git 에서 재유도하고 판정 주체 문면 4종을 요구한다"`
- 🟡 **MEDIUM** · 파일경로 대조를 site·admin 에도 편다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m5`
  - 가능성: 중
  - 완화책: 두 저장소는 `modules/` 대응물이 없다. 검사 `#9` 가 미성립 문면과 상위 2단계 distinct 70·35 를 함께 문다
  - 다음 액션: `/codex:rescue "리스크 완화: 파일경로 대조를 site·admin 에도 편다, 제안 mitigation: 두 저장소는 modules/ 대응물이 없다. 검사 #9 가 미성립 문면과 상위 2단계 distinct 70·35 를 함께 문다"`
- 🟡 **MEDIUM** · 두 트리 캡션의 `8개 에픽` 이 문서와 어긋난 채 남는다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m5`
  - 가능성: **확정**
  - 완화책: 두 파일 다 이 PRD 소유 밖이다(UI13). `id=60m5-tree-caption-literal-stale` 로 이월해 어긋남을 이름으로 남긴다
  - 다음 액션: `/codex:rescue "리스크 완화: 두 트리 캡션의 8개 에픽 이 문서와 어긋난 채 남는다, 제안 mitigation: 두 파일 다 이 PRD 소유 밖이다(UI13). id=60m5-tree-caption-literal-stale 로 이월해 어긋남을 이름으로 남긴다"`
- 🟡 **MEDIUM** · 185 + 114 행 축자 대조가 사람 손 오타로 무한 루프
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m5`
  - 가능성: 중
  - 완화책: `#3`·`#6` 이 양방향 집합 + 필드 축자를 본다. 결손·초과를 sha 로 이름 붙이므로 수정 위치가 출력에 직접 나온다
  - 다음 액션: `/codex:rescue "리스크 완화: 185 + 114 행 축자 대조가 사람 손 오타로 무한 루프, 제안 mitigation: #3·#6 이 양방향 집합 + 필드 축자를 본다. 결손·초과를 sha 로 이름 붙이므로 수정 위치가 출력에 직접 나온다"`
- 🟡 **MEDIUM** · Task 0 기준선 앵커가 변경 창 안이다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m5`
  - 가능성: **확정**
  - 완화책: `id=60m1-anchor` ~ `id=60m4-anchor` 와 같은 부류. 구조적 미해소이며 Task 15 가 `id=60m5-anchor` 로 이월한다
  - 다음 액션: `/codex:rescue "리스크 완화: Task 0 기준선 앵커가 변경 창 안이다, 제안 mitigation: id=60m1-anchor ~ id=60m4-anchor 와 같은 부류. 구조적 미해소이며 Task 15 가 id=60m5-anchor 로 이월한다"`
- 🟡 **MEDIUM** · 전이(`complete`) 직후 게이트 `#13` 이 붉어져 별도 창을 소비한다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m5`
  - 가능성: 중
  - 완화책: `#13` 을 모드로 갈랐다 , `in-progress` 통과 · `complete` 면 산출물 실재와 114행을 함께 문다
  - 다음 액션: `/codex:rescue "리스크 완화: 전이(complete) 직후 게이트 #13 이 붉어져 별도 창을 소비한다, 제안 mitigation: #13 을 모드로 갈랐다 , in-progress 통과 · complete 면 산출물 실재와 114행을 함께 문다"`
- 🟡 **MEDIUM** · golden 기대가 형제 창 병합 델타를 못 본다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m5`
  - 가능성: 중
  - 완화책: 검사 `#16` 은 기대 **집합** 대조라 기대 밖 키를 이름으로 떨어뜨린다
  - 다음 액션: `/codex:rescue "리스크 완화: golden 기대가 형제 창 병합 델타를 못 본다, 제안 mitigation: 검사 #16 은 기대 집합 대조라 기대 밖 키를 이름으로 떨어뜨린다"`
- 🟡 **MEDIUM** · **no-op 하네스가 Validation 전체를 초록으로 만든다**
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m5`
  - 가능성: **확정**
  - 완화책: `--help` 목록과 `ok` 접두사 계수만 보면 서브커맨드가 아무 검증 없이 성공 문자열만 찍어도 통과한다. M1~M4 가 네 창 동안 이월한 층위 8 이다. `#18` 이 사본 변조 프로브 17건을 실제로 돌려 rc 1 과 진단 토큰을 요구하고 `#19` 가 그 manifest 를 대조한다
  - 다음 액션: `/codex:rescue "리스크 완화: no-op 하네스가 Validation 전체를 초록으로 만든다, 제안 mitigation: --help 목록과 ok 접두사 계수만 보면 서브커맨드가 아무 검증 없이 성공 문자열만 찍어도 통과한다. M1~M4 가 네 창 동안 이월한 층위 8 이다. #18 이 사본 변조 프로브 17건을 실제로 돌려 rc 1 과 진단 토큰을 요구하고 #19 가 그 manifest 를 대조한다"`
- 🟡 **MEDIUM** · 최고 등급을 두 검사가 같은 helper 로 유도해 순환 대조가 된다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m5`
  - 가능성: **확정**
  - 완화책: 공통 오분류가 등급 C 에픽을 A·B 로 올려 근거 없는 서사를 통과시킨다. `#2` 가 등급 원장을 산출물로 내고 `#8` 은 그 원장만 본다. reducer 우선순위는 경계 사례 뒤집기 프로브가 문다
  - 다음 액션: `/codex:rescue "리스크 완화: 최고 등급을 두 검사가 같은 helper 로 유도해 순환 대조가 된다, 제안 mitigation: 공통 오분류가 등급 C 에픽을 A·B 로 올려 근거 없는 서사를 통과시킨다. #2 가 등급 원장을 산출물로 내고 #8 은 그 원장만 본다. reducer 우선순위는 경계 사례 뒤집기 프로브가 문다"`
- 🟡 **MEDIUM** · 원장 소비자가 생산자보다 먼저 돌아 깨끗한 checkout 에서 죽는다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m5`
  - 가능성: **확정**
  - 완화책: R3 흡수가 만든 순서 결함이었다. 실행 순서를 의존 순서로 바꿔 `grades` 를 `#2`, `epics` 를 `#8` 로 맞바꿨다. 원장 경로·수명은 `.claude/state/` gitignore + 매 실행 재생성으로 못 박고 원장 부재 프로브를 `#18` 목록에 넣는다
  - 다음 액션: `/codex:rescue "리스크 완화: 원장 소비자가 생산자보다 먼저 돌아 깨끗한 checkout 에서 죽는다, 제안 mitigation: R3 흡수가 만든 순서 결함이었다. 실행 순서를 의존 순서로 바꿔 grades 를 #2, epics 를 #8 로 맞바꿨다. 원장 경로·수명은 .claude/state/ gitignore + 매 실행 재생성으로 못 박고 원장 부재 프로브를 #18 목록에 넣는다"`
- 🟡 **MEDIUM** · 서사 블록에 임의 sha 와 등급만 붙여도 통과한다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m5`
  - 가능성: **확정**
  - 완화책: 등급 표기와 sha 존재만 보면 인과 서술이 사실로 발행된다. `#2` 가 기계 판독 추정 표기를 필수화하고 인용 sha 가 그 에픽 원장 근거의 부분집합인지 대조한다
  - 다음 액션: `/codex:rescue "리스크 완화: 서사 블록에 임의 sha 와 등급만 붙여도 통과한다, 제안 mitigation: 등급 표기와 sha 존재만 보면 인과 서술이 사실로 발행된다. #2 가 기계 판독 추정 표기를 필수화하고 인용 sha 가 그 에픽 원장 근거의 부분집합인지 대조한다"`
- 🟡 **MEDIUM** · UI4 를 에픽 발견 축으로 읽으면 이 창이 발행 불가다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m5`
  - 가능성: 중
  - 완화책: 해석 (α)·(β) 를 상신 문면으로 올리고 계획서가 판정하지 않는다(UI14). (α) 근거는 §Evidence 문장의 실측 반증과 PRD 의 에픽 정의이며 둘 다 GROUND 에 있다
  - 다음 액션: `/codex:rescue "리스크 완화: UI4 를 에픽 발견 축으로 읽으면 이 창이 발행 불가다, 제안 mitigation: 해석 (α)·(β) 를 상신 문면으로 올리고 계획서가 판정하지 않는다(UI14). (α) 근거는 §Evidence 문장의 실측 반증과 PRD 의 에픽 정의이며 둘 다 GROUND 에 있다"`
- 🟡 **MEDIUM** · 앞 창 게이트가 다음 창의 정당한 개정을 영구 차단한다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m5`
  - 가능성: **확정**
  - 완화책: 현재 PRD 상태의 절대값을 물면 승인된 개정에서 붉어진다. M3 이 M1 `check6` 에서 이미 겪은 자리다. `#13` 을 Task 0 blob 과의 **귀속 diff** 로 바꿔 이 창의 무변동만 판정한다
  - 다음 액션: `/codex:rescue "리스크 완화: 앞 창 게이트가 다음 창의 정당한 개정을 영구 차단한다, 제안 mitigation: 현재 PRD 상태의 절대값을 물면 승인된 개정에서 붉어진다. M3 이 M1 check6 에서 이미 겪은 자리다. #13 을 Task 0 blob 과의 귀속 diff 로 바꿔 이 창의 무변동만 판정한다"`
- 🟡 **MEDIUM** · 음성 프로브가 fixture 를 남기거나 원본을 훼손한다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m5`
  - 가능성: 중
  - 완화책: 사본은 `mktemp -d` 안에만 만들고 임시 경로 등록부 + exit 훅으로 실패 경로에서도 쓸어낸다. 추적 파일은 읽기만 한다
  - 다음 액션: `/codex:rescue "리스크 완화: 음성 프로브가 fixture 를 남기거나 원본을 훼손한다, 제안 mitigation: 사본은 mktemp -d 안에만 만들고 임시 경로 등록부 + exit 훅으로 실패 경로에서도 쓸어낸다. 추적 파일은 읽기만 한다"`
- 🟡 **MEDIUM** · `# 음성:` 이 계획서에서는 전건 (미실행) 이다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m5`
  - 가능성: **확정**
  - 완화책: 하네스가 이 계획서와 함께 신설되므로 저작 시점에 돌릴 대상이 없다. 구현 창에서 `#18` 이 그 행들을 **실행 가능한 프로브로 승격**하고, Acceptance 가 별도 항목으로 요구한다
  - 다음 액션: `/codex:rescue "리스크 완화: # 음성: 이 계획서에서는 전건 (미실행) 이다, 제안 mitigation: 하네스가 이 계획서와 함께 신설되므로 저작 시점에 돌릴 대상이 없다. 구현 창에서 #18 이 그 행들을 실행 가능한 프로브로 승격하고, Acceptance 가 별도 항목으로 요구한다"`
- 🟡 **MEDIUM** · 등급 U 문서에 소스 없는 서사가 증식한다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m6`
  - 가능성: **높음**
  - 완화책: 검사 `#1` 의 폐쇄 스키마 , 블록 안 행은 제목·인용·앵커·공백 넷뿐이고 그 밖의 행이 1줄이면 실패. 자유 산문의 출처는 기계로 판정 불가라 허용 자체를 닫는다
  - 다음 액션: `/codex:rescue "리스크 완화: 등급 U 문서에 소스 없는 서사가 증식한다, 제안 mitigation: 검사 #1 의 폐쇄 스키마 , 블록 안 행은 제목·인용·앵커·공백 넷뿐이고 그 밖의 행이 1줄이면 실패. 자유 산문의 출처는 기계로 판정 불가라 허용 자체를 닫는다"`
- 🟡 **MEDIUM** · 등급 U 문서에 저장소 검증 진술이 섞여 최상단 고지가 문서 자신에 대해 거짓이 된다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m6`
  - 가능성: **높음**
  - 완화책: 검사 `#2` 가 코드 경로·행 인용·설정 키 계수를 **0 으로** 문다. 대조는 findings 로만 간다
  - 다음 액션: `/codex:rescue "리스크 완화: 등급 U 문서에 저장소 검증 진술이 섞여 최상단 고지가 문서 자신에 대해 거짓이 된다, 제안 mitigation: 검사 #2 가 코드 경로·행 인용·설정 키 계수를 0 으로 문다. 대조는 findings 로만 간다"`
- 🟡 **MEDIUM** · 원문 재분할이 인과·시간 관계를 잃는다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m6`
  - 가능성: 중
  - 완화책: 원소를 bullet 그대로 3으로 두고 인용을 **축자 전체**로 문다. 부분 인용이 실패이므로 시간 관계가 인용 안에 남는다
  - 다음 액션: `/codex:rescue "리스크 완화: 원문 재분할이 인과·시간 관계를 잃는다, 제안 mitigation: 원소를 bullet 그대로 3으로 두고 인용을 축자 전체로 문다. 부분 인용이 실패이므로 시간 관계가 인용 안에 남는다"`
- 🟡 **MEDIUM** · `04-ops-intent.md` 가 값 없는 껍데기로 읽힌다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m6`
  - 가능성: **확정**
  - 완화책: 회부가 요구한 상태다. 검사 `#4` 가 모드를 정확한 소스 경로 하나로 가르고 부재 사유를 문서에 결박한다
  - 다음 액션: `/codex:rescue "리스크 완화: 04-ops-intent.md 가 값 없는 껍데기로 읽힌다, 제안 mitigation: 회부가 요구한 상태다. 검사 #4 가 모드를 정확한 소스 경로 하나로 가르고 부재 사유를 문서에 결박한다"`
- 🟡 **MEDIUM** · 소스가 들어온 뒤에도 검사 `#4` 가 부재 모드로 통과한다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m6`
  - 가능성: 중
  - 완화책: 모드를 `git ls-files, ops/reconcile/reconcile.jsonl` 적중으로 가른다. 실재 모드에서는 JSONL 을 파싱해 `ops-only` 레코드를 직접 센다
  - 다음 액션: `/codex:rescue "리스크 완화: 소스가 들어온 뒤에도 검사 #4 가 부재 모드로 통과한다, 제안 mitigation: 모드를 git ls-files, ops/reconcile/reconcile.jsonl 적중으로 가른다. 실재 모드에서는 JSONL 을 파싱해 ops-only 레코드를 직접 센다"`
- 🟡 **MEDIUM** · 형제 워크트리 부재로 등급 O 관측이 침묵한다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m6`
  - 가능성: 중
  - 완화책: 이름 있는 `SKIP(형제 워크트리 부재)` 를 출력에 찍는다. 워크트리는 커밋 고정이 없으므로 판정 축이 아니라 관측이다
  - 다음 액션: `/codex:rescue "리스크 완화: 형제 워크트리 부재로 등급 O 관측이 침묵한다, 제안 mitigation: 이름 있는 SKIP(형제 워크트리 부재) 를 출력에 찍는다. 워크트리는 커밋 고정이 없으므로 판정 축이 아니라 관측이다"`
- 🟡 **MEDIUM** · 동결 좁힘이 앞 행 결박까지 놓는다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m6`
  - 가능성: 중
  - 완화책: 검사 `#10` 이 반사실 3종(앞 행 Status · 앞 행 Outcome 토큰 · 번호 교환)에 중복 번호를 더해 문다
  - 다음 액션: `/codex:rescue "리스크 완화: 동결 좁힘이 앞 행 결박까지 놓는다, 제안 mitigation: 검사 #10 이 반사실 3종(앞 행 Status · 앞 행 Outcome 토큰 · 번호 교환)에 중복 번호를 더해 문다"`
- 🟡 **MEDIUM** · 수술이 `prd` 의 행 동결 **밖** 결박을 함께 지운다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m6`
  - 가능성: 중
  - 완화책: 검사 `#10` (e) 가 기준선 blob 에서 축을 유도해 축마다 rc 1 을 요구한다. `#13` 의 인과 필터는 사라진 붉음만 보고 사라진 결박은 못 본다
  - 다음 액션: `/codex:rescue "리스크 완화: 수술이 prd 의 행 동결 밖 결박을 함께 지운다, 제안 mitigation: 검사 #10 (e) 가 기준선 blob 에서 축을 유도해 축마다 rc 1 을 요구한다. #13 의 인과 필터는 사라진 붉음만 보고 사라진 결박은 못 본다"`
- 🟡 **MEDIUM** · 기존 발행 문서가 사라져도 정본 정합이 초록이다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m6`
  - 가능성: 중
  - 완화책: 검사 `#6` 이 부분집합이 아니라 **등가**로 문다 , 기준선 3건 ∪ 신설 2건 양방향
  - 다음 액션: `/codex:rescue "리스크 완화: 기존 발행 문서가 사라져도 정본 정합이 초록이다, 제안 mitigation: 검사 #6 이 부분집합이 아니라 등가로 문다 , 기준선 3건 ∪ 신설 2건 양방향"`
- 🟡 **MEDIUM** · 뒤 행 일부만 열어 다음 창에서 같은 실패가 재발한다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m6`
  - 가능성: 중
  - 완화책: 반사실 (d) 를 자기 행 뒤 물리 행 **전수**로 돌리고 대상 행 수를 출력한다
  - 다음 액션: `/codex:rescue "리스크 완화: 뒤 행 일부만 열어 다음 창에서 같은 실패가 재발한다, 제안 mitigation: 반사실 (d) 를 자기 행 뒤 물리 행 전수로 돌리고 대상 행 수를 출력한다"`
- 🟡 **MEDIUM** · 반사실이 변조와 무관한 이유로 rc 를 낸다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m6`
  - 가능성: 중
  - 완화책: 프로브마다 변조 전후 바이트 상이와 하네스가 사본을 읽었다는 경로 증거를 함께 단언한다
  - 다음 액션: `/codex:rescue "리스크 완화: 반사실이 변조와 무관한 이유로 rc 를 낸다, 제안 mitigation: 프로브마다 변조 전후 바이트 상이와 하네스가 사본을 읽었다는 경로 증거를 함께 단언한다"`
- 🟡 **MEDIUM** · 앞 창 하네스가 뒤 행을 놓아 *그 창이 뒤 행을 건드렸는가* 축이 빈다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m6`
  - 가능성: **확정**
  - 완화책: 잔여로 올린다(F-27). 구조적 답은 창 종료 앵커이며 `m1.gates.mjs` `check6` 에 선례가 있으나 앞 창 전건 개조가 필요해 이 창 밖이다
  - 다음 액션: `/codex:rescue "리스크 완화: 앞 창 하네스가 뒤 행을 놓아 *그 창이 뒤 행을 건드렸는가* 축이 빈다, 제안 mitigation: 잔여로 올린다(F-27). 구조적 답은 창 종료 앵커이며 m1.gates.mjs check6 에 선례가 있으나 앞 창 전건 개조가 필요해 이 창 밖이다"`
- 🟡 **MEDIUM** · 형제 하네스 기준선이 이미 붉어 신규 붉음을 못 가른다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m6`
  - 가능성: **확정**
  - 완화책: 검사 `#13` 이 `BASE` blob 에 실패 집합을 동결하고 인자 형태까지 유도한다. 인자 없는 호출은 usage rc 1 이라 거짓 붉음이다
  - 다음 액션: `/codex:rescue "리스크 완화: 형제 하네스 기준선이 이미 붉어 신규 붉음을 못 가른다, 제안 mitigation: 검사 #13 이 BASE blob 에 실패 집합을 동결하고 인자 형태까지 유도한다. 인자 없는 호출은 usage rc 1 이라 거짓 붉음이다"`
- 🟡 **MEDIUM** · 창 안 앵커가 자기 기준선을 정의한다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m6`
  - 가능성: **높음**
  - 완화책: 기준선을 창 밖 `BASE` 로 옮기고 `#6`·`#12`·`#13` 이 `BASE` 단언 4종을 돌린다. `#13` 의 진단 문면도 `BASE` 시점 함수의 것이다
  - 다음 액션: `/codex:rescue "리스크 완화: 창 안 앵커가 자기 기준선을 정의한다, 제안 mitigation: 기준선을 창 밖 BASE 로 옮기고 #6·#12·#13 이 BASE 단언 4종을 돌린다. #13 의 진단 문면도 BASE 시점 함수의 것이다"`
- 🟡 **MEDIUM** · 틀렸지만 유효한 `BASE` 가 통과한다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m6`
  - 가능성: 중
  - 완화책: `BASE == WINDOW_START^` 유도 등식으로 유일화한다. 앞 조상·창 안 자손 두 방향 음성 프로브가 붙는다
  - 다음 액션: `/codex:rescue "리스크 완화: 틀렸지만 유효한 BASE 가 통과한다, 제안 mitigation: BASE == WINDOW_START^ 유도 등식으로 유일화한다. 앞 조상·창 안 자손 두 방향 음성 프로브가 붙는다"`
- 🟡 **MEDIUM** · 최종 커밋 diff 가 허용 목록 밖이라 세 검사가 붉다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m6`
  - 가능성: **높음**
  - 완화책: §게이트 산출물 면제 표를 두고 허용 목록을 `FTC ∪ 면제` 로 유도한다. 계획서 안이라 넓히면 diff 에 남는다
  - 다음 액션: `/codex:rescue "리스크 완화: 최종 커밋 diff 가 허용 목록 밖이라 세 검사가 붉다, 제안 mitigation: §게이트 산출물 면제 표를 두고 허용 목록을 FTC ∪ 면제 로 유도한다. 계획서 안이라 넓히면 diff 에 남는다"`
- 🟡 **MEDIUM** · 등급 O 항목이 앵커 없이 발행된다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m6`
  - 가능성: 중
  - 완화책: 검사 `#3` 이 앵커 열 필수와 표 밖 진술 0 을, `#4` 가 소스 실재 모드에서 앵커의 유일 해석을 문다
  - 다음 액션: `/codex:rescue "리스크 완화: 등급 O 항목이 앵커 없이 발행된다, 제안 mitigation: 검사 #3 이 앵커 열 필수와 표 밖 진술 0 을, #4 가 소스 실재 모드에서 앵커의 유일 해석을 문다"`
- 🟡 **MEDIUM** · golden 재동결이 트리 파생 3키를 움직인다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m6`
  - 가능성: 낮
  - 완화책: 검사 `#12` 가 `index.*` 3키 불변을 별도로 단언한다. 움직이면 트리를 건드린 것이므로 UI14 위반이다
  - 다음 액션: `/codex:rescue "리스크 완화: golden 재동결이 트리 파생 3키를 움직인다, 제안 mitigation: 검사 #12 가 index.* 3키 불변을 별도로 단언한다. 움직이면 트리를 건드린 것이므로 UI14 위반이다"`
- 🟡 **MEDIUM** · `00-origin.md` 링크 대상이 0건이라 문서가 고아가 된다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m6`
  - 가능성: 중
  - 완화책: 링크는 형제 PRD 소관이다(UI15). 이 창은 관측을 F-27 로 올리고 링크를 걸지 않는다
  - 다음 액션: `/codex:rescue "리스크 완화: 00-origin.md 링크 대상이 0건이라 문서가 고아가 된다, 제안 mitigation: 링크는 형제 PRD 소관이다(UI15). 이 창은 관측을 F-27 로 올리고 링크를 걸지 않는다"`
- 🟡 **MEDIUM** · 표제형 파서가 `11-index-code.md` 를 0으로 넘겨 발견 81건이 통째로 사각이 된다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m7`
  - 가능성: **높음**
  - 완화책: 검사 `#1` 이 표제형 0 인 파일에 표형 파서를 **강제**하고 파일마다 어느 파서가 답했는지 이름으로 찍는다
  - 다음 액션: `/codex:rescue "리스크 완화: 표제형 파서가 11-index-code.md 를 0으로 넘겨 발견 81건이 통째로 사각이 된다, 제안 mitigation: 검사 #1 이 표제형 0 인 파일에 표형 파서를 강제하고 파일마다 어느 파서가 답했는지 이름으로 찍는다"`
- 🟡 **MEDIUM** · 항목 표기 세 형태 중 하나만 받아 파일 단위로 결손이 난다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m7`
  - 가능성: **높음**
  - 완화책: 검사 `#1` 이 `### ` · `- **` · `**` 셋을 전부 받고 합계 0 이면 파서 파손으로 실패한다
  - 다음 액션: `/codex:rescue "리스크 완화: 항목 표기 세 형태 중 하나만 받아 파일 단위로 결손이 난다, 제안 mitigation: 검사 #1 이 ### · - · 셋을 전부 받고 합계 0 이면 파서 파손으로 실패한다"`
- 🟡 **MEDIUM** · 비발견 표제가 채널 적중으로 세어져 회수 집합이 부푼다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m7`
  - 가능성: 중
  - 완화책: `00-protocol 인계 색인` 이 이 PRD id 를 4번 싣는다. 검사 `#2` 가 6항목 보유를 발견 술어로 쓰고 제외를 출력에 단언한다
  - 다음 액션: `/codex:rescue "리스크 완화: 비발견 표제가 채널 적중으로 세어져 회수 집합이 부푼다, 제안 mitigation: 00-protocol 인계 색인 이 이 PRD id 를 4번 싣는다. 검사 #2 가 6항목 보유를 발견 술어로 쓰고 제외를 출력에 단언한다"`
- 🟡 **MEDIUM** · 채널 어휘를 리터럴로 박아 spec 개정과 어긋난다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m7`
  - 가능성: 중
  - 완화책: 검사 `#2` 가 `05-final-spec.md` §3 에서 파싱해 유도하고 2 미만이면 실패한다
  - 다음 액션: `/codex:rescue "리스크 완화: 채널 어휘를 리터럴로 박아 spec 개정과 어긋난다, 제안 mitigation: 검사 #2 가 05-final-spec.md §3 에서 파싱해 유도하고 2 미만이면 실패한다"`
- 🟡 **MEDIUM** · 형제가 findings 를 나중에 쓰면 이 창의 회수가 조용히 낡는다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m7`
  - 가능성: **확정**
  - 완화책: 검사 `#3` 이 원장 meta 의 파일 sha256 과 현재 값을 양방향 대조한다. UI18 의 집행 지점이며 재회수 없이는 통과 불가다
  - 다음 액션: `/codex:rescue "리스크 완화: 형제가 findings 를 나중에 쓰면 이 창의 회수가 조용히 낡는다, 제안 mitigation: 검사 #3 이 원장 meta 의 파일 sha256 과 현재 값을 양방향 대조한다. UI18 의 집행 지점이며 재회수 없이는 통과 불가다"`
- 🟡 **MEDIUM** · golden 의 `findings_headings` 로 완전성을 주장하게 된다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m7`
  - 가능성: 중
  - 완화책: 그 키는 표제 수이지 발견 수가 아니다(`11-index-code=4` vs 발견 81). F-34 로 기록하고 결박은 원장 meta 가 진다
  - 다음 액션: `/codex:rescue "리스크 완화: golden 의 findings_headings 로 완전성을 주장하게 된다, 제안 mitigation: 그 키는 표제 수이지 발견 수가 아니다(11-index-code=4 vs 발견 81). F-34 로 기록하고 결박은 원장 meta 가 진다"`
- 🟡 **MEDIUM** · 형제 판정을 재유도 없이 그대로 베낀다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m7`
  - 가능성: **높음**
  - 완화책: 검사 `#5` 가 핀 prod tip 과 동결 head 를 각각 파싱해 두 트리에서 라벨을 직접 세고, 서브모듈 부재를 SKIP 이 아니라 실패로 둔다
  - 다음 액션: `/codex:rescue "리스크 완화: 형제 판정을 재유도 없이 그대로 베낀다, 제안 mitigation: 검사 #5 가 핀 prod tip 과 동결 head 를 각각 파싱해 두 트리에서 라벨을 직접 세고, 서브모듈 부재를 SKIP 이 아니라 실패로 둔다"`
- 🟡 **MEDIUM** · 두 SHA 가 같아 두 축 대조가 공허해진다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m7`
  - 가능성: 낮
  - 완화책: 검사 `#5` 가 상이를 명시적으로 단언한다
  - 다음 액션: `/codex:rescue "리스크 완화: 두 SHA 가 같아 두 축 대조가 공허해진다, 제안 mitigation: 검사 #5 가 상이를 명시적으로 단언한다"`
- 🟡 **MEDIUM** · 머지 본문 포함관계가 형태별로 갈리는데 한 형태로 뭉뚱그려진다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m7`
  - 가능성: 중
  - 완화책: 검사 `#6` 이 포함/미포함을 이름으로 가르고 제목 형태 5종 분해를 함께 출력한다
  - 다음 액션: `/codex:rescue "리스크 완화: 머지 본문 포함관계가 형태별로 갈리는데 한 형태로 뭉뚱그려진다, 제안 mitigation: 검사 #6 이 포함/미포함을 이름으로 가르고 제목 형태 5종 분해를 함께 출력한다"`
- 🟡 **MEDIUM** · 재유도 계수가 F-10-22 문서와 어긋나는데 하네스가 자기 값으로 통과한다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m7`
  - 가능성: 중
  - 완화책: 검사 `#6` 이 문서 표를 파싱해 정본으로 삼고 하네스는 리터럴을 안 든다
  - 다음 액션: `/codex:rescue "리스크 완화: 재유도 계수가 F-10-22 문서와 어긋나는데 하네스가 자기 값으로 통과한다, 제안 mitigation: 검사 #6 이 문서 표를 파싱해 정본으로 삼고 하네스는 리터럴을 안 든다"`
- 🟡 **MEDIUM** · 축을 안 돌린 항목이 6축 값을 갖고 확정 계수에 섞인다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m7`
  - 가능성: 중
  - 완화책: 검사 `#4` 가 `방법론`·`계약` kind 의 6축 보유를 실패로 둔다
  - 다음 액션: `/codex:rescue "리스크 완화: 축을 안 돌린 항목이 6축 값을 갖고 확정 계수에 섞인다, 제안 mitigation: 검사 #4 가 방법론·계약 kind 의 6축 보유를 실패로 둔다"`
- 🟡 **MEDIUM** · 미회수 형제 집합이 비어도 통과해 전건 회수를 주장하게 된다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m7`
  - 가능성: 중
  - 완화책: 검사 `#9` 가 공집합을 실패로 둔다. 비는 것은 형제가 findings 를 쓴 뒤에만 가능하고 그때는 `#3` 이 먼저 붉다
  - 다음 액션: `/codex:rescue "리스크 완화: 미회수 형제 집합이 비어도 통과해 전건 회수를 주장하게 된다, 제안 mitigation: 검사 #9 가 공집합을 실패로 둔다. 비는 것은 형제가 findings 를 쓴 뒤에만 가능하고 그때는 #3 이 먼저 붉다"`
- 🟡 **MEDIUM** · `2b` 행을 함께 전이시켜 종결 문서의 비전이 기록이 거짓이 된다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m7`
  - 가능성: 중
  - 완화책: 검사 `#10` 이 M7 을 뺀 전 행 Status·Outcome 무변동을 문다
  - 다음 액션: `/codex:rescue "리스크 완화: 2b 행을 함께 전이시켜 종결 문서의 비전이 기록이 거짓이 된다, 제안 mitigation: 검사 #10 이 M7 을 뺀 전 행 Status·Outcome 무변동을 문다"`
- 🟡 **MEDIUM** · 창 안 앵커가 자기 기준선을 정의한다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m7`
  - 가능성: **높음**
  - 완화책: 기준선을 창 밖 `BASE` 로 옮기고 `#10`·`#12`·`#13` 이 `BASE` 단언 4종을 돌린다
  - 다음 액션: `/codex:rescue "리스크 완화: 창 안 앵커가 자기 기준선을 정의한다, 제안 mitigation: 기준선을 창 밖 BASE 로 옮기고 #10·#12·#13 이 BASE 단언 4종을 돌린다"`
- 🟡 **MEDIUM** · 형제 하네스 기준선이 이미 붉어 신규 붉음을 못 가른다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m7`
  - 가능성: **확정**
  - 완화책: 검사 `#13` 이 `BASE` blob 에 8하네스 실패 집합을 동결하고 인자 형태까지 유도한다. 이 창은 앞 창 하네스를 안 고치므로 해소 0 을 요구한다
  - 다음 액션: `/codex:rescue "리스크 완화: 형제 하네스 기준선이 이미 붉어 신규 붉음을 못 가른다, 제안 mitigation: 검사 #13 이 BASE blob 에 8하네스 실패 집합을 동결하고 인자 형태까지 유도한다. 이 창은 앞 창 하네스를 안 고치므로 해소 0 을 요구한다"`
- 🟡 **MEDIUM** · 앞 창 하네스 8종 재실행이 예산을 넘긴다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m7`
  - 가능성: 중
  - 완화책: 앞 창 실측이 중첩 비용을 기록했다(`70-viewer` m6 657s). `#13` 은 단일 검사로 분리돼 있어 따로 돌린다
  - 다음 액션: `/codex:rescue "리스크 완화: 앞 창 하네스 8종 재실행이 예산을 넘긴다, 제안 mitigation: 앞 창 실측이 중첩 비용을 기록했다(70-viewer m6 657s). #13 은 단일 검사로 분리돼 있어 따로 돌린다"`
- 🟡 **MEDIUM** · 확정 0건인데 발행 조건이 열린 것으로 읽힌다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m7`
  - 가능성: 중
  - 완화책: 검사 `#8` 이 전건 pass 0 과 발행 차단 2 id 열림을 한 검사에서 함께 문다
  - 다음 액션: `/codex:rescue "리스크 완화: 확정 0건인데 발행 조건이 열린 것으로 읽힌다, 제안 mitigation: 검사 #8 이 전건 pass 0 과 발행 차단 2 id 열림을 한 검사에서 함께 문다"`
- 🟡 **MEDIUM** · `--update` 가 트리 파생 3키를 움직인다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m7`
  - 가능성: 낮
  - 완화책: 검사 `#12` 가 `index.*` 3키 불변을 별도로 단언한다
  - 다음 액션: `/codex:rescue "리스크 완화: --update 가 트리 파생 3키를 움직인다, 제안 mitigation: 검사 #12 가 index.* 3키 불변을 별도로 단언한다"`
- 🟡 **MEDIUM** · 앞 창 `m6` 하네스가 M7 행 전이를 미리 동결해 착수 자체가 붉다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m7`
  - 가능성: **확정**
  - 완화책: 실측했다 , 전이 후 `#8 FAIL: 7 행 Status 가 이 창에서 바뀌었다`. Task 15 가 동결을 앞 행으로 좁히고 검사 `#11` 이 반사실 4종 + 뒤 행 전수로 좁힘의 정확성을 문다
  - 다음 액션: `/codex:rescue "리스크 완화: 앞 창 m6 하네스가 M7 행 전이를 미리 동결해 착수 자체가 붉다, 제안 mitigation: 실측했다 , 전이 후 #8 FAIL: 7 행 Status 가 이 창에서 바뀌었다. Task 15 가 동결을 앞 행으로 좁히고 검사 #11 이 반사실 4종 + 뒤 행 전수로 좁힘의 정확성을 문다"`
- 🟡 **MEDIUM** · 좁힘이 앞 행 결박까지 함께 놓는다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m7`
  - 가능성: 중
  - 완화책: 검사 `#11` (f) 가 축 목록을 기준선 blob 에서 유도해 축마다 rc 1 을 요구한다. `#14` 의 인과 필터는 사라진 붉음만 보고 사라진 결박은 못 본다
  - 다음 액션: `/codex:rescue "리스크 완화: 좁힘이 앞 행 결박까지 함께 놓는다, 제안 mitigation: 검사 #11 (f) 가 축 목록을 기준선 blob 에서 유도해 축마다 rc 1 을 요구한다. #14 의 인과 필터는 사라진 붉음만 보고 사라진 결박은 못 본다"`
- 🟡 **MEDIUM** · 형제 PRD 가 findings 를 안 쓰는 것이 이 PRD 의 결함으로 읽힌다
  - 관련 결정: `insuniverse-docs-60-history-deprecated-m7`
  - 가능성: 중
  - 완화책: 회수는 읽기 계약이고 쓰기는 형제 소관이다(UI2). `#9` 가 이름만 남기고 `13-relation-contract` F-09 가 같은 축을 이미 기록했다
  - 다음 액션: `/codex:rescue "리스크 완화: 형제 PRD 가 findings 를 안 쓰는 것이 이 PRD 의 결함으로 읽힌다, 제안 mitigation: 회수는 읽기 계약이고 쓰기는 형제 소관이다(UI2). #9 가 이름만 남기고 13-relation-contract F-09 가 같은 축을 이미 기록했다"`
- 🟡 **MEDIUM** · `file://` 에서 산출물이 안 열림 , 독자가 서버를 못 띄운다
  - 관련 결정: `insuniverse-docs-70-viewer-m2`
  - 가능성: 중
  - 완화책: 검사 `#11` 이 `fetch(` · `type="module"` · 외부 스크립트를 0건으로 묶는다. 브라우저 확인은 Task 11 완주에서 한 번
  - 다음 액션: `/codex:rescue "리스크 완화: file:// 에서 산출물이 안 열림 , 독자가 서버를 못 띄운다, 제안 mitigation: 검사 #11 이 fetch( · type=\"module\" · 외부 스크립트를 0건으로 묶는다. 브라우저 확인은 Task 11 완주에서 한 번"`
- 🟡 **MEDIUM** · 형제 PRD 가 문서를 더해 계수 리터럴이 깨짐
  - 관련 결정: `insuniverse-docs-70-viewer-m2`
  - 가능성: **높음**
  - 완화책: 계수를 검사에 리터럴로 두지 않는다(INV4). 조건은 집합 성질과 양방향 차집합이며 관측 3 이 이미 60→109 이동을 봤다
  - 다음 액션: `/codex:rescue "리스크 완화: 형제 PRD 가 문서를 더해 계수 리터럴이 깨짐, 제안 mitigation: 계수를 검사에 리터럴로 두지 않는다(INV4). 조건은 집합 성질과 양방향 차집합이며 관측 3 이 이미 60→109 이동을 봤다"`
- 🟡 **MEDIUM** · B1 정의를 고정하지 않은 채 수치만 고침
  - 관련 결정: `insuniverse-docs-70-viewer-m2`
  - 가능성: 중
  - 완화책: 검사 `#9` 가 값이 아니라 **정의 문면**을 본다. 정의 없이 값을 고치면 다음 라운드가 같은 자리를 다시 연다
  - 다음 액션: `/codex:rescue "리스크 완화: B1 정의를 고정하지 않은 채 수치만 고침, 제안 mitigation: 검사 #9 가 값이 아니라 정의 문면을 본다. 정의 없이 값을 고치면 다음 라운드가 같은 자리를 다시 연다"`
- 🟡 **MEDIUM** · 조립 뷰가 없는 조각을 만들어 채움
  - 관련 결정: `insuniverse-docs-70-viewer-m2`
  - 가능성: 중
  - 완화책: 검사 `#8` 이 "생성된 조각 0" 을 단언한다. 관측 5 의 78건이 그 표본이다
  - 다음 액션: `/codex:rescue "리스크 완화: 조립 뷰가 없는 조각을 만들어 채움, 제안 mitigation: 검사 #8 이 \"생성된 조각 0\" 을 단언한다. 관측 5 의 78건이 그 표본이다"`
- 🟡 **MEDIUM** · 275.5 KB 단일 문서 렌더가 브라우저에서 느림
  - 관련 결정: `insuniverse-docs-70-viewer-m2`
  - 가능성: 중
  - 완화책: 문서당 HTML 1개라 그 문서를 열 때만 부담이 온다. 항목 단위 접기는 마일스톤 3 의 점진적 공개 축으로 넘긴다
  - 다음 액션: `/codex:rescue "리스크 완화: 275.5 KB 단일 문서 렌더가 브라우저에서 느림, 제안 mitigation: 문서당 HTML 1개라 그 문서를 열 때만 부담이 온다. 항목 단위 접기는 마일스톤 3 의 점진적 공개 축으로 넘긴다"`
- 🟡 **MEDIUM** · 이월 2건이 잊힘 , 슬롯이 열려도 아무도 안 함
  - 관련 결정: `insuniverse-docs-70-viewer-m2`
  - 가능성: 중
  - 완화책: 검사 `#13` 이 backlog 이월 행 실재를 본다. 인수처를 슬롯 해제 시점으로 적는다
  - 다음 액션: `/codex:rescue "리스크 완화: 이월 2건이 잊힘 , 슬롯이 열려도 아무도 안 함, 제안 mitigation: 검사 #13 이 backlog 이월 행 실재를 본다. 인수처를 슬롯 해제 시점으로 적는다"`
- 🟡 **MEDIUM** · golden 을 모르는 사이 움직임
  - 관련 결정: `insuniverse-docs-70-viewer-m2`
  - 가능성: 낮음
  - 완화책: 검사 `#13` + 닫는 `verify.sh --check`. `cmp -s` 선행으로 이진 차이를 계수 0으로 놓치지 않는다
  - 다음 액션: `/codex:rescue "리스크 완화: golden 을 모르는 사이 움직임, 제안 mitigation: 검사 #13 + 닫는 verify.sh --check. cmp -s 선행으로 이진 차이를 계수 0으로 놓치지 않는다"`
- 🟡 **MEDIUM** · 배지 위계가 미판정을 오히려 정돈된 사실처럼 보이게 함
  - 관련 결정: `insuniverse-docs-70-viewer-m3`
  - 가능성: 중
  - 완화책: PRD 최상위 Risk 다. 검사 `#5` 가 격리를 양방향으로 단언하고 `#7` 이 위계 순서를 정본에 결박한다. 사람 판정분은 Acceptance 에 `(미검증)` 으로 남긴다
  - 다음 액션: `/codex:rescue "리스크 완화: 배지 위계가 미판정을 오히려 정돈된 사실처럼 보이게 함, 제안 mitigation: PRD 최상위 Risk 다. 검사 #5 가 격리를 양방향으로 단언하고 #7 이 위계 순서를 정본에 결박한다. 사람 판정분은 Acceptance 에 (미검증) 으로 남긴다"`
- 🟡 **MEDIUM** · `statusPlacementMap` 이 `null` 을 내 격리가 통째로 꺼짐
  - 관련 결정: `insuniverse-docs-70-viewer-m3`
  - 가능성: **높음**
  - 완화책: 관측 7 의 실측 함정이다. `null` 을 이름 있는 실패로 만들고 검사 `#3`·`#13` 이 두 자리에서 본다
  - 다음 액션: `/codex:rescue "리스크 완화: statusPlacementMap 이 null 을 내 격리가 통째로 꺼짐, 제안 mitigation: 관측 7 의 실측 함정이다. null 을 이름 있는 실패로 만들고 검사 #3·#13 이 두 자리에서 본다"`
- 🟡 **MEDIUM** · 승계 렌더가 `00-ia.md` 를 전제해 3건이 조용히 빔
  - 관련 결정: `insuniverse-docs-70-viewer-m3`
  - 가능성: **높음**
  - 완화책: 관측 4. 검사 `#8` 이 승계원 대상 문서 종류를 계수로 내고 재열거와 양방향 대조한다
  - 다음 액션: `/codex:rescue "리스크 완화: 승계 렌더가 00-ia.md 를 전제해 3건이 조용히 빔, 제안 mitigation: 관측 4. 검사 #8 이 승계원 대상 문서 종류를 계수로 내고 재열거와 양방향 대조한다"`
- 🟡 **MEDIUM** · 지배 갈림 경로가 실문서로 안 돌아 미검증으로 남음
  - 관련 결정: `insuniverse-docs-70-viewer-m3`
  - 가능성: 중
  - 완화책: 실측 0건이다. 검사 `#9` 가 픽스처로 그 경로를 돌린다 , 0건을 통과로 읽지 않는다
  - 다음 액션: `/codex:rescue "리스크 완화: 지배 갈림 경로가 실문서로 안 돌아 미검증으로 남음, 제안 mitigation: 실측 0건이다. 검사 #9 가 픽스처로 그 경로를 돌린다 , 0건을 통과로 읽지 않는다"`
- 🟡 **MEDIUM** · freshness JSON 이 다른 문서 트리 산출이라 조인이 어긋남
  - 관련 결정: `insuniverse-docs-70-viewer-m3`
  - 가능성: 중
  - 완화책: 검사 `#10` 이 항목 집합을 양방향 대조하고 `#13` 이 불일치를 이름 있는 실패로 거부한다
  - 다음 액션: `/codex:rescue "리스크 완화: freshness JSON 이 다른 문서 트리 산출이라 조인이 어긋남, 제안 mitigation: 검사 #10 이 항목 집합을 양방향 대조하고 #13 이 불일치를 이름 있는 실패로 거부한다"`
- 🟡 **MEDIUM** · 형제 PRD 가 문서를 더해 계수 리터럴이 깨짐
  - 관련 결정: `insuniverse-docs-70-viewer-m3`
  - 가능성: **높음**
  - 완화책: 계수를 검사에 리터럴로 두지 않는다(INV4). 관측 1 이 이미 310→378 이동을 봤다
  - 다음 액션: `/codex:rescue "리스크 완화: 형제 PRD 가 문서를 더해 계수 리터럴이 깨짐, 제안 mitigation: 계수를 검사에 리터럴로 두지 않는다(INV4). 관측 1 이 이미 310→378 이동을 봤다"`
- 🟡 **MEDIUM** · 앵커 rot 가 산출 시점에 동결돼 거짓이 됨
  - 관련 결정: `insuniverse-docs-70-viewer-m3`
  - 가능성: 중
  - 완화책: 산출물을 커밋하지 않으므로 매 빌드가 다시 잰다. 커밋 판정이 열리면 선행조건이 되는 것을 Open Question 에 적는다
  - 다음 액션: `/codex:rescue "리스크 완화: 앵커 rot 가 산출 시점에 동결돼 거짓이 됨, 제안 mitigation: 산출물을 커밋하지 않으므로 매 빌드가 다시 잰다. 커밋 판정이 열리면 선행조건이 되는 것을 Open Question 에 적는다"`
- 🟡 **MEDIUM** · 앞 창 하네스가 붉은 채로 넘어감
  - 관련 결정: `insuniverse-docs-70-viewer-m3`
  - 가능성: 중
  - 완화책: 검사 `#15` 가 귀속으로 가르되 어느 쪽이든 실패로 남긴다. 커밋 후 실행이 정상 조건이다
  - 다음 액션: `/codex:rescue "리스크 완화: 앞 창 하네스가 붉은 채로 넘어감, 제안 mitigation: 검사 #15 가 귀속으로 가르되 어느 쪽이든 실패로 남긴다. 커밋 후 실행이 정상 조건이다"`
- 🟡 **MEDIUM** · golden 을 모르는 사이 움직임
  - 관련 결정: `insuniverse-docs-70-viewer-m3`
  - 가능성: 낮음
  - 완화책: 검사 `#1` + 닫는 `verify.sh --check`. `cmp` 선행으로 이진 차이를 계수 0 으로 놓치지 않는다
  - 다음 액션: `/codex:rescue "리스크 완화: golden 을 모르는 사이 움직임, 제안 mitigation: 검사 #1 + 닫는 verify.sh --check. cmp 선행으로 이진 차이를 계수 0 으로 놓치지 않는다"`
- 🟡 **MEDIUM** · actor 축이 39.6% 만 덮는데 표면이 전건 덮은 것처럼 읽힘
  - 관련 결정: `insuniverse-docs-70-viewer-m4`
  - 가능성: **높음**
  - 완화책: 관측 4 다. 검사 `#8` 이 덮은 항목과 못 덮은 항목의 합을 전수와 대조하고 사유별로 계수한다. `#11` 이 도달 불가를 조작 수 평균에 섞지 못하게 막는다
  - 다음 액션: `/codex:rescue "리스크 완화: actor 축이 39.6% 만 덮는데 표면이 전건 덮은 것처럼 읽힘, 제안 mitigation: 관측 4 다. 검사 #8 이 덮은 항목과 못 덮은 항목의 합을 전수와 대조하고 사유별로 계수한다. #11 이 도달 불가를 조작 수 평균에 섞지 못하게 막는다"`
- 🟡 **MEDIUM** · 어휘 정규화를 "편의상" 한 줄 넣어 계약 #6 을 뷰어가 대신 내림
  - 관련 결정: `insuniverse-docs-70-viewer-m4`
  - 가능성: **높음**
  - 완화책: UI1 위반이다. 검사 `#6` 이 config 로 거른 어휘 0종을, `#7` 이 두 어휘로 접힌 항목 0건을 단언한다. 두 자리에서 본다
  - 다음 액션: `/codex:rescue "리스크 완화: 어휘 정규화를 \"편의상\" 한 줄 넣어 계약 #6 을 뷰어가 대신 내림, 제안 mitigation: UI1 위반이다. 검사 #6 이 config 로 거른 어휘 0종을, #7 이 두 어휘로 접힌 항목 0건을 단언한다. 두 자리에서 본다"`
- 🟡 **MEDIUM** · `splitExitItem` 복제가 정본과 조용히 갈림
  - 관련 결정: `insuniverse-docs-70-viewer-m4`
  - 가능성: 중
  - 완화책: 관측 5. 검사 `#3` 이 정본 선언 소스와 문자열 대조한다. **남는 사각지대**(동시 변경)를 검사 출력에 드러내고 계약 #8 로 export 를 요청한다
  - 다음 액션: `/codex:rescue "리스크 완화: splitExitItem 복제가 정본과 조용히 갈림, 제안 mitigation: 관측 5. 검사 #3 이 정본 선언 소스와 문자열 대조한다. 남는 사각지대(동시 변경)를 검사 출력에 드러내고 계약 #8 로 export 를 요청한다"`
- 🟡 **MEDIUM** · 역인덱스 지면이 앞 창 하네스를 붉힘
  - 관련 결정: `insuniverse-docs-70-viewer-m4`
  - 가능성: **높음**
  - 완화책: 관측 7. 지면을 `build/d/` 밖에 두고 검사 `#9` 가 그 경로 조건을 직접 단언하며 `#15` 가 두 하네스 완주로 다시 잡는다
  - 다음 액션: `/codex:rescue "리스크 완화: 역인덱스 지면이 앞 창 하네스를 붉힘, 제안 mitigation: 관측 7. 지면을 build/d/ 밖에 두고 검사 #9 가 그 경로 조건을 직접 단언하며 #15 가 두 하네스 완주로 다시 잡는다"`
- 🟡 **MEDIUM** · 카드 블록이 B1 `assembled_span` 정의를 조용히 바꿈
  - 관련 결정: `insuniverse-docs-70-viewer-m4`
  - 가능성: 중
  - 완화책: 관측 8 과 같은 부류의 함정이다. 검사 `#10` 이 조립 스팬을 재계산해 `metrics.json` 값과 대조한다
  - 다음 액션: `/codex:rescue "리스크 완화: 카드 블록이 B1 assembled_span 정의를 조용히 바꿈, 제안 mitigation: 관측 8 과 같은 부류의 함정이다. 검사 #10 이 조립 스팬을 재계산해 metrics.json 값과 대조한다"`
- 🟡 **MEDIUM** · 역방향 유도가 종단 어휘를 항목으로 세어 엣지를 만듦
  - 관련 결정: `insuniverse-docs-70-viewer-m4`
  - 가능성: 중
  - 완화책: 종단(`막다름`·`없음`)은 33건 실재한다. 검사 `#5` 가 총계 보존을 보고 음성 케이스가 정확히 그 실패를 만든다
  - 다음 액션: `/codex:rescue "리스크 완화: 역방향 유도가 종단 어휘를 항목으로 세어 엣지를 만듦, 제안 mitigation: 종단(막다름·없음)은 33건 실재한다. 검사 #5 가 총계 보존을 보고 음성 케이스가 정확히 그 실패를 만든다"`
- 🟡 **MEDIUM** · 형제 PRD 가 문서를 더해 계수 리터럴이 깨짐
  - 관련 결정: `insuniverse-docs-70-viewer-m4`
  - 가능성: **높음**
  - 완화책: 계수를 검사에 리터럴로 두지 않는다(INV4). 관측 1 이 이미 378 → 492 이동을 봤다
  - 다음 액션: `/codex:rescue "리스크 완화: 형제 PRD 가 문서를 더해 계수 리터럴이 깨짐, 제안 mitigation: 계수를 검사에 리터럴로 두지 않는다(INV4). 관측 1 이 이미 378 → 492 이동을 봤다"`
- 🟡 **MEDIUM** · 앞 창 하네스가 재생성 없이 붉은 채로 넘어감
  - 관련 결정: `insuniverse-docs-70-viewer-m4`
  - 가능성: **높음**
  - 완화책: 관측 1 의 실측이다. 검사 `#15` 가 순서를 자기 안에 담고 재생성 전 계수도 함께 낸다
  - 다음 액션: `/codex:rescue "리스크 완화: 앞 창 하네스가 재생성 없이 붉은 채로 넘어감, 제안 mitigation: 관측 1 의 실측이다. 검사 #15 가 순서를 자기 안에 담고 재생성 전 계수도 함께 낸다"`
- 🟡 **MEDIUM** · golden 을 모르는 사이 움직임
  - 관련 결정: `insuniverse-docs-70-viewer-m4`
  - 가능성: 낮음
  - 완화책: 검사 `#1` + 닫는 `verify.sh --check`. `cmp` 선행으로 이진 차이를 계수 0 으로 놓치지 않는다
  - 다음 액션: `/codex:rescue "리스크 완화: golden 을 모르는 사이 움직임, 제안 mitigation: 검사 #1 + 닫는 verify.sh --check. cmp 선행으로 이진 차이를 계수 0 으로 놓치지 않는다"`
- 🟡 **MEDIUM** · 문서 횡단 `exits` 가 0건이라 그 코드 경로가 한 번도 안 돔
  - 관련 결정: `insuniverse-docs-70-viewer-m4`
  - 가능성: 중
  - 완화책: 관측 2. 검사 `#4` 의 음성 케이스가 픽스처로 그 갈래를 돌린다 , 0건을 통과로 읽지 않는다
  - 다음 액션: `/codex:rescue "리스크 완화: 문서 횡단 exits 가 0건이라 그 코드 경로가 한 번도 안 돔, 제안 mitigation: 관측 2. 검사 #4 의 음성 케이스가 픽스처로 그 갈래를 돌린다 , 0건을 통과로 읽지 않는다"`
- 🟡 **MEDIUM** · 원격 ref 가 오래된 fetch 라 rot 가 실제보다 낮게 나온다
  - 관련 결정: `insuniverse-docs-70-viewer-m5`
  - 가능성: 높음
  - 완화책: 생성기가 푼 tip SHA 와 그 커밋 날짜를 산출물에 박는다. fetch 는 호출자 책임이며 생성기 안에서 네트워크를 켜지 않는다(§NOT Building)
  - 다음 액션: `/codex:rescue "리스크 완화: 원격 ref 가 오래된 fetch 라 rot 가 실제보다 낮게 나온다, 제안 mitigation: 생성기가 푼 tip SHA 와 그 커밋 날짜를 산출물에 박는다. fetch 는 호출자 책임이며 생성기 안에서 네트워크를 켜지 않는다(§NOT Building)"`
- 🟡 **MEDIUM** · 뷰어 산출 루트가 `ownership.md` 에 없어 나중에 소유권 분쟁이 된다
  - 관련 결정: `insuniverse-docs-70-viewer-m5`
  - 가능성: 중
  - 완화책: 관측 4 로 사실을 확정하고 이월한다. 등재는 잠긴 재동결 슬롯을 요구하므로 마일스톤 2 가 findings 신설과 같은 창에서 한다
  - 다음 액션: `/codex:rescue "리스크 완화: 뷰어 산출 루트가 ownership.md 에 없어 나중에 소유권 분쟁이 된다, 제안 mitigation: 관측 4 로 사실을 확정하고 이월한다. 등재는 잠긴 재동결 슬롯을 요구하므로 마일스톤 2 가 findings 신설과 같은 창에서 한다"`
- 🟡 **MEDIUM** · `modified` 를 rot 로 세는 것이 과대계상이다 , 앵커 행이 안 움직였을 수 있다
  - 관련 결정: `insuniverse-docs-70-viewer-m5`
  - 가능성: 중
  - 완화책: 판정 단위가 파일임을 산출물 스키마와 §NOT Building 양쪽에 적는다. `modified` 는 "행 번호를 믿지 말라" 이지 "틀렸다" 가 아니다
  - 다음 액션: `/codex:rescue "리스크 완화: modified 를 rot 로 세는 것이 과대계상이다 , 앵커 행이 안 움직였을 수 있다, 제안 mitigation: 판정 단위가 파일임을 산출물 스키마와 §NOT Building 양쪽에 적는다. modified 는 \"행 번호를 믿지 말라\" 이지 \"틀렸다\" 가 아니다"`
- 🟡 **MEDIUM** · 형제 PRD 가 문서를 더하면 모집단이 조용히 늘어 계수가 흔들린다
  - 관련 결정: `insuniverse-docs-70-viewer-m5`
  - 가능성: 높음
  - 완화책: 계수를 계획서와 하네스 어디에도 리터럴로 박지 않는다(UI5·INV4). 검사는 파티션 성질과 집합 포함만 본다
  - 다음 액션: `/codex:rescue "리스크 완화: 형제 PRD 가 문서를 더하면 모집단이 조용히 늘어 계수가 흔들린다, 제안 mitigation: 계수를 계획서와 하네스 어디에도 리터럴로 박지 않는다(UI5·INV4). 검사는 파티션 성질과 집합 포함만 본다"`
- 🟡 **MEDIUM** · `.gitattributes` 가 뷰어 스크립트를 안 덮어 CRLF 로 체크아웃된다
  - 관련 결정: `insuniverse-docs-70-viewer-m5`
  - 가능성: 중
  - 완화책: 생성기가 자기 소스를 해싱하지 않는다. 입력은 전부 개행 정규화 후 파싱한다. `.gitattributes` 는 `00-protocol` 소유라 이 창이 glob 을 넓히지 않는다
  - 다음 액션: `/codex:rescue "리스크 완화: .gitattributes 가 뷰어 스크립트를 안 덮어 CRLF 로 체크아웃된다, 제안 mitigation: 생성기가 자기 소스를 해싱하지 않는다. 입력은 전부 개행 정규화 후 파싱한다. .gitattributes 는 00-protocol 소유라 이 창이 glob 을 넓히지 않는다"`
- 🟡 **MEDIUM** · PRD 전이가 verify.sh 의 ia 게이트를 깬다
  - 관련 결정: `insuniverse-docs-70-viewer-m5`
  - 가능성: 중
  - 완화책: 검사 `#11` 이 부록 B 위임 행의 digest 를 전이 전후로 대조한다. 그 행은 편집 대상이 아니다
  - 다음 액션: `/codex:rescue "리스크 완화: PRD 전이가 verify.sh 의 ia 게이트를 깬다, 제안 mitigation: 검사 #11 이 부록 B 위임 행의 digest 를 전이 전후로 대조한다. 그 행은 편집 대상이 아니다"`
- 🟡 **MEDIUM** · 프로브 주입이 형제 PRD 의 문서 편집에 깨진다
  - 관련 결정: `insuniverse-docs-70-viewer-m6`
  - 가능성: 중
  - 완화책: 특정 파일을 이름으로 고정하지 않고 축 성질(첫 정책 문서 · 첫 IA 문서)로 골라 유도한다. 고를 대상이 0건이면 이름 있는 실패
  - 다음 액션: `/codex:rescue "리스크 완화: 프로브 주입이 형제 PRD 의 문서 편집에 깨진다, 제안 mitigation: 특정 파일을 이름으로 고정하지 않고 축 성질(첫 정책 문서 · 첫 IA 문서)로 골라 유도한다. 고를 대상이 0건이면 이름 있는 실패"`
- 🟡 **MEDIUM** · 기대 메시지 조각이 소스 문면 변경에 깨진다
  - 관련 결정: `insuniverse-docs-70-viewer-m6`
  - 가능성: 중
  - 완화책: 그것이 결박의 목적이다 , 조각 0건은 `#6` 이 이름 있는 실패로 낸다. 문면을 고치면 프로브도 같은 창에서 고친다
  - 다음 액션: `/codex:rescue "리스크 완화: 기대 메시지 조각이 소스 문면 변경에 깨진다, 제안 mitigation: 그것이 결박의 목적이다 , 조각 0건은 #6 이 이름 있는 실패로 낸다. 문면을 고치면 프로브도 같은 창에서 고친다"`
- 🟡 **MEDIUM** · 커버리지 파티션이 사각지대를 계수로만 남긴다
  - 관련 결정: `insuniverse-docs-70-viewer-m6`
  - 가능성: 중
  - 완화책: `#8` 이 미덮음 전건을 행 번호와 메시지로 출력에 요구한다. 나열 0행이면 rc=1
  - 다음 액션: `/codex:rescue "리스크 완화: 커버리지 파티션이 사각지대를 계수로만 남긴다, 제안 mitigation: #8 이 미덮음 전건을 행 번호와 메시지로 출력에 요구한다. 나열 0행이면 rc=1"`
- 🟡 **MEDIUM** · 임시 트리 복사가 느려 게이트가 안 돌게 된다
  - 관련 결정: `insuniverse-docs-70-viewer-m6`
  - 가능성: 낮음
  - 완화책: 문서 트리 616KB 급이고 생성기 실행이 0.9초다. 프로브별 사본이 그 배수 안에 든다. 넘으면 `#7` 출력의 소요를 보고 축소 판정
  - 다음 액션: `/codex:rescue "리스크 완화: 임시 트리 복사가 느려 게이트가 안 돌게 된다, 제안 mitigation: 문서 트리 616KB 급이고 생성기 실행이 0.9초다. 프로브별 사본이 그 배수 안에 든다. 넘으면 #7 출력의 소요를 보고 축소 판정"`
- 🟡 **MEDIUM** · 게이트가 세 번째 소스를 더해 `#3`·`#13` 의 단일 파일 결박이 커진다
  - 관련 결정: `insuniverse-docs-70-viewer-m6`
  - 가능성: 중
  - 완화책: 두 검사는 `build-docs.mjs` 를 보고 `gate.mjs` 는 생성기가 아니다. 분할 축은 §NOT Building 이며 backlog 가 인수처를 진다
  - 다음 액션: `/codex:rescue "리스크 완화: 게이트가 세 번째 소스를 더해 #3·#13 의 단일 파일 결박이 커진다, 제안 mitigation: 두 검사는 build-docs.mjs 를 보고 gate.mjs 는 생성기가 아니다. 분할 축은 §NOT Building 이며 backlog 가 인수처를 진다"`
- 🟡 **MEDIUM** · 앞 창 하네스가 형제 델타로 붉어 이 창 귀속으로 오독된다
  - 관련 결정: `insuniverse-docs-70-viewer-m6`
  - 가능성: 중
  - 완화책: `#13` 이 §Files to Change 대조로 귀속을 가르고 문면 경로를 원인으로 읽지 않는다
  - 다음 액션: `/codex:rescue "리스크 완화: 앞 창 하네스가 형제 델타로 붉어 이 창 귀속으로 오독된다, 제안 mitigation: #13 이 §Files to Change 대조로 귀속을 가르고 문면 경로를 원인으로 읽지 않는다"`
- 🟡 **MEDIUM** · 교체 중 독자가 섞인 트리를 본다
  - 관련 결정: `insuniverse-docs-70-viewer-m8`
  - 가능성: 중
  - 완화책: **닫지 않는다**(§NOT Building) , 서빙 간접은 세대 저장소가 `build/` 밖으로 나가야 하고 그것이 추적 오염을 만든다(관측 7). 검사 `#14` 가 교체 소요를 실측 밀리초로 내 창의 크기를 값으로 남긴다
  - 다음 액션: `/codex:rescue "리스크 완화: 교체 중 독자가 섞인 트리를 본다, 제안 mitigation: 닫지 않는다(§NOT Building) , 서빙 간접은 세대 저장소가 build/ 밖으로 나가야 하고 그것이 추적 오염을 만든다(관측 7). 검사 #14 가 교체 소요를 실측 밀리초로 내 창의 크기를 값으로 남긴다"`
- 🟡 **MEDIUM** · 강제 종료가 live 와 휴지통을 갈라 놓는다
  - 관련 결정: `insuniverse-docs-70-viewer-m8`
  - 가능성: 낮음
  - 완화책: 의도를 rename 전에 fsync 하고 복구가 출발지·목적지 실재로 판정하므로 모든 이동이 멱등이다 , 검사 `#15` 가 지속 경계마다 종료를 주입한다
  - 다음 액션: `/codex:rescue "리스크 완화: 강제 종료가 live 와 휴지통을 갈라 놓는다, 제안 mitigation: 의도를 rename 전에 fsync 하고 복구가 출발지·목적지 실재로 판정하므로 모든 이동이 멱등이다 , 검사 #15 가 지속 경계마다 종료를 주입한다"`
- 🟡 **MEDIUM** · 죽은 실행의 락이 서비스를 영구 정지시킨다
  - 관련 결정: `insuniverse-docs-70-viewer-m8`
  - 가능성: 중
  - 완화책: 나이가 아니라 소유자 pid 생존으로 회수한다. 타 호스트 기록은 판정 불가라 회수하지 않고 이름 있는 실패로 낸다 , 검사 `#8` 이 세 축을 따로 잰다
  - 다음 액션: `/codex:rescue "리스크 완화: 죽은 실행의 락이 서비스를 영구 정지시킨다, 제안 mitigation: 나이가 아니라 소유자 pid 생존으로 회수한다. 타 호스트 기록은 판정 불가라 회수하지 않고 이름 있는 실패로 낸다 , 검사 #8 이 세 축을 따로 잰다"`
- 🟡 **MEDIUM** · 부분 생성기가 남의 산출을 지운다
  - 관련 결정: `insuniverse-docs-70-viewer-m8`
  - 가능성: **높음**
  - 완화책: 교체 대상을 호출자가 선언한 소유 집합으로 좁히고 그 밖은 이월한다(관측 11). 선언은 쓰기 지점에서 유도하고 검사 `#3` 이 선언과 실제를 양방향으로, `#17` 이 실제 픽스처로 문다
  - 다음 액션: `/codex:rescue "리스크 완화: 부분 생성기가 남의 산출을 지운다, 제안 mitigation: 교체 대상을 호출자가 선언한 소유 집합으로 좁히고 그 밖은 이월한다(관측 11). 선언은 쓰기 지점에서 유도하고 검사 #3 이 선언과 실제를 양방향으로, #17 이 실제 픽스처로 문다"`
- 🟡 **MEDIUM** · 앞 창 하네스가 발행 좌표 신설에 붉어진다
  - 관련 결정: `insuniverse-docs-70-viewer-m8`
  - 가능성: 중
  - 완화책: live 트리의 뿌리와 최상위 레이아웃을 바꾸지 않는다(관측 5). 좌표는 `build/` 안쪽이라 gitignore 로도 덮인다(관측 7). 생성기는 거절이 아니라 우회라 m2 의 `ensureBuild()` 가 산다(관측 6). 검사 `#13`·`#16`·`#17` 이 함께 문다
  - 다음 액션: `/codex:rescue "리스크 완화: 앞 창 하네스가 발행 좌표 신설에 붉어진다, 제안 mitigation: live 트리의 뿌리와 최상위 레이아웃을 바꾸지 않는다(관측 5). 좌표는 build/ 안쪽이라 gitignore 로도 덮인다(관측 7). 생성기는 거절이 아니라 우회라 m2 의 ensureBuild() 가 산다(관측 6). 검사 #13·#16·#17 이 함께 문다"`
- 🟡 **MEDIUM** · digest fence 가 형제 PRD 의 문서 편집에 거짓 실패한다
  - 관련 결정: `insuniverse-docs-70-viewer-m8`
  - 가능성: 중
  - 완화책: fence 는 **한 실행 안의 단계 사이**만 본다. 실행 사이의 변화는 대상이 아니며 다음 실행이 새 digest 로 시작한다
  - 다음 액션: `/codex:rescue "리스크 완화: digest fence 가 형제 PRD 의 문서 편집에 거짓 실패한다, 제안 mitigation: fence 는 한 실행 안의 단계 사이만 본다. 실행 사이의 변화는 대상이 아니며 다음 실행이 새 digest 로 시작한다"`
- 🟡 **MEDIUM** · 세 번째 소스가 단일 파일 스캔의 사각지대가 된다
  - 관련 결정: `insuniverse-docs-70-viewer-m8`
  - 가능성: 중
  - 완화책: 검사 `#3` 이 어휘·시계 스캔 대상을 파일 집합으로 열고 스캔한 목록을 출력에 낸다. 목록이 세 소스를 안 덮으면 붉다
  - 다음 액션: `/codex:rescue "리스크 완화: 세 번째 소스가 단일 파일 스캔의 사각지대가 된다, 제안 mitigation: 검사 #3 이 어휘·시계 스캔 대상을 파일 집합으로 열고 스캔한 목록을 출력에 낸다. 목록이 세 소스를 안 덮으면 붉다"`
- 🟡 **MEDIUM** · 테스트 전용 경계 훅이 평시 경로의 백도어가 된다
  - 관련 결정: `insuniverse-docs-70-viewer-m8`
  - 가능성: 중
  - 완화책: env 로만 켜지고 검사 `#3` 이 평시 발행에서 활성 0회와 경계 id 집합 ↔ 지속 지점 집합의 양방향 일치를 함께 요구한다
  - 다음 액션: `/codex:rescue "리스크 완화: 테스트 전용 경계 훅이 평시 경로의 백도어가 된다, 제안 mitigation: env 로만 켜지고 검사 #3 이 평시 발행에서 활성 0회와 경계 id 집합 ↔ 지속 지점 집합의 양방향 일치를 함께 요구한다"`
- 🟡 **MEDIUM** · receipt 가 최종 본문이 아닌 이전 본문을 증명한다
  - 관련 결정: `insuniverse-docs-70-viewer-m8`
  - 가능성: **높음**
  - 완화책: 최종 흡수 뒤 편집 없는 재봉인 라운드를 한 번 더 돈다. 검사 `#1` 이 receipt `plan_hash` 를 `hash-plan` 출력과 대조한다(원시 sha256 아님 , 구조 해시다)
  - 다음 액션: `/codex:rescue "리스크 완화: receipt 가 최종 본문이 아닌 이전 본문을 증명한다, 제안 mitigation: 최종 흡수 뒤 편집 없는 재봉인 라운드를 한 번 더 돈다. 검사 #1 이 receipt plan_hash 를 hash-plan 출력과 대조한다(원시 sha256 아님 , 구조 해시다)"`
- 🟡 **MEDIUM** · 스위트가 완주하지 못할 만큼 길어진다
  - 관련 결정: `insuniverse-docs-70-viewer-m8`
  - 가능성: 중
  - 완화책: 완주는 `check-all` 한 번이고 fast·stress 두 단계에 각각 timeout 이 있다. `#15` 는 소형 합성 트리로 돈다. 상한 초과는 이름 있는 실패다
  - 다음 액션: `/codex:rescue "리스크 완화: 스위트가 완주하지 못할 만큼 길어진다, 제안 mitigation: 완주는 check-all 한 번이고 fast·stress 두 단계에 각각 timeout 이 있다. #15 는 소형 합성 트리로 돈다. 상한 초과는 이름 있는 실패다"`
- 🟡 **MEDIUM** · 발행 좌표가 산출 바이트에 샌다
  - 관련 결정: `insuniverse-docs-70-viewer-m8`
  - 가능성: 중
  - 완화책: `--freshness-label` 로 읽는 경로와 표시용 이름을 가른다. 검사 `#10` 이 2회 실행 바이트 동일과 runId 문자열 0건을 함께 본다
  - 다음 액션: `/codex:rescue "리스크 완화: 발행 좌표가 산출 바이트에 샌다, 제안 mitigation: --freshness-label 로 읽는 경로와 표시용 이름을 가른다. 검사 #10 이 2회 실행 바이트 동일과 runId 문자열 0건을 함께 본다"`
- 🟡 **MEDIUM** · 봉인이 앞 창 하네스를 조용히 무디게 한다 , 통과시키려고 검사를 걷어냄
  - 관련 결정: `insuniverse-docs-70-viewer-m9`
  - 가능성: 중
  - 완화책: 검사 `#9` 가 merge-base 대비 변경 행을 결박 등록부로 묶는다. 그 밖 1행이면 rc=1
  - 다음 액션: `/codex:rescue "리스크 완화: 봉인이 앞 창 하네스를 조용히 무디게 한다 , 통과시키려고 검사를 걷어냄, 제안 mitigation: 검사 #9 가 merge-base 대비 변경 행을 결박 등록부로 묶는다. 그 밖 1행이면 rc=1"`
- 🟡 **MEDIUM** · 좌표 판정이 철자 변형으로 열린다
  - 관련 결정: `insuniverse-docs-70-viewer-m9`
  - 가능성: 중
  - 완화책: 검사 `#7` 이 같은 정본을 가리키는 철자 전 형태와 env 변형을 함께 본다. 판정은 해석된 절대경로 동등이다
  - 다음 액션: `/codex:rescue "리스크 완화: 좌표 판정이 철자 변형으로 열린다, 제안 mitigation: 검사 #7 이 같은 정본을 가리키는 철자 전 형태와 env 변형을 함께 본다. 판정은 해석된 절대경로 동등이다"`
- 🟡 **MEDIUM** · 게이트 진입 필수화가 독자의 빌드를 막는다 , `--repos-root` 를 못 주는 사용자
  - 관련 결정: `insuniverse-docs-70-viewer-m9`
  - 가능성: 중
  - 완화책: 거절 문면이 완전한 진입 명령을 낸다. 이 비용은 backlog 새 행으로 올려 다음 창이 진다
  - 다음 액션: `/codex:rescue "리스크 완화: 게이트 진입 필수화가 독자의 빌드를 막는다 , --repos-root 를 못 주는 사용자, 제안 mitigation: 거절 문면이 완전한 진입 명령을 낸다. 이 비용은 backlog 새 행으로 올려 다음 창이 진다"`
- 🟡 **MEDIUM** · `anchor-freshness.mjs` 의 동적 import 가 미러 사본에서 어긋난다
  - 관련 결정: `insuniverse-docs-70-viewer-m9`
  - 가능성: 낮음
  - 완화책: `build-docs.mjs:119` 가 같은 이유로 이미 동적이다. 검사 `#5`·`#6` 이 미러에서 돈다
  - 다음 액션: `/codex:rescue "리스크 완화: anchor-freshness.mjs 의 동적 import 가 미러 사본에서 어긋난다, 제안 mitigation: build-docs.mjs:119 가 같은 이유로 이미 동적이다. 검사 #5·#6 이 미러에서 돈다"`
- 🟡 **MEDIUM** · 정본 좌표 단일화가 `gate.mjs` 의 앞 창 결박을 건드린다
  - 관련 결정: `insuniverse-docs-70-viewer-m9`
  - 가능성: 낮음
  - 완화책: 바꾸는 것은 상수 하나의 출처뿐이고 값은 같다. 검사 `#3` 이 값 동등을, `#12` 가 m6·m8 완주를 본다
  - 다음 액션: `/codex:rescue "리스크 완화: 정본 좌표 단일화가 gate.mjs 의 앞 창 결박을 건드린다, 제안 mitigation: 바꾸는 것은 상수 하나의 출처뿐이고 값은 같다. 검사 #3 이 값 동등을, #12 가 m6·m8 완주를 본다"`
- 🟡 **MEDIUM** · PRD 두 자리 전이 중 하나만 뒤집힌다
  - 관련 결정: `insuniverse-docs-70-viewer-m9`
  - 가능성: 중
  - 완화책: 검사 `#10` 이 표 셀과 꼬리 토큰을 함께 본다
  - 다음 액션: `/codex:rescue "리스크 완화: PRD 두 자리 전이 중 하나만 뒤집힌다, 제안 mitigation: 검사 #10 이 표 셀과 꼬리 토큰을 함께 본다"`

</details>

---

_derived from .claude/ · v1.33.6_
