You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
pyauto-heart verify_installCheck D (pip install "autolens[optional]") is FAILING, and is one of the two legs holding release readiness RED (sidecar 2026-08-03T06:01:09Z, PyAutoHeart run 30788224561, job 91606144514). The install succeeds but import autolens raises AttributeError: module 'autofit' has no attribute 'Latent' — pip resolved autofit 2026.4.30.582, an April release, alongside a 2026.8.2.1 autoarray/autogalaxy/autonerves.
The cause is that every intra-family dependency across the five libraries is a bare package name with no version floor. When pip backtracks through the [optional] -> [jax] -> autofit[jax] -> autonerves[jax] extras chain it may walk the release history back to 2022, and it treats "version X does not provide the extra 'jax'" as a warning rather than an error — so an ancient autofit with no jax extra is a legal solution, and pip settles there. This is a real user-facing defect, not a CI artefact.
Plan
Add >=2026.7.29.2 floors to the cross-package intra-family dependencies in PyAutoArray, PyAutoFit, PyAutoGalaxy, PyAutoLens and PyAutoCTI — in both the base dependencies and the [jax] extras.
Leave self-referential extras (autolens[jax] inside autolens[optional], and siblings) unfloored: a self-reference is already version-locked, and a floor there would make a local 1.0.dev0 wheel build unsatisfiable.
Make verify_install Check D name the interpreter it used in its sidecar detail, so a CI-vs-local Python divergence can never hide a resolution bug again.
Verify on both python3.12 and python3.13 before shipping — the bug is invisible on 3.12.
Detailed implementation plan
Affected Repositories
PyAutoLens (primary)
PyAutoArray
PyAutoFit
PyAutoGalaxy
PyAutoCTI
PyAutoHeart (Check D evidence detail)
PyAutoNerves — inspected, no change needed (only self-references)
Branch Survey
Repository
Current Branch
Dirty?
./PyAutoNerves
main
clean
./PyAutoArray
main
clean
./PyAutoFit
main
clean
./PyAutoGalaxy
main
clean
./PyAutoLens
main
clean
./PyAutoCTI
main
clean
./PyAutoHeart
main
clean
worktree_check_conflict reports formal claims on PyAutoFit (point-source-defaults-campaign, nautilus-1core-serial-pool, simulator-util-to-af-ex), PyAutoLens (point-source-defaults-campaign) and PyAutoHeart (interferometer-start-here-integrate-oom). Each claiming branch was diffed against origin/main: none touches pyproject.toml, and the PyAutoHeart branch has an empty diff (already merged). No genuine file-level overlap; proceeding rather than parking, since this is a release-RED leg.
Suggested branch:feature/intra-family-dep-floors
Implementation Steps
PyAutoArray/pyproject.toml — dependencies: "autonerves" -> "autonerves>=2026.7.29.2"; [project.optional-dependencies] jax: "autonerves[jax]" -> "autonerves[jax]>=2026.7.29.2". Leave the autoarray[jax] self-reference in optional unchanged.
PyAutoFit/pyproject.toml — same two edits (autonerves, autonerves[jax]). Leave the autofit[jax] self-reference unchanged.
PyAutoHeart/heart/checks/verify_install.sh — in check_d, capture the venv interpreter version and include it in both the PASS and FAIL RESULTS+=(...) detail strings, matching how Check B names its interpreter.
Why 2026.7.29.2 is the right floor
It is live on PyPI, is not yanked, and is the oldest release that still carries af.Latent. This is a floor, not an exact pin — consistent with the floors-not-pins release design (PyAutoBuild#118/#120). A floor must name an installable version.
Testing
Control test, already run on both interpreters before this issue was filed:
without floors, python3.13, TestPyPI+PyPI -> autofit 2026.4.30.582, import autolens raises
with floors, same command/interpreter -> autoarray/autofit/autogalaxy/autonerves 2026.8.2.1, import OK
After the edits: rebuild the five wheels, re-run pip install "autolens[optional]" on python3.12 and python3.13, confirm newest-family resolution and a clean import in both.
pyauto-heart verify_install D.
Known trade-off
The verify_install skill doc's B --version 1.0.dev0 --find-links dist/ example will no longer resolve intra-family wheels out of dist/, since 1.0.dev0 < 2026.7.29.2. Release CI is unaffected: it builds dated dev versions (e.g. 2026.8.3.1.dev69801) that clear the floor.
Timing note
The floors only take effect once new wheels are published. The RED verify_install leg does not clear until a release rehearsal republishes to TestPyPI and Check D re-runs against those wheels.
PyAutoHeart/heart/checks/verify_install.sh — check_d interpreter in the evidence detail
Original Prompt
Click to expand starting prompt
autolens[optional] resolves an ancient autofit — intra-family deps have no version floors
Type: bug
Target: health_fixes
Repos:
@PyAutoNerves
@PyAutoArray
@PyAutoFit
@PyAutoGalaxy
@PyAutoLens
@PyAutoCTI
Difficulty: low
Autonomy: supervised
Priority: high
Status: draft
Finding (2026-08-03, PyAutoHeart readiness RED)
pyauto-heart verify_install Check D (pip install "autolens[optional]") FAILED
in the Release Integrate run (PyAutoHeart run 30788224561, job 91606144514),
sidecar ~/.pyauto-heart/verify_install.json2026-08-03T06:01:09Z,
detail pip rc=0 import rc=1. It is one of the two legs holding the release RED.
The install succeeds; the import does not:
[05:58:53] -> import autolens
Traceback (most recent call last):
import autolens; print(autolens.__version__)
AttributeError: module 'autofit' has no attribute 'Latent'
Check D resolved autofit 2026.4.30.582 (an April release, pulling autoconf 2026.7.15.1 with it) while autoarray / autogalaxy / autonerves came
in at 2026.8.2.1.
Root cause
autolens[optional] expands to autolens[jax] -> autogalaxy[jax] -> autofit[jax] -> autonerves[jax].
Every intra-family dependency in the five pyproject.toml files is a bare
package name with no version floor ("autofit", "autoarray", "autogalaxy", "autonerves"). When pip backtracks anywhere in that extras
chain it may walk the entire release history back to 2022 — and pip treats "version X does not provide the extra 'jax'" as a warning, not an error,
so an ancient autofit carrying no jax extra is a legal solution. pip settles
there after ~22,600 lines of backtracking.
The metadata itself did not regress: requires_dist for autonerves / autofit /
autogalaxy is identical between 2026.7.29.2 (PyPI) and 2026.8.2.1
(TestPyPI). The whole 2026.8.2.1 family is TestPyPI-only; PyPI's newest is
still 2026.7.29.2.
Why it passed locally and failed in CI
Check D builds its venv with the default python3. The verify_install_release
job calls setup-python for 3.11, then 3.12, then 3.13 — the last wins, so CI's python3 is 3.13. Locally it is 3.12. Reproduced on both, same command,
same index args:
interpreter
resolved autofit
import autolens
3.12
2026.7.29.2
passes (still has Latent)
3.13
2026.4.30.582
AttributeError
Both are backtracked; 3.12 merely stops at a version that still has Latent.
This is a real user-facing defect, not a CI artefact — pip install autolens[optional] from live PyPI today also silently walks the family back.
Without the floors the identical command lands on autofit 2026.4.30.582 and
raises.
Task
Add >=2026.7.29.2 floors to every intra-family dependency — base dependenciesand the [jax] / [optional] extras — in
PyAutoNerves, PyAutoArray, PyAutoFit, PyAutoGalaxy, PyAutoLens, and
PyAutoCTI (autofit, autoarray are bare there too).
This is a floor, not an exact pin — consistent with the floors-not-pins
release design (PyAutoBuild#118/Feature/phase #120). A floor must name an installable
version, so 2026.7.29.2 (live on PyPI, not yanked) is the right value.
Make Check D state which interpreter it used in its sidecar detail
(PyAutoHeart/heart/checks/verify_install.sh, check_d). "Default python3" silently differing between CI (3.13) and local (3.12) is what hid
this; the evidence should name the interpreter the way Check B's details do.
Acceptance
pip install "autolens[optional]" on python3.12 and python3.13 resolves
the whole PyAuto family at the newest available release, and import autolens
succeeds.
Check D's sidecar detail names the interpreter version.
Note: the floors only take effect once new wheels are published. The RED verify_install leg does not clear until a release rehearsal republishes to
TestPyPI and Check D re-runs against those wheels.
Overview
pyauto-heart verify_installCheck D (pip install "autolens[optional]") is FAILING, and is one of the two legs holding release readiness RED (sidecar2026-08-03T06:01:09Z, PyAutoHeart run 30788224561, job 91606144514). The install succeeds butimport autolensraisesAttributeError: module 'autofit' has no attribute 'Latent'— pip resolved autofit 2026.4.30.582, an April release, alongside a 2026.8.2.1 autoarray/autogalaxy/autonerves.The cause is that every intra-family dependency across the five libraries is a bare package name with no version floor. When pip backtracks through the
[optional] -> [jax] -> autofit[jax] -> autonerves[jax]extras chain it may walk the release history back to 2022, and it treats "version X does not provide the extra 'jax'" as a warning rather than an error — so an ancient autofit with nojaxextra is a legal solution, and pip settles there. This is a real user-facing defect, not a CI artefact.Plan
>=2026.7.29.2floors to the cross-package intra-family dependencies in PyAutoArray, PyAutoFit, PyAutoGalaxy, PyAutoLens and PyAutoCTI — in both the basedependenciesand the[jax]extras.autolens[jax]insideautolens[optional], and siblings) unfloored: a self-reference is already version-locked, and a floor there would make a local1.0.dev0wheel build unsatisfiable.verify_installCheck D name the interpreter it used in its sidecar detail, so a CI-vs-local Python divergence can never hide a resolution bug again.Detailed implementation plan
Affected Repositories
Branch Survey
worktree_check_conflictreports formal claims on PyAutoFit (point-source-defaults-campaign,nautilus-1core-serial-pool,simulator-util-to-af-ex), PyAutoLens (point-source-defaults-campaign) and PyAutoHeart (interferometer-start-here-integrate-oom). Each claiming branch was diffed againstorigin/main: none touchespyproject.toml, and the PyAutoHeart branch has an empty diff (already merged). No genuine file-level overlap; proceeding rather than parking, since this is a release-RED leg.Suggested branch:
feature/intra-family-dep-floorsImplementation Steps
PyAutoArray/pyproject.toml—dependencies:"autonerves"->"autonerves>=2026.7.29.2";[project.optional-dependencies] jax:"autonerves[jax]"->"autonerves[jax]>=2026.7.29.2". Leave theautoarray[jax]self-reference inoptionalunchanged.PyAutoFit/pyproject.toml— same two edits (autonerves,autonerves[jax]). Leave theautofit[jax]self-reference unchanged.PyAutoGalaxy/pyproject.toml—dependencies:"autofit","autoarray"->>=2026.7.29.2;jaxextra:"autofit[jax]"->"autofit[jax]>=2026.7.29.2". Leave theautogalaxy[jax]self-reference unchanged.PyAutoLens/pyproject.toml—dependencies:"autogalaxy"->"autogalaxy>=2026.7.29.2";jaxextra:"autogalaxy[jax]"->"autogalaxy[jax]>=2026.7.29.2". Leave theautolens[jax]self-reference unchanged.PyAutoCTI/pyproject.toml—dependencies:"autofit","autoarray"->>=2026.7.29.2.PyAutoHeart/heart/checks/verify_install.sh— incheck_d, capture the venv interpreter version and include it in both the PASS and FAILRESULTS+=(...)detail strings, matching how Check B names its interpreter.Why
2026.7.29.2is the right floorIt is live on PyPI, is not yanked, and is the oldest release that still carries
af.Latent. This is a floor, not an exact pin — consistent with the floors-not-pins release design (PyAutoBuild#118/#120). A floor must name an installable version.Testing
autofit 2026.4.30.582,import autolensraisesautoarray/autofit/autogalaxy/autonerves 2026.8.2.1, import OKpip install "autolens[optional]"on python3.12 and python3.13, confirm newest-family resolution and a clean import in both.pyauto-heart verify_install D.Known trade-off
The
verify_installskill doc'sB --version 1.0.dev0 --find-links dist/example will no longer resolve intra-family wheels out ofdist/, since1.0.dev0 < 2026.7.29.2. Release CI is unaffected: it builds dated dev versions (e.g.2026.8.3.1.dev69801) that clear the floor.Timing note
The floors only take effect once new wheels are published. The RED
verify_installleg does not clear until a release rehearsal republishes to TestPyPI and Check D re-runs against those wheels.Key Files
PyAutoArray/pyproject.toml,PyAutoFit/pyproject.toml,PyAutoGalaxy/pyproject.toml,PyAutoLens/pyproject.toml,PyAutoCTI/pyproject.toml— intra-family dependency floorsPyAutoHeart/heart/checks/verify_install.sh—check_dinterpreter in the evidence detailOriginal Prompt
Click to expand starting prompt
autolens[optional]resolves an ancient autofit — intra-family deps have no version floorsType: bug
Target: health_fixes
Repos:
Difficulty: low
Autonomy: supervised
Priority: high
Status: draft
Finding (2026-08-03, PyAutoHeart readiness RED)
pyauto-heart verify_installCheck D (pip install "autolens[optional]") FAILEDin the Release Integrate run (PyAutoHeart run 30788224561, job 91606144514),
sidecar
~/.pyauto-heart/verify_install.json2026-08-03T06:01:09Z,detail
pip rc=0 import rc=1. It is one of the two legs holding the release RED.The install succeeds; the import does not:
Check D resolved autofit 2026.4.30.582 (an April release, pulling
autoconf 2026.7.15.1with it) while autoarray / autogalaxy / autonerves camein at
2026.8.2.1.Root cause
autolens[optional]expands toautolens[jax]->autogalaxy[jax]->autofit[jax]->autonerves[jax].Every intra-family dependency in the five
pyproject.tomlfiles is a barepackage name with no version floor (
"autofit","autoarray","autogalaxy","autonerves"). When pip backtracks anywhere in that extraschain it may walk the entire release history back to 2022 — and pip treats
"version X does not provide the extra 'jax'" as a warning, not an error,
so an ancient
autofitcarrying nojaxextra is a legal solution. pip settlesthere after ~22,600 lines of backtracking.
The metadata itself did not regress:
requires_distfor autonerves / autofit /autogalaxy is identical between
2026.7.29.2(PyPI) and2026.8.2.1(TestPyPI). The whole
2026.8.2.1family is TestPyPI-only; PyPI's newest isstill
2026.7.29.2.Why it passed locally and failed in CI
Check D builds its venv with the default
python3. Theverify_install_releasejob calls
setup-pythonfor 3.11, then 3.12, then 3.13 — the last wins, so CI'spython3is 3.13. Locally it is 3.12. Reproduced on both, same command,same index args:
import autolensLatent)AttributeErrorBoth are backtracked; 3.12 merely stops at a version that still has
Latent.This is a real user-facing defect, not a CI artefact —
pip install autolens[optional]from live PyPI today also silently walks the family back.Control test — floors fix it
Same command, same python3.13, floors added:
Without the floors the identical command lands on autofit 2026.4.30.582 and
raises.
Task
>=2026.7.29.2floors to every intra-family dependency — basedependenciesand the[jax]/[optional]extras — inPyAutoNerves, PyAutoArray, PyAutoFit, PyAutoGalaxy, PyAutoLens, and
PyAutoCTI (
autofit,autoarrayare bare there too).This is a floor, not an exact pin — consistent with the floors-not-pins
release design (PyAutoBuild#118/Feature/phase #120). A floor must name an installable
version, so
2026.7.29.2(live on PyPI, not yanked) is the right value.detail(
PyAutoHeart/heart/checks/verify_install.sh,check_d). "Defaultpython3" silently differing between CI (3.13) and local (3.12) is what hidthis; the evidence should name the interpreter the way Check B's details do.
Acceptance
pip install "autolens[optional]"on python3.12 and python3.13 resolvesthe whole PyAuto family at the newest available release, and
import autolenssucceeds.
verify_installleg does not clear until a release rehearsal republishes toTestPyPI and Check D re-runs against those wheels.