SemVer isn’t good enough. I sympathize with your view, for the average user, if something breaks for any (undocumented) reason at all (with an upgrade of Julia, or even any package), then it’s a problem (the solution, for now, not upgrade anything, including Julia, keep the Manifest), and the ideal would be it CAN’T happen (encapsulation). If you couldn’t rely on internals of Julia (or some package), then things would be better. I’m not sure e.g. you can do that with Java. I understand the JVM has excellent compatibility with new versions. [Yes, old versions may have security issues, so you need to upgrade.] I don’t have enough practical knowledge about e.g. Python (or Perl), to know it it’s as good, or better than Julia that way. [Python is similar to Julia, in that you can access (and mutate) internals (of structs), no “private”, so a potential (actual?) problem there. It might extend to the standard library of Python, but I do not know it it extends to the core of Python, its VM. One solution for Julia and Pyton I see is to aggressively trim the standard library, then less stuff can actually break, and fewer internals to access, but you would just move the breakage to the package ecosystem… so I’m still concerned with the semantic issue.]
Julia is the first language I follow the closely the development of (even first open source project I really follow), and it does seem to have a fair amount of regressions, before release, I guess that’s normal. Sometimes regressions persist after release (or new bugs), why we have minor updates. I think the only sane option, for now, is to not upgrade (for production) to new releases immediately, e.g. 1.9. But the older version, and I expect for 1.8 too, is immediately dropped from support as soon as new are out. So you’re out of support unless you use LTS.
That’s one perspective (ok by SemVer). I would want to know what those packages are. For e.g. C++, with encapsulation, that wouldn’t be possible (because of private by default, well “friend” is an intentional exception), and you would get a compile time error. In Julia only at best a run-time error, I guess that’s likely, but you can’t check for sure (I suppose the “hating problem” theoretically, though in many cases practically possible with static analysis). Are there any tools that check for use of internals? Could packages that do such be marked somehow? And such be made “friends” of other packages, in the C++ sense?
Is that what happens? Do you mean with --depwarn=yes?
People will use internals because they can. I’m conflicted about if Julia should allow it, but it would now be a breaking change (ironic) to disallow such. Would it be possible to begin with to have a runtime flag to show such?
I guess the good thing is that, even when packages break, the ecosystem does react quickly. Or it does, have you had to wait long until fixed (for some specific package, how long)?