# InsuRo 소식지 검토 워크플로우 Phase 3a — 관리자 검토 REST API 4종 (task-2899, PR#179 MERGED, 260805)

## 요약
소식지 검토 게이트(금소법 fail-closed) 3단계 아크의 **Phase 3a**. Phase2(task-2897)까지 업로드→추출→자동검증9규칙→AI자기검증→grounding→`pending_review` 라우팅 파이프라인은 있었으나, 사람이 검토·교정·승인할 **REST 엔드포인트가 없었다**(`transition_review_status`는 함수로만 존재). Phase 3b 검토 UI가 소비할 관리자 API 4종을 노출.

## 산출 (순수 additive 3파일)
- **신규** `server/routes/newsletter_review_v1.py` (223줄) — 관리자 전용 4엔드포인트, 전부 `Depends(require_admin)`(verify_jwt 401→verify_admin 403, lazy import 순환회피).
  1. `GET /api/insuro/newsletters/review-queue` — 경량 목록(HIGH desc→MED desc→created_at desc 안정정렬, body/field_confidence 미포함).
  2. `GET /api/insuro/newsletters/{id}/review` — 상세(extracted/edited 양쪽+validation_flags+grounding). ★ **field_confidence 키 응답 부재**(`_grounding`만 파생), 없으면 404.
  3. `POST /api/insuro/newsletters/{id}/transition` — 교정·전이. **transition 먼저 호출**(거부 시 흔적0)→성공 후에만 `*_edited`에만 write(`*_extracted` 불변). `transition_review_status(actor_type='human', reviewer_id=JWT sub)` 위임. UnknownStatus→422, ReviewTransitionError/RPC예외→409.
  4. `GET /api/insuro/newsletters/insurer-master` — `DEFAULT_INSURER_WHITELIST` 정렬 반환(validation.py 수정 0).
- **수정** `server/main.py` 정확히 2줄(import + include_router).
- **신규** `server/tests/test_newsletter_review_api.py` (16 케이스).

## ANU 독립검증 (GREEN)
- clean /tmp 워크트리(533b683, .env 오염 없음): 신규 **16 passed**, 핵심 회귀(review+validation+main) **315 passed**. 봇 보고의 "full-suite 1 failed(CORS)"는 clean 워크트리에서 **1 passed** 재현 → 로컬 `.env` 오염이 원인, 회귀 아님 독립확정.
- 코드리뷰: field_confidence 미노출·`*_extracted` 불변·중앙함수 위임·admin 게이트·에러매핑 전부 검증.
- CI(PR#179): `ci` PASS(6m35s)·`e2e-test` PASS·전 guard/safety PASS. `diagnostic`은 `continue-on-error:true` 비차단(full failure matrix 정보용). main required checks = 없음.

## 머지
- PR#179 스쿼시 머지 → origin/main `a914594` (2026-08-05 18:11 KST). base=7e4c672(Phase2). 워크트리·브랜치 정리 완료.
- 체인: Phase1 `41e2b1e`(#177,task-2896) → Phase2 `7e4c672`(#178,task-2897) → Phase3a `a914594`(#179,task-2899).

## 상태 = 코드까지만. 회장/후속 대기
- **마이그레이션 017 Supabase rollout** = 회장 (Phase1부터 미결).
- **서버 배포**(systemd `insuro-api.service`) = 엔드포인트 활성화이므로 회장 rollout 판단(마이그레이션017과 함께). 미배포 상태에선 admin-gated라 무해.
- **Phase 3b 검토 UI**(목록/2-pane 교정/보험사 select) = 별도 위임 대기.

관련: [[project_insuro_newsletter_review_phase1_task2896_merged_260805]]
