# Milestone Closure — 5-terms-privacy-audit

## Milestone

- ID         : 5-terms-privacy-audit
- Name       : `01-terms-and-agreements.md` + `02-privacy-and-masking.md` + `03-audit.md`
- PRD        : `.claude/prds/insuniverse-docs-40-runtime-vendor-legal.prd.md` (Delivery Milestones 5행)
- Plan       : `.claude/plans/insuniverse-docs-40-runtime-vendor-legal-m5.plan.md`
- Status     : done
- Closed at  : 2026-08-27T07:31:27.332Z
- Closed by  : /mccp:milestone-close (run_id=53a3f55c-8978-43a7-bc3d-ea384b733cc5 · mccp 1.32.6)
- HEAD       : `ede63e146f449cc186dc07c6f3d06702445995f3`

> **id 가 `5` 가 아닌 이유.** `.claude/milestone-closures/` 는 PRD 를 가르지 않는 평평한 디렉터리이고
> `.claude/milestone-closures/4.md`(`ops-alert-system` 마일스톤 4)가 이미 추적 중이다. 행 번호만으로
> 이름을 지으면 PRD 가 다른 마일스톤끼리 파일명이 충돌해 앞의 closure 를 덮어쓴다. 이 PRD 의 앞선 네
> 건(`1-04-runtime-topology` · `2-retention-billing-monitoring` · `3-02-failure-semantics` ·
> `4-treat-payments-messaging`)이 `<행>-<주제>` 규약을 쓰므로 그것을 따른다.

## Acceptance Condition

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

> `.claude/plans/insuniverse-docs-40-runtime-vendor-legal-m5.gates.mjs all` 이 16/16 을 유지하고,
> PRD Delivery Milestones 5행이 complete 이며, closure 문서와 provenance 행이 선다.
> `#15` 는 M4 의 `#15c` 를 포팅해 종료 후 모드를 추가하되 종료 전 주장은 살린다. 검증은
> 편집→커밋→all 순서로 한다. 또는 20 turn 후 중단

조건에 `#15` 항과 순서 항이 붙은 이유는 lock 을 걸기 전 소스 실측에서 **전이 자체가 두 하네스를
깨는 것**이 확인됐기 때문이다. 두 항은 서로 다른 원인이다 — `#15` 항은 M5 하네스가 5행을
`in-progress` 값에 결박한 것이고, 순서 항은 M4 하네스가 형제 창의 미커밋 PRD 편집에 죽는 것이다.

## Goal Loop Result

4항 전건 충족. `all` 최종 회차만은 자기 참조라 이 문서가 인용할 수 없다 — §4 에 그 한계를 적었다.

### 0) 진입 전 실측 — 왜 하네스 수정과 순서가 조건에 들어왔는가

**(a) M5 `#15b` 가 5행을 `in-progress` 값에 결박했다.** 포팅 전 마지막 두 줄:

```js
if (/\bcomplete\b/.test(row)) die(`#15b FAIL: complete 전이는 milestone-close 소유`);
if (!/\bin-progress\b/.test(row)) die(`#15b FAIL: Status 가 in-progress 가 아니다 — ${row.slice(0, 140)}`);
```

이 검사의 주장은 *"구현 창이 종료 전이를 가로채지 않았다"* 이고 그 자체는 옳다. 문제는 주장이
`in-progress` 라는 **값**에 결박돼 있어 milestone-close 가 자기 일을 하는 순간 검사가 죽는다는
것이다. 같은 함수가 커밋 전/후 축에서는 이미 두 모드로 갈려 있었다 — 저자가 그 축만 잡고 종료 전/후
축을 놓쳤다. M4 는 자기 종료 시점(커밋 `4de6dd4`)에 `#15c` 를 신설해 이 자리를 이미 고쳤고, M5
하네스에는 그 포팅이 없었다.

귀결이 이월이 아니라 차단인 이유는 `#0a` 다 — M5 `#0a` 가 선행 하네스 M1~M4 의 `all` 을 rc 0 으로
요구하고 M6 하네스가 같은 구조를 쓰면 M5 `all` 이 15/16 인 채로 M6 전건이 서지 못한다.

