Okay, so if the idea is to keep orphan rules but allow a true third-party to provide arbitrary implementations, then the question is how to restrict this to minimize potential for conflicts. One option was to allow certain traits to opt out of the orphan rules, but it seems unclear from here when a trait should decide to do this. And your true third-party can’t exist without this annotation, so we’re back to crates having to bless extensions, at least in a general sense if not individually.
Another angle would be to only allow arbitrary impls in special extension crates which can only be imported in the root crate (like a crate for an executable, but making allowances for testing as well). Such crates could be forbidden from having public members to ensure there’s no secondary reason to import one vs another, minimizing the likelihood of someone wanting to depend on two incompatible extensions.
Crates that want to depend on an implementation being present in the final executable (other than the final executable) would have to use something equivalent to a where clause, essentially saying a particular function, impl, etc… or perhaps crate as a whole is contingent on that impl existing, which would then propagate to any context using it up until the final executable, which has to provide the implementation.
This would probably still be problematic due to blanket impls and such, which can result in a particular combination of impls being incompatible. This can happen today in a single crate, but it’s limited in that that crate won’t compile with the incompatibility. Under this kind of system, whole libraries/ecosystems could be successfully compiled using incompatible constraints, and you’d only get an error once you tried to combine them, at which point it would be irreconcilable.