전체 조립 수동 QA — 백엔드·AI·프론트를 붙여 놓고 버튼을 하나씩 직접 눌러 본다

🔴 프로젝트 게이트 — 통과하기 전에는 다음 단계로 가지 않는다 (decisions/319)

이 티켓은 프로젝트 진행 조건이다. 누구 한 사람이 부탁한 일이 아니다. 전체를 붙여 놓고 화면에서 되는지를 확인해야 다음 단계의 전제가 선다. 완료 조건을 전부 채우기 전에는 아래 티켓을 시작하지 않는다. 전부 front matter 에 depends_on: w5-manual-qa-full-stack 이 달려 있다.

막히는 티켓 담당 비고
w7-latency-budget 정성윤 진행 중이던 것도 멈춘다
w6-deploy-schema-precheck 정성윤  
w7-demo-infra-readiness 정성윤  
w7-infra-loose-ends 정성윤  
w8-demo-rehearsal 조서희 시연 단계 전체가 이 뒤다

Claude 에게 시키지 않는다 — 본인이 직접 브라우저를 열고 누른다. Claude 는 이 티켓의 판정을 대신할 수 없다: 화면을 보지 못하고, 지금까지 Claude 가 돌린 검사가 전부 API 왕복이었기 때문에 이 티켓이 생겼다. Claude 에게 도움을 받아도 되는 것은 토큰 찾기 · 주소 확인 · ❌ 를 담당자에게 넘길 글 정리까지다. 결과 칸의 ✅ / ❌ 는 본인이 직접 본 것만 적는다.

무엇을

운영 주소에 떠 있는 서버·AI·콜 미디에이터·상담원 화면·관리자 화면을 한 번에 붙여 놓고, 사람이 직접 화면의 버튼을 하나씩 누르고 데이터를 손으로 넣어서 되는지 안 되는지를 표로 남긴다.

왜 — 지금 이게 병목이다

규칙 — 이 티켓을 하는 방법

  1. 직접 누른다. Claude 나 스크립트에 맡기지 않는다. 이 티켓이 확인하려는 것은 사람이 화면을 쓸 수 있느냐다. 재생기(replay_persona_call.ts)는 발화를 넣는 데만 써도 된다. 판정은 눈으로 한다.
  2. 운영 주소로 한다. 로컬 mock 으로 한 결과는 인정하지 않는다.
  3. 항목마다 ✅ 됨 / ❌ 안 됨 / ⚠ 되긴 하는데 이상함 / — 해당 없음(mock) 중 하나를 적는다. ❌·⚠ 는 스크린샷 + 브라우저 콘솔·네트워크 탭 캡처를 남긴다.
  4. 찾기만 하고 고치지 않는다. ❌ 가 나오면 담당자에게 넘긴다 — 서버 server/ 장민석 · AI ai/ 류준 · 화면 apps/ 조서희 · 배포·토큰·주소 문제는 본인. 넘길 때는 QA 번호(아래 Q-xx) · 누른 순서 · 기대한 것 · 실제로 본 것을 적는다. 고치면서 가면 QA 가 끝나지 않는다.
  5. 진행은 하루 단위로 끊는다. 그날 한 범위와 ❌ 목록을 _logs/ 에 남긴다 — 다 끝낼 때까지 기다리지 않는다. 먼저 나온 ❌ 부터 담당자가 고치기 시작할 수 있다.

0. 준비 (본인 몫 — 인프라)

# 할 일 결과
Q-00a https://server.solidbob.cloud/health · /health/ready · /call-mediator/health 세 개가 다 정상인지. /health 의 spokes 에 pii_ner·retrieval_dense 가 있는지  
Q-00b 관리자 구글 계정이 허용 목록에 있는지(admin.solidbob.cloud 로 로그인 가능). *.vercel.app 주소로 열면 안 된다 — 「승인되지 않은 원본」이 뜬다  
Q-00c 콜 미디에이터 입력(INGEST) 토큰을 손에 쥔다 — 개발 페이지와 상담원 마이크가 둘 다 쓴다  
Q-00d call.solidbob.cloud 가 실서버 모드인지 확인한다. 헤더에 REST 배지가 있고 로그인 화면(토큰 입력)이 떠야 실서버다. 로그인 없이 바로 들어가지면 mock 번들이다 — 그 자체가 ❌ 이고 조서희 님께 Vercel 환경변수(VITE_CORE_API_URL · VITE_CALL_MEDIATOR_WS_URL · VITE_CALL_MEDIATOR_DEMO_BASE_URL)를 확인받는다  
Q-00e 크롬 창 두 개(또는 PC 두 대)를 준비한다 — 한쪽은 상담원, 한쪽은 고객이다. 같은 통화 ID(test-qa-01 처럼 test- 로 시작)를 양쪽에 쓴다  