부수 사실 하나 더 — milestone-close 는 PRD 에 **두 줄**을 쓴다(5행 전이 + provenance 행). 두 줄은
서로 다른 절에 있으므로 포팅 전 `#15a`(hunk 전건이 `## Delivery Milestones` 범위 안)는 미커밋
상태에서 `절 범위 밖 변경` 으로 죽는다.

**(b) M4 `#15` 가 형제 창의 미커밋 PRD 편집에 죽는다.** 이것은 이 창이 구현 중에 이미 실측해
backlog 에 이월한 사실이다(`id=40m5-m4-gate15-sibling-prd-edit` · 구현 리포트 I6). M4 `check15` 는
`git diff HEAD -- <PRD>` 에 hunk 가 하나라도 있으면 그것을 **자기 갱신**으로 읽고 `Plan 셀이 M4
계획서 경로인 추가 행` 을 요구한다. M5 종료가 같은 표의 5행과 provenance 행을 고치면 그 조건이
깨지고, M5 `#0a` 가 M4 `all` 을 요구하므로 M5 전건이 선행 검사에서 막힌다. 모드 분기의 키가
*"이 파일에 diff 가 있는가"* 이지 *"내 행에 diff 가 있는가"* 가 아닌 것이 원인이다.

**이 종료에서 실측한 문면은 backlog 에 적힌 것과 다르다.** 구현 중 관측은 `#15b FAIL: 변경 행이
1개다 (기대 2)` 였다 — 그때 M5 는 5행 하나만 고쳤고 M4 는 이미 종료 후 모드라 두 줄을 기대했다.
이 종료는 두 줄을 쓰므로 계수 검사는 통과하고 그 다음 팔에서 죽는다:

```
$ M4_GATES_CHECK0=ok node .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m4.gates.mjs check15
#15c ok [종료 후] provenance 행 1건 · Verdict done · closure 실재 · sha256 일치 sha256:3c8c64cf…
#15b FAIL: 변경 행 중 Plan 셀이 '.claude/plans/insuniverse-docs-40-runtime-vendor-legal-m4.plan.md' 인 행이 0개다 (기대 1)
rc=1
```

**두 문면은 같은 원인의 두 얼굴이다** — M4 는 이 PRD 의 어떤 미커밋 편집이든 자기 갱신으로 읽는다.
계수가 맞으면 소유 판정에서, 안 맞으면 계수에서 죽을 뿐이다. backlog 행의 문면만 보고 "계수를
맞추면 풀린다" 고 읽으면 틀린다.

**M4 하네스는 이 창의 범위 밖이라 고치지 않는다.** 해소는 순서다 — PRD 편집을 커밋한 뒤 `all` 을
돌리면 두 하네스가 함께 커밋 후 모드로 간다. 그것이 acceptance 조건의 순서 항이다.

**PRD 를 읽는 하네스 전수.** `.claude/plans/**` 에서 이 PRD 경로를 상수로 든 하네스는 넷이다 —
M1 · M2 · M4 · M5. M1 과 M2 는 `### MVP` 펜스만 읽는다 — 세 하네스(M1 · M2 · M3) 어디에도
`Delivery Milestones` · `Milestone Closure Provenance` 문자열이 0건이고 M3 은 PRD 를 아예 참조하지
않는다. 따라서 이 종료의 두 줄 편집이 닿는 하네스는 **M4 와 M5 둘뿐**이다.

### 1) `#15` 종료 후 모드 — 포팅됐고 종료 전 주장은 살아 있다

M4 `#15c` 를 M5 상수로 포팅했다. **종료 여부를 PRD 의 자기 주장이 아니라 파일 바이트 해시로
판정한다:**

| 조건 | 판정 |
|---|---|
| `## Milestone Closure Provenance` 표에 `5-terms-privacy-audit` 행이 정확히 1개 | 아니면 exit 1 |
| 그 행 `Verdict` 가 `done` | 아니면 exit 1 |
| 그 행 `Closure` 셀이 `.claude/milestone-closures/5-terms-privacy-audit.md` | 아니면 exit 1 |
| 그 파일이 실재 | 아니면 exit 1 (행만 손으로 적는 것이 종료가 되지 않게) |
| 그 파일의 raw sha256 == 행의 `sha256` 셀 | 아니면 exit 1 |
| 행이 0개인데 closure 파일은 있음 | exit 1 (부분 종료 금지, 양방향) |

