Совместимость публичного API: что можно менять без смены мажорной версии
Правило простое на словах и коварное на практике: внутри мажорной версии код потребителей обязан продолжать компилироваться. Безопасно добавлять: новые функции, типы, методы к своим структурам, поля в структуры, которые никто не создаёт позиционным литералом. Ломает совместимость очевидное — удаление, переименование, изменение сигнатуры — и неочевидное, на чём и ловят. Добавление метода в опубликованный интерфейс ломает все внешние реализации, поэтому расширяют интерфейсы новым интерфейсом, а не правкой старого. Добавление поля в структуру ломает литералы вида Config{5, 10} без имён полей; страхуются, встраивая пустую некопируемую структуру или требуя конструктор. Изменение типа поля или константы ломает присваивания. Отдельная категория — изменения поведения при неизменных сигнатурах: они компилируются, но ломают потребителей молча, и потому опаснее. Проверять это глазами не нужно — есть apidiff и золотые файлы.