kordoc/docs/quality-campaign-session-2026-10-09.md at main · chrisryugj/kordoc · GitHub
Skip to content

Latest commit

 

History

History
402 lines (334 loc) · 50.9 KB

quality-campaign-session-2026-10-09.md

File metadata and controls

402 lines (334 loc) · 50.9 KB

품질·성능 연쇄 개선 캠페인 세션 기록 (2026-10-09~, 4.21.3 기준)

인계 문서: NEXT-CLAUDE-QUALITY-CAMPAIGN-2026-10-09.md. 사이클마다 수치·기각한 실험까지 여기에 남긴다.

측정 방법

  • 전 벤치 묶음 러너 node bench/suite.mjs run <태그> [--root=<체크아웃>] → bench/out/suite/<태그>/, 비교 node bench/suite.mjs cmp <기준> <새> (벤치별 요약 A → B + 문서별 DOWN/UP, 하락이 하나라도 있으면 exit 1). 연휴 때의 four.sh·cmp4.py 를 저장소 안에 다시 만든 것.
  • 기준선은 4.21.3(00fb762)을 따로 체크아웃해 빌드한 ~/workspace/kordoc-base 로 잰다. 4.21.3 게시 게이트가 같은 dist 로 돈 산출물 (score·roundtrip·pdf-table·pdf-text·annex·formats·ocr-accuracy)은 --gate 가 종료 코드만 바꾸므로 그대로 기준선에 넣었다.
  • 다른 엔진 ODL 예측(odl 2.5.12·docling·marker·하이브리드 등 18개, 2026-10-09 이전 세션 실측)은 bench/out/suite/ref-engines-20261009/ 에 옮겨 두었다.

기준선 — 4.21.3

벤치 지표 4.21.3
ODL 200 기본 종합·NID·TEDS·MHS 0.9582 · 0.9569 · 0.9784 · 0.9449
ODL plain+htmlTables 종합 0.9700
ODL ocr: true 종합 0.9597
ODL ocr: false 종합 · 쪽당 0.9361 · 0.042초

유저 결정 (2026-10-09)

  1. 마크다운 <u> 유지 — 한컴·법령 문서의 밑줄은 개정·강조 표시라 원본 정보다. ODL 200 에서 18문서가 이 표기로 깎이지만(빼면 0.9582 → 0.9589) 기본 출력에 둔다. 색인·RAG·벤치용은 plain: true.
  2. MCP fill_form 에 fields_file 추가 + 응답 마스킹 — 값을 JSON 파일로 받아 도구 인자(대화 맥락)에 남기지 않고, 파일로 받은 값은 응답에 글자 수만.
  3. 그림 영역 자동 OCR 범위 유지 — 글 없는 큰 그림(쪽 면적 5%+)만. ocr: true 범위(2%+·쪽 머리 로고)로 넓히면 ODL +0.0015(8문서↑·0↓)지만 한국 문서 로고 글 잡음·지연을 피한다. 차트 OCR 이 쓰레기 글·가짜 표를 만드는 문서(124·140)는 범위와 별개로 버그로 고친다.

ODL 에서 kordoc 이 지는 문서 (4.21.3 기본 vs ODL 2.5.12, 종합 0.02+ 격차 15건·NID 19·MHS 11)

