---
title: "작업보고 — 코치노트 AI RC2 spec04: 대화 저장 구조·개인정보 활성화 게이트"
category: "workreport"
document_type: "작업보고"
source_status: "generated"
knowledge_group: "03_history"
priority: "High"
purpose: "코치노트 AI v1.0-rc2 6분할 중 4/6(storage·privacy) 구현 기록. 대화 원문(transcript) 저장 구조 4테이블 + 사용자 통제(저장 동의·soft/hard 삭제·복구) + ★출시 전 필수 '구현≠활성화' 코드 게이트(storageGate, 기본 OFF)를 구현. 저장 가능 ≠ 무조건 활성화 — 5종 보호장치 완비 전 비활성 원칙을 코드 상수로 잠금. 메모리 프로필(수동 카드) 영속화 포함, 자동 메모리는 Phase2."
read_when: ["코치노트AI","저장·개인정보·삭제정책","최신상태복구","의사결정추적"]
updated: "2026-06-06"
work_timestamp: "20260606_181057"
context: "달록본레포CC (D:\\dallog\\dallog_git)"
source_of_truth: "https://dallog-tools.hansbridge.co.kr/knowledge/"
---

# 작업보고 — 코치노트 AI RC2 spec04: 대화 저장 구조·개인정보 활성화 게이트

> 코치노트 AI v1.0-rc2 순차 구현(총 6분할) 중 **4/6 storage·privacy** 담당 세션 기록.
> 원본 명세 `docs/go_work/spec_rc2_04_storage_privacy.md`(단일 기준) / decision_log #6·#10 / master_index C-1 기반.
> 용어 병기: thread/대화방 · transcript/대화 원문 · soft delete/화면상 삭제(복구 가능) · hard delete/완전 파기 · storageGate/저장 활성화 게이트 · memory profile/메모리 프로필(수동 카드).

## 0. 요약

