# task-2982 (루/Lugh) — InsuRo 개인정보 정책 완성도 + 로드맵 이행 실측 (read-only)

> 대상: `/home/jay/projects/InsuRo` main `49c17a92` (`.worktrees/`, `InsuRo-worktrees/` 제외)
> 조사일: 2026-08-20. 코드/DB/git 실측만. 화면(브라우저) 노출 점검은 본 조사 범위 밖(별도 담당).

---

## 0. ★★★ 최우선 발견 — 정책 문서 자체가 git에 없다

```
$ git status docs/privacy-p0-p2-roadmap-260807.md docs/privacy-policy-audit-and-draft-260807.md
Untracked files:
	docs/privacy-p0-p2-roadmap-260807.md
	docs/privacy-policy-audit-and-draft-260807.md
$ git log --all --diff-filter=A -- "docs/privacy*"   → (결과 없음)
$ git ls-files | grep -i privacy                       → (결과 없음)
```

2026-08-07에 작성된 감사 문서 2건(`docs/privacy-policy-audit-and-draft-260807.md` 188줄, `docs/privacy-p0-p2-roadmap-260807.md` 91줄)은 **한 번도 커밋된 적이 없다**. 로컬 워킹트리에만 존재하는 untracked 파일이며, 이 로컬 clone(`/home/jay/projects/InsuRo`)을 벗어나면 존재 자체가 사라진다. 처리방침 "초안"은 배포는커녕 **버전관리 대상도 아니었다** — 심각도 **P0**.

---

## 임무 1: 정책 완성도 체크리스트 7항목

| # | 항목 | 판정 | 근거 |
|---|---|---|---|
| 1 | 수집 항목 | **부분** | 초안 문서(제1조)에 항목 열거는 되어 있고 코드 감사(A-1)와 대체로 일치. 그러나 문서 자체가 미커밋(§0)이라 "명시된" 상태 자체가 로컬 한정. 실제 코드 수집 항목(오마이 캡처 주민 앞8자리, 통화 녹음 전문, MediScan 의료문서 등)은 여전히 존재(`server/main.py:7869`,`7340`,`server/mediscan_router.py:240`) — 코드-문서 불일치는 없으나 **문서 자체가 미게시** |
| 2 | 보관 기간 | **부분** | `mediscan_jobs.expires_at`은 DB 컬럼에 `DEFAULT now() + INTERVAL '90 days'`로 실제 존재(`server/migrations/mediscan_jobs.sql:16`)하나, **이 만료를 근거로 실제 삭제하는 배치/cron이 코드에 전혀 없음**(`grep -rln "cleanup_mediscan\|DELETE FROM mediscan"` 0건, systemd timer는 `insuro-trend-collector.timer` 1개뿐 — mediscan 관련 없음). `compliance_consents.expires_at`도 조회 시 `.gte(expires_at, now)` **필터링**만 되고(`server/main.py:1328,4616`) 만료 후 실제 DELETE 코드 0건. 즉 "TTL 컬럼은 있으나 파기 로직 없음" — 문서(제2조)도 "【보유기간 정책 미정】"으로 자인 |
| 3 | 제3자 제공 | **존재(문서)/실측 일치** | 문서 제4조 "광고·판매 목적 제3자 제공 없음"은 코드상 결제/PG 미구현(`PlanUpgradeDialog.tsx:241` TODO)과 일치. 다만 문서 자체 미커밋(§0)이라 대외 공표 불가 상태 |
| 4 | 처리 위탁 | **부분** | 문서 제5조에 Supabase/Google/Anthropic/PostHog 표가 있으나 Supabase 리전은 "【미국 추정】", 국외이전 고지는 "필요할 수 있음" 수준의 경고문으로 남아있고 확정 문구가 아님. 코드상 실제 국외 전송 경로(Anthropic `server/ai_parser.py:141`, Google Drive `server/gdrive.py`)는 실재 |
| 5 | 파기 절차 | **부분** | 코드상 파기 기능 자체는 일부 존재(고객 하드삭제, 상담이력 hard-delete `server/routes/consultation_history_v1.py:676-726`, MediScan 삭제 라우트). 그러나 **회원 탈퇴(계정삭제) 기능은 코드 전체에서 0건**(`grep -rln "탈퇴\|withdraw" src/ server/` → 매칭 없음, consultation 관련 파일 외 전무). 고객 삭제 시 Drive/상담이력 cascade도 여전히 없음(`src/pages/CrmCustomers.tsx:216`은 `customers` 테이블만 delete) |
| 6 | 이용자 권리 | **부재** | 열람·정정·삭제·처리정지를 고객이 **직접** 행사할 API/화면 0건(`grep -rn "열람\|정정\|처리정지" server/main.py src/` → 매칭 없음). 로드맵 P1-2는 "설계사 경유"로 **정책 결정**(코드 불필요 확정)했으나, 이는 문서 반영/공표가 아직 안 된 결정일 뿐 — 처리방침 문구 자체도 미게시(§0) |
| 7 | 문의 채널 | **부재(플레이스홀더)** | 문서 제7조: `개인정보 보호책임자: 【성명 / 직책 기입】`, `연락처: 【전화 / 이메일 기입】`(`docs/privacy-policy-audit-and-draft-260807.md:151-152`) — 전부 빈칸. 코드 전체에 `privacy@`,`dpo@`,`contact@` 형태 이메일 0건(`grep -rn "@insuro\|contact@\|privacy@\|dpo@" src/` → 매칭 없음). 회사명·사업자번호·시행일도 전부 `【 】` 미기입 |

