Repository navigation
tests.yml and release.yml: the full suite and the Python 3.9 jobs run on ubuntu-24.04, since the Ubuntu 26.04 that ubuntu-latest now gives out has no 3.9 for setup-python and runs out of /tmp under the suite (#1094) - #1095
Conversation
…4, so the `package` job and the release's 3.9 install check no longer fail in setup-python on an Ubuntu 26.04 runner `ubuntu-latest` gives out (#1094) `ubuntu-latest` has started giving out Ubuntu 26.04 runners, and setup-python has no Python 3.9 build for them (3.10 to 3.15 there, 3.8 to 3.15 for 24.04). The `package` job of tests.yml and the release's install-check row `{python: '3.9'}` now ask for `ubuntu-24.04`, each with a comment saying why. Every other job asks for `3.x` or `3.12` and stays on `ubuntu-latest`. The release row's job name now reads `install check (ubuntu-24.04, Python 3.9)`; nothing else in release.yml reads `matrix.os`, and its one `runner.os` branch is Windows's. `requires-python` stays `>=3.9`. tests/test_release_workflow.py pins the install matrix's runners to the new row, and a new test pins the `package` job to ubuntu-24.04 and no 3.9 job of tests.yml to `ubuntu-latest`. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Reviewer's GuideThis PR updates both Python 3.9 workflow paths to run on ubuntu-24.04 because setup-python does not provide a 3.9 build for the Ubuntu 26.04 image now supplied by ubuntu-latest. It preserves ubuntu-latest for jobs requesting 3.x or 3.12 and adds regression tests covering the release matrix and all tests.yml Python 3.9 jobs. Flow diagram for workflow runner selectionflowchart TD
Start[Workflow requests Python version]
VersionCheck{Python 3.9?}
PinRunner[Use ubuntu-24.04]
LatestRunner[Use ubuntu-latest]
SetupPython[setup-python installs Python]
Start --> VersionCheck
VersionCheck -->|yes| PinRunner
VersionCheck -->|no: 3.x or 3.12| LatestRunner
PinRunner --> SetupPython
LatestRunner --> SetupPython
File-Level Changes
Assessment against linked issues
Possibly linked issues
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
|
(lane openRepoShape-3, 2026-10-21T05:11:37Z) Independent review (RV1095) of head 6031bf1: READY, no MUST. Two SHOULDs for one fix round before this leaves draft; landing waits on Checked and true:
SHOULD 1, tests/test_release_workflow.py:596-600. The guard looks for the string "3.9" in tests.yml only, so it passes with a 3.9 job on ubuntu-latest:
SHOULD 2, .github/workflows/tests.yml:277-278. "Every other job asks for NIT (body only): runner.os is at release.yml:1238 at the head, not :1234. Of the release notes, only v1.0.0 and v1.1.0 mention ubuntu-latest, not v1.1.1. Lane 3's plan: a short fix round, F1095, takes both SHOULDs and the two body NITs on this branch. Then a short delta review, and the pilot. #1092's pilot is chained behind this one, so Lane: openreposhape-3 (openRepoShape-3) |
…vers both workflows, an unquoted 3.9 and a matrix's rows, and the `package` comment names the jobs that keep their runners (#1094) RV1095's two SHOULDs. tests/test_release_workflow.py: the guard looked for the string "3.9" in tests.yml alone, so it passed with an unquoted `python-version: 3.9` (the repo's YAML reader makes that the float 3.9), with release.yml's `build` on 3.9, and with a runner or Python that a matrix gives. It is now an allow list over both workflows: every setup-python step has `${{ matrix.os }}` and `${{ matrix.python }}` filled from each `include` row, a job with no matrix is one row, and every pair on `ubuntu-latest` must ask for `3.x` or `3.12`, every 3.9 pair must run on `ubuntu-24.04`, and no expression may be left unfilled. The `package` job's own assertions stay. tests.yml, the comment on `package`: "Every other job asks for `3.x` or `3.12` ... and stays on ubuntu-latest" was not true (`tests-git-bash` is on windows-latest, no tests.yml job asks for 3.12, and testpypi and pypi ask setup-python for nothing). It now says: the other jobs keep their runners, `tests` here asks for `3.x` and release.yml's `build` for `3.12` on ubuntu-latest, both of which 26.04 has, and `tests-git-bash` runs on windows-latest. The same sentence in the previous commit's message, and in the pull request body, is this one. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
(lane openRepoShape-3, 2026-10-21T05:23:20Z) Delta review (RV1095d) of head 3df09c6: READY, no MUST. One new SHOULD. Checked:
SHOULD, tests/test_release_workflow.py:607 and :613-614. The helper expands matrix
NIT, tests/test_release_workflow.py:589: "the next test holds every other job of both workflows to what 26.04 has" should say "every job of both workflows on ubuntu-latest", since that is what the next test checks. Lane 3's plan: one more short round, F1095b, takes S3 and the NIT before the landing. The test's docstring says it covers a runner or a Python that a matrix gives, so the guard must also fail closed on a matrix without Lane: openreposhape-3 (openRepoShape-3) |
…x of the standard form instead of passing it unchecked, and its docstrings name what it holds (#1094) RV1095d's SHOULD (S3) and NIT (N3). S3: setup_python_pairs() expanded `strategy.matrix.include` rows only, and filled a key a row lacked with the text "None", so the `${{` check never fired on a matrix without `include`: a `tests` job with `runs-on: ${{ matrix.os }}`, `matrix: {os: [ubuntu-latest], python: ['3.9']}` and `python-version: ${{ matrix.python }}` passed. It now asserts that a job's matrix has no key but `include`, which fails closed on the standard form, and fills `${{ matrix.<key> }}` from the keys a row has, so a reference a row does not fill stays in the text and the `${{` check catches it. The eight pairs at the head are the same. N3: the `package` test's docstring said the next test holds "every other job" to what 26.04 has; it holds every job on `ubuntu-latest`, and says so. The new test's docstring and the helper's say that a runner or Python from an `include` row is read, and a matrix of the standard form fails. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
(lane openRepoShape-3, 2026-10-21T05:29:01Z) Delta review 2 (RV1095e) of head f464631: READY, no MUST, no SHOULD. Checked:
Optional NIT, no round needed: the matrix assertion at :611 also fires for a job with a standard matrix and no setup-python step. None exists today. Moving it under Lane 3's plan: this head lands as it is, and the optional NIT is left. The pilot (key Lane: openreposhape-3 (openRepoShape-3) |
…04 that `ubuntu-latest` now gives out runs the suite out of disk under pytest's basetemp (#1096) #1092's `tests` job ran on an `ubuntu-26.04` runner (job 119050702775, image version 20261012.163.1) and ended `2436 failed, 11382 passed, 380 skipped, 5579 errors in 3048.23s`, with 28325 lines of `[Errno 122] Disk quota exceeded`, and later `No space left on device`, all under pytest's basetemp, `/tmp/pytest-of-runner/pytest-0`. It is the image move of #1094, and the job passed on 24.04, so it is pinned there until the suite runs on 26.04, which #1096 tracks. .github/workflows/tests.yml: `tests` is on `ubuntu-24.04`, with a comment that gives the job, its counts and the quota errors and says it stays until #1096. The `package` comment said "`tests` here asks for `3.x` ... on ubuntu-latest", which this makes false; it now says that `tests` is on ubuntu-24.04 too, for its own reason, that `tests-git-bash` runs on windows-latest, and that release.yml's `build` asks for `3.12` on ubuntu-latest, which 26.04 has. The 3.9 reason is as it was. tests/test_release_workflow.py: a new test holds `tests` on ubuntu-24.04, and its docstring names #1096 and the quota errors. The pairs `setup_python_pairs()` yields are the same but for `tests`, from `ubuntu-latest` to `ubuntu-24.04`, and the allow-list test passes as before. tests/test_doctor_legs_members_next.py: the docstring said `tests.yml` runs the suite on ubuntu-latest alone; it says ubuntu-24.04. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
ubuntu-24.04, since the Ubuntu 26.04 that ubuntu-latest now gives out has no 3.9 for setup-python and runs out of /tmp under the suite (#1094)
|
(lane openRepoShape-3, 2026-10-21T06:20:01Z) Delta review 3 (RV1095f) of head 99b097f: READY, no MUST, no SHOULD. Checked:
NIT, .github/workflows/tests.yml:69 and the body's "The failure" line: 28325 is the number of lines saying "Disk quota exceeded". Only 9287 of them carry "[Errno 122]"; the rest are git's "fatal: cannot copy ...: Disk quota exceeded" and "error: copy-fd: write returned: Disk quota exceeded". Say "28325 lines of Lane 3's plan:
Lane: openreposhape-3 (openRepoShape-3) |
|
Sorry @brettheap, you've used your own review budget of 250,000 diff characters for the last 7 days. You can request another review in 10 hours and 43 minutes by commenting |
…` runs the suite on `ubuntu-latest` again, as it does once `tests` is back there (#1096) #1095 changed this sentence to `ubuntu-24.04` when it pinned the `tests` job there. This pull request moves the job back to `ubuntu-latest`, so the sentence follows it. Nothing else in the file changes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>



The two Python 3.9 jobs and the
testsjob now run onubuntu-24.04: neither 3.9 job fails in setup-python on an Ubuntu 26.04 runner, and the full suite does not run out of disk there (round 3, below).The problem.
ubuntu-latesthas started giving out Ubuntu 26.04 runners, and setup-python has no Python 3.9 build for them: its manifest lists 3.10 to 3.15 there, and 3.8 to 3.15 for 24.04. Two jobs asked for 3.9 onubuntu-latest:packagejob oftests.yml, which failed on shape-doctor.py: a leg's gitlink that no.gitmodulessection registers, beside one whose sections register other paths or beside none, is named with its own way out, as #914 names one beside a.gitmoduleswith no section (#1080) #1092's run at 04:35:25Z withThe version '3.9' with architecture 'x64' was not found for Ubuntu 26.04.;{os: ubuntu-latest, python: '3.9'}, which would fail the same way on the v1.2.0 release.What changed.
.github/workflows/tests.yml, thepackagejob (:289):runs-on: ubuntu-latestis nowruns-on: ubuntu-24.04, with a comment above it (:280-287) saying why: 3.9 isrequires-python's floor, and the Ubuntu 26.04 thatubuntu-latestnow gives out has no 3.9 build for setup-python..github/workflows/tests.yml, thetestsjob (:74):runs-on: ubuntu-latestis nowruns-on: ubuntu-24.04, with a comment above it (:65-72) saying why (round 3, below)..github/workflows/release.yml, the install matrix's last row (:908):os: ubuntu-latestis nowos: ubuntu-24.04,python: '3.9'as before, with a comment (:903-907) saying why.tests-git-bashruns on windows-latest, and in release.ymlbuildasks for3.12on ubuntu-latest, which 26.04 has. Thepackagecomment says so, and thattestsis on ubuntu-24.04 too, for its own reason.tests/test_release_workflow.py: the install-matrix test (:562-569) pins the new row and that theubuntu-latestrows ask for3.xalone; thepackagetest (:584-596) pins the job toubuntu-24.04and its one3.9; a new test (:599-608) pins thetestsjob toubuntu-24.04; and a new test (:640-658, with its helpersetup_python_pairs, :611-637) holds every setup-python step of both workflows to what 26.04 has.tests/test_doctor_legs_members_next.py(:37): a docstring saidtests.ymlruns the suite on ubuntu-latest alone; it says ubuntu-24.04.The new test,
test_no_setup_python_on_ubuntu_latest_asks_for_a_python_26_04_lacks, is an allow list overtests.ymlandrelease.yml:actions/setup-python@step, each${{ matrix.<key> }}astrategy.matrix.includerow has is filled from that row's key (a job with no matrix is one row), and the values are compared asstr(), so an unquotedpython-version: 3.9, which the repository's YAML reader makes the float 3.9, is still "3.9";include, the standard form (os: [...],python: [...]), fails the helper's assertion, because the test does not expand it, so it cannot pass unchecked;ubuntu-latestmust ask for3.xor3.12;ubuntu-24.04;${{may be left unfilled, so a reference anincluderow does not fill fails the test rather than slipping past it;packageand the release's install row) must be among the pairs, so the loop cannot pass over nothing.What reads the row's name. In
release.yml,matrix.osis read twice, by the job name (install check (${{ matrix.os }}, Python ${{ matrix.python }}), :880) and byruns-on(:889), andrunner.osonce, by the Windows-only PowerShell step (:1238). Noif:, artifact name, cache key or other step branches on the row. So the new row runs exactly as the old one did, on the 24.04 imageubuntu-latestused to be, and only its job name changes:install check (ubuntu-24.04, Python 3.9). No test, doc or script names that job.The search.
tests/,README.md,docs/andAGENTS.mdname no runner of the two 3.9 jobs, and the one docstring that named the runner oftests,tests/test_doctor_legs_members_next.py:37, is changed (round 3); the onlyubuntu-latestmentions indocs/are the v1.0.0 and v1.1.0 release notes, which record what those releases ran and stay as they are.Out of scope.
requires-pythonstays>=3.9. Dropping 3.9, past its end of life since October 2025, is Brett Heap's call.Tests, each file alone under a stub
gh, withEMAILset, at head99b097fe3c1eunless marked:tests/test_release_workflow.py: 59 passedtests/test_workflow_concurrency.py: 14 passedtests/test_install_sh.py: 399 passedtests/test_repo_hygiene.py: 100 passedtests/test_cli_reference.py: 23 passedpyflakes tests/test_release_workflow.py: no output, as atf464631aa89f;tests/test_doctor_legs_members_next.py(a docstring changed): the same 207 warnings as atf464631aa89f, and its 192 tests collect.tests/test_release_install_check_children.py30 passed andtests/test_no_auto_maintenance.py60 passed at3df09c6f5d81;tests/test_shape_advisory.py47 passed andtests/test_openreposhape_package.py213 passed at6031bf1b. Round 3 changedtests.yml'sruns-onand comments, one new test and one docstring, and none of these reads them.The pairs.
setup_python_pairs()yields eight, sorted, before and after round 3, anddiffshows one line changed, thetestspair:('tests.yml', 'tests', 'ubuntu-latest', '3.x')is now('tests.yml', 'tests', 'ubuntu-24.04', '3.x').Probes and mutants, run at
99b097fe3c1e, each restored and checked withcmp:testsjob back onubuntu-latest:test_the_tests_job_runs_the_suite_on_ubuntu_24_04fails (1 failed, 58 passed); the allow list passes, astestsasks for3.x;python-version: 3.9unquoted on thetestsjob: with the job onubuntu-24.04the file passes (59 passed), correctly, since a 3.9 job belongs on 24.04; with the job also put back onubuntu-latestthe allow list fails on('tests.yml', 'tests', 'ubuntu-latest', '3.9')and so does the pin test,test_the_tests_job_runs_the_suite_on_ubuntu_24_04(2 failed, 57 passed), and with the pin test deselected the allow list fails alone (1 failed, 57 passed, 1 deselected), so the unquoted float is still caught;buildset to'3.9': the allow list fails on('release.yml', 'build', 'ubuntu-latest', '3.9')(1 failed, 58 passed);ubuntu-latest: the allow list fails on('release.yml', 'install', 'ubuntu-latest', '3.9'), andtest_the_install_check_runs_on_three_systems_and_python_3_9fails too (2 failed, 57 passed);packageback onubuntu-latest: the allow list fails on('tests.yml', 'package', 'ubuntu-latest', '3.9'), andtest_the_package_job_runs_its_python_3_9_on_ubuntu_24_04fails too (2 failed, 57 passed);testsjob on a matrix of the standard form (runs-on: ${{ matrix.os }},matrix: {os: [ubuntu-latest], python: ['3.9']},python-version: ${{ matrix.python }}): the helper's assertion fails with('tests.yml', 'tests', ['os', 'python']), and so does the pin test, since${{ matrix.os }}is notubuntu-24.04; with the pin test deselected the helper's assertion fails alone (1 failed, 57 passed, 1 deselected);includerow that hasosand nopython: the${{check fails on('tests.yml', 'tests', 'ubuntu-latest', '${{ matrix.python }}'); probe E, the row{os: ubuntu-latest, python: '3.9'}: the allow list fails on('tests.yml', 'tests', 'ubuntu-latest', '3.9'), so the row is filled (each 2 failed, 57 passed: the pin test, and the allow list).Merges.
git merge-tree --write-treeof this head (99b097fe3c1e) with origin/main (de75bf02d3f8) is clean (rc 0), and its tree (034caec526d6) is the head's own. With #1092 (l3-1080-unregistered-gitlinks,83627b229737) it is clean (rc 0), tree57cb15c3b3cf; #1092 touchesshape-doctor.py,tests/test_doctor_plan_overrides.pyandtests/test_shape_doctor.pyonly. No other open PR touches.github/,tests/test_release_workflow.pyortests/test_doctor_legs_members_next.py.The proof is this PR's own CI run: its
testsandpackagejobs are the two this change moves ontoubuntu-24.04; nothing local runs Actions.Review round (RV1095, issuecomment-6308584611, READY with no MUST):
tests.ymlalone, so an unquoted 3.9, release.yml'sbuildon 3.9 and a runner or Python that a matrix gave all passed; it is now the allow list above over both workflows, which reads a matrix'sincluderows (a matrix of any other form was still let through until S3, below), and probes A and B and both mutants failed it (round 3 changes probe A, below).packagecomment (and this body, and the first commit's message) said "Every other job asks for3.xor3.12... and stays on ubuntu-latest", which was not true; it now says the sentence under "What changed", and the squash message should use that one. release.yml's comment (:903-907) is true as written and is unchanged: 26.04 lists 3.10 to 3.15 and 24.04 lists 3.8 to 3.15 (read from the manifest again at 05:13Z), and the three rows above ask for3.x.runner.osis at release.yml:1238 at this head, not :1234.ubuntu-latest, not v1.1.1.Review round 2 (RV1095d, issuecomment-6308733787, READY with no MUST, one SHOULD and one NIT):
includerows only and filled a key a row lacked with the text "None", so the${{check never fired on a standard matrix (probe C survived); it now asserts a job's matrix has no key butinclude(tests/test_release_workflow.py:623-624at this head) and fills only the keys a row has (:633-636), and probe C fails the file.packagetest's docstring said the next test holds "every other job" to what 26.04 has; it now says every job of both workflows onubuntu-latest(:589-590), and the allow-list test's docstring says what it holds for both matrix forms (:641-647 at this head).Round 3: the
testsjob (#1096, filed by lane 3):.gitmodulessection registers, beside one whose sections register other paths or beside none, is named with its own way out, as #914 names one beside a.gitmoduleswith no section (#1080) #1092'stestsjob ran on an Ubuntu 26.04 runner (job 119050702775, imageubuntu-26.04version 20261012.163.1) and ended2436 failed, 11382 passed, 380 skipped, 5579 errors in 3048.23s. Its log has 28325 lines ofDisk quota exceeded(9287 of them[Errno 122], the rest git's own copy errors), and laterNo space left on device, all under/tmp/pytest-of-runner/pytest-0, pytest's basetemp. It is the same image move as this PR's, and the job passed onubuntu-24.04..github/workflows/tests.yml:74,runs-on: ubuntu-latestis nowruns-on: ubuntu-24.04, with a comment (:65-72) that gives the job, its counts and theDisk quota exceededunder pytest's basetemp in/tmp, and says it is pinned until the suite runs on 26.04 (tests.yml: on an Ubuntu 26.04 runner the full suite fills/tmpunder pytest's basetemp (Disk quota exceeded, 2436 failed and 5579 errors), sotestsruns onubuntu-24.04until the suite can run there #1096).packagecomment (:280-287) said "testshere asks for3.x... on ubuntu-latest". It now says thattestsis on ubuntu-24.04 too, for a reason of its own, thattests-git-bashruns on windows-latest, and that in release.ymlbuildasks for3.12on ubuntu-latest, which 26.04 has. The 3.9 reason is as it was. release.yml's comment (:903-907) names no runner oftests, so it is unchanged, and no other workflow comment does.test_the_tests_job_runs_the_suite_on_ubuntu_24_04(tests/test_release_workflow.py:599-608), whose docstring names tests.yml: on an Ubuntu 26.04 runner the full suite fills/tmpunder pytest's basetemp (Disk quota exceeded, 2436 failed and 5579 errors), sotestsruns onubuntu-24.04until the suite can run there #1096 and the disk quota.setup_python_pairs()and the allow-list test are as they were, and pass.Follow-up: #1096 (run the suite on Ubuntu 26.04)
Closes #1094
Lane: openreposhape-3 (openRepoShape-3)
🤖 Generated with Claude Code
Summary by Sourcery
Keep Python 3.9 workflow jobs on Ubuntu 24.04 while validating that all setup-python jobs use versions supported by their runners.
Bug Fixes:
Enhancements:
Tests: