# Milestone Closure — 6-access-review-convergence

## Milestone

- ID         : `6-access-review-convergence`
- Row        : `6` — 리뷰 2라운드 수렴
- PRD        : `.claude/prds/insuniverse-docs-20-foundation-access.prd.md`
- Plan       : `.claude/plans/insuniverse-docs-20-foundation-access-m6.plan.md`
- Status     : **done**
- Closed at  : 2026-08-31T00:35:28.274Z
- Closed by  : `/mccp:milestone-close` (run_id `a1ed9efc-1940-4a60-9810-a21beca8bd11`)
- Head at close : `97030266ff528dd3c99babcaa8d5a5afe7c7e9fe`

파일명 슬러그에 축(`access`)을 붙인 이유는 형제 PRD 40 의 M6 가 같은 이름
(`6-review-convergence`)을 이미 점유했기 때문이다. `.claude/milestone-closures/` 는
저장소 전역 한 디렉터리라 `<행번호>-<슬러그>` 관례만으로는 축이 갈리지 않는다.

## Detection signal

`/mccp:milestone-close` Phase 1 이 낸 원문:

```json
{"availability":"available","goal_signal":true,"signal_ref":{"row":6,"name":"리뷰 2라운드 수렴","plan":".claude/plans/insuniverse-docs-20-foundation-access-m6.plan.md","status":"in-progress"},"mode":"milestone-close","reason":"ok"}
```

## Acceptance Condition

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

> 마일스톤 6 종료가 완결됐다: (1) `.claude/milestone-closures/6-access-review-convergence.md`
> 가 존재하고 측정 회차를 전건(붉은 회차 포함) 싣는다, (2) PRD
> `.claude/prds/insuniverse-docs-20-foundation-access.prd.md` 에
> `## Milestone Closure Provenance` 절과 그 6행 항목이 있고 sha256 이 closure 파일 실측과
> 같다, (3) PRD 마일스톤 표 6행 Status 와 `*Status:` 첫 토큰이 둘 다 `complete` 다,
> (4) `m6.gates.mjs` 의 `#12` 가 closure 파일 sha256 으로 종료 여부를 판정하고 Status 를
> 양방향으로 물며 `#0a` 가 `complete` 모드를 받는다, (5)
> `node .claude/plans/insuniverse-docs-20-foundation-access-m6.gates.mjs check-all` 이
> 전이 후 13/13 통과한다, (6) 반사실 4건(종료 전 complete / sha256 불일치 / 파일만 있고 행
> 없음 / 종료 후 in-progress)이 전건 rc 1 이다. 또는 20 turn 후 정지.

## Goal Loop Result

`goal-done` — 여섯 조건 전건 실측으로 충족. 근거는 아래 §측정 회차 · §하네스 개정 ·
§반사실. 계획서 §Acceptance 가 `(미검증)` 으로 사람에게 위임한 다섯 항목은 §미검증으로
남는 것에 이름으로 싣는다 — 이 종료는 그 다섯을 통과시킨 것이 아니라 **측정자가 이 창 밖에
있다는 사실을 확정한 것**이다.

## 측정 회차

`node .claude/plans/insuniverse-docs-20-foundation-access-m6.gates.mjs check-all` 전건 실행.

| 회차 | 상태 | 결과 | 붉은 검사 | 사유 |
|---|---|---|---|---|
| 1 | 전이 전 · 하네스 원본 | **13/13 초록** | — | 착수 판정 기준선 |
| 2 | PRD 6행·`*Status:` 를 `complete` 로 전이 · 하네스 원본 | **11/13 붉음** | `check0` `check12` | `#0a` 모드 유도가 `pending\|in-progress` 만 받고, `#12a` 가 6행에 `in-progress` 리터럴을 요구 |
| 3 | 전이 후 · 하네스 개정 · closure/provenance 부재 | **12/13 붉음** | `check12` | `#12c` 가 `[종료 전]` 으로 판정했는데 표가 이미 `complete` — 설계된 양방향 거부 |
| 4 | 전이 후 · 하네스 개정 · closure + provenance 봉인 | **13/13 초록** | — | 종료 상태 |
| 5 | 반사실 문면을 이 문서에 싣고 재스탬프 | **13/13 초록** | — | 회차 4 와의 델타는 이 문서 바이트와 그 해시뿐 |
| 6 | `#12c` 해시를 EOL 정규화로 고치고 재스탬프 | **13/13 초록** | — | §EOL 함정 |

회차 2 는 결함의 반사실이다. 계획서 §NOT Building 이 `complete` 전이를
`/mccp:milestone-close` 에 **명시적으로 위임**했는데 `#12a` 는 전이 **전** 값에 결박돼
있었다 — 위임을 이행하는 순간 자기 게이트가 붉어지는 층위 2(주장 ≠ 검사)이고, 전이 전에만
돌리면 초록이라 어떤 리뷰 라운드도 이 자리를 보지 못했다.

