And now back to the proposal for the cadence change itself (this is still me talking as an individual contributor - the SC doesn’t have a collective opinion yet, although we’re definitely sympathetic to the motivation behind the proposal).
As noted above, I think an annual cadence would align nicely with other events in the Python ecosystem (most notably PyCon US and the now annual core development sprints).
However, I think going to a full supported-for-6-years release every year would increase community support matrices too much (this increased support burden was the main concern that stalled the previous proposals for more frequent standard library updates that were independent of core interpreter updates).
We’re talking more test runs in CI, more binary wheels on PyPI, more of everything. All of that would be wasted collective effort and resources if the intended target audience for the new release cadence is folks who are going to be upgrading to new feature releases almost as soon as they’re available (and that’s presumably the case - folks who aren’t already asking “That feature is committed to the CPython repo, why can’t I already use it in production/at school/wherever?” aren’t bothered by our release cadence being relatively slow).
So my proposal would be to go for something that’s closer to a hybrid of the Fedora and Ubuntu lifecycles (as well as drawing inspiration from the Django release cadence): alternate between our existing regular support period (which I’ll call a “Standard Lifecycle Release”) and a new reduced support period that pretty much only lasts until the next feature release (which I’ll call a “Minimal Lifecycle Release”).
In this variant of the proposal, we’d have an alternating cadence where 3.8 would be a Standard Lifecycle Release, and receive bugfix releases for 2 years (until late 2021), and then security updates for a further 5 years after that (until late 2026). By contrast, 3.9 would be a Minimal Lifecycle Release (starting in late 2020), and its support period would be greatly truncated: after a final bug fix release alongside the 3.10.0 release (in late 2021), Python 3.9 would go into security fix only mode only until the 3.10.1 maintenance release. This approach would mean that if you chose to migrate from 3.8 to 3.9, you’d also be committing to migrate to 3.10 almost as soon as it was available. Alternatively, folks that didn’t want to make that commitment could stick with 3.8 until 3.10 was available.
From a support matrix perspective, the idea would be that community projects would face the following combinations:
- active bug fix branches: 1 (e.g. 3.8 prior to 3.9 release) or 2 (e.g. 3.8 and 3.9 prior to 3.10 release)
- active security-only branches: usually 3, occasionally 4 (during the couple of months where a Minimal release is being dropped from the matrix)
That’s still a larger support matrix than today, but it’s not dramatically larger the way it would be if we did a standard lifecycle release every year.
To help folks keep track of which releases were supported and in what state, we’d need to enhance our download pages and our developer guide with a diagram and supporting table akin to those the Django project uses to explain their release status at https://www.djangoproject.com/download/#supported-versions
(Note: I’m deliberately avoiding the “LTS” term, since I want to keep that reserved for the separate “Extended (aka Enterprise) Lifecycle for Python” concept at https://github.com/elpython/elpython-meta/blob/master/README.md, which aims to reduce the developer experience harms of LTS Linux distros keeping legacy Python versions alive for extended periods in response to commercial demand)