---
title: "핸드오프 — 코치노트 AI RC2 spec04(storage·privacy) 완료 / 다음 spec05(plan·billing)"
category: "handoff"
document_type: "핸드오프"
source_status: "original"
knowledge_group: "03_history"
priority: "High"
purpose: "코치노트 AI v1.0-rc2 4/6(storage·privacy) 완료 인계. 대화 원문 저장 4테이블·사용자 통제·★출시 전 필수 활성화 게이트(storageGate 기본 OFF)를 구현. 다음 담당 spec05(plan·billing)가 반드시 보존할 결정(저장 구조 존재 ≠ 무조건 활성화 / 자동 메모리는 Phase2 / 사용자 직접 삭제=기본 soft delete / hard delete 배치 가동 전 약관 '파기' 표현 금지)과 결제 연결 지점을 전달."
read_when: ["코치노트AI","저장·개인정보·삭제정책","다음작업·인수인계","의사결정추적"]
updated: "2026-06-06"
work_timestamp: "20260606_181438"
context: "달록본레포CC (D:\\dallog\\dallog_git)"
source_of_truth: "https://dallog-tools.hansbridge.co.kr/knowledge/"
---

# 핸드오프 — 코치노트 AI RC2 spec04(storage·privacy) 완료 / 다음 담당 spec05(plan·billing)

> 코치노트 AI v1.0-rc2 순차 구현(총 6분할) 중 **4/6 완료** 인계 문서. 최종 기준은 본레포 `docs/go_work` 원본 명세·decision_log. 충돌 시 원본 우선.
> 용어 병기: thread/대화방 · transcript/대화 원문 · soft delete/화면상 삭제(복구 가능) · hard delete/완전 파기 · storageGate/저장 활성화 게이트 · memory profile/메모리 프로필(수동 카드).

## 0. 현재 상태

