From a76314a48cfbdef170f4765efe37b0c621c9bf19 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 23 Aug 2026 14:27:32 +0000 Subject: [PATCH 1/4] =?UTF-8?q?prompt:=20route=20point-source-dataset-cap-?= =?UTF-8?q?guard=20(#710)=20=E2=86=92=20start=5Flibrary?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Advances the point.py JAX-vmap parity prompt draft/ → active/ and registers it in active.md as library-dev against PyAutoLens#710. The diagnosis is settled in-session rather than deferred: under PYAUTO_SMALL_DATASETS=1, should_simulate() rmtree's the committed JSON point-source dataset and PointSolver.solve returns a fixed, model-independent position pair in silence. point.py itself passes on current main under the correct profile, so the reported non-determinism was poisoned-on-disk data, not a library bug. Remaining scope is hardening. Also marks the planned.md jax-point-source-point-smoke-sentinel entry superseded by the same finding. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01JJSb9kydhAgMgCCKh26ai2 --- active.md | 26 +++++ active/point_source_dataset_cap_guard.md | 96 +++++++++++++++++++ .../point_jax_vmap_parity_nondeterministic.md | 54 ----------- planned.md | 3 + 4 files changed, 125 insertions(+), 54 deletions(-) create mode 100644 active/point_source_dataset_cap_guard.md delete mode 100644 draft/bug/autolens/point_jax_vmap_parity_nondeterministic.md diff --git a/active.md b/active.md index fb25a165..ddf59927 100644 --- a/active.md +++ b/active.md @@ -13,3 +13,29 @@ - registered: 2026-08-19 by the wake_up session — the issuing session (claude/autofit-priors-messages-audit-ylvenv) filed the prompt + issue but not this entry, tripping Lifecycle Drift on main. - repos-none-claimed: this entry claims NO repos — one line deliberately, not 2-space bullets. + +## point-source-dataset-cap-guard +- issue: https://github.com/PyAutoLabs/PyAutoLens/issues/710 (issued 2026-08-23) +- prompt: active/point_source_dataset_cap_guard.md +- status: library-dev +- worktree: ~/Code/PyAutoLabs-wt/point-source-dataset-cap-guard +- branch: feature/point-source-dataset-cap-guard (both repos) +- session: cloud (claude.ai/code) — no local worktree; repos cloned into the session +- classification: both (PyAutoLens primary, autolens_workspace_test follows) +- DIAGNOSIS SETTLED 2026-08-23, in-session, against libraries 2026.8.23.1 + PyAutoLens main: + - `should_simulate('dataset/point_source/simple')` returns True and rmtree's the committed + JSON dataset under `PYAUTO_SMALL_DATASETS=1`; returns False and leaves it intact with the + cap unset. Direct A/B, not a run tally. + - `PointSolver.solve` returns `[(1.0, 0.0), (0.0, 1.0)]` for every lens model under the cap + (verified at einstein_radius 1.0/1.6/2.5) and is silent at DEBUG level. + - `scripts/point_source/jax_likelihood/point.py` PASSES on current main under the correct + profile: `-83.38049778` (pin exact) and `-82.33883111` (all-solved). The original report is + explained; no library numerical bug exists. +- remaining scope is hardening only, NOT a bug hunt: + 1. `modeling_visualization_jit.py` declares `ENV: real_output`, which does not release the cap + (missed by the autolens_workspace_test#264 sweep). + 2. The five point_source parity scripts have no pre-should_simulate cap guard. + 3. `PointSolver.solve`'s short-circuit warns nobody. +- repos: + - PyAutoLens + - autolens_workspace_test diff --git a/active/point_source_dataset_cap_guard.md b/active/point_source_dataset_cap_guard.md new file mode 100644 index 00000000..d0fe8ef1 --- /dev/null +++ b/active/point_source_dataset_cap_guard.md @@ -0,0 +1,96 @@ +# point.py JAX-vmap parity assert is non-deterministic under the smoke env + +Type: bug +Target: autolens +Repos: +- autolens_workspace_test +- PyAutoLens +Difficulty: small +Autonomy: supervised +Priority: normal +Status: issued — PyAutoLens#710 (2026-08-23) +Filed: 2026-07-22 (backfilled from git) + +## 2026-08-23 — DIAGNOSED. Root cause found; scope changed. Read this before the body below. + +The body below is the original intake prompt, kept verbatim. Two of its claims are now known +to be wrong, and its leading hypothesis is confirmed. Tracked as +[PyAutoLens#710](https://github.com/PyAutoLabs/PyAutoLens/issues/710). + +**The mechanism is on-disk dataset poisoning, not a numerical bug.** `dataset/point_source/simple/` +is committed, gitignore-allowlisted and JSON-only. Under `PYAUTO_SMALL_DATASETS=1`, +`al.util.dataset.should_simulate()` returns `True` and `rmtree`s it, re-simulating under the cap. +With no `data.fits` there is no `SMALLDAT` stamp for PyAutoArray#471's guard to read, so the +delete fires and the degenerate replacement survives into the next full-regime run. Locally, one +run poisons the next — which is the reported parallel-vs-serial value difference. + +Verified directly (2026-08-23, cloud session, libraries at 2026.8.23.1 + PyAutoLens main): + +| call | result | directory after | +|---|---|---| +| `should_simulate('dataset/point_source/simple')`, `PYAUTO_SMALL_DATASETS=1` | `True` | **deleted** | +| same call, cap unset | `False` | intact | + +**The prompt's leading hypothesis was right.** `PointSolver.solve` short-circuits under the cap +and returns `[(1.0, 0.0), (0.0, 1.0)]` for *every* lens model — verified identical at +`einstein_radius` 1.0 / 1.6 / 2.5 — and does so with no warning at DEBUG level. The parity assert +is structurally meaningless in that regime. + +**Two corrections to the body below.** + +1. **The paths are stale.** The script is now `scripts/point_source/jax_likelihood/point.py`; + the solver short-circuit is at `point_solver.py:119`, not `:111`. There is no + `config/build/env_vars.yaml` — the profiles are `config/build/profile_smoke.yaml` and + `profile_release.yaml`. +2. **The repro command is invalid.** It hand-sets `PYAUTO_SMALL_DATASETS=1`, overriding the + `ENV: jax full_datasets` declaration the script carries at line 21. That invocation cannot + pass and never could. It is operator error in the repro, not evidence of a live bug. + +**Prior art.** autolens_workspace_test#264 (2026-08-22) root-caused this and fixed the one +at-risk site its sweep found. That sweep missed +`scripts/point_source/visualization/modeling_visualization_jit.py` (declares `ENV: real_output`, +which does not release the cap, while its own prose claims full-resolution data), and it left +the five parity scripts themselves unguarded. Those are this task's scope. + + +`autolens_workspace_test/scripts/jax_likelihood_functions/point_source/point.py` fails its +JAX-vs-numpy parity assert under the smoke env, and **fails differently between runs**: + +``` +AssertionError: point: JAX vmap likelihood mismatch + run A (parallel batch): ACTUAL [-1.e+99] DESIRED -83.380498 + run B/C/D (serial): ACTUAL [16.131221] DESIRED -83.380498 +``` + +`-1e+99` is the failed-fit sentinel; `16.131221` is a finite but wrong value. Same script, +same env, same commit — so the assert is not measuring what it intends to. + +Observed while smoke-gating PyAutoArray#398 (convolver-gaussian-small-datasets-cap, merged +2026-07-22). **Confirmed unrelated to that change**: A/B'd by checking out the pre-fix +`autoarray/operators/convolver.py` and re-running — identical failure and identical value. +The script also contains no `Convolver` / `from_gaussian` / PSF usage at all, so a +convolution change cannot reach it. It is one of the ~10 already-failing workspace scripts +Heart reported on 2026-07-20, i.e. it pre-dates that work. + +Lead worth checking first: `PointSolver` has its own `PYAUTO_SMALL_DATASETS` short-circuit +at `PyAutoLens/autolens/point/solver/point_solver.py:111` that skips the triangle-tiling +solve entirely under the smoke flag. If the parity assert runs against that short-circuited +solve, the comparison may be structurally meaningless in smoke mode — in which case the fix +is either to unset the flag for this script (`config/build/env_vars.yaml` override) or to +skip the assert when the short-circuit is active, rather than to chase a numerical bug. + +Second possibility to rule out: genuine non-determinism in the triangle solve (ordering / +tie-breaking) that the parity tolerance `rtol=1e-4` cannot absorb. + +Repro (from `autolens_workspace_test/`): + +``` +PYAUTO_TEST_MODE=2 PYAUTO_SMALL_DATASETS=1 PYAUTO_SKIP_FIT_OUTPUT=1 \ +PYAUTO_SKIP_VISUALIZATION=1 PYAUTO_SKIP_CHECKS=1 PYAUTO_FAST_PLOTS=1 JAX_ENABLE_X64=True \ +NUMBA_CACHE_DIR=/tmp/numba_cache MPLCONFIGDIR=/tmp/matplotlib \ +python scripts/jax_likelihood_functions/point_source/point.py +``` + +Run it several times, and once inside a parallel batch — the failure value changes. Per +`feedback_flaky_test_sample_size`, a few passing runs will not settle this; decide on the +mechanism, not on a run tally. diff --git a/draft/bug/autolens/point_jax_vmap_parity_nondeterministic.md b/draft/bug/autolens/point_jax_vmap_parity_nondeterministic.md deleted file mode 100644 index 7e1a5aea..00000000 --- a/draft/bug/autolens/point_jax_vmap_parity_nondeterministic.md +++ /dev/null @@ -1,54 +0,0 @@ -# point.py JAX-vmap parity assert is non-deterministic under the smoke env - -Type: bug -Target: autolens -Repos: -- autolens_workspace_test -- PyAutoLens -Difficulty: small -Autonomy: supervised -Priority: normal -Status: formalised -Filed: 2026-07-22 (backfilled from git) - -`autolens_workspace_test/scripts/jax_likelihood_functions/point_source/point.py` fails its -JAX-vs-numpy parity assert under the smoke env, and **fails differently between runs**: - -``` -AssertionError: point: JAX vmap likelihood mismatch - run A (parallel batch): ACTUAL [-1.e+99] DESIRED -83.380498 - run B/C/D (serial): ACTUAL [16.131221] DESIRED -83.380498 -``` - -`-1e+99` is the failed-fit sentinel; `16.131221` is a finite but wrong value. Same script, -same env, same commit — so the assert is not measuring what it intends to. - -Observed while smoke-gating PyAutoArray#398 (convolver-gaussian-small-datasets-cap, merged -2026-07-22). **Confirmed unrelated to that change**: A/B'd by checking out the pre-fix -`autoarray/operators/convolver.py` and re-running — identical failure and identical value. -The script also contains no `Convolver` / `from_gaussian` / PSF usage at all, so a -convolution change cannot reach it. It is one of the ~10 already-failing workspace scripts -Heart reported on 2026-07-20, i.e. it pre-dates that work. - -Lead worth checking first: `PointSolver` has its own `PYAUTO_SMALL_DATASETS` short-circuit -at `PyAutoLens/autolens/point/solver/point_solver.py:111` that skips the triangle-tiling -solve entirely under the smoke flag. If the parity assert runs against that short-circuited -solve, the comparison may be structurally meaningless in smoke mode — in which case the fix -is either to unset the flag for this script (`config/build/env_vars.yaml` override) or to -skip the assert when the short-circuit is active, rather than to chase a numerical bug. - -Second possibility to rule out: genuine non-determinism in the triangle solve (ordering / -tie-breaking) that the parity tolerance `rtol=1e-4` cannot absorb. - -Repro (from `autolens_workspace_test/`): - -``` -PYAUTO_TEST_MODE=2 PYAUTO_SMALL_DATASETS=1 PYAUTO_SKIP_FIT_OUTPUT=1 \ -PYAUTO_SKIP_VISUALIZATION=1 PYAUTO_SKIP_CHECKS=1 PYAUTO_FAST_PLOTS=1 JAX_ENABLE_X64=True \ -NUMBA_CACHE_DIR=/tmp/numba_cache MPLCONFIGDIR=/tmp/matplotlib \ -python scripts/jax_likelihood_functions/point_source/point.py -``` - -Run it several times, and once inside a parallel batch — the failure value changes. Per -`feedback_flaky_test_sample_size`, a few passing runs will not settle this; decide on the -mechanism, not on a run tally. diff --git a/planned.md b/planned.md index cc0de759..f8e96a6f 100644 --- a/planned.md +++ b/planned.md @@ -80,6 +80,9 @@ Sibling smoke scripts to check while triaging: image_plane.py, source_plane.py in the same dir — they share the seed dataset. +- SUPERSEDED 2026-08-23 by point-source-dataset-cap-guard (PyAutoLens#710): the -1e99 sentinel + was poisoned-dataset output, not a library regression. point.py passes on current main. Retire + this entry and its prompt when #710 ships. ## piemass-potential - prompt: draft/feature/autogalaxy/piemass_potential.md From 4a7cb7608ae8a249951353c23e61285581b7fb16 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 23 Aug 2026 14:34:28 +0000 Subject: [PATCH 2/4] prompt: release the parity bug from the PointSolver bisect epic point_solver_error_bisect_health.md claimed to absorb the point.py JAX-vmap parity prompt on the grounds of a shared investigation surface. That is no longer true: the parity failure was dataset poisoning under PYAUTO_SMALL_DATASETS, not triangle-solve accuracy, and it shipped separately as point-source-dataset-cap-guard (PyAutoLens#710) rather than waiting on a 12-phase epic. Also corrects the stale point_solver.py:111 line reference to :119. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01JJSb9kydhAgMgCCKh26ai2 --- .../bug/autolens/point_solver_error_bisect_health.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/draft/bug/autolens/point_solver_error_bisect_health.md b/draft/bug/autolens/point_solver_error_bisect_health.md index e9fbb22c..f2852dd6 100644 --- a/draft/bug/autolens/point_solver_error_bisect_health.md +++ b/draft/bug/autolens/point_solver_error_bisect_health.md @@ -69,9 +69,14 @@ Health-hardening follow-ons from the audit, same branch: died in PR #420). Add an isothermal-quad accuracy test with tight tolerances. - `autoarray/structures/triangles/array.py:132,199` hard-code `dtype=jnp.float32` NaN placeholders — wrong dtype if x64 not enabled; verify + fix. -- Absorb `draft/bug/autolens/point_jax_vmap_parity_nondeterministic.md` (the - PYAUTO_SMALL_DATASETS short-circuit at point_solver.py:111 making the parity assert - structurally meaningless in smoke mode) — same investigation surface. +- ~~Absorb `draft/bug/autolens/point_jax_vmap_parity_nondeterministic.md`~~ — NO LONGER + THIS TASK'S. Split out and shipped separately on 2026-08-23 as + `point-source-dataset-cap-guard` (PyAutoLens#710). The parity failure was not a + triangle-solve question at all: `should_simulate` deletes the committed JSON + point-source dataset under `PYAUTO_SMALL_DATASETS=1`, so the script read degenerate + data. `point.py` passes on current main. The short-circuit (now at + `point_solver.py:119`, not `:111`) was confirmed to return a fixed model-independent + pair and now emits a one-shot warning, so this epic no longer needs to carry it. Blocks: every later phase of the arc (profiling, cluster source science, point magnification) assumes a trusted PointSolver. From b761a601d38fab80a2078c88eeb4d20dada85812 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 23 Aug 2026 14:55:35 +0000 Subject: [PATCH 3/4] prompt: complete point-source-dataset-cap-guard (#710) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Both legs merged — PyAutoLens#711 (27126fb) then autolens_workspace_test#265 (051b051), library-first order held. The reported parity non-determinism was on-disk dataset poisoning, not a library numerical bug: should_simulate rmtree's the committed JSON point-source dataset under PYAUTO_SMALL_DATASETS=1, and PointSolver.solve short-circuits to a model-independent position pair. point.py passes on main with an intact dataset. Record carries the two traps worth remembering — the SMALLDAT stamp cannot reach JSON datasets, and real_output/real_plots do not release the cap — plus the two follow-ups: the other workspaces are still unaudited, and per-script discipline has now failed twice as the only protection. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01JJSb9kydhAgMgCCKh26ai2 --- active.md | 26 --- active/point_source_dataset_cap_guard.md | 96 --------- .../2026/08/point-source-dataset-cap-guard.md | 191 ++++++++++++++++++ 3 files changed, 191 insertions(+), 122 deletions(-) delete mode 100644 active/point_source_dataset_cap_guard.md create mode 100644 complete/2026/08/point-source-dataset-cap-guard.md diff --git a/active.md b/active.md index ddf59927..fb25a165 100644 --- a/active.md +++ b/active.md @@ -13,29 +13,3 @@ - registered: 2026-08-19 by the wake_up session — the issuing session (claude/autofit-priors-messages-audit-ylvenv) filed the prompt + issue but not this entry, tripping Lifecycle Drift on main. - repos-none-claimed: this entry claims NO repos — one line deliberately, not 2-space bullets. - -## point-source-dataset-cap-guard -- issue: https://github.com/PyAutoLabs/PyAutoLens/issues/710 (issued 2026-08-23) -- prompt: active/point_source_dataset_cap_guard.md -- status: library-dev -- worktree: ~/Code/PyAutoLabs-wt/point-source-dataset-cap-guard -- branch: feature/point-source-dataset-cap-guard (both repos) -- session: cloud (claude.ai/code) — no local worktree; repos cloned into the session -- classification: both (PyAutoLens primary, autolens_workspace_test follows) -- DIAGNOSIS SETTLED 2026-08-23, in-session, against libraries 2026.8.23.1 + PyAutoLens main: - - `should_simulate('dataset/point_source/simple')` returns True and rmtree's the committed - JSON dataset under `PYAUTO_SMALL_DATASETS=1`; returns False and leaves it intact with the - cap unset. Direct A/B, not a run tally. - - `PointSolver.solve` returns `[(1.0, 0.0), (0.0, 1.0)]` for every lens model under the cap - (verified at einstein_radius 1.0/1.6/2.5) and is silent at DEBUG level. - - `scripts/point_source/jax_likelihood/point.py` PASSES on current main under the correct - profile: `-83.38049778` (pin exact) and `-82.33883111` (all-solved). The original report is - explained; no library numerical bug exists. -- remaining scope is hardening only, NOT a bug hunt: - 1. `modeling_visualization_jit.py` declares `ENV: real_output`, which does not release the cap - (missed by the autolens_workspace_test#264 sweep). - 2. The five point_source parity scripts have no pre-should_simulate cap guard. - 3. `PointSolver.solve`'s short-circuit warns nobody. -- repos: - - PyAutoLens - - autolens_workspace_test diff --git a/active/point_source_dataset_cap_guard.md b/active/point_source_dataset_cap_guard.md deleted file mode 100644 index d0fe8ef1..00000000 --- a/active/point_source_dataset_cap_guard.md +++ /dev/null @@ -1,96 +0,0 @@ -# point.py JAX-vmap parity assert is non-deterministic under the smoke env - -Type: bug -Target: autolens -Repos: -- autolens_workspace_test -- PyAutoLens -Difficulty: small -Autonomy: supervised -Priority: normal -Status: issued — PyAutoLens#710 (2026-08-23) -Filed: 2026-07-22 (backfilled from git) - -## 2026-08-23 — DIAGNOSED. Root cause found; scope changed. Read this before the body below. - -The body below is the original intake prompt, kept verbatim. Two of its claims are now known -to be wrong, and its leading hypothesis is confirmed. Tracked as -[PyAutoLens#710](https://github.com/PyAutoLabs/PyAutoLens/issues/710). - -**The mechanism is on-disk dataset poisoning, not a numerical bug.** `dataset/point_source/simple/` -is committed, gitignore-allowlisted and JSON-only. Under `PYAUTO_SMALL_DATASETS=1`, -`al.util.dataset.should_simulate()` returns `True` and `rmtree`s it, re-simulating under the cap. -With no `data.fits` there is no `SMALLDAT` stamp for PyAutoArray#471's guard to read, so the -delete fires and the degenerate replacement survives into the next full-regime run. Locally, one -run poisons the next — which is the reported parallel-vs-serial value difference. - -Verified directly (2026-08-23, cloud session, libraries at 2026.8.23.1 + PyAutoLens main): - -| call | result | directory after | -|---|---|---| -| `should_simulate('dataset/point_source/simple')`, `PYAUTO_SMALL_DATASETS=1` | `True` | **deleted** | -| same call, cap unset | `False` | intact | - -**The prompt's leading hypothesis was right.** `PointSolver.solve` short-circuits under the cap -and returns `[(1.0, 0.0), (0.0, 1.0)]` for *every* lens model — verified identical at -`einstein_radius` 1.0 / 1.6 / 2.5 — and does so with no warning at DEBUG level. The parity assert -is structurally meaningless in that regime. - -**Two corrections to the body below.** - -1. **The paths are stale.** The script is now `scripts/point_source/jax_likelihood/point.py`; - the solver short-circuit is at `point_solver.py:119`, not `:111`. There is no - `config/build/env_vars.yaml` — the profiles are `config/build/profile_smoke.yaml` and - `profile_release.yaml`. -2. **The repro command is invalid.** It hand-sets `PYAUTO_SMALL_DATASETS=1`, overriding the - `ENV: jax full_datasets` declaration the script carries at line 21. That invocation cannot - pass and never could. It is operator error in the repro, not evidence of a live bug. - -**Prior art.** autolens_workspace_test#264 (2026-08-22) root-caused this and fixed the one -at-risk site its sweep found. That sweep missed -`scripts/point_source/visualization/modeling_visualization_jit.py` (declares `ENV: real_output`, -which does not release the cap, while its own prose claims full-resolution data), and it left -the five parity scripts themselves unguarded. Those are this task's scope. - - -`autolens_workspace_test/scripts/jax_likelihood_functions/point_source/point.py` fails its -JAX-vs-numpy parity assert under the smoke env, and **fails differently between runs**: - -``` -AssertionError: point: JAX vmap likelihood mismatch - run A (parallel batch): ACTUAL [-1.e+99] DESIRED -83.380498 - run B/C/D (serial): ACTUAL [16.131221] DESIRED -83.380498 -``` - -`-1e+99` is the failed-fit sentinel; `16.131221` is a finite but wrong value. Same script, -same env, same commit — so the assert is not measuring what it intends to. - -Observed while smoke-gating PyAutoArray#398 (convolver-gaussian-small-datasets-cap, merged -2026-07-22). **Confirmed unrelated to that change**: A/B'd by checking out the pre-fix -`autoarray/operators/convolver.py` and re-running — identical failure and identical value. -The script also contains no `Convolver` / `from_gaussian` / PSF usage at all, so a -convolution change cannot reach it. It is one of the ~10 already-failing workspace scripts -Heart reported on 2026-07-20, i.e. it pre-dates that work. - -Lead worth checking first: `PointSolver` has its own `PYAUTO_SMALL_DATASETS` short-circuit -at `PyAutoLens/autolens/point/solver/point_solver.py:111` that skips the triangle-tiling -solve entirely under the smoke flag. If the parity assert runs against that short-circuited -solve, the comparison may be structurally meaningless in smoke mode — in which case the fix -is either to unset the flag for this script (`config/build/env_vars.yaml` override) or to -skip the assert when the short-circuit is active, rather than to chase a numerical bug. - -Second possibility to rule out: genuine non-determinism in the triangle solve (ordering / -tie-breaking) that the parity tolerance `rtol=1e-4` cannot absorb. - -Repro (from `autolens_workspace_test/`): - -``` -PYAUTO_TEST_MODE=2 PYAUTO_SMALL_DATASETS=1 PYAUTO_SKIP_FIT_OUTPUT=1 \ -PYAUTO_SKIP_VISUALIZATION=1 PYAUTO_SKIP_CHECKS=1 PYAUTO_FAST_PLOTS=1 JAX_ENABLE_X64=True \ -NUMBA_CACHE_DIR=/tmp/numba_cache MPLCONFIGDIR=/tmp/matplotlib \ -python scripts/jax_likelihood_functions/point_source/point.py -``` - -Run it several times, and once inside a parallel batch — the failure value changes. Per -`feedback_flaky_test_sample_size`, a few passing runs will not settle this; decide on the -mechanism, not on a run tally. diff --git a/complete/2026/08/point-source-dataset-cap-guard.md b/complete/2026/08/point-source-dataset-cap-guard.md new file mode 100644 index 00000000..7ddcea96 --- /dev/null +++ b/complete/2026/08/point-source-dataset-cap-guard.md @@ -0,0 +1,191 @@ +# point-source-dataset-cap-guard + +Shipped 2026-08-23. Issue [PyAutoLens#710](https://github.com/PyAutoLabs/PyAutoLens/issues/710). + +## PRs + +- [PyAutoLens#711](https://github.com/PyAutoLabs/PyAutoLens/pull/711) — merged `27126fb` +- [autolens_workspace_test#265](https://github.com/PyAutoLabs/autolens_workspace_test/pull/265) — merged `051b051` + +Library-first order held: #711 merged before #265. + +## Summary + +The intake prompt reported `point.py`'s JAX-vmap parity assert failing with a +*different* value on every run (`-1e99` sentinel in a parallel batch, a finite-but-wrong +`16.131221` serially) and asked whether the triangle solve was non-deterministic. + +It is not. There is **no library numerical bug**. The mechanism is on-disk dataset +poisoning: `dataset/point_source/simple` is committed, gitignore-allowlisted and +JSON-only, and `should_simulate()` `rmtree`s it whenever `PYAUTO_SMALL_DATASETS=1` +is in force. With no `data.fits` there is no `SMALLDAT` stamp for PyAutoArray#471's +guard to read, so the delete fires and the degenerate replacement survives into the +next full-regime run — one run poisons the next, which is precisely the +parallel-vs-serial value difference. + +The prompt's own leading hypothesis was right: under the cap `PointSolver.solve` +short-circuits to a fixed pair unrelated to the lens model, so the parity assert is +structurally meaningless in that regime. + +`autolens_workspace_test#264` (2026-08-22) had root-caused this a day earlier and +fixed the one site its sweep found. This task closed the two gaps that remained. + +## Key findings / traps + +- **`should_simulate` is destructive, and the library guard cannot see JSON datasets.** + PyAutoArray#471's `_is_capped_at_the_current_cap` keys off a `SMALLDAT` header card in + `/data.fits`. A JSON-only dataset has no such file, so the guard returns + False and the delete proceeds. Any committed JSON dataset is structurally unprotected + by it — the workspace-side `ENV: full_datasets` declaration is the only defence. +- **`real_output` and `real_plots` do NOT release the dataset cap.** Only + `full_datasets` does. Two scripts have now been caught claiming full-resolution data + in prose while declaring a marker that leaves the cap in force (`visualization.py` in + #264, `modeling_visualization_jit.py` here). When auditing, read the `ENV:` line, never + the `__Env__` prose. +- **#264's "only at-risk site in the organism" sweep was wrong** — it missed a site in + its own repo. The corrected sweep (every `!dataset/**` allowlist entry vs every + `should_simulate` call site lacking `full_datasets`) now reports clean for + autolens_workspace_test. **The other workspaces remain unaudited** — worth a task. +- **A guard on geometry does not generalise.** `interferometer/nufft.py` asserts its mask + shape, which works only because it owns a FITS dataset with detectable capped geometry. + For JSON data the guard must read the env var directly. +- **The prompt's repro command was invalid** and could never have passed: it hand-set + `PYAUTO_SMALL_DATASETS=1`, overriding the script's own `ENV: jax full_datasets` + declaration. A failing repro is not automatically evidence of a bug — check whether the + invocation contradicts the script's declared environment first. + +## Verification + +Done in-session (cloud), against libraries 2026.8.23.1 + PyAutoLens main. The prior +prompt asserted a cloud session could not settle this; installing the stack made it +possible, and the mechanism was decided by direct A/B rather than a run tally. + +| Check | Result | +|---|---| +| `should_simulate('dataset/point_source/simple')`, cap on | `True`, directory deleted | +| same, cap off | `False`, intact | +| `PointSolver.solve` at einstein_radius 1.0 / 1.6 / 2.5 under cap | identical `[(1.0,0.0),(0.0,1.0)]`, silent at DEBUG | +| `point.py` on main, correct profile | PASS — `-83.38049778`, `-82.33883111`, pins exact | +| `point.py` with the cap set, post-fix | fails on the guard, dataset untouched | +| `test_autolens/` | 541 passed | +| CI | PyAutoLens 4/4 green (incl. `unittest-nojax`); workspace 3/3 smoke green | + +The workspace smoke run also confirmed what could not be checked locally: the harness +accepts the previously-unused `full_datasets real_output` marker combination. + +## Registry reconciliation + +Three prompts described this one surface; folded to one line of truth. + +- `planned.md` → `jax-point-source-point-smoke-sentinel` marked superseded. Its `-1e99` + symptom was the same poisoning; `point.py` passes on main. Retire the entry and its + prompt `draft/bug/autolens/jax_point_source_point_smoke_sentinel.md`. +- `draft/bug/autolens/point_solver_error_bisect_health.md` no longer absorbs this task — + the "same investigation surface" premise was false (workspace env-declaration defect, + not triangle-solve accuracy). Its stale `point_solver.py:111` reference corrected to `:119`. + +## Follow-ups worth filing + +1. Audit the remaining workspaces' `!dataset/**` allowlists against their `should_simulate` + call sites — #264's organism-wide claim is still unverified. +2. Consider a `SMALLDAT`-equivalent stamp for JSON datasets, or make `should_simulate` + refuse to delete a git-tracked path outright. The current protection is per-script + discipline, and it has now failed twice. + +## Original prompt + +# point.py JAX-vmap parity assert is non-deterministic under the smoke env + +Type: bug +Target: autolens +Repos: +- autolens_workspace_test +- PyAutoLens +Difficulty: small +Autonomy: supervised +Priority: normal +Status: issued — PyAutoLens#710 (2026-08-23) + +## 2026-08-23 — DIAGNOSED. Root cause found; scope changed. Read this before the body below. + +The body below is the original intake prompt, kept verbatim. Two of its claims are now known +to be wrong, and its leading hypothesis is confirmed. Tracked as +[PyAutoLens#710](https://github.com/PyAutoLabs/PyAutoLens/issues/710). + +**The mechanism is on-disk dataset poisoning, not a numerical bug.** `dataset/point_source/simple/` +is committed, gitignore-allowlisted and JSON-only. Under `PYAUTO_SMALL_DATASETS=1`, +`al.util.dataset.should_simulate()` returns `True` and `rmtree`s it, re-simulating under the cap. +With no `data.fits` there is no `SMALLDAT` stamp for PyAutoArray#471's guard to read, so the +delete fires and the degenerate replacement survives into the next full-regime run. Locally, one +run poisons the next — which is the reported parallel-vs-serial value difference. + +Verified directly (2026-08-23, cloud session, libraries at 2026.8.23.1 + PyAutoLens main): + +| call | result | directory after | +|---|---|---| +| `should_simulate('dataset/point_source/simple')`, `PYAUTO_SMALL_DATASETS=1` | `True` | **deleted** | +| same call, cap unset | `False` | intact | + +**The prompt's leading hypothesis was right.** `PointSolver.solve` short-circuits under the cap +and returns `[(1.0, 0.0), (0.0, 1.0)]` for *every* lens model — verified identical at +`einstein_radius` 1.0 / 1.6 / 2.5 — and does so with no warning at DEBUG level. The parity assert +is structurally meaningless in that regime. + +**Two corrections to the body below.** + +1. **The paths are stale.** The script is now `scripts/point_source/jax_likelihood/point.py`; + the solver short-circuit is at `point_solver.py:119`, not `:111`. There is no + `config/build/env_vars.yaml` — the profiles are `config/build/profile_smoke.yaml` and + `profile_release.yaml`. +2. **The repro command is invalid.** It hand-sets `PYAUTO_SMALL_DATASETS=1`, overriding the + `ENV: jax full_datasets` declaration the script carries at line 21. That invocation cannot + pass and never could. It is operator error in the repro, not evidence of a live bug. + +**Prior art.** autolens_workspace_test#264 (2026-08-22) root-caused this and fixed the one +at-risk site its sweep found. That sweep missed +`scripts/point_source/visualization/modeling_visualization_jit.py` (declares `ENV: real_output`, +which does not release the cap, while its own prose claims full-resolution data), and it left +the five parity scripts themselves unguarded. Those are this task's scope. + + +`autolens_workspace_test/scripts/jax_likelihood_functions/point_source/point.py` fails its +JAX-vs-numpy parity assert under the smoke env, and **fails differently between runs**: + +``` +AssertionError: point: JAX vmap likelihood mismatch + run A (parallel batch): ACTUAL [-1.e+99] DESIRED -83.380498 + run B/C/D (serial): ACTUAL [16.131221] DESIRED -83.380498 +``` + +`-1e+99` is the failed-fit sentinel; `16.131221` is a finite but wrong value. Same script, +same env, same commit — so the assert is not measuring what it intends to. + +Observed while smoke-gating PyAutoArray#398 (convolver-gaussian-small-datasets-cap, merged +2026-07-22). **Confirmed unrelated to that change**: A/B'd by checking out the pre-fix +`autoarray/operators/convolver.py` and re-running — identical failure and identical value. +The script also contains no `Convolver` / `from_gaussian` / PSF usage at all, so a +convolution change cannot reach it. It is one of the ~10 already-failing workspace scripts +Heart reported on 2026-07-20, i.e. it pre-dates that work. + +Lead worth checking first: `PointSolver` has its own `PYAUTO_SMALL_DATASETS` short-circuit +at `PyAutoLens/autolens/point/solver/point_solver.py:111` that skips the triangle-tiling +solve entirely under the smoke flag. If the parity assert runs against that short-circuited +solve, the comparison may be structurally meaningless in smoke mode — in which case the fix +is either to unset the flag for this script (`config/build/env_vars.yaml` override) or to +skip the assert when the short-circuit is active, rather than to chase a numerical bug. + +Second possibility to rule out: genuine non-determinism in the triangle solve (ordering / +tie-breaking) that the parity tolerance `rtol=1e-4` cannot absorb. + +Repro (from `autolens_workspace_test/`): + +``` +PYAUTO_TEST_MODE=2 PYAUTO_SMALL_DATASETS=1 PYAUTO_SKIP_FIT_OUTPUT=1 \ +PYAUTO_SKIP_VISUALIZATION=1 PYAUTO_SKIP_CHECKS=1 PYAUTO_FAST_PLOTS=1 JAX_ENABLE_X64=True \ +NUMBA_CACHE_DIR=/tmp/numba_cache MPLCONFIGDIR=/tmp/matplotlib \ +python scripts/jax_likelihood_functions/point_source/point.py +``` + +Run it several times, and once inside a parallel batch — the failure value changes. Per +`feedback_flaky_test_sample_size`, a few passing runs will not settle this; decide on the +mechanism, not on a run tally. From 40ea0e11bb03017eba828e2d4a1ea60cfbfa2b01 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 24 Aug 2026 19:34:44 +0000 Subject: [PATCH 4/4] prompt: retire the superseded point-source smoke sentinel MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Completes the registry reconciliation the point-source-dataset-cap-guard close-out (PyAutoLens#710) left as a follow-up. #710 has shipped — PyAutoLens#711 and autolens_workspace_test#265 both merged 2026-08-23 — so the condition its planned.md note attached ("retire this entry and its prompt when #710 ships") is now met. - planned.md: removed the jax-point-source-point-smoke-sentinel entry; its -1e99 symptom was the same poisoned-on-disk dataset, and #265 measured point.py passing on main with the -83.38049778 pin exact. That settles the "what is still unknown" question the prompt's own 2026-08-09 note left open. - Archived the prompt to complete/archive/shelved/ behind a WITHDRAWN banner (provenance only, do not start), per the repo's shelving convention. - Rewrote the completion record's reconciliation section from "retire" to "retired", naming the archive path. - Backfilled the Filed: 2026-07-22 header onto the folded original prompt, which main had added to the draft after the close-out branch forked. - Regenerated complete/index.md, planned.md's contents block, and the dashboard. lifecycle check / index --check / orphans and registry_toc --check all pass. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01ArKXBR7EnFh49QRqNScF2y --- .../2026/08/point-source-dataset-cap-guard.md | 10 ++++-- .../jax_point_source_point_smoke_sentinel.md | 2 ++ complete/index.md | 3 +- dashboard.html | 11 +++--- dashboard.md | 34 +++---------------- planned.md | 29 ---------------- 6 files changed, 20 insertions(+), 69 deletions(-) rename {draft/bug/autolens => complete/archive/shelved}/jax_point_source_point_smoke_sentinel.md (94%) diff --git a/complete/2026/08/point-source-dataset-cap-guard.md b/complete/2026/08/point-source-dataset-cap-guard.md index 7ddcea96..c4868444 100644 --- a/complete/2026/08/point-source-dataset-cap-guard.md +++ b/complete/2026/08/point-source-dataset-cap-guard.md @@ -77,9 +77,12 @@ accepts the previously-unused `full_datasets real_output` marker combination. Three prompts described this one surface; folded to one line of truth. -- `planned.md` → `jax-point-source-point-smoke-sentinel` marked superseded. Its `-1e99` - symptom was the same poisoning; `point.py` passes on main. Retire the entry and its - prompt `draft/bug/autolens/jax_point_source_point_smoke_sentinel.md`. +- `planned.md` → `jax-point-source-point-smoke-sentinel` **retired**. Its `-1e99` symptom was + the same poisoning, and autolens_workspace_test#265 measured `point.py` passing on main with + the pin exact — which settles the "what is still unknown" question that prompt's own + 2026-08-09 note left open. Entry removed from `planned.md`; the prompt is archived at + `complete/archive/shelved/jax_point_source_point_smoke_sentinel.md` behind a WITHDRAWN + banner, provenance only. - `draft/bug/autolens/point_solver_error_bisect_health.md` no longer absorbs this task — the "same investigation surface" premise was false (workspace env-declaration defect, not triangle-solve accuracy). Its stale `point_solver.py:111` reference corrected to `:119`. @@ -105,6 +108,7 @@ Difficulty: small Autonomy: supervised Priority: normal Status: issued — PyAutoLens#710 (2026-08-23) +Filed: 2026-07-22 (backfilled from git) ## 2026-08-23 — DIAGNOSED. Root cause found; scope changed. Read this before the body below. diff --git a/draft/bug/autolens/jax_point_source_point_smoke_sentinel.md b/complete/archive/shelved/jax_point_source_point_smoke_sentinel.md similarity index 94% rename from draft/bug/autolens/jax_point_source_point_smoke_sentinel.md rename to complete/archive/shelved/jax_point_source_point_smoke_sentinel.md index 8d4c7f6c..d7c36939 100644 --- a/draft/bug/autolens/jax_point_source_point_smoke_sentinel.md +++ b/complete/archive/shelved/jax_point_source_point_smoke_sentinel.md @@ -1,3 +1,5 @@ +# [WITHDRAWN 2026-08-23] superseded by complete/2026/08/point-source-dataset-cap-guard.md (PyAutoLens#710) — the `-1e99` sentinel was poisoned-on-disk dataset output, not a library regression: `should_simulate` rmtree'd the committed JSON `dataset/point_source/simple` under `PYAUTO_SMALL_DATASETS=1`, and `PointSolver.solve` short-circuited to a fixed model-independent position pair. autolens_workspace_test#265 measured `point.py` PASSING on current main with the pin exact (`-83.38049778`), which settles the "what is still unknown" question the 2026-08-09 note below left open. Kept for provenance only. Do NOT start. + # JAX point-source smoke sentinel: point.py returns -1e99 instead of -83.38 Type: bug diff --git a/complete/index.md b/complete/index.md index 706a098d..997ff19a 100644 --- a/complete/index.md +++ b/complete/index.md @@ -6,7 +6,7 @@ Token-light navigation over the finished-work records (schema: only then grep a dated bucket. Curators: edit the band between the CURATED markers; everything below GENERATED is rebuilt. -1100 records across 7 buckets. +1101 records across 7 buckets. ## Highlights @@ -145,6 +145,7 @@ _(curate hard-won records here — survives regeneration.)_ - [pixelization-eager-jit-divergence](2026/08/pixelization-eager-jit-divergence.md) - [plot-array-stale-kwargs](2026/08/plot-array-stale-kwargs.md) - [plot-utils-duplicate-modules](2026/08/plot-utils-duplicate-modules.md) — small, single-repo, behaviour-preserving +- [point-source-dataset-cap-guard](2026/08/point-source-dataset-cap-guard.md) - [point-source-defaults-campaign](2026/08/point-source-defaults-campaign.md) — took the point-source likelihood options from "several undocumented - [point-source-light](2026/08/point-source-light.md) — Added standard and linear point-source light profiles with total-flux normalization and oversampled PSF convol… - [pointmass-smbh-jax](2026/08/pointmass-smbh-jax.md) — `al.mp.PointMass` and `al.mp.SMBH` failed every JAX-mode fit (user report on 2026.8.4.1). Two independent bugs… diff --git a/dashboard.html b/dashboard.html index 19930dc3..53ae8432 100644 --- a/dashboard.html +++ b/dashboard.html @@ -138,7 +138,7 @@

PyAutoMindDashboard

Intent. Priority. Flow.

Every task the Mind is holding. Tap a task's 📋 and its /start_dev command is on your clipboard — paste it into a Claude Code chat to route Claude straight to that task. Recent is the same work by date — what has been happening rather than what to do next.

-
  • 1In flight
  • 3Parked
  • 6Planned
  • 155Backlog
+
  • 1In flight
  • 3Parked
  • 5Planned
  • 153Backlog

markdown version

Start here

Highest priority (filed as high) — showing 12 of 17

@@ -170,16 +170,15 @@

Parked markdown version

-6 task(s) +5 task(s)

isothermal-ell-sph-oversampling-at-the-cusp — found 2026-08-09planned — NOT yet a prompt file; file one via /intake before starting

remote-mcp-deployment-tiersissue #20 — filed 2026-07-21DESIGN-COMPLETE, build BLOCKED-ON-DEMAND — issue #20 holds the full auth/transport/hosting design + Richard/PyAutoMCP…

samples-parameter-pathsissue #1327 — filed 2026-07-08parked

-

jax-point-source-point-smoke-sentinel — filed 2026-05-21planned

piemass-potential — filed 2026-06-05planned

latent-nan-guard-honest-run — planned 2026-07-22

Backlog markdown version

-

155 filed prompts, not started — sorted most-pickable first (priority, then size). 25 of them belong to an epic and are listed only under Epics below.

+

153 filed prompts, not started — sorted most-pickable first (priority, then size). 25 of them belong to an epic and are listed only under Epics below.

feature — 29 @@ -213,7 +212,7 @@

Backlog

Teach repos_sync --write to stamp organ config surfaces✨ featurepyautomindhardsupervisedlow

-bug — 31 +bug — 29

Fix release JAX runtime compatibility and likelihood parity🐛 bughealth_fixestoo-largesupervisedhigh

Fix JIT quick-update visualization output regressions🐛 bughealth_fixestoo-largesupervisedhigh

Fix release result/sample parameter-path regressions🐛 bughealth_fixestoo-largesupervisedhigh

@@ -221,7 +220,6 @@

Backlog

LogGaussianPrior misreports its own support as (-inf, inf)🐛 bugautofitsmallsupervisednormal

TEST_MODE bypass crashes on ordered-parameter assertion ties🐛 bugautofitsmallsupervisednormal

-

PyAutoConf rename leftovers in Brain functional surfaces🐛 bugpyautobrainsmallsupervisednormal

generate.py deletes notebooks/ before rejecting an unknown project🐛 bugpyautohandssmallsupervisednormal

@@ -231,7 +229,6 @@

Backlog

Three jax_likelihood pins are stale by ~1.24e-4 and fail the smoke gate…🐛 bugworkspacessmallsupervisednormal

- diff --git a/dashboard.md b/dashboard.md index d238bd5b..af46e5de 100644 --- a/dashboard.md +++ b/dashboard.md @@ -10,8 +10,8 @@ Every task the Mind is holding, on one page: what is in flight, what is parked, |-------|------:| | [In flight](#in-flight) (`active/`) | 1 | | [Parked](#parked) (`parked.md`) | 3 | -| [Planned](#planned) (`planned.md`) | 6 | -| [Backlog](#backlog) (`draft/`) | 155 | +| [Planned](#planned) (`planned.md`) | 5 | +| [Backlog](#backlog) (`draft/`) | 153 | ## Start here @@ -189,7 +189,7 @@ Started or scoped, not currently in flight — resume by moving the row back to Scoped but not started; some are not yet prompt files. Full detail in [`planned.md`](planned.md).
-6 task(s) +5 task(s)
📋 isothermal-ell-sph-oversampling-at-the-cusp — found 2026-08-09 — planned — NOT yet a prompt file; file one via /intake before starting @@ -215,14 +215,6 @@ Scoped but not started; some are not yet prompt files. Full detail in [`planned.
-
📋 jax-point-source-point-smoke-sentinel — filed 2026-05-21 — planned - -``` -/start_dev draft/bug/autolens/jax_point_source_point_smoke_sentinel.md -``` - -
-
📋 piemass-potential — filed 2026-06-05 — planned ``` @@ -243,7 +235,7 @@ Scoped but not started; some are not yet prompt files. Full detail in [`planned. ## Backlog -**155** filed prompts, not started. Each section is sorted most-pickable first (priority, then size). **25** of them belong to an epic and are listed only under [Epics](#epics) below. +**153** filed prompts, not started. Each section is sorted most-pickable first (priority, then size). **25** of them belong to an epic and are listed only under [Epics](#epics) below.
feature — 29 @@ -483,7 +475,7 @@ Scoped but not started; some are not yet prompt files. Full detail in [`planned.
-bug — 31 +bug — 29
📋 Fix release JAX runtime compatibility and likelihood parity — health_fixes · too-large · supervised · high @@ -541,14 +533,6 @@ Scoped but not started; some are not yet prompt files. Full detail in [`planned.
-
📋 point.py JAX-vmap parity assert is non-deterministic under the smoke env — autolens · small · supervised · normal - -``` -/start_dev draft/bug/autolens/point_jax_vmap_parity_nondeterministic.md -``` - -
-
📋 HowToGalaxy small API drifts: ellipse kwargs + plot_grid_lines (parked NEEDS_FIX) — howtogalaxy · small · supervised · normal ``` @@ -621,14 +605,6 @@ Scoped but not started; some are not yet prompt files. Full detail in [`planned.
-
📋 JAX point-source smoke sentinel: point.py returns -1e99 instead of -83.38 — autolens · medium · supervised · normal - -``` -/start_dev draft/bug/autolens/jax_point_source_point_smoke_sentinel.md -``` - -
-
📋 JIT cache not hit in modeling_visualization delaunay/rectangular scripts — autolens · medium · supervised · normal ``` diff --git a/planned.md b/planned.md index f8e96a6f..1dde373b 100644 --- a/planned.md +++ b/planned.md @@ -5,7 +5,6 @@ - [isothermal-ell-sph-oversampling-at-the-cusp](#isothermal-ell-sph-oversampling-at-the-cusp) - [remote-mcp-deployment-tiers](#remote-mcp-deployment-tiers) - [samples-parameter-paths](#samples-parameter-paths) -- [jax-point-source-point-smoke-sentinel](#jax-point-source-point-smoke-sentinel) - [piemass-potential](#piemass-potential) - [latent-nan-guard-honest-run](#latent-nan-guard-honest-run) @@ -56,34 +55,6 @@ Full trail: PyAutoFit#1327 comments. - affected-repos: -## jax-point-source-point-smoke-sentinel -- prompt: draft/bug/autolens/jax_point_source_point_smoke_sentinel.md -- status: planned -- filed: 2026-05-21 -- classification: library (triage; routing TBD by bisect) -- suggested-branch: feature/jax-point-source-point-smoke-sentinel -- summary: | - Pre-existing regression surfaced during fast-viz-zero-contour-perf smoke. - `autolens_workspace_test/scripts/jax_likelihood_functions/point_source/point.py` - fails its hardcoded `-83.38049778` literal — `fitness._vmap` returns the - `-1e99` non-finite-likelihood sentinel from `FitPositionsImagePairAll` on - canonical main of all three libraries. Last known good: 2026-05-08 - (autolens_workspace_test@362cfa8 rebaseline). Sibling JAX point-source - profiling drift already tracked as PyAutoLens#514; this is a more severe - symptom on a different file — held as two hypotheses (same root cause / - independent regression) for triage. - - Affected repos (when resumed): - - PyAutoLens (likely primary — PointSolver / FitPositionsImagePairAll) - - PyAutoGalaxy or PyAutoArray (possible — bisect will say) - - autolens_workspace_test (literal rebaseline OR no change, depending on outcome) - - Sibling smoke scripts to check while triaging: image_plane.py, - source_plane.py in the same dir — they share the seed dataset. -- SUPERSEDED 2026-08-23 by point-source-dataset-cap-guard (PyAutoLens#710): the -1e99 sentinel - was poisoned-dataset output, not a library regression. point.py passes on current main. Retire - this entry and its prompt when #710 ships. - ## piemass-potential - prompt: draft/feature/autogalaxy/piemass_potential.md - status: planned