# task-2967 · InsuRo Phase 2 grouping 4테이블 프로덕션 배포 (codex↔ANU 합의 안전순서)

## 배경
- 회장 승인 완료. PR#221(Phase 2) origin/main `eb01409d` 머지됨. grouping 지식DB 4테이블 + Phase2 5상태/HITL 마이그레이션 프로덕션 배포.
- **codex↔ANU 배포 합의** + codex 보완 4건 반영. 프로덕션 DDL·RLS = 최고 신중.
- repo `/home/jay/projects/InsuRo`. 담당 dev2.

## ★ 배포 절차 (합의 안전순서 — 순서 엄수)
### Step 0. 작업트리 동기화
- `git fetch && git checkout main && git reset --hard origin/main`(`eb01409d`). **PR#221 파일 실재 확인**: `supabase/migrations/20260816120000_grouping_phase2_states_and_hitl.sql`, `server/policy_grouping/seed_cancer5.py`, `comparison_gate.py`.

### Step 1. ★ anon 폴백 차단 (최대 리스크 방어 — 코드 수정 선행)
- `server/policy_grouping/knowledge.py:403`·`server/main.py:560` = SERVICE_ROLE 없으면 anon 폴백. 4테이블은 쓰기 RLS 없어 anon insert 조용히 실패.
- **fail-closed 게이트 추가**: `consultation_history_v1.py:276` 패턴 참고 — grouping 경로/`_get_supabase_client()`/`SupabaseKnowledgeStore._get_client()`에서 **URL 있는데 SERVICE_ROLE 키 없으면 즉시 500 거부**(anon 폴백 prod 금지). 이건 **PR로 머지 후 배포**.

### Step 2. 대상 프로젝트 명시 확인
- `run_migrations.py` 기본 URL(`zayhfjuw…`=INSURO_NEW) vs `config.toml`(`dmyjpvx…`) **불일치** → `supabase link`(또는 URL 직접 확인)로 **대상 = INSURO_NEW(zayhfjuw) 프로덕션** 눈으로 확정. 잘못된 프로젝트 적용 금지.

### Step 3. rollback SQL 사전 준비 (down 없음)
- 역순 드롭 SQL 작성: HITL/Phase2 객체 → `grouping_rule` → `coverage_group_map` → `coverage_clause` → `coverage_product` + trigger/function/index/policy. 배포 전 준비·보관.

### Step 4. 마이그레이션 적용
- `20260812130000_coverage_grouping_knowledge.sql`(4테이블) → `20260816120000_grouping_phase2_states_and_hitl.sql`(5상태 CHECK·HITL). 대상 프로젝트 확인 후 CLI/SQL Editor/psql 수동 적용(run_migrations.py 맹신 금지). 테이블/인덱스/RLS/FK 생성 확인.

### Step 5. SERVICE_ROLE env 확인 + 쓰기 스모크
- 운영 env `INSURO_NEW_SUPABASE_URL` + `INSURO_NEW_SERVICE_ROLE_KEY` **둘 다 존재** 확인(anon만이면 **배포 중지**). 서버 재기동.
- 쓰기 스모크: `coverage_product` insert · `coverage_clause` insert · `coverage_group_map(confirmed)` insert · `grouping_rule` upsert **성공** 확인.

### Step 6. 시드 적재
- `seed_cancer5.py` 암 5군(증거 있는 5군, 10건) 프로덕션 적재. **멱등성 확인**(중복 재적재 방지).

### Step 7. 트래픽 허용
- 위 전부 PASS 후에만.

## 원칙
- 프로덕션 = 되돌리기 어려움. 각 Step 실측 증빙. anon 폴백으로 조용히 잘못 부팅되는 것이 **최대 리스크** — SERVICE_ROLE 확인 없이 트래픽 금지.

## 완료 조건
- Step0~7 각 PASS 증빙 + `memory/reports/task-2967.md`(적용 마이그레이션·SERVICE_ROLE 확인·스모크·시드·rollback SQL 경로) + `.done` + ANU 콜백.
- anon 폴백 차단은 별도 PR(머지 HOLD→ANU 검증). 배포 자체는 회장 승인 하 진행하되 문제 시 즉시 롤백·보고.