# Milestone Closure — 7-disposition-ledger-round2

## Milestone

- ID         : 7-disposition-ledger-round2
- Name       : 미결 처분 원장 + 리뷰 라운드 2
- PRD        : `.claude/prds/insuniverse-docs-40-runtime-vendor-legal.prd.md` (Delivery Milestones 7행)
- Plan       : `.claude/plans/insuniverse-docs-40-runtime-vendor-legal-m7.plan.md`
- Status     : done
- Closed at  : 2026-08-31T01:20:09.767Z
- Closed by  : /mccp:milestone-close (run_id=e7020f77-effa-406f-9fe5-ce61432b1013 · mccp 1.33.1)
- HEAD       : `f9420b8fbe76dcd981bba6d2dde76192976c1a73`

> **id 가 `7` 이 아닌 이유.** `.claude/milestone-closures/` 는 PRD 를 가르지 않는 평평한
> 디렉터리이고 `.claude/milestone-closures/7-relation-axis.md` 가 이미 추적 중이다. 행 번호만으로
> 이름을 지으면 PRD 가 다른 마일스톤끼리 파일명이 충돌해 앞의 closure 를 덮어쓴다. 이 PRD 의
> 앞선 여섯 건이 `<행>-<주제>` 규약을 쓰므로 그것을 따른다.

## Acceptance Condition

사용자가 `/goal` 에 넘긴 조건 원문:

> `.claude/plans/insuniverse-docs-40-runtime-vendor-legal-m7.gates.mjs all` 이 분자==분모로
> 통과하고, 7행 Status=complete 이며 closure doc 의 sha256 이 PRD provenance 행과 일치한다,
> or stop after 20 turns

## Goal Loop Result

세 항 전건 충족. `all` 최종 회차만은 자기 참조라 이 문서가 인용할 수 없다 — §4 에 그 한계를 적었다.

### 0) 진입 전 실측 — 왜 하네스를 고쳐야 했는가

**(a) M7 `#9a` 가 7행을 `in-progress` 값에 단방향으로 결박했다.** 포팅 전 문면:

```js
const statusCell = row7.cells.map(strip).find((c) => /^(planned|in-progress|complete|dropped)$/.test(c));
if (statusCell !== "in-progress") die(`#9a FAIL: 7행 Status='${statusCell}' (기대 in-progress)`);
```

계획서 Task 7 은 전이를 `/mccp:milestone-close` 에 **명시적으로 위임**한다 — *"Status 전이는
`milestone-close` 소유이므로 이 창은 그대로 둔다"*. 그런데 그 위임을 이행하는 순간 이 검사가
죽는다. 층위 2(주장 ≠ 검사)이고, **전이 전에만 돌리면 초록이라 어떤 라운드도 못 본다.**

이 축은 같은 자리를 이미 세 번 고쳤다 — M4 가 자기 종료 시점에 `#15c` 를 신설했고, M5 가 그것을
포팅했고, M6 이 `#12c` 로 다시 포팅했다. **M7 하네스에는 그 포팅이 없었다.** M7 은 이 PRD 의
마지막 마일스톤이라 하류 `#0a` 로 다른 창을 막지는 않지만, 하네스가 자기 종료에 붉어지는 것은 그
자체로 거짓 신호다.

**(b) M4 `#15` 가 형제 창의 미커밋 PRD 편집에 죽는다 — 이 종료에서 재현했다.** M5 종료가 실측해
backlog 에 이월한 사실이고(`id=40m5-m4-gate15-sibling-prd-edit`), M6 종료가 순서로 우회했다. 이
종료의 반사실 CF1 첫 시도에서 그대로 재현됐다:

```
#0a FAIL: M4 rc=1 (검사 check15 에서)
check9 중단: 선행 검사 check0 실패 — 선행 회귀가 깨진 상태에서는 M7 검사가 의미 없다
```

**M4 하네스는 종료된 창의 자산이라 이 종료도 고치지 않는다.** 해소는 순서다 — PRD 편집을 커밋한
뒤 `all` 을 돌리면 관련 하네스가 함께 커밋 후 모드로 간다.

### 1) `#9d` 종료 후 모드 — 포팅했고 종료 전 주장은 살아 있다

M6 `#12c` 를 M7 상수(`CLOSURE_ID` · `CLOSURE` · `PROV_HEADER`)로 포팅했다. **종료 여부를 PRD 의
자기 주장이 아니라 파일 바이트 해시로 판정한다:**

