Skip to content

Commit bf09d71

Browse files
authored
ci: split build matrix on physics/api marker axis (PR B for #1300) (#1311)
* ci: split build matrix on physics/api marker axis (#1300 PR B) Follow-up to #1305 (PR A). Now that every test file declares `physics` or `api`, the CI matrix can stop running the full suite on every Python and instead run each nature axis where its coverage genuinely matters. - build-suews/action.yml: CIBW_TEST_COMMAND runs `-m "physics and <tier>"` on the build Python only. Physics tests are binary- determined (compiled artefact + CPU floating-point), so one run per (OS, arch) suffices post-abi3 (#1299). - determine-matrix.sh: rename output `test_python` -> `api_python` to reflect that this matrix now drives the api-tier cross-Python tests, not a generic bridge-loading subset. - test-api-cross-python-reusable.yml (renamed from test-bridge-reusable .yml): installs the single abi3 wheel into each test CPython and runs `-m "api and <tier>"`. Composes the tier expression inline so the caller doesn't need to. - build-publish_to_pypi.yml: rename job `test_bridge_loading` -> `test_api_cross_python`, pass `test_tier` into the reusable workflow, and add a new standalone `check_test_markers` job that runs a static AST-based lint (no supy build required) ensuring every test file declares physics or api. The lint is gated into `pr-gate` so a missing marker blocks the merge. - scripts/lint/check_test_markers.py: the static lint. Skips files under `test/umep/` which pick up `api` via the conftest hook. - pr-gate.sh: surface check_test_markers result alongside build and api-test results. Net effect: - PR / merge queue: physics runs on N_platforms x 1 Python, api runs on N_platforms x 2 bookend Pythons. Full-tree marker lint runs once (single-platform, fast). - Nightly / tag: physics x 4 platforms + api x (4 platforms x 6 Pythons). Total CPU similar to pre-split, but each cell now carries orthogonal information. Docs: RELEASE_MANUAL.md and prep-release skill reference the renamed job; test/README.md notes that `smoke_bridge` is now legacy (coverage subsumed by `api and smoke`). Tests tagged `@pytest.mark.smoke_bridge` continue to work; the marker is still registered. * test: tag data_model yaml fixture tests with api marker (gh#1300) Three tests landed on master between #1305 and this PR and need the nature-axis marker. All three exercise pydantic/yaml config validation and the suews-convert yaml-upgrade CLI, so they fall cleanly into the api tier. Fixes the Check pytest marker axis CI job on this PR. * docs(rules): require physics/api marker on every new test file Update the tests/patterns.md rule (auto-loaded when editing test files) so contributors and AI assistants see the nature-axis requirement up-front when designing new tests. The lint in scripts/lint/check_test_markers.py is the hard gate; this rule is the soft gate that prevents the lint from firing in the first place. gh#1300
1 parent 78a37fd commit bf09d71

File tree

12 files changed

+363
-124
lines changed

12 files changed

+363
-124
lines changed

.claude/rules/tests/patterns.md

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,47 @@ with pytest.raises(ValueError, match="must be positive"):
6262

6363
## Pytest Markers
6464

65+
Markers sit on two orthogonal axes (gh#1300). Every new test file **must**
66+
declare the nature axis at module level; tier markers compose on top as
67+
per-test decorators.
68+
69+
### Nature axis — REQUIRED on every file
70+
71+
Pick exactly one (or both, rarely) and declare at module level:
72+
73+
```python
74+
import pytest
75+
76+
pytestmark = pytest.mark.api # Python wrapper surface
77+
# or:
78+
pytestmark = pytest.mark.physics # numerical / binary correctness
79+
# or (file straddles both):
80+
pytestmark = [pytest.mark.physics, pytest.mark.api]
81+
```
82+
83+
- `physics` — outputs determined by the compiled artefact + CPU
84+
floating-point. CI runs these once per `(OS, arch)` on the build
85+
Python. Typical: mass/energy balance, DailyState accumulation, Fortran
86+
state persistence.
87+
- `api` — exercises the pandas / numpy / pydantic / click surface. CI
88+
runs these across `(platform x Python)` because the dependency
89+
surface varies per interpreter. Typical: config validation, CLI, YAML
90+
round-trip, `SUEWSSimulation` methods.
91+
92+
When unsure, pick `api` — it's the broader coverage axis and safer if
93+
the test is genuinely mixed.
94+
95+
UMEP tests (`test/umep/*.py`) pick up `api` automatically via
96+
`test/umep/conftest.py`; no file-level declaration needed there.
97+
98+
**A static CI lint (`scripts/lint/check_test_markers.py`) and a
99+
`pytest_collection_finish` hook in `test/conftest.py` both fail any PR
100+
that introduces a test file without a nature marker.** If you see the
101+
lint fire, add a `pytestmark = pytest.mark.api` (or physics) line — do
102+
not bypass.
103+
104+
### Tier axis — per-test decorators
105+
65106
```python
66107
@pytest.mark.smoke # Critical, fast tests (~60s total)
67108
@pytest.mark.core # Core physics/logic tests
@@ -70,6 +111,10 @@ with pytest.raises(ValueError, match="must be positive"):
70111
@pytest.mark.cfg # Config/schema validation tests
71112
```
72113

114+
The tier axis composes with the nature axis. CI expressions like
115+
`-m "api and smoke"` and `-m "physics and not slow"` select the right
116+
subset per matrix cell.
117+
73118
---
74119

75120
## Test File Locations

.claude/skills/prep-release/references/release-steps.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,7 @@ git push origin "$VERSION"
303303
## Step 7: Post-Release Verification
304304

305305
**Monitor (~20 min):**
306-
- GitHub Actions: build_wheels, test_bridge_loading, publish
306+
- GitHub Actions: build_wheels, test_api_cross_python, publish
307307
- PyPI: supy `YYYY.M.D` appears (one cp39-abi3 wheel per platform)
308308
- GitHub Release: created automatically after successful publish
309309
- Zenodo DOI appears on the dashboard

.github/actions/build-suews/action.yml

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -157,26 +157,24 @@ runs:
157157
pip install delvewheel
158158
CIBW_REPAIR_WHEEL_COMMAND_WINDOWS: "delvewheel repair -w {dest_dir} {wheel}"
159159
CIBW_TEST_REQUIRES: pytest
160-
# Test tiers: choose subset based on path detection and trigger
161-
# Always include --durations=10 to show slowest tests in output
160+
# Test tiers: choose subset based on path detection and trigger.
161+
# gh#1300: physics tests are binary-determined, so one run per
162+
# (OS, arch) on the build Python is sufficient. API tests (Python
163+
# wrapper surface) run separately per (platform x Python) via
164+
# test-api-cross-python-reusable.yml.
165+
# Always include --durations=10 to show slowest tests in output.
162166
# After pytest, enforce bridge-manifest coverage of public Fortran types.
163167
# Uses run_ci_tests.py wrapper to avoid shell-level && chaining,
164168
# which breaks on Windows cmd.exe with quoted marker expressions.
165-
# gh#1300: the expressions below compose tier markers only. A
166-
# follow-up PR splits the matrix on the `physics` vs `api` nature
167-
# axis — `physics` runs once per (OS, arch) on the canonical
168-
# Python while `api` runs per (platform x Python). No behaviour
169-
# change here yet; the new markers are registered in
170-
# pyproject.toml and applied to every test file, ready to be
171-
# consumed when the matrix split lands.
172169
CIBW_TEST_COMMAND: >-
173170
python {project}/scripts/suews/run_ci_tests.py {project}
174171
-v --tb=short --durations=10
175-
${{ inputs.test_tier == 'smoke' && '-m smoke' ||
176-
inputs.test_tier == 'core' && '-m "smoke or core"' ||
177-
inputs.test_tier == 'cfg' && '-m "smoke or cfg"' ||
178-
inputs.test_tier == 'standard' && '-m "not slow"' ||
179-
'' }}
172+
${{ inputs.test_tier == 'smoke' && '-m "physics and smoke"' ||
173+
inputs.test_tier == 'core' && '-m "physics and (smoke or core)"' ||
174+
inputs.test_tier == 'cfg' && '-m "physics and (smoke or cfg)"' ||
175+
inputs.test_tier == 'standard' && '-m "physics and not slow"' ||
176+
inputs.test_tier == 'all' && '-m physics' ||
177+
'-m physics' }}
180178
MACOSX_DEPLOYMENT_TARGET: '15.0'
181179

182180
- name: Upload wheels

.github/scripts/determine-matrix.sh

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,15 @@
22
# Determine the cibuildwheel build matrix based on trigger type and change detection.
33
#
44
# Called from build-publish_to_pypi.yml determine_matrix job.
5-
# Writes buildplat, python, test_python, test_tier to GITHUB_OUTPUT.
5+
# Writes buildplat, python, api_python, test_tier to GITHUB_OUTPUT.
66
#
77
# "python" is the cibuildwheel build matrix (always cp39 — emits one abi3
8-
# wheel per platform). "test_python" is the cross-version bridge-loading
9-
# matrix (BOOKEND for PRs, ALL for nightly/tag).
8+
# wheel per platform). Physics tests run during the build step on the
9+
# build Python only, since they're binary-determined (gh#1300).
10+
# "api_python" is the cross-version matrix used by test-api-cross-python;
11+
# the api marker covers the Python wrapper surface (pandas/numpy/pydantic,
12+
# CLI, SUEWSSimulation) and needs full (platform x Python) coverage
13+
# (BOOKEND for PRs, ALL for nightly/tag).
1014
#
1115
# Required environment variables:
1216
# EVENT_NAME -- github.event_name
@@ -55,7 +59,7 @@ if [[ "${FORTRAN_CHANGED}" == "true" ]] || [[ "${RUST_CHANGED}" == "true" ]] ||
5559
NEEDS_MULTIPLATFORM=true
5660
fi
5761

58-
TEST_PYTHON="$BOOKEND_PYTHON"
62+
API_PYTHON="$BOOKEND_PYTHON"
5963

6064
if [[ "${EVENT_NAME}" == "pull_request" ]] && [[ "${IS_DRAFT}" == "true" ]]; then
6165
if [[ "${FORTRAN_CHANGED}" == "true" ]] || [[ "${RUST_CHANGED}" == "true" ]]; then
@@ -100,15 +104,15 @@ elif [[ "${EVENT_NAME}" == "schedule" ]]; then
100104
echo "buildplat=$FULL_PLATFORMS" >> "$GITHUB_OUTPUT"
101105
echo "python=$BUILD_PYTHON" >> "$GITHUB_OUTPUT"
102106
echo "test_tier=all" >> "$GITHUB_OUTPUT"
103-
TEST_PYTHON="$ALL_PYTHON"
107+
API_PYTHON="$ALL_PYTHON"
104108

105109
elif [[ "${EVENT_NAME}" == "workflow_dispatch" ]]; then
106110
case "${INPUT_MATRIX_CONFIG}" in
107111
full)
108112
echo "Manual dispatch: full matrix"
109113
echo "buildplat=$FULL_PLATFORMS" >> "$GITHUB_OUTPUT"
110114
echo "python=$BUILD_PYTHON" >> "$GITHUB_OUTPUT"
111-
TEST_PYTHON="$ALL_PYTHON"
115+
API_PYTHON="$ALL_PYTHON"
112116
;;
113117
pr)
114118
echo "Manual dispatch: PR-style reduced matrix"
@@ -122,7 +126,7 @@ elif [[ "${EVENT_NAME}" == "workflow_dispatch" ]]; then
122126
;;
123127
custom)
124128
echo "Manual dispatch: custom platform matrix"
125-
echo " Build is always cp39-abi3; py3X toggles select the bridge-test matrix"
129+
echo " Build is always cp39-abi3; py3X toggles select the api cross-CPython matrix"
126130

