Importing a roster can no longer move a student who is already on it.
If a CSV row used the email address of someone already at your school, the
import quietly re-filed that person into whatever grade and school year the row
named, and then told you it had created a new student. Re-uploading a corrected
roster mid-year was enough to move a real child into the wrong grade.
Those rows are now left alone. The student stays exactly where you put them,
and the import tells you the row was skipped because that person is already
here. The results screen now lists every row that was skipped and every row
that could not be imported, alongside the ones that were created, so the
numbers add up to what actually happened.
Uploading your roster again to fill in guardian addresses still works: a
guardian on a skipped row is added to the student that row matched. When one
cannot be added, the results screen now says which row and why, instead of
leaving you to find out later.