전체 조립 수동 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·콜 미디에이터·상담원 화면·관리자 화면을 한 번에 붙여 놓고, 사람이 직접 화면의 버튼을 하나씩 누르고 데이터를 손으로 넣어서 되는지 안 되는지를 표로 남긴다.
왜 — 지금 이게 병목이다
- 지금까지 한 검사는 전부 API 왕복이다. 합성 통화 E2E(
e2e_check.py)는 DB·API 응답을 대조할 뿐, 화면에 실제로 무엇이 보이는지는 보지 않는다. 서버 pytest 1,301건도 마찬가지다. - 「배포됐는데 화면에선 안 되는」 사고가 이미 났다 — 09-14 관리자 로그인은
/health가ok인데 화면에서 막혀 있었다. 눌러 보기 전에는 모른다(시연 리허설). - 세 사람(서버·AI·프론트)이 각자 자기 몫을 끝냈다고 보고 있지만, 붙였을 때 되는지는 아무도 확인하지 않았다. 이 확인이 끝나야 각자 다음 작업으로 넘어갈 수 있다 — 지금은 셋 다 여기서 멈춰 있다.
- 코드를 읽어 보면 이미 이상한 곳이 보인다. 상담원 마이크 박스는 인식한 글자를 화면에 그리지 않고,
토큰이 없거나 브라우저가 지원하지 않으면 안내 없이 모달만 닫힌다(
apps/call/src/lib/useAgentCallSession.ts). 이런 것은 사람이 눌러야 드러난다.
규칙 — 이 티켓을 하는 방법
- 직접 누른다. Claude 나 스크립트에 맡기지 않는다. 이 티켓이 확인하려는 것은 사람이 화면을 쓸 수 있느냐다.
재생기(
replay_persona_call.ts)는 발화를 넣는 데만 써도 된다. 판정은 눈으로 한다. - 운영 주소로 한다. 로컬 mock 으로 한 결과는 인정하지 않는다.
- 항목마다 ✅ 됨 / ❌ 안 됨 / ⚠ 되긴 하는데 이상함 / — 해당 없음(mock) 중 하나를 적는다. ❌·⚠ 는 스크린샷 + 브라우저 콘솔·네트워크 탭 캡처를 남긴다.
- 찾기만 하고 고치지 않는다. ❌ 가 나오면 담당자에게 넘긴다 — 서버
server/장민석 · AIai/류준 · 화면apps/조서희 · 배포·토큰·주소 문제는 본인. 넘길 때는 QA 번호(아래Q-xx) · 누른 순서 · 기대한 것 · 실제로 본 것을 적는다. 고치면서 가면 QA 가 끝나지 않는다. - 진행은 하루 단위로 끊는다. 그날 한 범위와 ❌ 목록을
_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 — 눌러 보고 「—」로만 적는다 (❌ 로 넘기지 않는다)
코드상 아직 서버에 붙지 않은 것들이다. 되는 척 보이는지만 본다 — 화면이 「관리자에게 전송됨」처럼 거짓말을 하면 ⚠ 로 적는다.
- 상담원: 「비밀번호 재설정」·「설정 완료」(저장 안 함) · 「블랙컨슈머로 분류」 · 고객 위험 배너의 「관리자에게 전송됨」 · 지역자원 「연결하기」 · 대기화면 KPI 그래프(「디자인 목업」)
- 관리자: 「QA 리뷰」 탭(고정 데이터) · 설정 「승인 후 (개월) 뒤 자동 만료」(저장 안 함) · 현황판 안내문의 「mock 시드 값」 문구(실제로는 실서버 값 — 문구가 낡았다)
- 화면 자체가 없는 것: 상담원 「내 요청」(API
GET /hub/blacklist-requests/mine만 있다) · 요약 수정 이력 · 만료 변경 이력
완료 조건
- 위
Q-00a~Q-69모든 칸에 ✅ / ❌ / ⚠ / — 중 하나가 있다. 빈 칸이 있으면 끝난 것이 아니다 — 1회차(09-22) · 2회차(09-30) - ❌·⚠ 마다 스크린샷과 담당자가 있고, 담당자 쪽에 티켓 또는 미결 항목 이 생겼다 — 2회차 새 ❌ 둘(Q-29 · Q-55)은 미결 「2026-09-30 — 수동 QA 2회차」에 조서희 몫으로
- 결과표를
_logs/에 남겼다(하루 단위로 끊어도 된다) —2026-09-22-18·2026-09-30-01 - ❌ 가 고쳐진 뒤 그 번호만 다시 눌러 ✅ 로 바꿨다 — 고쳤다는 보고만으로 ✅ 를 주지 않는다 — 09-30 2회차: Q-31~33 · Q-43 · Q-44 · Q-47 · Q-48 전부 ✅
- 마지막에 3장 → 5장 → 6장을 한 번에 끊김 없이 돌렸다. 이게 되면 시연 리허설로 넘어갈 수 있다 — 1회차
test-qa-final
2026-09-22 — 1회차 결과 (정성윤)
- 결과표는 진행 기록
2026-09-22-18-seongyun— Q-00a~Q-69 모든 칸이 채워졌다. ❌ 7 · ⚠ 14. - 완료 조건 1·2·3·5 는 채웠다: 모든 칸 · ❌·⚠ 마다 티켓 또는 미결 · 결과표를
_logs/에 · 3장 → 5장 → 6장 한 번에 끊김 없이(test-qa-final). - 남은 것은 완료 조건 4 하나 — ❌ 가 고쳐진 뒤 그 번호만 다시 눌러 ✅. 그래서
in-progress다. 게이트에 걸린 티켓 다섯은 이 조건이 끝날 때까지 그대로 기다린다(decisions/319). - 3장 발화는 스크립트로 넣었다(규칙 1 — 넣기만, 판정은 눈으로). 이 PC 에서 두 탭 음성 인식이 서로 끊었다. 마이크 경로는 Q-48 로 따로 봤고 ❌ 였다.
2026-09-22 (밤) — ❌ 재확인 1건
- (데이터) 재연결 전사 덮어쓰기 → ✅ —
w6-segment-id-reuse배포 뒤 운영test-qa-reuse에서 같은 순서로 7건 · 1번 보존(진행 기록2026-09-22-27-seongyun). 남은 ❌ 5(Q-31~33 · Q-43 · Q-47 · Q-48 — 조서희 · Q-44 — 류준) · 개발 페이지 Origin 은 PR #136 으로 main 에 들어가 해소.
2026-09-30 — 2회차 결과 · 게이트 통과 (정성윤)
- 결과표는 진행 기록
2026-09-30-01-seongyun— Q-00a~Q-69 전부 채움. ❌ 2 · ⚠ 4. 운영 server0.1.43· call-mediator0.2.11. - 완료 조건 4 를 채웠다 — 1회차 ❌ 다섯(Q-31~33 · Q-43 · Q-44 · Q-47 · Q-48)을 그 번호만 다시 눌러 전부 ✅. 이것으로
decisions/319의 조건 다섯이 다 찼고depends_on으로 묶인 티켓(w7-latency-budget·w7-demo-infra-readiness·w7-infra-loose-ends·w8-demo-rehearsal)을 시작할 수 있다. - 새 ❌ 둘 — Q-29(실서버 모드에선 「상담원 보호 알림」 배너가 원천적으로 안 뜨고, 위협 발화에 「안내는 이어가시면 됩니다」) · Q-55(「새 통화 시작」이 실서버 모드에서 no-op). 둘 다
apps/(조서희) — 미결에 적었다. 게이트 조건은 「1회차 ❌ 재시험」이라 이 둘은 게이트를 막지 않는다. - 이 PC 에서 개발 페이지 음성 인식이 결과 0건이라 발화는 스크립트로 넣었다(규칙 1). 마이크 경로는 Q-48(토큰 없음 안내)로 봤다.