There was a few issues here. None of which are documented very well. And all crash with the same error message.
(1) My orginal .xcdatamodel file didn't have a Core Data Model Identifier. Which lead to a crash with NSCustomMigrationStage, even though the versionChecksum are different.
(2) The steps passed into NSStagedMigrationManager are not clear or documented. But it appears that if you pass the first version of the model into the steps, it crashes.
(3) I'm using manual code generation for the model classes. So my goal was to switch the model names, then switch them back, so I didn't have to change anything.
For some reason, stepping through the one migration step per app launch instead of all at once allowed for a successful migration. But running all steps threw an error.
Turns out I could just rename the model classes with the _v2 suffix, and the only thing I needed to update was the string in the fetch request.
Overall, to resolve this
I added a model version identifier
I duplicated the model version and incremented the model version identifier
Deleted the final migration step that removed the entity versioning