| 조건 | 판정 |
|---|---|
| `## Milestone Closure Provenance` 표에 `7-disposition-ledger-round2` 행이 정확히 1개 | 아니면 exit 1 |
| 그 행 `Verdict` 가 `done` | 아니면 exit 1 |
| 그 행 `Closure` 셀이 `.claude/milestone-closures/7-disposition-ledger-round2.md` | 아니면 exit 1 |
| 그 파일이 실재 | 아니면 exit 1 (행만 손으로 적는 것이 종료가 되지 않게) |
| 그 파일의 raw sha256 == 행의 `sha256` 셀 | 아니면 exit 1 |
| 행이 0개인데 closure 파일은 있음 | exit 1 (부분 종료 금지, 양방향) |

`closed` 가 정해지면 `#9a` 의 Status 판정이 **양방향**으로 문다 — 종료 전 `complete` 는 구현 창이
milestone-close 의 몫을 가로챈 것이고, 종료 후 `in-progress` 는 closure 가 섰는데 표가 안 따라온
것이다. 둘 다 실패다.

신규 의존 0(INV1)이다 — `fs` · `crypto` 는 이 하네스가 이미 `import` 하고 있었고 `#11c` 의 node
빌트인 목록 안이라 지정자 계수 7 이 안 움직인다. 표 읽기도 새 헬퍼 없이 이 하네스의
`sectionRange` · `tablesIn` 을 그대로 쓴다. `CHECKS` 등록부에 새 항목을 넣지 않았으므로 `#11` 의
4자 대조(등록부 · `--help` · `all` · 계획서 Validation 펜스 기대 집합) 15건도 안 움직인다.

**반사실 4건 — 실행해 확인했다.** 매 건 실행 후 `git checkout -- <PRD>` 와 임시 파일 삭제로
복원했고, 마지막에 `git status --porcelain` 이 하네스 파일 한 줄만 남긴 것을 확인했다.

| # | 만든 상태 | 관측 | rc |
|---|---|---|---|
| 1 | PRD 7행 `complete`, closure·provenance 없음 | `#9d ok [종료 전] provenance 행 0건` · `#9a FAIL: [종료 전] Status 가 complete 다 — complete 전이는 milestone-close 소유이며 이 창에 없다` | 1 |
| 2 | 7행 `complete` + closure 파일 + provenance 행, sha256 만 한 값 틀림 | `#9d FAIL: sha256 불일치 — 표 sha256:0000…0000 / 실측 sha256:e61275fd48b7…` | 1 |
| 3 | closure 파일만 있고 provenance 행 없음 | `#9d FAIL: closure 문서는 있는데 provenance 행이 없다 — .claude/milestone-closures/7-disposition-ledger-round2.md` | 1 |
| 4 | closure·provenance 정합인데 7행이 `in-progress` 그대로 | `#9d ok [종료 후] … sha256 일치` · `#9a FAIL: [종료 후] Status 가 아직 in-progress 다 — closure 가 섰는데 표가 안 따라왔다` | 1 |

1 은 **종료 전 주장이 살아 있음**을, 2·3 은 **행을 손으로 적는 것이 종료가 되지 않음**을, 4 는
**종료 후 주장이 실제로 문다**는 것을 각각 문다.

> **1·2·4 는 `M7_GATES_CHECK0=ok` 핸드오프로 `#0` 를 건너뛰고 `#9` 만 겨눴다.** 셋 다 PRD 를
> 더럽히므로 §0(b) 의 M4 `#15` 가 `#0a` 에서 먼저 죽는다. 3 은 PRD 를 안 건드리므로 핸드오프
> 없이 `#0` 를 통과해 `#9d` 까지 갔다. **핸드오프를 쓴 사실 자체가 이 표의 한계다** — 같은
> 트리에서 회차 1 이 `#0` 를 이미 통과시켰다는 것이 그 근거이며, 그 이상은 이 표가 지지 않는다.

> **첫 프로브는 rc 만 보고 침묵했다.** 중첩 `spawnSync` 로 돌린 1회차에서 CF1·CF2·CF4 가 출력
> 0줄에 rc 1 을 냈다. 종료코드만 보면 "전건 exit 1" 로 읽히지만 실제 사유는 `#9` 가 아니라
> `#0a` 였다. **출력을 파싱하지 않는 음성 케이스는 음성 케이스가 아니다** — 위 표의 관측 열은
> 전건 문면이다.

