★★★ 작업 취소됨 (CANCELLED) ★★★

# [Lv.3] 소식지 검토 Phase 3b-2 — 관리자 검토 UI (목록 우선정렬 + 2-pane 교정 + 고위험 게이트)

## allowed_resources
```yaml
allowed_resources:
  paths:
    - "src/pages/AdminNewsletters.tsx"
    - "src/components/newsletter/**"
    - "src/**/*.test.tsx"
  forbidden_paths:
    - ".github/**"
    - "extension/**"
    - "server/**"
  commands: ["npm","npx","vite","git"]
  merge_policy: "none"
  ttl_hours: 20
```
> ★ base=현 origin/main(a914594). **Phase 3b-2 = 프론트 검토 UI만(src/).** 백엔드 교차검증은 Phase 3b-1(병렬, server/ 만). Phase 3a 검토 API(#179 머지됨)를 소비. 근거: `memory/plans/newsletter-review-workflow_260805/`.

## 배경
소식지 AI 추출값은 사람이 발행 전 1회 검토·교정해야 함(금소법 오발행 방지). Phase 3a 로 검토 API 4종 완성. Phase 3b-2 = 관리자가 실제로 원문↔추출을 대조·교정·승인하는 화면. **기존 `src/pages/AdminNewsletters.tsx`(596줄, /admin/newsletters, verify_admin)를 확장**(신규 페이지 만들지 말 것).

## 소비할 Phase 3a API (전부 verify_admin, apiFetch 패턴)
- `GET /api/insuro/newsletters/review-queue?status=` — 대기목록(id, company_name, title, month_key, review_status, flag_high_count, flag_med_count, created_at)
- `GET /api/insuro/newsletters/{id}/review` — 상세(insurer/title/body 의 _extracted·_edited, validation_flags 전체, source_file_ref, model_version, review_status …). ★ field_confidence 는 응답에 없음(표시 대상 아님)
- `POST /api/insuro/newsletters/{id}/transition` — body {to_status, action, edited?:{insurer?,title?,body?}, reason?}
- `GET /api/insuro/newsletters/insurer-master` — 보험사 마스터 배열

## 작업 (UI)
### 1) 검토 대기 목록
- review-queue 소비. **이상항목 우선정렬**: HIGH 있는 항목(❌) → MED만(⚠️) → 무플래그(✅) 순. 각 행에 상태 뱃지 + HIGH/MED 플래그 수 + 회사명/제목/월.
### 2) 2-pane 상세 교정 뷰 (핵심)
- 좌: **원문**(source_file_ref/추출원본 텍스트) · 우: **추출 필드**(insurer/title/body, _edited 있으면 우선표시·없으면 _extracted).
- **validation_flags 렌더러(범용)**: 각 플래그 rule/level/field/message 표시. level HIGH=빨강/MED=주황/INFO=회색.
  - ★ **rule='cross_model_disagree' 특수 렌더**: detail 의 `primary_value`(1차 Claude)·`verifier_value`(교차 GPT)·`source_quote`(원문)를 **3열 대조**로 강조 표시("1차: X / 교차: Y / 원문: Z"). 이게 회장님이 요청한 교차검증 가시화의 핵심.
- **인라인 교정**: 필드 편집 → transition API 의 edited 로 저장(원본 _extracted 는 안 건드림, 서버가 _edited 에만 기록).
### 3) 보험사명 마스터 select (필수 · fail-closed)
- insurer 필드는 자유입력이 아니라 **insurer-master 목록 select 필수**. 목록에 없는 값이면 **승인(approve) 버튼 비활성(hold)** — 틀린 선택 강제 금지.
### 4) 고위험 필드 확인 게이트
- 승인 전 **보험사명·본문 내 숫자·개정일** 확인 체크박스 게이트. 전부 체크해야 approve 가능.
### 5) 상태 전이 버튼
- editing(교정 시작) / approve(승인) / reject(반려·사유) / re-extract(재추출 요청). 각각 transition API 의 to_status·action 매핑. **발행(publish)은 approved 상태에서만 노출**(서버가 3중잠금 강제하지만 UI도 approved 아니면 미노출).

## 제약
- src/ 만. server·extension·.github 불변. 신규 페이지 대신 AdminNewsletters.tsx 확장.
- **신뢰도 숫자 미노출**(field_confidence 표시 금지). 로그/문구는 "정확확인" 같은 결론형 금지, "검토 대기/제시 증거" 같은 과정형.
- 숫자·보험사명·날짜는 사람이 직접 교정만(자동값 채우기 금지).

## 검증
- `npm run build` PASS + tsc 0. **실렌더 스크린샷 육안 필수**(로컬 vite/harness): 목록 우선정렬(❌>⚠️>✅), 2-pane, cross_model_disagree 3열 대조 렌더, 보험사 미등록 시 approve 비활성, 고위험 게이트 미체크 시 approve 불가. (교차검증 플래그는 3b-1 스키마 목업 데이터로 렌더 검증 가능.)

## 완료 (★ 순서 B)
- 변경 = src/ 만. **dev6 금지** — dev2(오딘). 커밋 → push → **★ push 반드시 확인** → **npm run build PASS 확인** → finish-task foreground 1회 → .done. background wait 금지. ANU 독립검증(실렌더 스크린샷)·머지·배포는 ANU.

## goal_assertions (auto-generated)
- `npm run build`
