# Milestone Closure — 4

## Milestone

- ID         : 4
- Name       : 벤더 비교 지표 + 발송 임계 산출
- Plan       : `.claude/plans/ops-alert-system-m4.plan.md`
- Status     : done
- Closed at  : 2026-08-18T01:26:10.328Z
- Closed by  : /mccp:milestone-close (run_id=19b0c17d-9e34-4c00-8548-d450282981a2)

## Acceptance Condition

사용자가 `/goal` 에 전달한 조건 (verbatim):

> `.claude/plans/ops-alert-system-m4.plan.md` 의 태스크가 모두 랜딩됐는지 확인한다 — 벤더 비교 규칙(tn_treat_provider 파생, 개별 벤더 장애와 풀 전체 장애 구분), 전 임계의 설정화, 백분위 산출 도구, 표본 충분성 판정 4가지가 코드에 존재하고 규칙이 기본 OFF 로 시드되는지 확인. 임계 수치 확정은 prod 데이터 대기로 이월된 항목이므로 미확정이어도 통과로 본다. 그다음 `.claude/prds/ops-alert-system.prd.md` 의 Delivery Milestones 표 4행 Status 를 in-progress 에서 complete 로 바꾼다. 이 두 가지가 끝나면 종료, or stop after 20 turns

## Goal Loop Result

사용자 응답 (secret mask 적용 후):

> M4 벤더 비교 규칙 산출도구 검증 완료

### 조건 4항목 대조

| 조건 항목 | 판정 | 증거 |
|---|---|---|
| 벤더 비교 규칙 — `tn_treat_provider` 파생 | 충족 | `insuniverse-server/apps/api/src/modules/alert/rules/treat-vendor.rule.ts` 446행 — 감시 대상을 코드가 아니라 `tpr_enabled=1` 행에서 파생. `alert.module.ts:17,27` 등록 |
| 개별 벤더 장애 / 풀 전체 장애 구분 | 충족 | 같은 파일 377·402행 — `vendor-dominant:<key>`(critical) · `vendor-pool` · `vendor:<key>`(warn) 3축. 귀속은 전수 leave-one-out 이며 설명자가 정확히 1일 때만 지배 벤더로 귀속 |
| 전 임계의 설정화 | 충족 | `getSettingsByPrefix('treat-vendor_')` 1회 조회. 조건 서명 `treat-vendor_derivation` 이 그 회차의 적용값과 어긋나면 throw (§D10 fail-closed) |
| 백분위 산출 도구 | 충족 | `insuniverse-server/scripts/alert-threshold-derive.ts` 151행 — nearest-rank `percentile()`, 보간 없음. p50/p90/p95/p99 산출 |
| 표본 충분성 판정 | 충족 | 같은 파일 54행 — `verdict: 'OK' \| 'INSUFFICIENT_SAMPLE'`. 풀 축이나 스냅샷 벤더 중 하나라도 미달이면 서명 자체를 출력하지 않음 (§D5-4b 부분 미달 규칙) |
| 규칙 기본 OFF 시드 | 충족 | `insuniverse-server/migrations/alert-vendor-rule/01_seed_treat_vendor_disabled.sql` — `INSERT ... ON DUPLICATE KEY UPDATE als_key = als_key` 로 기존 관리자 값 보존, 재적용 멱등. 헤더에 §D9 양방향 순서표 |

### 이월 항목 (조건이 통과로 규정한 것)

`.claude/PRPs/reports/ops-alert-system-m4-report.md` — 실 DB 183건 읽고 **전 축 `INSUFFICIENT_SAMPLE`, 서명 미출력**. 임계 수치는 확정되지 않았고 Q3 는 열려 있다. 이는 실패가 아니라 설계된 결과다 — 리포트가 확정 임계를 권고했다면 그것이 충분성 판정의 오작동이었을 것이다 (계획 Task 5 Gate).

### 계획 §Acceptance 산출물 3건

리포트 §10 기준 전부 확보:

1. 산출 스크립트 실 DB 1회 완주 (2026-08-14)
2. 시드 적용 후 DB 직접 조회 `'0'` + 규칙 등록 빌드 기동 후 `rules['treat-vendor'] === false` (2026-08-14 / 2026-08-18)
3. 임시 ON 회차에서 `GET /admin/alert/monitor` 의 `treat-vendor` `error` 가 "산출된 것이 없다"를 담고, 복원까지 확인 (2026-08-18) — §D10 fail-closed 실동작 증거

### 이 closure 가 닫지 않는 것

- `/mccp:code-review`(PR 모드) · `/mccp:pr` — M3 부터 열린 채 남은 게이트. M4 §Acceptance 밖이며 이 closure 로 닫히지 않는다.
- implement receipt 는 `security_skipped=true` · `codex_verdict='divergent'` 라 `/mccp:pr` 에 대해 non-approving 이다. 슬러그 `ops-alert-system-m4` 는 git 추적 중이라 같은 이름으로 재발급되지 않는다 — 재앵커가 필요하면 새 슬러그를 써야 한다.
- 마일스톤 2.5 잔여조건 11건. M4 완료는 운영 활성화 승인이 아니다.
- 벤더 규칙은 **OFF 로 배포된 상태**다. 켜는 순서는 계획 §D9 활성화 5단계이며, 4단계에서 기록할 서명은 아직 존재하지 않는다.

## Provenance

- Lock run_id        : 19b0c17d-9e34-4c00-8548-d450282981a2
- Lock owner session : 3c43df72-284f-44e4-885c-656c41f81e2a
- Plan source        : `.claude/plans/ops-alert-system-m4.plan.md`
- Detection signal   : `{"availability":"available","goal_signal":true,"signal_ref":{"row":4,"name":"벤더 비교 지표 + 발송 임계 산출","plan":".claude/plans/ops-alert-system-m4.plan.md","status":"in-progress"},"mode":"milestone-close","reason":"ok"}`
- mccp version       : 1.27.2