`closed` 가 정해지면 `#15b` 가 **양방향**으로 문다 — 종료 전 `complete` 는 구현 창이
milestone-close 의 몫을 가로챈 것이고, 종료 후 `in-progress` 는 closure 가 섰는데 표가 안 따라온
것이다. 둘 다 실패다. `#15a` 의 허용 절 범위도 `closed` 에 따라 하나(`## Delivery Milestones`)와
둘(+ `## Milestone Closure Provenance`)로 갈리고 기대 변경 행 수가 1 과 2 로 갈린다.

`hash-markdown` 이 raw sha256 과 같은 값을 낸다는 것을 이 창에서도 다시 실측했다 — `plan_hash` 는
구조 해시라 원시 sha256 과 다르지만 `hash-markdown` 은 다르다:

```
$ node .../receipt/cli.js hash-markdown .claude/milestone-closures/4-treat-payments-messaging.md
sha256:3c8c64cf36c75683a72a1f0016cbbdd83d20706c65518a6855f16a5db5121a85
$ node -e "…createHash('sha256').update(readFileSync(…))…"
sha256:3c8c64cf36c75683a72a1f0016cbbdd83d20706c65518a6855f16a5db5121a85
```

그 값은 PRD provenance 표의 `4-treat-payments-messaging` 행 `sha256` 셀과도 같다. 따라서 하네스는
`node:crypto` 하나로 재계산한다. `node:crypto` 는 M5 하네스가 이미 `import` 하고 있었고 `#11c`
허용 목록의 빌트인이라 **INV1(신규 의존 0) 은 그대로**이며 지정자 계수도 5 로 불변이다.

**반사실 3건 — 실행해 확인했다.** 셋 다 `M5_GATES_CHECK0=ok` 핸드오프로 `#0` 를 건너뛰고 `#15` 만
겨눴다(`#0` 는 M1~M4 를 중첩 실행해 회당 20분대이고, 같은 트리에서 §4 회차 2 가 이미 통과시켰다).

| # | 만든 상태 | 관측 | rc |
|---|---|---|---|
| 1 | PRD 5행 `complete`, closure·provenance 없음 | `#15c ok [종료 전] provenance 행 0건` · `#15a ok [미커밋] … 변경 행 1개 (기대 1)` · `#15b FAIL: complete 전이는 milestone-close 소유` | 1 |
| 2 | 5행 `complete` + closure 파일 + provenance 행, sha256 만 한 값 틀림 | `#15c FAIL: sha256 불일치 — 표 sha256:0000…0000 / 실측 sha256:25be3235…` | 1 |
| 3 | closure 파일만 있고 provenance 행 없음 | `#15c FAIL: closure 문서는 있는데 provenance 행이 없다 — .claude/milestone-closures/5-terms-privacy-audit.md` | 1 |

1 은 **종료 전 주장이 살아 있음**을, 2·3 은 **행을 손으로 적는 것이 종료가 되지 않음**을 각각
양쪽에서 문다. 세 건 모두 실행 후 `git checkout -- <PRD>` 와 임시 파일 삭제를 trap 으로 걸어
복원했고 마지막 `git status --porcelain` 은 하네스 파일 한 줄만 남겼다.

### 2) PRD Delivery Milestones 5행 — `complete`

```
| 5 | `01-terms-and-agreements.md` + `02-privacy-and-masking.md` + `03-audit.md` | 법적 정책의 트리거와 **판 관리 부재의 결과** | complete | `.claude/plans/insuniverse-docs-40-runtime-vendor-legal-m5.plan.md` |
```

6행(리뷰 2라운드 수렴)은 `pending` 그대로이고 PRD 꼬리의 `*Status: DRAFT*` 행도 그대로 둔다 — PRD
자체는 아직 종료가 아니다. 표 행을 읽는 하네스는 §0 에서 열거한 대로 M4·M5 둘뿐이고 둘 다 자기
행만 본다.

### 3) closure 문서와 provenance 행 — 섰다

이 문서와 PRD `## Milestone Closure Provenance` 표의 다섯 번째 행. **계획서 본문에는 아무것도 쓰지
않는다** — 아래 §계획서 본문 무편집.

