# Milestone Closure — 1-04-runtime-topology

## Milestone

- ID         : 1-04-runtime-topology
- Name       : `04-runtime-topology.md`
- PRD        : `.claude/prds/insuniverse-docs-40-runtime-vendor-legal.prd.md` (Delivery Milestones 1행)
- Plan       : `.claude/plans/insuniverse-docs-40-runtime-vendor-legal-m1.plan.md`
- Status     : done
- Closed at  : 2026-08-25T00:31:53.042Z
- Closed by  : /mccp:milestone-close (run_id=d9cc9833-f1f7-4cb3-bc0c-5798d026ce7e)
- HEAD       : `9768d4995eb98c409724e110d7384fb54df46787`

## Acceptance Condition

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

> `.claude/plans/insuniverse-docs-40-runtime-vendor-legal-m1.gates.mjs all` 이 15/15 통과하고,
> `docs/05-schedules/04-runtime-topology.md` 만 읽고 Q15(어느 스케줄러가 어느 문서 소관인가)와
> Q16(활성 여부를 왜 단정하지 않는가)에 답할 수 있으며, PRD Delivery Milestones 1행 외에
> in-progress 잔여가 없다. 또는 20 turn 후 중단.

## Goal Loop Result

3항 전건 충족. 1 turn 에 수렴.

### 1) 게이트 15/15 — 통과

`node .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m1.gates.mjs all` 최종 출력:

```
#0  ok 인덱스 조인 17키 전수 일치 · meta.counts.schedule=17 · schedules.yaml digest 일치 · baseline 2종 전사 일치
#1  ok doc-kit lint --strict-refs 통과
#2  ok 배치표 스케줄러 17종 == schedules.yaml 키 17종 (편차 0)
#3  ok 선언 상태 조인 17행 · 편차 0
#4  ok 라벨 유도 일치 · 게이트 유무 일치 · 게이트 없음 1종
#5a ok schedule:* 부록 17건 == 후보 axis=schedule 유도 부록 대상 17건
#5b ok declaration:* 부록 18건 == schedules.yaml 유도 부록 대상 18건
#5c ok 두 projection disjoint
#5d ok 합집합 == 부록 정책 집합 (잔여 0 · 총 35건)
#6  ok 승계 16건 · 신규 판정 1건 (전건 pending 출신) · 배치표 활성 판정 열 17행 3자 조인 일치
#7  ok unknown_reason 승계 17건 · 게이트 부재 사유 병기 확인 1건
#8  ok 선언 정책 18건 == 선언 단위 18개 (배포 라벨 17 + 인프로세스 1 · 편차 0)
#9a ok 앵커 66건 해석 · 동결 stg 32 · 미동결 prod 전용 10 · 행 초과 0 · 행 내용 대조 64건
#9b ok 본문 소스 행 인용 32건 전부 동작주기 주석 행 · 주석 보유 스케줄러 15종의 원문·좌표 일치
#10 ok 부정 어휘 0건 (검사 어휘 14종)
#11 ok 연혁 12행 · 인덱스 해석 12건 · 스케줄 경로 접촉 12건 · 요약 결박 (이름 9행 · 진입점 3행) · 저장소 태그 0개
#12a ok 유도 쌍 17개 · 키 전건 문서 1개로 매핑 (문서 11종)
#12b ok 배치표 쌍 == 유도 쌍 (편차 0) · 트리 해석 17건
#13 ok --help 성공 · nosuchcheck rc=1 · 서브커맨드 17종 등록
#14a ok active-prod 자격 0건 (동결 prod 앵커 AND deployment_evidence=true)
#14b ok 선언 id -> status 맵 18쌍 == 인덱스 유도 맵 (편차 0)
#14c ok 두 축 id -> placement 맵 35쌍 == config.statuses 유도 배치 (선언 18 + 활성 17 · 편차 0)
#14d ok 본문 정책 0건 == 배치 유도 본문 대상 0건 (선언 축 자격 0건)
all ok 15/15 통과 (문서 6b71748)
```

### 2) 문서 단독으로 Q15 — 답한다

`## 스케줄러 배치표` 6열 17행이 (스케줄러 → 담당 문서) 를 직접 낸다. 배분:

| 담당 문서 | 스케줄러 |
|---|---|
| `docs/05-schedules/01-retention.md` | `delete-analysis` · `delete-fc` · `delete-invoice-files` · `delete-treat` (4) |
| `docs/05-schedules/02-billing-cycles.md` | `disable-subscription` · `expired-money` · `regular-agency-subscription` · `regular-subscription` · `settlement-agency` · `settlement-client` (6) |
| `docs/05-schedules/03-monitoring.md` | `alimtalk-status` · `analysis-stall` · `analysis-status` · `fax-status` (4) |
| `docs/06-vendors/04-messaging.md` | `push.scheduler` (1) |
| `docs/05-schedules/04-runtime-topology.md` (자기 자신) | `sales-statistics` · `samsung-s2-report` (2) |