**요약**: 7항목 중 "부재" 2건(이용자 권리, 문의 채널), "부분" 4건(보관기간·처리위탁·파기절차·수집항목), "존재(단, 미게시)" 1건(제3자 제공). **완전히 "존재"로 판정할 항목은 0건** — 모든 항목이 "초안에는 문장이 있으나 실제 반영/공표는 안 됨" 상태.

---

## 임무 2: P0~P2 로드맵 이행 상태 실측

| 과제 | 로드맵 원 상태 | 실측 판정 | 근거 |
|---|---|---|---|
| **P0-1** Drive 공개제거+서버 프록시 | ✅ 확정 | **완료 확인** | `server/gdrive.py:141,185,239` 주석에 "공개 권한 생성 제거" 명시, `GET /api/insuro/file/{ticket_id}`(`server/main.py:5992`) 및 `POST /api/insuro/file-ticket`(`server/main.py:5906`) 실존. git log에 `f81085f`(Phase1)~`c880cef`~`c4a256a`~`b21b04b`(PR#203 병합)~`2ff966f`(Phase3 소급회수) 커밋 체인 확인. 프론트 링크 8곳도 프록시로 교체됨(`82753da` 커밋 메시지) |
| **P0-2** AI 무학습·제로보존 헤더 | 신규 | **부분 완료 — 대상 파일 불일치** | 실제 구현은 `ai-provider.ts`/`ai_parser.py`/`policy_analyzer.py`(원 로드맵 지정 파일)가 아니라 **Supabase Edge Functions 3개**(`analyze-customer`,`transcribe-call`,`evaluate-consultation`)의 `callAI("gemini-2.0-flash-lite",...)` → `callAI("anu-system",...)` 전환으로 구현됨(task-2933 PR#205, task-2936 PR#206; 현재 파일에서 `anu-system` 3건 확인). **반면 로드맵이 명시한 `server/ai_parser.py`(증권 PDF 분석, `anthropic.AsyncAnthropic` SDK 직접 호출, `server/ai_parser.py:141`)와 `server/policy_analyzer.py`(claude CLI subprocess)는 no-train/zero-retention 헤더·파라미터가 전혀 없음**(`grep -n "headers\|beta\|no.train\|zero.retention" server/ai_parser.py server/policy_analyzer.py` → 매칭 0건). 즉 "고객 상담 PII(대화·통화)" 경로는 막았으나 "증권 PDF(PII: 이름·생년월일 포함)"를 Anthropic으로 보내는 경로는 원래 우려 대상 그대로 방치 |
| **P0-3** 공개 상담폼 최소 수집 고지 | 신규(소규모) | **미구현** | `src/pages/DigitalNamecard.tsx`에 동의/고지/consent/notice 문구 매칭 0건(`grep -n "동의\|고지\|consent\|notice\|목적\|처리방침" src/pages/DigitalNamecard.tsx` → 결과 없음). 여전히 방문자가 이름/전화 입력 시 아무 고지 없이 즉시 `supabase.from("customers").insert(...)`(`src/pages/DigitalNamecard.tsx:89-97`) |
| **P0-4** 프론트 고객저장→서버 단일 경로 | 신규(Codex 지적) | **미구현** | `src/pages/CrmCustomers.tsx:176` `supabase.from("customers").insert({...})` — 여전히 **프론트에서 Supabase 직접 insert**. 서버 경유 단일화 코드/커밋 없음. `src/pages/DigitalNamecard.tsx:68,79,90`도 동일하게 직접 insert/update. 두 파일 모두 로드맵이 지목한 그대로 남아 있음 |
| P0-5~P0-7 (위탁계약/처리방침 위탁명시/국외위탁 공개) | 문서·계약 | **미확인(회장+법률 영역)** | 코드 조사 범위 밖. 단, §0에서 확인했듯 처리방침 문서 자체가 미커밋 상태라 "위탁 명시"가 반영될 대상 문서도 미공표 상태 |
| **P1-1** 회원 탈퇴+통합 파기 | 미구현 | **미구현(변동없음)** | 전 코드베이스에 탈퇴/계정삭제 API 0건 |
| **P1-2** 열람·정정·삭제 요청(설계사 경유) | ✅ 확정 | **정책결정 완료(코드 불필요로 확정)** | 코드 구현 자체가 필요 없다는 결정이므로 "미구현"이 아니라 "결정대로 무코드" — 단, 처리방침 문구 반영 여부는 §0 미게시로 확인 불가 |
| `customers.privacy_consent_at` 프론트 기입 여부 | — | **여전히 미기입** | `grep -rn "privacy_consent_at" src/ server/ supabase/` → `src/integrations/supabase/types.ts` 타입 정의와 마이그레이션 SQL(`supabase/migrations/20260308182257_*.sql:31`, `supabase/combined-migration.sql:928`)에만 존재. `CrmCustomers.tsx:176`·`DigitalNamecard.tsx:90,111`의 실제 insert 페이로드에는 **`privacy_consent_at` 필드 자체가 없음** — 컬럼은 있으나 아무도 안 채움(감사 문서 A-2 지적사항 그대로 잔존) |

### 부가 실측 (로드맵 P2 항목 스팟체크)
- **P2-1a** (고정 salt→HMAC): **미구현**. `server/pii_crypto.py:72-76` 여전히 `PII_HASH_SALT` 단일 전역 salt로 SHA-256 해시 생성. 코드 주석 자체가 "rainbow table 위험 ↑"라고 자인한 상태 그대로.
- **P2-3** (policy_analyses RLS): 로드맵상 완료 처리 — 본 조사에서 재검증 안 함(미확인).

---

## 임무 3: 과거 검토 이력 추적

### git 커밋 이력 (docs/privacy* 경로 자체는 커밋 0건, 대신 관련 코드 커밋으로 추적)
| 커밋 | 태스크 | 내용 | 병합 여부 |
|---|---|---|---|
| `f81085f`,`c489e65`,`22c3f3c`,`c880cef`,`c4a256a`,`82753da`,`b21b04b`(PR#203),`2ff966f` | task-2927/2928/2929/2930/2931/2932 | P0-1 Drive 프록시 Phase1~3 | **MERGED** (main 반영 확인) |
| `aaaea67`,`9bb131f`,`e5e6f89`(PR#205) | task-2933 | analyze-customer/transcribe-call Gemini→anu-system | **MERGED** |
| `e2cab5e`,`c2a9c57`,`2f787ff`(PR#206) | task-2936 | evaluate-consultation Gemini→anu-system (task-2933 누락분 보완) | **MERGED** |

### memory/tasks, memory/reports 상 개인정보 관련 태스크
- `/home/jay/workspace/memory/reports/task-2928.md` — P0-1 Phase1.5 백엔드 보완. **완료**(L1 스모크 200/401/404 실측, pytest 1377 passed/1 failed(base 기존 결함, 무관)).
- `/home/jay/workspace/memory/reports/task-2933.md`, `task-2936.md` — P0-2(고객 PII 경로만) **완료**. 단, 보고서 자체에 "★ 배포 필요 사항(ANU 조율)" 명시 — Supabase Edge Function secret(`ANU_SYSTEM_URL`,`ANU_API_KEY`) 설정 및 `supabase functions deploy`가 봇 권한 밖(ANU 수동)이라고 기록됨. **실제 프로덕션 배포·secret 설정 여부는 본 조사에서 미확인**(코드는 main에 병합되어 있으나 Edge Function 배포/시크릿 상태는 Supabase 콘솔 확인 필요 — read-only 코드 조사 범위 밖).
- `/home/jay/workspace/memory/tasks/dispatch-insuro-evaluate-consultation-anu-260810.md` — task-2936 위임 원문(교차 확인용).
- P0-3/P0-4/P1-1에 대응하는 별도 완료 task 기록은 `memory/tasks/`, `memory/reports/`에서 **발견되지 않음** — 즉 로드맵에 "신규" 표기된 이 3개 과제는 **위임된 적조차 없어 보임**(위임 이력 부재 = 착수 안 됨과 일치하는 정황 증거).

### 판정 요약
- P0-1(Drive), P0-2 중 "고객 상담 PII" 부분만 **실제 완료+병합**.
- P0-2 중 "증권분석 AI 경로"(ai_parser/policy_analyzer), P0-3, P0-4, P1-1은 **착수 이력 자체가 없음**(위임 기록 부재 + 코드 미반영 이중 확인).
- 처리방침 문서 2건은 **애초에 git에 오른 적이 없어** "과거 검토했으나 반영 안 됨"이 아니라 "로컬 산출물로만 존재, 배포 트랙 자체에 오르지 않음"이 정확한 표현.

---

## 결함 목록 (심각도)

| 심각도 | 결함 | 근거 |
|---|---|---|
| **P0** | 처리방침/로드맵 문서 2건이 git 미커밋 — 유실 위험 + 대외 공표 불가 | §0 |
| **P0** | 이용자 권리행사 채널·개인정보 보호책임자 연락처 완전 미기입(플레이스홀더만 존재), 코드 어디에도 실제 연락처 없음 | 체크리스트 #6,#7 |
| **P0** | 공개 상담폼(`DigitalNamecard.tsx`)이 여전히 고지 없이 고객 정보 즉시 저장 (P0-3 미구현) | 로드맵 P0-3 |
| **P0** | `CrmCustomers.tsx`/`DigitalNamecard.tsx`가 여전히 프론트→Supabase 직접 insert, 서버 통합 미완 (P0-4 미구현) — 신규 레코드가 계속 "동의시각 미기록" 상태로 쌓이는 중 | 로드맵 P0-4, `privacy_consent_at` |
| **P1** | 증권분석 AI 경로(`ai_parser.py`,`policy_analyzer.py`)는 P0-2 무학습 전환 대상에서 누락 — 고객 이름·생년월일 포함 PDF가 여전히 무보호 상태로 Anthropic 전송 | 임무2 P0-2 행 |
| **P1** | 회원 탈퇴+통합 파기(P1-1) 미착수, 고객 삭제 시 Drive/상담이력 cascade 없음 | 체크리스트 #5 |
| **P1** | `mediscan_jobs.expires_at`(90일), `compliance_consents.expires_at`(30일) 모두 DB 컬럼만 있고 실제 만료 삭제 배치 없음 | 체크리스트 #2 |
| **P2** | `pii_crypto.py` 고정 salt 미해소(P2-1a) — rainbow table 위험 잔존 | 임무2 부가 |

---

## 미확인 사항 (추측 금지)
- Supabase Edge Function(`analyze-customer`,`transcribe-call`,`evaluate-consultation`)의 실제 배포·secret(`ANU_API_KEY`) 설정 여부 — task-2933/2936 보고서상 "ANU 수동 설정 필요"로 남아 있었고, 본 조사는 로컬 코드/git만 봤으므로 프로덕션 Supabase 콘솔 상태는 미확인.
- 처리위탁 계약서(P0-5) 실제 체결 여부, Supabase 데이터센터 리전 확정 여부 — 코드 밖 영역, 미확인.
- 화면(브라우저) 노출 점검 4시나리오 — 본 임무(루/백엔드) 범위 밖, 미수행.
