Assign each chunk to the single best-matching section by label/text token
overlap (deterministic, GPU-free), so each section drafts only from its own
sub-topic chunks and the (chunk → section) edge is recorded. A chunk with no
overlap lands in the first section; sections that win no chunk are dropped by
the caller so we never draft an empty section.
Assign each chunk to the single best-matching section by label/text token overlap (deterministic, GPU-free), so each section drafts only from its own sub-topic chunks and the (chunk → section) edge is recorded. A chunk with no overlap lands in the first section; sections that win no chunk are dropped by the caller so we never draft an empty section.