# Milestone Closure — 7-post-closure-residual

## Milestone

- ID         : `7-post-closure-residual`
- Row        : `7` — 종결 후 잔여 — 하네스 3결함 · closure 해시 축 · 위임 슬롯
- PRD        : `.claude/prds/insuniverse-docs-20-foundation-access.prd.md`
- Plan       : `.claude/plans/insuniverse-docs-20-foundation-access-m7.plan.md`
- Status     : **done**
- Closed at  : 2026-09-02T06:17:18.679Z
- Closed by  : `/mccp:milestone-close` (run_id `2956daca-ded5-492a-a50f-562135b81fc4`)
- Head at close : `ca2dd37f0d5704cfdd09c92330162a7050693f38`

파일명 슬러그가 행 번호만이 아닌 이유는 마일스톤 6 과 같다 — `.claude/milestone-closures/` 는
저장소 전역 한 디렉터리이고 `7-disposition-ledger-round2` · `7-relation-axis` 두 형제가 7행을
이미 점유했다.

## Detection signal

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

```json
{"availability":"available","goal_signal":true,"signal_ref":{"row":7,"name":"종결 후 잔여 — 하네스 3결함 · closure 해시 축 · 위임 슬롯","plan":".claude/plans/insuniverse-docs-20-foundation-access-m7.plan.md","status":"in-progress"},"mode":"milestone-close","reason":"ok"}
```

## Acceptance Condition

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

> m7 게이트 하네스 check-all 이 12/12 rc 0, closure doc PRD provenance 행이 있고 sha256 이
> 맞으면 종료. 또는 20턴 후 중단

## Goal Loop Result

`goal-done` — 종료 문서와 PRD provenance 행이 서고 그 sha256 이 실측과 일치하며, 그 일치를
`#0f` 가 매 실행 다시 판정한다. 근거는 아래 §하네스 개정 · §반사실 · §측정 회차.

조건의 `check-all 12/12` 는 §측정 회차 마지막 행이 지며, **그 회차는 구조적으로 이 문서에
담기지 않는다** — 사유는 그 절에.

## 이 종료가 PRD 표 7행을 `complete` 로 전이하지 **않는** 이유

마일스톤 6 종료는 표 6행과 `*Status:` 토큰을 함께 `complete` 로 뒤집었다. 이 종료는 뒤집지
않는다. 마일스톤 7 하네스가 그것을 금지한다.

- `check10` `#10a` 는 모드 분기 없이 표 7행 Status 가 `in-progress` 임을 요구한다
  (`.claude/plans/insuniverse-docs-20-foundation-access-m7.gates.mjs` 1719행).
- 계획서 §Acceptance 가 같은 것을 명시한다 — *"PRD 표 7행 Status 는 셀렉터가 아니다 — 그 값은
  이 창 내내 `in-progress` 로 고정이라 전이하지 않는다 — 게이트 `#0`"*.
- `#0f` 의 `pre`/`post` 모드 셀렉터가 `*Status:` **토큰**에서 유도된다. 토큰은 Task 10 이 이미
  마일스톤 7 `in-progress` 로 옮겼고 그 상태가 `post` 다. 표 7행을 뒤집어도 이 모드는 안
  움직이지만 `#10a` 가 그 자리에서 죽는다.

마일스톤 6 과 갈리는 지점은 `#12c` 의 유무다. m6 하네스는 종료 여부를 closure 파일 해시로
판정하고 그 판정으로 Status 를 **양방향** 결박했으므로 전이가 검사 **안에** 있었다. m7
하네스에는 그 검사가 없고, 대신 `#10a` 가 `in-progress` 를 값으로 못 박았다. 전이를 여기서
하면 `#10` 이 붉어지고 게이트를 거짓으로 지나가야 한다.

**그러므로 7행 전이는 다음 창의 몫이다.** 형제 축 `50-domain` 이 같은 형태이며, 반대 형태
(`70-viewer` — 전이를 종결 커밋이 진다)와 갈리는 것은 그 축 하네스가 두 어휘를 받기 때문이다.

