Если мы провели оптимизацию нашей библиотеки без изменения поведения, то из-за наших оптимизаций какие-то потоки будут работать быстрее, и в неправильном многопоточном коде возникнут новые race conditions и дедлоки.
Если мы добавили какие-то функции в интерфейс, то поедет карта памяти, какие-то указатели будут указывать в другие места. Раньше адрес функции делился на 64, а теперь нет.
Мы добавили новую функцию, и какой-то код про reflection выдаёт другой список методов.
Значит, при любом изменении библиотеки нужно увеличивать её major version, так как можно придумать код который падает от таких изменений?
Поскольку в теории и на практике (см. memcpy-срач) такой код существует, то получается всегда-всегда надо увеличивать мажорную версию библиотеки. А минорных просто не существует. Ну или считать их просто вероятностным признаком, типа "мы не знаем что может сломаться, если пользователь либы не слишком хакер и не слишком обезьяна".