1. 관리자 — 로그인 · 상담원 토큰 발급

https://admin.solidbob.cloud

# 누를 것 기대 결과 결과
Q-01 구글 「Sign in with」 현황판이 뜬다. 403 이면 허용 목록 문제  
Q-02 사이드바 탭 7개(현황판 · 승인요청 · 블랙리스트 · QA 리뷰 · 지식베이스 갭 · 감사 로그 · 설정)를 하나씩 탭마다 오류 없이 열린다. 「다시 시도」 버튼이 뜨면 ❌  
Q-03 설정 → 「상담원 이름」에 QA상담원1 → 「발급」 cga_ 로 시작하는 토큰이 한 번만 보인다 → 「복사」  
Q-04 같은 화면 토큰 목록 방금 만든 토큰이 목록에 있다  
Q-05 5분 이상 가만히 둔 뒤 탭 이동 로그인이 풀리는지 기록한다(access 5분 · refresh 10분이 테스트 값이다 — w7-demo-infra-readiness 3번)  

2. 상담원 — 로그인 · 대기화면

https://call.solidbob.cloud

# 누를 것 기대 결과 결과
Q-10 빈 칸으로 「로그인」 「토큰을 입력해 주세요.」  
Q-11 틀린 토큰(cga_wrong)으로 「로그인」 로그인되지 않고 오류가 보인다  
Q-12 Q-03 토큰으로 「로그인」 대기화면. 아바타에 QA상담원1 첫 글자  
Q-13 새로고침 로그인이 유지된다  
Q-14 「최근 상담기록」 지난 통화 목록이 뜬다(비어 있어도 오류는 아니다)  
Q-15 아바타 → 「로그아웃」 → 다시 로그인 로그인 화면으로 갔다가 다시 들어온다  

3. 통화 — 손으로 발화를 넣는다

상담원 창: https://call.solidbob.cloud/?call_id=test-qa-01&call_token=<INGEST 토큰> → 「통화 시작」 → 「고객과 전화하기」의 「통화받기」 → 마이크로 상담원 대사를 말한다. 고객 창: https://server.solidbob.cloud/call-mediator/dev → 「콜 미디에이터 입력 토큰」 · 화자 고객 · 통화 ID test-qa-01 → 「통화 시작」 → 고객 대사를 넣는다.

아래 문장을 그대로 넣는다. 개인정보는 전부 가짜다.

# 누가 넣을 문장 상담원 화면에서 봐야 하는 것 결과
Q-20 상담원 「안녕하세요 다산콜센터입니다」 자막에 상담원으로 뜬다. 헤더 「연결됨」  
Q-21 고객 「주민등록초본을 떼려고 하는데 뭐가 필요해요?」 자막에 고객으로 뜬다. 우측 「필요서류」에 초본 서류(신분증 등) 카드  
Q-22 고객 「제 번호는 010-1234-5678이에요」 번호가 * 로 가려진다(P4). 원번호가 화면 어디에도 없다  
Q-23 고객 「주민번호는 900101-1234567입니다」 가려진다(P1)  
Q-24 고객 「카드번호는 1234 5678 9012 3456이요」 가려진다(P2)  
Q-25 고객 「계좌는 110-123-456789예요」 가려진다(P3)  
Q-26 고객 「인증번호 482913 불러드릴게요」 가려진다(P5)  
Q-27 고객 「제 이름은 홍길동이고요 주소는 서울시 중구 세종대로 110 3층이에요」 이름(P6) · 상세주소(P7)가 가려진다. 이름 조각이 남으면 ❌(예: *** *동)  
Q-28 고객 「공일공 일이삼사 오육칠팔」(한글로 읽은 번호) 번호로 알아보고 가린다  
Q-29 고객 「이 멍청한 놈이 말귀를 못 알아듣네」 「🚫 콜가드」 행 + 「상담원 보호 알림」 배너  
Q-30 고객 「거기 찾아가서 가만 안 둔다 진짜」 콜가드(위협)  
Q-31 상담원 「지금 신청하시면 무조건 공제됩니다」 「경고」 배너 + 「권장 표현」(C-1)  
Q-32 상담원 「가족이니까 위임장까지는 없어도 되실 거예요」 경고(C-3)  
Q-33 상담원 「주민등록번호 열세 자리 전부 불러 주세요」 경고(C-2)  
Q-34 고객 「서류 준비해서 오늘 안에 다 끝내고 싶어서요」 아무 경고도 뜨지 않아야 한다(과탐지 확인)  

SYN-009 같은 위기 발화(「다 끝내고 싶어요」)는 발표장에서 틀지 않는다. QA 에서는 한 번 넣어 「🆘 위기 신호」가 뜨는지만 본다.