127131
PLATFORMS="["
128132
[[ "${INPUT_PLAT_LINUX}" == "true" ]] && PLATFORMS+='["ubuntu-latest", "manylinux", "x86_64"],'
@@ -147,13 +151,13 @@ elif [[ "${EVENT_NAME}" == "workflow_dispatch" ]]; then
147151
TEST_PYS="${TEST_PYS%,}]"
148152

149153
if [[ "$TEST_PYS" == "[]" ]]; then
150-
echo "::error::Custom matrix requires at least one Python version for bridge tests"
154+
echo "::error::Custom matrix requires at least one Python version for api tests"
151155
exit 1
152156
fi
153157

154158
echo "buildplat=$PLATFORMS" >> "$GITHUB_OUTPUT"
155159
echo "python=$BUILD_PYTHON" >> "$GITHUB_OUTPUT"
156-
TEST_PYTHON="$TEST_PYS"
160+
API_PYTHON="$TEST_PYS"
157161
;;
158162
esac
159163
echo "test_tier=${INPUT_TEST_TIER}" >> "$GITHUB_OUTPUT"
@@ -164,11 +168,12 @@ else
164168
echo "buildplat=$FULL_PLATFORMS" >> "$GITHUB_OUTPUT"
165169
echo "python=$BUILD_PYTHON" >> "$GITHUB_OUTPUT"
166170
echo "test_tier=all" >> "$GITHUB_OUTPUT"
167-
TEST_PYTHON="$ALL_PYTHON"
171+
API_PYTHON="$ALL_PYTHON"
168172
fi
169173

