# [Lv.2] 소식지 텍스트레이어 추출도 codex 교차검증 재활성화 (마크다운↔원본이미지, 구조붕괴까지)

## allowed_resources
```yaml
allowed_resources:
  paths:
    - "server/main.py"
    - "server/newsletter_cross_verify.py"
    - "server/tests/**"
  forbidden_paths:
    - ".github/**"
    - "extension/**"
    - "src/**"
    - "server/migrations/**"
    - "server/pdf_extract.py"
    - "server/newsletter_review.py"
    - "server/newsletter_validation.py"
  commands: ["pytest","python3","git"]
  merge_policy: "none"
  ttl_hours: 14
```
> ★ base=현 origin/main(fd5e91f). 근거: 회장 결정(A안). task-2916이 text_based 추출에 `do_cross_verify=False` 로 껐으나, 글자는 정확해도 **정리(구조)가 이상할 수 있음**(뭉개진 표·영역 섞임·말 안 되는 나열) → codex가 마크다운↔원본이미지 대조로 잡게 재활성화. task-2921(표 격자, pdf_extract.py)과 무중첩.

## 배경
task-2916: 텍스트레이어(pdf-inspector) 추출은 원문 그대로라 codex 생략(`do_cross_verify=False`). 그러나 회장 실사용 — 표가 평문으로 뭉개지는 등 **구조 붕괴**가 발생. 텍스트 정확성≠구조 정확성. codex가 **마크다운(정리본) ↔ 원본 페이지 이미지**를 대조하면 구조 이상을 잡을 수 있음(원본 이미지엔 멀쩡한 표인데 마크다운은 뭉갬 → 플래그).

## 작업
### 1) 재활성화 (`main.py`)
- 소식지 text_based(pdf_extract) 추출 경로에서 **`do_cross_verify=True`** 로(현재 False). codex 가 **추출 마크다운을 extracted_body 로, 원본 페이지 이미지를 source_images 로** 받아 대조하도록 배선.
- ★ text_based 경로에도 **source_images(원본 페이지 이미지 렌더) 전달** 보장(`_render_source_page_images`). 없으면 기존 graceful(cross_model_unavailable).
- ★ 백그라운드 실행 유지(task-2912) — 업로드 응답 지연 없음.

### 2) 프롬프트 확장 (`newsletter_cross_verify.py`)
- 기존 (A)숫자 오인식 (B)의미 왜곡에 더해, **(C) 구조/일관성 붕괴** 검출 추가:
  - 원본 이미지엔 표/구획이 명확한데 정리본이 **행/열 뭉갬, 영역 섞임, 의미불명 나열**로 정리된 경우.
  - 새 rule `structure_broken`(level HIGH: 표·핵심정보 뭉갬 / MED: 순서·구획 흐트러짐). detail: `{summary_text(정리본 문제구간), source_quote(원본 근거/무엇이 있어야 하나), issue, verifier}`.
  - 기존 number_misread/meaning_drift·플래그 스키마·extractive-only·인젝션방어·codex argv 불변. (C)만 추가.
- ★ **과플래그 방지**: 추출이 정확해졌으므로(vision 아님) 사소한 표현·서식 차이는 플래그 금지 — **명백한 구조 붕괴/의미불명만**. severity 지침에 명시.

### 3) 검토 UI/게이트 계약 불변
- 새 `structure_broken` 플래그도 기존 validation_flags 구조라 프론트가 그대로 렌더(HIGH면 개별 ack 대상). UI 변경 없음.

## 제약
- main.py + cross_verify.py + 테스트만. pdf_extract·review·validation·migration·src 불변. published fail-closed·기존 파이프라인 회귀 0.

## 검증
- `pytest server/tests/` 회귀 0. 신규(codex mock): text_based 경로가 do_cross_verify=True + source_images 전달 / 뭉개진 표 정리본 → structure_broken 플래그 / 정확한 정리본 → 플래그 0(과플래그 없음) / 숫자·의미 기존 검출 유지 / graceful(이미지 없음→unavailable).
- ★ L1: 실제 DB생명 매거진(뭉개진 표 페이지 포함) 업로드→백그라운드 codex 후 structure_broken 이 그 표 페이지에 뜨는지(가능하면), 정상 텍스트 페이지엔 안 뜨는지 확인. 보고서 기록.

## 완료 (★ 순서 B)
- server/ 만. **dev6 금지** — dev1(헤르메스). 커밋 → push → **★ push 확인** → finish-task foreground 1회 → .done. ANU 독립검증·머지·배포는 ANU.
