From bafa2c17acba905fd2a90ba66a21a2020aa3cdd5 Mon Sep 17 00:00:00 2001 From: Anton Volkov Date: Tue, 13 Oct 2026 19:06:06 +0200 Subject: [PATCH 1/2] Drop the Python 3.15 release candidate CI accommodations Python 3.15.0 is final: conda-forge ships it on the main label and actions/setup-python has a stable 3.15.0, so the workarounds added in 0df738e are no longer needed. - Remove conda-forge/label/python_rc from the conda env channels and the conda build/install channel lists (conda-package, conda-package-cf, build_pip). - Remove allow-prereleases: true from setup-python in both clang workflows. fail-fast: false is kept, matching conda-build-test.yml. --- .github/workflows/build-with-clang.yml | 2 -- .github/workflows/build-with-standard-clang.yml | 2 -- .github/workflows/build_pip.yml | 3 +-- .github/workflows/conda-build-test.yml | 6 ++---- .github/workflows/conda-package-cf.yml | 6 +++--- .github/workflows/conda-package.yml | 4 ++-- 6 files changed, 8 insertions(+), 15 deletions(-) diff --git a/.github/workflows/build-with-clang.yml b/.github/workflows/build-with-clang.yml index 45ad520..7f4fe06 100644 --- a/.github/workflows/build-with-clang.yml +++ b/.github/workflows/build-with-clang.yml @@ -48,8 +48,6 @@ jobs: uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 with: python-version: ${{ matrix.python }} - # allow the 3.15 release candidate until 3.15 is final - allow-prereleases: true architecture: x64 - name: Checkout repo diff --git a/.github/workflows/build-with-standard-clang.yml b/.github/workflows/build-with-standard-clang.yml index c1709b5..94ed31c 100644 --- a/.github/workflows/build-with-standard-clang.yml +++ b/.github/workflows/build-with-standard-clang.yml @@ -39,8 +39,6 @@ jobs: uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 with: python-version: ${{ matrix.python }} - # allow the 3.15 release candidate until 3.15 is final - allow-prereleases: true architecture: x64 - name: Checkout repo diff --git a/.github/workflows/build_pip.yml b/.github/workflows/build_pip.yml index cddb27d..b8d85b8 100644 --- a/.github/workflows/build_pip.yml +++ b/.github/workflows/build_pip.yml @@ -37,8 +37,7 @@ jobs: - uses: conda-incubator/setup-miniconda@be893c923ea9cf1cf7cd510fbdde27c7e18cbdcb # v4.1.0 with: miniforge-version: latest - # python_rc label carries the 3.15 release candidate; drop once 3.15 is final - channels: conda-forge,conda-forge/label/python_rc + channels: conda-forge activate-environment: test python-version: ${{ matrix.python }} diff --git a/.github/workflows/conda-build-test.yml b/.github/workflows/conda-build-test.yml index 2c2a7b7..ef8c0f5 100644 --- a/.github/workflows/conda-build-test.yml +++ b/.github/workflows/conda-build-test.yml @@ -81,8 +81,7 @@ jobs: with: miniforge-version: latest activate-environment: ${{ env.build-env-name }} - # python_rc label carries the 3.15 release candidate; drop once 3.15 is final - channels: conda-forge,conda-forge/label/python_rc + channels: conda-forge python-version: ${{ matrix.python }} - name: Cache conda packages @@ -174,8 +173,7 @@ jobs: uses: conda-incubator/setup-miniconda@be893c923ea9cf1cf7cd510fbdde27c7e18cbdcb # v4.1.0 with: miniforge-version: latest - # python_rc label carries the 3.15 release candidate; drop once 3.15 is final - channels: conda-forge,conda-forge/label/python_rc + channels: conda-forge activate-environment: ${{ env.test-env-name }} python-version: ${{ matrix.python }} diff --git a/.github/workflows/conda-package-cf.yml b/.github/workflows/conda-package-cf.yml index 7fbce1b..b084275 100644 --- a/.github/workflows/conda-package-cf.yml +++ b/.github/workflows/conda-package-cf.yml @@ -21,7 +21,7 @@ jobs: runs-on: ubuntu-latest conda-subdir: linux-64 pkgs-dir: /home/runner/conda_pkgs_dir - channels-list: -c conda-forge -c conda-forge/label/python_rc --override-channels + channels-list: -c conda-forge --override-channels recipe-dir: conda-recipe-cf windows: @@ -31,7 +31,7 @@ jobs: runs-on: windows-latest conda-subdir: win-64 pkgs-dir: D:\conda_pkgs_dir - channels-list: -c conda-forge -c conda-forge/label/python_rc --override-channels + channels-list: -c conda-forge --override-channels recipe-dir: conda-recipe-cf osx: @@ -41,5 +41,5 @@ jobs: runs-on: macos-26-intel conda-subdir: osx-64 pkgs-dir: /Users/runner/conda_pkgs_dir - channels-list: -c conda-forge -c conda-forge/label/python_rc --override-channels + channels-list: -c conda-forge --override-channels recipe-dir: conda-recipe-cf diff --git a/.github/workflows/conda-package.yml b/.github/workflows/conda-package.yml index 932146d..970bcbf 100644 --- a/.github/workflows/conda-package.yml +++ b/.github/workflows/conda-package.yml @@ -21,7 +21,7 @@ jobs: runs-on: ubuntu-latest conda-subdir: linux-64 pkgs-dir: /home/runner/conda_pkgs_dir - channels-list: -c https://software.repos.intel.com/python/conda -c conda-forge -c conda-forge/label/python_rc --override-channels + channels-list: -c https://software.repos.intel.com/python/conda -c conda-forge --override-channels recipe-dir: conda-recipe build-wheels: true @@ -32,6 +32,6 @@ jobs: runs-on: windows-latest conda-subdir: win-64 pkgs-dir: D:\conda_pkgs_dir - channels-list: -c https://software.repos.intel.com/python/conda -c conda-forge -c conda-forge/label/python_rc --override-channels + channels-list: -c https://software.repos.intel.com/python/conda -c conda-forge --override-channels recipe-dir: conda-recipe build-wheels: true From 00dc94298c85db6f78c5a27cb7232dce675943a4 Mon Sep 17 00:00:00 2001 From: Anton Volkov Date: Tue, 13 Oct 2026 19:06:51 +0200 Subject: [PATCH 2/2] Add free-threaded Python 3.15t to CI build/test matrices conda-forge now ships python 3.15.0 *_cp315t on the main label and actions/setup-python provides free-threaded 3.15.0 builds, so 3.15t gets the same coverage as 3.14t. - conda-build-test.yml: add a '3.15.* *_cp315t' include row (python_tag 3.15t) to the build and test matrices. - build_pip.yml: add a '3.15.* *_cp315t' include row. - Both clang workflows: add 3.15t to the python matrix. - Update the AGENTS.md files, which still described 3.15 as GIL-only. --- .github/AGENTS.md | 6 +++--- .github/workflows/build-with-clang.yml | 2 +- .github/workflows/build-with-standard-clang.yml | 2 +- .github/workflows/build_pip.yml | 2 ++ .github/workflows/conda-build-test.yml | 6 ++++++ AGENTS.md | 4 ++-- conda-recipe/AGENTS.md | 2 +- 7 files changed, 16 insertions(+), 8 deletions(-) diff --git a/.github/AGENTS.md b/.github/AGENTS.md index 47f0a9b..985782a 100644 --- a/.github/AGENTS.md +++ b/.github/AGENTS.md @@ -3,7 +3,7 @@ CI/CD workflows, automation, security scanning, and package distribution. ## Workflows -All build/test workflows cover Python 3.10-3.15 plus free-threaded 3.14t. +All build/test workflows cover Python 3.10-3.15 plus free-threaded 3.14t and 3.15t. - **conda-package.yml** — main build/test pipeline (Linux/Windows) - **conda-package-cf.yml** — build/test using only conda-forge channel (Linux/Windows) @@ -17,9 +17,9 @@ All build/test workflows cover Python 3.10-3.15 plus free-threaded 3.14t. - Keep build matrix (Python versions, platforms) in workflow files only - Required checks: conda build + test on supported Python versions/platforms in CI - Python 3.14 is expressed as two `include` rows carrying `python_spec` (`3.14.* *_cp314` and `3.14.* *_cp314t`); a bare `--python 3.14` has been observed to select the free-threaded ABI and must not be relied on -- Python 3.15 is GIL-only for now (conda-forge's `python315` migration ships `*_cp315` but not `*_cp315t`); conda jobs pin the ABI explicitly with `python_spec: '3.15.* *_cp315'` to stay robust if a free-threaded `3.15t` build appears later +- Python 3.15 follows the same pattern as 3.14: two `include` rows with `python_spec` `3.15.* *_cp315` and `3.15.* *_cp315t` - `include` rows create new matrix combinations and inherit nothing, so `experimental` must be repeated wherever the job reads them -- Artifact naming: `$PACKAGE_NAME $OS Python $VERSION`, where `$VERSION` is `python_tag` (`3.14`, `3.14t`, or `3.15`) when set, otherwise `python` +- Artifact naming: `$PACKAGE_NAME $OS Python $VERSION`, where `$VERSION` is `python_tag` (`3.14`, `3.14t`, `3.15`, or `3.15t`) when set, otherwise `python` - Channels: `conda-forge`, Intel channel ## Security diff --git a/.github/workflows/build-with-clang.yml b/.github/workflows/build-with-clang.yml index 7f4fe06..be5a500 100644 --- a/.github/workflows/build-with-clang.yml +++ b/.github/workflows/build-with-clang.yml @@ -16,7 +16,7 @@ jobs: strategy: fail-fast: false matrix: - python: ["3.10", "3.11", "3.12", "3.13", "3.14", "3.14t", "3.15"] + python: ["3.10", "3.11", "3.12", "3.13", "3.14", "3.14t", "3.15", "3.15t"] env: ONEAPI_ROOT: /opt/intel/oneapi diff --git a/.github/workflows/build-with-standard-clang.yml b/.github/workflows/build-with-standard-clang.yml index 94ed31c..8d3fa5b 100644 --- a/.github/workflows/build-with-standard-clang.yml +++ b/.github/workflows/build-with-standard-clang.yml @@ -15,7 +15,7 @@ jobs: strategy: fail-fast: false matrix: - python: ["3.10", "3.11", "3.12", "3.13", "3.14", "3.14t", "3.15"] + python: ["3.10", "3.11", "3.12", "3.13", "3.14", "3.14t", "3.15", "3.15t"] env: COMPILER_ROOT: /usr/bin diff --git a/.github/workflows/build_pip.yml b/.github/workflows/build_pip.yml index b8d85b8..9a4c98d 100644 --- a/.github/workflows/build_pip.yml +++ b/.github/workflows/build_pip.yml @@ -27,6 +27,8 @@ jobs: python_spec: '3.14.* *_cp314t' - python: '3.15' python_spec: '3.15.* *_cp315' + - python: '3.15' + python_spec: '3.15.* *_cp315t' steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 diff --git a/.github/workflows/conda-build-test.yml b/.github/workflows/conda-build-test.yml index ef8c0f5..3a29620 100644 --- a/.github/workflows/conda-build-test.yml +++ b/.github/workflows/conda-build-test.yml @@ -57,6 +57,9 @@ jobs: - python: '3.15' python_spec: '3.15.* *_cp315' python_tag: '3.15' + - python: '3.15' + python_spec: '3.15.* *_cp315t' + python_tag: '3.15t' runs-on: ${{ inputs.runs-on }} timeout-minutes: 15 @@ -148,6 +151,9 @@ jobs: - python: '3.15' python_spec: '3.15.* *_cp315' python_tag: '3.15' + - python: '3.15' + python_spec: '3.15.* *_cp315t' + python_tag: '3.15t' runs-on: ${{ inputs.runs-on }} timeout-minutes: 15 diff --git a/AGENTS.md b/AGENTS.md index 836897e..daf0e7d 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -48,9 +48,9 @@ python -m pip install --no-deps --no-build-isolation . ## CI/CD - **Platforms in CI workflows:** Linux, Windows, macOS (conda-forge workflow only) -- **Python versions:** 3.10, 3.11, 3.12, 3.13, 3.14, 3.15, and free-threaded 3.14t +- **Python versions:** 3.10, 3.11, 3.12, 3.13, 3.14, 3.15, and free-threaded 3.14t and 3.15t - **Python 3.14 ABI selection:** conda jobs must request an explicit ABI, `3.14.* *_cp314` (GIL) or `3.14.* *_cp314t` (free-threaded). Once the recipes stopped constraining `python-gil`, a bare `--python 3.14` was observed to resolve to the free-threaded build, so it must not be relied on. -- **Python 3.15:** GIL-only for now; conda-forge's `python315` migration provides `*_cp315` but no free-threaded `*_cp315t` yet. Conda jobs pin `3.15.* *_cp315` explicitly for the same ABI-selection reason as 3.14. +- **Python 3.15 ABI selection:** same as 3.14; conda jobs request `3.15.* *_cp315` (GIL) or `3.15.* *_cp315t` (free-threaded) explicitly. - **Workflows:** `.github/workflows/` - `conda-package.yml` — main conda build/test pipeline - `conda-package-cf.yml` — conda build/test using only conda-forge channel diff --git a/conda-recipe/AGENTS.md b/conda-recipe/AGENTS.md index 7ea47b5..b9994b9 100644 --- a/conda-recipe/AGENTS.md +++ b/conda-recipe/AGENTS.md @@ -10,7 +10,7 @@ Conda package build recipe for conda-forge and Intel channel distribution. ## Build configuration - **Channels:** `conda-forge`, Intel channel -- **Python versions in CI build matrix:** 3.10, 3.11, 3.12, 3.13, 3.14, 3.15, and free-threaded 3.14t +- **Python versions in CI build matrix:** 3.10, 3.11, 3.12, 3.13, 3.14, 3.15, and free-threaded 3.14t and 3.15t - **Compilers:** pinned via `conda_build_config.yaml` (GCC/GXX on Linux, VS2022 on Windows) - **Dependencies:** `mkl` (runtime), `mkl-devel` (build), `cython >=3.1.0`