pub fn normalize_project_code(raw: &str) -> Result<String, AppError>
Project codes: 1–32 characters A-Z 0-9 _ -, normalised to upper case.
A-Z 0-9 _ -