170-
# Cross-version bridge-loading matrix: BOOKEND for PRs/merge queue, ALL for
171-
# nightly/tag/dispatch-full. The same single abi3 wheel is installed into
172-
# each Python version and exercised with -m smoke_bridge.
173-
echo "test_python=$TEST_PYTHON" >> "$GITHUB_OUTPUT"
174+
# Cross-version api-test matrix (gh#1300): BOOKEND for PRs/merge queue,
175+
# ALL for nightly/tag/dispatch-full. The same single abi3 wheel is
176+
# installed into each Python version and exercised with
177+
# `-m "api and <tier>"` by test-api-cross-python-reusable.yml.
178+
echo "api_python=$API_PYTHON" >> "$GITHUB_OUTPUT"
174179

.github/scripts/pr-gate.sh

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,19 @@
77
# Required environment variables:
88
# DETECT_CHANGES_RESULT -- needs.detect-changes.result
99
# BUILD_WHEELS_RESULT -- needs.build_wheels.result
10-
# TEST_BRIDGE_RESULT -- needs.test_bridge_loading.result
10+
# TEST_BRIDGE_RESULT -- needs.test_api_cross_python.result
11+
# CHECK_MARKERS_RESULT -- needs.check_test_markers.result
1112
# NEEDS_BUILD -- needs.detect-changes.outputs.needs-build
1213

