Skip to content

ci(matrix): split Python into supported 3.11-3.15 and non-blocking KTLO 3.8-3.10 (#1633) - #1645

Merged
JarryShaw merged 2 commits into
mainfrom
ci/1633-python-matrix-tiers
Oct 13, 2026
Merged

JarryShaw merged 2 commits into
mainfrom
ci/1633-python-matrix-tiers

Conversation

@JarryShaw

Copy link
Copy Markdown
Owner

Please follow the guide below

What is the purpose of your pull request?

Tick the commit type your subject line carries.

  • fix — corrects a defect
  • feat — adds a feature
  • perf — changes performance, not behaviour
  • refactor — changes neither behaviour nor performance
  • test — tests only
  • docs — documentation only
  • ci — workflows or build tooling
  • release — bumps the version or rolls up a distribution
  • chore — anything else

Description of your pull request and other information

Tiers. 3.11-3.15 now blocks in every matrix: unit tests, compatibility, conda and PyPI. Compat's schedule-only 3.15 job is gone. The KTLO tier is 3.10 (and pypy3.10) wherever it ran, plus 3.8/3.9 in test, integration and compat, which run on ubuntu-24.04. A KTLO leg never blocks. Jobs read through one needs.<job>.result (test, integration, pypcap-parity, pypi) keep a KTLO failure inside step-level continue-on-error: ${{ matrix.ktlo == true }} (unit-tests.yml:74-89). Compat uses the job-level form (python-compatibility.yml:39-61), and engine-tests runs its 3.10 cell as a separate step (unit-tests.yml:873). Every KTLO leg's name ends in (KTLO). 3.8/3.9 are not in engine-tests or pypcap-parity: both run on ubuntu-latest, which has no setup-python 26.04 build of either, and neither job was measured on them.

Release. PyPI completeness now counts only the 7 supported files (create-release.yml:256,285). Each KTLO leg records its outcome (:690), and Release status reports it as a notice (:1013). There is no conda 3.10 leg, because soupsieve==3.0.3 needs Python >=3.11.5. On conda 3.15, base keeps its own Python (:872, cron-conda.yml:288): setup-miniconda installs python-version into base, and conda has no py315 build.

Measured. python.org's release-cycle data lists 3.10 as end-of-life since 2026-10-01 and 3.15 at bugfix since 2026-10-09. In setup-python's manifest, the last Ubuntu with a build is 24.04 for 3.8 and 3.9, 22.04 for 3.7 and 20.04 for 3.6. On 3.8 and 3.9, .[test,DPKT,crypto,NGAP] installs and pcapkit imports. tests/corekit and tests/utilities gave 11 failures in 698 on 3.8 and 7 on 3.9, against 0 on 3.10 and 3.15. 3.6 and 3.7 are left out: 3.7 fails import pcapkit with a SyntaxError (corekit/io.py:103), and 3.6 has no setuptools>=61. Neither can install pytest>=8. In Docker, python=3.15 into base failed with "Conda cannot remove itself", and conda build --python 3.15 with base left alone built and imported pypcapkit-1.5.0b9-py315_0.

The classifiers list 3.11-3.15 only, since a version classifier claims support and KTLO does not. requires-python stays >=3.6, <4.

Ruleset 23497679, for the owner. No job emits Compat Python 3.10 any more (that leg is now Compat Python 3.10 (KTLO)), so this PR cannot meet the ruleset as it stands. Safe order: merge it with the owner bypass, then make ONE ruleset edit that removes Compat Python 3.10 and adds Compat Python 3.15. Adding 3.15 before the merge strands every other open PR, because their base does not emit that job.

New tests/project/test_python_matrix_tiers_1633.py has 17 tests. Against origin/main's workflows, pyproject.toml and util/ci_timing.py, 15 of them fail (pytest: 50 failed, counting subtests). Two read prose against the matrices: the leg counts in workflows.rst:247-250, and a denylist of retired claims (3.10 as CI's floor, 3.15 as allowed to fail, e.g. the benchmark's 3.15 note). All pass here, as do 21 regression files and the benchmark's TestPinsFile.

Closes #1633

…LO 3.8-3.10

- Unit Tests, Python Compatibility, conda and PyPI: 3.11-3.15 is the blocking
  tier in every matrix; Compat's schedule-only 3.15 job is retired.
- KTLO tier: 3.10 wherever it ran, plus 3.8/3.9 in test, integration and
  compat (ubuntu-24.04). Jobs read through one needs.<job>.result keep a KTLO
  failure inside step-level continue-on-error; compat uses the job-level form.
  KTLO legs are suffixed "(KTLO)" so no required context matches one.
- create-release: PyPI completeness counts the 7 supported files only; each
  KTLO leg records its outcome as a job output that Release status reports as
  a notice. No conda 3.10 leg: soupsieve==3.0.3 needs Python >=3.11.5.
- conda 3.15 leaves base on its own Python: conda has no py315 build yet.
- pyproject: classifiers list the supported tier; requires-python unchanged.
- ci_timing, bug report template, README, SECURITY, docs, the benchmark's
  3.15 note and comments follow.

New tests/project/test_python_matrix_tiers_1633.py: 17 tests, 50 failures
against origin/main's workflows and config, green here; regression files green.

Closes #1633
@JarryShaw JarryShaw added ci Pull requests that change CI or workflow configuration (ci: subject prefix) review: good-to-go Cross-review at the current head says ready; CI state is separate labels Oct 13, 2026
@JarryShaw

Copy link
Copy Markdown
Owner Author

Verdict: GOOD TO GO at c7401aad0. Sonnet cross-review, two rounds; round 1 asked only for stale prose. I re-ran the new test myself: 17 OK, and 49 failures plus 1 error against origin/main's workflows, pyproject.toml and util/ci_timing.py. It merges cleanly with #1642, #1644 and #1641's next head.

Two things are yours to decide:

  1. Ruleset. Compat Python 3.10 is now Compat Python 3.10 (KTLO), so this PR stays blocked until you merge it with bypass. Then remove Compat Python 3.10 and add Compat Python 3.15 in one edit.
  2. Conda 3.10 is not built at all, rather than built as a non-blocking leg. The soupsieve==3.0.3 pin needs Python >= 3.11.5, so that leg could only fail. If you want it kept as KTLO anyway, that is a one-line matrix change.

Advisory, not blocking: a KTLO leg can still fail its job by hitting the job-level timeout. 3.15 conda and a full 3.15 test run are not verified locally.

@JarryShaw JarryShaw moved this to In review in PyPCAPKit Oct 13, 2026
@github-actions

github-actions Bot commented Oct 13, 2026 •

Copy link
Copy Markdown
Contributor

Coverage: 89.67% (unit tier, Python 3.14, 1f3f723bb, Unit Tests run success)

Package Statements Missed Branches Partial Cover
pcapkit (top level) 104 3 20 3 95.16%
pcapkit/const 18858 954 2366 868 91.06%
pcapkit/corekit 2366 67 760 35 96.48%
pcapkit/dumpkit 275 3 100 3 98.40%
pcapkit/foundation 2884 145 1010 35 94.14%
pcapkit/interface 138 7 52 5 93.68%
pcapkit/protocols 17166 226 4580 191 98.06%
pcapkit/toolkit 1046 166 386 5 82.61%
pcapkit/utilities 494 4 146 4 98.75%
pcapkit/vendor 4409 2342 1006 157 43.25%

Per-file detail: the coverage-html artifact of this run.

@JarryShaw

Copy link
Copy Markdown
Owner Author

Not ready yet. The 3.15 legs are blocking now, and they fail on two tests that the schedule-only leg had hidden:

Both are being fixed separately. This PR's own change is unaffected.

@JarryShaw

Copy link
Copy Markdown
Owner Author

The red 3.15 legs here predate their fixes, which are now on main as #1653 (1c5efaff9) and 9df91d4ae. I merged this PR into current main in a scratch tree, with fixtures generated, and ran:

  • the two tests that failed on 3.15: test_const_apptype_lazy_1538_unit (14 passed) and test_engine_pcap_trace_runtime (13 passed);
  • test_dpkt_timestamp_copy_1647_unit (4 passed);
  • this PR's test_python_matrix_tiers_1633 (17 passed on 3.14).

All green on 3.15.0 and 3.14, and the merge is clean. With #1633 settled as option 1, this is ready for your bypass merge, followed by the one ruleset edit.

@JarryShaw

Copy link
Copy Markdown
Owner Author

Verdict: GOOD TO GO at 1f3f723bb. It is your merge of main into c7401aad0. Its tree is b0ceef616, the same tree I tested above: the 3.15 tests pass, and so does test_python_matrix_tiers_1633. Ready for your bypass merge, then the one ruleset edit.

@JarryShaw
JarryShaw merged commit 5c9b868 into main Oct 13, 2026
43 checks passed
@JarryShaw
JarryShaw deleted the ci/1633-python-matrix-tiers branch October 13, 2026 16:08
@github-project-automation github-project-automation Bot moved this from In review to Done in PyPCAPKit Oct 13, 2026
@JarryShaw JarryShaw removed the review: good-to-go Cross-review at the current head says ready; CI state is separate label Oct 13, 2026
JarryShaw added a commit that referenced this pull request Oct 13, 2026
…eated for (#1634)

Run 38008819343 was created for b6b95bc and, approved three days later,
tagged main's tip 2c0008c as v1.5.0b9 and conda-1.5.0b9+0: the GitHub
Release defaulted target_commitish to main, and the tag job ran
`git pull --rebase origin main` before tagging.

- Every checkout pins `ref: ${{ github.sha }}`. github's release names it as
  target_commitish only on workflow_run, where it creates the tag; a v* push
  names none.
- github creates the release with a GitHub App installation token, minted in
  the job by actions/create-github-app-token@v3 with Contents and Workflows
  write from the github-release environment secret RELEASE_APP_PRIVATE_KEY,
  since GitHub refuses GITHUB_TOKEN a target that changes a workflow file
  relative to main. With vars.RELEASE_APP_CLIENT_ID unset it spends
  GITHUB_TOKEN as before. version_check skips a push by
  vars.RELEASE_APP_BOT_ID, the run that App's tag starts, and release_status
  reports that skip with a notice.
- pypi and conda attach files with `gh release upload`, not
  action-gh-release, which calls Update a release, re-checking that target,
  before every upload. An asset already in state "uploaded" is left alone
  rather than deleted and re-uploaded; one in any other state is replaced. A
  missing release or a pattern matching no file now fails the step.
- tag cuts conda-<version>+0 at the run's commit before reading main; the
  conda/build reset is its own commit fast-forwarded onto main's tip,
  skipped where origin already has a conda-<version>+N tag other than +0.
- github, tag, pypi and conda refuse to publish under a tag naming another
  commit; that check blocks KTLO legs too. github explains a 404 or 403 by
  the token it spent.
- cron-conda's conda-dist updates only a published release, naming the
  default branch as its target, so it never creates v<version> or has a
  stale target re-checked.
- releasing.rst gains "The Release App" with its one-time setup;
  releasing.rst and workflows.rst re-cited.

New test: tests/project/test_release_tags_the_run_sha_1634.py (66 tests,
58 failing on origin/main's workflows). test_release_gates.py gains the
App's rows; test_python_matrix_tiers_1633.py exempts the tag check.

This fixes the replacement half of #1640; the convergence half (completeness
waiting on legs that can fail) is #1645's.

Closes #1634
Refs #1640
JarryShaw added a commit that referenced this pull request Oct 13, 2026
…eated for (#1634) (#1656)

Run 38008819343 was created for b6b95bc and, approved three days later,
tagged main's tip 2c0008c as v1.5.0b9 and conda-1.5.0b9+0: the GitHub
Release defaulted target_commitish to main, and the tag job ran
`git pull --rebase origin main` before tagging.

- Every checkout pins `ref: ${{ github.sha }}`. github's release names it as
  target_commitish only on workflow_run, where it creates the tag; a v* push
  names none.
- github creates the release with a GitHub App installation token, minted in
  the job by actions/create-github-app-token@v3 with Contents and Workflows
  write from the github-release environment secret RELEASE_APP_PRIVATE_KEY,
  since GitHub refuses GITHUB_TOKEN a target that changes a workflow file
  relative to main. With vars.RELEASE_APP_CLIENT_ID unset it spends
  GITHUB_TOKEN as before. version_check skips a push by
  vars.RELEASE_APP_BOT_ID, the run that App's tag starts, and release_status
  reports that skip with a notice.
- pypi and conda attach files with `gh release upload`, not
  action-gh-release, which calls Update a release, re-checking that target,
  before every upload. An asset already in state "uploaded" is left alone
  rather than deleted and re-uploaded; one in any other state is replaced. A
  missing release or a pattern matching no file now fails the step.
- tag cuts conda-<version>+0 at the run's commit before reading main; the
  conda/build reset is its own commit fast-forwarded onto main's tip,
  skipped where origin already has a conda-<version>+N tag other than +0.
- github, tag, pypi and conda refuse to publish under a tag naming another
  commit; that check blocks KTLO legs too. github explains a 404 or 403 by
  the token it spent.
- cron-conda's conda-dist updates only a published release, naming the
  default branch as its target, so it never creates v<version> or has a
  stale target re-checked.
- releasing.rst gains "The Release App" with its one-time setup;
  releasing.rst and workflows.rst re-cited.

New test: tests/project/test_release_tags_the_run_sha_1634.py (66 tests,
58 failing on origin/main's workflows). test_release_gates.py gains the
App's rows; test_python_matrix_tiers_1633.py exempts the tag check.

This fixes the replacement half of #1640; the convergence half (completeness
waiting on legs that can fail) is #1645's.

Closes #1634
Refs #1640
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ci Pull requests that change CI or workflow configuration (ci: subject prefix)

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

fix(conda): the Python 3.10 conda build fails since soupsieve 3 was pinned

1 participant