ci: exercise the abi3 floor on all three OSes, and the integrations at release (#527)

* ci: exercise the abi3 floor on all three OSes, and the integrations at release

The last two items of #306. Five of its seven were closed by earlier
work; these are the ones that were still open.

**Only Python 3.11 ran tests.** The wheel is abi3-py39, so one artifact
claims 3.9 through 3.14, but ci.yml's `python` matrix pins 3.11 on every
OS and the floor was import-tested only in release-pypi.yml, only on
Linux. A new `python-abi3-floor` job builds the wheel on 3.11, switches
the interpreter to 3.9, and loads that same artifact on ubuntu, macOS and
Windows — which is where a limited-API violation or a loader difference
shows up.

It is a separate job rather than another axis on `python` on purpose:
that job's name is a required status check, and adding an axis renames
every leg of it. Floor only — the 3.14 ceiling stays in release-pypi.yml
where a wheel is already being built, and the floor is the end where the
limited API actually bites.

**The release smoke skipped every integration.** `release-pypi.yml`
installed the wheel and pytest and nothing else, so all four integration
test files `importorskip`ed out of the run that gates a publish. The
extras now go in alongside the wheel, matching what ci.yml already does
for PRs.

Both workflow files parse as YAML and the existing `python` job's name is
unchanged, so no required check is renamed.

Closes #306

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* ci: reattach the integration-floors rationale to its own job

Review caught that the new job was spliced between
`integration-floors`' comment block and its job key, so ten lines
explaining why that leg is ubuntu-only — 'a floor is a
dependency-resolution property, not a platform one, so a three-OS matrix
would buy nothing' — ended up heading a job that is deliberately a
three-OS matrix.

Moved the block back above `integration-floors`. The abi3 job keeps its
own rationale.

This is the second time this session I have inserted at a computed
anchor without checking what precedes it; the first detached
`validate_calibration`'s rustdoc onto an unrelated helper. Checking the
lines above an insertion point is now part of how I make them.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Ryan Codrai
2026-08-10 20:29:21 +01:00
committed by GitHub
parent 44ae40b93e
commit 97b1215405
2 changed files with 71 additions and 0 deletions
+61
View File
@@ -429,6 +429,67 @@ jobs:
shell: bash
run: pytest turbovec-python/tests/ -v
# The wheel is abi3-py39: one artifact claims 3.9 through 3.14, but the
# `python` matrix above only ever runs 3.11. Import-testing the floor on
# all three OSes is where limited-API breakage shows up — a symbol that
# exists in 3.11 but not 3.9, or a macOS/Windows loader difference the
# Linux-only release check never sees (#306).
#
# Deliberately a separate job rather than another matrix axis on
# `python`: that job's name is a required status check, and adding an
# axis renames every leg of it.
#
# Floor only. The 3.14 ceiling stays in release-pypi.yml, where a wheel
# is already being built for publication; running it here as well would
# double this job for the version least likely to break the *limited*
# API.
python-abi3-floor:
name: Python abi3 floor (${{ matrix.os }})
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-14, windows-latest]
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
# Build with 3.11 — maturin needs an interpreter it supports, and the
# abi3 wheel it produces is not tied to it.
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
with:
python-version: "3.11"
- name: Build the abi3 wheel
shell: bash
working-directory: turbovec-python
run: |
python -m pip install --upgrade pip
python -m pip install maturin
maturin build --release --locked --out dist
# Now switch to the floor and load that same artifact.
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
with:
python-version: "3.9"
- name: Install the wheel on the abi3 floor and exercise it
shell: bash
working-directory: turbovec-python
run: |
python -VV
python -m pip install --upgrade pip
python -m pip install pytest numpy
python -m pip install dist/*.whl
# Import first: a limited-API violation fails here, before any
# test collection noise.
python -c "import turbovec; print(turbovec.__file__)"
# Then the core suites. The integration extras are not installed
# here — several do not support 3.9 — so those files skip
# themselves via importorskip, which is the intended shape.
python -m pytest tests/test_index.py tests/test_id_map.py -q
# pyproject.toml promises `haystack-ai>=2.23.0` and `agno>=2.5.4`, but the
# matrix above installs `>=2.0` for both and pip resolves that to the newest
# release — so the floors users are told to trust have never once been
+10
View File
@@ -77,6 +77,11 @@ jobs:
# regressions that produce structurally-correct .so files which
# fail at Python import time — exactly the class of bug that was
# silently shipping in Linux wheels until this PR.
# The integration extras go in alongside the wheel. Without them
# every haystack / langchain / llama-index / agno test file
# `importorskip`s out, so the run that gates a release exercised
# none of the four integrations — the gap ci.yml's `python` job
# already closes for PRs (#306).
- name: Install wheel and smoke test
shell: bash
working-directory: turbovec-python
@@ -84,6 +89,11 @@ jobs:
python -m pip install --upgrade pip
python -m pip install pytest
python -m pip install dist/*.whl
python -m pip install \
"langchain-core>=0.3" \
"llama-index-core>=0.12.1" \
"haystack-ai>=2.0" \
"agno>=2.0"
python -m pytest tests/ -v
# The wheel is abi3-py39: a single artifact claims Python 3.9-3.14,
# but only 3.11 is exercised above. Import-test the same wheel on