As for cibuildwheel, the problem with shipping a binary with an ABI change is that it’s really hard to know you need to fix it, and to fix it
Yeah, I’m worried about asking maintainers to try to patch over ABI breaks. Relatedly, ABI compatibility in Python: How hard could it be? | Trail of Bits Blog
Adjusting the labelling of the releases is pure marketing […] ultimately, the point of all pre-stable releases is that we can make changes
I think an ABI freeze is more than just marketing, also marketing is useful when getting people to try a thing! Empirically, as far as I can recall, we’ve been able to do a good job avoiding ABI breaks. The one case I remember is 3.9.3 (which wasn’t even a pre-release)
I still want to wait for 3.13 final release before releasing a version/wheel […] When CPython puts out a release and calls it 3.13.0rc2 rather than 3.13.0 final it does so very deliberately with the understanding that it reserves the right to make further incompatible changes.
While maintainers do have the ability to prevent user installations prior to final release for regular extension modules, this isn’t true of pure Python (or limited API) wheels, so CPython’s incentives are very aligned with “try to keep already uploaded wheel working” come RC time.
I also found Thomas’ explanation in this thread of why changes in 3.13 release candidate are considered much riskier than the things we backport to 3.13 patch releases quite compelling (otherwise by and large the branch policies seem similar between RC and patch phases).
Anyway, I’d like for risk averse maintainers to not have any reservations releasing wheels in the release candidate stage. This makes me feel more warmly about a gamma phase to help communicate to maintainers who are more risk averse and to avoid any potential dilution of what “release candidate” implies. Something like:
- 6 months alpha (anything goes)
- 2 months beta (feature freeze)
- 2 months gamma (abi freeze, encourage wheel building, cibuildwheel does so by default, etc)
- 2 months RC (minimal changes, branch locking, really we try to ensure this is maximally similar to final)
Compared to today’s lifecycle, RC1 happens at the same time (2 months before final). But hopefully we’d have more confidence by then than we do today, and subsequently we’d get even more workloads tested during the RC period.
Also do note technically you can yank a wheel or shadow it with a wheel with a higher build tag (or even delete a wheel).
I never realised just how similar the beta and RC candidates are intended to be to the real release […] others in that boat
Thanks for sharing! The good news is the graphs indicate that more people seem to believe this I also wonder if some of the effect is people getting more accustomed to the yearly schedule
I should note, since people will sometimes look at the absolute values on this plot and say that 3.x isn’t ready to be used: a lot of packages support 3.13
Yup, that’s right. In my sample of 1312 packages we use at work on Python 3.11, only 771 have an explicit wheel or classifier for 3.11, and at the time my workplace upgraded to 3.11 under 600 did
What I’m most curious about though is the “network topology” of these updates
I’ll do some digging and report back if there are nice graphs to be had
Opinionated summary of thread
People seem to agree it would be good to try to extend the period of time prior to release when it’s easy to install third party dependencies, and that this would likely help us get feedback sooner.
While some folks seem in favour of a different release lifecycle to enable that, there’s also support for accomplishing this goal with some form of auxiliary index or versioning scheme or “experimental wheels”. My cynical take is that a solution requiring packaging infrastructure is less likely to be implemented and less likely to be discovered or understood by users.