회차 2 에서 `#0a` 의 붉음 문면은 다음과 같다.

```
#0a FAIL: PRD 표 6행 Status 가 'pending' 도 'in-progress' 도 아니다 — 'complete' (모드를 유도할 수 없다)
#12a FAIL: 표 6행 Status 가 in-progress 가 아니다 — 'complete' (complete 전이는 /mccp:milestone-close 소유이고 라운드 2 는 이 창에 없다)
check-all FAIL: 11/13 (실패: check0 check12) — 전건 실행 후 집계
```

**마지막 회차는 구조적으로 이 표에 담기지 않는다.** 어떤 회차의 결과를 이 문서에 적는
순간 문서 바이트가 바뀌고 provenance 의 sha256 을 다시 스탬프해야 하며, 그 뒤의 재실행이
다음 회차다. 자기 해시를 담는 문서는 만들 수 없다. 표의 마지막 행(회차 6)을 적은 뒤의
재실행 결과는 종결 커밋이 진다 — 그 회차와 회차 6 의 델타는 이 문서의 바이트와 그
해시뿐이고, 그 둘이 서로 정합인지는 `#12c` 가 매 실행마다 다시 문다.

## 하네스 개정

`.claude/plans/insuniverse-docs-20-foundation-access-m6.gates.mjs` 3곳. 이 파일은
`planAwareMarkdownHash` 사정거리 밖(plan `.md` 단일 파일만 해시)이라 `mccp-plan-codex` ·
`mccp-implement-codex` receipt 체인은 움직이지 않는다. 계획서 본문은 손대지 않았다.

| # | 자리 | 개정 | 왜 |
|---|---|---|---|
| 1 | `#0a` 모드 유도 | `pending` · `in-progress` 두 모드에 `complete` 를 더해 셋 | 종료 전이가 모드 유도를 죽이면 하네스가 자기 종료에 붉어진다 |
| 2 | `RED_ROW6_MOVED` 선택 | `mode === "in-progress"` 를 `mode !== "pending"` 으로 | m5 `check22` 는 6행에 `pending` 을 요구하므로 `in-progress` 와 `complete` **양쪽**에서 붉다. `in-progress` 한 값에만 걸면 종료 뒤 기대가 조용히 어긋난다 |
| 3 | `#12c` 신설 · `#12a` 양방향 | 종료 여부를 PRD 의 자기 주장이 아니라 **closure 파일 raw sha256** 으로 판정하고, 그 판정으로 6행 Status 와 `*Status:` 토큰을 양방향으로 문다 | 40축 `insuniverse-docs-40-runtime-vendor-legal-m6.gates.mjs` `#12c` 포팅 (그 축에서 M4 `#15c` → M5 → M6 으로 3회 반복된 정본 형태) |

| 4 | `#12c` 해시 대상 | raw 바이트가 아니라 **EOL 정규화 내용** | 포팅한 원본의 결함. §EOL 함정 |

`#12c` 의 판정 전건 — provenance 행이 정확히 0 또는 1건 · `Verdict == done` · `Closure`
셀이 이 파일 경로 · 파일 실재 · `sha256(EOL 정규화 내용) == 행의 값`. 행만 보고 닫혔다고 하면
행을 손으로 적는 것이 곧 종료가 되고 그 검사는 전이를 승인하는 도장이 된다. 부분 종료는
양방향으로 거부한다 — 행은 있는데 파일이 없어도, 파일은 있는데 행이 없어도 실패다.

전이 전후로 `#0a` 의 기대 집합이 한 건 줄었고 그 델타가 설계와 일치한다.

| | 표 6행 | `*Status:` 토큰 | 기대 붉음 | 초록 |
|---|---|---|---|---|
| 회차 1 | `in-progress` | `in-progress` (이동) | 13건 (`m1#check7` 포함) | 72/72 |
| 회차 3·4 | `complete` | `complete` (미이동) | 12건 | 73/73 |

`m1#check7` 은 `*Status:` 첫 토큰을 마일스톤 표 **1행** Status(`complete`)에 결박한다.
이 창이 토큰을 `in-progress` 로 옮기는 동안 붉었고, 종료로 토큰이 `complete` 로 돌아오며
초록이 됐다. 하네스는 그 축을 `STATUS_TOKEN_AT_REST` 로 이미 따로 들고 있었으므로 개정
대상이 아니었다.

## 반사실

수정 전/후로 결과가 뒤집히는지 각 건 실행해 확인한 관찰. 전건 rc 1.