### 4) `all` 16/16 — 측정 회차와 그 한계

이 종료가 건 회차는 넷이다. **붉었던 회차를 지우지 않는다.**

| 회차 | 트리 상태 | `#15` 모드 | 결과 |
|---|---|---|---|
| 1 | `43d1caf` — 구현 창 봉인 (포팅 전) | 커밋 후 · (종료 축 없음) | `16/16` — 구현 리포트 §게이트 실행 결과 |
| 2 | `ede63e1` + `#15c` 포팅 미커밋, PRD 무편집 | 커밋 후 · 종료 전 | `16/16` — 아래 출력 |
| 3 | 회차 2 트리에서 반사실 3건 주입 | 미커밋 · 종료 전/후 | 전건 `rc 1` — §1 표 |
| 4 | PRD 두 줄 + 이 문서, 미커밋 | 미커밋 · 종료 후 | `#15c ok [종료 후] … sha256 일치` · `#15a ok [미커밋] … 변경 행 2개 (기대 2)` · `#15b ok [미커밋 · 종료 후] … Status == complete` · rc 0. `all` 은 `#0a` 가 M4 `check15` 에서 막는다 — §0(b) 의 지정 사유 |

**회차 5(종료 커밋 후 · 커밋 후 · 종료 후)를 이 문서는 인용할 수 없다.** 그 실행이 보는 트리는 이
문서를 포함하고 이 문서의 sha256 은 그 트리의 PRD 에 실려 있다 — 자기 참조다. M4 closure 도 같은
자리에서 `#15c` 의 sha256 을 본문에 못 싣고 `PRD provenance 표의 sha256 셀이 정본` 이라고만 적었다.
회차 5 의 성립은 **M6 `#0a` 가 매 실행 재판정**하며, 이 종료가 그것을 막지 않는다는 것이 회차 2 와
회차 4 의 곱으로 서 있다 — `#0`~`#14` 는 PRD 두 줄에 불변이고(회차 2), `#15` 는 종료 후 모드에서
초록이다(회차 4).

회차 2 출력 (rc 0):

