97b1215405
* 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>