I absolutely agree. I usually wind up submitting PRs for pretty much every program I use; every time I find any kind of bug, I submit an issue, and then immediately take a stab at fixing it myself. I'm not against forking projects in the slightest, and if anything I'm also not entirely pleased with how my solution would result in fewer PRs.
In this particular instance though, I'm doing something that quite frankly shouldn't be a PR. I don't think the items I need access to should be publicly accessible, since in the 99.9% of cases, having access to it would just cause issues and be more confusing for developers. It shouldn't be popping up in intellisense for anyone.
However, the problem is that it's blanket-blocked without any way to get around it, when there are still 1 in 1000 people who genuinely need that information and don't have any other option.
It's like if the Windows Registry were made inaccessible on principle. Yes, for literally 99.999% of users it will only cause trouble if they have access, but restricting access entirely makes 100% of the 0.001%'s needs completely impossible.
It shouldn't be easy, it shouldn't be promoted, and heck it shouldn't even be a "stable" feature. But preventing jailbreaking altogether without even the most obscure workaround is not the right move, and that's why I'm so passionate about this.
Thank you so much for explaining it! I didn't think about cargo doing silent updates; that explains so much about everyone's responses. I was thinking "just be careful when updating!", but no, that does actually make complete sense. Of course you can bind to a non-minorpatch subversion and have changes happen under your nose. That's my bad.
In that case, stressing that possibility to the user by adding a warning and confirmation pop-up on update would be the best idea.
Ideally, bypassing visibility would be a nightly-only, unsafe feature, enabling the feature would be explicitly stated in the docs to be an absolute last resort, and enabling it would cause warnings and confirmations in cargo when attempting to update due to the potential semver complications, and hell it should probably throw a linting warning on use too like unsafe operations inside unsafe functions. Those last two would further dissuade people from using it unnecessarily, since no one likes build warnings. Overall, this would serve to allow the possibility while making it annoying as hell to access, which is far better than being outright disallowed by the compiler in all circumstances without recourse.
I don't like the idea of permanently babysitting a terminal fork, since that adds several dozen layers onto maintaining the project and makes it significantly harder to keep your unsafe changes catalogued as well. I really don't like other declaration-based strategies for the same reason: I wouldn't want to accidentally use a formerly-private function somewhere I genuinely don't need it, but changing the source makes it pop up like any other instead of being a case-by-case basis. Ideally the best strategy would be usage-focused so you know where your changes are and what you need to pay special attention to.