```
#0a ok 선행 하네스 완주 — M1 15/15 · M2 13/13 · M3 14/14 · M4 16/16
#0b ok 선행 8문서 워킹트리 변경 0
#0c ok 동결 3트리 포인터 전건이 manifest repos[].head 이고 상위 체크아웃에서 commit 으로 열린다
#0 ok surface_traceability 키 7 == 후보 인덱스 axis:legal 행 7
OK — 11개 파일, 위반 0 (--strict-refs)
#1 ok 11개 파일 (신설 3 · 선행 8) 위반 0 (--strict-refs)
#2a ok 문서별 정책 수 01=11 02=4 03=5 · 합 20 · id 중복 0 · 접두 충돌 0 · 인덱스 리더가 읽은 키 67개 · 건너뛴 형제 키 91개
#2b ok 계획서 축 2 표 재파싱 20행 == 하네스 상수 표 20행 (4열 전건 일치)
#2c ok 선행 8문서 id 119종과 교집합 0
#2 ok evidence 등급 규칙 일치 20/20 · 전건 2개 이상 · 종류 분해 schema 11 · guard 7 · constant 1 · site-text 1
#2 앵커 보정: 2건 — terms:revocation-record += insuniverse-server/drizzle/schema.ts:1773 · terms:reconsent-absent += insuniverse-server/apps/api/src/modules/agency/terms/terms.service.ts:99 (계획서 표 앵커가 하중 토큰 없는 행을 가리켜 실 하중 행을 더했다. 계획서 문면은 plan_hash 앵커라 고치지 않고 여기 계수로 낸다)
#3a ok status 유도 일치 20/20 (D1 3 · D2 1 · D3 12 · D4 4)
#3b ok -unknown 정책 unknown_reason 보유 4/4 · staged-only 정책 limitations 보유 4/4
#3c ok 본문 12건 ≥1 · 부록 8건 ≥1 (하한만 본다 — 상한·비율은 보지 않는다)
#3 ok 배치 == placement 20/20
#4a ok 표 3건 헤더 6열 문자열 일치 · 행수 == 문서 정책 수 (01 11 · 02 4 · 03 5)
#4 ok 키 열 합집합 7 == surface_traceability 키 7 · 쌍별 교집합 0 · 03 은 인덱스 키 0건(감사 축)
#5a ok blame 대상 앵커 32건 · SHA 17종 · 인덱스 실재 17/17
#5b ok unreached 집합 server 64 · site 33 · admin 53 재열거 · 도달성 분해 reached 15 unreached 4 mixed 1
#5 ok 재유도 == 대조표 6열 전건 20/20 (판정식은 releases.yaml 머리말 그대로 · 미인덱스 SHA 는 미도달로 접지 않는다)
#6a ok 양성 프로브 수탁 25회 / 7파일 == 인덱스 (파일 집합 양방향 일치)
#6b ok 재동의 0회 / 0파일 == 인덱스 basis not-observed
#6 ok 철회 분류 14/21/5 == 인덱스 · rule_sha256 일치 (consent-over-business)
#7a ok 재파싱 함수 5종 · 분기 수 합 10
#7b ok 재파싱 == legal-surfaces masking.canonical.rules 5/5 (분기 수 · 출력 형태 · 앵커 3축)
#7 ok 문서 표 5행 == 재파싱 5행 · 표 셀 세로선 치환 되돌림 1행 (마크다운 표 파서가 세로선에서 쪼개므로 문서는 이중 세로선 문자로 싣는다)
#7c ok 구현 축 9종(인덱스 재열거) · 소비 축 9종(동결 트리 재열거) · 교집합 0 · 두 집합 전건이 '## 정본과 병렬 구현' 절에 경로로 실렸다
#8a ok anchor tokens 34 / bad 0 (server 32 · site 1 · admin 1)
#8 ok 하중 앵커 21건 기대 토큰 일치 (행 번호만 보면 파일이 밀렸을 때 엉뚱한 행이 통과한다)
#9a ok 3문서 연혁 행 01=7 02=9 03=6 · 행 0개 문서 없음
#9 ok SHA 전건 커밋 인덱스 실재 22/22 · 전건이 그 문서 앵커 경로 접촉
#10 ok 문서별 본문∪부록 == 강제 지점 == 적용 범위 == 예외·폴백 == 프론트매터 (01 11 · 02 4 · 03 5) · 적용 범위 표 빈 칸 0건
#11a ok --help rc=0 · 서브커맨드 목록 출력
#11b ok 알 수 없는 서브커맨드가 이름을 담고 exit 1
#11c ok 의존 지정자 5건 전건 node 빌트인 또는 doc-kit lint (UI10)
#12a ok 정본 표기 유도: glossary 용어 요청 표에서 T-02 행 1건 · 정본 '동의 철회'
#12 ok 3문서 단독 표기 0건 · 전개형 13회 · 인용(펜스·코드 스팬) 제외 3회 (단독 판별은 직전 3자가 '동의 ' 인지로 한다)
#13a ok 코퍼스 sha256 16종 재열거 · 문서 등장 0종 전건 집합 안 (집합 밖 sha256 0건)
#13b ok 코퍼스 n-gram 표본 146개 (파일 14 · 길이 12 · 보폭 401 · 파일당 상한 24) · 문서 등장 0건
#13c ok constants.yaml 이름 54종 재열거 · 등장 0건 (UI16 — 상수 정의는 30-contracts-limits 소유)
#13 ok
#13 사각: (b) 는 **표본이고 전수가 아니다** — 보폭 401자마다 길이 12 한글 구간만 뽑아 파일당 24개까지 받으므로 표본 사이 구간의 문구는 이 검사가 보지 못한다. (a) 는 sha256 형태 토큰만 보고 (c) 는 이름만 보므로 값을 다른 표기로 옮겨 적은 것도 보지 못한다
#14a ok 형제 어휘 3종 재스캔 0파일 — 30-admin 관측 재현 (범위 apps/api/src/modules)
#14b ok 확장 우주 유도: 전용 감사 기록 0종 · 행위자 컬럼 보유 표 9종 · 운영 로그 표 5종 · 업무 이력 표 7종 (행위자 컬럼 보유 표에서 tn_admin 은 제외한다 — 그 adm_id 는 자기 기본키다)
#14 ok 부류 4종 전건이 03-audit 기록 부류 표에 행으로 있다 · 차집합 0 (양방향) · 계수 2열 재유도 일치
#15c ok [종료 전] provenance 행 0건 · closure 문서 부재 (.claude/milestone-closures/5-terms-privacy-audit.md)
#15a ok [커밋 후] PRD 워킹트리 diff 0건 — 갱신 여부는 물지 않고 절 범위(194~208) 안의 해당 행 내용을 직접 문다
#15b ok [커밋 후 · 종료 전] 대상 행이 5행 · Plan 셀 == 이 계획서 경로 · Status == in-progress · complete 아님
#15 ok (모드 커밋 후 · 종료 전)
all ok 16/16 통과
```

