# Milestone Closure — 30-contracts-limits-9

## Milestone

- ID         : 30-contracts-limits-9
- Name       : 최종 수정 — 열린 질문 판정 · 이월 인수 · 하네스 수리
- PRD        : `.claude/prds/insuniverse-docs-30-contracts-limits.prd.md` (Delivery Milestones 9행)
- Plan       : `.claude/plans/insuniverse-docs-30-contracts-limits-m9.plan.md`
- Status     : done
- Closed at  : 2026-09-03T05:06:41.000Z
- Closed by  : /mccp:milestone-close (run_id=addb4db1-69d7-4399-9216-378bec935a09 · mccp 1.33.1)
- HEAD       : `23c7fdb8be1a671ddb6fbbbe9dc9591ea84f5ad7`

> **id 가 `9` 가 아닌 이유.** `.claude/milestone-closures/` 는 PRD 를 가르지 않는 평평한 디렉터리다.
> 행 번호만으로 이름을 지으면 PRD 가 다른 마일스톤끼리 파일명이 충돌한다 — `4.md`(ops 축)가 이미
> 그 상태이고, 형제 축 `60-history-deprecated-*` · `70-viewer-6` · 이 축의 `30-contracts-limits-8`
> 이 쓰는 `<축 슬러그>-<행>` 규약을 따른다.

## Acceptance Condition

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

> 30-contracts-limits M9 종료 조건 확인. (1) node .claude/plans/insuniverse-docs-30-contracts-limits-m9.gates.mjs check-all 이 rc 0 으로 완주, (2) node .claude/plans/insuniverse-docs-30-contracts-limits-m8.gates.mjs check12 --expect complete 가 rc 0, (3) node .claude/templates/plan-kit/lint-plan.mjs .claude/plans/insuniverse-docs-30-contracts-limits-m9.plan.md 가 rc 0, (4) .claude/plans/insuniverse-docs-30-contracts-limits-m9.ledger.jsonl 실재, (5) git status --porcelain 이 0행. 전부 초록이면 종료, 하나라도 붉으면 사유 출력하고 종료. 또는 5 turn 후 중단.

**이 조건은 하네스 축이다.** 마일스톤 9 의 표문 종료 조건(PRD 9행 Outcome)은 네 주장 — 열린
질문 여섯 판정 · 이월 2건 중 체이닝 1건 인수 · 결박 술어 사각지대의 계수 공시 · `m8 check12` 의
`--expect complete` 초록 — 이고, 그 넷 전부가 아래 `#3` · `#9` · `#7` · `#4` 에 게이트로 결박돼
있다. 마일스톤 8 과 달리 이 창은 하네스 축과 표문 축이 갈리지 않는다. 갈리는 자리는 계획서
§Acceptance 가 `(미검증)` 으로 적은 세 항목뿐이며 아래 §초록이 아닌 사실에 그대로 남는다.
락 진입 전 그 차이를 사용자에게 이름으로 냈고, 사용자는 그 위에서 이 조건을 선택했다.

## Goal Loop Result

조건 5건 전건 충족.

**측정 시점 — 조건 1~3 은 락 진입 *전*에 쟀다.** `goal-phase-guard.js` 의 `BASH_ALLOW_PATTERNS`
(76~87행)가 default-deny 이고 `node` 는 `goal-phase-lock.js` · `goal-detect.js` 두 스크립트에만
열려 있다. 하네스 호출은 락 안에서 기계적으로 차단된다 — 이 사실을 우회하지 않고 측정을 락 앞으로
옮겼다. 락 안에서 증명한 것은 *그 측정의 대상이 지금과 같다* 는 것이다:

- `HEAD` = `23c7fdb8be1a671ddb6fbbbe9dc9591ea84f5ad7` — 락 진입 전후 동일
- `git status --porcelain` = 0행 — 락이 `Edit`/`Write`/`MultiEdit`/`NotebookEdit` 를 기계적으로
  막으므로 진입 후 워킹트리 변경 경로가 없다
- 측정 입력 4개 blob 고정 — `m9.gates.mjs 73072334` · `m8.gates.mjs 4f118f72` ·
  `m9.ledger.jsonl 14b6ab58` · `m9.plan.md 47884df7` (`git ls-files -s`)

같은 커밋 · 깨끗한 트리 · 같은 blob. 조건 1~3 의 값은 유효하다.

**(1) `m9.gates.mjs check-all` rc 0 · 등록부 13종 전건 실행** — 선두 행이 등록부 대조를 먼저 낸다:

```
check-all ok 등록부 13종 == Validation 펜스 호출줄 13건 (각 정확히 1회) · 차집합 양방향 0 — 이제 전건 실행한다
```

마지막 줄:

```
check-all ok 전건 실행 완료 (12검사 · 집계기 자신은 실행 목록 밖)
```

이 마일스톤의 표문 주장을 직접 지는 검사 넷:

```
#3 ok closed 5건의 evidence 좌표 실재 (문서 실파일 + 행 범위 안 + 인용 문면 그 자리에 실재 + PRD 산문 인용 좌표와 동일) · open 1건이 차단 사유 보유 · 이 초록은 *질문이 답해졌다* 가 아니라 *판정이 근거를 갖는다* 는 뜻이다 · **사각지대: 이 검사는 인용이 실재하는지만 보고 그 인용이 그 질문에 답하는지는 보지 않는다**
#9 ok carryover 11건 전건이 backlog 행 번호 **와 subject 문면**으로 대응 (행 번호만이면 표 어느 행이든 통과한다 — 코드리뷰 F3) · 인수 표기 1건 · 부류 분해 (closed=이 창 인수 1 · handed-off=다른 소유자 5 · open=열린 채 5) · 열린 이월은 backlog 에도 인수 표기가 없고 원장에도 open 이다 — 두 자리가 갈리면 FAIL 이다
#7 ok 실행 도달 0 · 무관 결박 958 · 실행 불가 0 · 합 958 · 입도 축약 958행 -> 328조합 (중복군 149 · 최대군 70) · 입도는 검사 표준출력의 문자열 등장이며 그 검사가 그 행을 읽었다는 증명이 아니다 · **backlog 454 는 이 검사로 닫히지 않는다** — 454 가 요구한 것은 행 id 사상이고 이 입도는 doc+subject 다 · 무관 결박은 FAIL 이 아니라 공시다 (0 을 요구하면 저자가 결박을 지우는 쪽으로 최적화한다)
#4 ok m8 check-all 이 표 8행 현재값 complete 를 읽어 --expect 를 유도 (deriveCheck12Expect() 반환값 == 이 하네스가 독립으로 읽은 표 값) · check12 밖 검사 소스 무변동 13/13 (기준선 커밋 fa61e922 blob 대조 — HEAD 가 아니므로 구현 커밋 뒤에도 이 창의 델타를 문다)
```

체인 검증기의 음성 축과 라운드 계수:

```
#5 ok 체인 술어 5축 (prior-sha · round-increment · candidate-digest · anchor-round-zero · termination-provenance) 전건이 음성 픽스처에서 뒤집힌다 · 양성 1 음성 7 · 앵커 단독 체인의 라운드 계수 0 이고 종료 술어 미성립
#6 ok 체인 앵커 1건 (round 0 · 라운드 아님) · 유지보수자 라운드 원장 0건 (round>=1 이고 maintainer_provenance 보유) · 순차 종료 술어가 요구하는 수 2건 · 차이 2 · 앵커는 0 에 들지 않는다 · 종료 술어 성립 아니오
```

읽기 전용 불변 축:

```
#11 ok 9문서가 기준선 blob 과 바이트 동일 (9/9) · docs/_meta 변경 0건 · golden.txt 무변동 · 동결 3핀 무변동 · 기준선 해시를 못 읽으면 그 자체가 실패다 — 빈 입력을 무변동으로 세지 않는다
#0b ok 동결 3핀 == manifest repos[].head (server 4d798f55 site 767d1e44 admin fb001e1d)
```

**(2) `m8.gates.mjs check12 --expect complete`** — rc 0. 마지막 두 줄:

```
#12a ok 마일스톤 표 8행 Status=complete · Plan 셀 == 이 계획서 경로 · 1~7행 complete (7건) · *Status: 행 1개이고 표 행이 complete 이고 토큰 마일스톤 9 >= 8 (종결된 창은 자기 번호를 토큰에서 요구하지 않는다) (범위 표기는 지목으로 세지 않는다)
#12 ok lint-plan 위반 0 (rc 0)
```

`#4a`/`#4b`/`#4c` 가 같은 검사를 어휘 세 값으로 돌려 양방향을 잡는다 — `complete` rc 0 ·
`in-progress` rc 1 · 어휘 밖 rc 1.

**(3) `lint-plan.mjs`** — rc 0, 출력 없음.

**(4) 원장 실재** — `.claude/plans/insuniverse-docs-30-contracts-limits-m9.ledger.jsonl` ·
추적 blob `14b6ab58` · 24행 (meta 1 + 데이터 23). `#2a` 부류 분해 `oq=6 sample=5 carryover=11
fixtask=1` · `#2` 가 `prior_ledger_sha256` 를 마일스톤 8 원장 파일 해시(`3e311259`)와 대조.

**(5) working tree** — `git status --porcelain` 0행.

## 초록이 아닌 사실

**이 절은 종료를 축소하지 않는다. 종료가 무엇을 주장하지 않는지를 적는다.**

**1) 유지보수자 라운드는 0회다.** 마일스톤 9 는 그 라운드를 내지 않는다 — 계획서 §NOT Building
과 §Acceptance 가 `(미검증)` 으로 그렇게 적었고, 9가 만든 것은 라운드가 앉을 **체이닝 스키마와
검증기**다. `#6` 이 그 차이를 계수로 낸다 — 앵커 1(round 0, 라운드 아님) · 유지보수자 라운드 원장
0건 · 순차 종료 술어가 요구하는 수 2 · **차이 2** · 종료 술어 성립 **아니오**. `#6` 의 초록은
"라운드가 일어났다" 가 아니라 "라운드가 앉을 자리가 검증된다" 는 뜻이다.