| # | 조작 | 기대 | 실측 |
|---|---|---|---|
| 1 | 종료 전(provenance 행·closure 파일 없음)인데 표 6행 `complete` | `#12a` 거부 | rc 1 — 회차 3 |
| 2 | provenance 행의 sha256 첫 글자만 `3`→`a` | `#12c` 거부 | rc 1 |
| 3 | closure 파일은 있는데 provenance 행 없음 | `#12c` 거부 | rc 1 |
| 4 | 종료 후(행·파일 정상)인데 표 6행 `in-progress` | `#12a` 거부 | rc 1 |

### 반사실 실행 기록

원본을 `mktemp -d` 사본으로 두고 조작한 뒤 되돌렸다. 복구는 `trap ... EXIT` 이 지고
복구 후 sha256 재대조로 확인했다 (`restore ok (PRD 9d47ee2e41b1 · closure 3be6b8744491)`).

```
=== 반사실 1 (회차 3 에서 관측) ===
#12c ok [종료 전] provenance 행 0건 · closure 문서 부재 (.claude/milestone-closures/6-access-review-convergence.md)
#12a FAIL: [종료 전] 표 6행 Status 가 'complete' 다 — 'in-progress' 여야 한다 (complete 전이는 /mccp:milestone-close 소유이고 라운드 2 는 이 창에 없다)

=== 반사실 2: provenance sha256 한 글자 틀림 ===
rc=1
#12c FAIL: sha256 불일치 — 표 sha256:abe6b8744491d73a43d29ba9b16225d043e80e31e35dac08d89c1f899ddfeb4b / 실측 sha256:3be6b8744491d73a43d29ba9b16225d043e80e31e35dac08d89c1f899ddfeb4b

=== 반사실 3: closure 파일은 있는데 provenance 행 없음 ===
rc=1
#12c FAIL: closure 문서는 있는데 provenance 행이 없다 — .claude/milestone-closures/6-access-review-convergence.md

=== 반사실 4: 종료 후인데 표 6행 in-progress ===
rc=1
#12c ok [종료 후] provenance 행 1건 · Verdict done · closure 실재 · sha256 일치 sha256:3be6b8744491d73a43d29ba9b16225d043e80e31e35dac08d89c1f899ddfeb4b
#12a FAIL: [종료 후] 표 6행 Status 가 'in-progress' 다 — 'complete' 여야 한다 (closure 가 섰는데 표가 안 따라왔다)
```

반사실 2 의 문면에 실린 sha256 은 **이 문서의 종전 바이트**다. 이 절을 더하며 문서가
바뀌었고 provenance 는 새 해시로 재스탬프됐다 — 그것이 §측정 회차가 예고한 회차 5 다.
반사실 2 가 잡은 성질(표의 값과 파일 실측이 다르면 거부)은 해시값과 무관하게 그대로다.

## EOL 함정 — 포팅한 원본이 이미 깨져 있다

40축에서 가져온 `#12c` 는 `fs.readFileSync(CLOSURE)` 의 **raw 바이트**를 해시한다.
`.claude/**` 는 `.gitattributes` 밖이고 이 저장소는 `core.autocrlf=true` 다. 커밋본이 LF
여도 체크아웃한 워킹트리는 CRLF 가 되므로, raw 해시로 스탬프하면 **문서를 저작한 머신에서만
초록이고 다른 체크아웃에서는 전건 붉다.**

원본이 이미 그 상태다 (2026-08-31 실측, 이 워킹트리).

```
.claude/milestone-closures/6-review-convergence.md  CR=274
40축 PRD 스탬프  sha256:103170d8216a02ae5ac1cc1e40cf5c68f22f81e63e87aa94d682d5437d1ea3dc
실측(raw)        sha256:4d5e4834135f452d408b0ccd128735b2782d3063d9a2a8f0b6c6581108116960
```

이 축은 해시 대상을 `read()` 의 EOL 정규화 내용으로 바꿔 닫았다. 스탬프 값은 커밋본
바이트의 해시와 같아지므로 체크아웃 EOL 과 무관하다. 양성 프로브로 확인했다 — 이 문서를
CRLF 로 바꾸면 raw 해시는 `sha256:2b3e7582…` 로 갈리는데 `#12c` 는 `sha256:baae75ef…` 로
일치를 유지하고 rc 0 이다.

```
=== 체크아웃 모사: closure 문서를 CRLF 로 ===
CR=192
raw sha256 = 2b3e758285b992ebdfa1f79e4c4482dfd0fa5e33961fc862faa93bae9dccb789
#12c ok [종료 후] provenance 행 1건 · Verdict done · closure 실재 · sha256(EOL 정규화) 일치 sha256:baae75ef7eca6bb96242b9de07a25535272cd0b539e769127d90080ea85a5fbe
rc=0
```

