@@ -443,8 +443,8 @@ jobs:
443443 # ever starts building, the cell fails loudly.
444444 #
445445 # One job per engine loops over the six interpreters, each in a fresh venv,
446- # rather than one job per cell (6 Pythons x 6 engines): the queue, not the
447- # runners, is the bottleneck, and 36 jobs would each pay checkout, setup and
446+ # rather than one job per cell (6 Pythons x 5 engines): the queue, not the
447+ # runners, is the bottleneck, and 30 jobs would each pay checkout, setup and
448448 # apt for a minute of work. One job per *engine* rather than per Python
449449 # because the engine is what varies the environment: the apt packages
450450 # are per engine (installed once per job instead of six times), and pcap-ct
@@ -459,17 +459,17 @@ jobs:
459459 # the job summary.
460460 #
461461 # 3.15 is experimental-prerelease per #845's ruling: present so a regression
462- # is visible, but never blocking. It runs as its own step with step-level
463- # `continue-on-error: true`, so a 3.15 failure shows as a failed step and an
464- # error annotation while the job -- and `required-checks`, which reads this
465- # job's result -- stays green. The 3.10-3.14 cells share one step, and any
466- # one of them failing fails the job.
462+ # is visible, but never blocking; since #1538 it runs on main pushes only.
463+ # It is its own step with step-level `continue-on-error: true`, so a 3.15
464+ # failure shows as a failed step and an error annotation while the job --
465+ # and `required-checks`, which reads its result -- stays green. The 3.10-3.14
466+ # cells share one step, and any one of them failing fails the job.
467467 #
468- # Scoped deliberately out (#845): per-engine integration
469- # coverage (needs regenerated captures, so it stays in aggregate in
470- # `integration` and ` pypcap-parity`), and the multi-engine HAS_RUNTIME gate
471- # plus the incidental crypto/NGAP/vendor coverage the pre-#845 shared venv
472- # carried .
468+ # Scoped deliberately out (#845): per-engine integration coverage (needs
469+ # regenerated captures, so it stays in aggregate in `integration` and
470+ # `pypcap-parity`), the multi-engine HAS_RUNTIME gate and the incidental
471+ # crypto/NGAP/vendor coverage of the pre-#845 shared venv. #1538 dropped the
472+ # DPKT cell: it ran only test_dpkt_unit.py, which `test` runs with DPKT .
473473 engine-tests :
474474 name : Engines (${{ matrix.engine }})
475475 if : ${{ inputs.gate-only != true && needs.changes.outputs.code != 'false' }}
@@ -486,7 +486,6 @@ jobs:
486486 fail-fast : false
487487 matrix :
488488 engine :
489- - DPKT
490489 - Scapy
491490 - PyShark
492491 - PyPCAPFile
@@ -731,7 +730,6 @@ jobs:
731730 # RAW_PKGS is an array, not a string, so PCAP_CT's two-package case
732731 # ("pcap-ct libpcap") reaches pip as two argv entries.
733732 case "$ENGINE" in
734- DPKT) EXTRA=DPKT; RAW_PKGS=(dpkt); IMPORT_NAME=dpkt ;;
735733 Scapy) EXTRA=Scapy; RAW_PKGS=(scapy); IMPORT_NAME=scapy ;;
736734 PyShark) EXTRA=PyShark; RAW_PKGS=(pyshark); IMPORT_NAME=pyshark ;;
737735 PyPCAPFile) EXTRA=PyPCAPFile; RAW_PKGS=(pypcapfile); IMPORT_NAME=pcapfile ;;
@@ -787,7 +785,6 @@ jobs:
787785 fi
788786
789787 case "$ENGINE" in
790- DPKT) TEST_PATHS="tests/toolkit/test_dpkt_unit.py" ;;
791788 Scapy) TEST_PATHS="tests/toolkit/test_scapy_unit.py tests/foundation/engines/test_scapy_engine.py tests/protocols/transport/test_sctp_unit.py" ;;
792789 PyShark) TEST_PATHS="tests/toolkit/test_pyshark_unit.py tests/foundation/engines/test_pyshark_engine.py" ;;
793790 PyPCAPFile) TEST_PATHS="tests/toolkit/test_pypcapfile_unit.py tests/foundation/engines/test_pypcapfile_engine.py" ;;
@@ -834,8 +831,9 @@ jobs:
834831 exit 1
835832 fi
836833
837- # Non-blocking by #845's ruling -- see this job's comment above .
834+ # Non-blocking by #845, main pushes only by #1538 -- see this job's comment.
838835 - name : Run the 3.15 cell (experimental, non-blocking)
836+ if : ${{ github.event_name != 'pull_request' }}
839837 shell : bash
840838 continue-on-error : true
841839 run : |
@@ -1191,10 +1189,12 @@ jobs:
11911189 # maintainer's call to make separately from landing it.
11921190 unittest-ordering :
11931191 name : Plain unittest ordering (${{ matrix.label || matrix.leg }})
1194- # Not on pull requests: it is not a required check, and its 11 cells
1195- # would be a sixth of every PR push's jobs. It still runs on every push
1196- # to main, which is the run that tests what actually lands.
1197- if : ${{ inputs.gate-only != true && github.event_name != 'pull_request' }}
1192+ # Every push to main and no PR (#1052 item H): not required, and its 11
1193+ # cells would be a sixth of each PR push's jobs. `needs: [test]` (#1538)
1194+ # queues them behind this push's own legs; `!cancelled()` still runs them
1195+ # if `test` fails, so a red cell still fails the run that gates publishing.
1196+ if : ${{ !cancelled() && inputs.gate-only != true && github.event_name != 'pull_request' }}
1197+ needs : [test]
11981198 runs-on : ubuntu-latest
11991199 # 45, not 20: `timeout-minutes` is job-level, so it has to cover
12001200 # checkout/setup/install (~39s) as well as the leg itself, and this is
0 commit comments