---
name: project_insuro_drive_proxy_phase2_policy_task2931_260809
description: InsuRo P0-1 Drive프록시 Phase2 폴리시(task-2931) — 라벨-동작 view일치 + 티켓 90초 캐시. finalize-only 완료·머지HOLD
metadata:
  type: project
---

# InsuRo P0-1 Drive 프록시 Phase2 폴리시 (task-2931, 2026-08-09) — ANU검증·머지+배포 HOLD

Codex 교차검증 소소 2건 보완 폴리시. dev1(헤르메스) 이리스+아르고스. finalize-only(머지=ANU).

## 수정 2건 (스코프 정확히 3파일)
1. **PolicyAnalysis 라벨-동작 일치** `src/pages/PolicyAnalysis.tsx:602` — "원문 PDF 보기" 버튼이 `openFileViaProxy(file_url,"download")` 호출(라벨↔동작 불일치) → **`"view"`**(inline)로 변경. 다른 7곳과 view 일관.
2. **requestFileTicket 티켓 캐싱** `src/lib/driveFile.ts` — 모듈 `Map`, 키 `${mode}::${fileUrl}`, TTL `TICKET_CACHE_TTL_MS=90_000`(백엔드 120초보다 30초 안전마진). hit&미만료→세션조회/fetch skip 캐시URL반환, 성공발급만 캐시, throw경로 미저장. `openFileViaProxy` 무변경(자동 캐시혜택, <img> 중복발급 방지). 테스트용 `export clearFileTicketCache()`.
3. `src/lib/__tests__/driveFile.test.ts` — beforeEach `clearFileTicketCache()` 격리 + 신규 캐시 3건(A:dedup fetch1회 / B:TTL만료 재발급 fetch2회(setSystemTime) / C:mode별 별도캐시).

## 검증
- vitest 전체 **79 files / 1177 passed**(base 1174+신규3, 회귀0). tsc0. **`npm run build` PASS**(12s, goal_assertion).
- L1: preview(:4931) curl HTTP200 + Playwright 로드 콘솔에러0 스크린샷(`memory/reports/task-2931-smoke.png`). PolicyAnalysis는 인증필요로 라이브접근 불가, 로직=vitest 실함수 검증.

## 브랜치/base
- 브랜치 `task/task-2931-dev1` head **53b8030**(원격 동기). base=**task/task-2930-dev1 067815b**(task-2930 미머지 상태이므로 그 위 스택. 현재 origin/main=c880cef=Phase1.5=2928+2929).
- ★ **scope-guard stale-base 오탐 재발**: worktree 수동생성→dispatch base마커 부재→merge-base(origin/main)=f2b282e(2930 이전)로 폴백→task-2930의 8배선파일(ReviewDetailPanel/AdminFcpa/AdminNewsletters/AdminPremiumData/FcpaGuide) 6건 오탐 FAIL. **해소=`memory/events/task-2931.worktree-base.json`에 base_sha=067815b 기록**(task-2929와 동일 패턴)→재실행 scope-guard PASS(3 files). 실제 diff vs 067815b=3 스코프파일뿐.

## 종결 상태
- finish-task finalize-only 완료(EXIT0, .done, 22분33초, 텔레그램 알림). result.json authoritative=false·owner_pickup_required=true·executor self-register0(ANU collector 소유). worktree cwd→result.json 프로젝트경로 생성됨→workspace `p0b_inbox`로 cp 보정.
- 지식: 제목에 "이미지" 포함→디자인-QC 오발화→`SKIP_KNOWHOW_CHECK=1 SKIP_LOKI_CHECK=1` 우회(알려진 false positive).

## ★ ANU 처리 결과 (2026-08-09 20:31 KST, 스케줄 콜백)
- **.done ack 완료**(task-2931.done → .done.acked)
- **ANU 독립검증 = GREEN**: 스코프 diff 067815b..53b8030 정확 3파일 / 전체 vitest **79 files·1177 passed 회귀0** / driveFile scope **9/9** / `tsc --noEmit` exit0 / 코드육안(view전환·캐시·throw미저장) 정확. 워크트리 clean.
- **Codex 재조율 = AGREE-GO**: Issue1 RESOLVED · Issue2 RESOLVED-WITH-CAVEAT(저심각도 비차단=in-flight 동시요청 코얼레싱 없음, post-success 재사용만) · NEW-ISSUE 없음(과설계X·스코프밖X). → 회장 게이트 "codex 합의 시 go" **충족**.
- **판정: MERGE-READY.**

## ★ 사실 정정 + 배포 실측
- **origin/main = f2b282e**(task-2925, 라이브 커밋). 위 line22 "origin/main=c880cef"는 오류 — **c880cef는 로컬 main**(f2b282e+백엔드Phase1+1.5 squash), **origin 미푸시**(InsuRo push=ruleset 차단). 2930/2931은 f2b282e 기반.
- **백엔드 Phase1+1.5 이미 라이브**: systemd insuro-api 18:30:36 KST 재기동(로컬 c880cef 실행). file-ticket=401(존재)·file프록시=404(존재)·/api/status=200. 프론트 의존 프록시 엔드포인트 살아있음 → 프론트 배포 **무중단**(Drive도 Phase3 전이라 여전히 공개).

## HOLD (배포 게이트 = 실인증 E2E)
- 코드/게이트/Codex 전부 GREEN이나 **프록시 유저플로우 실인증 E2E(위임완결성 규칙7 "필수") 미수행** — 8개 링크 전부 로그인 필요, 봇·ANU 모두 인증세션 부재. 첫 라이브 컷오버(direct Drive→프록시)라 blind 배포 보류.
- 실행안: **머지+build+CF Pages 배포 원자적 1회**(백엔드 이미 라이브라 프론트 CF Pages만). 회장 최종 go 또는 E2E용 인증 테스트세션 필요.
- Phase3=신규 anyone제거+소급회수(회장 결정 대기). 관련 [[project_insuro_drive_proxy_frontend_wiring_p0_1_phase2_task2930_260809]].
