# [InsuRo P0-1] Drive 프록시 Phase 2 폴리시 — 라벨-동작 일치 + 이미지 ticket 캐싱

## allowed_resources

```yaml
allowed_resources:
  paths:
    - "src/lib/driveFile.ts"
    - "src/lib/__tests__/**"
    - "src/pages/PolicyAnalysis.tsx"
  forbidden_paths:
    - ".env"
    - ".env.*"
    - ".github/**"
    - "server/**"
  commands:
    - "npm"
    - "npx"
    - "node"
  merge_policy: "tiered"
  ttl_hours: 24
```

## 배경
P0-1 Drive 프록시 Phase 2(task-2930, 프론트 배선) 완료·머지대기. Codex 교차검증에서 **소소 2건** 도출 → 본 폴리시로 보완 후 재조율→GO 예정.
- 작업 base: **현재 main**(`git merge-base` 아닌 최신 main = Phase1+1.5+2930 예정). task-2930 브랜치 위에 이어서 하거나 신규 브랜치. driveFile.ts/PolicyAnalysis.tsx는 task-2930에서 이미 프록시 배선됨.

## 수정 (2건, 소규모)
1. **PolicyAnalysis 라벨-동작 일치** (`src/pages/PolicyAnalysis.tsx:602,609` 부근): "원문 PDF 보기" 버튼이 `mode="download"`를 호출해 라벨(보기)과 동작(다운로드)이 불일치. **`mode="view"`로 변경**(inline 브라우저 표시) → 다른 7곳과 일관. (증권 PDF를 브라우저에서 보기)
2. **이미지 ticket 캐싱** (`src/lib/driveFile.ts`): view 모드 ticket이 매 mount/URL변경마다 재발급됨. **같은 `(fileUrl, mode)` 조합에 대해 짧은 메모리 캐시**(TTL은 백엔드 2분보다 짧게, 예: 90초) 추가해 중복 발급 방지. 캐시 만료·발급실패 시 재발급. 과설계 금지(간단한 Map+timestamp).

## 검증
1. vitest: driveFile 캐시 동작(같은 인자 2회 호출 시 1회만 fetch, 만료 후 재발급) + 기존 테스트 회귀 0.
2. `npm run build` PASS.
3. PolicyAnalysis view 모드 호출 확인(grep).

## 배포
- 프론트 CF Pages(ANU 조율). finalize-only. 머지=ANU.

## 완료 보고
수정 diff · view 모드 변경 · 캐시 구현 · vitest/build 결과 · callback.
