You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
ci: declare the Python version tiers in one file, so EOL and new releases are a one-line change #1660
Python versions are spelled out separately across many files. #1645 touched 27 of them:
the matrices in unit-tests.yml, python-compatibility.yml, create-release.yml, cron-conda.yml and lint.yml
pyproject.toml classifiers
util/ci_timing.py
the docs and the bug-report template
Moving 3.11 to KTLO at its end of life, or adding 3.16 as a pre-release leg, means repeating that whole sweep, and PyPy and other distributions multiply it.
Proposal
One data file (e.g. .github/python-versions.json) lists, per implementation (CPython, PyPy, ...), the versions in each tier: supported (blocking), KTLO (non-blocking), and pre-release (non-blocking).
Workflows read it. Each workflow builds its matrix from that file through a small matrix job and fromJSON. Required-check names stay stable.
A test pins the rest to it: classifiers, docs version lists, and the bug template.
A scheduled job compares the file with python.org's release-cycle data and PyPy's releases, and opens an issue when a version reaches end of life or a new pre-release appears.
A tier change then becomes a one-line edit plus a ruleset update.
Blocked until #1645 merges, because both edit every matrix.
Scope, from the owner in chat: the scheduled check also watches whether GitHub-hosted runners still provide each version, not just python.org's release cycle. setup-python's versions-manifest.json lists builds per Ubuntu release, and those runner images get retired. When no hosted image can provide a version any more, it leaves the GHA matrix. 3.6 is the current case: its only builds target ubuntu-18.04 and 20.04, both retired, so it stays out of KTLO.
Still blocked, now on two PRs that edit the same matrices: #1656 (create-release.yml), and the 3.7 KTLO follow-up to #1645 (unit-tests.yml, python-compatibility.yml), which is being written. This starts once both have merged.
One more scope item, from the owner in chat: jobs that run on a single interpreter (the gates, the full suite, coverage, lint, docs) always use the newest supported version. #1661 moves them to 3.15 now. The tier file here should then define that "latest" pointer, so the next bump moves them too.
Still blocked, now only on the 3.7 KTLO PR for #1633, which is being written. #1656 has merged.
Scope update, from the owner in chat: #1661 is folded in here.
The tier file also names the latest supported version.
Every job that runs on a single interpreter (the gates, the full suite, coverage, lint, docs, timing, the crons and the release helpers) reads that pointer instead of pinning a version.
A test audits that no job pins a version outside the file.
The scheduled monitor proposes the bump when a new release becomes supported.
That makes 3.15 for those jobs the first change made through the file. #1661's inventory of the pins, with whether each job's dependencies install on 3.15, will be posted here when it lands.
Unblocked: #1665 has merged. A worker has Part A: the tier file with a latest pointer, workflows that read it, and tests that audit it. Job and required-check names stay identical. The monitor (Part B) comes in a follow-up, so its PR will say Part of #1660.
The #1661 inventory is carried into Part A. Every single-interpreter job moves to 3.15 except these, each recorded with its reason:
lint stays on 3.14. Under 3.15, pylint 4.1.3 / astroid 4.3.4 crashes on pcapkit/toolkit/dpkt.py (F0002), and E1101 goes from 12 to 35. bandit, mypy and vermin give the same results on both versions.
conda's setup-miniconda != '3.15' (conda has no py315 build), engine-tests' KTLO 3.10 step, and pypcap-parity's APT_CACHE_SAVE == '3.11'.
What was measured on 3.15:
The docs build, the vendor regeneration, conda-dist, the sdist (sha256-identical to 3.14's), make_samples and all 11 unittest-ordering cells match 3.14.
CI's 3.15 unit leg has a median of 9.3 min against the 45 min cap.
One thing: which Python lint runs on. The details are on #1677 (the PR for Part A). Lint is the only single-interpreter job not moving to 3.15, because on 3.15 pylint 4.1.3 / astroid 4.3.4 crashes on pcapkit/toolkit/dpkt.py and its E1101 count moves from 12 to 35. bandit, mypy and vermin agree on both versions.
Lint on 3.15, with only pylint held on 3.14 until astroid handles 3.15 (recommended).
Lint entirely on 3.15, accepting pylint's crash and the changed counts.
Two behaviours of the auto-updater, first raised on #1716, which merged with today's behaviour in place:
A proposal you close without merging comes back the next Monday, and asks for the github-release approval again each week.
Recommended: remember a fingerprint of the closed proposal, and propose again only when the tiers change.
Or keep it as is.
A merge of main into bot/python-versions that carries conflict-resolution edits counts as a plain merge, so a later publish would overwrite those edits.
Recommended: treat a merge whose tree differs from a clean merge as a hand edit, which blocks publish.
Or keep it as is.
Not a decision, but a one-time step only you can take: add Pull requests: read and write to the pypcapkit-release App, then accept the permission on its installation. The first scheduled run needs it.
Nothing else is waiting on you here. The GraalPy and free-threaded experimental tier (option 1) starts next.
Recorded: the pypcapkit-release App has Pull requests read and write, so the first scheduled run can open its proposal. The two behaviours above (a closed proposal returning each Monday, and conflict edits in a merge of main) still need your call. The recommended options are listed with each.
if the conflict-resolution edits are necessary for the code to run, i say we keep the current logic. they're fine to tbe overwritten if they're no longer needed.
Recorded, both as they are now, so the updater needs no change:
A proposal closed without merging comes back the next Monday.
A merge of main into bot/python-versions counts as a plain merge, so a later publish may overwrite its conflict edits. Those edits are fine to lose once they are no longer needed.
This leaves only the experimental tier (GraalPy, free-threaded CPython), which is in its second review round.
Promoting the experimental legs needs them green first, and that work is now tracked in #1731 (two 3.14t test failures) and #1732 (GraalPy reaches 26% of the suite before its cap, decision needed). Closing.
Activity
JarryShaw commentedon Oct 13, 2026
Two updates.
Scope, from the owner in chat: the scheduled check also watches whether GitHub-hosted runners still provide each version, not just python.org's release cycle. setup-python's
versions-manifest.jsonlists builds per Ubuntu release, and those runner images get retired. When no hosted image can provide a version any more, it leaves the GHA matrix. 3.6 is the current case: its only builds target ubuntu-18.04 and 20.04, both retired, so it stays out of KTLO.Still blocked, now on two PRs that edit the same matrices: #1656 (
create-release.yml), and the 3.7 KTLO follow-up to #1645 (unit-tests.yml,python-compatibility.yml), which is being written. This starts once both have merged.JarryShaw commentedon Oct 13, 2026
One more scope item, from the owner in chat: jobs that run on a single interpreter (the gates, the full suite, coverage, lint, docs) always use the newest supported version. #1661 moves them to 3.15 now. The tier file here should then define that "latest" pointer, so the next bump moves them too.
Still blocked, now only on the 3.7 KTLO PR for #1633, which is being written. #1656 has merged.
JarryShaw commentedon Oct 13, 2026
Scope update, from the owner in chat: #1661 is folded in here.
That makes 3.15 for those jobs the first change made through the file. #1661's inventory of the pins, with whether each job's dependencies install on 3.15, will be posted here when it lands.
JarryShaw commentedon Oct 13, 2026
The 3.7 KTLO change is now #1665. This stays blocked until it merges.
JarryShaw commentedon Oct 13, 2026
Unblocked: #1665 has merged. A worker has Part A: the tier file with a latest pointer, workflows that read it, and tests that audit it. Job and required-check names stay identical. The monitor (Part B) comes in a follow-up, so its PR will say
Part of #1660.The #1661 inventory is carried into Part A. Every single-interpreter job moves to 3.15 except these, each recorded with its reason:
pcapkit/toolkit/dpkt.py(F0002), and E1101 goes from 12 to 35. bandit, mypy and vermin give the same results on both versions.!= '3.15'(conda has no py315 build), engine-tests' KTLO3.10step, and pypcap-parity'sAPT_CACHE_SAVE == '3.11'.What was measured on 3.15:
JarryShaw commentedon Oct 13, 2026
What needs my decision?
JarryShaw commentedon Oct 13, 2026
One thing: which Python lint runs on. The details are on #1677 (the PR for Part A). Lint is the only single-interpreter job not moving to 3.15, because on 3.15 pylint 4.1.3 / astroid 4.3.4 crashes on
pcapkit/toolkit/dpkt.pyand its E1101 count moves from 12 to 35. bandit, mypy and vermin agree on both versions.25 remaining items
JarryShaw commentedon Oct 14, 2026
What needs my decision?
JarryShaw commentedon Oct 14, 2026
Two behaviours of the auto-updater, first raised on #1716, which merged with today's behaviour in place:
github-releaseapproval again each week.mainintobot/python-versionsthat carries conflict-resolution edits counts as a plain merge, so a laterpublishwould overwrite those edits.publish.Not a decision, but a one-time step only you can take: add Pull requests: read and write to the
pypcapkit-releaseApp, then accept the permission on its installation. The first scheduled run needs it.Nothing else is waiting on you here. The GraalPy and free-threaded
experimentaltier (option 1) starts next.JarryShaw commentedon Oct 14, 2026
done
JarryShaw commentedon Oct 14, 2026
Recorded: the
pypcapkit-releaseApp has Pull requests read and write, so the first scheduled run can open its proposal. The two behaviours above (a closed proposal returning each Monday, and conflict edits in a merge ofmain) still need your call. The recommended options are listed with each.JarryShaw commentedon Oct 14, 2026
JarryShaw commentedon Oct 14, 2026
Recorded, both as they are now, so the updater needs no change:
mainintobot/python-versionscounts as a plain merge, so a laterpublishmay overwrite its conflict edits. Those edits are fine to lose once they are no longer needed.This leaves only the
experimentaltier (GraalPy, free-threaded CPython), which is in its second review round.ci(python): run GraalPy and free-threaded CPython as experimental, no…
JarryShaw commentedon Oct 14, 2026
Every part of this has landed:
Promoting the experimental legs needs them green first, and that work is now tracked in #1731 (two 3.14t test failures) and #1732 (GraalPy reaches 26% of the suite before its cap, decision needed). Closing.
fix(conda): build each macOS conda package on its own architecture (#…
fix(conda): build each macOS conda package on its own architecture (#…