### 1b) 포팅이 같이 실어 온 결함 — 해시 대상이 raw 바이트였다

M4 `#15c` · M5 · M6 `#12c` 는 전부 `fs.readFileSync(CLOSURE)` 의 **raw 바이트**를 해시한다.
`.claude/milestone-closures/**` 는 `.gitattributes` 밖이고 이 저장소는 `core.autocrlf=true` 라,
커밋본이 LF 여도 다른 머신의 체크아웃 워킹트리는 CRLF 다. **문서를 저작한 워크트리에서만
초록인 검사**다. 포팅은 형태만 옮기지 그 형태의 결함은 안 옮겨 준다.

이 종료의 첫 스탬프도 그 형태였다. 고쳤다 — 해시 대상을 하네스의 `read()`(= `\r\n` → `\n`)
결과로 바꿨다. 스탬프 값은 안 바뀐다. 이 워크트리의 문서가 LF 라 raw 와 정규화 결과가 같기
때문이고, **그것이 정확히 이 결함이 여기서 안 보이던 이유**다.

**양성을 음성보다 먼저 뒀다** — 음성만 돌리면 정규화가 실제로 도는지 못 가른다.

| # | 만든 상태 | 관측 | rc |
|---|---|---|---|
| P0 | 기준 (closure LF) | `#9d ok [종료 후] … sha256 일치 sha256:e90b2ef1d3b3…` | 0 |
| P1 | **양성** — closure 를 CRLF 로 (CR 279바이트, raw 해시 `sha256:b95a9ba0ecc3…` 로 완전히 다름) | `#9d ok [종료 후] … sha256 일치 sha256:e90b2ef1d3b3…` — **같은 값** | 0 |
| P2 | **음성** — 표 sha256 셀만 `0`×64 | `#9d FAIL: sha256 불일치 — 표 sha256:0000…0000 / 실측 sha256:e90b2ef1d3b3… (EOL 정규화 후)` | 1 |

P1 의 raw 해시(`b95a9ba0…`)가 스탬프(`e90b2ef1…`)와 다르다는 것이 **고치기 전 문면이라면 그
자리에서 붉었을 것**이라는 반증이다. P2 는 정규화가 검사를 무르게 하지 않았음을 문다.

복원은 `git checkout` 이 아니라 바이트 되쓰기로 했다 — `core.autocrlf=true` 라 checkout 이
CRLF 를 준다. 프로브 후 `git status --porcelain` 이 하네스 파일 한 줄만 남긴 것을 확인했다.

**형제 M4·M5·M6 하네스는 고치지 않았다.** 종료된 창의 자산이고, 이 종료의 배타 소유 밖이다.
그 셋은 raw 인 채로 남는다 — 다른 체크아웃에서 붉어질 것이라는 사실이 여기 기록으로 남는다.

### 2) PRD Delivery Milestones 7행 — `complete`

```
| 7 | 미결 처분 원장 + 리뷰 라운드 2 | … | complete | `.claude/plans/insuniverse-docs-40-runtime-vendor-legal-m7.plan.md` |
```

PRD 꼬리의 `*Status: DRAFT*` 행은 **그대로 둔다.** 이 전이로 일곱 행이 전건 `complete` 가 되지만
PRD 자체의 아카이브 전이는 `/mccp:archive-complete` 소유다. 이 축의 여섯 하네스 어디에도
`*Status:` 토큰을 읽는 검사는 없다(`grep -l` 0건).

### 3) closure 문서와 provenance 행 — 섰다

이 문서와 PRD `## Milestone Closure Provenance` 표의 일곱 번째 행. **계획서 본문에는 아무것도 쓰지
않는다** — 아래 §계획서 본문 무편집.

### 4) `all` 15/15 — 측정 회차와 그 한계

이 종료가 건 회차는 여섯이다. **붉었던 회차를 지우지 않는다.**

