# Milestone Closure — 3-01-authn

## Milestone

- ID         : 3-01-authn
- Name       : `01-authn.md`
- PRD        : `.claude/prds/insuniverse-docs-20-foundation-access.prd.md` (Delivery Milestones 3행)
- Plan       : `.claude/plans/insuniverse-docs-20-foundation-access-m3.plan.md`
- Status     : done
- Closed at  : 2026-08-26T06:05:44.650Z
- Closed by  : /mccp:milestone-close (run_id=d6f83d30-f98a-4b92-93d5-e3f9f7bbca18)
- HEAD       : `17b296cacceacd84b168772f5db2851a8155bb06`

## Acceptance Condition

사용자가 넘긴 조건 원문:

> M3 harness check-all passes 16/16 and PRD milestone 3 Status is complete, or stop after 10 turns

`/goal` 루프는 **돌지 않았다.** 조건은 넘어왔지만 native `/goal` 세션이 활성화되지 않았고,
acceptance 는 계획서 §Validation 이 계획서 밖으로 뺀 하네스
`.claude/plans/insuniverse-docs-20-foundation-access-m3.gates.mjs check-all` 을 직접 실행해
측정했다. 이 문서가 그 실측의 기록이다.

## Goal Loop Result

조건 두 항 모두 충족. 전이 전과 후 두 번 측정했다.

### 1) 전이 전 실측 — HEAD `17b296c` 트리, PRD 무편집

```
checks=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
check1 base=5783b2b in-main=yes ancestor=yes m2-docs=2 m3-outputs=0
check2 submodules 3/3 pinned
check3 lint=ok strict=ok files=4
check4 anchors n=53 repos=3 ok
check5 lifetime server=5 site=2 match
check6 renewal refresh=2 admin-refresh=0 admin-access=4 match
check7 unauthorized user=E0001 admin=E0601 imports=2 match
check8 bypass notprod=1 devswagger=1 prodnote=1 match
check9 scope rows=8 cols=server,site,admin empty=0
check10 findings headings=2 items=6/6 order=ok
check11 finding-anchors n=3 resolved=3
check12 delegation rows=3 paths=match
check13 delegation reason=widened
check14 prd status=in-progress milestone=3 plan-cell=ok
check15 prd open-question resolved=1 unresolved=3
check16 golden required=1/1 backlog=0 outside=0
```

rc 0. 16검사 전건 통과.

### 2) 전이 후 실측 — 같은 트리 + PRD 두 자리 편집

`check14` 만 값이 바뀌고 나머지 15검사는 문자열까지 동일, rc 0 유지:

```
check14 prd status=complete milestone=3 plan-cell=ok
```

`check15`(open-question resolved=1 unresolved=3) · `check16`(golden required=1/1 backlog=0
outside=0)이 그대로라는 것이 PRD 편집이 Open Questions 절과 golden 해시 구간을 건드리지
않았다는 반사실 대조다.

### 3) 저장소 전역 게이트 — `verify.sh --check`

전이 후 `bash docs/_meta/verify/verify.sh --check` 완주, 마지막 줄 `check PASS`, rc 0.
`ownership 게이트` · `lint 커버리지 (문서 PRD 경로 12건)` · `golden 대조 (헤더 + 페이로드)`
전건 `ok`. `*Status:` 토큰 전이가 저장소 전역 판정을 흔들지 않았다는 확인이다.

## 전이 시 풀어야 했던 결박 — `check14`

`m3.gates.mjs` `check14`(979~1016행)가 세 가지를 함께 강제한다:

1. PRD `*Status:` 행이 정확히 1개이고 그 첫 토큰이 마일스톤 표 **3행** Status 와 문자열 일치
2. 마일스톤 표 1·2행 Status 가 `complete`
3. 상태 행 산문이 `마일스톤 3` 을 가리키고, 3행 Plan 셀이 `PLAN_PATH` 와 일치

표 3행만 `complete` 로 바꾸면 조건 1이 깨져 exit 1 이고, 후속 `/mccp:pr` 이 하네스를
재실행하면 막힌다. **두 자리를 함께 뒤집었고 하네스는 무수정으로 뒀다.**

`*Status:` 소비자 실측:

| 소비자 | 읽는 것 | `in-progress` → `complete` 영향 |
|---|---|---|
| `docs/_meta/verify/verify.sh` `bootstrap_permitted()` | 행이 정확히 1개인가 · 첫 토큰이 DRAFT 인가 | 없음 — 둘 다 비-DRAFT. 전이 후 `--check` PASS 가 그 확인 |
| `.claude/plans/...m3.gates.mjs` `check14` | 표 3행 Status 와의 일치 | 이 전이가 겨냥하는 자리. 함께 뒤집어 green |
| mccp `scripts/lib/archive-complete/apply.js` | 마일스톤 **표** 행 status | 없음 — 표 4~6행이 `pending` 인 한 조기 아카이브 불가 |