1314
set -euo pipefail
1415

16+
CHECK_MARKERS_RESULT="${CHECK_MARKERS_RESULT:-skipped}"
17+
1518
echo "=== Job Results ==="
1619
echo "detect-changes: ${DETECT_CHANGES_RESULT}"
1720
echo "build_wheels: ${BUILD_WHEELS_RESULT}"
18-
echo "test_bridge_loading: ${TEST_BRIDGE_RESULT}"
21+
echo "test_api_cross_python: ${TEST_BRIDGE_RESULT}"
22+
echo "check_test_markers: ${CHECK_MARKERS_RESULT}"
1923
echo "needs-build: ${NEEDS_BUILD}"
2024
echo ""
2125

@@ -35,6 +39,18 @@ fi
3539

3640
VALIDATION_PASSED=true
3741

42+
# Marker-axis lint (gh#1300) runs on every PR regardless of needs-build.
43+
echo "Validating test marker axis (gh#1300)..."
44+
if [[ "${CHECK_MARKERS_RESULT}" == "success" ]]; then
45+
echo "[OK] Every test file declares physics or api"
46+
elif [[ "${CHECK_MARKERS_RESULT}" == "skipped" ]]; then
47+
echo "[OK] Marker lint skipped (not a PR/merge-queue/dispatch run)"
48+
else
49+
echo "[X] Marker lint failed - some test file is missing physics/api marker"
50+
echo " check_test_markers: ${CHECK_MARKERS_RESULT}"
51+
VALIDATION_PASSED=false
52+
fi
53+
3854
if [[ "${NEEDS_BUILD}" == "true" ]]; then
3955
echo "Code changes detected - validating standard build..."
4056
if [[ "${BUILD_WHEELS_RESULT}" == "success" ]]; then
@@ -45,12 +61,12 @@ if [[ "${NEEDS_BUILD}" == "true" ]]; then
4561
VALIDATION_PASSED=false
4662
fi
4763

