실시간 경고 화면 — 컴플라이언스 실데이터 연결
무엇을
상담원 화면의 실시간 위반 경고 + 대체 표현 제시를 실서버 findings 에 붙인다.
화면이 만들 수 없는 것
응답에 오는 것은 call_id·segment_id·findings 셋뿐이다 —
등급·점수·「안전」 필드가 계약에 아예 없다(부록 A-1).
그러니 화면에서 «위험도» 를 계산해 만들지 않는다. 재료가 없는 것이 설계다.
경고는 상담원 발화에만 붙는다
C-1~C-4 는 상담원 발화의 위반을 잡고, C-6 콜 가드는 고객 폭언을 잡는다 — 방향이 반대다. 같은 자리에 같은 모양으로 띄우면 상담원이 «내가 혼나는 것»과 «내가 보호받는 것»을 구분하지 못한다.
완료 조건
- 위반이 뜨고 대체 표현이 함께 보인다
- 스포크가 501 이면 「탐지 없음」이 아니라 「탐지 미동작」으로 보인다 — 조용히 초록색이 되지 않는다
- 위험도 점수·「안전합니다」류 표현이 UI 어디에도 없다
보드 최신화 (2026-09-21, 정성윤 — 사용자 지시로 전체 보드를 한 번에 맞췄다). 상태는 그대로
todo. 선행 조건은 다 풀렸다 — 컴플라이언스 규칙 v1(w6-compliance-spoke) · 콜 미디에이터0.2.1이 상담원 발화마다/hub/compliance-checks를 부르고compliance_flag로 저장한다(09-18, 09-20 운영 저장 확인). 프론트에 없는 것은compliance메시지 파서다 — 지금 화면의 경고는 프론트 로컬 규칙이 만든다. 파서가 들어가면 정성윤이 미디에이터의announceCompliance를 켠다(지금 false). 순서가 있다 — 파서 먼저, 방송 나중. 거꾸로면 읽지 못한 메시지가 온다.
라벨 표시 기준 (2026-09-22, 류준 — 본문 메모만, status 는 건드리지 않았다). 화면에 갈래 이름을 붙일 때는
_project/decisions/211을 따른다 — C-4 = 「의학적 안심 발언」(근거 없는 안전 보장) 이고, 「대체 표현」은 C-1~C-4 모든 경고에 붙는alternative_source다(갈래가 아니다).
2026-09-23 — 파서 연결 (조서희, w6-warning-badge-direction과 같은 뿌리라 같이 고쳤다)
실서버 파서가 정말 없었다. useCallMediatorSession.ts의 onCompliance가 callStore.applyCompliance로
연결은 돼 있었지만(그래서 state.compliance에 서버 findings가 쌓이긴 했다), 그 값을 읽는
컴포넌트가 코드베이스 어디에도 없었다. 화면에 실제로 뜨던 배너는 detectComplianceRisk
(“불법체류” 한 단어만 잡는 자리표시자)였다 — 그래서 실제 위반 문장은 하나도 안 걸렸다.
TranscriptPanel.tsx를 고쳤다 — 실서버 모드(isCoreApiConfigured())에서는 상담원 발화 줄에
state.compliance[segment_id]를 그대로 ComplianceWarningBanner로 그린다(대체 표현은
alternative_source.title, 없으면 “권장 대체 표현이 등록되지 않았습니다”). mock 모드는
기존 자리표시자를 그대로 쓴다(서버가 mock엔 이 신호를 안 보낸다).
완료 조건 1번은 코드로는 됐지만 운영 검증이 없다 — 서버의 컴플라이언스 규칙이 QA가
지적한 문장(“무조건 공제됩니다” 등)을 실제로 findings로 잡아 주는지는 server/·ai/ 쪽
규칙 완성도에 달려 있고, 이번 변경은 프론트가 그 findings를 받으면 그린다는 것만
보장한다. 완료 조건 2번(탐지 미동작 표시)은 손대지 않았다 — complianceUnavailable도
스토어엔 있지만 여전히 화면에 안 그려진다. 빌드·타입체크만 통과, 운영 재확인 없음
— status는 in-progress로 둔다.
2026-09-28 — 완료 조건 2 (탐지 미동작 표시)
ComplianceUnavailableNotice추가 — 실서버·실시간 모드에서compliance_unavailable이 온 상담원 발화 줄에 회색 「탐지 미동작 · 이 발화는 컴플라이언스 검사를 하지 못했습니다」. 상태 코드(501등)는 서버 내부 정보라 안 낸다.- 렌더·스토어 테스트:
apps/call/test/p1Screens.test.tsx. - 운영에서 스포크가 실제로 죽은 상태를 눈으로 본 적은 없다 — 조건 1 의 운영 검증과 함께 남는다.
in-progress유지.
2026-09-30 — 운영 확인 · done (정성윤)
정성윤이 넘겨받았다(decisions/137 — 마감까지 apps/ 도 정성윤이 고친다. §4 대로 assignee 를 옮기고 여기 적는다). 수동 QA 2회차(_logs/2026-09-30-01-seongyun, 운영 server 0.1.43 · call-mediator 0.2.11 · call index-sR-v0E8Y) Q-31~Q-33 ✅ — 상담원 줄 셋(「무조건」 1.4 · 「위임장까지는 없어도」 3.1 · 「주민등록번호 열세 자리」 1.2)에 경고와 근거 조항이 붙었고 Q-34 ✅ 과탐지 없음.
- 조건 1 ✅. 「대체 표현」 자리에 서버가 조항 ID(
alternative_source.title)를 보내는 통화가 있어 머리말을 값에 맞춰 「근거 조항」/「권장 표현」 으로 가른다(complianceLabel, 09-30 수정 — 배포 전). - 조건 2 — 「탐지 미동작」 표시는 09-28 코드·테스트(
p1Screens.test.tsx)로 고정돼 있다. 운영에서 스포크를 일부러 죽여 보지는 않았다 — 죽이면 진짜 통화의 검사가 빠지므로 안 한다. - 조건 3 ✅ — 위험도·「안전합니다」류 문자열은
apps/call/src에 없다(test/qaRound2Fixes.test.tsx가 콜가드 문구까지 본다).