미결 항목

예상 리스크

리스크 대응
AI Hub 승인 지연 1주차 즉시 신청. 4.2절 오류 내성 실험은 텍스트 레벨 오류 주입이므로 승인과 무관하게 진행 가능
화자 분리 정확도 미달 [V1] 모노 확인됨. diarization 필수, 데모는 물리 2채널(브라우저 2대)로 우회
류준 부하 집중 (백엔드+AI 동시 담당) (해소됨, 2026-08-26) 7.2절 팀 개편(장민석이 백엔드·AI 합류)으로 구조적으로 해소. C-5·CI 운영은 정성윤에게 둔 기존 조치는 유지, F-2는 여전히 조건부
GPU 미확보 [V2] 확인됨 — Apple M5, CUDA 없음. polyglot-ko-1.3b 등 소형 모델 MPS로 대응, 4개 오픈소스 모델 다운로드 완료
외국인 화자 한국어 음성 데이터 0건 (신규 2026-08-28) 대응 미정 — A-3 최대 리스크. AI Hub 다산 데이터는 전부 내국인 발화다. 출처를 못 찾으면 A-3 의 STT 정확도를 측정할 방법이 없다(절대 원칙 10 — 측정할 수 없는 것을 측정한 것처럼 쓰지 않는다)
A-3 번역 품질 채점 방법 미정 (2026-08-28 1차 범위에서는 해소) ⓑ 로 좁히면서 1차 지표가 번역 품질이 아니라 STT 정확도(WER/CER) 가 됐다. WER 은 규칙 기반이라 절대 원칙 1 과 충돌하지 않는다. 번역 채점 문제는 ⓐ 확장 시점으로 미뤄진 것이지 풀린 것이 아니다
골든셋 13건 — 지표 신뢰 불가 (신규 2026-08-28) 도메인 축소로 50 → 13건. 다산 기준 재확장 전까지 Recall@5·MRR 을 문서에 기록하지 않는다
A-5 통번역 지연 예산 미계산 (신규 2026-08-28) ⓑ 1차 범위에는 번역 경로가 없어 STT 지연만 얹힌다. 번역+TTS 왕복은 ⓐ 확장 시점의 문제다. 기획서 4.3절에 항목만 열어 두고 목표치는 비워 뒀다(절대 원칙 2)
범위 과다 (F·G·H·I) 코어(A~E, C-5)만 절대 사수, 나머지는 6주차 기준선 통과 시에만 조건부 착수
깃허브 저장소·데모 도메인 아직 미배포 (해소됨, 2026-08-28) 원격은 github.com/SeongYuna/call.solidbob.cloud로 연결 완료. 데모 도메인 연결은 Sprint 7 로 미뤄 뒀으나, 미룬 탓에 배포 사이트의 본문 링크가 전부 404 라 2주차로 앞당겼다(프로젝트 페이지의 /call.solidbob.cloud/ 한 겹과 루트 절대경로 링크 405곳이 어긋난다). _project/decisions/102 · w2-custom-domain

2026-08-28 해소 — 트리거 허용 창을 1,500ms 로 확정했다(_project/decisions/202). 새 결정이 아니라 2026-08-25 팀 확정의 누락된 반영이다. 코드·사이트는 그때부터 1,500ms 였고 _project/plan.md 만 800ms 로 남아 있었는데, 그 사실이 어디에도 적혀 있지 않아 3일간 같은 질문이 네 번 올라왔다. 팀 컨펌을 로그에만 적고 결정 기록으로 올리지 않은 것이 원인이다.

정하지 못한 것 (2주차로 넘어감)

골든셋 50건 — 비율은 정해졌고, 측정 방법 두 가지가 남았다

⚠ 2026-08-28 무효. 도메인이 다산 하나가 되면서(decisions/201) 아래 배분 전체가 의미를 잃었다. 골든셋은 50 → 13건이 됐고, F-2 케이스는 0건이다(다산에 종결 유형이 없다). P1~P7 커버리지도 다시 확인해야 한다 — 아래에서 큰 소득이라 적은 그 커버리지가 삭제된 37건에 실려 있었을 수 있다. 재확장 계획은 부록 C 9번 항목.

배분은 확정됐다(F-2 가중: 금융보험 18 · 쇼핑 16 · 다산콜센터 9 · 질병관리본부 7). 근거는 w2-golden-set-50에 기록돼 있다. P1~P7 개인정보 패턴이 전부 커버된 것이 큰 소득이다 — 1주차 10건에는 P3·P5·P6·P7 이 아예 없어 C-5 “누락 0건” 절대 규칙을 4개 패턴에 대해 측정할 방법 자체가 없었다.

