Another interesting point is that the "public contract", or API surface, of the project should not be broken unless the change is universally considered to be the right thing to do:
https://rfc.zeromq.org/spec/42/#26-evolution-of-public-contracts
This means that the project *should* be free to ship new releases regularly and users can upgrade without concern for behavior or API breaking changes.
The solution is to use new names for the changed "contracts" without changing the existing contracts. Not easy to do, but possible!
@daviwil ... but also not that hard to do, either! In terms of programming API, leave old function signatures untouched (or append parameters with default values, or overloads with more parameters), for example. That's more or less standard practice, no?