4. 통화 중 버튼

# 누를 것 기대 결과 결과
Q-40 「자막 검색」에 서류 → Enter · Shift+Enter · Esc 하이라이트 · 이동 · 지움  
Q-41 필요서류 카드 「사용 표시」 저장된다. 「카드 채택 표시를 저장하지 못했다」가 뜨면 ❌(09-22 까지 운영에서 401 이었다)  
Q-42 누락 서류 0개인 카드 「안내 완료로 표시」 표시가 바뀐다(서버에 저장되지 않는 것은 알려진 사항 — 새로고침 후 사라져도 ⚠ 로만 적는다)  
Q-43 하단 책갈피 탭 해당 카드로 스크롤  
Q-44 「관련 문서를 못 찾으셨나요?」 → 전입신고 → 「검색」 「결과 N건을 아래에 추가했어요.」. 없는 말(ㅁㄴㅇㄹ)은 「관련 문서 없음」  
Q-45 콜가드 배너 「알림 닫기」 · 경고 배너 「경고 닫기」 닫힌다  
Q-46 「최신 대화로 이동」 맨 아래로  
Q-47 「대기화면」 확인창 「대기화면으로 이동」 → 「취소」면 남는다  
Q-48 마이크를 거부한 상태 / 토큰 없이(call_token 빼고) 「통화받기」 안내 문구가 떠야 한다. 조용히 모달만 닫히면 ❌(코드상 지금 그렇게 보인다)  

5. 통화 종료 · 통화 후 처리

# 누를 것 기대 결과 결과
Q-50 「통화 종료」 「통화 후 처리」 화면. 요약 초안이 있다  
Q-51 「요약」 고치고 「요약 확정」 「…에 확정했습니다.」  
Q-52 한 번 더 「요약 확정」 막힌다(409) — 화면이 어떻게 알려 주는지 적는다  
Q-53 「재수정」 → 사유 비우고 → 사유 넣고 「재수정 확정」 사유 없으면 막히고, 넣으면 저장된다  
Q-54 「블랙리스트 전환 요청」 → 「요청 사유」 입력 → 「요청 보내기」 「이 통화의 전환 요청이 접수됐습니다 — 관리자 승인 대기 중입니다.」  
Q-55 「새 통화 시작」 대기 또는 새 통화로  
Q-56 대기화면 「최근 상담기록」 → 방금 통화 자막 · 요약이 다시 보인다. Q-22~Q-28 의 원문 개인정보가 한 글자도 없다(SEC-1) — 가장 중요한 항목  

6. 관리자 — 상담원이 보낸 것을 처리한다

# 누를 것 기대 결과 결과
Q-60 알림 종 · 「승인요청」 탭 Q-54 요청이 있다. 배지 숫자가 1 늘었다  
Q-61 사유 비우고 「반려」 「반려에는 사유가 필요합니다…」  
Q-62 (통화를 하나 더 해서 요청을 두 개 만든 뒤) 하나는 사유 넣고 「반려」, 하나는 기간 넣고 「승인」 각각 처리된다. 409 가 나면 ❌(w6-admin-agent-mapping)  
Q-63 「블랙리스트」 탭 → 승인한 항목 → 사유 + 기간 → 「재설정」 기간이 바뀐다. 사유 없으면 버튼이 꺼져 있다  
Q-64 같은 항목 「해제」 「해제된 기록」으로 간다  
Q-65 「현황판」 타일 4개 방금 한 통화 · 콜가드 · 요청 수가 반영된다. 온도 이상이 미측정인데 「0건」으로 보이면 ⚠(알려진 사항)  
Q-66 「지식베이스 갭」 → 「해제」 → 「다시 열기」 상태가 오간다  
Q-67 「감사 로그」 Q-62~Q-64 이력이 보인다  
Q-68 「설정」 → 근속 연차 값 변경 → 새로고침 값이 유지된다(서버 저장)  
Q-69 「설정」 → Q-03 토큰 「폐기」 → 상담원 창 새로고침 상담원이 로그인에서 튕겨야 한다. 계속 쓰이면 ❌  

7. 알려진 mock — 눌러 보고 「—」로만 적는다 (❌ 로 넘기지 않는다)

코드상 아직 서버에 붙지 않은 것들이다. 되는 척 보이는지만 본다 — 화면이 「관리자에게 전송됨」처럼 거짓말을 하면 ⚠ 로 적는다.

완료 조건

2026-09-22 — 1회차 결과 (정성윤)

2026-09-22 (밤) — ❌ 재확인 1건

2026-09-30 — 2회차 결과 · 게이트 통과 (정성윤)