# [InsuRo P0-1] Drive 프록시 Phase 2 — 프론트 링크 프록시 배선 (task-2930, 260809) ANU 독립검증 완료 · 머지+배포 HOLD

- 팀: dev1-team(헤르메스), 이리스(프론트 sonnet)/아르고스(테스터 sonnet)
- 브랜치: `task/task-2930-dev1` head **067815b** (원격 동기), base=origin/main **f2b282e** (현재 remote main과 동일 → 2929 의존 없이 독립)
- 워크트리: `/home/jay/projects/InsuRo/.worktrees/task-2930-dev1`
- 완료 정책: **finalize-only (머지=ANU)** · Gemini PR OFF(리뷰=Codex+ANU) · PR/CI 미개설(로컬 워크트리 종결) → CI watcher N/A

## 무엇
P0-1 Drive 개인정보 프록시의 프론트 배선. 백엔드 Phase1+1.5(task-2927, file-ticket 등급별 IDOR 인가 + 1회용 스트리밍 프록시)는 이미 라이브. 프론트 7~8곳이 Drive `/view` 직접 URL을 `window.open`/`<a href>`로 열어 접근통제를 우회하던 것을, 신규 헬퍼 `src/lib/driveFile.ts`(2종)를 통해 서버 프록시(file-ticket→스트리밍)로 교체.

- 헬퍼: `requestFileTicket(fileUrl,mode)` = supabase 세션 Bearer + `POST /api/insuro/file-ticket {file_url,mode}` → `${API}/api/insuro/file/{ticket_id}` 반환. `openFileViaProxy` = **팝업차단 회피**(클릭 즉시 동기 `window.open("","_blank")` → await ticket → `w.location.href=url`, 차단 시 throw+`w.close()`).
- 배선 8곳: PolicyAnalysis(증권 PDF=download), AdminNewsletters/AdminPremiumData(원본=view), ReviewDetailPanel(이미지 프리뷰 view-ticket useEffect + 앵커→버튼 view), AdminFcpa(현재 파일명=view), FcpaGuide(법률 전문=download). 라벨-동작 일치.

## ANU 독립검증 (clean worktree, 260809)
- 워크트리 git status **clean**, 스코프 **9파일 전부 src/**(+298/-26) — server/·.env·.github 겹침 0
- 백엔드 계약 **정확 일치**: 서버 `main.py:5941` 응답 `{"ticket_id",...,"mode"}` ↔ 헬퍼 `data.ticket_id`. `/api/insuro/file/{ticket_id}` 엔드포인트·`mode` 필드·IDOR 가드(`main.py:5886 file_ticket_idor_denied`) 실재(task-2927 Phase1)
- 팝업차단 회피 순서 로직 정검토 OK(동기 window.open이 클릭 제스처 내)
- **vitest 79파일/1174 전부 PASS·회귀 0** / **tsc --noEmit exit 0** / **npm run build PASS**(11.65s, PWA 176 precache)
- 판정: **MERGE-READY**

## HOLD 사유
Phase 2는 **무중단**(파일 아직 anyone 공개라 프록시·직접링크 둘 다 열림). 실제 프록시 강제는 CF Pages 프론트 배포 후. P0-1 스택(2927 머지+배포HOLD / 2928+2929 함께 머지HOLD / 2930) 전체가 **coordinated 단일 재배포**(systemd insuro-api + CF Pages) 대기. 배포 전 **Codex 재조율** 필요(report 명시).

**회장 결정 대기**: (1) 스택 coordinated 머지+배포 go (2) Codex 조율 후 CF Pages 프론트 배포(`source .env.keys` → `wrangler pages deploy dist --project-name insuro --branch main`). Phase 3(anyone 제거 + 소급 회수)는 별도 회장 결정.

## 미해결→해결
ReviewDetailPanel 테스트 2건: 앵커→버튼 전환 + img src=비동기 ticket 때문에 구 동작(getByRole("link")+href, 직접 src) 실패 → 새 동작(role=button, `not.toHaveAttribute("href")`, img src=프록시, `@/lib/driveFile` mock)으로 테스트 갱신. **프로덕션 코드 무수정**. 재실행 전건 PASS.

상세 보고서: `memory/reports/task-2930.md`
관련: [[project_insuro_drive_proxy_fcpa_drive_file_id_gap1_task2929_260809]] · [[project_insuro_drive_public_removal_proxy_p0_1_phase1_task2927_260808]]
