Overview
pynufft is no longer a dependency of any PyAuto library — @PyAutoLabs/PyAutoArray#475 deleted TransformerNUFFTPyNUFFT and dropped pynufft from both the optional and dev extras. Four CI recipes and one install doc still install it. This is phase 3 of 3 of the pynufft-removal residue sweep (phases 1 and 2 shipped 2026-08-23); it is the CI + install-doc tier and is independent of the other two.
Severity is low and this is not urgent: every site pins 2025.1.1, not the broken 2022.2.2, so nothing is hitting the scipy.linalg.pinv2 failure and no build is red. What it costs is install time and unnecessary resolver surface on every release/validation run.
Plan
- Drop
pip install pynufft==2025.1.1 from PyAutoHands release.yml (3 sites — one bare, two alongside numba, where numba is kept).
- Drop the same line from PyAutoHeart
workspace-validation.yml (mode=release install step; numba kept).
- Delete
pip install pynufft from PyAutoCTI docs/installation/source.rst, having first verified PyAutoCTI's suite genuinely passes without it.
- Confirm the affected workflows green afterwards — every run and every matrix leg.
Detailed implementation plan
Work Classification
Workspace / CI-and-docs. No PyAuto* library source changes, so there is no library-first merge gate — the three PRs are independent of one another and can merge in any order.
Affected Repositories
- PyAutoLabs/PyAutoHands (primary — 3 of the 4 CI sites)
- PyAutoLabs/PyAutoHeart
- PyAutoLabs/PyAutoCTI
Branch Survey
| Repository |
Current Branch |
Dirty? |
| PyAutoHands |
main |
clean |
| PyAutoHeart |
main |
clean |
| PyAutoCTI |
main |
clean |
Suggested branch: feature/pynufft-removal-phase-3 (all three repos)
Mobile session — no worktrees; work is done against fresh clones and pushed as three feature branches.
Implementation Steps
PyAutoHands/.github/workflows/release.yml
release_test_pypi → Tests step (~:296): delete the bare pip install pynufft==2025.1.1, leaving pytest and numba.
run_smoke_tests → Install from TestPyPI at pinned version (~:355): pip install pynufft==2025.1.1 numba → pip install numba.
release_workspaces → Regenerate API audit baseline (~:774): same rewrite.
- The neighbouring "matplotlib deliberately unpinned" comments are about matplotlib, not pynufft — left untouched.
PyAutoHeart/.github/workflows/workspace-validation.yml (~:302), the mode=release "Install TestPyPI wheels" step: pip install pynufft==2025.1.1 numba → pip install numba. The nufftax>=0.6.1,<0.7.0 install two lines down is the live NUFFT backend and stays.
PyAutoCTI/docs/installation/source.rst:58: delete pip install pynufft under "For unit tests to pass you will also need the following optional requirements".
Verification that PyAutoCTI's suite does not need pynufft
Verified rather than assumed, three ways:
PyAutoCTI/.github/workflows/main.yml is a thin caller of PyAutoHeart's reusable lib-tests.yml, which installs pip install ./PyAutoCTI[optional] (plus the PyAutoNerves/PyAutoFit/PyAutoArray chain) and never installs pynufft in either leg.
PyAutoCTI/pyproject.toml's optional extra is ["numba"] — pynufft is not in it.
- The latest
main run of that workflow (run 31134701968, head f40b2f7) is success across every leg: unittest on Python 3.12 and 3.13, plus the unittest-nojax leg.
- A full-tree grep of PyAutoCTI finds pynufft only in
paper/paper.bib, files/citations.tex (both published-record material, deliberately out of scope) and the doc line being deleted — no import, no test, no config.
Key Files
PyAutoHands/.github/workflows/release.yml — 3 sites
PyAutoHeart/.github/workflows/workspace-validation.yml — 1 site
PyAutoCTI/docs/installation/source.rst — 1 line
Green-CI caveat (read before closing this issue)
Every changed line lives on a release path, not on a PR-triggered path:
release.yml is workflow_dispatch-only; the Tests step runs in rehearsal and live mode, while run_smoke_tests and release_workspaces are live-only.
workspace-validation.yml's pynufft line is inside the mode=release install step, reached only via release-integrate.yml (Brain Release Agent dispatch, after an M1 TestPyPI rehearsal). The continuous mode=smoke channel never executed it.
So ordinary PR CI cannot exercise these lines. Full green confirmation therefore lands on the next release rehearsal / nightly release run; each repo's own PR checks are the pre-merge signal. Heart is currently RED on "release validation FAILED" for unrelated reasons.
Out of scope, noted while verifying
PyAutoCTI/docs/installation/source.rst still lists pip install pylops==1.11.1 in the same block, and CTI's CI installs no pylops either while passing — the same evidence falsifies that line too. Not touched here (this task is scoped to pynufft); worth a follow-up.
- The same file points at
PyAutoCTI/requirements.txt and PyAutoArray/optional_requirements.txt, neither of which exists any more (packaging moved to pyproject.toml extras). Separate doc rot, separate task.
PyAutoCTI/files/citations.tex still asks users to cite PyNUFFT. Published-record class, deliberately untouched.
Original Prompt
Click to expand starting prompt
# Phase 3: stop installing pynufft in Hands/Heart CI and PyAutoCTI install docs
Type: maintenance
Target: ci
Repos:
- @PyAutoHands
- @PyAutoHeart
- @PyAutoCTI
Difficulty: low
Autonomy: supervised
Priority: normal
Status: draft
Filed: 2026-08-23
Phase 3 of 3. Parent: `pynufft_removal_downstream_residue.md`. Independent of
phases 1 and 2.
`pynufft` is no longer a dependency of any PyAuto library (@PyAutoArray#475
dropped it from both `optional` and `dev`), but four CI recipes and one install
doc still install it.
## Sites
- `@PyAutoHands/.github/workflows/release.yml:296,355,774` —
`pip install pynufft==2025.1.1` (once bare, twice with `numba`)
- `@PyAutoHeart/.github/workflows/workspace-validation.yml:302` — same
- `@PyAutoCTI/docs/installation/source.rst:58` — `pip install pynufft`, listed
under "For unit tests to pass you will also need the following optional
requirements". **Confirm PyAutoCTI's suite genuinely has no such need before
deleting the line** — verify, do not assume.
## Severity
Not urgent. These pin **2025.1.1**, not the broken `2022.2.2`, so they are
**not** hitting the `scipy.linalg.pinv2` failure and no build is red. This is
wasted install time and unnecessary resolver surface.
Worth knowing while working: these recipes are the only reason the local dev
environment still has `pynufft 2025.1.1` installed at all — removing them
changes what a fresh local env contains.
## Acceptance
- No PyAuto CI workflow installs `pynufft`.
- PyAutoCTI's install doc no longer instructs users to, with evidence its tests
pass without it.
- The affected workflows are confirmed green afterwards — **every run and every
matrix leg**, not just the first one reported.
Overview
pynufftis no longer a dependency of any PyAuto library — @PyAutoLabs/PyAutoArray#475 deletedTransformerNUFFTPyNUFFTand droppedpynufftfrom both theoptionalanddevextras. Four CI recipes and one install doc still install it. This is phase 3 of 3 of the pynufft-removal residue sweep (phases 1 and 2 shipped 2026-08-23); it is the CI + install-doc tier and is independent of the other two.Severity is low and this is not urgent: every site pins
2025.1.1, not the broken2022.2.2, so nothing is hitting thescipy.linalg.pinv2failure and no build is red. What it costs is install time and unnecessary resolver surface on every release/validation run.Plan
pip install pynufft==2025.1.1from PyAutoHandsrelease.yml(3 sites — one bare, two alongsidenumba, wherenumbais kept).workspace-validation.yml(mode=release install step;numbakept).pip install pynufftfrom PyAutoCTIdocs/installation/source.rst, having first verified PyAutoCTI's suite genuinely passes without it.Detailed implementation plan
Work Classification
Workspace / CI-and-docs. No PyAuto* library source changes, so there is no library-first merge gate — the three PRs are independent of one another and can merge in any order.
Affected Repositories
Branch Survey
Suggested branch:
feature/pynufft-removal-phase-3(all three repos)Mobile session — no worktrees; work is done against fresh clones and pushed as three feature branches.
Implementation Steps
PyAutoHands/.github/workflows/release.ymlrelease_test_pypi→Testsstep (~:296): delete the barepip install pynufft==2025.1.1, leavingpytestandnumba.run_smoke_tests→Install from TestPyPI at pinned version(~:355):pip install pynufft==2025.1.1 numba→pip install numba.release_workspaces→Regenerate API audit baseline(~:774): same rewrite.PyAutoHeart/.github/workflows/workspace-validation.yml(~:302), themode=release"Install TestPyPI wheels" step:pip install pynufft==2025.1.1 numba→pip install numba. Thenufftax>=0.6.1,<0.7.0install two lines down is the live NUFFT backend and stays.PyAutoCTI/docs/installation/source.rst:58: deletepip install pynufftunder "For unit tests to pass you will also need the following optional requirements".Verification that PyAutoCTI's suite does not need pynufft
Verified rather than assumed, three ways:
PyAutoCTI/.github/workflows/main.ymlis a thin caller of PyAutoHeart's reusablelib-tests.yml, which installspip install ./PyAutoCTI[optional](plus the PyAutoNerves/PyAutoFit/PyAutoArray chain) and never installs pynufft in either leg.PyAutoCTI/pyproject.toml'soptionalextra is["numba"]— pynufft is not in it.mainrun of that workflow (run 31134701968, headf40b2f7) is success across every leg:unitteston Python 3.12 and 3.13, plus theunittest-nojaxleg.paper/paper.bib,files/citations.tex(both published-record material, deliberately out of scope) and the doc line being deleted — no import, no test, no config.Key Files
PyAutoHands/.github/workflows/release.yml— 3 sitesPyAutoHeart/.github/workflows/workspace-validation.yml— 1 sitePyAutoCTI/docs/installation/source.rst— 1 lineGreen-CI caveat (read before closing this issue)
Every changed line lives on a release path, not on a PR-triggered path:
release.ymlisworkflow_dispatch-only; theTestsstep runs in rehearsal and live mode, whilerun_smoke_testsandrelease_workspacesare live-only.workspace-validation.yml's pynufft line is inside themode=releaseinstall step, reached only viarelease-integrate.yml(Brain Release Agent dispatch, after an M1 TestPyPI rehearsal). The continuousmode=smokechannel never executed it.So ordinary PR CI cannot exercise these lines. Full green confirmation therefore lands on the next release rehearsal / nightly release run; each repo's own PR checks are the pre-merge signal. Heart is currently RED on "release validation FAILED" for unrelated reasons.
Out of scope, noted while verifying
PyAutoCTI/docs/installation/source.rststill listspip install pylops==1.11.1in the same block, and CTI's CI installs no pylops either while passing — the same evidence falsifies that line too. Not touched here (this task is scoped to pynufft); worth a follow-up.PyAutoCTI/requirements.txtandPyAutoArray/optional_requirements.txt, neither of which exists any more (packaging moved topyproject.tomlextras). Separate doc rot, separate task.PyAutoCTI/files/citations.texstill asks users to cite PyNUFFT. Published-record class, deliberately untouched.Original Prompt
Click to expand starting prompt