Pages whose column structure changes down the page (newsletter bands,
figure-split flows, a three-column strip inside a two-column page) cannot
be represented by one full-height column set: the projection profile
either finds nothing and Y-interleaves the columns, or weaves the odd
band's text into the wrong buckets.
- Split pages into horizontal bands at full-width whitespace gaps (wide
spanning items are excluded from occupancy — separators sit inside the
very gaps being sought), detect columns independently per band, and
re-merge consecutive bands with matching gutters across empty gaps so
figure floats keep flowing down their columns while headline-separated
bands stay independent.
- Engage only on contradicting evidence: a prose-validated band whose
column count differs from the page-level structure. Pages the flat
column model already explains keep their current ordering.
- Read short prose columns (5-14 lines, >=60% width fill on >=60% of
lines in every column) as newspaper instead of Y-interleaving them as
tabular. Kept as a standalone reading-order refinement so the table
pipeline's is_newspaper_layout veto is unaffected.
- Split ordering entry points: order_multi_column_region keeps every
page-level defense; order_validated_band (banded planner only) trusts
validated bands, skipping line-count minimums and straggler splitting
that would misfire on Y-cohesive bands.