남은 것은 이 표본으로 지표를 어떻게 읽을 것인가다. 둘 다 숫자로 판단할 수 있다.

  1. B-0 도메인 분류 정확도(≥0.95)의 기저율이 올라간다. 도메인이 18/16/9/7 로 기울어 다수 도메인으로 찍기만 해도 36% 가 나온다(균등이면 25%). 6.1절이 이 지표를 “도메인 내 검색 지표보다 엄격”하게 잡은 취지가 흐려진다 → 균형 부분집합으로 따로 재거나, 다수 클래스 기저율을 함께 보고하면 해소된다
  2. B(검색) 14건은 2주차 베이스라인용으로 얇다. 도메인당 2~4건이라 Recall@5·MRR 의 분산이 크다. 잠정 베이스라인을 “여러 번 실행한 값 중 최저치”로 고정할 때(절대 원칙 4) 표본이 작으면 그 최저치가 실력이 아니라 운을 반영할 수 있다

배분을 다시 잡자는 게 아니다. 측정 방법에 반영할지만 정하면 되고, 3주차 150건 확장 때 비율을 다시 볼 기회가 있다.

인프라 런북을 하네스로 걸면서 드러난 어긋남 4건 (2026-09-04)

docs/infra-runbook.md 를 각 영역 규칙에 배선하면서(루트 CLAUDE.md §0) 저장소와 다른 곳이 나왔다. 전부 인프라(정성윤) 소관이라 고치지 않고 올린다.

  1. 배포가 한 파드인가 두 도메인인가. 런북은 server 파드 하나에 임베딩·분류기까지 올리고 server.solidbob.cloud 만 연다(13-1·16-1·19장). 반면 루트 CLAUDE.md §3 과 ai/CLAUDE.md 머리말은 ai.solidbob.cloud 를 배포 대상으로 적고 있다. decisions/024(검색 스포크를 같은 프로세스에서 꽂는다)와 같은 사안이고, STATE.md 의 정성윤 회신 대기 항목이 아직 열려 있다
  2. 저장소 주소가 다르다. 런북 13장은 github.com/SeongYuna/call.solidbob.cloud.git 을 클론하는데 루트 문서·실제 원격은 github.com/solidbob02/call.solidbob.cloud 다. 한쪽으로 맞춰야 서버에서 그대로 붙여 쓸 수 있다
  3. 부록 B 의 결정 기록 9건이 아직 없다. 런북 18장은 이미 decisions/103(Cloudflare 프록시 금지)을 참조하지만 파일이 없다. 번호대는 정성윤 1xx 다(§4)
  4. .env.example 에 OLLAMA_URL·HF_HOME 키가 없다. 런북 16-1 은 파드에 둘을 주입한다. .env.example 은 자격증명 보호 훅이 편집을 막으므로 사람이 직접 채워야 한다(SEC-2)

프론트 연동을 막는 세 겹 중 인프라 몫 (2026-09-09)

프론트가 붙으려면 CORS → DB 스키마 → ES 적재 순서로 세 겹이 열려야 한다. CORS 는 server/ 에서 열었다(w3-cors-dashboard). 나머지는 kubectl 권한이 있는 쪽 일이라 올린다.

  1. 대시보드를 어디서 서빙할지 정해지지 않았다. 런북은 외부에 여는 주소가 server.solidbob.cloud 443 하나라고만 적었고(16-2·18) 대시보드 호스팅은 어디에도 없다. 같은 도메인에서 Caddy 가 정적 파일로 내주면 CORS 가 필요 없고, 다른 origin 이면 배포 env 에 CORS_ALLOWED_ORIGINS 를 넣어야 한다(런북 16-1 주입 목록에 아직 없다). 런북 16-2 가 참조하는 infra/docker/Caddyfile 도 저장소에 없다 — 정성윤·조서희
  2. 런북에 지식베이스 적재 단계가 없다. 15장(Elasticsearch)은 기동·nori 확인까지만이고, scripts/index_knowledge_base.py --to-es --recreate 를 운영 ES 에 도는 절차가 없다. ES 는 ClusterIP 라 밖에서 못 치므로 클러스터 안 Job 이나 kubectl exec 절차가 필요하다. 이게 없으면 /hub/search 는 운영에서 계속 빈 인덱스를 본다 — 정성윤(실행)·류준(명령)
  3. DB 스키마 적용은 런북 17장 그대로 정성윤 실행 항목이다. 09-04 의 어긋남 4건과 별개로, 배포 순서에 17장·위 2번 적재가 들어가야 프론트가 붙일 게 생긴다. 2026-09-11: 17장을 실물 기준으로 고쳤다 — 인스턴스에 클론이 없어 raw.githubusercontent.com 에서 받고, 서버 파드 안에서 서버와 같은 DATABASE_URL 로 넣는다(12-2 시크릿 교체가 먼저). 실행은 아직이다 — w4-rds-prod-db