합 17. 게이트 `#12a`·`#12b` 가 이 쌍 집합을 PRD §MVP 펜스 유도값과 exact 대조한다 (편차 0).

### 3) 문서 단독으로 Q16 — 답한다

두 자리가 사유를 낸다.

- `## 정책 (기획)` — 절이 빈 이유를 산문으로: 정본 어휘 `active-prod` 는 *prod 도달* 과
  *게이트 부재 또는 활성* 두 다리를 함께 요구하는데, 후보 인덱스의 `axis: schedule` 전 행이
  `reachability.deployment_evidence: false` 이고 배포 스케줄러는 `status_basis: gate-value-unknown`
  이라 어느 쪽도 서지 않는다. **판정을 미룬 것이 아니라 판정 근거가 저장소 안에 없다는 관측.**
- `## 부록` 머리 — *"여기 실린 어떤 정책도 배치의 활성을 부정하지 않는다. 미판정과 부정은
  다르다."* 삭제 배치 4종이 데이터 보존 정책에 직접 걸리므로 어느 방향으로든 단정하면 위험하다는
  근거를 병기. 게이트 `#10` 이 부정 어휘 14종의 0건을 강제한다.

`unknown_reason` 은 `schedules.yaml` 의 `active_reason` 을 문자열로 승계하고(`#7`),
`push.scheduler` 는 게이트 부재를 사유로 덧붙인다.

### 4) PRD in-progress 잔여 — 1행뿐

Delivery Milestones 2~6 행 전건 `pending`. 200행(마일스톤 1) 외 `in-progress` 0건.

## 착수 전 해소 (사용자 판정 D-1 · D-2)

이 closure 는 계획서 §사용자 판정 필요의 두 건이 닫힌 뒤에만 성립한다. 커밋 `9768d49`:

| # | 판정 | 적용 |
|---|---|---|
| D-1 | PRD 개정 후 close | PRD §반드시 지킬 것 3번째 항목이 선언 축을 본문(`active-prod`)으로 지시하던 것을 두 축 모두 `conditional-unknown` 부록으로 개정. 반증 근거와 승격 경로(`#14c`·`#14d` 인덱스 유도)를 문면에 박음. §Risks 해당 행 확률을 `실현됨` 으로 |
| D-2 | 정정 | PRD §P-3 의 samsung 라벨 `samsung-s2-report` → `samsung-s2-report-final`. 스케줄러 키를 라벨로 오기한 것 |

개정 후 게이트 재실행 `all ok 15/15` — PRD 문면 변경이 `#12` 의 MVP 펜스 유도를 건드리지 않음을 실측으로 확인.

## 미검증으로 남는 것

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

| 항목 | 왜 미검증인가 |
|---|---|
| `bash docs/_meta/verify/verify.sh --check` 완주 | 이 worktree 는 서브모듈 워킹트리가 없어 실행 자체가 불가(관측 1). 서브모듈이 실재하는 창에서 `run_lint_gate` 가 이 문서를 잡는지 확인이 남는다 |
| 스케줄러 담당 문서 배분이 PRD §MVP 의 4·6·4 구획과 맞는지 | 기계 검사(`#12`)는 쌍 집합 일치와 파일명 실재까지만 본다. 구획 의미의 타당성은 유지보수자 판정 |
| 연혁 12행 중 4행의 요약 문면 | 스케줄러를 이름하지 않는 진입점 커밋 행. 문면 결박은 기대 요약 리터럴을 요구해 INV4 위반. `#11` 이 그 계수를 출력에 낸다 |
| `docs/_meta/findings/40-runtime-vendor-legal.md` 신설 | `golden.txt` `findings.files` 갱신이 필요하고 `docs/_meta/verify/**` 는 40 소유가 아니다. backlog 이월 |

## Provenance

- Lock run_id        : `d9cc9833-f1f7-4cb3-bc0c-5798d026ce7e`
- Lock owner session : `unknown` (CLAUDE_SESSION_ID 미노출)
- Lock lifecycle     : enter → (guard BLOCK on gate harness, default-deny) → exit → 실측 → closure
- Plan source        : `.claude/plans/insuniverse-docs-40-runtime-vendor-legal-m1.plan.md`
- Detection signal   : `{"row":1,"name":"`04-runtime-topology.md`","plan":".claude/plans/insuniverse-docs-40-runtime-vendor-legal-m1.plan.md","status":"in-progress"}`
- mccp version       : 1.32.1
- Gate receipts      : `mccp-plan-codex` · `mccp-implement-codex` (둘 다 `insuniverse-docs-40-runtime-vendor-legal-m1`)

**이 문서의 sha256 stamp 는 계획서 본문이 아니라 PRD 에 실린다.** 계획서 본문은
`mccp-plan-codex` · `mccp-implement-codex` 두 receipt 의 `plan_hash` 앵커이며, 여기에 절을
덧붙이면 두 게이트가 동시에 stale 로 떨어진다. 재앵커는 봉인된 판정을 사후에 옮기는 것이라
쓰지 않는다.
