Since the available methods are affected by which traits are visible, you can already (theoretically) change the meaning of code by carelessly moving it between modules, not to mention between crates. So unless the odds of such collisions become much greater with inherent methods than with traits, I don’t care too much.
Perhaps there should be a warning for when a local inherent method collides with an upstream inherent method, if that is even allowed. It’s super confusing and unnecessary (since you don’t export it, you can always change the name of the extension method).
This is already true! If you add an inherent method which has the same name as some applicable trait method, but a different signature, code stops compiling because inherent methods trump trait methods. For std these issues are discussed and addressed in RFC 1105 (btw, I got that example verbatim from the RFC text). Virtually any change to the API surface can break someone’s code, hence the RFC’s distinction between minor changes that can break stuff but are trivial (perhaps even automatic) to repair, and serious backwards compatibility problems.
It seems like it should be possible to design the rules such that this reasoning remains sound (upstream adding a method never silently breaks, at most requires disambiguation) but it’s not entirely clear to me how this would best be achieved.