남는 왜곡은 M1 closure 와 같다: `*Status:` 토큰은 PRD 전체가 아니라 **마일스톤 3** 을
가리킨다. 마일스톤 4 착수 시 이 토큰을 `in-progress` 로 되돌리면 `check14` 의 3행 고정이
다시 깨진다 — `check14` 는 M3 창(window) 수명에 묶인 설계다. PRD `*Status:` 행 산문이 그
결박을 명시한다.

## Lock 수명 — 실측 없는 봉인을 피한 순서

`goal-phase-guard.js` 가 lock 활성 중 Bash 를 default-deny 로 돌린다. allowlist 는 8줄
(git read · gh read · `goal-*` · `ls`/`pwd`/`echo`/`cat`)뿐이라
`node .claude/plans/...m3.gates.mjs check-all` 도 `bash docs/_meta/verify/verify.sh` 도 거부다.

그래서 순서를 이렇게 뒀다:

```
기준선 실측(16/16) → lock enter → 안내 → 사용자 조건 수신 → lock exit → 전이 → 전이 후 실측 → closure
```

lock 을 잡은 채 verdict 만 받으면 실측 없는 봉인이 된다. 명세 Phase 4 의 순서를 뒤집은
것이고 그 사유가 이것이다.

## 미검증으로 남는 것

계획서 §Acceptance 가 `(미검증)` 으로 명시한 항목은 이 closure 로도 검증되지 않는다.
숨기지 않고 적는다.

| 항목 | 왜 미검증인가 |
|---|---|
| `## 정책 (기획)` 절에 코드 심볼이 0개인가 | lint 규칙이 없고 `### <id>` 제목이 예외라 기계 판정이 정의되지 않는다. 리뷰 몫 |
| 이 문서가 403 층을 서술하지 않았는가 | 층 귀속은 서술의 성질이며 게이트가 보는 것은 앵커와 표 구조까지다 |
| 앵커가 그 정책을 실제로 뒷받침한다는 판단 | 게이트 `#4` 는 파일 존재와 행 범위까지만 본다 |
| 발견 기록에 판단·원인 귀속·수정 제안이 섞이지 않았다 | 기계 검사 없음. `findings/README.md` §적지 않는 것이 규범이고 리뷰 몫 |
| `#15` 해소문이 Open Question 을 실제로 답하는가 | 게이트는 체크 상태와 절 이름 존재까지만 본다 |
| `#16` 이 허용한 backlog 유래 golden 이동이 정당한 추가에서 왔는가 | 게이트는 계수를 드러낼 뿐 그 행의 정당성은 못 본다 |
| 문서가 수치를 산문으로 풀어 쓰지 않았다 | 검사 `#5`~`#8` 은 자리 집합만 대조하고 산문의 수를 보지 않는다 |
| `BASE_SHA` 가 성질 넷을 만족하는 여러 커밋 중 옳은 하나인가 | 게이트 `#1` 은 성질만 보고 선택의 정당성은 못 본다 |
| 온보딩 질문 `Q04` 를 이 문서만으로 답할 수 있는가 | 유지보수자 측정. PRD §Success Metrics 종료 판정 시점 |

## 관측 — 마일스톤 2 closure 부재

PRD §Milestone Closure Provenance 표에 `1-01-glossary` 한 행뿐이다. 마일스톤 2 는
`/mccp:milestone-close` 를 거치지 않고 `complete` 로 전이됐다(표 2행 `complete`,
closure-doc 없음). 이 closure 는 그 공백을 메우지 않는다 — 관측만 적는다.

## Provenance

- Lock run_id        : `d6f83d30-f98a-4b92-93d5-e3f9f7bbca18`
- Lock owner session : `unknown` (`CLAUDE_SESSION_ID` 미설정 — `goal-phase-lock.js enter` 가
  받은 값 그대로다. lock 은 정상 enter/exit 했고 `cleared: true`)
- Lock lifecycle     : enter → exit(즉시) → 실측 → 전이 → closure
- Plan source        : `.claude/plans/insuniverse-docs-20-foundation-access-m3.plan.md`
- Detection signal   : `{"row":3,"name":"`01-authn.md`","plan":".claude/plans/insuniverse-docs-20-foundation-access-m3.plan.md","status":"in-progress"}`
- mccp version       : 1.32.1
- Gate receipts      : `mccp-plan-codex` · `mccp-implement-codex` (둘 다
  `insuniverse-docs-20-foundation-access-m3`). `mccp-pr-codex` 는 아직 없다 — `/mccp:pr` 미실행

**이 문서의 sha256 stamp 는 계획서 본문이 아니라 PRD 에 실린다.** 계획서 본문은
`mccp-plan-codex` · `mccp-implement-codex` 두 receipt 의 `plan_hash` 앵커이며, 여기에 절을
덧붙이면 두 게이트가 동시에 stale 로 떨어지고 `/mccp:pr` 이 fail-closed 로 막힌다. 재앵커는
게이트가 본 적 없는 해시로 receipt 를 다시 쓰는 것이라 쓰지 않는다.