## 하네스 개정

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

| # | 자리 | 개정 | 왜 |
|---|---|---|---|
| 1 | `closureVerdict()` 신설 | PRD provenance 계약을 판정하는 단일 코어 — 행 1건 · `Verdict done` · `Closure` 셀이 이 경로 · 파일 실재 · `sha256(EOL 정규화 내용) == 행의 값` | 20축 m6 `#12c` 포팅. 표 7행 Status 결박만 뺐다(위 절) |
| 2 | `#0f` post 분기 | 종료 문서를 **계약 유도**로 면제. 리터럴 면제 목록(`POST_COMMIT_EXEMPT`)에 넣지 않는다 | 이름 면제는 그 경로를 무검사 통로로 연다. 종료 문서는 이 창의 종료 판정을 싣는 자산이라 아무 바이트나 그 이름으로 두면 통과하는 것이 곧 결함이다 |
| 3 | `check0` `inputs()` · `EDGES.check0` | 종료 문서를 **부재도 입력**으로 만짐 | `#1c` 는 `--trace-inputs` 로 `inputs()` 만 관측한다. `run()` 안의 접근은 안 보이므로 등록부 edge 와 한쪽으로 어긋난다 |
| 4 | `closure-verdict` 서브커맨드 | `#0f` 와 **같은 코어**를 부르는 전용 프로브. `check-all` 집계 밖 | 비용이다. `check0` 단독이 **2501초**(실측)라 반사실 5건이 3.5시간이 된다 — 그러면 반사실을 안 돌리게 되고, 못 돌려서 안 돌리는 것과 안 돌려서 못 도는 것이 같은 자리에서 만난다 |

해시 대상이 raw 바이트가 아니라 EOL 정규화 내용인 이유는 계획서 관측 2 와 같다 —
`.claude/**` 는 `.gitattributes` 밖이고 이 저장소는 `core.autocrlf=true` 다. raw 로 스탬프하면
저작한 머신에서만 초록이고 다른 체크아웃에서는 전건 붉다. 형제 40축이 이미 그 상태였고 이 창의
Task 6 이 그 셋을 고쳤다.

## 측정 회차

| 회차 | 상태 | 명령 | 결과 | 사유 |
|---|---|---|---|---|
| 1 | 개정 전 · HEAD `ca2dd37` | `check-all` | `check0`~`check7` rc 0 · **미완주** | 래퍼 bash 가 턴 경계에서 kill 됐다(자식 node 는 살아 `check7` 까지 씀). `check8`~`check11` 은 이 회차에서 미측정 |
| 2 | 개정 후 · 종료 문서 부재 | `check0` | **rc 0** · 2501초 | `#0f` 가 `종료 문서 면제 0건 — [종료 전] provenance 행 0건 · closure 문서 부재` 를 찍었다 |
| 3 | 개정 후 · 종료 문서 부재 | `check1` | **rc 0** | 서브커맨드 17종 · `#1c` edge 47건 양방향 · `#1d` 접근자 우회 0 |
| 4 | 종료 문서 + provenance 봉인 후 | `closure-verdict` · 반사실 4건 | §반사실 | |
| 5 | 종료 문서 + provenance 봉인 후 | `check-all` 전건 | 이 문서 밖 | 아래 |

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

회차 1 의 미완주는 결함이 아니라 실행 환경이다. `#0a` 가 선행 하네스 여섯(m1~m6)을 중첩
실행하고 m6 는 다시 자기 선행을 부르므로 `check0` 하나가 2501초다. 그 사실이 회차 4 의 전용
프로브를 만든 이유이고, 회차 5 를 백그라운드 완주로 돌려야 하는 이유다.

## 반사실