블랙컨슈머 수동 분류 카드 — 결정 기록 없음 (2026-09-10)

apps/dashboard에 통화 종료 후 상담원이 직접 판단해 분류하는 카드를 추가했다 (BlackConsumerAction.tsx). 코드 주석은 “C-6 확장”이라 적었지만, _project/plan.md rev.5의 C-6은 자동 탐지(고객 욕설·폭언, 재현율 우선 분류기)로만 정의돼 있어 성격이 다르다. 뒷받침하는 결정 기록이 아직 없다(CLAUDE.md §1 원칙 미준수). 정할 것: 결정 기록(조서희 4xx)을 써서 plan.md에 이 서브기능을 공식화할지, 아니면 C-6과 무관한 별도 ID로 뗄지. 지금은 보류.

이번 주 할 일 (1주차)

3주차에 남긴 것

세부 진행은 8주 마일스톤의 칸반 보드, 완료 기록은 진행상황에서 확인하세요.


← 표지로 돌아가기

콜 미디에이터를 붙이며 남은 것 (2026-09-11)

services/call-mediator 가 생겼다(w4-gateway-streaming-stt) — 실제 AI Hub 음성 → Google STT → 로컬 server 마스킹 → 대시보드 WS 까지 관통했다. 거기서 나온 것들이다.

콜 미디에이터 마무리에서 남은 것 (2026-09-14)

C-6 저장 배선 · 오류 주입기에서 남은 것 (2026-09-14, 류준)

frontend 브랜치를 main 에 합칠 때 — 조서희 님께 (2026-09-11, decisions/109)

공개 데모(call.solidbob.cloud)를 라이브로 바꿀지 — 조서희 님과 정할 것 (2026-09-11)

콜 미디에이터가 운영에 떴다(/call-mediator/health — 키·캡·토큰 둘 전부 true). 대시보드를 실제 콜 미디에이터에 붙이려면 Vercel 에 VITE_CALL_MEDIATOR_WS_URL=wss://server.solidbob.cloud/call-mediator/ws?token=<뷰 토큰> 을 넣고 재배포하면 된다 — 그런데 정성윤은 이 설정을 일부러 멈췄다. 기술 문제가 아니라 팀이 정할 일이라서다: 대시보드는 조서희 님 전담이고(decisions/302), decisions/109 도 «프론트는 건드리지 않는다» 고 적었다.

먼저 알아 둘 사실 (2026-09-11 코드·운영 확인)

  방법 좋은 점 나쁜 점
A 공개 데모는 mock 그대로 · 라이브는 개발자가 ?call_mediator=<주소> 로 자기 브라우저에서만 바꿀 것 없음. 공개 데모가 늘 돈다. 자막이 밖에 노출되지 않는다 방문자는 실제 동작을 못 본다. 뷰 토큰을 쓸 사람에게 따로 건넨다. ⚠ ?call_mediator= 가 아무 주소나 받는다 — 아래 항목을 먼저 고쳐야 A 가 안전하다
B Vercel Production 에 VITE_CALL_MEDIATOR_WS_URL (뷰 토큰 포함) → 재배포 주소만 열면 라이브. 시연 준비가 간단하다 ① 생산자가 없으면 빈 화면 ② 번들이 공개라 주소를 아는 누구나 모든 통화의 (마스킹된) 자막을 본다 ③ EC2 가 꺼지면(자동 중지를 걸면) 멈춘다 ④ 토큰을 바꾸면 재배포
C 기본은 mock, 화면에서 「라이브 연결」을 골라 토큰을 사람이 입력 공개 데모도 살고 라이브도 쉽다. 토큰이 번들에 안 들어간다 프론트 코드 작업이 필요하다(조서희 님). 지금의 ?call_mediator= 를 화면으로 올린 것에 가깝다