48-
echo "Validating bridge-load smoke (cross-CPython)..."
64+
echo "Validating api cross-CPython tests..."
4965
if [[ "${TEST_BRIDGE_RESULT}" == "success" ]]; then
50-
echo "[OK] Bridge-load smoke passed on all matrix cells"
66+
echo "[OK] API tests passed on all matrix cells"
5167
else
52-
echo "[X] Bridge-load smoke failed"
53-
echo " test_bridge_loading: ${TEST_BRIDGE_RESULT}"
68+
echo "[X] API cross-CPython tests failed"
69+
echo " test_api_cross_python: ${TEST_BRIDGE_RESULT}"
5470
VALIDATION_PASSED=false
5571
fi
5672

@@ -63,7 +79,7 @@ else
6379
else
6480
echo "Note: Unexpected build activity for non-code PR"
6581
echo " build_wheels: ${BUILD_WHEELS_RESULT}"
66-
echo " test_bridge_loading: ${TEST_BRIDGE_RESULT}"
82+
echo " test_api_cross_python: ${TEST_BRIDGE_RESULT}"
6783
# Still pass if builds succeeded (conservative)
6884
for result in "${BUILD_WHEELS_RESULT}" "${TEST_BRIDGE_RESULT}"; do
6985
if [[ "$result" != "success" ]] && [[ "$result" != "skipped" ]]; then

.github/workflows/build-publish_to_pypi.yml

Lines changed: 50 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,10 @@ on:
6565
type: boolean
6666
default: true
6767

68-
# Python toggles drive the cross-CPython bridge-loading test matrix.
68+
# Python toggles drive the cross-CPython api-test matrix (gh#1300).
6969
# The build is always cp39-abi3 (one wheel covers all supported CPythons),
70-
# so these toggles only affect which interpreters install and import the
71-
# wheel under -m smoke_bridge.
70+
# so these toggles only affect which interpreters install the wheel and
71+
# run `-m "api and <tier>"` in test_api_cross_python.
7272
py39:
7373
description: '[custom] Test on Python 3.9 (build is always cp39-abi3)'
7474
type: boolean
@@ -280,7 +280,7 @@ jobs:
280280
outputs:
281281
buildplat: ${{ steps.set-matrix.outputs.buildplat }}
282282
python: ${{ steps.set-matrix.outputs.python }}
283-
test_python: ${{ steps.set-matrix.outputs.test_python }}
283+
api_python: ${{ steps.set-matrix.outputs.api_python }}
284284
test_tier: ${{ steps.set-matrix.outputs.test_tier }}
285285
steps:
286286
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
@@ -380,21 +380,50 @@ jobs:
380380
test_tier: ${{ needs.determine_matrix.outputs.test_tier }}
381381
is_testpypi_build: ${{ github.event_name == 'schedule' || (startsWith(github.ref, 'refs/tags/') && contains(github.ref, 'dev')) }}
382382

383-
test_bridge_loading:
384-
name: Cross-CPython bridge tests
383+
test_api_cross_python:
384+
name: API cross-CPython tests
385385
needs: [determine_matrix, build_wheels]
386386
if: always() && needs.build_wheels.result == 'success'
387-
uses: ./.github/workflows/test-bridge-reusable.yml
387+
uses: ./.github/workflows/test-api-cross-python-reusable.yml
388388
with:
389389
buildplat_json: ${{ needs.determine_matrix.outputs.buildplat }}
390-
test_python_json: ${{ needs.determine_matrix.outputs.test_python }}
390+
api_python_json: ${{ needs.determine_matrix.outputs.api_python }}
391+
test_tier: ${{ needs.determine_matrix.outputs.test_tier }}
392+
393+
# Standalone lint: every test file must declare `physics` or `api`
394+
# (gh#1300). Uses a static AST-based script so CI can verify marker
395+
# coverage without building supy — keeps the check cheap for
396+
# test-only PRs. The runtime counterpart is a pytest_collection_finish
397+
# hook in test/conftest.py, which catches the same thing during normal
398+
# full-tree pytest runs.
399+
check_test_markers:
400+
name: Check pytest marker axis
401+
runs-on: ubuntu-latest
402+
if: >-
403+
always() &&
404+
(github.event_name == 'pull_request' ||
405+
github.event_name == 'merge_group' ||
406+
github.event_name == 'schedule' ||
407+
github.event_name == 'workflow_dispatch')
408+
steps:
409+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
410+
with:
411+
persist-credentials: false
412+
413+
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
414+
with:
415+
python-version: '3.12'
416+
417+
- name: Lint physics/api marker coverage
418+
shell: bash
419+
run: python scripts/lint/check_test_markers.py
391420