40축의 해소는 이 창 소유가 아니다 — 종료된 형제 PRD 의 자산이라 backlog 이월 행으로 올린다.

## 미검증으로 남는 것

계획서 §Acceptance 가 `(미검증)` 으로 명시한 다섯 항목. 이 종료는 이들을 통과시키지
않는다 — 측정자가 유지보수자(사람)이고 이 창 밖이라는 사실을 확정할 뿐이다.

| # | 항목 | 왜 이 창에서 못 잰다 |
|---|---|---|
| 1 | 라운드 2 표기가 0건으로 수렴하는지 | PRD 가 측정자를 유지보수자로 지정했다. 이 창은 원장과 라운드 1 까지만 낸다 (계획서 §NOT Building 첫 행) |
| 2 | 라운드 1 표기가 담당자 이해와 일치하는지 | 같은 이유 |
| 3 | 온보딩 좌표가 그 문항에 실제로 답하는지 | `#10` 은 좌표의 **실재**만 본다. 답의 적합성은 사람 판정 |
| 4 | 개념 4축 분리와 `auth_layers` 축 정렬이 위반 0 인지 | PRD 가 측정자를 유지보수자로 지정했다 |
| 5 | 원장 행 단위가 우산 지표의 `policy-candidates` 행 단위를 대신할 만한지 | 우산 PRD 소유자의 판정이 필요하다 |

원장의 `미검증` 표기 127건이 그 미판정분의 기계 표식이고, `#8` 이 수렴 계수(1)와 `미검증`
계수(127)를 **따로** 출력한다 — 합치면 판정 못 한 것이 0 뒤에 숨는다.

## 이 창이 봉인하는 실측

회차 1·4 에서 공통으로 초록인 값. 전건 하네스 출력 원문.

| 축 | 값 | 게이트 |
|---|---|---|
| 리뷰 원장 | 946행 · 기계 필드 == 재추출 · 2회 산출 동일 | `#2` |
| 부류별 계수 | policy 42 · anchor 275 · enforce 42 · scope 42 · fallback 81 · history 46 · table 3 · code 405 · onboarding 10 | `#3` |
| id · 좌표 · digest | 946건 전역 유일 · 좌표 946건 실재 · meta 입력 sha256 9건 == 실측 | `#4` |
| 본문 코드 인용 | 405/405 동결 트리 해석 · 모호 0 · 행 초과 0 | `#5` |
| 프론트매터 앵커 | 275/275 · 파일 없음 0 · 행 초과 0 | `#6` |
| gate 결박 | 946행 전건 존재 · 결박 770 · 미결박(명시 null) 176 | `#7` |
| 라운드 1 표기 | 수렴 계수 1 · 미검증 127 · ok 59 | `#8` |
| `## 연혁` SHA | 46건 · 서브모듈 해석 45 · 이 저장소 해석 1 · 미해석 0 · 모호 0 | `#9` |
| 온보딩 | 10문항 · 좌표 보유 10 · 차단 0 | `#10` |
| 동결 기준선 | 편집 밖 7문서 바이트 동일 · `docs/_meta/` 귀속 변경 0 · golden 무변동 `8fd7e6f2cb53` | `#11` |
| 동결 포인터 | server `4d798f55` · site `767d1e44` · admin `fb001e1d` == manifest `repos[].head` | `#0d` |
| 저장소 게이트 | `verify.sh --check` rc 0 `check PASS` · `--bootstrap` rc 2 거부 · lint 8문서 위반 0 | `#0e` |

## Provenance

- Lock run_id        : `a1ed9efc-1940-4a60-9810-a21beca8bd11`
- Lock owner session : `unknown` (`CLAUDE_SESSION_ID` 미설정)
- Lock 해제 시점     : Phase 4 이전. `goal-phase-guard.js` 가 lock 활성 중 Bash 를
  default-deny 로 돌려 하네스를 못 돌린다 — 낡은 증거로 봉인하는 대신 lock 을 먼저 풀고
  실측했다. Phase 4 순서 역전이며 그 사실을 여기 적는다
- Plan source        : `.claude/plans/insuniverse-docs-20-foundation-access-m6.plan.md`
- Gate harness       : `.claude/plans/insuniverse-docs-20-foundation-access-m6.gates.mjs`
- 계획서 본문        : **무수정.** provenance 는 PRD 로 싣는다 — 계획서 본문은
  `mccp-plan-codex` · `mccp-implement-codex` 두 receipt 의 `plan_hash` 앵커이고 절을
  덧붙이면 두 게이트가 동시에 stale 로 떨어진다
- mccp version       : 1.33.1