권고: 지금은 A — 단, ?call_mediator= 허용 목록을 먼저 고친 뒤에. 공개 데모를 망가뜨리지 않고 노출도 없으며, 라이브 확인은 ?call_mediator= 로 충분하다. 그런데 그 ?call_mediator= 에 지금 구멍이 있다(바로 아래 항목 — A/B 선택과 상관없이 이미 운영 번들에 있다). B 로 가는 조건 — ① 시연 때 오디오를 누가 어떻게 보낼지 정해졌다(/call-mediator/dev 등) ② 「주소를 아는 사람은 자막을 본다」를 팀이 받아들였다 (상담원 로그인은 서버에도 아직 없다 — 「서버에 인증이 없다」). 발표 시연만 라이브가 필요하면 그날만 B 로 바꿨다가 되돌리는 방법도 있다.

B 를 고르면 할 일 (정성윤 — Vercel 계정): 뷰 토큰 꺼내기(sudo k3s kubectl -n callguard get secret call-mediator-tokens -o jsonpath='{.data.CALL_MEDIATOR_VIEW_TOKEN}' | base64 -d, 32자 — 48자인 INGEST 는 절대 넣지 않는다) → call.solidbob.cloud 가 붙은 Vercel 프로젝트(call-solidbob-cloud-kxu6, Root Directory apps/call — 09-14 개명 반영) → Settings → Environment Variables → Production 만 → Deployments → Redeploy(VITE_ 는 빌드 때 박힌다) → 확인: 번들에 call-mediator/ws 가 들어갔는지 · 대시보드를 연 동안 /call-mediator/health 의 dashboards 가 1 이 되는지.

배포하면 ES 가 매번 «configured» 로 나온다 (신규, 2026-09-11)

릴리스 태그 게이트를 고치며 남은 것 (2026-09-14, decisions/111)

운영 스키마가 배포보다 늦게 따라간다 (신규, 2026-09-14)

5~8주차 티켓을 미리 만들었다 — 담당자는 «제안»이다 (신규, 2026-09-15)

배포 확인용 프로브 — 걷어냈다 (2026-09-15 닫음)

w4-dashboard-live-contract 로 드러난 계약 구멍 셋 (신규, 2026-09-15)

통화 후 초안 · 상담원 토큰에서 남은 것 (신규, 2026-09-15, 장민석)

운영 DB 에 저장소에 없는 테이블이 하나 있다 — 오인이었다. 닫는다 (2026-09-15, 정성윤)

blacklist_entry_expiry_change 가 저장소에 없다고 적었으나 틀렸다. decisions/309(장민석, 09-15)가 정한 정식 테이블이고 db/schema.sql 에 29개 중 하나로 들어 있다. 다섯 브랜치 전부에 있다. 행이 0인 것도 정상이다 — 관리자 만료 연장·단축(POST /hub/blacklist-entries/{id}/expiry)을 아직 아무도 쓰지 않았을 뿐이다. 지우지 않는다.

왜 틀렸나 — 남겨 둘 값어치가 있다. 검색을 돌린 시점의 작업 트리가 PR #90 이전이었다. git pull --ff-only 출력을 tail -1 로 삼켜 실패를 못 보고, 그 상태에서 「전수 검색 0건」이라고 단정했다. 브랜치를 따로 보지도 않았다(git grep <ref> 로 다섯 브랜치를 봤으면 바로 나왔다). 교훈: 「저장소에 없다」를 말하기 전에 ① 트리가 최신인지 ② 다른 브랜치는 봤는지 둘을 먼저 확인한다. 드리프트 방향이 「운영에만 있다」로 보일 때는 대개 내 트리가 낡은 것이다.

Vercel 설정이 콘솔에만 있다 (신규, 2026-09-15, 정성윤)

합성 통화 대본 · 학습 방향에서 남은 것 (신규, 2026-09-16, 류준)

09-17 운영 점검·로컬 E2E 에서 넘긴 것 — 팀원별 (신규, 2026-09-17, 류준)

페르소나 4명 점검 결과. 류준 몫은 w5-e2e-findings-ai에서 고쳤다. ⚠ E2E 는 로컬(규칙·BM25, NER·임베딩 없음 — 운영과 같은 구성) 결과다.

C-5 규칙 보강에서 남은 것 (신규, 2026-09-17, 류준 — 주 담당 장민석)

w5-c5-masking-gaps에서 이름·번지 누락과 과잉 마스킹을 함께 고쳤다. 남은 것:

프론트 왕복 테스트로 드러난 것 셋 (신규, 2026-09-17, 정성윤)

gateway → call-mediator 개명에서 남은 것 (신규, 2026-09-17, 정성윤 · decisions/115)