| 회차 | 트리 상태 | `#9` 모드 | 결과 |
|---|---|---|---|
| 1 | `f9420b8` — 구현 창 봉인 (포팅 전) | 커밋 후 · (종료 축 없음) | `all ok 15/15` — 아래 출력 |
| 2 | 회차 1 트리 + `#9d` 포팅, PRD 무편집 | 커밋 후 · 종료 전 | `#9` 단독 5줄 ok — 아래 출력 |
| 3 | `#9d` 포팅 + 반사실 4건 주입 | 미커밋 · 종료 전/후 | 전건 `rc 1` — §1 표 |
| 4 | PRD 두 줄 + **이 문서 초판**, 커밋 후 (`021e8a7`) | 커밋 후 · 종료 후 | `all ok 15/15` · `#9d ok [종료 후] … sha256 일치` |
| 5 | `#9d` 해시 대상을 `read()` 정규화로 + 양성·음성 프로브 | 커밋 후 · 종료 후 | P1 초록 · P2 `rc 1` — §1b 표 |
| 6 | 이 문서 개정판 재스탬프 후 재실행 | 커밋 후 · 종료 후 | **이 문서가 인용할 수 없다** — 아래 |

**회차 4 의 출력은 이 문서 *초판* 바이트 기준이다.** §1b 의 개정으로 이 문서가 바뀌었으므로 그
회차가 확인한 sha256 은 더 이상 현행 스탬프가 아니다. 회차 4 가 지는 진술은 *"종료 후 모드가
15/15 로 성립한다"* 이지 *"현재 스탬프가 맞다"* 가 아니다. 후자는 회차 6 이 진다.

**회차 6 을 이 문서는 인용할 수 없다.** 그것이 보는 트리는 이 문서를 포함하고 이 문서의 sha256 은
그 트리의 PRD provenance 행에 실려 있다 — 자기 참조다. 회차 6 의 실행 시점에 이 문서의 바이트는
이미 고정돼 있어야 하고, 그 출력을 여기 적으면 해시가 어긋나 `#9d` 가 즉시 죽는다. M4 · M5 · M6
closure 도 같은 자리에서 같은 한계를 적었다.

**회차 6 의 성립은 회차 1·2·4 와 회차 5 의 곱으로 서 있다** — `#0`~`#8` · `#10`~`#14` 는 PRD 두 줄과
이 문서의 바이트에 불변이고(회차 1·4 가 그 열네 검사를 통과시켰고 그 검사들은 7행·provenance
절을 읽지 않는다), `#9` 는 종료 후 모드에서 초록이며(회차 4) 그 초록이 EOL 에 불변임을 회차 5 가
직접 물었다.

회차 1 출력 (rc 0):

