# [Lv.1 fix·배포blocker] 표 육안확인 신호를 본문 마커 대신 메타데이터로 (extracted_text 오염 제거)

## allowed_resources
```yaml
allowed_resources:
  paths:
    - "server/pdf_extract.py"
    - "server/main.py"
    - "server/tests/**"
  forbidden_paths:
    - ".github/**"
    - "extension/**"
    - "src/**"
    - "server/migrations/**"
    - "server/newsletter_review.py"
    - "server/newsletter_cross_verify.py"
    - "server/newsletter_validation.py"
  commands: ["pytest","python3","git"]
  merge_policy: "none"
  ttl_hours: 8
```
> ★ base=현 origin/main(f3e801b). 근거: Codex 묶음배포 반증검토 NO-GO 블로커. 배포 선결.

## 배경 (Codex 확정 블로커)
task-2921의 `[[TABLE_REVIEW page=N]]` 마커가 `pdf_extract.py`(576/578/716)에서 **본문 마크다운(full_markdown)에 삽입** → `main.py:5940`에서 `newsletters.extracted_text`로 저장 → `main.py:6309/6310/6331` newsletter_chat(Q&A)·발행물 컨텍스트로 **그대로 노출**됨. 내부 육안확인 신호가 최종 발행물/Q&A에 문자열로 새어나감.

## 작업 (surgical)
1. **`pdf_extract.py`: `[[TABLE_REVIEW]]` 마커를 본문에서 제거** — full_markdown/pages markdown 에 마커 문자열을 넣지 말 것. 대신:
   - 결과 dict 에 **`table_review_pages: list[int]`**(0-index 또는 1-index 명시) 메타데이터로 반환.
   - 각 page 엔트리에 **`needs_table_review: bool`** 플래그 추가(하위호환 — 기본 False).
   - 저신뢰 표는 여전히 줄바꿈 보존 텍스트로(마커만 제거).
2. **`main.py`: 저장 시 본문은 깨끗하게** — extracted_text 엔 마커 없는 markdown 저장. table_review 신호는 **validation_flags 에 결정론 플래그로 추가**: `{"rule":"table_review_needed","level":"MED","field":"body","message":"표 페이지 육안 확인 필요(자동 격자화 저신뢰)","detail":{"pages":[...]}}` — 검토 화면엔 뜨되 발행물/Q&A 본문엔 안 섞임. (이 플래그 추가 지점은 파이프라인 검증 결과 병합부. validation.py 는 건드리지 말고 main.py 배선에서.)
3. codex structure_broken(별도)와 공존 — 중복 경고 허용(둘 다 "표 확인" 신호). 본문 오염만 제거가 핵심.

## 제약
- pdf_extract.py + main.py + 테스트만. review·cross_verify·validation·src 불변. 기존 추출·회귀 0. extracted_text 에 마커/내부문자열 절대 미포함.

## 검증
- `pytest server/tests/` 회귀 0. 신규: 저신뢰 표 페이지 → extracted_text 에 `[[TABLE_REVIEW` **문자열 부재** + result.table_review_pages/page.needs_table_review True + validation_flags 에 table_review_needed 존재.
- ★ L1: 실제 DB생명 매거진 추출 → extracted_text 전체에 `TABLE_REVIEW`/`[[` 마커 문자열 0건, p16 저신뢰 페이지가 table_review 메타로만 표시. 보고서 기록.

## 완료 (★ 순서 B)
- server/ 만. **dev6 금지** — dev1(헤르메스, pdf_extract/main.py 원저자). 커밋 → push → **★ push 확인** → finish-task foreground 1회 → .done. ANU 독립검증·Codex 재확인·머지·**전체 단일 재배포는 ANU**.

## goal_assertions (auto-generated)
- `pytest server/tests/`
