# Milestone Closure — 2b

## Milestone
- ID         : 2b
- Name       : `01-removed-features.md`
- PRD        : `.claude/prds/insuniverse-docs-60-history-deprecated.prd.md`
- Plan       : `.claude/plans/insuniverse-docs-60-history-deprecated-m2b.plan.md`
- Status     : skipped
- Closed at  : 2026-08-27T01:34:36.723Z
- Closed by  : /mccp:milestone-close (run_id=dda16862-41b3-449d-898d-fcb94f90c041)

**표 Status 는 `in-progress` 그대로다.** 이 문서는 판정 실체가 완결됐다는 기록이지
마일스톤 전이가 아니다. 전이하지 않은 이유가 §전이 불가 판정이다.

## Acceptance Condition

PRD Delivery Milestones `2b` 행 Outcome 문면 그대로:

> 삭제 축 정본. `Admin/Point` 등 `deleted_path` 후보와 `dead-code-candidate` 를 5중 필터로
> 판정하고 확정분만 발행. … **막는 것은 참조 카운트 축의 미종료가 아니라 축 사이의
> 교집합 0 이다** … 그래서 필터 1·4·5참조가 구조적 `unknown` 이고 6축 전부 `pass` 인 행이
> 0이라 확정이 0건이다. **이 행은 발행하지 않는다** … 발행은 그 두 이월이 닫히고 측정
> 시점이 판정된 뒤의 창 소관이다

## Goal Loop Result

`/goal` 루프는 돌지 않았다. 종료 조건을 실측으로 평가한 뒤 사용자가 판정을 직접 내렸다
(verdict=skipped, 2026-08-27).

사용자 응답 원문:

> `goal-skipped: 삭제 축 판정 완결 · 발행은 archived PRD 4개 위임 선행이라 이 창 밖`

### 충족된 것 — 판정 실체

하네스 `.claude/plans/insuniverse-docs-60-history-deprecated-m2b.gates.mjs` 8검사 전건 rc 0
(2026-08-27 실측). 원장은 손으로 옮겨 적지 않고 `ledger` 서브커맨드가 매 실행 재유도한다.

| 검사 | 출력 요지 |
|---|---|
| `#1 ledger` | 전건 833 − 코호트 478 − renamed 20 = 335행 · 103그룹 · 축 2010칸 · **6축pass 0행** · fail보유 4 + unknown전용 331 = 335 · 발행 id 0건 · 실 파일 0건 |
| `#2 axes` | 코드 축 앵커 5202 ∩ 삭제 0 · env 앵커 15 ∩ 삭제 0 · 동결트리 잔존 0/813 · 기준선 불일치 3/3 |
| `#3 exemplar` | `b3a3a759` R=12 (Admin/Point→Admin/Money) D=4 · `Money/Product` 동결부재 · 부모 적중 3/3 자기참조 · **외부 참조 0** |
| `#4 prd` | 2b Outcome 문면 3/3 · Open Questions 신설 1 · Admin/Point 근거 정정 1 · M2 pending · 2r complete |
| `#5 findings` | 표제 6→9 · 새 표제 {F-07,F-08,F-09} == Task 5 열거 |
| `#6 golden` | 기준선 ccd2106 · 102키 · 변동 1 == 기대 1 |
| `#7 backlog` | 신설 3 · 미해소 2 덧붙임 · **발행 차단 2 열림** (`60m1-sha-unresolvable` · `60m1-adjudication-unproven`) |
| `#8 m2check9` | 실 PRD rc0 status=in-progress · complete+미발행 사본 rc1 · 2b 행 삭제 사본 rc1 |

이 마일스톤의 Outcome 문면이 요구한 것 — 삭제 축을 5중 필터로 판정하고, 확정이 0건인
이유를 *"축의 미종료"* 가 아니라 *"축 사이의 교집합 0"* 으로 재유도하는 것 — 은 전건 충족됐다.
발행 0건도 문면이 미리 명시한 상태다.

### 전이 불가 판정 — 왜 `complete` 로 못 올리는가

`2b` 행 Status=complete 는 게이트가 막는다. 반사실을 실행해 확인했다.

```
$ node .claude/plans/insuniverse-docs-60-history-deprecated-m2.gates.mjs check9 <2b=complete 사본>
#9 FAIL: 2b Status=complete 인데 그 산출물이 실재하지 않는다 — docs/99-deprecated/01-removed-features.md
```

`m2.gates.mjs` `check9` 의 발행 결박은 `complete` 주장 시에만 켜지고,
`docs/99-deprecated/01-removed-features.md` 실재 + `deprecated[]` 비지 않음을 요구한다.
확정 0건이라 그 문서는 생성 불가이고(M1 `check10` 이 빈 `deprecated[]` 를 거부),
발행 차단 이월 2건이 열린 채라 `docs/99-deprecated/` 아래 발행 자체가 `#7` 위반이다.
결박을 지우는 경로는 이 창이 신설한 `#8`(b) 반사실이 정확히 막는다 —
*"단언이 옮겨진 것이 아니라 지워졌다"*.

