pub fn extract_headings(html: &str) -> Vec<String>
Second pass specifically for heading extraction (cheap — headings are sparse). Called after the main metadata extraction to keep the main function clean.