읽기 경로 인증 — 통화 목록·전사·기록·검색이 무인증이고 지식 공백 설명이 마스킹 없이 저장된다

정성윤이 09-22 저녁 최종 QA(류준 페르소나 4 + 검증 웨이브)·운영 확인 결과를 보고 만든 티켓이다. 담당은 «제안»이다 — 본인이 확인하고 맞으면 착수, 아니면 옮긴다.

무엇을

운영에서 토큰 없이 열린다(09-22 최종 QA 실측): GET /hub/calls(12건 · 실제 음성 테스트 통화 포함 · 고객 HMAC · ?customer_id= 필터) · /transcript · /record · GET/POST/PATCH /hub/knowledge-gaps(설명이 마스킹 없이 저장) · POST /hub/search. 쓰기 경로는 09-22 fail-closed 로 닫혔다(PR #131). 09-30 전에 닫히지 않은 가장 큰 구멍이다.

어떻게

  1. 라우터 표(경로 · 지금 문 · 걸 문 — 상담원 토큰 / 서비스 토큰 / 관리자 세션)를 결정 기록 3xx 로
  2. knowledge-gaps 설명은 저장 전에 마스킹 스포크를 태운다(SEC-1)
  3. 화면이 토큰을 싣는 것(w6-read-path-token-ui, 조서희)과 같은 릴리스에 — 먼저 걸면 화면이 깨진다

완료 조건

근거: 미결 「읽기 경로 인증 없음」 · 마감 체크리스트 13번.

2026-09-22 — 장민석 착수·서버 구현 (담당 확인)

2026-09-22 — 배포

2026-09-23 — 조서희, 프론트 쪽 붙였다

w6-read-path-token-ui 완료 — coreClient.ts의 네 함수(fetchCallList·fetchCallTranscript· fetchCallRecord·searchDocuments)가 이제 상담원 토큰을 싣는다. server-env의 READ_AUTH_REQUIRED=true를 켜도 되는 상태다 — 코드 배포 없이 그 한 줄만 남았다.

2026-09-23 — 문을 닫았다 (정성윤)

마지막 한 줄은 서버가 아니라 운영 설정이었다. 조서희 님이 24f7df4(PR #145)로 읽기 넷에 상담원 토큰을 싣기 시작했고 배포까지 확인된 뒤, 운영 시크릿 server-env 에 READ_AUTH_REQUIRED=true 를 넣고 callguard-server 를 다시 띄웠다(SSM, 11:5x). 이미지는 그대로 0.1.38 — 코드 배포가 아니다.

확인한 것 — /health read_guard: **locked** · 토큰 없이 GET /hub/calls · GET /hub/calls/{id}/transcript · POST /hub/search 전부 401 · 틀린 토큰도 401 · /health/ready 200(문과 무관하게 살아 있다).