As these things change, the contracts have to be exchanged with every member of the cluster which would not only add significant communication overhead, it would also bypass those compile time guarantees.
That's before even considering things like hot deploys where the code is updated live, while running, mid-execution.
The contract enforcement becomes akin to the goals of WSDL, which added a ton of overhead with minimal benefit aside from making consuming APIs easier for statically typed languages because of generators.
Is the overhead worth the difference from...
Client (this message will fail on this server) -> don't send
to...
Client -> (this message failed)
Especially when talking about a cluster which you own...that benefit is questionable at best.
It doesn't cover every case, but it covers enough of them to provide a very watchful eye without getting in your way.
https://speakerdeck.com/jvoegele/elixirconf-2016-dialyzer-op...