수정 전/후로 결과가 뒤집히는지 각 건 실행해 확인한 관찰. 조작은 추적 파일 제자리에서 하고
매 건 뒤 되돌렸으며, 복구는 `trap ... EXIT` 이 지고 마지막에 sha256 재대조로 확인했다.
조작기는 대상 문자열을 못 찾으면 `mutation-miss` 로 exit 9 를 낸다 — 빗나간 조작을 "게이트가
통과했다" 로 읽지 않기 위해서다.

| # | 조작 | 기대 | 실측 |
|---|---|---|---|
| 1 | provenance 행의 sha256 첫 16진 한 글자 `3`→`a` | 거부 | rc 1 · `sha256 불일치` |
| 2 | provenance 행 삭제 (문서만 남음) | 거부 | rc 1 · `closure 문서는 있는데 provenance 행이 없다` |
| 3 | `Verdict` `done` → `failed` | 거부 | rc 1 · `done 이 아닌 종료는 면제 근거가 아니다` |
| 4 | 종료 문서 끝에 주석 1줄 (행은 그대로) | 거부 | rc 1 · `sha256 불일치` (실측 쪽이 움직인다) |
| 5 | 원복 후 양성 재확인 | 통과 | rc 0 |
| 6 | 종료 문서를 CRLF 로 (체크아웃 모사) | **통과 유지** | rc 0 · raw 해시는 `4404b299…` 로 갈리는데 판정은 유지 |

조작 1·4 가 같은 술어를 **양쪽에서** 문다 — 1 은 표의 값을 움직이고 4 는 실측을 움직인다.
한쪽만 조작하면 그 검사가 표를 읽는지 파일을 읽는지 구분되지 않는다.

조작 6 은 음성이 아니라 **양성** 프로브다. 음성만 돌리면 EOL 정규화가 실제로 도는지 못
가른다 — raw 해시로 스탬프한 형제 40축은 이 프로브에서 붉었고 그것이 이 창 Task 6 의 근거다.

### 반사실 실행 기록

조작기는 대상 문자열을 못 찾으면 `mutation-miss` 로 exit 9 를 낸다. 복구는 `trap ... EXIT`
이 지고 마지막에 sha256 재대조로 확인했다.

```
=== 반사실 1: provenance sha256 한 글자 조작 ===
mutated sha
rc=1
closure-verdict FAIL — present=true exempt=false · sha256 불일치 — 표 sha256:adf253c3dd9ae1de6142c25f0d46c486ea79172657bde944412f708038a61fd1 / 실측 sha256:3df253c3dd9ae1de6142c25f0d46c486ea79172657bde944412f708038a61fd1
=== 반사실 2: provenance 행 삭제 (문서만 남음) ===
mutated droprow
rc=1
closure-verdict FAIL — present=true exempt=false · closure 문서는 있는데 provenance 행이 없다 — .claude/milestone-closures/7-post-closure-residual.md
=== 반사실 3: Verdict done -> failed ===
mutated verdict
rc=1
closure-verdict FAIL — present=true exempt=false · Verdict 'failed' — done 이 아닌 종료는 면제 근거가 아니다
=== 반사실 4: 종료 문서 변조 (행은 그대로) ===
mutated tamper
rc=1
closure-verdict FAIL — present=true exempt=false · sha256 불일치 — 표 sha256:3df253c3dd9ae1de6142c25f0d46c486ea79172657bde944412f708038a61fd1 / 실측 sha256:047d51f9af8f698c565d9a74237af2d1307df413db0e443377662421a7e806ae
=== 반사실 5: 원복 후 양성 재확인 ===
rc=0
closure-verdict ok — present=true exempt=true · provenance 행 1건 · Verdict done · closure 실재 · sha256(EOL 정규화) 일치 sha256:3df253c3dd9ae1de6142c25f0d46c486ea79172657bde944412f708038a61fd1
restore ok (PRD 8193c9705245 · closure 3df253c3dd9a)

=== 반사실 6: 체크아웃 모사 — 종료 문서를 CRLF 로 ===
CR=155
raw sha256 = 4404b2991ca7e8876fa9fb1bc056ae2d2d30a75093502400a27854ae7033beb1
rc=0
closure-verdict ok — present=true exempt=true · provenance 행 1건 · Verdict done · closure 실재 · sha256(EOL 정규화) 일치 sha256:3df253c3dd9ae1de6142c25f0d46c486ea79172657bde944412f708038a61fd1
restore ok 3df253c3dd9a
```

