pub fn required_for(
changed: &[String],
categories: &[Vec<String>],
roots: &[Node],
) -> RequiredSetExpand description
2026-09-26: Compute both halves. categories is every recorded
classification path; an empty slice (not classified) or an empty roots
yields an empty intent half.