**즉 `2b` 행은 *판정* 과 *발행* 을 한 칸에 묶었고, 판정만 이 창에서 끝났다.**
`in-progress` 가 그 상태의 정확한 표기다.

### 발행을 여는 선행 — 전부 이 PRD 밖

`docs/99-deprecated/**` 는 이 PRD 의 배타 소유 경로가 맞다. 그러나 **쓸 내용을 만드는 축**
5개가 전부 종료된 PRD 소관이고, 이 PRD 는 인덱스를 읽어서 소비만 한다
(`docs/_meta/ownership.md` 79 행 · 이 PRD §NOT Building *"검사기를 늘리지 않는다"*).

| 막는 것 | 필요한 산출물 | 원 소유 PRD | 상태 |
|---|---|---|---|
| 필터 5 참조 카운트 | 삭제 직전 부모 트리 기준 새 심볼 스캔 (`policy-candidates.code.jsonl` 은 동결 HEAD 기준) | `11-index-code` | archived |
| 필터 1 env 게이트 | `env-gates.yaml` 앵커 (동결 HEAD 기준) | `11-index-code` | archived |
| 필터 4 revert 미복원 | `revert_groups` ↔ 삭제 경로 사상 | `10-index-git` | archived |
| `60m1-sha-unresolvable` | R-4 4필드에 저장소 식별자 추가 = 계약 개정 | `13-relation-contract` | archived |
| `60m1-adjudication-unproven` | 후보 jsonl ↔ 폐기 노드 결속 레코드 | 설계는 `60` · 후보 파일은 `10`·`11` | 혼재 |

`docs/_meta/index/**` 은 이 PRD 의 배타 소유 경로에 없다. 손대려면 archived PRD 소유 경로에
대한 **개정 위임 확장**이 선행이고, 그것은 승인 사항이다 (선례: `ownership.md` §개정 위임 표에
이 PRD 가 M1 에서 5행 · M2 에서 6행째를 받은 절차).

그리고 축을 다 열어도 결과가 안 바뀔 수 있다 — 실측된 유일한 예시 `Admin/Point/Product` 는
부모 트리에서도 외부 참조 0 이라 **두 측정 시점 양쪽에서 필터 5 가 `fail`** 이다
(`docs/_meta/findings/60-history-deprecated.md` F-08 · F-09).

### 남는 재판정 대상

331행이 `unknown` 으로만 막혀 있다 — 측정 시점 판정이 내려지면 결과가 바뀔 수 있는 집합이다.
그 이름 목록은 하네스 `ledger` 가 매 실행 출력하므로 축이 열릴 때 다시 세지 않아도 된다
(이월 `id=60m2b-deletion-axis-unknown-only`).

## Counterfactual — 전이 전/후

이 종료는 표 Status 를 바꾸지 않으므로 전이가 없다. 대신 **전이했을 때 무엇이 붉어지는지**를
실행으로 확인했고 그것이 위 §전이 불가 판정의 근거다.

- `m2.gates.mjs check9` — 실 PRD rc 0 (`status=in-progress`) · 2b=complete 사본 rc 1
- `m2b.gates.mjs m2check9` — 위 두 실행을 묶어 양방향으로 본다. rc 0
- PRD `*Status:` 토큰(279 행 `DRAFT`)은 이 종료가 건드리지 않는다 —
  `verify.sh bootstrap_permitted()` 의 관측 대상이다

## Provenance
- Lock run_id        : dda16862-41b3-449d-898d-fcb94f90c041
- Lock 상태          : 미진입. multi-turn `/goal` 루프가 없어(판정이 실측으로 확정) Phase 2 lock 을
  잡지 않았다. `goal-phase-lock` 은 루프 중 mccp write 를 격리하는 장치이고, 잡으면 하네스
  재실행이 allowlist 에 막힌다 — 이 종료는 하네스 실측이 근거다
- Lock owner session : fff255db-fc0a-414b-93b0-887ebc7a4d32
- PRD source         : `.claude/prds/insuniverse-docs-60-history-deprecated.prd.md`
- Detection signal   :
  ```json
  {"row":2,"name":"`01-removed-features.md`","plan":".claude/plans/insuniverse-docs-60-history-deprecated-m2b.plan.md","status":"in-progress"}
  ```
- Detection note     : `--milestone 2b` 는 `#` 열을 정수로 읽어 못 찾는다. `01-removed-features` 로
  이름 부분일치 지정해야 잡힌다
- mccp version       : 1.32.6
- HEAD at closure    : f17b19b
- Gate chain         : `mccp-plan-codex/...-m2b` converged · `mccp-implement-codex/...-m2b` converged ·
  `mccp-pr-codex/...-m2b` 미발행 (이 종료 다음 단계)
