I would be happy if each project would just explain in some standard way what its approach to source and binary compatibility is. But it would certainly be nice to have a way to specify so sbt won’t complain.
Another thing I wanted to mention is that I’ve done something like this a few times:
// old method
private[mypackage] def foo(bar: Bar): Unit = newFoo(bar, defaultBaz)
// new method
def foo(bar: Bar, baz: Baz): Unit = ???
This is another example of a binary-compatible change that’s not source compatible. By using package private, anyone recompiling has to use the new method, but the old method is still available without polluting the public scala API. I think this is a nice strategy for evolving APIs in a binary compatible way.