pub fn save_notes(notes: &[Note]) -> Result<(), String>
Persist notes to disk using atomic replacement via a temporary file to reduce corruption risk.