---
title: "총괄보고 — 코치노트 AI RC2 Phase0 최종 검수 (대시보드형)"
category: "workreport"
document_type: "총괄보고"
source_status: "generated"
knowledge_group: "03_history"
priority: "High"
purpose: "코치노트 AI v1.0-rc2(Phase0) 6분할(spec01~06)+spec05a의 KB 작업보고·핸드오프를 전수 확인하고, 본레포 구현 코드와 1:1 대조하며, MCP 브라우징 전수테스트(마스터 실세션)를 수행한 RC2 최종 총괄 검수 기록물. spec별 PASS/FAIL/N/A 판정, 명세 대비 구현표, 결정로그 5요소, 개인정보·약관 잔여 과제, Phase0 종료 판단, 다음 작업 지시까지 한 문서로 통합. 이미지 증거·우측 고정 네비·비개발자 해설 병기."
read_when: ["최신상태복구","코치노트AI","RC2종료판단","MCP브라우징","Phase0검수","총괄보고"]
updated: "2026-06-06"
work_timestamp: "20260606_190000"
context: "달록본레포CC (D:\\dallog\\dallog_git) — RC2 최종 검수·문서화 스레드 (코드 무수정, 읽기 전용 검수)"
source_of_truth: "https://dallog-tools.hansbridge.co.kr/knowledge/"
---