합성 통화 확장 · E2E 24건에서 남은 것 (신규, 2026-09-18, 류준 · decisions/209 제안)

09-19 세션에서 남긴 것 (신규, 2026-09-19, 정성윤)

6주차 판정(09-30)을 앞두고 — 공식 수치가 2주 낡았다 (신규, 2026-09-19, 정성윤)

주차 경계를 마일스톤 기준으로 다시 세면 오늘은 5주차이고 F·G·H·I 동결 판정은 6주차 종료 = 09-30, 남은 기간은 11일이다. STATE.md 가 「3주차」로 두 주 낡아 있어 이것이 가려져 있었다(같은 날 고쳤다).

/health/ready 를 새로 냈다 — 검토·배선은 남았다 (신규, 2026-09-19 · 주 담당 장민석)

레이턴시 계측에서 남은 것 (신규, 2026-09-20 · decisions/119)

운영 파이프라인 왕복에서 나온 것 (신규, 2026-09-20 — 런북 19장 11번 확장판)

운영에 테스트 통화 1건을 태워 전 구간을 처음으로 실제로 돌렸다(끝난 뒤 행 15개 전부 삭제). 잘 돈 것은 진행 기록에 있고, 여기는 고쳐야 할 것만 적는다.

진행 중 티켓을 닫으며 남긴 것 (신규, 2026-09-21, 류준)

재측정에서 새로 나온 것 (신규, 2026-09-21)

전수 조사에서 나온 것 — 고치지 않고 올린다 (신규, 2026-09-21, 정성윤)

낡은 서술은 고쳤다(w5-stale-docs-sweep). 아래는 서술이 아니라 결정이나 코드 작업이 필요해 남긴 것이다.

2026-09-22 류준 — 남은 일을 돌리며 새로 생긴 것

2026-09-22 에 남긴 것 (정성윤)

2026-09-22 에 남긴 것 (장민석)

코드는 server 브랜치에 있고 커밋·배포 전이다. 넷은 조서희 님 화면이 먼저 바뀌어야 서버를 내보낼 수 있다(사용자 결정 — 서버만 하고 넘긴다).

2026-09-22 최종 QA(페르소나 4 + 검증 웨이브) — 남은 것 (류준 정리)

원자료 data/processed/qa-2026-09-22/(gitignore). 합성 통화는 source: synthetic(STT 미경유) — 성능 수치가 아니다.

2026-09-22 밤 — 류준 티켓 일괄 처리 뒤 남은 것

2026-09-24 — 판정 자료 수치 정합에서 남은 것 (류준)

2026-09-28 — 류준이 정성윤에게 넘긴 다섯 건, 전부 처리 (정성윤)

_project/handoff/2026-09-24-ryujun-conflicts.md §1-⑥. 다섯 다 닫혔으니 새 미결로 남기지 않고 결과만 적는다.

2026-09-30 — 수동 QA 2회차에서 남긴 것 (정성윤)

결과표는 진행 기록 2026-09-30-01-seongyun. 게이트(decisions/319)는 통과했고, 아래는 그 과정에서 새로 보인 것이다. apps/ 항목은 조서희 님 몫이라 티켓을 만들지 않고 여기 적는다. → 09-30 decisions/137: 마감까지 정성윤이 apps/ 도 고친다. 아래 [x] 는 그날 코드로 닫은 것(배포 전).

2026-09-30 — 티켓 정리 뒤 남은 것 (정성윤)

2026-10-01 — 완성 절차 뒤 남은 것 (정성윤)

2026-10-01 밤 — 최종 점검에서 나온 것 (정성윤)

2026-10-02 — 통화 후 모델 요약을 켜며 남긴 것 (정성윤)

2026-10-02 — 대체 표현 문장을 보내며 남긴 것 (정성윤)

2026-10-02 — 시연 촬영 중 나온 것 (정성윤)

2026-10-06 — F-3 브리핑 · C-6 일시정지 안내 베타를 열며 남긴 것 (류준)

2026-10-06 — 상담원 화면 원문 · 저장 마스킹 + 전사 암호화로 바꾸며 남긴 것 (장민석)

2026-10-08 — 부하 시험에서 나온 것 (정성윤)

2026-10-07 — 컴플라이언스 권장 문장 확인에서 나온 것 (류준)

2026-10-13 — AI 파트 심사 대비 검토에서 나온 것 (류준)

2026-10-15 — 시연 최종본 확인 · 발표 지표 보강에서 나온 것 (류준)