문서 유형 내용
039 회귀 왼쪽 정렬 2단 본문이 2열 표에 흡수 — 4.18.6 에선 정상(NID 0.987), 624007d 회귀(아래)
124·140 버그 원그래프 그림 OCR: 영문 글이 쓰레기로 읽히고 범례가 머리 있는 표가 된다
077 버그 막대 차트 값 라벨이 쪽 끝으로 밀리고 "374" 가 두 번
158·192 버그 링크 글이 주소 자체인데 [주소](주소) 로 되풀이
094 버그 번호 목록 항목이 링크 앞뒤로 두 문단으로 갈림
192 버그 글 조각 ", 5." 의 공백이 빠져 "Systems,5."
173·177 표기 그림 자리표시·링크 주소(캡션 줄 나눔은 정답도 줄마다라 손실 아님 — 처음 버그로 봤다가 정정)
133 버그 문장 하나가 다른 자리로(읽기 순서)
108·146 표기 <u> — 유저 결정으로 유지
085·146·147·150 범위 작은 그림·로고 속 글 — 유저 결정으로 범위 유지
153·156·157·180·006 표기 링크 주소·곧은 따옴표(정답은 '·", PDF 글은 ’·“)·| 이스케이프·그림 자리표시

4.18.6 → 4.21.3 ODL 회귀 (2026-10-09 추적)

같은 채점기로 4.18.6(v4.18.6 체크아웃 빌드)과 4.21.3 을 문서별로 견줬다(suite.mjs cmp v4.18.6 base-4.21.3).

  • ocr: false: 0.93715 → 0.93611, 하락 문서는 039 하나(NID 0.987 → 0.721).
  • 기본(자동 OCR): 0.96045 → 0.95819, 하락 10·상승 12. 큰 하락 141(NID 0.962 → 0.444)·039·110(TEDS 0.9995 → 0.977)·140·128·134·057·100·115·098.
  • 원인: 624007d fix(ocr): keep one visual line together and stop item rows merging (#141) (GitHub #141 영수증 OCR 수정). bisect 와 파일 단위 되돌림으로 확인 — 039 는 startsNewRecord(위 행이 한 칸 산문이어도 다음 줄을 새 레코드로 봐 두 단 본문 줄이 병합되지 않고 산문 표 판정을 비껴감), 141 은 groupOcrLines(두 단 카드의 좌우 줄·QR 잡음 상자 "다|i" 를 한 줄로 묶어 쪽 단 분리가 깨짐)와 startsNewRecord 둘 다. 표 개수로 bisect 하다 GFM | ---/HTML <table> 를 섞어 세어 헛짚었다 — 문서 하나도 ODL 채점기 점수로 판정한다(스크래치 odl1.sh).
  • 134·100·115·098 의 작은 하락은 624007d 밖의 다른 커밋 몫(미추적).

사이클 기록

사이클 1 — MCP fill_form fields_file (4.21.4)

  • 유저 결정 2를 구현. 파일로 받은 값은 응답에서 글자 수만, 깨진 JSON·잘못된 모양은 내용을 되풀이하지 않고 거부. CLI -j 와 같은 입력.
  • 테스트 5개: 4.21.3 에서 5/5 실패 → 수정 후 5/5 통과. 파싱 경로 무변경(MCP 도구만)이라 벤치는 게시 게이트로 확인.
  • 처음 4.22.0(minor)으로 올렸다가 유저 지시("버전은 최소범프로만")로 게시 게이트 중에 끊고 4.21.4 로 다시 냈다 — 이후 모든 릴리스는 patch.

사이클 2 — 요약 상자 왕복 (4.21.5)

  • 인계 백로그 8. 파서 왕복 채널(kordocTableChannel)이 __kordoc_summary 를 몰라 1×1 상자가 일반 문단으로 풀렸다 → > 인용문 복원, 인용 문단 여러 줄은 줄마다 > (md 파서가 접두 없는 줄을 떼어 냄).
  • 개조식은 다시 읽은 마크다운의 제목과 요약 사이에 표지 날짜·기관명 줄이 있어 생성기가 "제목 바로 뒤 인용문"을 못 찾았고 날짜가 본문에 한 번 더 찍혔다(종전부터 있던 왕복 결함) → 옵션이 없을 때 그 줄을 표지 값으로. "2026. 9. 30." 은 md 에서 2026번 번호 목록 항목으로도 읽혀서 둘 다 본다.
  • 테스트: 4.21.3 에서 새 왕복 테스트 2개 실패 → 수정 후 10/10. 전 벤치(score·글·표·formats·왕복·생성) 문서별 변화 0.

릴리스 묶음과 기준 (2026-10-09 오후)

  • 게시 게이트 한 번이 약 60분이고 무거운 측정과 겹치면 fuzz 멈춤 상한(180초)에 367쪽 편람 PDF 가 걸릴 수 있어, 같은 목표의 수리를 한 릴리스로 묶는다(수리마다 개별 측정·테스트, 묶은 트리로 전 벤치 한 번 더). PDF 품질 묶음(아래 사이클 3~15)은 아직 게시 안 한 4.21.5 에 합쳐 낸다(유저 지시 "4.21.5 배포 안 했던데 그거로 해").
  • 유저 지시 "기존보다 떨어지는 건 못 참는다" — 문서별 비교를 직전 릴리스 기준선(base-4.21.3)과 ODL 역대 최고 시점(v4.18.6, 0.960) 둘 다에 건다.
  • 유저 목표(저녁): "모든 지표가 100 에 닿을 때까지 같은 류의 개선 사이클 반복, 최소 범프".

사이클 3 — OCR 줄 묶음의 #141 부작용

  • 위 "4.18.6 → 4.21.3 ODL 회귀" 의 수리. groupOcrLines 는 줄 높이 중앙값과 두 배 넘게 다른 상자(아이콘·QR 잡음 "다|i")와 묶지 않고, 긴 글줄끼리는 가장 가까운 긴 조각과의 가로 틈이 높이의 5배를 넘으면 다른 단으로 본다. startsNewRecord 는 위 행이 두 열 이상 찬 데이터 행일 때만 "새 레코드".
  • 높이는 처음엔 줄의 모든 상자와 쟀다가 OCR 벤치 changwon-plan2026 3·5쪽 CER 이 올랐다(두 행에 걸친 칸 상자 "3/8" 137px 을 윗행 작은 "1/1" 56px 하나가 거부) — 줄 높이 중앙값과 잰다.
  • 기각: 짧은 조각 8h 상한 제거(#141 수혜 106·136·060·102·148 하락), "긴 조각 모두와 3h 이하"(059 범례 행이 갈림).

사이클 5·12 — 그림 영역 OCR 의 줄 묶음

  • 원인 셋: 먼 축 눈금과 범례 라벨이 반쯤 어긋난 채 한 줄(128·140·057, 중심 어긋남 0.37~0.47), 줄 기준선을 맞추며 키 큰 칸 상자가 윗행으로 번짐(110 "1415"), 그림 영역 병합이 같은 영역에서 방금 넣은 OCR 줄과의 겹침을 "원문 있음" 으로 봐 다음 줄을 버림(102 "342 334", 140 "33%").
  • 채택: 높이 8배 넘게 떨어진 조각은 중심 0.35 안(148 원그래프 값·범례 0.31 은 묶음), 그림 영역만 상자 위 끝 유지, 영역을 넣기 전 블록과만 겹침 판정. 원그래프 범례 가짜 표(124·140)는 영역 안 세로 괘선이 둘 미만이면 행 문단.
  • 기각: 그림 영역 줄 묶음 끄기(4.18.6 대비 하락은 0 이 되지만 #141 이 그림 영역에서 얻은 11문서를 잃음), 가까운 조각만 묶기(같은 11문서), 세로 허용치 0.3(060·106·148 하락), 잡음 "O O" 거르기(두 글자 이상 라벨 무손실 정책 테스트와 충돌), OCR 줄 번호로 PDF 줄 묶음 가르기 (115·066·060 상승, 059·134 하락 — 합계 손해).
  • 위 끝 유지를 처음엔 쪽 전체 OCR 에도 걸었다가 스캔 OCR 벤치 3쪽 CER 이 올랐다(topik 1.50 → 1.88%·nanet 7.32 → 7.81%·yeosu 37.21 → 37.87%). ODL(그림 영역)만 보고 공용 OCR 함수를 확정하면 쪽 전체 OCR 이 조용히 깎인다 — 두 경로 벤치를 다 돌린다.

사이클 4·14 — 링크·쉼표·번호 목록 꺾임, 두 단 아래 각주

  • 158·192: 링크 글이 주소 자체면 글만. 192: 자간 숫자 정규화가 ", 5." 앞 공백까지 지우던 것. 094: 줄 꺾임 판정이 링크 표지를 걷은 글로 길이를 잰다.
  • 링크 수리 뒤 015 가 4.21.3 보다 낮았다(0.948 → 0.947). 처음엔 채점기 셈으로 넘겼지만 실제는 읽기 순서 — 쪽 위 띠 + 두 단으로 갈린 쪽에서 왼 단 맨 아래 각주가 오른 단보다 먼저 읽혔다. 두 단 산문의 각주 띠 규칙(noteLines)을 splitTrailingColumnRegion 에도 → 015 0.986. "채점기 산물" 판정은 출력 diff 를 정답과 대조하기 전에 내리지 않는다.

사이클 8·13 — 벡터 막대 차트

  • 077: 격자 위 끝에 걸친 막대 값 "374" 가 두 번, 격자 옆 값 축 눈금이 축 이름·범례·출처와 한 무리가 되어 차트 값이 출처 뒤로 → 차트는 격자 글 전부
    • 격자 옆 값 축(숫자 넷 이상, 일정 간격 감소). 차트 경로 전수 조사(ODL 200 + 코퍼스 PDF 1,911건)에서 벡터 차트 판정 10문서 14곳, 중복 3문서 모두 덮음.
  • 077 범례 줄은 XY-Cut fallback 이 띠 높이로 문턱을 다시 재(최소 15pt) 18pt 틈에서 갈랐다. 쪽 문턱(21.9pt)을 하위 무리에 물려주는 범위를 세 번 좁혔다: 모든 하위 무리(글 벤치 11쌍 하락 — 중문 계약서 쌓인 줄이 한 줄로·교재 좁은 단 거터) → 네 줄 이하 띠의 단 절단만(서명란·한 줄 제목· 숫자 행 3쌍이 1521pt 틈에서 안 갈려 0.000010.0001 하락) → 벡터 차트 바로 밑(두 글자 크기 안) 네 줄 이하 띠의 단 절단만. 077 MHS 0.953 → 0.990.

사이클 11 — 그림 옆 단의 문단 끝줄

  • 133: 다른 단 맨 아래보다 낮은 줄을 쪽 꼬리말처럼 두 단 뒤로 보내는 규칙이 같은 단 줄 간격으로 이어진 문단 끝줄까지 보냈다 — 큰 틈(글자 크기 3배 초과) 뒤 줄만 꼬리로. 133 NID 0.966 → 0.992, 140 0.936 → 0.951.

사이클 15 — 차트 한 자리 눈금

  • ODL 결손 상위 문서를 정답과 낱말 단위로 대조해 갈래 지음(스크래치 odldiff.py): 그림 OCR 품질(027·124·070·106), 그림 안 각주(184, 범위 밖), 수식 LaTeX(144·145·109·165 — formulaOcr 를 켜면 오히려 145 0.928 → 0.787), 이스케이프(117 \_ 192개 — 단어 안 밑줄 이스케이프는 기존 테스트 정책), 제목(MHS 는 수준을 같게 봐 ### 대 # 는 무관 — 정답 제목 193개 전부 1단계).
  • 027: OCR 이 눈금 "2"·"5"·"8"·"6" 을 읽어 놓고 그림 영역 병합이 한 글자라 버렸다 → 같은 행(중심 0.35)·오른끝 열에 숫자 라벨 둘 이상이면 눈금. 첫 판은 128 이 떨어졌다(받은 눈금이 XY-Cut 조각마다 아래 끝 순서로 끼워져 "5 6 7 8 9 / 0 / 1" — 빠진 것보다 순서가 틀린 게 NID 에 더 비싸다) → 같은 영역 같은 줄 조각은 왼→오. 그 판은 057 이 떨어졌다(범례 "Biogas" 와 축 눈금 "300" 중심 어긋남 0.33 이 같은 줄로 잡혀 위→아래가 뒤집힘) → 같은 줄 기준 0.25(128 눈금 조각은 0).

묶은 트리 전 벤치에서 잡힌 것 둘

  • 열화 OCR(robust) 문서·조건별 6건 하락(평균 CER 은 9조건 모두 개선): 토글로 가르니 OCR 줄 묶음 규칙 셋 — 높이 2배 규칙 5건(기울어 키가 커진 긴 글줄·체크 표 "√" 옆 라벨·두 줄이 한 박스인 칸, 2.072.65배), 긴 글줄 5배 규칙 1건(web048 dpi150 서식 라벨 "3.대리인이될자의"·"주민등록번호" 폭 7.9·6.1배), 먼 조각 0.35 규칙(web051 skew-2, 기울기만큼 중심 어긋남). 기하로는 141 과 안 갈렸다(높이비 141 잡음 2.57·2.77, 세로 어긋남 141 00.32 대 서식 0.030.15). 갈린 축: 인식 신뢰도(141 잡음 0.600.75, 서식 박스 0.87 이상) → 높이 규칙은 0.8 미만 박스가 낄 때만, 긴 글줄은 폭 7배 이상(141 단 글줄 최소 7.8), 먼 조각 규칙은 그림 영역만. 그렇게 고친 트리 전 벤치에서 열화 OCR 1건이 새로 떨어졌다(goesan-budget-2013 skew+3 2.0 → 4.0%) — 먼 조각 규칙이 가려 주던 긴 글줄 규칙의 오판: 예산 표 행의 항목명(12.8배)과 먼 금액 칸 "경정4,200,000원"(9.5배)을 두 단 글줄로 봐 갈랐다. 긴 글줄은 숫자가 30% 미만인 상자만 → 7건 모두 4.21.3 CER, ODL 141·039·128·057·140 개선은 그대로. 토글 조합을 zsh 변수 하나로 넘겼다가(env $t, 낱말로 안 쪼개짐) 한 토글만 켜진 결과를 '셋 다'로 읽은 적도 있다 — 조합은 변수마다 적는다.
  • score PDF 커버리지 1건 하락(kats-ks표준안 0.99830 → 0.99827): 범인은 단 끝줄 수정(사이클 11). 그림이 좌우로 나란한 쪽 아래 전폭 본문 줄이 첫 낱말만 11pt 로 잡혀 figureColumnBands 의 크기 비교(2자 대 2자 동률)에서 두 단 줄로 판정되고, 낱말 틈 6.8pt 가 단 틈(최소 8)으로 쓰였다. 종전엔 꼬리 규칙이 그 줄들을 두 단 뒤로 보내 순서만 우연히 맞았다. full() 판정을 고치는 두 안(보통 낱말 간격 대비·중앙값)은 133·140·116 을 흔들어 버리고, 한쪽 "단" 이 반대쪽과 같은 높이 줄 하나뿐이면 그 무리를 가르지 않는 조건으로. 첫 판은 그 쪽에서 단 가르기를 통째로 포기(null)해 쪽 전체 클러스터 표 감지로 넘어갔고, 그림 라벨과 본문이 6열 가짜 표가 됐다 — 커버리지(글자 주머니)는 기준값이라 통과했지만 글 벤치 재현율 0.00003 하락으로 드러났다. 띠 단위 읽기는 유지하고 그 무리만 안 가르게 고쳐 다섯 문서 그대로, kats 커버리지·재현율 기준값. 교훈: 글자 주머니 지표가 돌아왔다고 출력이 맞은 게 아니다 — 고친 문서는 기본 옵션 출력을 눈으로 본다.
  • 교훈: 한 묶음 측정 중인 워크트리에서 단건 벤치를 돌리면 그 루트의 bench/out/ 결과 파일을 덮는다(suite 는 자식이 끝난 뒤 그 파일을 복사 — 자식이 죽으면 단건 결과를 전체로 오인). 단건 실험은 측정 안 하는 워크트리에서.

4.21.5 결과 (묶은 트리, 전 벤치)

  • ODL 200: 기본 0.95819 → 0.96289·plain+htmlTables 0.96998 → 0.97436·ocr: true 0.95966 → 0.96443·ocr: false 0.93611 → 0.93863. 네 모드 4.21.3 대비 문서별 하락 0. 4.18.6 대비(기본) 하락 3(100 −0.0020·134 −0.0015·115 NID −0.0003) — 원인은 위 사이클 5·12, 상승 41.
  • PDF 글 어절 F1 0.98815·표 exact 0.97941·OCR CER 0.0512·PDF 커버리지 0.99776 — 모두 문서별 하락 0(열화 OCR 포함).

4.21.6 — 표·시트·HWP3·수식·PPTX·코퍼스 (2026-10-09 밤)

  • 사이클 12 보도자료 연락처 표: 표 exact 실패 95표를 갈래 지어(표 못 찾음 40·열 수 차 15·행 수 차 21·둘 다 12·같은 크기 7) 열 수 차의 대표인 "담당 부서" 표를 고쳤다 — splitContactTables(4열 → HWPX 6열)가 부서마다 따로 병합된 블록과 줄마다 한 사람씩 든 담당자 칸도 가른다. PDF 표 구조 완전 일치 97.941% → 97.984%(156782525 표 4 → 5 exact, 156782476 내용 NED 0.186 → 0.285), 글 순서 156782525 0.984 → 1.
  • 사이클 9 넓은 시트: XLSX·XLS 가 HWP 표용 열 상한(200)을 시트에도 써서 KOSIS 통계표(426·365열) 칸 12,488개가 경고 없이 빠졌다 — 형식의 열 끝까지 받고 칸 예산(200만)으로 막는다. 새 KOSIS 표를 넣은 서식 모수에서 큰 시트 문자·숫자 0.997·0.934(4.21.5 코드, 게이트 실패) → 1·1.
  • 사이클 6 HWP3 그림: 본문 뒤 추가 정보 블록 #1 의 포함 그림을 읽는다 — 새 코퍼스 75건에서 그림 0 → 90장.
  • 사이클 7 수식: arXiv 별행 30개 recall 0.867 → 0.967·정확 일치 0.50 → 0.83·nedAll 0.182 → 0.055·BLEU-4 0.949 → 0.969(보고 전용 트랙 bench/formula-gt.mjs).
  • 사이클 10 PPTX 트랙·서식 코퍼스: pptx 27 첫 측정 1.0 → pptxRecall 1 게이트, docx 16·xlsx 15 추가(제외 2건 — ZIP 폭탄 상한 거부 xlsx, vMerge 정렬 문제 docx). rhwp 2차 hwpx 139·hwp 91 로 score 모수 hwpx 2,286 → 2,424·hwp쌍 1,120 → 1,130(지표 모두 1, MIN_POP 상향).
  • 사이클 16 토막 괘선(보류): 예산서의 줄마다 끊어 그린 열 괘선을 합집합으로 재면 고산 세입예산서는 OCR 과 같은 구조가 되지만 goheung 에서 위계 들여쓰기 선이 부모 행 글("고흥역사·문화인물조사")을 갈라 score 커버리지 3건 하락 — 4.21.6 에서 빼고, 행 병합이 오른쪽 경계를 행마다 보는 조건과 함께 다시 한다(그 조건만으로 goheung 커버리지 0.9993 → 1.0, 대신 eval-rda·kats 하락 — 문서별로 가를 것).
  • 결과(4.21.5 대비 전 벤치 문서별 하락 0): PDF 표 97.941 → 97.984%·칸 F1 0.99086 → 0.99110, 서식 146건 전 게이트 1, ODL·OCR·열화 OCR·별표·왕복·생성 같음.

4.21.7 — 토막 괘선 칸·글 조각 클립·연락처 (2026-10-10 새벽)

  • 토막 괘선(사이클 16): 예산서가 열 괘선을 상세 줄마다 끊어 그어(괴산 2022: 19pt 토막 30개) 칸 경계로 못 봐 다섯 열이 한 칸이 됐다. 끝이 맞닿은 토막 셋 이상의 줄기를 그 길이로 잰다. 첫 판(토막 합집합 전부)은 kats 개념도 상자 옆변을 이어 붙이고 고흥 세출예산서 부모 행 글을 갈랐다 — 맞닿음·셋 이상·토막으로만 선 경계는 토막 끊긴 아래 행까지 칸을 늘리지 않음으로 좁혔다. OCR 벤치 정답(같은 PDF 텍스트층)이 바로잡혀 CER 이 크게 준다.
  • 글 조각 클립(사이클 18): 커버리지 손실 상위(고흥 계획서 "과목표×222")를 따라가니 ezPDF·MS Print To PDF 의 낱말 클립(조각 시작 → 다음 조각 시작, 한 글줄 높이)이 1×3 표가 되어 라벨 "배경 및 필요성" 이 찢겨 있었다. 전수: 4문서 1,045곳(고흥 749·hwpspec 187·나라배움 103·평가 보고서 6). 한컴 칸 클립은 칸 안 여백만큼 글이 떨어지고 칸이 글줄보다 높다 — 그 둘로 가른다.
  • 연락처 표(사이클 19): 한 행이 패턴에 안 맞으면(닫는 괄호 빠짐·이름에 붙은 연락처) 6열 가르기를 통째로 포기했다. 모든 사람이 연락처를 붙여 쓴 표는 원문 HWPX 도 한 칸이었다(156775911, 4열) — 띄어 쓴 행이 있는 표만 가른다(156775926 6열).

4.21.7 에서 미룬 것 (다음 릴리스 후보, kordoc-c18)

릴리스 후보를 커밋 단위로 빼며 전 벤치를 다시 재 문서별 하락의 주인을 갈랐다:

묶음 하락 문서 원인 처리
칸 숫자 줄(17) 단독 가계동향 커버리지 0.98292 → 0.98215 금액 줄을 바로 가르자 통계표 열에 우연한 등간격 감소 넷이 생겨 차트로 오판 차트 판정 수정과 한 묶음
차트 판정 khs 2014 0.99922 → 0.99919, hwp3-sample16 0.99954 → 0.99908 khs 771쪽은 90° 돌려 찍은 가로 표(되살린 표가 행·열이 뒤바뀜), hwp3-sample16 별표2 는 몸통 격자 열이 둘씩 합쳐짐 돌린 표 세우기·좁은 열 무리·칸 걸친 조각 가르기(c18)
최소 열 폭 12pt 일괄 kpipa 영문 계약서 1 → 0.99942, cbe 0.99869 → 0.99857 홀로 좁은 들여쓰기 열이 서며 계약서 틀 표가 문단을 품었다 20pt 안 열이 다섯 넘게 이어진 무리만 12pt 까지(c18)
쪽 머리말 머리 행 SO-SUEOP 순서 0.9988 → 0.9857(띄어쓰기 0.9715 → 0.9773) 찢겨 모수 밖이던 해답 쪽 단위가 온전해져 모수에 들어왔다. 제자리(6→7쪽)는 6쪽 글자 관계도 표가 문답 줄까지 품어 쪽 넘김을 못 잇는다 관계도 그림 영역 인식과 함께
줄 머리 조사 이음 issue2019·tac-img-02·hwp3-sample11 띄어쓰기 진짜 어절 줄넘김은 원문 공백에서만 일어난다 — 작성자가 띈 "기간 에" 를 지웠다 버림. 글자 단위 줄나눔 오판(묶음 오른끝)이 근본

4.21.8 — 4.21.7 에서 미룬 표 묶음 (2026-10-10 새벽)

  • 하락 원인을 하나씩 풀었다: khs 771쪽은 90° 돌려 찍은 가로 표 — 칸 글의 80% 이상이 위로 진행하는 선 격자는 글과 괘선을 읽는 방향(x′=y, y′=쪽폭−x)으로 돌려 같은 쪽 파이프라인으로 세운다(코퍼스에 이런 격자 3곳: khs 2·cbe 1). 자간 벌린 글 분해가 돌린 글을 가로 축으로 쪼개 사업명이 칸 밖으로 새던 것도 같이. hwp3-sample16 별표2 는 몸통 격자 열이 둘씩 합쳐진 것(최소 열 폭 15pt) — 20pt 안 열이 다섯 넘게 이어진 무리만 12pt 까지 둔다(일괄 12pt 는 kpipa·cbe 들여쓰기 열을 세워 하락). 그래도 남은 한 행 값("2 100 1.0 … 10.0")은 pdf.js 조각 하나라 칸에 못 붙어 — 소수 덩어리 둘 이상인 숫자 조각은 자간 붙이기에서 빼고, 걸친 칸 수 = 낱말 수면 칸마다 한 낱말.
  • 열화 OCR 에서 web068 2쪽 clean 0.2385 → 0.2396: 좁은 열 무리 허용이 OCR 래스터 괘선(조직도 상자 변)에도 걸렸다 — 텍스트층 쪽에만.
  • 다음 사이클 후보(4.21.9, kordoc-r14): 줄 꺾임 어절 머리 증거 — 보도자료 99쌍에서 증거 없는 꺾임을 띄우던 기본값이 22% 틀렸다(낱말 가운데 꺾임). 두 음절 어절 머리 + 꼬리 기준 거부권 + 칸 글 제외로 글 벤치 UP 4·DOWN 0. 그 실측 경위는 아래 초안 정리 때 옮긴다.

4.21.9 — 줄 꺾임 이음·첨자 행 (2026-10-10 아침)

  • 줄 꺾임 판정 덤프 보정: 보도자료 100쌍 WJ 덤프의 기본 띄움(r13) 2,961곳 중 2,219곳은 xy-cut wrappedLineBands 가 어휘 없이 부른 중복 판정(줄 꺾임 여부만 쓰고 이음 글은 버림)이었다. 출력에 쓰인 판정만 보면 본문 r13 1,086곳 중 135곳(12%)이 틀리고, 출력 어휘로 모의해도 어절 머리 증거가 고칠 자리는 20곳(망침 5)뿐이다. 남은 오판은 대부분 명사+명사 합성어(원문도 붙이기·띄기가 섞인다).
  • 어절 머리 증거(두 음절 머리 + 꼬리 기준 거부권, 칸 글 제외): 한 음절 머리·앞 어절 통째 거부권 → UP 16·DOWN 5, 꼬리 거부권 → UP 9·DOWN 1 (칸 세로 이름표 "학⏎위⏎기⏎준"), 칸 글 제외 → UP 7·DOWN 1(편람 "처리⏎방안" ← "처리방법"), 두 음절 → UP 4·DOWN 0.
  • 겹조사·계사·접미사·명사+하다: 보조 용언 거름을 어미 꼴로 좁히자 "도출하겠다”고⏎하였다"(따옴표가 다·고 사이), "나도⏎할"(조사 도), "포함토록⏎하는"(-토록) 이 붙어 DOWN 4 → 따옴표 걷고, "도" 는 그대로, -토록 추가로 DOWN 0.
  • 첨자 행: 처음엔 앞 첨자를 숫자·따옴표·괄호로 좁혔다(적분 위끝 "3a+x" 가 다음 글자 앞에 붙어 교육 통합 정밀도 하락) — 그러자 부처 첨자 "행안부급경사지"·원문자 "①디스플레이" 상승분(사면재해 0.958→0.989·재정운용 모두발언 0.976→0.998)이 빠졌다. 라틴 글자·수식 기호 제외로 둘 다.
  • 폐기: 두 음절 배분 칸 어휘 다수결(해외직접투자 보도자료 연작 8건 DOWN — 원문이 벌린 이름표를 띄어 썼다). 보류: 표에 흡수된 머리·꼬리말 행 걷기(정밀도 +0.00026 이나 SO-SUEOP 재현율 −0.00007 — 정답 HWPX 가 머리말을 한 번 싣는다. PDF 쪽 정책 판단 필요).

4.21.10 — 표를 품은 클러스터 후보·괄호 풀이 (2026-10-10 오전)

  • 글 벤치 744쌍 어절 손실 집계(정답 HWPX·PDF 출력 어절 가방): 쪼갬 40%(한글|한글 1,922곳 — 손실의 30%), 붙임 16%, 기타 45%. 쪼갬의 "한글⏎(" 259곳 중 본문 꺾임에서 어절 안에서 닫히는 짧은 괄호만 붙였다(UP 40·DOWN 0). 처음엔 한글 낱말 뒤 괄호를 모두 붙였는데 DOWN 9(한 음절 "등⏎(국회의원)", 어절 밖으로 이어지는 긴 덧말 "건축공사⏎(추정가격 …") — 원문 띄움이 섞인다.
  • OCR 정답(텍스트층)이 틀린 흐름도: 사이버브릿지 선발 절차는 날짜가 상자 맨 아래인데 텍스트층 표가 날짜를 3행에 넣어 OCR(시각상 맞음)이 CER 13.7%였다. 처음엔 남은 글을 격자 표 띠마다 따로 클러스터 감지했는데(OCR CER 0.0443→0.0421) 표 블록이 있는 쪽 여럿의 클러스터 결과가 바뀌어 글·score DOWN 4 → 격자 표를 세로로 통째 품은 후보만 버리는 거름으로 좁혔다. 그래도 SO-SUEOP 22쪽 머리행 갈래 2열 거짓 표(가운데 관계도 표를 품음)가 버려지며 머리말이 제목 둘로 풀려 정밀도 DOWN → 품은 표와 열 수가 같은 후보만(이어 붙는 꼴만) 버린다.
  • 보류 재확인: 머리행 거름(SO-SUEOP 2열 거짓 표)·표 속 머리·꼬리말 행 걷기는 둘 다 정답 HWPX 의 "머리말 한 번" 정책과 부딪힌다(PDF 는 옵션 문서상 "머리글/바닥글 자동 제거"). 머리행 거름은 6쪽 글자 관계도가 다른 갈래(넓은 틈 다열 표)로 다시 표가 되는 문제도 남았다.
  • 열화 OCR 에서 기록관리 지침 2쪽 기울임 3° 가 0.080 → 0.183: OCR 래스터 괘선은 일부 행만 격자가 되고 클러스터 표가 나머지를 메우는데, 품은 표 거름이 그 3열 표를 문단으로 풀었다 → 텍스트층 쪽에만(좁은 열 무리 허용과 같은 교훈). 그러고도 pen-cyberbridge 열화 OCR clean 0.246 → 0.075 (정답 쪽 순서가 맞아져서)는 남는다.
  • 목차 가운뎃점 리더 걷기는 4.21.11 로 미뤘다: 리더를 걷자 OCR 정답(같은 파서 텍스트층)에 제목 끝 점이 남아 OCR DOWN 3(고흥·금천·나라배움 목차 — 제목 조각 폭이 첫 점보다 11pt 뒤까지 잡혀 붙은 점 판정을 비껴감), 겹침을 허용해 그걸 풀자 벼·고추 재배면적조사 글 읽기 순서가 0.98222 → 0.97609 (정확도는 0.99692 → 0.99949). 이 문서 목차 상자는 윗변에 걸친 "목 차" 칩의 세로변이 가짜 열이 돼 3×2 표(칸 순서 "□ 통계표" 먼저, 쪽 번호 "4"+"6" → "46")로 짜여 있어, 점이 떨어져 새로 맞은 낱말이 뒤섞인 순서로 LIS 를 깎았다. 라벨탭 상자 판정(칩 아래 전폭 80%+·칩 줄 짧은 제목뿐)을 함께 넣으면 이 문서 네 지표가 모두 오른다(재현율 0.99785 → 0.99979·정확도 0.94683 → 0.99979·순서 0.98222 → 0.9892·어절 F1 0.99373 → 0.99979) — 묶음 전체 검증 뒤 4.21.11 로 낸다.

4.21.11 — 목차 리더·라벨탭 상자·목차 칸 짝짓기·칸 첨자 (2026-10-10 오후)

  • 4.21.10 에서 뺀 목차 리더 걷기를 벼·고추 재배면적조사 목차 상자 수리와 함께 다시 넣었다. 그 상자는 윗변에 걸친 "목 차" 칩의 세로변이 가짜 열이 돼 3×2 표 (칸 순서 "□ 통계표" 먼저, 이웃 줄 쪽 번호 "4"+"6" → "46")로 짜였다. 프로즈 상자 판정은 80자 넘는 칸 셋을 요구해 짧은 줄만 든 목차를 놓쳤다 — 칩 아래가 통째로 전폭(높이 80%+)이고 칩 줄 글이 칩 안 짧은 제목뿐이면 글로 본다. 같은 판정이 일러두기 쪽 라벨탭 상자도 풀었다.
  • 목차 칸 짝짓기(ice-jci 현장실습 매뉴얼): 보이지 않는 클립 격자에서 제목 칸·쪽 번호 칸을 칸째 이어 "제목 제목 번호 번호"로 풀었다. PDF 칸 글줄 기준선 (CELL_LINES → 틀 풀기용 CELL_BASELINES)으로 줄끼리 짝짓는다. OCR 벤치는 양쪽 다 틀 풀기를 끄고 재서(layoutTables keep) 이 문서 CER(0.108)은 그대로다 — 기본 출력·커버리지에만 반영된다. 쪽 번호 칸 "124⏎135" → "124135" 는 숫자 줄 꺾임 판정의 "칸 채움 60%" 가 좁은 칸에서 뚫린 것.
  • 끝 채움(여수 목차 "7. 환 경 녹 지 국 ·······" | "3")을 걷자 짧아진 줄이 빌더 균등배분 접기에 걸려 "13.농업기술센터" → 목록 접두 "1. 13.…". 접기 안에서 번호 띄움을 남기니 HWPX 표 칸 이름표("1. 사 업 명" → "1. 사업명")까지 바뀌어 글 벤치 정답이 PDF 칸("1.사업명")에서 멀어졌다 (hwp3-sample16 DOWN) → 목록 렌더 경로에서만 되살린다.
  • 칸 첨자: 4.21.9 의 본문 줄 붙은 첨자 판정(isAttachedScripts)을 칸 글에도 — 서식 칸 "□예 □아니오"(약물운전자 정황진술보고서 커버리지 0.811 → 0.971), 칸 안 원문자 열 "① ② … ⑩"(장애친화 의료환경 보도자료 어절 F1 0.963 → 0.991·표 내용 NED 0.972 → 1).
  • 열화 OCR 표본 이동: 표본은 문서마다 "출력 글 200자 넘는 첫 쪽"이다. 리더 점이 빠진 목차 쪽 셋이 문턱 아래로 내려가 다음 쪽(여수는 조직도 7쪽, CER 0.43)이 뽑혀 집계가 올랐다. 같은 51쪽은 그대로, 여섯 쪽 고정 대조(_pin 판, 미추적)로 두 판이 아홉 열화 모두 같음을 확인했다. 표본 문턱에 맞추려고 쪽 품질 글자 수에 걷은 점을 도로 세는 건 표본기 맞추기라 하지 않았다.
  • 기각: OCR 표 세부 줄 행 나누기(속초 예산서 OCR CER 0.187 → 0.112 이지만 고흥 문화예산서 0.006 → 0.016 — 그림은 같은 꼴인데 정답 행 구조가 작성 방식에 따라 갈린다), 홀로 서는 한 음절 조각의 글자 쌍 증거 끄기(DOWN 18·UP 10), 부사 "안"+되다 띄움(원문이 "안된다" 로 붙여 쓴 문서 DOWN 2).
  • 첫 게시가 OCR 게이트(표 일치율 0.75 < 0.76·칸 F1 0.528 < 0.535)에서 멈췄다: 라벨탭 상자 수리로 교육청 학교 매뉴얼 목차 쪽의 깨진 5×6 격자가 풀리자 클러스터가 목차를 16×3 표로 다시 짰고, "괘선 3개 이상이면 목차도 표" 판정이 장 제목 밑줄 셋에 걸려 표로 남았다. OCR 은 목차를 표로 못 잡아 짝이 없는 정답 표가 하나 늘었다. 괘선이 행 절반 이상을 가를 때만 표 증거로 보고, 쪽 번호가 둘 묶인 행("51 65")도 목차로 보게 해 다시 쟀다(OCR 표 지표 4.21.10 값 복귀). suite 비교는 OCR 을 CER 로만 견줘 이 게이트를 못 봤다 — 게시 전 suite JSON 게이트 판정 점검(gatecheck)을 더했다.

4.21.12 — 칸 숫자 줄·걸친 글상자·배분 이름표·첨자 겹침 (2026-10-10 저녁)

  • 칸 숫자 줄 잇기(고속선 안전 코드 화재 구역 표): 쉼표 든 숫자 줄은 칸 끝 도달을 안 보고 이어 각주 첨자 "₃,₄" 가 아래 값 "60" 과 "3,460" 이 됐다. 칸 상자를 알면 숫자 이음은 모두 칸 채움을 요구한다. 그 바람에 ODL 180 판 이력 표 "April 30,⏎2022" 가 줄바꿈으로 갈려 NID 가 내려갔다(0.929 → 0.922) — 글 든 줄이 쉼표로 끝나 숫자 줄로 이어지면 낱말 사이 꺾임이라 공백으로 잇는다(정답 "April 30, 2022", TEDS 0.9755 → 0.9852).
  • 걸친 글상자(BookReview 책 소개 쪽 9×4 가짜 표): 첫 판 "서로 품지 않고 겹친 닫힌 사각형" 은 표 격자의 행 띠 × 열 띠와 ODL 078 막대 × 그림 영역도 잡았다. 꼭짓점이 남의 안쪽에 들고 그 꼭짓점에서 두 변이 끝나는 것만 걸침으로 보고(격자 꼭짓점은 선이 십자·T 로 지나감), 품은 상자는 빼고, 차트 판정 뒤에 둔다.
  • 배분 이름표(2025 건설업조사 "건 축"·"토 목"·시도 이름 67곳): 칸 글 조립은 칸 하나만 봐 이 문서에서 "건축" 이 홀로 선 어절로 안 나와 못 붙였다. 숫자 행 머리 두 음절이 칸을 꽉 채우면 어절 머리·시도 이름 증거로 붙인다. 첫 판(줄 폭 3배)은 원문이 띄운 "충 북"(넓은 칸 가운데)·"인 정"·"보 험" 까지 붙였다 — 칸 채움을 요구하고, 두 번째 음절 앞 진짜 공백 글리프(pdfjs 합성 공백 말고)가 있으면 원문이 띄운 칸이라 그대로 둔다. 칸 글 조립 자체를 "공백 글리프 없으면 붙임" 으로 바꾼 판은 해외직접투자 보도자료 넷(원문 "전 체" 띄움, 글리프 없음)이 DOWN — 공백 글리프는 "있으면 띄움" 쪽으로만 믿을 수 있다.
  • 첨자 겹침(특별교통대책 시간표 "부산(‘22년10:00 …"): 좌표 정수 반올림이 0.8pt 겹침을 2pt 로 키워 열둘 가운데 하나가 0.1em 허용을 넘었다. 0.25em 으로.
  • 기각: 앞질러 본 어휘(쪽 처리 전 전 쪽 텍스트층 어휘로, 근거 없어 띄우던 꺾임만 다시 판정) — 어절 F1 0.98874 → 0.98899 이지만 DOWN 52·UP 96·파싱 +8%. 뒤 어휘가 붙인 415곳 채점: 한 글자 쌍 본문 66:63, 두 글자 쌍 98:10(틀린 꼴은 같은 문서가 붙였다 띄웠다 하는 명사+명사 "주택공급⏎추진을"), 통째 낱말 14:0. pii_bunseok(재현율 0.968)·issue3236 은 rhwp 산 PDF 텍스트층에 조문 숫자·쉼표가 없다("제 항") — 파서 밖.

4.21.13 — 법령 별표 쪽 넘김 행: 번호 차례·"가)" 항목·쪽 넘는 글 칸 (2026-10-10 밤)

  • 별표 PDF 표 불일치 10문서 11표를 한 장씩 대조(annexdiff — 별표 벤치와 같은 짝짓기로 정답·출력 격자를 행마다 나란히). 대부분 쪽 넘김 행 판정이다. 고친 것: 허용물질 "12" / 다음 쪽 "13"(번호 열 차례 → 새 행), 보안심사대행기관 처분기준 "가) …" / "나) …"(한글 "가)" 꼴 항목 + 쪽 넘는 긴 칸은 두 행 덮는 칸).
  • 쪽 넘는 글 칸 규칙의 오판 둘을 전 벤치에서 잡았다: 총포화약법 "커. … 2) 2회 이상 위반" / "터. …"(뒤 조각이 새 항목 머리) — 별표 칸 F1 하락, 시험기준표 "겉모양, 치수, 무게" / "화학성분"(좁은 칸을 우연히 채운 한 줄) — 글 순서 하락. 다음 항목 증거가 있는 자리로 좁혔다.
  • 뺌: 범위어 이음("30%" / 다음 쪽 "미만" — 기본부과금 부과계수 머리 행). 별표 구조는 정답대로였지만 score 글 커버리지 1 → 0.9969 — 커버리지는 텍스트층 줄 단위 3-gram 가방이라 쪼개진 행을 칸째 이으면 쪽 줄 순서의 칸 경계 3-gram 이 사라진다.
  • 기각: 표지 공백(진짜 공백 글리프로 띄운 한 음절 — 외교부 인사 명단 "오 혜 진" 0.90 → 1)은 어절 F1 0.98874 → 0.98832, DOWN 66 — 표 머리 "신 보 직" (교정공무원 인사, 정답 "신보직")처럼 공백 글리프를 찍고도 원문이 붙인 배분 칸이 많다.
  • 보류: 쪽 경계 괘선 있는 쪼개진 행(자동차종합검사 "7천대 미만" / "7천대 이상 …", 가산대상 자격증 "해양교통시설"), 식품명인 "A." / "B."(행마다 항목 하나인 표와 못 가름), 벼·고추 연도별 표(겹줄 실낱 열 클립 없음), 한컴 PDF U+F000 글리프(청년일자리 회복방안 "▸" 71개 — 글리프 윤곽 지문 없이는 못 살림).
  • PR #142(@VerifiedIdiot, SDK 수명 관리 정리)를 최신 main 과 합친 상태로 검증해 병합했다: Node 3,500·parse-worker 27·Python SDK 66(Python 3.14) — 3.14 에서 "루프가 꺼내기 전에 끊긴 동기 close" 테스트가 매번 실패했다(3.14 run_coroutine_threadsafe 가 루프 스레드에서 만든 작업을 첫 걸음 전에 바로 취소 → aclose 가 닫기 작업을 못 만들어 워커 둘이 남음). _shutdown 이 닫기가 돌지 않았으면 남은 워커를 끝내게 고치고(652e8bb) CI python-sdk 를 3.11·3.14 행렬로.

4.21.14 — 한컴 PDF 유니코드 없는 기호 글리프(U+F000) 되살리기 (2026-10-10 밤)

  • 한컴 PDF 는 ToUnicode 를 못 만든 글리프를 전부 U+F000 으로 내 파서가 지워 왔다. 같은 글꼴 안에서 그 글리프들은 pdf.js fontChar(U+E007·E008 …)로 서로 갈리고, fontExtraProperties 로 쥔 변환 글꼴(OpenType, glyf)에서 윤곽을 읽을 수 있다. 글 벤치 54문서 F000 글리프 157종의 윤곽 서명(윤곽 수·점 수· 상자)을 HWPX 원문의 그 자리 글자와 대조하니 모양별로 글자가 거의 하나로 모였다 — 작은 오른쪽 삼각형 ▸ 114·네모 테두리 □ 67·겹 테두리 모서리 《·》(한컴 글꼴의 겹화살괄호, 위 왼쪽·아래 오른쪽 모서리로 가름)·일곱 점 화살표 ↓·큰 삼각형 ►. 되살린 263곳 모두 원문과 같았다.
  • 가는 가로 막대 194곳은 원문에 없는 칸 채움 글자라 그대로 지우고, 원문자 숫자(원 테두리 둘 + 숫자)는 같은 글리프가 문서마다 원문에서 ①·➌(mel-001)· ○(table-vpos-01) 로 갈려 넣지 않았다(숫자 자체는 구멍 수·위치·폭 비·위/아래 평평함으로 가를 수 있다 — 다음 후보).
  • score 커버리지가 22문서 내려갔다: 채점 정규화가 U+F000 을 양쪽에서 지워 텍스트층에 없는 이웃 3-gram("순보를")이 합의에 들어갔고, 되살린 "》" 가 그걸 끊었다. 합의가 F000 자리를 건너뛴 3-gram 을 빼게 채점 기준을 바꾸고(PUA 자리표시), 기준선도 새 채점기로 다시 쟀다.
  • 글 순서 hwp3-sample16 0.96765 → 0.96741 은 모수 이동: "□" 가 살아나 온전히 맞은 유닛 81개가 순서 모수에 새로 들어왔고 그중 3개(□ 사업수행 세부조직별 업무분장 등 — 정답 HWPX 는 떠 있는 표를 앞 문단에 고정해 표 뒤에 제목을 둔다)가 어긋났다. 종전 모수 1,453유닛의 순서 이탈 47개는 그대로다.

4.21.15 — PDF 줄 끝 공백 글리프로 어절 경계 꺾임 가르기 (2026-10-10 밤)

  • 글 벤치 어절 F1 손실 17,089 단위를 쪼갬(출력이 한 어절을 둘로, 42.7%)·붙임(18.3%)·기타(39.0%)로 나눴다. 쪼갬 2,432곳 가운데 1,762곳이 텍스트층 줄 꺾임 자리라 줄 잇기 판정이 주범이다. 기타는 그림 속 글·차트 축 이름표·세로 글·쪽 테두리 틀 안 바닥글처럼 갈래가 제각각이다.
  • 줄 잇기 판정(wrapJoiner)을 계측해 출력에 쓰이는 판정 4.4만 곳을 정답 어휘(붙임 꼴·띄움 꼴 출현)와 대조했다: 오답 2,299(5.5%), 가장 큰 덩어리는 기본 띄움(본문 오답 1,091 대 정답 7,538) — 대부분 명사+명사 합성어(업무⏎수행에·예방⏎수칙을)라 글로는 못 가른다.
  • 기하 신호: 한컴 PDF 는 어절마다 뒤 공백 글리프까지 찍는다. 줄 끝 아이템 뒤가 공백 글리프인 꺾임 1.2만 곳 가운데 원문 붙임 0. 반대로 공백 글리프가 없는 꺾임은 붙임 비율이 80% 뿐이다 — 한컴이 줄 폭을 넘는 줄 끝 공백을 버리는 자리("자리매김하도록⏎최선을")가 섞여 이 신호만으로는 못 붙인다.
  • 첫 측정은 글꼴별 흐름이라 다른 글꼴로 찍힌 공백("권리와¦␣¦동일한")을 놓쳤다. 연산 순서 전체 흐름으로 바꾸자 '공백 있음' 꺾임의 원문 붙임이 0 이 됐다.
  • 계측 함정: page-blocks 의 bodyLineJoins(lines) 호출(어휘 없이)은 꺾임 여부만 쓰고 공백 여부는 버린다. 이 자리 판정 2.8만 개를 빼지 않으면 기본 띄움 오답이 5배로 부풀어 보인다.
  • 하락 1문서(방사청 장갑형의무후송차량)는 정답 분할 차이다: 세로 이름표 칸 원문이 문단 "내" / "부 구" / "성" 이라 정답 어절은 한 자씩이고, 옛 출력 "내부구성"·새 출력 "내부 구성"(원문 "부 구" 공백을 따름) 모두 정답 어절과 안 맞는다. 새 출력이 어절 하나를 더 내 그 문서만 깎였다.
  • 남은 후보: 공백 찍는 문서의 공백 없음 + "한글⏎(" 꼴(붙임 28 대 띄움 1, 문서 단위 공백 비율이 필요), 쪽 테두리 틀 안 바닥글(hwp3-sample11 "DCT Technology Inc. N" 37쪽), 원문자 숫자.

4.21.16 — 쪽 넘김 갈린 행의 수량 이어짐 (2026-10-11 새벽)

  • PDF 표 구조 불일치 94표를 표 단위로 덤프해 갈래를 나눴다(벤치 사본에 불일치 표의 두 격자 덤프). 텍스트층 한글이 없는 쌍(hwpx_sample2·대형 칸 중첩표·hide_fill·당직일지)이 37표로 OCR 몫이고, 텍스트층 47표는 정답 기하 사정이 많다 — HWPX 칸 크기 값이 열마다 살짝 엇갈려 기하 격자에 틈새 행이 생기는데 한컴 렌더(PDF 칸 클립)는 같은 경계를 쓴다(기후대응위 일정표 196.6·228.3…, 연락처 표 601.1 대 601.3). HWPX 에서 따로인 두 표를 쪽 넘김 병합이 의미대로 잇는 경우("계속" 표, 세금포인트 사용처)와 바깥 틀 안에 쌓인 두 표가 틈 띠로 한 표가 되는 경우(의료혁신위원회 전략도)도 있다.
  • 법령 별표 오답 9표 중 대기환경보전법 기본부과금 표만 규칙 하나로 풀렸다: 쪽 넘김에 갈린 머리 행 "30%" / "미만". 갈린 행 병합 거절 이유를 계측하니 괘선 있는 쪽 경계(ruled)라 글 이어짐 증거를 요구하는데 좁은 가운데 정렬 칸이라 끝줄이 칸을 채우지 않았다.
  • 나머지 별표 오답: 자동차검사(한 칸 안 줄마다 항목, 쪽 넘김에서 두 행), 식품명인(한 칸 안 "A." / "B." 목록 — 행마다 항목 하나인 표와 글로 못 가름), 과징금(HWPX 틈새 행), 경찰복제·총포화약법·가산대상·할당관세.
  • 어절 F1 쪽: 공백 글리프 없는 꺾임의 붙임/띄움은 어휘 쌍 횟수 비율·줄 오른끝 여유로도 안 갈렸다(증거 없는 기본 띄움 자리 붙임 908 대 띄움 3,448, 맨 명사 2음절 부분집합도 215 대 53). ODL 은 남은 손실 대부분이 그림 속 글(OCR)이다(184 각주, 148 차트 제목, 122 표 그림).

4.21.17 — 공백 없는 꽉 찬 줄 끝 + 다음 줄 괄호 (2026-10-11 새벽)

  • 4.21.15 의 줄 끝 공백 글리프 신호 반대쪽(공백 없음)은 홀로는 붙임 비율 80% 라 못 썼다. 꼴별로 나누자 "한글⏎(" 만 깨끗했다: 공백을 찍는 쪽·공백 없음·지금 띄움 자리에서 붙임 97 대 띄움 3. 띄움 셋 가운데 둘(hwp3-sample "좋으며⏎(more")은 공백을 찍지 않는 쪽이고, 하나(ASEAN "인증⏎(Advancing")는 원문 줄바꿈을 줄 꺾임으로 잘못 본 자리 — 줄 오른끝이 0.30em 덜 찼다(붙임 정답 줄은 거의 다 0.10em 안). 공백을 찍는 쪽 판정을 쪽 단위(줄 끝 5곳 이상·20%)로, 꽉 찬 줄을 블록 오른끝 0.2em 안으로 두니 붙임 86 대 띄움 0.
  • 첫 측정에서 6문서가 내려갔다: 대조 표본(텍스트층 줄 끝과 판정 기록이 맞물린 자리) 밖의 한글·숫자 괄호("등⏎(국회의원)"·"지역⏎(2024년"· "강력탈취⏎(상쾌한향…)"·"카드⏎(유학국")는 원문이 띄웠다. 표본 안 붙임 정답은 거의 다 영문·경로·연도 괄호라 다음 줄 첫 글자를 "(" + 라틴·/·’ 로 좁혔다(표본 붙임 78 대 띄움 0) — 6문서는 4.21.16 값으로 돌아왔다.
  • 접은 가설들: 공백 없음 꺾임의 붙임/띄움을 문서 어휘 쌍 횟수 비율·줄 오른끝 여유·줄 낱말 틈 크기(양쪽 정렬로 늘린 폭)로 가르려 했으나 모두 안 갈렸다. 낱말에 붙은 글머리 기호는 자동 글머리(HWPX 글에 없음)와 글에 든 기호를 PDF 에서 가를 신호가 없었다(따로 선 기호 아이템·틈 0 도 정답 붙임 295 대 띄움 39). 쪽 테두리 틀 안 바닥글(hwp3-sample11)은 머리말 제거가 틀 풀기보다 먼저 돌아 틀 칸 안 줄을 봐야 해 보류.

4.21.18 — 쪽 넘김 문단 잇기의 줄 끝 공백 거부 (2026-10-11 새벽)

  • 줄 잇기 판정을 부르는 자리 가운데 줄 끝 공백 거부(4.21.15)가 빠진 곳이 쪽 넘김 문단 잇기(joinPageBreakWraps)였다 — 판정 기록에서 그 자리 오답 17 가운데 붙여서 틀린 7곳. 글 정리 단계 줄 잇기(cleanPdfText)는 아이템 정보가 없어 같은 거부를 못 건다.
  • 접은 실험: 글 정리 줄 잇기에 문서 어휘 사전을 넘기기(어절 F1 0.98986 → 0.98984, 하락 17), 줄 TJ 수치(자간) 편차로 공백 없음 꺾임 가르기(띄움 정답 비율 구간마다 26~49%). ODL best 모드는 OCR 이 아니라 출력 형식(plain·HTML 표)이라 파서 품질 지렛대가 아니다.

4.21.19 — 쌓인 클립 표를 묶은 괘선 격자 버리기 (2026-10-11 새벽)

  • 읽기 순서 하위 보도자료(16개 광역 지자체 수출, 순서 0.954) 12·13쪽은 지역마다 머리 줄 → 표 → 각주가 되풀이되는데 출력은 머리·각주가 먼저 몰리고 표 여섯이 뒤였다. 바깥 세로 괘선이 쌓인 표 여섯을 이어 line 그리드 하나(47행)가 표들과 사이 글줄을 묶었고, 클립 표와 절반 넘게 겹치는 격자만 버리던 규칙은 표 하나하나가 격자의 6분의 1이라 못 걸렀다.
  • 첫 규칙(겹친 클립 표 넓이 합이 절반을 넘으면 버림)은 공표 일정 5×2(행 넷 가운데 둘만 클립, line 그리드가 진짜 표)를 깼다. 틈 높이 40pt 상한으로 좁히자 안전했지만 쪽 테두리 틀(hwp3-sample16, 틈 최대 155pt)·칠곡군·사업체노동력 이득이 함께 사라졌다. 같은 계측 줄로 찍어 보니 가르는 값은 틈을 지나는 안쪽 세로 괘선 수 — 5×2 는 틈마다 열 괘선 1개, 잘못 묶인 격자는 0개(바깥 테두리만)였다.
  • 이 기준으로 바꾸자 수출·칠곡군·hwp3-sample16·사업체노동력·aift 5문서의 읽기 순서가 오르고 표는 그대로(5×2 지킴). 하락 0.

4.21.20 — 괘선 없는 표 칸의 어절 가운데 꺾임 (2026-10-11 아침)

  • 어절 F1 손실 상위 SO-SUEOP(0.972)의 쪼갬 대부분이 "보|여"·"모|든"·"남|편이" — 쪽마다 둘러친 틀 표의 칸 글이다. 이 표는 괘선 없는 표 탐지(cluster-detector)가 만들고, 칸의 이어지는 줄은 행 병합(후처리 1)이 늘 공백으로 붙였다. 줄 잇기 판정 기록에 이 자리가 없어 출력에서 거꾸로 찾았다.
  • 이 문서는 줄 끝 공백 글리프를 하나도 찍지 않는다(12쪽 줄 끝 43곳 중 0, 글리프 맞추기는 46쪽 모두 끝까지 됨) — 공백 없음 표시를 요구하면 이득이 0이라 선 표 칸 경로처럼 "공백 글리프가 확실히 있으면 띄움" 으로 맞췄다.
  • 첫 측정 하락 2: 가운데 맞춘 "부 칙" 의 "칙" 이 열 오른끝에 닿아 64pt 아래 "이 규칙은" 과 붙었고(두 줄 다 열 왼끝 3글자 안 조건으로 막음), 신구조문 대비표의 밑줄 친 "…계약의 체" + 밑줄 없는 "결" 은 원문에서 다른 글상자였다(밑줄이 줄 경계에서 끊기면 띄움).
  • 접은 가설: footnote_tail 의 본문 꽉 찬 줄 끝 쪼갬("더 광범⏎위한")은 공백 없음 + 양쪽 다 낱말 꼴이라 4.21.17 에서 접은 부류. 칸 안 어휘 증거 0 꼴은 정답 띄움 547 대 붙임 207 이라 기본 띄움이 맞다. 칸 상자 없이 칸 글을 잇는 다른 경로(가로 괘선 표·글상자 표·덜 쪼갠 표)는 744쌍에서 여러 줄 칸이 18곳뿐. ODL MHS 최하위(148·141)는 그림 속 차트 제목, PDF 표 남은 불일치(연락처 표·의료혁신 전략 상자)는 HWPX 칸 크기 엇갈림·보이는 표 정의 쪽.

4.21.21 — 쪽 테두리 틀 안 바닥글·첨부 이름표 머리말 오검출 (2026-10-11 오전)

  • 4.21.15 부터 남은 후보. hwp3-sample11 정확도 손실(938자)의 대부분이 바닥글 "DCT Technology Inc. N" — 쪽 테두리 상자가 쪽 글을 한 블록으로 묶어 바닥글이 쪽 높이 문단 끝 줄(5쪽)·쪽 끝 표 끝 행(13쪽 등)·바닥글만 든 쪽 높이 문단(27쪽)이 되어 띠 판정을 비켜 갔다.
  • 첫 판(머리·바닥 띠 둘 다)은 5문서를 깎았다: 머리 띠의 첨부 이름표("[ 별지 제6호 서식 ]"·"<붙임1>"·"<별지 서식 제8호>")를 종전 띠 판정이 "숫자만 바뀌는 러닝 머리말" 로 지우고 있었고(이 판 이전부터의 오검출), 흡수된 줄 걷기가 그 꼴을 넓혔다. 숫자 없는 꼴까지 걷으면 score 커버리지 2문서(함평·고흥 사업 계획서 — 쪽마다 아래에 되풀이되는 사업 담당 줄)가 깎여 쪽 번호 꼴로만 좁혔다.
  • 종전 오검출 고침: 처음엔 "쪽 − 숫자 일정" 만 쪽 번호로 봤더니 2쪽 모음 인쇄("- 1 -"·"- 2 -" 가 한 쪽)·장마다 다시 매기는 쪽 번호(aift)·쪽마다 다른 내려받기 도장이 안 지워져 5문서가 깎였다(입찰동향 표 내용 NED 1 → 0.47). 가르는 값은 숫자가 낱말에 붙었나 — 쪽 번호·도장은 떨어져 있고 서식 번호("붙임2"·"제3호")는 붙어 있다.
  • 그래도 남은 오검출: 머리 띠의 드문 강의 번호 "강의 01."·부속서 제목 "부속서 3" 은 숫자가 떨어져 있어 쪽 번호처럼 보였다 — 머리 띠의 드문 꼴은 쪽 − 숫자가 일정해야 쪽 번호로 본다. 같은 조건을 바닥 띠에도 쓰면 선박 코드의 각주 줄("제19장 부속서 3의 2.3.5 참조 - 역주")이 남아 쪽 끝에 놓여 순서가 깎여(0.99417 → 0.99392), 바닥 띠는 종전대로 둔다.
  • 남은 하락 SO-SUEOP 재현율 3자: 정답의 각주 번호가 유닛 안에 두 번 든 자리("111)…111)①")를 예전엔 바닥글 쪽 번호 숫자(20·21)가 메워 맞은 것으로 셌다 — 바닥글을 걷어 그 우연한 짝이 사라졌다(같은 문서 정확도 0.99368 → 0.99783).

4.21.22 — 양쪽 정렬 참고문헌 줄의 열 오검출 (2026-10-11 낮)

  • web052(Word 템플릿) 3쪽 오른 단 참고문헌이 "Optimal its Machineability," Considering Synthesis A …" 로 뒤섞였다. 양쪽 정렬로 낱말 틈이 고르게 벌어진 줄을 열로 본 것 — 고른 틈 줄 방어(ODL 043)가 소문자로 여는 낱말 절반을 요구해 낱말마다 대문자인 참고문헌 제목 줄이 비켜 갔다. 낱말 끝 문장 부호(글자 뒤 쉼표·마침표, 따옴표 닫힘)도 문장 증거로 받는다. ODL 4모드 문서별 변화 없음.
  • 다음 후보(측정 전): 쪽 넘김에 갈린 행에서 거의 모든 행에 차는 열(근거 조문)이 뒤 조각에서만 비면 이어진 한 행(총포화약법 행정처분기준 "아. 법에 의한 지시명령 위반" / "1) 1회 위반 …") — 단일 문서로 표 1/1 이 되었고 전체 측정은 남았다(c71 8237ba5 위). 접은 것: 서식 안내 말풍선(web006)은 쪽 옆 색인 탭과 같은 꼴, 머리 띠 "(서식 N)"(pair11)은 쪽 번호와 기하로 못 가름, ODL 표 하위(197·122)는 정답 해석·깨진 글자.