코치노트 AI가 "지난 대화·운동 여정을 기억하는 코치"가 되도록 **대화 원문(transcript) 저장 구조**(4테이블)를 만들되, 사용자가 자기 데이터를 통제(저장 동의·삭제·복구)할 수 있게 하고, **출시 전 개인정보 보호장치 5종이 완비되기 전에는 저장이 켜지지 않도록 코드 게이트로 잠가** 뒀다. 핵심 원칙 = **데이터를 많이 저장하는 AI가 아니라 "사용자 허락 아래 오래 기억하는 코치"** — 저장 가능 ≠ 무조건 활성화. 빌드 통과, 코드·SQL·문서 커밋 완료(PR#36). **저장 기능은 게이트 OFF로 의도적 비활성** 상태다.

## 1. 작업 배경 / 목적

- **배경:** rc1 초기 GPT안은 "원문 미저장 + 메타정보만 저장"이었으나, 사용자가 **"원문 저장 + 보관한도 + 2단계 삭제 + 사용자 통제"로 번복**(decision_log #6). 유료 AI 서비스라면 대화 열람·보관도 서비스 가치이자 계약 책임이라는 판단.
- **사용자 의도·정서(보존 필수):** 사용자는 회의에서 LLM이 개인정보·삭제·보안 같은 **비화폐적 작업부담을 "나중 일"로 미루는 경향**을 경계했다(master_index A-1). 그래서 "저장부터 켜고 보호장치는 나중에"라는 순서 역전을 명시 금지 — **보호장치가 먼저**. 이것이 spec04의 정서적 핵심이다.
- **목적:** 저장 구조는 구현하되, 활성화는 보호장치 완비 후로 분리(★출시 전 필수).

## 2. 적용 기준

| 구분 | 내용 |
|---|---|
| 적용 명세 | `spec_rc2_04_storage_privacy.md` (대화 원문 저장 단일 기준) |
| 적용 결정로그 | #6(저장 번복·구현≠활성화), #10(메모리 프로필 Phase0 수동·자동은 Phase2) |
| 적용 지침 | master_index A-1(임의 축소 금지), C-1(민감정보 전제·보호장치 먼저) |
| 금지사항(준수) | 자동 메모리 생성 / 결제·플랜(spec05) / 채팅 UI(spec06) / spec01~03 재설계 / 마이그레이션 자동적용 |

## 3. 구현 범위

### 3-1. DB 4테이블 (마이그레이션 — 사장님 Supabase 수동 적용)

| 테이블 | 역할 | 핵심 |
|---|---|---|
| `coach_conversation` | 대화방(보관함) | 핀 고정·`deleted_at`(soft)·`hard_delete_after`·`last_message_at`. 무료 체험 포함 |
| `coach_message` | 대화 원문 transcript | conversation FK **CASCADE**. UPDATE 정책 없음 = 사후 변조 금지 |
| `coach_storage_setting` | 사용자 저장 동의/선택 | `transcripts_enabled` 기본 **false(opt-in)** + `consented_at` |
| `coach_memory_profile` | 수동 메모리 카드 4필드 | goal·caution(주의통증=**민감정보**)·exercise_pref·coaching_pref |

- 전 테이블 **RLS 본인만**(마스터 우회 없음). 메시지 INSERT는 대화방 소유까지 EXISTS 확인.
- **보관함 30개 한도**: `coach_enforce_archive_limit` 트리거 — 초과 시 오래된 **비핀** 대화방부터 soft delete(핀 제외).
- **2단계 삭제**: `coach_soft_delete_conversation`(30일 유예) / `coach_restore_conversation`(유예 내 복구) RPC. 사용자 직접 삭제도 기본 soft delete.
- **hard delete 배치**: `coach_hard_delete_expired()` **구조만**(SECURITY DEFINER + authenticated 권한 REVOKE). 실제 스케줄(pg_cron) 가동은 후속 — ⚠ 가동 전 약관 "파기" 표현 금지(허위 고지 방지).

### 3-2. 활성화 게이트 (★출시 전 필수 — 코드 상수)

- `storageGate.ts`: `COACH_STORAGE_ACTIVATION.enabled = false`(기본 OFF) + 5종 보호장치 전제 문서화 + `isCoachStorageEnabled()`.
- 모든 저장 helper가 쓰기 전에 게이트 확인 → OFF면 **DB 접근 없이 즉시 no-op**. 표가 깔려도 게이트 OFF면 한 줄도 저장 안 됨.
- **5종 보호장치(완비 전 활성화 금지):** ① 개인정보처리방침 ② AI 대화 저장 고지 ③ 보유기간·삭제·파기 정책 ④ 사용자 동의 UI ⑤ 접근통제·보안.

## 4. 수정 파일

| 파일 | 변경 | 비고 |
|---|---|---|
| `src/lib/coachChat/storageGate.ts` | 신규 | 전역 활성화 게이트 + 5종 전제 |
| `src/lib/coachChat/conversationStore.ts` | 신규 | 저장 동의·대화방/메시지 저장(게이트 통과 시)·조회·핀·삭제/복구 |
| `src/lib/coachChat/memoryProfileStore.ts` | 신규 | 메모리 카드 저장/조회/삭제(DB↔타입 매핑) |
| `src/lib/coachChat/types.ts` | 수정 | `CoachConversation`·`StoredCoachMessage`·`CoachStorageSetting` 타입 추가 |
| `migrations/2026-06-06_coachchat_storage_privacy.sql` | 신규 | 4테이블+RLS+트리거+RPC (UNIT 1~6) |
| `migrations/2026-06-06_coachchat_storage_privacy_GUIDE.html` | 신규 | 비개발자용 실행 가이드(1박스=1실행) |

## 5. SQL 적용 여부

- 마이그레이션 파일 **커밋 완료**(commit 1ae2a6c). **Supabase 실제 적용은 사장님 수동 영역** — 본 세션에서 적용 결과 미확인(아래 §9 미해결).
- 적용 방식: SQL Editor에서 UNIT 1→6 순 "각 유닛 따로" 실행. UNIT 6은 검증용([1회성]).

## 6. 빌드 결과

- `npm run build`(tsc + vite) **PASS** — 신규 파일 타입 오류 없음. 기존 spec01~03 흐름 무영향(파일 무수정).

## 7. 기능 검증 결과

| 검증 항목 | 결과 | 근거 |
|---|---|---|
| 타입·빌드 | **PASS** | tsc+vite 성공 |
| 게이트 OFF no-op(코드 리뷰) | **PASS** | `createConversation`=null / `persistMessages`·`saveMemoryProfile`={stored:false,'gate_disabled'} |
| spec01~03 무영향 | **PASS** | 신규 파일만 추가(+types 타입 추가) |
| MCP 브라우징/화면 검증 | **N/A** | 채팅·보관함 UI는 spec06 소관(이번 범위는 저장 구조·helper) |

## 8. 명세 대비 구현 완료 여부 (spec §6 완료 정의)

| 명세 요구 | 완료 | 근거 |
|---|---|---|
| 대화 원문 저장(무료 체험 포함) | **PASS** | coach_message·coach_conversation, persistMessages |
| 보관함 30 한도+핀 제외+오래된 것부터 soft delete | **PASS** | coach_enforce_archive_limit 트리거 |
| soft(30일)→hard 2단계 설계(배치 후속) | **PASS** | soft/restore RPC, hard 구조만 |
| 활성화 게이트(5종 미완 시 비활성) | **PASS** | storageGate enabled=false |
| 민감정보 처리 전제 | **PASS** | caution 민감정보, RLS 본인만 |
| 사용자 통제권(동의·삭제·복구) | **PASS** | coach_storage_setting + helper |

## 9. 미해결 / 보류 / 후속 작업

| 항목 | 상태 | 후속 |
|---|---|---|
| SQL Supabase 실제 적용 | 확인 필요 | 사장님 적용 후 결과 회신 |
| 5종 보호장치 + 약관(법률 자문) | 미구현(의도된 게이트 OFF) | 출시 전 필수 — 완비 후 게이트 ON 재배포 |
| hard delete 배치 자동 스케줄 | 보류(명세상 후속) | 배치 가동 후에만 약관 "파기" 표현 |
| 저장 동의 UI·메모리 카드 입력·보관함 화면 | 범위 밖 | spec06 frontend_ux |
| 대화방 차감·월 제공량 연결 | 범위 밖 | spec05 plan_billing |
| 자동 메모리 생성 | 보류(Phase2) | decision_log #10 — 미룬 목표(배제 아님) |

> **축소 아님:** 위 미구현은 작업자 편의 축소가 아니라 명세가 명시한 범위 경계·후속·Phase 분리다.

## 10. 의사결정 기록 (5요소)

**결정 A — 활성화 게이트를 코드 상수로(DB 런타임 토글 아님)**
- 선택안: 코드 상수 게이트(기본 OFF)
- 배제안: DB 플래그 테이블 런타임 토글
- 선택 이유: 운영 토글이 아니라 출시 전 보호장치 완비 확인용 안전 잠금. 실수로 데이터가 저장을 켜는 사고 원천 차단
- 사용자 의견·정서: "보호장치 완료 전엔 코드 변경 없이는 활성화되지 않아야 한다" — 단호. 승인
- 재검토 조건: 운영 중 런타임 토글 필요성 발생 시 DB 플래그 별도 검토

**결정 B — 메모리 프로필 영속화 spec04 포함**
- 선택안: coach_memory_profile 테이블+helper 포함
- 배제안: transcript만 다루고 메모리 카드는 별도 후속
- 선택 이유: spec03 핸드오프 인계 + caution(주의통증)이 건강(민감)정보라 storage/privacy 계층에서 동의·저장·삭제를 함께 관리하는 게 일관적
- 사용자 의견·정서: 승인. 단 자동 메모리는 미구현(Phase2), 입력 UI는 spec06 유지
- 재검토 조건: 자동 메모리 도입 시(Phase2)

## 11. 최종 판단

- 이 작업 단위는 **완료**(코드·구조 기준, spec §6 완료 정의 충족). 단 사용자 대상 **"활성화"는 5종 보호장치 완비까지 별개**(출시 전 필수).
- 사용자 확인 필요 2건: ① SQL Supabase 실제 적용 여부 ② 보호장치·약관(법률 자문) 진행 상황.

## 12. 관련 산출물 위치(본레포)

- 원본 명세/작업로그: `docs/go_work/spec_rc2_04_storage_privacy.md`, `worklog_spec04_storage_privacy.md`(§7 KB보정 포함), `handoff_spec04_to_spec05.md`(§5 KB보정 포함)
- 커밋: code 7b67435 / SQL 1ae2a6c / docs 16e7483 (PR#36 머지)