```
#0a ok 선행 하네스 완주 M1 15/15 · M2 13/13 · M3 14/14 · M4 16/16 · M5 16/16 · M6 13/13
#0a 캐시 키 입력 — M1 7건 · M2 11건 · M3 13건 · M4 20건 · M5 30건 · M6 28건 (하네스 소스에서 유도 · 리터럴 아닌 조립 경로는 미포함)
#0b ok 11문서 귀속 — 이 창 편집 0건 (없음), 형제 창 드리프트 0
#0c ok 동결 3트리 포인터가 manifest repos[].head 이고 commit 으로 열린다 — server 4d798f55 site 767d1e44 admin fb001e1d
#0d ok lint 11개 파일 위반 0 (--strict-refs)
#0 ok plan-kit selftest mismatch=0
#1a ok backlog 재열거 70건 (평문 24 · 표 46)
#1b ok digest 픽스처 재현 — backlog 220행 → 96feb4854e602152
#1 ok 처분 원장 70/70 · 유령 0 · 누락 0 · digest 충돌 0
#12a ok mccp backlog.js 재열거 this-PRD 46건 (전체 168 · invalid 0)
#12b ok fixtask-projection 재열거 this-PRD 24건 (spawn 한 자식의 stdout)
#12 ok visible_to 유도 일치 — mccp46 fixtask24, 46+24 == #1a 재열거 70 (교집합 0 은 가정이 아니라 키 집합 교차로 유도)
#12c ok 이중 기입 3쌍 — 각 logical_finding_id 가 정확히 2 물리 행이고 visible_to 가 {mccp, fixtask}
#2 ok verdict 분포 closed-here=31 referred=11 product-defect=9 out-of-scope-standing=0 still-open=19 · 어휘 밖 0 · evidence 미해결 0
#3 skip findings 파일 부재 — Task 0 판정 blocked=yes, 처분 원장 9행이 referred 로 그 사실을 싣는다
#4 skip findings 파일 부재 — Task 0 판정 blocked=yes, 원장 9행이 referred 로 그 사실을 싣고 대상 11건은 인수처로 이월된다
#5a golden findings.files 8개: 00-protocol.md 10-index-git.md 11-index-code.md 12-index-runtime.md 13-relation-contract.md 20-foundation-access.md 60-history-deprecated.md README.md
#5a 실 디렉터리 8개: 00-protocol.md 10-index-git.md 11-index-code.md 12-index-runtime.md 13-relation-contract.md 20-foundation-access.md 60-history-deprecated.md README.md
#5 ok golden findings.files 8개 == 실 디렉터리 8개
#5b ok blocked=yes — golden 동결 집합과 실 디렉터리를 직접 대조해 유도 (golden findings.files 동결 8건에 40-runtime-vendor-legal.md 가 없다 — 개설하면 유도 집합이 8에서 9로 커져 --check 가 어긋나고, 해소에 필요한 verify.sh -)
#6 ok round=2 · 문서 sha256 11/11 실측 일치 · frozen 3포인터 == manifest · prior_ledger sha256 일치 · id 중복 0 · 좌표 초과 0
#7a ok 라운드 1 표기 재유도 빠짐 8 · 미검증 138 (M6 원장에서 유도)
#7 ok 라운드 2 수렴 계수 0 (사실과다름 0 + 빠짐 0) · 라운드 1 비-ok id 146건 전건 재등장
#13a ok 라운드 2 id 집합 1370건 == 문서 독립 재유도 1370건 (누락 0 · 유령 0)
#13b ok 수렴 계수 재계산 0 == 원장 기재 0
#13 ok 지표 상태 = 미충족 — 연속 0건 2회는 라운드 3 이상 필요. 수열 [8, 0]
#8a ok 선행 하네스 6종 실행 대조 — 강제 지점 0건 · 적용 범위 0건 · 예외·폴백 0건 · 동의 기록의 두 문면 0건
#8 ok 미검증 138 중 결박 111 (anchor 71 · table 40) · 미결박 27 · 미결박 사유 전건 보유 (onboarding 10건 = R-1 차단 · 근거가 저장소 밖이라고 문서가 명시한다 (gate-value-unknow… 17건)
#9a ok Delivery Milestones 7행 존재 · Status=in-progress · Plan 셀이 이 계획서
#9b ok 6행 바이트 무변동 (기준선 blob eeb75d37 대조)
#9c ok 회부 R-1~R-4 전건에 판정 열
#9 ok 개정 이력 신규 3행 (기준선 11 → 현재 14)
#10a 허용 접두 14개: docs/05-schedules/ · docs/06-vendors/ · docs/07-legal/ · docs/_meta/findings/40-runtime-vendor-legal.md · .claude/prds/insuniverse-docs-40-runtime-vendor-legal · .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m7 · .claude/notes/insuniverse-docs-40-runtime-vendor-legal-m7 · .claude/PRPs/reports/insuniverse-docs-40-runtime-vendor-legal-m7 · .claude/receipts/ · .claude/plans/codex-findings-backlog.md · .claude/settings.json · .claude/state/ · .claude/reviews/ · .claude/milestone-closures/
#10 ok 편집 13건 전부 허용 접두 안 · 귀속 밖(내용이 origin/main 와 동일) 22건 제외
#10b ok .claude/settings.json 변경 env 키 3건 전부 허용 안 (MCCP_PLAN_REVIEW · MCCP_REVIEW_SINGLE_PASS · MCCP_PLAN_REVIEW_L3) · env 밖 최상위 무변동
#11a ok 기대 집합 15건 — 계획서 Validation 펜스에서 파싱
#11b ok 알 수 없는 서브커맨드 거부 (이름을 찍고 exit 1)
#11c ok import 지정자 7건 전건이 node 빌트인 (신규 의존 0)
#11 ok 등록부 == help == all == 기대 집합 (4자 정확 일치 15건)
#14a ok plan-codex receipt codex_disabled=false codex_verdict=converged
#14b ok 실효 정책 codex_disabled=false (출처 codex-policy 봉인 false · env 부재)
#14c ok 잔여 캡 MCCP_GATE_ROUND_CAP=3 MCCP_SANTA_ROUND_CAP=5
all ok 15/15 통과
```

`#0a` 가 선행 여섯 하네스의 회귀를 선행 검사하므로 이 출력은 이 종료가 앞선 여섯 마일스톤의
산출물을 건드리지 않았다는 진술을 함께 진다. `#0b` 가 11문서 무변동을 따로 문다.