| 항목 | 상태 |
|---|---|
| 담당 작업 | spec_rc2_04_storage_privacy (대화 저장 구조 + 활성화 게이트) |
| 완료 여부 | 완료(코드·구조). 저장 기능은 게이트로 **비활성**(의도) |
| build | PASS (`npm run build` tsc+vite) |
| 커밋 | 포함 — code 7b67435 / SQL 1ae2a6c / docs 16e7483 (PR#36 머지) |
| SQL 적용 | 마이그레이션 커밋됨, **Supabase 실제 적용은 사장님 수동 영역(미확인)** |
| 남은 위험 | 게이트를 임의로 켜면 보호장치 없이 민감정보 저장 위험 → `enabled=false` 유지 필수 |

## 1. 다음 작업자가 반드시 알아야 할 것

- **대화 저장 구조 존재 ≠ 무조건 활성화.** `storageGate.enabled` 는 5종 보호장치(개인정보처리방침·저장 고지·보유기간/삭제 정책·동의 UI·접근통제) 완비 전까지 **false 유지**. spec05가 이 게이트를 켜지 말 것.
- **자동 메모리는 Phase2.** `coach_memory_profile` 은 사용자 수동 입력 카드만. 대화 원문 기반 자동 기억 구현 금지(decision_log #10 — 미룬 목표이지 배제 아님).
- **사용자 직접 삭제 = 기본 soft delete**(30일 복구). 즉시 hard delete 를 기본값으로 바꾸지 말 것.
- **hard delete 배치는 구조만.** 실제 스케줄 가동 전 약관 "파기" 표현 금지(허위 고지 방지).

## 2. 구현된 내용

- **DB 4테이블**(`migrations/2026-06-06_coachchat_storage_privacy.sql` + `_GUIDE.html`):
  `coach_conversation`(대화방·핀·soft/hard 필드) / `coach_message`(원문, CASCADE) / `coach_storage_setting`(저장 동의 opt-in, 기본 false) / `coach_memory_profile`(수동 카드 4필드). 전 테이블 RLS 본인만.
- **트리거**: 보관함 30 한도(핀 제외, 오래된 것부터 soft delete) + 메시지 카운트/최근시각 유지.
- **RPC**: soft delete(30일 유예)·복구 / `coach_hard_delete_expired()`(구조만, authenticated 차단).
- **코드 게이트**: `storageGate.ts`(enabled=false) + 저장 helper 2종(conversationStore·memoryProfileStore) — 게이트 OFF면 DB 접근 전 no-op.

## 3. 수정 파일

| 파일 | 설명 |
|---|---|
| `src/lib/coachChat/storageGate.ts` | 신규 — 전역 활성화 게이트 + 5종 전제 |
| `src/lib/coachChat/conversationStore.ts` | 신규 — 저장 동의·대화방/메시지 저장·조회·핀·삭제/복구 |
| `src/lib/coachChat/memoryProfileStore.ts` | 신규 — 메모리 카드 저장/조회/삭제 |
| `src/lib/coachChat/types.ts` | 수정 — CoachConversation·StoredCoachMessage·CoachStorageSetting 추가 |
| `migrations/2026-06-06_coachchat_storage_privacy.sql(+_GUIDE.html)` | 신규 — 4테이블+RLS+트리거+RPC |

## 4. 검증 결과

| 검증 항목 | 결과 | 근거 |
|---|---|---|
| 타입·빌드 | PASS | tsc+vite 성공 |
| 게이트 OFF no-op | PASS | 저장 helper가 DB 접근 전 차단 |
| spec01~03 무영향 | PASS | 신규 파일만 추가(+types) |
| Supabase 실제 적용 | 추가 확인 필요 | 사장님 수동 영역 |
| UI/화면 검증 | N/A | spec06 소관 |

## 5. 사용자 의도·정서·지침 (반드시 보존)

- **"저장 가능 ≠ 무조건 활성화 — 보호장치가 먼저."** 사용자는 LLM이 개인정보·삭제·보안 같은 비화폐적 부담을 "나중 일"로 미루는 경향을 경계했다(master_index A-1). 저장부터 켜는 순서 역전을 명시 금지. 이것이 spec04의 정서적 핵심.
- **유료계약 책임으로서의 저장.** 초기 GPT안("원문 미저장")을 "원문 저장 + 사용자 통제"로 번복(decision_log #6). 저장비용만을 이유로 회피 금지.
- **자동 메모리는 미룬 목표이지 배제가 아님.** 수동 카드를 "종착점"으로 오해받는 것을 경계(decision_log #10). spec05/06은 수동 카드를 폄하하거나 자동 메모리를 임의 선구현하지 말 것.
- **사용자 데이터 통제권.** 삭제는 기본 soft delete(30일 복구)로 두되 즉시 영구삭제도 선택 가능 — 운영자 편의가 아니라 사용자 권리 우선.

## 6. spec05(plan·billing) 연결 지점

- **대화방 차감**: decision_log #4 — 첫 사용자 메시지 전송 시 차감, 추가 5턴 연장마다 월 제공 대화방 1개 차감(방당 최대 2회). 대화방 엔티티 = `coach_conversation`. 생성/차감을 결제·월제공량과 연결하는 것은 **spec05 소관**(이번 spec04는 차감 미구현).
- **plan_type**: `coach_conversation.plan_type`·`coach_request_log.plan_type` 둘 다 CHECK. 플랜별 제공량은 decision_log #3.
- **턴 연장 차감은 결제 Phase에 묶음**: 베타(결제 미적용)에선 턴캡 도달 시 "새 대화방 권장"까지만, 연장 차감 비활성(decision_log #4 / master_index C-3).

## 7. 다음 추천 작업

1. spec05: 게이트 `enabled=false` 유지하며 결제·월제공량·대화방 차감 연결(베타 연장 차감 비활성).
2. spec06: 저장 동의 UI·메모리 카드 입력·보관함 목록·삭제/복구 버튼을 본 helper로 구현.
3. 출시 전(사장님·달록툴CC): 5종 보호장치 + 약관(법률 자문) 완비 → `storageGate.enabled=true` 재배포. hard delete 배치 구현 후에만 약관 "파기" 표현 허용.
