- issue: (no issue — a human-authorized manual release drive, not a dev task)
- session: claude --resume e0105850-b98b-47ff-9ada-cba04a455a65
- status: SHIPPED 2026-08-07 — superseded by release-drive-2026-08-07 below, which carried this drive's payload to PyPI as 2026.8.7.1. This entry is now history; do NOT re-run it. (Was: Stage 2/3 CLEAR TO RE-RUN on request, 2026-08-04.)
- split-from: simulator-util-to-af-ex (#1444), closed out 2026-08-04 → complete/2026/08/simulator-util-to-af-ex.md. That task shipped; this release drive it opened did not, so it was split out rather than buried in a completion record.
- why a release is owed: workspace main now calls
af.ex.utilhelpers that exist on PyAutoFit main but NOT on PyPI. Control test PROVED the breakage — AttributeError on the first simulator call against released autofit 2026.7.29.2 in a clean venv with PYTHONPATH unset — and HowToFit ships NO datasets (dataset/gitignored, 0 tracked files), so a new user gets no data at all. Thepending-releasegate was overridden 2026-08-03 on explicit human instruction ("all five once green") with that consequence stated, which makes publishing the remedy, not a preference. - release-drive: human authorized driving a release 2026-08-03 (chose "Drive the release" over merging early or re-cutting workspace-only). Drive via
pyauto-brain release validate— NOT the nightly driver; AUTONOMY.md forbids converting a manual release into the scheduled-nightly exception. - release-progress: Stage 0/1 preflight PASS. Stage 2 rehearsal #1 (run 30841336540, dev69901) DISCARDED — PyAutoLens#686 merged 18:31:35Z DURING that build while the PyAutoLens job checked out at 18:27:31Z, so those wheels lacked #686; writing the post-build live-main sha would have attested to source the wheels never contained. Stage 2 rehearsal #2 = run 30841883371 SUCCESS → testpypi 2026.8.3.1.dev70001, verified every library main HEAD commit-time PREDATES its job checkout before writing commit_shas.json. Artifacts dir
~/.pyauto-heart/manual_validation_20260803_pm(rehearsal.json + testpypi_version.txt + commit_shas.json). - commit-shas (from rehearsal #2): PyAutoNerves e82c17fd / PyAutoFit 26033fb4 / PyAutoArray 54ba44e8 / PyAutoGalaxy 4249384b / PyAutoLens 4927738e. SUPERSEDED — do not use. The shipped SHAs are recorded under release-drive-2026-08-07 below; these were already stale on 2026-08-04 and the 2026-08-07 drive re-derived them from a fresh rehearsal.
- release-outcome (Stage 3 run 30842349506, COMPLETE): 30 jobs, exactly 2 failures, both diagnosed and both now FIXED AND MERGED. (1) autolens/point_source — #453 updated only ONE of the two model blocks in scripts/point_source/start_here.py, leaving prose saying PointSolved and code saying Point; with PyAutoLens#686 making solved all-to-all the default that raises PointProfileMismatchException. Regression proven: the same script passed 40.4s in run 30788224561 and failed 4.5s here. Fixed by autolens_workspace#461, MERGED 2026-08-03T21:41:40Z. (2) verify_install check D (
pip rc=0 import rc=1) — fixed by PyAutoHeart#134 (--preon the TestPyPI path), squash-MERGED 2026-08-04 as 46a331a, both pytest legs green on head fb0eff4b, one fileheart/checks/verify_install.sh+24/-1. - release-resume: re-rehearse (new wheels, so check D resolves the candidate family with
--pre), re-dispatch integrate, thengh run download <run> -R PyAutoLabs/PyAutoHeart -n release-stage-report -D <artifacts-dir>andpyauto-brain release validate --ingest <artifacts-dir> --commit-shas <artifacts-dir>/commit_shas.json. Never--forcea RED/YELLOW without a fresh human ack. On GREEN the PUBLISH step is a SEPARATE human decision. - release-scope-flag: RESOLVED 2026-08-04 — this release also carries PyAutoLens#686 (point-source defaults, 4927738e), which was not one of the fixes the drive set out to ship. Human answer: ship it. Verified before accepting: #686's exp-3 merge gate had landed two days before the merge, Tests+Docs green on 4927738e, it carries the
## API Changesheading the breaking-change release notes require, and a workspace sweep found all 8al.AnalysisPointcall sites relying on the new all-solved default composeal.ps.PointSolved— the only mismatch (point_source/start_here.py) was autolens_workspace#461, merged. - do-not: do NOT pick up
ep.pyor anyep*script as a release blocker — human decision 2026-08-03 to park them for a while (PyAutoFit #1332 F10 tracks the underlying EP message-projection instability). They are parked NEEDS_FIX in autofit_workspace_test config/build/no_run.yaml via #82, whichrun.pyloads unconditionally and profile-independently, so the parking holds for the RELEASE profile too. - dep-floor-regression: CLEARED 2026-08-03 21:30Z — complete/2026/08/dep-floors-source-chain-ci.md (PyAutoNerves#146). Root cause was the
1.0.dev0source stamp, not the floors; the floors stand unchanged. All five previously-blocked workspace PRs re-ran green and merged. - correctives-worktree: REMOVED 2026-08-04 — both correctives merged,
~/Code/PyAutoLabs-wt/release-validate-correctivesgone (worktrees + local/remotefeature/release-validate-correctivesbranches deleted in autolens_workspace and PyAutoHeart,worktree prunerun in both; the dir held only tracked files, no output/ artifacts). - heart-context (2026-08-04): verdict YELLOW, score 70,
red_reasons: []. Reasons = workspace validation not passing / tenant-firewall manifest drift (2 mismatches vs repos.yaml) / release validation stale (source moved since rehearsal — expected, see commit-shas above). The workspace-validation reason has shrunk since the snapshot: autofit_workspace_test#84 fixed the jax_assertions entry it names. - repos-none-claimed: this entry claims NO repos — deliberately listed on one line, NOT as
- Repobullets, becauseworktree_check_conflicttreats any 2-space- <Repo>bullet as a live claim regardless of which field it sits under.
- issue: (no issue — a human-authorized manual release drive, not a dev task)
- status: SHIPPED 2026-08-07. All five libraries published to PyPI at 2026.8.7.1. Verified independently against pypi.org (not just the run conclusion): each package reports
latest = 2026.8.7.1, andautolens-2026.8.7.1-py3-none-any.whl+autogalaxy-2026.8.7.1-py3-none-any.whlwere downloaded from the live index as proof of installability. - supersedes: release-drive-2026-08-03 (above). That drive's payload shipped here; its recorded commit_shas were stale and are NOT the shipped set.
- commit-shas (SHIPPED, verified still at origin/main immediately before ingest): PyAutoNerves 5a67f181 / PyAutoFit f02ea7ed / PyAutoArray 828d5c13 / PyAutoGalaxy 63d69b87 / PyAutoLens e4c7ba70.
- discharges: the mge-sigma-min-workspace-sweep RELEASE DEBT (see above) —
sigma_minconfirmed present in the released autogalaxy wheel. - root-cause of the stalled nightly (2026-08-06): the GitHub Actions outage dropped push triggers, so several merges to main had NO Tests run and two runs failed on runner provisioning. Not a code fault. Remedy:
workflow_dispatchadded to PyAutoGalaxy + PyAutoLens.github/workflows/main.yml(PRs #560 / #693, both merged) so a main-HEAD run can be re-requested on demand without an empty commit. - validation: Stage 0/1 preflight PASS. Stage 2 rehearsal run 31192317261 (PyAutoHands release.yml, rehearsal:true) → testpypi 2026.8.7.1.dev70601. Stage 3 integrate run 31193443960 (PyAutoHeart release-integrate.yml) → 51/51 jobs green,
status: pass, 657p/0f/101s/0t, verify_install checks A–F all PASS. Artifacts~/.pyauto-heart/manual_validation_20260807. - MGE-regression NOT reproduced: the 2026-08-06 integrate failed on
scripts/interferometer/features/multi_gaussian_expansion/likelihood_function.py(numpy LinAlgError: Singular matrix). It passed here — and the script genuinely RAN rather than being silently dropped, proven by the count moving 324p+1f → 325p+0f with the total unchanged. - ingest-trap (cost one cycle): the first readiness tick after a clean ingest came back RED with
stale_reasons: []and onlyPyAutoGalaxy/PyAutoLens: 4 commit(s) behind origin. That is a LOCAL-clone signal, not a validation failure — the merged workflow_dispatch PRs had never been pulled. Fast-forwarding both local mains to the validated SHAs re-ticked GREEN score 100. Do not--forcepast this; sync the clone. - pre_build-trap (caught before it fired):
pre_buildrunsblack scripts/thengit add scripts/, andgit addon a directory stages UNTRACKED files too — an uncommitted WIP script inautolens_assistant/scripts/would have been reformatted and pushed public inside the "pre build" commit. This is the same leak class the script's own comments describe fixing fordataset//config/(#126); thescripts/path still has the hole. Mitigation used: move the file out of the repo before the run, restore after (verified byte-identical by md5). Worth a real fix so it is not left to operator vigilance. FIXED 2026-08-08 on branchclaude/automind-task-planning-163wk7(PyAutoHands) — promptdraft/bug/pyautohands/pre_build_stages_untracked_wip.md. The hazard was first REPRODUCED against the pre-fix script on throwaway fixture repos (private file committed as "pre build" and pushed to the remote, exit 0, silently), then closed by two legs: a fail-fast preflight sweeping all 13 repos for untracked files undernotebooks//scripts//slam_pipeline/before the first is touched (it must precede everything — run_workspace pushes each repo before moving to the next), and staging narrowed togit add -uplus explicit adds of run-created files, so the directory-wide form cannot return. Covered bytests/test_pre_build_staging.py, which runs the real script against fixture git repos with real bare remotes. No--allow-dirtyoverride by design. Also answers the open atomicity question in PyAutoHandsdocs/pre_build_failure_audit.md§6. SHIPPED 2026-08-08: PyAutoHands#232 (issue, closed completed) → PyAutoHands#233 MERGED as a5bac76b, all three pytest legs green (3.12/3.13/3.14, 309 passed / 4 skipped — the count reconciles with local, confirming the new fixture tests actually ran rather than being collected-but-skipped). Mind bookkeeping PyAutoMind#152 MERGED as 62869a2e. - release-run: 31200419263 (PyAutoHands release.yml, rehearsal:false → live). All five
release (...)publish jobs SUCCESS; tags pushed and PyPI agree, so the line-428 hazard (upload timing out AFTER tagging) did not occur. - post-publish failures (do NOT re-drive the release for these — the publish is complete and correct): (1)
wiki_currency_checkautolens — died onNo matching distribution found for autolens==2026.8.7.1~4 min after upload; a PyPI index-propagation race, proven bywiki_currency_check_autofitstarting 2s earlier and PASSING, and by the wheel downloading fine minutes later. RESOLVED 2026-08-07 — autolens_assistant is CLEAN on all five legs, so the race was the whole story and no autolens follow-up is owed. A CI job re-run was impossible (HTTP 403: The workflow run containing this job is already running), so it was graded locally by the documented method instead: a fresh venv withautolens==2026.8.7.1from PyPI,PYTHONPATHcleared, and all four libraries verified to resolve to venv site-packages rather than this workspace's source checkouts (thebaseline-repin-TRAP— grading against source installs would have been meaningless). Results:--check-versionclean (baseline matches autolens 2026.8.7.1),--scope all68 files / 143 symbols / 0 missing-broken,--lint-idiomsclean (214 files),--check-citations105 files / 413 citations / 0 missing, 0 warnings,--check-provenance0 errors (49 pages). Contrast autogalaxy's 5 provenance errors — the two failures shared a red badge but not a cause. (2)wiki_drift_issue— pure fallout,Artifact not found: wiki-drift-report, because (1) died before writing it. (3)wiki_currency_check_autogalaxy— REAL drift, see the provenance prompt filed under draft/maintenance/autogalaxy_assistant/. - artifacts-are-laptop-only: Actions artifact downloads are blocked from cloud/mobile sessions (egress policy 403s
productionresultssa2.blob.core.windows.neton CONNECT) — this is what stopped the cloud session finishing the ingest. Both wiki drift reports were captured to~/.pyauto-heart/release_20260807_wiki_drift/while on the laptop. - do-not: do NOT use the nightly driver for a manual release — AUTONOMY.md forbids converting a manual release into the scheduled-nightly exception.
- repos-none-claimed: this entry claims NO repos — deliberately on one line, NOT as 2-space
- Repobullets, becauseworktree_check_conflicttreats any such bullet as a live claim.