pub fn parse_ranges(spec: &str) -> Result<Vec<Range>, String>
Parse a LIST specification like “1,3-5,7-” into ranges. Each range is 1-based. Returns sorted, merged ranges.