# InsuRo P0-1 Drive 프록시 Phase 3: 공개 완전 차단 (task-2932, 260809) — ANU독립검증완료·머지+배포+소급회수 HOLD

**핵심**: P0-1 Drive 프록시 스택의 마지막 조각. 신규 `anyone` 공개권한 생성 제거(Phase 3a) + 기존 공개파일 소급 회수/롤백 스크립트(Phase 3b, 실행 HOLD).

## 산출물 (dev1-team, 불칸=sonnet 구현 / 헤르메스 Opus 설계·검증)
- `server/gdrive.py` 수정 — `upload_pdf`·`upload_file_to_drive` 두 함수의 `permissions().create({"type":"anyone"})` 블록 **완전 제거**. 파일 생성/반환 URL 무변경. 신규 업로드=소유자 전용(비공개), 접근은 Phase 1 file-ticket 프록시로만.
- `server/scripts/revoke_public_drive.py` (신규 332행) — newsletters/premium_data(scalar) + policy_analyses(배열) drive_file_id 전수 수집 → **FCPA 2중 제외**(fcpa_config 미조회 + collect_fcpa_file_ids 차집합) → `type:anyone`만 선별 삭제. `--dry-run` 기본·`--execute` 상호배타. 실행 전 `revoke_snapshot_{ts}.json`(롤백 기준, dry/exec 양쪽 생성). 429/403 지수백오프.
- `server/scripts/restore_public_drive.py` (신규 159행) — `--snapshot` 기반 `type:anyone` 재부여 롤백.
- 테스트 4파일(신규 2·수정 2), 신규 유닛 11 passed.

## ANU 독립검증 (260809 21:56 KST)
- `grep -c anyone server/gdrive.py` = **0** (Phase 3a 확인)
- 회수/롤백 스크립트 2개 존재 확인
- 브랜치 `task/task-2932-dev1` head **af337ae 원격 동기** 확인. base=origin/main **b21b04b**(현재 원격 main과 일치=독립 스택)
- 게이트 5종(impact/ci_preflight/l1/goal/unresolved) 전부 PASS. QC=WARN(비차단). 회귀 0 (worktree 1392 passed·1 fail=base 동일재현 pre-existing CORS).
- MERGE-READY 판정.

## HOLD (회장 결정 대기)
- **머지=finalize-only**: Phase 3a 서버코드 머지+systemd insuro-api 재배포 = ANU 수행. Phase 3b 스크립트 머지만.
- **★ P0-1 스택 5건(2927·2929·2930·2931·2932) 전부 MERGE-READY·coordinated 배포 HOLD** — 회장 go + Codex 재조율 후 단일 CF Pages+systemd 원자적 재배포.
- **★★ Phase 3b `--execute`(소급 회수=파일 공개권한 실삭제)는 되돌리기 어려운 파괴적 작업** → ANU dry-run 실행→스냅샷 확보→**회장 최종승인 후에만** 실행. 문제 시 restore 스크립트로 롤백.
- FCPA(금소법 PDF)=회장 결정 공개유지 → 소급 회수에서 예외.

관련: [[project_insuro_drive_proxy_phase2_policy_task2931_260809]] · [[project_insuro_drive_proxy_frontend_wiring_p0_1_phase2_task2930_260809]] · [[project_insuro_drive_public_removal_proxy_p0_1_phase1_task2927_260808]]
