# 소식지 추출 파이프라인 교체 — pdf-inspector 텍스트레이어 + 영역인지 마크다운 (#task-2916, dev1/헤르메스, 260806) push·머지HOLD

- **문제**: 소식지(text_based PDF)를 Opus vision으로 "그림 받아쓰기" → 디자인 글자 오독 + codex 교차검증 오탐 폭주. 기본 마크다운은 좌우 텍스트박스를 한 줄에 뒤섞음(회장 지적).
- **해결**:
  - **신규 `server/pdf_extract.py`** `extract_markdown(bytes)->{markdown,pages,pdf_type,ocr_pages}` 순수함수(graceful). classify_pdf_bytes+extract_text_with_positions_bytes(pdf-inspector 0.2.6)+fitz get_drawings. **L2 박스감지**(폭>80·높이>40·면적≥5%, IoU dedup, 앵커점 배정, 순서 y0/x0 asc) → **L3 XY-cut 폴백**(Y-band 분리 후 밴드별 X-projection gutter≥6%) → **L4 정리**(y근접 줄묶기, 폰트중앙값 1.6×/1.3× 제목위계). ocr페이지=`[[OCR_NEEDED page=N]]`.
  - **main.py 배선**: 신규 DRY 헬퍼 `_try_text_layer_extract`를 **양쪽** 엔드포인트(`parse_premium_file`=재분석, **`upload_to_drive`=실 프론트 초기업로드**)에 적용. newsletter+.pdf+parse_mode=auto+pdf_type==text_based+ocr 없음 → 텍스트레이어 채택 + `_run_newsletter_review_bg`/`run_review_pipeline`에 **`do_cross_verify=False`**(codex 생략). ocr혼합/실패/강제모드 → 기존 vision 경로 폴백(codex True). T3 vision 재추출 시 True 복구. **premium·상태기계·published fail-closed·결정론9규칙 불변.** requirements에 `pdf-inspector>=0.2`.
- **★ 실측 정정(좌표계)**: pdf-inspector TextItem.y=**bottom-left/y-up**(PDF네이티브), fitz get_drawings/get_text=**top-left/y-down**. task md 서술과 상충 → 실측 우선 `y_top=page_height-y-height`로 fitz계 정규화(주석). 페이지인덱스도 3종(TextItem 1-idx / classify·PageMarkdown 0-idx) → 0-indexed 통일.
- **검증(ANU 독립검증 대상)**: 실 `DB생명 위드유매거진 26.08.pdf`(19p) → text_based·ocr[]·크래시0, **page0 좌/우 영역 분리 성공**(줄 중간 뒤섞임 0, 회장 지적 해소). 신규 테스트 24개 PASS. 전체 회귀 **CI-parity 1265 passed·0 failed**(로컬 .env `INSURO_EXTENSION_ORIGIN` 파일럿값 오염 시 `test_cors_fail_closed_when_ext_origin_unset` 1건만 로컬전용 사전실패, CI-clean GREEN — [[feedback_regression_verify_clean_worktree_not_polluted_260726]]).
- **커밋**: 브랜치 `task/task-2916-dev1` 원격 head `8e2c17e`(base 07f402a·#193). finish-task FINALIZE_ONLY=1(머지스킵) 전 게이트 PASS(l1_smoketest·goal_assertions·impact·ci_preflight·unresolved). result.json owner_pickup_required=true·authoritative=false·raw ANU key 0.
- **★ HOLD (ANU 후속 필수)**: ① 서버 python 환경 `pip install pdf-inspector` ② 실 PDF 추출 육안검증 ③ **머지**(merge_policy=none, 순서 B) ④ systemd `insuro-api.service` 재배포. 배포 전엔 라이브 업로드가 여전히 구 vision 경로.
- 관련: [[project_insuro_newsletter_upload_timeout_fix_task2912_merged_260806]] · [[feedback_finish_task_is_design_false_positive_image_title_260728]](L1 `해당없음.*스모크` BLOCK 패턴 회피) · [[reference_insuro_webapp_cf_pages_deploy_260803]]
