---
title: "WS-N2 완료 — MM 융합 마감(리드알림 채널 게시+담당자 실명) PR #22"
from: claude-code
to: ["jadong"]
project: "callcenter-os"
date: 2026-07-06T09:16:04.363329+09:00
status: sent
type: report
---

## WS-N2 완료 — MM 융합 마감 (PR #22, feat/n2-mm-fusion)

ADR-002 "MM=협업 허브" 서사의 마감. 저장 이벤트가 MM `리드알림` 채널로 흐르고, 콕핏·시트의 "배정됨"이 실명("김상담")으로 바뀐다.

### 무엇을
- **core** `GET /t/{tenant}/users/labels` (신규, append-only): assignee_id→실명 최소투영(id·name만). 인증필수·역할무관·테넌트격리.
- **web** `listUserLabels`(무세션/실패 시 {} 폴백) + `assigneeLabel(l, labels?)` **additive**(기존호출 무변경) → 담당 실명 3화면(고객상세·리드큐 카드 담당span 신규·고객시트 use client 자체로드).
- **web** `mm-notify.postLeadNotice`: `NEXT_PUBLIC_MM_NOTIFY_CHANNEL` 게이트, `POST /api/v4/posts`(MmBridge.createPost 동일 REST) → RecordForm 저장 성공 후 fire-and-forget(미설정/무세션/실패 무동작 → 저장 UX 무영향).
- **mm-init.sh** `리드알림` 채널 idempotent 생성 + 상담원 조인 + id를 .env.local.mm(미출력).

### 검증 (증거)
- core pytest **146 pass**(+3) · web vitest **64 pass**(+18) · design-tokens25·mm-bridge3 무손상 · next build exit0(11라우트) · 인라인 hex(N2 변경파일) **0건**.
- **MM 실게시 라이브 스모크 PASS**: taejin 세션토큰 → POST /posts **201** → 리드알림 채널 리드백 FOUND(게시자 taejin). 토큰 미출력.

### 경계
- core-api.ts 접촉 = assigneeLabel additive 1함수만(N1 무접촉). 시트 담당span=N2 / SHEET_EXTRAS=N3 → PM 머지 병합.
- /users/labels 라이브는 core(:8000) 미기동 → pytest 3건으로 대체검증(X-MM-Token 위임은 M4 라이브 불변).

머지는 PM 세션. 후속 N1(푸시 실시간)·N3(시트 실데이터) 별도 WS.

Maester: result_20260706_6822d3