위 원문에 실린 sha256 `3df253c3…` 은 **이 문서의 종전 바이트**다. 이 절을 더하며 문서가
바뀌었고 provenance 는 새 해시로 재스탬프됐다 — §측정 회차가 예고한 자리다. 반사실이 잡은
성질(표의 값과 파일 실측이 다르면 거부 · 한쪽만 있으면 거부 · EOL 은 무관)은 해시값과
무관하게 그대로다.

## 이 창이 종료하지 **않는** 것

계획서 §NOT Building 이 이름으로 남긴 축과, Task 10 이 안정 id 로 backlog 에 올린 이월이다.
이 종료는 그것들을 통과시키지 않는다 — 이 창의 밖이라는 사실을 확정할 뿐이다.

| id | 부류 | 왜 이 창 밖인가 |
|---|---|---|
| `20m7-ownership-self-row-missing` | **사용자 결정 필요** | 그 한 줄이 선행 5검사(`m1#check6` · `m2#check11` · `m3#check12` · `m4#check16` · `m5#check20`)를 영구히 붉힌다 — 다섯 창이 위임 행 수 3 을 리터럴로 문다 |
| `20m6-gate-binding-is-not-coverage` | **부분 해소** | 실증 밖 결박 34건을 셋째 계수로 드러낼 뿐 닫지 않는다. 닫으려면 선행 하네스 넷의 검사 본문을 유도부와 단언부로 쪼개야 하고 그 편집이 m6 `#0a` 사정거리 안이다 |
| `20m7-authz-checkpoint-not-tamper-evident` | **감지 한계** | 체크포인트가 워킹트리 JSON 이라 삭제 후 재발급 경로의 최종 값이 정상 경로와 같다. 예방층은 쓰기 전 훅이고 `docs/_meta/ownership.md` 198행이 그 층을 이 위임 밖으로 판정했다 |
| `20m7-mutable-set-hunk-range-unbound` | **부분 해소** | 가변 집합의 파일 **안**은 값 단언으로만 묶이고 diff hunk 범위로는 안 묶인다 |
| `20m7-archived-harness-import-broken` | 이월 | 40축 archived m1·m2·m3 의 끊긴 import. 이 창의 어느 검사도 그 셋을 안 부르므로 고쳐도 증거가 없다 |
| `20m7-prd-reenumeration-other-consumers` | 이월 | 재열거 축의 리터럴이 고친 세 자리 밖에 더 있는지 전수 조사하지 않았다 |
| `20m7-onboarding-owner-70-viewer` | 이월 | `70` 승격은 그 PRD 의 종료 조건 문면과 온보딩 소유 계약 개정을 함께 요구한다 |
| `20m7-coverage-emitters-prior-harnesses` | 이월 | 선행 하네스 넷의 커버리지 방출 경로 |
| `20m7-gitattributes-eol-ownership` | 이월 | `.gitattributes` 에 `.claude/milestone-closures/** text eol=lf` 를 넣는 것. 그 파일 소유가 `00-protocol`(archived)이고 이 PRD 앞으로 위임 행이 없다 |
| `20m7-umbrella-review-carrier` | 이월 | 우산 PRD 소유자의 판정이 필요하다 |

마일스톤 6 종료가 §미검증으로 남긴 다섯(라운드 2 수렴 측정 · 라운드 1 표기의 담당자 이해 일치
· 온보딩 좌표의 답 적합성 · 개념 4축 정렬 · 원장 행 단위의 우산 지표 대체 가능성)은 그대로
열려 있다. 측정자가 유지보수자(사람)이고 이 창은 기계 축만 닫는다.

## Provenance

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