수동 QA 화면 결함 묶음 — 대기화면 확인창 · 마이크 실패 안내 · 보호 배너 · 통화받기 창 · 문구
정성윤이 09-22 수동 QA(
w5-manual-qa-full-stack) 결과로 만든 티켓이다. 담당은 «제안»이다. 따로 티켓이 있는 것(경고 방향 · 카드 짝짓기 · 컴플라이언스 경고 · 읽기 인증)은 뺐다.
운영 주소 · 09-22 새 번들(call index-4X0vR1JI · admin index-BVF9FZhk)에서 본 것. 번호는 QA 티켓의 번호다.
❌ — 시연 전에
- Q-47 「대기화면」이 통화 중에도 확인창 없이 바로 나간다 — 코드를 열어 보니 이미 고쳐져 있었다.
StandbyBackButton.tsx가 정확히 요구된 그대로다:liveInProgress면ConfirmDialog(제목 “대기화면으로 이동” · 취소 “취소”)를 먼저 띄운다. 코드 변경 없음. - Q-48 토큰 없이 「통화받기」 → 안내 없이 창만 닫힌다 — 고쳤다.
useAgentCallSession.ts의start()가no-token·unsupported일 때도 이제errorMessage를 채운다(마이크 거부·WS 거절은 이미 채우고 있었다).App.tsx에 별도 배너(agentCall.errorMessage)를 추가해 —AgentCallBox가 사라져도 안내는 남는다(2026-09-16 결정: 팝업이 로컬 테스트를 막으면 안 된다 — 그 결정은 안 건드렸다, 안내를 배너로 분리했을 뿐). - (화면) 실서버 모드의 「고객과 전화하기」 창이 통화받기를 눌러야만 닫힌다 — 고쳤다.
AgentCallBox.tsx에 ① 「닫기」(✕) 버튼 ② 자막이 이미 들어오기 시작하면(utterances.length > 0) 스스로 사라지는 로직을 추가했다.
⚠ — 되도록
- Q-29·Q-45 「상담원 보호 알림」 배너가 안 뜬다 — 못 고쳤다.
CustomerRiskBanner(그 라벨을 가진 컴포넌트)는 로컬 정규식 탐지(detectCustomerRisk)에서만 나오는데, 실서버 모드에선 그 탐지 자체를 안 돈다(isCoreApiConfigured()분기). 실서버가 주는CallGuardFlag엔matchedText가 없어(segment_id·category뿐)CustomerRiskBanner가 요구하는 인용문을 채울 수 없다 — 배너를 다시 설계하거나 서버가 매칭 텍스트를 보내야 한다. 줄 안 「🚫 콜가드」/「🆘 위기 신호」 핀이 지금 실서버 모드의 유일한 신호다 —w6-qa-ui-defects-three에서 위기 신호가 안 덮이도록·여러 건이 다 보이도록 고쳤다(그게 이 항목이 기댈 수 있는 개선의 전부다) - Q-54 「블랙컨슈머로 분류」mock이 “관리자에게 전송됨” —
w6-qa-ui-defects-three에서 “관리자 알림 연동 전”으로 이미 고쳤다 - Q-11
cga_wrong로그인 오류가 반말(「…받아라」) — ✅ 2026-09-23 정성윤이 서버에서 고쳤다. 이 문구는apps/가 아니라 서버가 보내는 것이고 화면은 응답의detail을 그대로 띄운다(coreClient.ts:80-85) — 서희 님 확인이 맞았다.server/apps/agent_auth/.../agent_guard.py등 9곳 - Q-04 관리자 토큰 목록의 상담원 이름이
Q****1·최*원으로 가려진다 — 의도다. 2026-09-22 오전 세션(jekyll/_logs/2026-09-22-01-seohee.md)에서 조서희가 직접 넣었다. 서버 응답은 그대로고 화면만 가린다. - [~] Q-63 「변경 이력 보기」를 펼치면 줄이 찌그러진다 · 재설정이 “등록일부터” 세어진다 — 절반만. 코드를 보니 실제로는 “등록일부터”가 아니라 “지금부터”(설계 그대로,
extendEntry주석에 이미 명시)였는데, 입력칸이 전역 기본값(예: 6개월)으로 항상 채워져 있어 안 건드리고 눌러도 만료일이 조용히 바뀌는 게 진짜 문제였다 — 입력칸 옆에 “→ (결과 날짜)로” 미리보기를 추가해 누르기 전에 결과를 보게 했다. 레이아웃 찌그러짐(CSS)은 못 고쳤다 — 로컬에 브라우저가 없어 렌더된 모습을 확인할 방법이 없다. -
[~] (후속조치) 저장본에 제목만 있는 빈 항목 — 프론트가 보내는 쪽(
collectFollowUps())은 이미 빈 줄을 걸러서 보낸다(.filter(line => line.length > 0)). 그런데도 빈 항목이 보였다면 서버 저장 쪽 문제일 수 있는데, 거긴 확인할 방법이 없다. - (시연) 화면이 통화를 받기 전에 재생이 끝나면 그 통화는 화면에서 종료할 수 없다 — 손 안 댔다. 코드 결함이라기보다 리허설 운영 절차(누가 언제 화면을 여는지) 결정이 먼저 필요해 보여 미결로 남긴다.
완료 조건
- [~] 위 항목마다 고치거나 「의도」 한 줄 — 9개 중 6개 확정(고침 3 · 이미 됨/의도 3), 1개 절반, 2개(보호 알림 배너 재설계·시연 절차)는 결정이 더 필요해 미룸
- ❌ 셋은 운영에서 그 번호만 다시 눌러 ✅ (QA 티켓 완료 조건 4) — 로컬에 붙는 서버·브라우저가 없어 못 했다
근거: 진행 기록 2026-09-22-18-seongyun 결과표.
2026-09-23 — 구현 (조서희)
검증: apps/call(tsc --noEmit·vite build·npm test 11/11), apps/admin(tsc --noEmit·vite build) 통과.
status는 done이 아니라 in-progress로 둔다 — 운영 재확인이 하나도 없고, 두 항목(보호 알림 배너·시연 절차)은 코드 변경이 아니라 설계 결정이 먼저 필요하다.
2026-09-28 — 콜가드 걸린 표현 · 반말 문구 (조서희)
- 콜가드 배너에 걸린 표현 — 서버(
call_guard_dto.py)는phrase(마스킹된 자막에서 자른 값)를 보내는데 파서가 버리고 있었다.realCallMediatorClient.ts파서가phrase를 읽고(선택 필드 — 없거나 비면 안 싣는다)CallGuardFlag.phrase?에 담는다. 실서버 모드의 콜가드 줄에 「🚫 콜가드 「표현」 안내…」로 보인다. 점수·위험도는 없다. 테스트apps/call/test/callGuardPhrase.test.tsx. - 반말 문구 셋 —
useAgentCallSession.ts: 「주소가 설정되지 않았다」·「마이크 권한이 거부됐다」·「연결이 끊겼다」 → 존댓말. 마이크 거부에는 허용 방법 한 줄을 덧붙였다. - 운영에서 폭언 발화로 표현이 실제로 뜨는지는 아직 눈으로 보지 않았다.
2026-09-30 — 2회차 결과와 마지막 둘 (정성윤) · 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) 에서 1회차 ❌ 는 전부 ✅ 가 됐다(Q-47 대기화면 확인창 · Q-48 통화받기 창 · 문구). 남아 있던 셋 —
- Q-29·Q-45 보호 배너 — 고쳤다(배포 전). 실서버 콜가드 행이 이제 갈래별 문구(
CALL_GUARD_COPY: insult 5.1 · threat/sexual 5.2 「1차 안내 뒤 곧바로 종료 가능」 · distress 5.4)와 「🚫 상담원 보호 알림」 핀을 달고, ✕ 로 닫힌다. 서버phrase가 있으면 걸린 표현도 그대로. 2회차 ❌ Q-29 의 사유(위협에 「안내는 이어가라」)가 이것이다.CustomerRiskBanner를 실서버에 다시 켜지는 않았다 — mock 감지기용 컴포넌트라 서버 결과와 모양이 다르고, 행 하나로 충분하다. - (시연) 화면이 받기 전 재생이 끝난 통화 — 운영 절차 문제라
w8-demo-rehearsal로 넘긴다(리허설 순서: 화면을 먼저 연다). - 조건 4 — 1회차 ❌ 는 2회차에서 ✅. Q-29 의 재확인은 이 수정이 배포된 뒤 리허설에서 한 번 더 본다.