pub fn build_direction(
focus: &FocusMap,
out_of_diff_by_file: &FxHashMap<String, Vec<String>>,
routing: &RoutingFacts,
) -> ReviewDirectionExpand description
Build the review direction. The SPINE is the change itself: every reviewable
focus unit (review_here + the deprioritized escape hatch), so the
direction is never empty when there is code to review. Ownership routing is a
LEFT-JOINED overlay for the optional expert field, NOT the spine: sourcing
the work-list from routing made it empty on solo / author’s-own-PR changes (no
one else to ask), which is exactly the cloud’s dominant case. Each unit carries
its scoring_budget (the focus composite score) so a fan-out spends AI
proportional to risk, its per-file out_of_diff consumers, and the
concern_lens. Non-source churn is excluded. Units with out-of-diff consumers
sort first (load-bearing definitions before mechanical churn), then by budget.