Many of the responses in this discussion are hard to square with my understanding of what the proposal is. It seems possible that a difference in our understandings is the role of pub(restricted) in making this system work.
As Aaron mentioned yesterday, pub currently operates with a dual meaning - it could mean either “public to the world” as opposed to a restricted visibility, or it could mean “public to my parent” - my parent might re-export it, but it also might not. Based on that first understanding, Niko had previously proposed linting against someone declaring an item pub if it isn’t actually visible in your API. Because pub(restricted) is unstable, I imagine a huge portion of the items in Rust crates would fall afoul of that lint today.
One of the major advantages of this proposal is that pub occupies a single meaning, instead of this dual meaning that it currently inhabits. If you don’t want an item to be a part of your public API, you don’t mark it pub, because that’s what pub means. You mark it pub(crate) or pub(super) or some other restriction.
I’ve gotten the distinct sense that people think this proposal is apathetic to the idea of a carefully crafted public API, but it is entirely opposite. The goal is to make it easier to control what is public and what isn’t, by making it a decision local to the item definition.
There are a few cases which don’t fit into this, in which you for various reasons want an item to be public, but not at its definition site. The #[internal] attribute is intended for resolving that narrower use case.