The contract is functions not members, and Clojure has a way to declare public and private fns, so what's your argument?
When I release a new major version of Foo Lib, and your program refers to private members, your program will break when I remove or rename them.
Immutability won't protect you from that.