We built the recommended fix for single-fact OCR omission. It didn't work — and the reason is worth knowing.

TL;DR: In our OCR-omission article we showed that 7.7% of expert-labeled facts vanish from OCR output while the document quality score reads 0.998, and that a geometric ink-coverage check catches region-scale loss but not single missing numbers (point-biserial 0.18). We named the obvious finer instrument: layout-model coverage — score the regions a layout detector finds against the OCR blocks that fill them. We built it and measured it on the same two ground-truth datasets. Result: it is the sharpest occlusion detector we have measured (11× separation on annotated signature/logo zones, vs the geometric signal's 5.4×) — and it fails the single-fact test it was built for: point-biserial 0.136, below the geometric baseline's 0.18. Every number is a point-in-time measurement (2026-07-12), committed in content/layout_results.toml and reproducible with the commands at the end.

The hypothesis

The geometric signal's weakness had a clean explanation: a dropped financial number is a few pixels among thousands, so it barely dents a whole-page uncovered-ink ratio. The natural fix is granularity. Instead of asking "is the ink on this page accounted for?", ask "is each region a layout detector finds actually filled by OCR blocks?" A region-sized question should notice a region-sized hole.

So we built it: PaddleOCR's LayoutDetection (PP-DocLayout_plus-L) proposes layout regions per page; each region is scored by the fraction of its area covered by OCR block bounding boxes (fill_ratio); a region below the fill threshold counts as uncovered, and the document's layout_omission_score is the fraction of regions left unfilled. Inference is disk-cached per page, and the signal is additive — two new optional fields on the quality report, with the quality score itself byte-for-byte unchanged.

Result 1: the sharpest occlusion signal we've measured

On the 57 real scanned pages (Tobacco800) with expert-annotated signature/logo zones:

inside annotated zones elsewhere
mean region fill ratio 0.503 0.866
uncovered-region rate 0.495 0.044

That uncovered-region separation is 11× — roughly double the geometric ink signal's 5.4×, and the in-zone fill is lower on 45/57 pages (79%). For the question that matters in contract-archive migration — was this document ever physically signed, is a stamp being silently dropped — layout regions are the right granularity to route human review to, and clearly better than anything we had before.

If that were the headline, this would be a victory post. It isn't, because the occlusion case wasn't the open problem.

Result 2: the fact-level gap does not close

The open problem was single-fact omission — the 7.7% of expert-labeled facts that vanish silently. Same measurement as the geometric run, on the same 85 degraded SEC pages (21 carry at least one omitted gold fact):

signal point-biserial vs has-omission verdict
geometric ink coverage (baseline) 0.18 weak
layout-model coverage (the "fix") 0.136 weaker

The mean separation actually widens — pages with an omitted fact average layout-omission 0.095 vs 0.031 on clean pages (~3×, vs the geometric ~1.8×) — but the per-page correlation is noise-dominated (pearson -0.058). A wider mean gap with a worse correlation means the signal fires on the wrong pages too often to route on.

Why finer geometry cannot fix this

The refutation is more useful than the number, because it sharpens the mechanism. A dropped number does not usually live in a region the layout detector flags as empty. It lives in a region OCR partially filled: the detector draws a text block, OCR reads most of it, and one value inside it is silently gone. The region's fill ratio stays above any reasonable threshold, so the region counts as covered.

That kills the whole family of fixes, not just this one. Partial fill looks like full fill at every geometric granularity — page, region, or line — because the failure is not spatial. The missing information is a value, and only something that reasons about values can notice its absence: numeric cross-verification (totals that must sum, percentages that must add up), a targeted second OCR pass over low-fill regions, or cross-checking two independent engines. Coverage signals — geometric or layout-model — are region-scale occlusion detectors, full stop.

What this means for your pipeline

Honest limitations

Reproduce it yourself

git clone <repo> && cd contract-rag && uv sync --extra dev
uv pip install paddleocr paddlepaddle
# Build the OCR caches first (gated/external datasets — see the OCR-omission article):
uv run python -m contract_rag.eval.fincritical
uv run python -m contract_rag.eval.realscan
# Then the layout-coverage validation (layout inference disk-cached per page):
uv run python -m contract_rag.eval.layout_coverage

If your numbers differ materially, open an issue — negative results only stay useful while they stay true.