392421
# Single consolidated check for branch protection (always runs for PRs/merge queue)
393422
pr-gate:
394423
name: PR build validation
395424
runs-on: ubuntu-latest
396425
if: always() && (github.event_name == 'pull_request' || github.event_name == 'merge_group')
397-
needs: [build_wheels, test_bridge_loading, detect-changes]
426+
needs: [build_wheels, test_api_cross_python, check_test_markers, detect-changes]
398427
steps:
399428
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
400429
with:
@@ -406,7 +435,8 @@ jobs:
406435
env:
407436
DETECT_CHANGES_RESULT: ${{ needs.detect-changes.result }}
408437
BUILD_WHEELS_RESULT: ${{ needs.build_wheels.result }}
409-
TEST_BRIDGE_RESULT: ${{ needs.test_bridge_loading.result }}
438+
TEST_BRIDGE_RESULT: ${{ needs.test_api_cross_python.result }}
439+
CHECK_MARKERS_RESULT: ${{ needs.check_test_markers.result }}
410440
NEEDS_BUILD: ${{ needs.detect-changes.outputs.needs-build }}
411441
run: bash .github/scripts/pr-gate.sh
412442

@@ -416,17 +446,17 @@ jobs:
416446
needs:
417447
- determine_matrix
418448
- build_wheels
419-
- test_bridge_loading
449+
- test_api_cross_python
420450
- create_nightly_tag
421451
- verify-release-tag
422452
# Publish only when every platform wheel built AND the cross-CPython
423-
# bridge smoke passed on every matrix cell. A partial build (one leg
424-
# fails) would leave test_bridge_loading skipped; allowing that would
425-
# ship un-validated wheels, so both must be explicit successes.
453+
# api tests passed on every matrix cell. A partial build (one leg
454+
# fails) would leave test_api_cross_python skipped; allowing that
455+
# would ship un-validated wheels, so both must be explicit successes.
426456
if: |
427457
always() &&
428458
needs.build_wheels.result == 'success' &&
429-
needs.test_bridge_loading.result == 'success' &&
459+
needs.test_api_cross_python.result == 'success' &&
430460
(needs.create_nightly_tag.result == 'success' || needs.create_nightly_tag.result == 'skipped') &&
431461
(needs.verify-release-tag.result == 'skipped' || needs.verify-release-tag.outputs.on-master == 'true') &&
432462
(
@@ -459,18 +489,18 @@ jobs:
459489
needs:
460490
- determine_matrix
461491
- build_wheels
462-
- test_bridge_loading
492+
- test_api_cross_python
463493
- create_nightly_tag
464494
- verify-release-tag
465-
# Production tags only: all platform wheels must succeed AND the cross-CPython
466-
# bridge-loading smoke must pass (the only signal the cp39-abi3 wheel imports
467-
# on cp310..cp314 after the build matrix collapse).
495+
# Production tags only: all platform wheels must succeed AND the
496+
# cross-CPython api tests must pass (the only signal the cp39-abi3
497+
# wheel imports on cp310..cp314 after the build matrix collapse).
468498
if: |
469499
always() &&
470500
startsWith(github.ref, 'refs/tags') &&
471501
!contains(github.ref, 'dev') &&
472502
needs.build_wheels.result == 'success' &&
473-
needs.test_bridge_loading.result == 'success' &&
503+
needs.test_api_cross_python.result == 'success' &&
474504
(needs.create_nightly_tag.result == 'success' || needs.create_nightly_tag.result == 'skipped') &&
475505
(needs.verify-release-tag.result == 'skipped' || needs.verify-release-tag.outputs.on-master == 'true')
476506

0 commit comments

Comments
 (0)