If you want to remove a concept from a language that is in active use, you should deprecate it first, write a migration and remove it later.

When you remove the concept, you will also have to remove the migration that references it, otherwise the migration will become broken.

If you leave a “hole” in the migration order, for example by removing a migration from version 5 to 6 while keeping migrations from 4 to 5 and from 6 to 7, MPS will complain that a migration is missing. However, make no mistake: you can still remove migrations, you just need to remove all the preceding ones as well.

The preceding migrations would have become useless anyway, as it would no longer have been possible to migrate to the newest version due to the hole.

You can also modify old migrations. In some situations, rather than removing a migration and having to remove all the preceding ones, it might make sense to instead make the body of the migration empty.