<!-- ───────────────── 우측 고정 네비게이션바 (hover 펼침 / click 이동) ───────────────── -->
<style>
.rc2nav{position:fixed;top:96px;right:0;z-index:60;font-size:13px;line-height:1.5;
  background:#11150f;border:1px solid #2b3322;border-right:none;border-radius:10px 0 0 10px;
  box-shadow:-4px 0 18px rgba(0,0,0,.28);overflow:hidden;
  width:38px;transition:width .18s ease;color:#cfe0bd}
.rc2nav:hover{width:248px}
.rc2nav-tag{writing-mode:vertical-rl;text-orientation:mixed;padding:12px 9px;letter-spacing:2px;
  font-weight:700;color:#a8d977;white-space:nowrap}
.rc2nav:hover .rc2nav-tag{display:none}
.rc2nav-list{display:none;padding:8px 6px}
.rc2nav:hover .rc2nav-list{display:block}
.rc2nav-list a{display:block;padding:5px 10px;color:#cfe0bd;text-decoration:none;border-radius:6px;white-space:nowrap}
.rc2nav-list a:hover{background:#22301a;color:#e9ffd2}
@media (max-width:820px){.rc2nav{display:none}}
</style>
<nav class="rc2nav" aria-label="섹션 바로가기">
  <div class="rc2nav-tag">목차 ▤</div>
  <div class="rc2nav-list">
    <a href="#dash">0 · 요약 대시보드</a>
    <a href="#s1">1 · 요약 결론</a>
    <a href="#s2">2 · 검수 기준·사용 문서</a>
    <a href="#s3">3 · spec별 KB 문서 확인</a>
    <a href="#s4">4 · MCP 브라우징 전수테스트</a>
    <a href="#s5">5 · 명세 대비 구현</a>
    <a href="#s6">6 · N/A·보류 항목</a>
    <a href="#s7">7 · 개인정보·약관 잔여</a>
    <a href="#s8">8 · Phase0 종료 판단</a>
    <a href="#s9">9 · 다음 작업 지시</a>
    <a href="#s10">10 · 결정로그 5요소</a>
    <a href="#s11">11 · 스크린샷 모음</a>
    <a href="#s12">12 · 데이터 계약 갱신</a>
  </div>
</nav>

# 총괄보고 — 코치노트 AI RC2 Phase0 최종 검수

> **이 문서가 답하는 질문** — RC2(코치노트 AI 멀티턴 대화)는 어디까지 만들어졌고, 어디까지 검증됐으며, 무엇이 아직 `N/A`(지금은 검증 불가)이고, **Phase0(채팅 켜기)을 끝내도 되는가**.
> **검수 성격** — 코드·SQL을 일절 고치지 않은 **읽기 전용 검수**다. 본레포(`D:\dallog\dallog_git`)는 add/commit/push 하지 않았다. 이 문서와 이미지만 dallog-tools(KB)에 올린다.
> **기준(Source of Truth)** — 본레포 `docs/go_work` 원본 명세 + `decision_log_rc2` + 실제 코드 + 라이브 화면. 결과 기록은 달록KB(이 문서).

> 📎 **우측 고정 네비게이션바**: 화면 오른쪽 가장자리의 세로 `목차 ▤` 탭에 커서를 올리면 펼쳐지고, 항목을 누르면 해당 섹션으로 이동한다. 커서를 떼면 다시 접힌다. (KB 렌더러가 HTML/CSS를 막는 경우를 대비해 아래 **앵커 목차**도 함께 제공한다 — 둘 중 동작하는 쪽을 쓰면 된다.)

---

## 📑 앵커 목차 (대체 네비)

- [0. 요약 대시보드](#dash)
- [용어 병기 (개발어휘 / 한국어)](#용어-병기-개발어휘--한국어)
- [1. 요약 결론](#s1)
- [2. 검수 기준과 사용 문서](#s2)
- [3. spec별 KB 문서 확인 결과](#s3)
- [4. MCP 브라우징 전수테스트 결과](#s4)
- [5. 명세 대비 구현 완료 여부](#s5)
- [6. 미구현 / N/A / 보류 항목](#s6)
- [7. 개인정보·약관·운영 잔여 과제](#s7)
- [8. Phase0 종료 판단](#s8)
- [9. 다음 작업 지시](#s9)
- [10. 결정로그 5요소](#s10)
- [11. 스크린샷 모음](#s11)
- [12. 데이터 계약 갱신 확인](#s12)

---

<a id="용어-병기-개발어휘--한국어"></a>
## 용어 병기 (개발어휘 / 한국어 의역 + 짧은 해설)

| 개발어휘 | 한국어 의역 | 짧은 해설 |
|---|---|---|
| thread | 대화방 | AI와 한 묶음으로 주고받는 한 채팅 단위 |
| transcript | 대화 원문 | 실제로 주고받은 문장 전체 (저장 대상) |
| snapshot | 운동기록 요약본 | 최근 14일 운동을 압축한 묶음 |
| system prompt | 시스템 지시문 | AI에게 "너는 이런 코치다"라고 미리 박아두는 고정 안내문 |
| prompt caching | 프롬프트 캐싱 | 매번 똑같이 보내는 앞부분을 재사용해 비용을 아끼는 기법 |
| storageGate | 저장 활성화 게이트 | 대화 원문 저장 기능을 사용자에게 켤지 말지 통제하는 안전장치 |
| soft delete | 화면상 삭제 | 목록에서만 지우고 일정 기간 실제로는 남겨두는 삭제 |
| hard delete | 완전 파기 | 데이터베이스에서 실제로 영구 제거 |
| RLS | 행 단위 접근 제한 | "내 데이터는 나만 본다"를 DB가 강제하는 보안 규칙 |
| RPC | DB 함수 호출 | 앱이 DB 안의 정해진 함수를 불러 계산을 맡기는 방식 |
| chat-proxy | AI 호출 중계 서버 | 앱과 실제 AI 모델 사이에서 요청을 전달하는 중간 서버 |
| entitlement | 사용권/잔여량 | 지금 이 사용자가 AI 코칭을 몇 회 더 쓸 수 있는지 |
| memory profile | 메모리 프로필 | 사용자가 직접 적어두는 목표·통증·선호 카드 |
| graceful 처리 | 부드러운 실패 처리 | 오류가 나도 화면이 깨지지 않고 안내문으로 막아주는 것 |

---

<a id="dash"></a>
## 0. 요약 대시보드 — 한눈에 판단

> **비개발자용 해설:** 아래 표 한 장이 이 보고서의 결론이다. `PASS`는 확인됨, `N/A`는 "실패가 아니라 아직 검증할 환경이 안 됨", `확인필요`는 "사장님 또는 다음 작업자가 한 번 더 봐야 함"이라는 뜻이다.

| 구분 | 상태 | 비고 |
|---|---|---|
| RC2 구현 커밋 | **PASS** | PR#36 머지 (`3e131ef`) — code `7b67435` / SQL `1ae2a6c` / docs `16e7483` |
| 빌드 (`npm run build`) | **PASS** | spec01~06 전 분할 tsc+vite 통과 (각 worklog), 검수 시 `tsc --noEmit` 재확인 EXIT 0 |
| DB 마이그레이션 SQL 3종 | **PASS (라이브 확인)** | 라이브 Supabase에서 RPC 200 응답 확인 (`ensure_subscription`·`get_entitlement`·`billing_setting`·`memory_profile`) |
| spec01 기반골격 | PASS / N/A 혼합 | 독립 UI 없음 → 화면 N/A, 코드·RPC 라이브 PASS |
| spec02 운동데이터 주입 | PASS / N/A 혼합 | 순수 로직 단계, UI 없음 → 화면 N/A, 11/11 명세 PASS |
| spec03 가드레일·프롬프트 | PASS / N/A 혼합 | 단독 UI 없음 → 화면 N/A, build·조립 샘플 PASS |
| spec04 저장·개인정보 | PASS / N/A 혼합 | **storageGate OFF**(설계), UI에 게이트 안내문 라이브 노출 PASS |
| spec05 플랜·차감 | PASS / N/A 혼합 | UI는 spec06, 차감 RPC 28/28 시뮬 PASS, SQL 적용 PASS |
| spec05a 플랜·토큰행정 | **PASS / 확인필요** | 구현은 반영 완료, **KB 별도 문서 없음**(go_work에만 존재) → §B KB 패치 후속 |
| spec06 프론트 UX | PASS / N/A 혼합 | 라이브 검증 6/10, **라이브 N/A 4**(AI 실응답·성공차감·캡도달·OWNER) |
| MCP 브라우징 (신규 세션) | PASS / N/A 혼합 | 신규 9테스트 중 PASS 6 · N/A 2 · 확인필요 1 (아래 §4) |
| **Phase0 종료 판단** | **조건부 종료 가능** | 코드·SQL·UI 완성, **chat-proxy 배포 + 모델 키 + 마스터 사용권 시드** 충족 시 종료 (§8) |

**핵심 화면 미리보기 2장** (클릭하면 원본 크기로 열린다):

<a href="pacelog-archive/pages/02-workreport/assets-20260606_190000_rc2_final_audit/coach-01-desktop-default.png"><img src="pacelog-archive/pages/02-workreport/assets-20260606_190000_rc2_final_audit/coach-01-desktop-default.png" width="380" alt="신규 MCP — /coach 데스크탑 기본 화면"></a>
<a href="pacelog-archive/pages/02-workreport/assets-20260606_190000_rc2_final_audit/coach-06-exhaust-notice.png"><img src="pacelog-archive/pages/02-workreport/assets-20260606_190000_rc2_final_audit/coach-06-exhaust-notice.png" width="380" alt="신규 MCP — 소진 안내 모달(베타 톤)"></a>

*왼쪽: `/coach` 진입 시 'AI 코치 대화' 기본 탭(신규 세션). 오른쪽: 소진 상태에서 메시지 전송 시 뜨는 '무료 AI 체험을 모두 사용했어요' 안내 모달(베타 톤). 두 장 모두 2026-06-06 신규 MCP 세션 캡처.*

---

<a id="s1"></a>
## 1. 요약 결론

**RC2(코치노트 AI 멀티턴 대화, Phase0)는 코드·DB·화면이 모두 구현·커밋·검증 완료** 상태다. 6분할(spec01~06)과 보조명세 spec05a가 본레포에 반영되었고, PR#36으로 머지됐으며, 빌드가 통과하고, DB 마이그레이션 3종이 라이브 Supabase에 적용되어 관련 DB 함수 호출이 정상 응답한다.

- **즉시 사용 가능(라이브 PASS):** `/coach` 진입, AI 코치 대화/AI 브리프 두 탭 공존(브리프 100% 보존), 데스크탑·모바일 레이아웃, **저장 활성화 게이트 OFF**(대화 원문 비저장)와 그 안내문, **소진 안내 UX**, **소진 시 무차감·무전송**(네트워크로 차감 RPC 미호출 확인), 플랜 쇼핑 패널(베타 톤), 사용량·차감 DB 함수 라이브 응답.
- **운영 잔여(지금은 N/A):** **AI 실응답·성공 차감·턴캡 도달·OWNER 화면**은 `chat-proxy`(AI 호출 중계 서버) 미배포 + 모델 키 미등록 + OWNER 계정 미시드 때문에 **라이브 검증 불가(N/A)**. 코드 경로와 실패(graceful) 경로는 검증됨. 프록시 배포·키 주입 시 자동 연동되도록 설계돼 있다.
- **확인 필요(이번 신규 세션에서 새로 관측):** 신규 MCP 세션에서 마스터 계정의 **사용권 조회(`coach_get_entitlement`)가 HTTP 200이지만 빈 행을 반환** → 사용량 배지가 "AI 코칭 정보를 불러오는 중"에 고정되고 전송이 소진 기본값으로 막혔다. spec06 당시 동일 코드에서 "30회 남음"이 정상 표시됐으므로, **계정/시드 상태 의존 이슈**로 보인다(아래 §4·§6). 코드 결함이 아니라 **데이터(시드) 상태 확인 과제**다.
- **N/A의 의미:** N/A는 실패가 아니다. "지금 환경(프록시 미배포/키 미등록/시드 미적용)에서는 라이브로 보여줄 수 없다"는 뜻이며, 전제 조건이 충족되면 그대로 PASS로 전환될 항목들이다.

> **사용자가 보면 되는 결론:** RC2는 "다 만들어졌고 켜기 직전" 상태다. 채팅이 실제로 답하려면 **① AI 중계 서버(chat-proxy)를 배포하고 ② 모델 키를 넣고 ③ 마스터/운영자 사용권 시드를 확인**하면 된다. 이 3가지가 끝나면 지금 N/A인 항목들이 자동으로 PASS가 된다.

---

<a id="s2"></a>
## 2. 검수 기준과 사용 문서

| 분류 | 사용한 자료 |
|---|---|
| 읽은 KB 작업보고 | spec01·02·03·04·05·06 작업보고 (kb-inbox, 아래 §3 표의 파일명) |
| 읽은 KB 핸드오프 | spec01→02 / 02→03 / 03→04 / 04→05 / 05→06 핸드오프 (kb-inbox) |
| 참조한 go_work 원본 | `worklog_spec01~06`, `handoff_spec0X_to_spec0Y`, `spec_rc2_01~06`, `spec_rc2_05a_plan_admin_v0.2_260606`, `decision_log_rc2`, `handoff_rc2_complete`, `dallogkb_summary_rc2`, `spec_rc2_00_master_index`, `claude_handoff_rc2`, `IMPL_KICKOFF_새스레드용` |
| 참조한 실제 코드 | `src/lib/coachChat/*`(20개), `src/hooks/useCoachChat.ts`, `src/components/coach/*`(8개), `src/pages/CoachNotes.tsx`, `migrations/2026-06-0*_coachchat_*.sql` 3종 |
| MCP 브라우징 환경 | 아래 표 |

**MCP 브라우징 테스트 환경**

| 항목 | 값 |
|---|---|
| 테스트 방식 | Playwright(MCP 브라우저 자동화), 실제 화면 클릭·입력·전송·리사이즈 |
| 테스트 URL | `http://localhost:5173/coach` (본레포 `npm run dev` 로컬 기동, 라이브 Supabase 연결) |
| 사용 계정 | 마스터 실세션 (`master` / 사이드바 "M master 사용자" 확인) |
| 백엔드 | 라이브 Supabase `lzlhbgnnnkrahrmnvooe.supabase.co` (마이그레이션 적용본) / chat-proxy 미배포 |
| 데스크탑 뷰 | 1440 × 900 |
| 모바일 뷰 | 390 × 844 |
| 콘솔 오류 | **0건** (경고 2건 = React Router v7 future-flag 안내뿐, 기능 무관) |
| 캡처 시점 | 2026-06-06 (신규 세션 5장 + spec06 라이브 당시 3장 인용) |

> **비개발자용 해설:** "로컬에서 띄웠다"는 건, 사장님 컴퓨터 안에서 달록 앱을 임시로 실행해 진짜 데이터베이스에 연결한 뒤, 사람이 클릭하듯 자동으로 화면을 눌러본 것이다. 즉 가짜 화면이 아니라 실제 동작 화면을 검사했다.

---

<a id="s3"></a>
## 3. spec별 KB 문서 확인 결과

### 3-1. spec별 문서 링크 목차

KB 인박스 문서는 이 문서와 같은 폴더(`docs/kb-inbox/`)의 형제 파일이다. go_work 원본은 본레포 경로(KB에서는 비링크).

| spec | 작업보고 (kb-inbox) | 핸드오프 (kb-inbox) | 원본 go_work (본레포) | 상태 |
|---|---|---|---|---|
| spec01 | [작업보고](./20260606_181048_작업보고_코치노트AI-RC2-spec01-기반골격.md) | [핸드오프](./20260606_181434_핸드오프_코치노트AI-RC2-spec01-기반골격-인계.md) | `worklog_spec01_foundation.md` / `handoff_spec01_to_spec02.md` | PASS |
| spec02 | [작업보고](./20260606_112347_작업보고_코치노트AI-RC2-spec02-운동데이터주입엔진.md) | [핸드오프](./20260606_112400_핸드오프_코치노트AI-RC2-spec02→spec03-운동데이터주입엔진.md) | `worklog_spec02_data_injection.md` / `handoff_spec02_to_spec03.md` | PASS |
| spec03 | [작업보고](./20260606_181022_작업보고_코치노트AI-RC2-spec03-가드레일프롬프트·메모리프로필.md) | [핸드오프](./20260606_181509_핸드오프_코치노트AI-RC2-spec03→spec04-가드레일프롬프트완료.md) | `worklog_spec03_guardrail_prompt.md` / `handoff_spec03_to_spec04.md` | PASS (보완: PASS 집계표 부재) |
| spec04 | [작업보고](./20260606_181057_작업보고_코치노트AI-RC2-spec04-저장구조·개인정보게이트.md) | [핸드오프](./20260606_181438_핸드오프_코치노트AI-RC2-spec04-to-spec05.md) | `worklog_spec04_storage_privacy.md` / `handoff_spec04_to_spec05.md` | PASS |
| spec05 | [작업보고](./20260606_181206_작업보고_코치노트AI-RC2-spec05-플랜구독사용량차감구조.md) | [핸드오프](./20260606_181528_핸드오프_코치노트AI-RC2-spec05→spec06.md) | `worklog_spec05_plan_billing.md` / `handoff_spec05_to_spec06.md` | PASS |
| spec05a | **N/A (KB 별도 문서 없음)** | **N/A** | `spec_rc2_05a_plan_admin_v0.2_260606.md` (go_work에만 존재) | PASS(구현) / 확인필요(KB) |
| spec06 | [작업보고](./20260606_180731_작업보고_코치노트AI-RC2-spec06-프론트UX.md) | [핸드오프](./20260606_181526_핸드오프_코치노트AI-RC2-spec06-프론트UX.md) | `worklog_spec06_frontend_ux.md` | PASS |

> ⚠️ **spec05a 주의:** spec05a(플랜행정·토큰행정 정정문)는 **kb-inbox에 독립 작업보고/핸드오프가 없다**. go_work의 `spec_rc2_05a_plan_admin_v0.2_260606.md`로만 존재한다. **구현은 완료(spec05가 "spec_rc2_05 원본 + spec05a §A 정정문"으로 대체 적용)** 되었으나, **§B KB 패치(자산화)는 후속**이다. 즉 "코드는 05a 반영본, KB 등재만 잔여".

### 3-2. spec별 확인 결과 표

| spec | 작업보고 | 핸드오프 | 명세 반영 | 검증 기록 | 미비점 | 판단 |
|---|---|---|---|---|---|---|
| spec01 | PASS | PASS | §6 완료정의 6/6 | build PASS·RPC 라이브·원가 단일계산 헬퍼 | chat-proxy 미배포·Gemini key·공식단가(운영잔여) | **PASS** |
| spec02 | PASS | PASS | 명세 11/11 PASS | build PASS·vitest 10건(검증 후 삭제) | 실데이터 e2e는 spec06 의존 | **PASS** |
| spec03 | PASS | PASS | §5 완료정의 4종 충족 | build PASS·프롬프트 조립 샘플 PASS | **PASS/FAIL 집계표 부재**(서술형) | PASS(보완권고) |
| spec04 | PASS | PASS | 8항목 중 PASS 7 / N/A 1 | build PASS·게이트 OFF no-op | **SQL 실적용 worklog상 "추가 확인 필요"**(단, RPC 라이브로 간접 확인) | PASS(확인권고) |
| spec05 | PASS | PASS | 19항목 PASS 16 / PARTIAL 1 / N/A 2 | build PASS·차감 28/28 시뮬·SQL 적용 PASS | 결제 PG·BETA/VIP 미확정 | **PASS** |
| spec05a | N/A(KB) | N/A(KB) | §A 정정문 구현 반영 | spec05 시뮬에 차감모델 번복 반영 | **KB 자산화(§B) 미반영** | PASS(구현)/확인필요(KB) |
| spec06 | PASS | PASS | 11항목 PASS(코드) | build PASS·MCP 5+신규 화면 | 라이브 4항목 N/A(프록시 의존) | **PASS** |

> **비개발자용 해설:** 7개 spec 모두 "코드와 문서가 일치한다"는 것을 file:line(코드 줄 번호)까지 대조해 확인했다. 불일치는 0건이었다. 다만 ① spec03 문서엔 PASS 개수표가 없어 서술로만 되어 있고, ② spec04의 저장용 SQL이 실제 DB에 들어갔는지 작업보고에 "추가 확인 필요"로 적혀 있었는데, 이번 검수에서 관련 DB 함수가 라이브로 응답하는 것을 보아 **간접적으로는 적용된 것으로 확인**된다. ③ spec05a는 KB에 정식 문서로 아직 안 올라가 있다.

---

<a id="s4"></a>
## 4. MCP 브라우징 전수테스트 결과

> **비개발자용 해설:** 아래는 실제로 화면을 띄워 클릭·입력·전송·리사이즈하며 눈으로 확인한 결과다. `N/A`는 "AI 중계 서버가 아직 안 켜져서 실제 답변까지는 못 봤다"는 뜻이고, 화면이 깨지지 않고 안내가 정상 표시되는지는 확인했다.

### 4-1. 전수테스트 요약표 (썸네일 = 클릭 시 확대)

| 테스트 항목 | 결과 | 화면 증거 | 근거 |
|---|---|---|---|
| `/coach` 진입 | **PASS** | <a href="pacelog-archive/pages/02-workreport/assets-20260606_190000_rc2_final_audit/coach-01-desktop-default.png"><img src="pacelog-archive/pages/02-workreport/assets-20260606_190000_rc2_final_audit/coach-01-desktop-default.png" width="150"></a> | 마스터 세션으로 페이지 로드, 콘솔 오류 0 |
| AI 코치 대화 = 기본 탭 | **PASS** | 위 그림 1 | 진입 시 'AI 코치 대화' 활성(코드 초기값 `'chat'`) |
| AI 브리프 탭 보존 | **PASS** | <a href="pacelog-archive/pages/02-workreport/assets-20260606_190000_rc2_final_audit/coach-08-brief-tab-preserved.png"><img src="pacelog-archive/pages/02-workreport/assets-20260606_190000_rc2_final_audit/coach-08-brief-tab-preserved.png" width="150"></a> | 탭 전환 시 기존 3열 브리프 레이아웃 그대로 렌더 |
| 탭 전환 정상 | **PASS** | 그림 1·4 | 대화 ↔ 브리프 왕복 정상 |
| 데스크탑 레이아웃 | **PASS** | 그림 1 | 1440×900 2열(대화+사이드) 정상 |
| 모바일/좁은 화면 | **PASS** | <a href="pacelog-archive/pages/02-workreport/assets-20260606_190000_rc2_final_audit/coach-09-mobile-layout.png"><img src="pacelog-archive/pages/02-workreport/assets-20260606_190000_rc2_final_audit/coach-09-mobile-layout.png" width="150"></a> | 390×844 단일 컬럼, 깨짐 없음 |
| storageGate OFF (저장 비활성) | **PASS** | 그림 1 우측 메모리 카드 | "저장 기능은 개인정보 보호장치…완비되면 켜져요. 지금 입력은 임시로만 유지돼요" 노출 |
| 소진 안내(ExhaustNotice) UX | **PASS** | <a href="pacelog-archive/pages/02-workreport/assets-20260606_190000_rc2_final_audit/coach-06-exhaust-notice.png"><img src="pacelog-archive/pages/02-workreport/assets-20260606_190000_rc2_final_audit/coach-06-exhaust-notice.png" width="150"></a> | 전송 시 "무료 AI 체험을 모두 사용했어요" + 베타 톤 안내 |
| 실패/소진 시 무차감·무전송 | **PASS** | 그림 2 + 네트워크 로그 | 전송 클릭에도 `coach_consume_turn`·chat-proxy 호출 **0건** |
| 플랜 쇼핑 패널 | **PASS** | <a href="pacelog-archive/pages/02-workreport/assets-20260606_190000_rc2_final_audit/coach-07-plan-shop-current.png"><img src="pacelog-archive/pages/02-workreport/assets-20260606_190000_rc2_final_audit/coach-07-plan-shop-current.png" width="150"></a> | "정식 버전 결제는 준비 중" 베타 톤 노출 |
| 사용량 상시노출 (잔여 회 라이브) | **확인필요** | 그림 1 (배지 "불러오는 중") | RPC 200이나 빈 행 → 배지 로딩 고정 (계정/시드 의존, §6) |
| chat-proxy 오류 안내 / AI 실응답 | **N/A** | <a href="pacelog-archive/pages/02-workreport/assets-20260606_190000_rc2_final_audit/prior-spec06-graceful-error.png"><img src="pacelog-archive/pages/02-workreport/assets-20260606_190000_rc2_final_audit/prior-spec06-graceful-error.png" width="150"></a> | 프록시 미배포 + 소진 가드로 전송 미도달 (spec06 라이브 당시 graceful 캡처 인용) |
| 성공 차감 | **N/A** | — | AI 실응답 불가 → 성공 경로 미도달 |
| 턴캡 도달 UX | **N/A** | — | 충분한 턴 누적 재현 불가(프록시 의존) |
| OWNER 패널 | **N/A** | — | 마스터가 무제한(owner)으로 안 잡힘 → OwnerUsagePanel 미렌더 |

**신규 세션 집계 — PASS 9 · 확인필요 1 · N/A 4** (위 14행 중)

### 4-2. 상세 검증 (큰 이미지)

#### (1) `/coach` AI 코치 대화 기본 탭 — PASS

![그림 1. /coach 진입 후 'AI 코치 대화' 탭이 기본으로 표시되는 신규 MCP 세션 화면 (데스크탑 1440×900)](pacelog-archive/pages/02-workreport/assets-20260606_190000_rc2_final_audit/coach-01-desktop-default.png)

그림 1은 마스터 실세션으로 `/coach`에 진입했을 때 **'AI 코치 대화' 탭이 기본**으로 열리고, 오른쪽에 **'내 코치 메모리' 카드**와 **저장 게이트 OFF 안내문**("저장 기능은 개인정보 보호장치…완비되면 켜져요. 지금 입력은 임시로만 유지돼요")이 노출되는 상태를 보여준다. 상단 사용량 배지는 이 세션에서 "AI 코칭 정보를 불러오는 중"에 머물러 있다(§6 확인필요 항목).

> **사용자가 보면 되는 결론:** 진입·탭·메모리 카드·저장 OFF 안내는 모두 정상이다. 사용량 숫자만 이 세션에서 안 떴는데, 이는 코드 문제가 아니라 마스터 계정의 사용권 데이터가 비어 반환된 탓으로 보인다(아래 §6).

#### (2) 소진 안내(ExhaustNotice) + 무차감 — PASS (라이브)

![그림 2. 소진 상태에서 메시지를 입력·전송하면 AI를 호출하지 않고 '무료 AI 체험을 모두 사용했어요' 안내 모달을 띄우는 화면. 베타 톤("정식 버전에서 더 많은 대화를 준비 중이에요. 지금은 안내만 드려요.")](pacelog-archive/pages/02-workreport/assets-20260606_190000_rc2_final_audit/coach-06-exhaust-notice.png)

그림 2는 입력창에 "오늘 러닝 해도 될까?"를 입력하고 **보내기를 눌렀을 때** 발생한 라이브 동작이다. AI를 호출하지 않고 **소진 안내 모달**로 분기했으며, 네트워크 로그에서 차감 함수(`coach_consume_turn`)와 AI 중계 서버 호출이 **모두 0건**임을 확인했다. 결제 미적용(베타) 단계이므로 "지금은 안내만 드려요" 톤으로 표시된다.

> **사용자가 보면 되는 결론:** "돈(코칭 횟수)이 새지 않는다"는 핵심 안전장치가 실제로 작동한다. 사용자가 다 쓴 상태에서 또 보내도 차감되지 않고, 친절한 안내만 뜬다.

#### (3) 플랜 쇼핑 패널 — PASS (현재 데이터: 히든)

<table><tr>
<td><b>신규 세션(현재)</b><br><a href="pacelog-archive/pages/02-workreport/assets-20260606_190000_rc2_final_audit/coach-07-plan-shop-current.png"><img src="pacelog-archive/pages/02-workreport/assets-20260606_190000_rc2_final_audit/coach-07-plan-shop-current.png" width="330"></a></td>
<td><b>spec06 라이브 당시</b><br><a href="pacelog-archive/pages/02-workreport/assets-20260606_190000_rc2_final_audit/prior-spec06-plan-shop-live.png"><img src="pacelog-archive/pages/02-workreport/assets-20260606_190000_rc2_final_audit/prior-spec06-plan-shop-live.png" width="330"></a></td>
</tr></table>

*그림 3. 왼쪽=이번 신규 세션의 플랜 패널("표시할 플랜이 없어요"). 오른쪽=spec06 검증 당시 플랜 패널(1단계 4,900원·월 600회 / 2단계 7,900원·월 900회 / 3단계 11,900원·월 1,350회 노출, "준비 중" 버튼).*

두 화면 모두 **패널 자체는 정상 동작**(베타 톤 "정식 버전 결제는 준비 중")한다. 차이는 **표시 데이터**다. 플랜 쇼핑 목록은 코드상 `is_purchasable && is_visible`이 모두 참인 플랜만 보여준다([planCatalog.ts:46]). 현재는 그런 플랜이 없어 "표시할 플랜이 없어요"가 뜬다 — 이는 **결정 #5(웹 결제 플랜은 스토어 등록 전까지 히든)** 와 부합하는 상태일 수 있으나, spec06 당시엔 3개가 노출됐으므로 **시드(is_visible) 상태가 그 사이 바뀐 것**으로 보인다(§6 확인필요).

> **비개발자용 해설:** 플랜 가격표를 보여주는 창은 잘 열린다. 다만 지금은 "보여줄 플랜이 꺼져 있음" 상태라 빈 안내가 뜬다. 이건 "앱 마켓 등록 전엔 결제 유도를 숨긴다"는 사장님 결정과 맞을 수도 있고, 단순히 시드 값이 바뀐 것일 수도 있어 한 번 확인이 필요하다.

#### (4) AI 브리프 보존 — PASS

![그림 4. 'AI 브리프' 탭으로 전환하면 기존 브리프 화면(좌측 보조 패널 + 본문)이 그대로 보존되어 렌더된다](pacelog-archive/pages/02-workreport/assets-20260606_190000_rc2_final_audit/coach-08-brief-tab-preserved.png)

그림 4는 'AI 브리프' 탭을 누른 상태다. 기존 브리프 기능(생성·시각화 카드·레이아웃)이 **외과적으로 보존**되어, 새로 붙인 'AI 코치 대화'와 공존한다.

#### (5) 모바일/좁은 화면 — PASS

![그림 5. 390×844 모바일 폭에서 코치 화면이 단일 컬럼으로 정렬되어 깨짐 없이 표시된다](pacelog-archive/pages/02-workreport/assets-20260606_190000_rc2_final_audit/coach-09-mobile-layout.png)

그림 5는 모바일 폭(390px)으로 줄였을 때다. 대화 영역·메모리 카드가 세로 단일 컬럼으로 재배치되며 레이아웃이 깨지지 않는다.

### 4-3. spec별 MCP 연결 확인 (화면 없는 분할 포함)

| spec | MCP 관점 확인 | 판정 |
|---|---|---|
| spec01 | chat-proxy 미배포 graceful 대비 / `coach_request_log`·`get_active_coach_price` RPC 구조가 화면 흐름과 모순 없음 / 원가 단일계산(`calculateEstimatedCost`) / 고정 system prompt 선두 배치 — 코드·흐름 일치 | PASS(코드)·화면 N/A |
| spec02 | 자체 UI 없음. spec06 대화 흐름이 `buildInjectionBlock`(14일 snapshot+여정)·`resolveExpansionRequest`(반자동 확장) 호출로 연결됨(코드 확인). 실데이터 화면은 AI 응답 의존 → N/A | N/A(사유: AI 실응답 불가) |
| spec03 | `assembleCoachChat`가 고정 system prompt를 선두 배치하고 메모리 카드·주입 블록을 뒤에 결합(코드 일치). app_usage가 coach scope에 포함(가드레일). 단독 UI 없음 | PASS(코드)·화면 N/A |
| spec04 | storageGate OFF 라이브 노출(메모리 카드 안내문). 원문 저장 비활성(쓰기 helper no-op). 게이트 OFF↔사용량 차감 독립 | PASS |
| spec05/05a | 플랜·사용권·차감 RPC 라이브(200). 실패/소진 무차감 라이브 확인. OWNER 무제한·BETA/VIP 미확정·결제 Phase 분리는 코드·설정값 | PASS(구조)·OWNER 화면 N/A |
| spec06 | 위 4-1·4-2 전체 | PASS(6) / 확인필요(1) / N/A(4) |

---

<a id="s5"></a>
## 5. 명세 대비 구현 완료 여부

| 명세 | 요구사항 | 구현 상태 | 근거 |
|---|---|---|---|
| spec01 | 모델 교체 구조(설정값) | **PASS** | `chat-proxy` 3 provider env 교체, 하드코딩 없음 |
| spec01 | 원가 로그(13필드+estimated_cost) | **PASS** | `coach_request_log` insert (`requestLog.ts:65`) |
| spec01 | 단가 관리(price_version) | **PASS** | `get_active_coach_price` RPC + `calculateEstimatedCost`(단일 계산) |
| spec01 | 캐싱 친화 구조 | **PASS** | 고정 system prompt 선두 배치(`assembleCoachChat`) |
| spec02 | 14일 snapshot | **PASS** | `buildBaseInjection`/`buildInjectionBlock`(`injection.ts`) |
| spec02 | 전체 여정 요약 | **PASS** | `journey.ts` 7축 |
| spec02 | 확장조회(반자동) | **PASS** | `classifyExpansionRequest`(auto/confirm/none, `expansion.ts:40`) |
| spec02 | 반복패턴 압축 | **PASS** | `compression.ts` |
| spec03 | system prompt | **PASS** | `FIXED_SYSTEM_PROMPT`(VERSION `rc2-03-guardrail`) |
| spec03 | 가드레일 4종(+app_usage scope) | **PASS** | 의료면책·코치스코프·데이터없음·자해분기 |
| spec03 | memory profile(수동 카드) | **PASS** | `buildMemoryProfileCard`(`memoryProfile.ts:32`) |
| spec04 | 대화 저장 구조(4테이블+RLS) | **PASS** | `coach_conversation/message/storage_setting/memory_profile` |
| spec04 | storageGate OFF | **PASS** | `COACH_STORAGE_ACTIVATION.enabled=false`(`storageGate.ts:32`) |
| spec04 | 개인정보 활성화 게이트(5종) | **PASS(구조)** | `STORAGE_ACTIVATION_PREREQUISITES` 5종, 미완 전 비활성 |
| spec04 | 30한도·2단계 삭제 | **PASS** | 트리거 `coach_enforce_archive_limit`·soft/hard delete RPC |
| spec05 | 플랜 구조(4종+가격2버전) | **PASS** | `coach_plan_catalog` 7행 시드 |
| spec05 | 코칭권/회 차감(턴 비율) | **PASS** | `coach_consume_turn`(실패 무차감) |
| spec05 | 실패 무차감 | **PASS(라이브)** | 네트워크로 미차감 확인(§4) |
| spec05a | 플랜행정 보정(턴 비율·이중장부) | **PASS(반영)** | spec05 시뮬에 #16 번복 반영 / KB 자산화만 잔여 |
| spec05a | OWNER/BETA/VIP 보정 | **PASS(owner/beta/vip plan_type)** / BETA·VIP 미확정 | CHECK 7종 확장, beta/vip 제공량 NULL 보류 |
| spec06 | AI코치 UI(서브탭) | **PASS(라이브)** | 기본 대화+브리프 보존(§4) |
| spec06 | 사용량 표시(상시노출) | **PASS(구조)** / 확인필요(라이브 수치) | `CoachUsageBadge` 마운트, 이 세션 빈 행(§6) |
| spec06 | 턴캡 UX | **PASS(코드)** / N/A(라이브) | `TurnCapModal` 존재, 라이브 트리거는 프록시 의존 |

> **비개발자용 해설:** 명세에 적힌 요구사항을 거의 다 구현했고, 코드 줄 번호까지 대조해 "문서에 쓴 대로 실제로 짰는지"를 확인했다. 라이브로 "직접 눈으로" 못 본 항목(AI 실응답·턴캡 도달 등)은 AI 중계 서버가 켜지면 확인 가능하다.

---

<a id="s6"></a>
## 6. 미구현 / N/A / 보류 항목

> **비개발자용 해설:** 여기 있는 항목들은 "잘못됐다"가 아니라 "아직 켜는 조건이 안 됐다"는 목록이다. 조건이 채워지면 자동으로 정상(PASS)이 된다.

| 항목 | 상태 | 이유 | 후속 조건 |
|---|---|---|---|
| AI 실응답 | N/A | chat-proxy 미배포 + 모델 키 미등록 | 프록시 배포·키 주입 후 재검증 |
| 성공 차감 | N/A | 실제 AI 응답 불가 → 성공 경로 미도달 | 프록시 배포 후 재검증 |
| 턴캡 도달 UX | N/A | 충분한 턴 누적 재현 불가(프록시 의존) | 프록시 배포 후 재검증 |
| OWNER 화면(분석 패널) | N/A | 마스터가 owner(무제한)로 안 잡힘 → 미렌더 | owner 시드(plan_type='owner') 후 재검증 |
| 사용량 잔여 회 라이브 표시 | **확인필요** | 신규 세션에서 `coach_get_entitlement` 200·빈 행 → 배지 "불러오는 중" 고정·소진 기본값 | 마스터 무료 사용권 행 존재 여부 확인/재시드, RPC가 인증 무료 사용자에 행 반환하는지 점검 |
| 플랜 쇼핑 목록 노출 | **확인필요** | `is_visible` 필터로 현재 0건("표시할 플랜이 없어요") | 결정 #5(히든) 의도인지, 시드 변경인지 확인 |
| storage 원문 저장 | N/A(설계) | storageGate OFF(개인정보 보호장치 5종 미완) | 5종 완비 후 코드변경+재배포로 활성화 |
| spec04 저장 SQL 실적용 | 확인필요→**간접 PASS** | worklog "추가 확인 필요" / 단 `coach_memory_profile` RPC 라이브 응답 | Supabase에서 4테이블 실재 직접 확인 권고 |
| spec05a KB 자산화 | 보류 | go_work에만 존재, §B KB 패치 후속 | rc5/툴레포 후속 편입 |

### 6-1. 사용권 빈 행 관측 — 정밀 기술 (중요)

신규 MCP 세션에서 다음이 관측됐다.

- 네트워크: `rpc/coach_ensure_subscription` → **204**, `rpc/coach_get_entitlement` → **200**, `coach_billing_setting` → 200, `coach_memory_profile` → 200. **마이그레이션·RPC는 라이브로 살아있다.**
- 그러나 화면: 사용량 배지가 "AI 코칭 정보를 불러오는 중"에 고정되고, 입력창이 "이번 코칭 횟수를 모두 사용했어요"로 비활성.
- 코드 해석: `getEntitlement()`는 RPC 결과가 빈 행이면 `null`을 반환([entitlement.ts:24-25]). 훅은 `ent`가 `null`이면 `exhausted=true`(보수적 기본값, [useCoachChat.ts:86])이고 `remainingLabel`은 로딩 문구([entitlement.ts:84])가 된다. 즉 **화면 상태는 "진짜 0회 소진"이 아니라 "사용권 행이 비어 반환됨"** 과 일치한다.
- 대조: spec06 작업보고 당시 동일 코드로 "AI 코칭 30회 남음 (무료 체험)"이 정상 표시됐다(그림 3 오른쪽). → **코드 결함이 아니라 계정/시드 상태 의존 이슈**로 판단.

> **사용자가 보면 되는 결론:** "사용량 숫자가 안 뜬 것"은 화면 코드가 고장 난 게 아니라, 이번에 띄운 마스터 계정의 사용권 데이터가 비어 돌아왔기 때문이다. 지난번엔 30회로 잘 떴으니, 다음 작업 때 마스터 계정 사용권을 한 번 다시 심어(시드) 확인하면 된다.

---

<a id="s7"></a>
## 7. 개인정보·약관·운영 잔여 과제

> **비개발자용 해설:** AI가 사용자와 나눈 대화에는 통증·체성분 같은 **건강(민감)정보**가 섞일 수 있다. 그래서 "저장 기능을 만들어 두는 것"과 "사용자에게 켜는 것"은 분리했고, 법적 보호장치가 끝나기 전엔 저장을 꺼둔다.

- **AI 대화 원문 저장은 활성화 금지 유지.** 구현 구조(4테이블·RLS·30한도·2단계 삭제)는 있으나, **개인정보처리방침·저장 고지·보유기간/삭제·파기 정책·동의 UI·접근통제(5종)** 완비 전에는 `storageGate OFF`(코드 상수 `enabled=false`)로 둔다.
- **민감 건강정보 전제.** 통증·체성분·건강상태 대화는 건강(민감)정보 성격을 가질 수 있어, 일반 대화 저장이 아닌 **민감정보 처리** 전제로 설계됐다. 적정성은 출시 전 필수 점검(법률 자문 후속).
- **hard delete 배치 가동 전 약관 "파기" 표현 금지.** 완전 파기 배치(pg_cron 등)가 실제로 돌기 전에 약관에 "파기"라고 단정하면 허위 고지가 된다. 배치 구현 후에만 "파기" 명시.
- **storageGate OFF 유지 조건:** 위 5종 완비 + 코드 변경 + 재배포. 실수 토글 방지를 위해 데이터 토글이 아닌 **코드 상수**로 잠가 둠.
- **chat-proxy 배포 전 AI 실응답 N/A**, **Gemini 2.5 Flash-Lite 키 등록 필요**(미등록 시 OpenAI 폴백), **공식 단가 최신화 필요**(시드는 추정 placeholder).
- **결제 Phase 분리**(베타는 연장·결제 비활성, 무료 한도+예고만), **BETA/VIP 제공량·기간 미확정(NULL 보류)**, **OWNER seed 필요**.
- 참고: 별도 PR에서 약관 3종 공개 페이지(개인정보처리방침·이용약관·건강정보동의)가 이미 머지됐으나, 이는 페이지 신설이며 **storageGate 활성화 5종 완비와는 별개**의 점검 대상이다.

---

<a id="s8"></a>
## 8. Phase0 종료 판단

**판정: 조건부 종료 가능 (Conditional GO)**

| 기준 | 상태 | 판단 |
|---|---|---|
| 구현 완료 | **PASS** | spec01~06+05a 본레포 반영·PR#36 머지 |
| build | **PASS** | tsc+vite 전 분할 통과, 검수 시 `tsc --noEmit` EXIT 0 |
| SQL | **PASS(라이브)** | 마이그레이션 3종 적용, RPC 200 응답 (저장 4테이블 직접 확인은 권고) |
| MCP 브라우징 | **PASS / N/A 혼합** | UI·게이트·소진·무차감 라이브 PASS, AI 실응답류 4항목 N/A |
| 개인정보 게이트 | **PASS(OFF 유지)** | storageGate OFF·게이트 안내 라이브 노출 |
| 운영 잔여 | **미완** | chat-proxy 배포·모델 키·owner 시드·사용권 시드 확인 |

> **비개발자용 해설:** "Phase0 = 채팅 켜기"의 코드·DB·화면은 **다 됐다**. 다만 실제로 AI가 답하려면 운영 작업 3가지(중계 서버 배포 / 모델 키 / 운영자·마스터 사용권 시드)가 남아 있다. 그래서 "무조건 종료"가 아니라 **"이 3가지를 끝내면 종료"** 인 조건부 종료로 본다.

**조건부 종료 충족 조건**
1. `chat-proxy`(AI 호출 중계 서버) Cloudflare 배포 + 모델 키(Gemini 2.5 Flash-Lite, 또는 OpenAI 폴백) 주입.
2. 마스터/운영자 **사용권 시드 확인**(이번 세션 빈 행 이슈 해소) → 사용량 라이브 표시·OWNER 패널 재검증.
3. 위 충족 후 **AI 실응답·성공 차감·턴캡 도달 UX** 재검증 → N/A 4항목 PASS 전환.

---

<a id="s9"></a>
## 9. 다음 작업 지시

다음 작업자가 바로 이어받을 수 있는 지시문이다.

1. **프록시 배포 후 재검증** — `chat-proxy`를 Cloudflare Workers에 배포(`workers/chat-proxy/`), `PROXY_URL`(`dallog-chat-proxy.ccy4848.workers.dev`) 연결 확인 후 `/coach`에서 실제 1턴 전송 → AI 실응답·성공 차감·로그 1행 검증.
2. **Gemini key 등록 후 실응답 검증** — Gemini 2.5 Flash-Lite 키 주입(미등록 시 OpenAI 폴백으로 우선 검증). 응답 품질(한국어 코칭·가드레일) 체감 테스트.
3. **owner seed 후 OWNER 패널 검증** — 운영자 계정 `plan_type='owner'` 시드 → "운영자 · AI 코칭 무제한" + 사용량 분석 패널(`OwnerUsagePanel`) 렌더 확인.
4. **마스터 사용권 빈 행 해소** — 마스터 무료 사용권 행 존재 여부 확인/재시드, `coach_get_entitlement`가 인증 무료 사용자에게 행을 반환하는지 점검(§6-1). 해소 후 사용량 배지 "N회 남음" 라이브 재캡처.
5. **개인정보 보호장치 완료 후 storageGate 활성화 검토** — 5종(처리방침·저장 고지·보유기간/삭제·동의 UI·접근통제) 완비 + hard delete 배치 가동 후에만 `enabled=true`로 코드 변경·재배포. 그 전 약관 "파기" 표현 금지.
6. **BETA/VIP 정책 확정** — 제공량·기간(ⓐ), 원가 시뮬레이션 가정 대조(ⓑ) 확정 후 `coach_plan_catalog` 주입.
7. **결제 Phase 설계** — PG 실연동·턴 연장 활성은 수익화 Phase. PG사 방향·심사는 코드와 별개로 선행 검토.
8. **spec05a KB 편입 + 데이터 계약 재생성** — `spec_rc2_05a` §B KB 패치 자산화, 본 문서 편입 후 `_gen_manifest/router/ai-index` 재생성 필요 여부 확인(§12).
9. **spec04 저장 4테이블 직접 확인** — Supabase에서 `coach_conversation/message/storage_setting/memory_profile` 실재·RLS 직접 확인(worklog "추가 확인 필요" 종결).

---

<a id="s10"></a>
## 10. 결정로그 5요소 (중요 결정 발췌)

> 각 결정은 **선택안 / 배제안 / 이유 / 사용자 의견·정서 / 재검토 조건** 5요소로 기록한다. 전체 16개 결정은 본레포 `decision_log_rc2.md`에 있다. 아래는 RC2 핵심 결정 발췌다.

### 결정 #6 — 대화 원문 저장·보관·삭제 〔중요 · 번복 이력〕
- **선택안:** Phase0부터 대화 원문 저장 + 보관함 30개(핀 제외) + 2단계 삭제(soft 30일→hard) + 사용자 통제. 단 **구현/활성화 분리 — 5종 보호장치 완비 전 비활성.**
- **배제안:** 원문 미저장 / 메타정보만 저장 / 원문 무기한 저장.
- **이유:** 유료계약 시 대화 저장·보관·삭제도 운영자 책임 이행사항. 부담을 이유로 회피하지 않음.
- **사용자 의견·정서:** 초기 GPT안(원문 미저장)에서 **사용자 의견으로 "저장+통제"로 번복.** "운영자가 개인정보·삭제정책·CS·저장비용을 부담만을 이유로 회피해선 안 된다."
- **재검토 조건:** 개인정보처리방침·동의 UI·삭제/파기·접근통제 완료 시 활성화 검토.

### 결정 #7 — 사용량 상시 노출 〔친절한 제공자 정책〕
- **선택안:** 남은 회·턴 사용량을 **실시간 상시 노출**, 소진 시 구매/업그레이드 안내.
- **배제안:** 사용량 숨기고 소진 후 결제 유도 / 갑작스러운 차단.
- **이유:** 사용자가 스스로 경제적으로 이용하도록 돕는 친절한 제공자 정책.
- **사용자 의견·정서:** "사용량을 숨기는 일반 방식이 아니라, 소진·잔여를 보여줘 경제적 이용을 배려하고 싶다." → 코드 주석에 "축소 금지" 명시([CoachUsageBadge] 주석).
- **재검토 조건:** 없음(원칙).

### 결정 #11·#12 — 가드레일 + app_usage scope 〔중요〕
- **선택안:** 의료면책·코치스코프·데이터없음·자해분기 4종 + 포괄 안전. **app_usage(앱 사용·기록 방법)를 question_type뿐 아니라 coach scope(코치 역할 범위)에도 포함.**
- **배제안:** app_usage를 질문분류에만 두기.
- **이유:** "미처 가이드 못 한 부분에서 문제 발생" 우려 → 빈틈 보완.
- **사용자 의견·정서:** 자해·위험신호 분기 추가를 능동적으로 반김. **app_usage를 코치 스코프에 넣어야 한다는 지적은 사용자가 직접 제기.**
- **재검토 조건:** Phase1 rule-based 분류 도입 시.

### 결정 #16 — 크레딧 차감: 방 단위 → 턴 비율 〔rc5a 신규 · 번복〕
- **선택안:** 차감 단위 방→**턴 비율**. 턴당 차감=1/턴캡(무료 0.1/1단계 0.05/2·3단계 1/30). **응답 실패 시 무차감.** 연장 할증 5턴=**0.5코칭권**. 할증률·연장 한도(방당 2회) **설정값화.** 사용자 표시는 **회 단위로만**(토큰·원가는 내부 장부 = 이중장부).
- **배제안:** 방 단위 차감 / 토큰 기준 사용자 차감.
- **이유:** 방 단위는 실사용량과 괴리·역진성. 턴캡이 방당 상한을 고정하므로 턴 차감으로 바꿔도 방당 최대 원가 불변. 연장 4~6배 할증은 과도 → 0.5코칭권 인하.
- **사용자 의견·정서:** "체감 단위와 실제 비용이 따로 노는 구조"를 불편해함. 단발 질문에 무료 통소멸하는 "당했다" 체감 제거. 운영 리스크는 턴캡이 막아주니 UX를 친화적으로 가져가도 손해 없음에 안심.
- **재검토 조건:** 베타 실데이터(원가·전환율) 검증 후.
- **근거 산출물:** `spec_rc2_05a_plan_admin_v0.2_260606.md §1·§2.3`.

### 결정 #9 — 확장조회 + 반복패턴 압축
- **선택안:** 명확한 기간→자동 조회, 애매→사용자 확인. 반복패턴 압축·변화점 이벤트 표시. 기본 원칙 "애매하면 확인".
- **배제안:** 전체 원자료 상시 주입.
- **이유:** "압축은 토큰·성능 모두 유리 — 돈이 샐 수 있는 건 막고 성능도 그게 낫다."
- **사용자 의견·정서:** 본인 체성분 정체·유사 조깅 반복을 예로 들며 **압축을 직접 제안.**
- **재검토 조건:** Phase1 분류 도입 시.

---

<a id="s11"></a>
## 11. 스크린샷 모음 (전체 목록 + 캡션)

**신규 MCP 세션(2026-06-06)** — `assets-20260606_190000_rc2_final_audit/`

| 파일 | 캡션 |
|---|---|
| `coach-01-desktop-default.png` | 그림 1. `/coach` 진입 시 'AI 코치 대화' 기본 탭 + 메모리 카드 + 저장 게이트 OFF 안내 (데스크탑 1440×900) |
| `coach-06-exhaust-notice.png` | 그림 2. 소진 상태 전송 시 AI 미호출·무차감으로 '무료 AI 체험을 모두 사용했어요' 안내(베타 톤) |
| `coach-07-plan-shop-current.png` | 그림 3-좌. 플랜 쇼핑 패널 — 현재 데이터 "표시할 플랜이 없어요"(히든) |
| `coach-08-brief-tab-preserved.png` | 그림 4. 'AI 브리프' 탭 — 기존 브리프 화면 보존 |
| `coach-09-mobile-layout.png` | 그림 5. 모바일 390×844 단일 컬럼, 깨짐 없음 |

**spec06 라이브 당시 인용(대조용)** — 같은 폴더에 사본 포함

| 파일 | 캡션 |
|---|---|
| `prior-spec06-plan-shop-live.png` | 그림 3-우. spec06 당시 플랜 3종(4,900/7,900/11,900원·월 600/900/1,350회) 노출 |
| `prior-spec06-graceful-error.png` | spec06 당시 chat-proxy 미배포 graceful 오류 안내(사용량 무차감) — AI 실응답 N/A 대조 |
| `prior-spec06-desktop-chat-live.png` | spec06 당시 "AI 코칭 30회 남음(무료 체험)" 사용량 라이브 표시 — §6 빈 행 이슈 대조 |

---

<a id="s12"></a>
## 12. 데이터 계약 갱신 확인

이 문서는 **kb-inbox 인박스 단계**(소스 착지)다. 인박스 단계는 **파일 + assets + commit/push**까지이며, 아래 데이터 계약 재생성은 **편입(`/kb편입-inbox`) 시점**에 수행된다(인박스에서는 직접 수정·생성 금지).

| 산출물 | 위치 | 인박스 단계 갱신 | 편입 단계 갱신 |
|---|---|---|---|
| manifest | `knowledge/.../_gen_manifest.cjs` | ✕ (불필요) | ○ 재생성 필요 |
| context-router | `knowledge/pacelog-archive/_gen_router.cjs` | ✕ | ○ 재생성 필요 |
| ai-index | `knowledge/_gen_ai_index.cjs` | ✕ | ○ 재생성 필요 |
| navigation.md | (편입 대상 트리) | ✕ | ○ 편입 후 확인 |

- **인박스 단계(이번 작업):** manifest/router/ai-index/navigation 갱신 **불필요**. 파일·assets·commit/push만 수행.
- **편입 단계(후속):** `_gen_manifest.cjs`·`_gen_router.cjs`·`_gen_ai_index.cjs` **재생성 필요**. manifest/router/ai-index는 직접 수정 금지·스크립트로만 재생성. schema 변경 금지.

---

## 부록 A. 검수 중 발견한 문서 간 정합성 메모 (수정 대상 아님 · 기록용)

| # | 메모 | 성격 |
|---|---|---|
| A1 | `handoff_rc2_complete §5`는 "spec01~06 미커밋 유지"라 적혔으나 실제 PR#36 머지 완료 — 작성 시점차에 따른 불일치(현재는 커밋 완료가 사실) | 기록용 |
| A2 | spec05a가 구 인덱스(`spec_rc2_00`·`claude_handoff_rc2`, 2026-06-05)엔 부재, 최신 `handoff_rc2_complete`(rc5a 갱신)에만 포함 | 기록용 |
| A3 | spec03 작업보고에 PASS/FAIL 집계표 부재(서술형) — 타 spec과 형식 비대칭, 보완 권고 | 보완권고 |
| A4 | spec04 저장 SQL 실적용 worklog "추가 확인 필요" → RPC 라이브로 간접 확인, 직접 확인 권고 | 확인권고 |
| A5 | 신규 세션 사용권 빈 행 + 플랜 히든 = 시드 상태 변동 추정 — 코드 결함 아님 | 확인필요 |