회차 2 출력 (rc 0 · `#9d` 포팅 직후, PRD 무편집):

```
#9d ok [종료 전] provenance 행 0건 · closure 문서 부재 (.claude/milestone-closures/7-disposition-ledger-round2.md)
#9a ok [종료 전] Delivery Milestones 7행 존재 · Status=in-progress · Plan 셀이 이 계획서
#9b ok 6행 바이트 무변동 (기준선 blob eeb75d37 대조)
#9c ok 회부 R-1~R-4 전건에 판정 열
#9 ok 개정 이력 신규 3행 (기준선 11 → 현재 14)
```

회차 4 의 `#9` (rc 0 · 이 문서 **초판** 바이트 기준):

```
#9d ok [종료 후] provenance 행 1건 · Verdict done · closure 실재 · sha256 일치 sha256:e90b2ef1d3b3f0c7628dcbf254c261507c7e3c1a97b1c8368a7c9140a176b408
#9a ok [종료 후] Delivery Milestones 7행 존재 · Status=complete · Plan 셀이 이 계획서
#9b ok 6행 바이트 무변동 (기준선 blob eeb75d37 대조)
#9c ok 회부 R-1~R-4 전건에 판정 열
#9 ok 개정 이력 신규 3행 (기준선 11 → 현재 14)
all ok 15/15 통과
```

## 이 마일스톤이 실제로 낸 것

| 산출 | 무엇 |
|---|---|
| `…m7.disposition.jsonl` | 처분 원장 70행. backlog 재열거 70건(평문 24 · 표 46)과 양방향 일치 · 유령 0 · 누락 0 |
| `…m7.ledger.jsonl` | 라운드 2 원장 1370행. id 집합이 11문서 독립 재유도와 정확 일치 |
| `…m7.gates.mjs` | 검사 15종(`#0`~`#14`). `visible_to` 를 두 소비기의 **실행 출력**에서 유도하는 `#12` 가 이 창에서 처음 생겼다 |
| `…m7.digest-fixture.json` · `…m7.probe0.sh` | digest 정규화 동결 픽스처와 Task 0 봉쇄 판정 프로브 |

**PRD Outcome 문면은 *"backlog 64행 전건"* 이라고 적었지만 실측은 70행이다.** 계획 시점의 수를
Outcome 이 리터럴로 담은 자리이고, 하네스는 리터럴이 아니라 재열거로 분모를 만든다(`#1a`). 이
문서는 실측을 싣는다. 문면 정정은 이 종료가 하지 않았다 — PRD Outcome 셀 수정은 6행 무변동을 무는
`#9b` 와 무관한 7행 안이지만, 계획서 §NOT Building 이 위임하지 않은 편집이다.

## 지표 미충족 — 이 종료가 `done` 인데도 닫지 않은 것

**PRD Success Metric *"리뷰 불일치 수렴 = 2라운드 연속 0건"* 은 미충족이다.** 라운드 2 의 수렴
계수는 0 이지만 수열이 `[8, 0]` 이라 연속 0건 2회가 아니다. `#13` 이 그것을 `미충족` 으로 내고
**exit 0** 이다 — 단 그 exit 0 은 `#13a`(id 집합 독립 재유도 일치) · `#13b`(수렴 계수 재계산 일치)가
먼저 통과했을 때만 허용된다. 즉 이 마일스톤이 약속한 것은 *지표 충족*이 아니라 **지표 상태의
실측 기록**이었고, 그것은 충족됐다.

라운드 3 은 이 PRD 에 없다. 지표 충족은 후속 판단이며 이 종료가 대신 선언하지 않는다.

## 이 종료가 판정하지 않은 것

- **closure 문서의 내용.** `#9d` 는 이 파일의 실재와 바이트 해시만 본다. acceptance 가 실제로
  충족됐는가는 이 본문이 지며 그것은 사람 판정이다.
- **Success Metric 충족.** 위 §지표 미충족. 수열 `[8, 0]` 이 그대로 남는다.
- **`docs/_meta/findings/40-runtime-vendor-legal.md` 개설.** Task 0 판정 `blocked=yes` — golden
  `findings.files` 동결 8건에 이 파일이 없고 재동결 위임이 이 PRD 에 없다(INV4). `#3` · `#4` 가
  `skip` 으로 그 사실을 출력에 싣고, 처분 원장 9행이 `referred` 로 이월한다.
