# 소식지 표영역 좌표기반 격자 복원 + 표페이지 육안플래그 (#task-2921, dev3/다그다·루, 260806) push·머지HOLD

- **문제**: `pdf_extract.extract_markdown`이 표 영역을 마크다운 평문으로 평탄화 → 매트릭스 표(상품×고지사항, 셀값 N/3/5/개월) 행·열 구조가 한 줄로 뭉개짐(회장 실사용 지적, DB생명 매거진 p16).
- **해결**: `server/pdf_extract.py`(+249)에 좌표기반 격자 경로 추가. `process_pdf_bytes().pages_with_tables`(1-idx→0-idx, graceful) 신호 + `_looks_like_grid`(Y밴드 행묶기, 다중아이템 행 과반) → `_grid_to_markdown`(x0 열클러스터링 `max(10,med_font*0.9)` → (행,열) 셀배정, `|`이스케이프 → `| h |`+`| --- |`+행). **핵심=sparsity 신뢰도 게이트** `_GRID_MIN_FILL_FRAC=0.6`(채움<60%면 confident=False, 1차필터) + ncols∈[2,12]·열충돌<과반·fill std/mean<0.5. 저신뢰→격자 강제 금지, 기존 `_region_to_markdown` 출력 그대로 + `[[TABLE_REVIEW page=N]]` 마커 + `table_review=True` 플래그. 반환 하위호환(page dict `table_review`/`is_table_page` 추가키만, top-level `table_pages`/`table_review_pages` 추가, 필수4키 불변).
- **★ 실측 핵심 발견**: pdf_inspector `pages_with_tables`는 **과탐** — 실 매거진 14개 표페이지 중 진짜 dense 데이터 표 0건. 초기 구현이 마케팅 레이아웃(상품 라인업)을 **빈셀 70~85% 희소 마크다운 표로 억지 변환(가독성 회귀)**하고 p16은 뭉갬 유지 = net-negative였음 → sparsity 게이트로 교정. p16은 헤더열(3)과 데이터열(5~10) 근본 어긋남 → **격자 강제 시 왜곡이라 폴백이 정답**.
- **검증(ANU 독립검증 대상)**: 실 `DB생명 위드유매거진 26.08.pdf`(19p) extract → **19/19 본문(마커 제외) origin/main과 byte-identical(회귀 0)**, 표 11페이지에 `[[TABLE_REVIEW]]` 마커만 추가, **마크다운 표 생성 페이지의 빈셀 최댓값 0%**(희소표 0건). 합성 dense 3열 격자는 `confident=True`로 `| 상품 | 구분 | 고지사항 |` 정상 표 생성 확인. `test_pdf_extract.py` 21 passed(신규 sparsity/폴백 3건). 전체 server/tests 1277 passed + CORS 1건은 로컬 .env `INSURO_EXTENSION_ORIGIN` 파일럿 오염(제거 후 pass, CI-clean, [[feedback_regression_verify_clean_worktree_not_polluted_260726]]).
- **커밋**: 브랜치 `task/task-2921-dev3` 원격 head **f26e50b**(base 8a7239b). worktree cwd finish 함정 재현 — result.json이 프로젝트경로로 감→canonical `memory/events/p0b_inbox/`로 cp 보정([[feedback_finish_task_worktree_cwd_p0b_result_path_260806]]). scope-guard PASS(정확히 2파일, SCOPE_BASE=merge-base 8a7239b — origin/main은 #196으로 fd5e91f 전진했으나 무충돌). FINALIZE_ONLY=1 머지스킵. result.json owner_pickup_required=true·authoritative=false·raw ANU key 0.
- **★ HOLD (ANU 후속)**: ① 실 p16 육안(격자 미강제=텍스트유지+육안플래그 결정 타당성) ② **머지**(merge_policy=none, 순서 B) ③ systemd `insuro-api.service` 재배포(pdf-inspector 환경은 [[project_insuro_newsletter_pdf_textlayer_region_extract_task2916_260806]]에서 기설치).
- 관련: [[project_insuro_newsletter_pdf_textlayer_region_extract_task2916_260806]](원 모듈, dev1) · [[feedback_finish_task_goal_gate_relative_pytest_cwd_260806]]
