---
name: project_insuro_newsletter_approve_high_ack_gate_task2914_260806
description: 소식지 승인 서버측 HIGH-ack fail-closed 게이트+감사로그(#task-2914) 완료·push·.done, ANU 머지대기
metadata:
  type: project
---

# 소식지 승인 서버 게이트 — HIGH 플래그 ack 강제(fail-closed) + 감사로그 (task-2914, dev1, 2026-08-06)

**문제**: 승인 게이트가 클라 disable 뿐 → `POST /transition→approved` 직접호출로 미검토 발행 우회 가능(금소법 구멍, agent 미팅 로키 P0-A).

**구현** (server/ 3파일, base=origin/main 42df0bd):
- `server/newsletter_review.py`: 파일 끝에 순수 헬퍼만 추가(상태기계·전이표·published fail-closed 3중잠금 불변) — `flag_key(f)`(sha256 앞16자, basis=`rule|field|(detail.source_quote||summary_value||summary_text||"")|message`, 프론트 태스크와 100% 동일 공유계약)·`high_flag_keys(flags)`(level=="HIGH"만).
- `server/routes/newsletter_review_v1.py`: `TransitionBody.acknowledgements` 추가, select에 `validation_flags` 추가. `to_status=="approved"`면 서버가 HIGH flag_key 집합 **자체 계산** → attested==true ack가 HIGH 전부 포함 안 하면 `transition_review_status` 호출 **전에** 422 `UNACKNOWLEDGED_HIGH_FLAGS`(`detail="미확인 HIGH 플래그: N건"`) 거부(흔적0). HIGH0=무-ack 승인. 통과 시 `presented={high_ack:{high_flag_keys,acknowledgements}}`로 기존 RPC review_events(p_presented jsonb)에 감사기록(actor·ts는 기존 구조).

**검증**: 신규 7종 PASS(흔적0·가짜키 서버기준 거부·attested=false 미인정·감사기록·flag_key 정확성). 회귀0 — **clean CI-parity worktree(.env 없음) 1249 passed·0 failed**. L1=실제 main.app 라우트 4시나리오 실HTTP 통과.

**★ .env 오탐 교훈**: worktree 전체 스위트서 `test_consultation_history_get.py::test_cors_fail_closed_when_ext_origin_unset` 1건 실패했으나 **회귀 아님** — `main.py:54 load_dotenv(../.env)`가 worktree_manager 복사 `.env`(INSURO_EXTENSION_ORIGIN=chrome-extension://) 로드→subprocess CORS에 확장origin 주입→단언 실패. subprocess 격리라 내 코드 무관. pristine base(.env없음) 1242·0, clean CI-parity 1249·0로 증명. [[feedback_regression_verify_clean_worktree_not_polluted_260726]]

**완료**: 커밋 2건(1585cd8 불칸+30e95cc 아르고스)→push→원격head==로컬(30e95cc) 확인→finish-task. **G4 Gemini sunset(IneligibleTierError)→gemini_fallback_static PASS**, GOAL-GATE disabled, finalize-only(merge_policy=none). `.done`·result.json(report_path 자기참조 아님=memory/reports/task-2914.md, owner_pickup_required=true·authoritative=false·relay_hints없음=green closeout). **HOLD=ANU 독립검증·PR/머지·배포**(순서 B). 프론트 태스크와 flag_key 공유계약 일치 필요. [[project_insuro_newsletter_review_phase1_task2896_merged_260805]]