`#0a` 가 M1 15/15 · M2 13/13 · M3 14/14 · M4 16/16 회귀와 선행 8문서 워킹트리 불변을 선행 검사하므로
이 출력은 이 종료가 앞선 네 마일스톤의 산출물을 건드리지 않았다는 진술을 함께 진다.

## 계획서 본문 무편집 — receipt `plan_hash` 재검증

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

`hash-plan` 재계산값과 두 receipt 의 `plan_hash` 가 같다:

```
$ node .../receipt/cli.js hash-plan .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m5.plan.md
sha256:5ae02e3f1def1aa9bfa923e602748ef954378aee2e673ad8c4cdfb475797793f

.claude/receipts/mccp-plan-codex/insuniverse-docs-40-runtime-vendor-legal-m5.json
  "plan_hash": "sha256:5ae02e3f1def1aa9bfa923e602748ef954378aee2e673ad8c4cdfb475797793f"
.claude/receipts/mccp-implement-codex/insuniverse-docs-40-runtime-vendor-legal-m5.json
  "plan_hash": "sha256:5ae02e3f1def1aa9bfa923e602748ef954378aee2e673ad8c4cdfb475797793f"
```

## 이 종료가 판정하지 않은 것

- **closure 문서의 내용.** `#15c` 는 이 파일의 실재와 바이트 해시만 본다. acceptance 가 실제로
  충족됐는가는 이 본문이 지며 그것은 사람 판정이다.
- **계획서 Acceptance 의 `(미검증)` 3항.** 축 2 의 코드 전용 감사 정책 누락 여부(열린 집합) · Q19
  와 Q52 가 세 문서만으로 답해지는가(유지보수자 판정) · 이월 10건의 backlog 등재(사람 확인). 앞의
  둘은 이 종료로도 닫히지 않는다. 셋째는 backlog 표 구간의 `id=40m5-` 접두 행 10건으로 확인했다
  (`grep -c "id=40m5-"` 가 10).
- **M4 하네스의 모드 분기 키.** `id=40m5-m4-gate15-sibling-prd-edit` 로 이월돼 있고 이 종료는 그것을
  순서로 우회했을 뿐 고치지 않았다. **M6 도 같은 자리에서 막힌다.**

## Provenance

- Lock run_id        : `53a3f55c-8978-43a7-bc3d-ea384b733cc5`
- Lock owner session : `unknown` (`CLAUDE_SESSION_ID` 미설정 — 이 저장소의 앞선 종료 4건과 같다)
- Milestone id       : `5-terms-privacy-audit`
- PRD source         : `.claude/prds/insuniverse-docs-40-runtime-vendor-legal.prd.md`
- Plan source        : `.claude/plans/insuniverse-docs-40-runtime-vendor-legal-m5.plan.md`
- Detection signal   : `{"availability":"available","goal_signal":true,"signal_ref":{"row":5,"name":"`01-terms-and-agreements.md` + `02-privacy-and-masking.md` + `03-audit.md`","plan":".claude/plans/insuniverse-docs-40-runtime-vendor-legal-m5.plan.md","status":"in-progress"},"mode":"milestone-close","reason":"ok"}`
- Gate               : option B — 별도 `mccp-milestone-close-codex` receipt 를 발행하지 않는다. 이
  문서 body 와 PRD provenance 행의 sha256 이 감사 앵커이고, 그 대조는 M5 `#15c` 가 매 실행 진다.
- mccp version       : 1.32.6