**2) 무관 결박 958건이 남는다.** `#7` 이 도달 0 · 무관 958 · 불가 0 · 합 958 로 공시하며 0 을
요구하지 않는다. 도달 0 은 술어가 죽어서가 아니라 앞 하네스들이 표준출력에 doc 경로와 subject 를
함께 싣지 않기 때문이며, `#7` 의 자기 프로브가 그것을 가른다 — 실 결박 행 `m8-01-policy-001` 의
doc·subject 를 합성한 출력에서 도달로 분류되고 날조 토큰은 무관으로 분류된다. **backlog 454 는
이 검사로 닫히지 않는다** — 454 가 요구한 것은 행 id 사상이고 이 입도는 doc+subject 다.

**3) `m8.gates.mjs check-all` 전체 rc 는 재지 못했다.** 10분 툴 타임아웃에서 SIGTERM(exit 143).
계획서 §Summary 가 *"9 가 주장하는 하네스 초록은 `m8` 의 `check12` 하나다 — `check-all` 전체
rc 0 을 주장하지 않는다"* 로 이미 범위 밖에 뒀고(Plan-Codex R1 F1 흡수), 주장 대상인 `check12` 는
단독으로 rc 0 을 실측했다. 이 종료는 `m8` 하네스 전체의 초록을 주장하지 않는다.

**4) `verify.sh --check` 는 rc≠0 이고 이 창이 초록으로 만들 수 없다.** 원인 경로가
`docs/_meta/verify/**` 이고 그 위임 슬롯은 `20-foundation-access` 앞으로 `진행` 이라 이 PRD 가
통제하지 못한다. 계획서 §Acceptance 가 `(미검증)` 으로 적었다. 이 종료는 저장소 전역 회귀를
주장하지 않는다.

**5) 미덮음 판정은 표본이다.** `#8a` 원문 — 표본 5경로 82행 / 모집단 278행 (29.5%) · 입도=경로이며
행 단위 도달률이 아니다. 전수 판정은 이 창 밖이다(UI5).

**6) `#3` 의 초록은 답이 아니라 근거다.** 열린 질문 6건 중 5건이 `closed` 이고 그 근거 좌표가
실재함을 `#3` 이 대조한다. 그 인용이 **그 질문에 답하는지**는 이 검사의 사정거리 밖이며, `#3` 이
자기 문면에 그 사각지대를 싣는다. 남은 1건은 `open` 이고 차단 사유를 보유한다.

## 전이 판정

이 종결 커밋이 PRD 두 자리를 함께 뒤집는다 — §Delivery Milestones 표 9행 `in-progress` →
`complete`, 하단 `*Status:` 토큰 `in-progress — 마일스톤 9 착수` → `complete — 마일스톤 9 종결`.
한쪽만 뒤집으면 두 자리의 일치를 요구하는 검사가 다른 이유로 붉어져 귀속이 흐려진다.

**이 전이로 붉어지는 검사 — `m9.gates.mjs` 의 `check10`.** `#10a` 가 표 9행 `in-progress` 를,
`#10b` 가 `*Status:` 토큰 `in-progress` / 마일스톤 9 지목을 하드 요구한다. 이 하네스는 `--expect`
어휘를 받지 않는다 — 마일스톤 9 Task 5 가 그 수리를 `m8` 의 `check12` 에만 적용했고 자기 자신에는
적용하지 않았다. 구성상 예정된 결과이고 회귀가 아니다.

**이 붉음을 수리할 다음 창은 없다.** 9 가 이 PRD 의 마지막 마일스톤이다. `m8` 의 같은 자리는
9 가 수리했지만 9 의 자리를 수리할 10 은 없다. 이 문서가 귀속처이며, 그 붉음의 술어는 위 두 줄에
이름으로 적혀 있다.

**살아남는 자리 — `m8.gates.mjs check12`.** `statusToken()` 이 읽는 토큰 마일스톤이 9 이고
`check12` 는 표 8행이 `complete` 일 때 토큰 마일스톤 `>= 8` 만 요구한다(`#12a`). 토큰의 첫 값이
`in-progress` 에서 `complete` 로 바뀌어도 이 술어는 마일스톤 번호만 본다.

**`verify.sh bootstrap_permitted()` 는 이 전이가 새로 깨는 것이 없다.** `^\*Status:` 행 수가
1개로 유지되고 첫 토큰이 DRAFT 밖인 상태도 그대로다. 저장소 전체의 `--bootstrap` 은 이 PRD 보다
앞서 `insuniverse-docs-20-foundation-access.prd.md` 가 DRAFT 를 벗어나면서 이미 만료돼 있다(A9).