- **`still-open` 19건 · `referred` 11건 · `product-defect` 9건.** 판정은 붙었고 해소는 각 인수처
  소유다. `#2` 가 어휘와 분포를 문다.
- **M4 `#15` 의 모드 분기 키.** §0(b). 이 종료는 순서로 우회했을 뿐 고치지 않았다.
- **M4 `#15c` · M5 · M6 `#12c` 의 raw 바이트 해시.** §1b. 셋 다 `core.autocrlf=true` 인 다른
  체크아웃에서 붉어진다. 이 종료는 M7 `#9d` 만 고쳤다 — 나머지 셋은 종료된 창의 자산이다.
- **PRD Outcome 셀의 `64행`.** 위 §이 마일스톤이 실제로 낸 것.
- **계획서 산문과 하네스의 드리프트.** 계획서 Acceptance 는 *"PRD 7행이 `in-progress` 로 서고"*,
  Validation 펜스 `# 기대:` 주석은 *"`#9a ok … Status=in-progress`"* 라고 적었다. `#9d` 포팅으로
  하네스는 양방향이 됐지만 **계획서 본문은 고치지 않았다** — 본문은 receipt 앵커다(아래). 이
  문서가 그 정정을 진다.

## 계획서 본문 무편집 — receipt `plan_hash` 재검증

provenance 는 계획서가 아니라 **PRD** 에 싣는다. 계획서 본문은 `mccp-plan-codex` ·
`mccp-implement-codex` 두 receipt 의 `plan_hash` 앵커이고 거기에 절을 덧붙이면 두 게이트가 동시에
stale 로 떨어진다. 재앵커는 봉인된 판정을 사후에 옮기는 것이라 쓰지 않는다.

`hash-plan` 재계산값과 두 receipt 의 `plan_hash` 가 같다:

```
$ node .../receipt/cli.js hash-plan .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m7.plan.md
sha256:3b8c511c3ddfe115f9a833bf8611941a9a00de57f17222fbc6b13a8f214c2c5f

.claude/receipts/mccp-plan-codex/insuniverse-docs-40-runtime-vendor-legal-m7.json
  "plan_hash": "sha256:3b8c511c3ddfe115f9a833bf8611941a9a00de57f17222fbc6b13a8f214c2c5f"
.claude/receipts/mccp-implement-codex/insuniverse-docs-40-runtime-vendor-legal-m7.json
  "plan_hash": "sha256:3b8c511c3ddfe115f9a833bf8611941a9a00de57f17222fbc6b13a8f214c2c5f"
```

`gates.mjs` 는 `planAwareMarkdownHash` 사정거리 밖(plan `.md` 단일 파일만 해시)이라 `#9d` 포팅이
receipt 체인을 움직이지 않는다.

## Provenance

- Lock run_id        : `e7020f77-effa-406f-9fe5-ce61432b1013`
- Lock owner session : `b275e6f4-8f00-4cdc-bb48-b26244a60677`
- Milestone id       : `7-disposition-ledger-round2`
- PRD source         : `.claude/prds/insuniverse-docs-40-runtime-vendor-legal.prd.md`
- Plan source        : `.claude/plans/insuniverse-docs-40-runtime-vendor-legal-m7.plan.md`
- Detection signal   : `{"availability":"available","goal_signal":true,"signal_ref":{"row":7,"name":"미결 처분 원장 + 리뷰 라운드 2","plan":".claude/plans/insuniverse-docs-40-runtime-vendor-legal-m7.plan.md","status":"in-progress"},"mode":"milestone-close","reason":"ok"}`
- Lock 순서 역전     : Phase 4 의 lock exit 를 Phase 3 앞으로 당겼다. `goal-phase-guard.js` 가
  lock 활성 중 Bash 를 default-deny 로 돌려 이 저장소의 acceptance 하네스를 못 돌리기 때문이다.
  대안은 실측 없이 verdict 만 받는 것이고 그것은 낡은 증거를 봉인한다.
- Gate               : option B — 별도 `mccp-milestone-close-codex` receipt 를 발행하지 않는다. 이
  문서 body 와 PRD provenance 행의 sha256 이 감사 앵커이고, 그 대조는 M7 `#9d` 가 매 실행 진다.
- mccp version       : 1.33.1
