callcenter-os N1 완료 — 푸시 실시간 (PR #20)
한 줄: 브라우저 WS가 헤더를 못 실는 제약을 우회 — MM 세션토큰을 WS 첫 메시지로 실어 core가 인증, 리드 실시간을 **폴링(3s)→푸시(31ms)**로 승격.
변경 (전부 N1 소유)
core/app/routers/ws.py— 첫메시지 인증에 MM토큰 폴백(core JWT 우선→실패 시 MM토큰 재시도). 기존 경로 무변경.core/app/mm_auth.py—resolve_mm_user_token(tenant, token)헬퍼 노출(Request 없이 재사용).cockpit-next/web/src/lib/core-api.ts—subscribeLeadsWS 우선 전환 + 단절/미지원/토큰부재 시 3s 폴링 자동 폴백(경로 보존, 시그니처 불변).
검증
| 항목 | 결과 |
|---|---|
| core pytest | 147 pass (기존 143 + 신규 4) |
| web vitest | 49 pass (core-api 11) |
| next build | exit 0 (11 라우트) |
| 라이브 2세션 push | 세션A PATCH → 세션B WS 31.4ms (≪ 폴링 3000ms) |
| WS 인증 | MM 세션토큰 첫메시지 accept(ready) / 무효 4401 reject |
증적: docs/design/verify/n1-realtime.txt (MM=live :8443/chat, 토큰 미출력)
상태
PR #20 오픈 — 리뷰/머지는 PM 세션. 남은 N라운드: N2(MM 채널게시+담당자 실명), N3(고객시트 실데이터).