That is only the beginning, isn’t it? The hard part is figuring out how to migrate state, and clearly saying “no” when that fails instead of leaving the user to debug a configuration that could not have arisen had the new code been started from a clean slate. (I don’t think that’s actually possible to disprove, even, but at the very least guaranteeing that memory contains the types the new code thinks it does would be good.)