From 544d095e1a6f274cf5e86e0a27f7c48f7d18e482 Mon Sep 17 00:00:00 2001
From: Claude
Date: Sat, 22 Aug 2026 13:06:22 +0000
Subject: [PATCH 1/3] =?UTF-8?q?prompt:=20route=20jax-grad-local-vs-ci-asse?=
=?UTF-8?q?rtions=20(#260)=20=E2=86=92=20start=5Fworkspace?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
active.md | 19 +++++++++++++++
...ad_local_assertions_fail_but_pass_in_ci.md | 0
dashboard.html | 8 +++----
dashboard.md | 24 +++++++++----------
4 files changed, 35 insertions(+), 16 deletions(-)
rename {draft/bug/autolens_workspace_test => active}/jax_grad_local_assertions_fail_but_pass_in_ci.md (100%)
diff --git a/active.md b/active.md
index ab06b16d..c43d5c96 100644
--- a/active.md
+++ b/active.md
@@ -24,3 +24,22 @@
separate /repo_cleanup sweep so a destructive branch delete never rides a code diff.
- repos:
- PyAutoHands: feature/hands-hygiene-leftovers
+
+## jax-grad-local-vs-ci-assertions
+- issue: https://github.com/PyAutoLabs/autolens_workspace_test/issues/260 (issued 2026-08-22)
+- session: https://claude.ai/code/session_01VEHLT33XpVcRt5YCJGLRMJ (web-github; no local worktree yet)
+- status: workspace-dev
+- worktree: ~/Code/PyAutoLabs-wt/jax-grad-local-vs-ci-assertions
+- prompt: active/jax_grad_local_assertions_fail_but_pass_in_ci.md
+- classification: workspace (single repo) โ routes to /start_workspace
+- strategy: investigate-first. Bug Agent: severity=critical, scope=single-repo,
+ type=wrong-result, confidence=LOW. Reproduce and confirm root cause BEFORE patching.
+ Brain sizing disagreement: declared medium, derived large.
+- control: imaging/jax_grad/lp.py is the discriminator โ the only script known to PASS in
+ CI and FAIL locally. Every A/B runs against it first (~41s).
+- blocked-on-input: the failing local venv cannot be read from a cloud session. Capture
+ `pip freeze` + `np.show_config()` from the machine that reproduces the failure before it
+ drifts โ otherwise step 2 has no ground truth. Raised at plan time; not yet supplied.
+- out-of-bounds: moving lp.py's evaluation point, adding skip_indices, or widening a
+ tolerance without a measured basis. All three mask the trap instead of removing it.
+- repos:
diff --git a/draft/bug/autolens_workspace_test/jax_grad_local_assertions_fail_but_pass_in_ci.md b/active/jax_grad_local_assertions_fail_but_pass_in_ci.md
similarity index 100%
rename from draft/bug/autolens_workspace_test/jax_grad_local_assertions_fail_but_pass_in_ci.md
rename to active/jax_grad_local_assertions_fail_but_pass_in_ci.md
diff --git a/dashboard.html b/dashboard.html
index 00f7e868..bc6c302d 100644
--- a/dashboard.html
+++ b/dashboard.html
@@ -38,7 +38,7 @@
๐ PyAutoMind Dashboard
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.
-In flight 2 ยท Parked 3 ยท Planned 6 ยท Backlog 144 ยท markdown version
+In flight 3 ยท Parked 3 ยท Planned 6 ยท Backlog 143 ยท markdown version
Start here
Highest priority (filed as high) โ showing 12 of 18
@@ -59,6 +59,7 @@
+
3 task(s)
@@ -77,7 +78,7 @@
-144 filed prompts, not started โ sorted most-pickable first (priority, then size). 23 of them belong to an epic and are listed only under Epics below.
+143 filed prompts, not started โ sorted most-pickable first (priority, then size). 23 of them belong to an epic and are listed only under Epics below.
feature โ 28
@@ -110,7 +111,7 @@
-bug โ 32
+bug โ 31
@@ -118,7 +119,6 @@
+๐ jax_grad scripts fail assertions locally that PASS in CI โ issue #260 โ workspace-dev
+
+```
+/start_dev active/jax_grad_local_assertions_fail_but_pass_in_ci.md
+```
+
+
+
## Parked
Started or scoped, not currently in flight โ resume by moving the row back to `active.md`. Full detail in [`parked.md`](parked.md).
@@ -229,7 +237,7 @@ Scoped but not started; some are not yet prompt files. Full detail in [`planned.
## Backlog
-**144** filed prompts, not started. Each section is sorted most-pickable first (priority, then size). **23** of them belong to an epic and are listed only under [Epics](#epics) below.
+**143** filed prompts, not started. Each section is sorted most-pickable first (priority, then size). **23** of them belong to an epic and are listed only under [Epics](#epics) below.
feature โ 28
@@ -461,7 +469,7 @@ Scoped but not started; some are not yet prompt files. Full detail in [`planned.
-bug โ 32
+bug โ 31
๐ Fix release JAX runtime compatibility and likelihood parity โ health_fixes ยท too-large ยท supervised ยท high
@@ -519,14 +527,6 @@ Scoped but not started; some are not yet prompt files. Full detail in [`planned.
-๐ jax_grad scripts fail assertions locally that PASS in CI โ autolens_workspace_test ยท medium ยท supervised ยท medium
-
-```
-/start_dev draft/bug/autolens_workspace_test/jax_grad_local_assertions_fail_but_pass_in_ci.md
-```
-
-
-
๐ Numba PSF gathers derive the y/x kernel shifts from the โ autoarray ยท low ยท supervised ยท medium
```
From ccf43b95af339ca9426dda46151df2a235acc065 Mon Sep 17 00:00:00 2001
From: Claude
Date: Sat, 22 Aug 2026 13:46:23 +0000
Subject: [PATCH 2/3] =?UTF-8?q?prompt:=20jax-grad-local-vs-ci-assertions?=
=?UTF-8?q?=20(#260)=20=E2=80=94=20root=20cause=20found,=20numpy=20falsifi?=
=?UTF-8?q?ed?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
active.md | 23 ++++++++++++++++++++---
1 file changed, 20 insertions(+), 3 deletions(-)
diff --git a/active.md b/active.md
index c43d5c96..16fcc20a 100644
--- a/active.md
+++ b/active.md
@@ -37,9 +37,26 @@
Brain sizing disagreement: declared medium, derived large.
- control: imaging/jax_grad/lp.py is the discriminator โ the only script known to PASS in
CI and FAIL locally. Every A/B runs against it first (~41s).
-- blocked-on-input: the failing local venv cannot be read from a cloud session. Capture
- `pip freeze` + `np.show_config()` from the machine that reproduces the failure before it
- drifts โ otherwise step 2 has no ground truth. Raised at plan time; not yet supplied.
+- ROOT CAUSE FOUND 2026-08-22 (no laptop needed; findings on issue #260):
+ PyAutoArray `util/dataset_util.py:72` `should_simulate()` is existence-only and asymmetric โ
+ it force-regenerates under PYAUTO_SMALL_DATASETS=1 but never under full_datasets. `dataset/**`
+ is gitignored, so CI always simulates fresh and CANNOT hit this; locally the dir persists and
+ is never refreshed. Any prior smoke run (SMALL_DATASETS=1 is the default for every OTHER
+ script) rewrites the FITS at 15x15, and the next jax_grad run silently loads them under
+ full-resolution settings. All three failures reproduced exactly from a clean checkout
+ (pixelization eager/jit matches the report to 11 s.f.; regularization's tolerance vector
+ matches exactly). Full chain proven: fresh=PASS -> one SMALL run -> stale=FAIL -> rm -rf =PASS.
+- numpy FALSIFIED: lp.py byte-identical across numpy 2.2.6 / 2.4.6 / 2.5.2 (and across
+ 1-core vs 4-core). The likelihood runs through JAX/XLA; numpy only does the FD bookkeeping.
+- NO tolerance change is warranted โ all three asserts did their job on a genuinely invalid
+ dataset. assert_eager_jit_consistent's rtol=1e-10 is vindicated, not under-specified.
+- RECLASSIFY: the fix belongs upstream in PyAutoArray, not this workspace โ every PyAuto
+ workspace using the auto-simulate pattern inherits the trap. Awaiting a human call between
+ (1) a regime marker and (2) symmetric regeneration; that call moves this to library-dev.
+- follow-up (separate defect, not this bug): autolens_workspace_test
+ `.github/scripts/smoke_install.sh:9` `pip install "jax<0.7" "jaxlib<0.7"` downgrades jax to
+ 0.6.2 and conflicts with autonerves' jax>=0.7,<0.11; the run only lands on the intended
+ 0.10.2 because the next line's [optional] extras pull it back up. CI is right by accident.
- out-of-bounds: moving lp.py's evaluation point, adding skip_indices, or widening a
tolerance without a measured basis. All three mask the trap instead of removing it.
- repos:
From 2cc2a84f9fc1d42e2b84a333374563775506c9c8 Mon Sep 17 00:00:00 2001
From: Claude
Date: Sat, 22 Aug 2026 14:20:50 +0000
Subject: [PATCH 3/3] =?UTF-8?q?prompt:=20jax-grad-local-vs-ci-assertions?=
=?UTF-8?q?=20(#260)=20=E2=80=94=20fix=20on=20PyAutoArray=20branch,=202=20?=
=?UTF-8?q?follow-ups=20filed?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
active.md | 25 +++++++++++++++++++++----
dashboard.html | 2 +-
dashboard.md | 2 +-
3 files changed, 23 insertions(+), 6 deletions(-)
diff --git a/active.md b/active.md
index 16fcc20a..e4b15fd1 100644
--- a/active.md
+++ b/active.md
@@ -28,7 +28,8 @@
## jax-grad-local-vs-ci-assertions
- issue: https://github.com/PyAutoLabs/autolens_workspace_test/issues/260 (issued 2026-08-22)
- session: https://claude.ai/code/session_01VEHLT33XpVcRt5YCJGLRMJ (web-github; no local worktree yet)
-- status: workspace-dev
+- status: library-dev (RECLASSIFIED from workspace-dev โ the fix is upstream in PyAutoArray;
+ autolens_workspace_test needs no change and no tolerance change)
- worktree: ~/Code/PyAutoLabs-wt/jax-grad-local-vs-ci-assertions
- prompt: active/jax_grad_local_assertions_fail_but_pass_in_ci.md
- classification: workspace (single repo) โ routes to /start_workspace
@@ -50,9 +51,24 @@
1-core vs 4-core). The likelihood runs through JAX/XLA; numpy only does the FD bookkeeping.
- NO tolerance change is warranted โ all three asserts did their job on a genuinely invalid
dataset. assert_eager_jit_consistent's rtol=1e-10 is vindicated, not under-specified.
-- RECLASSIFY: the fix belongs upstream in PyAutoArray, not this workspace โ every PyAuto
- workspace using the auto-simulate pattern inherits the trap. Awaiting a human call between
- (1) a regime marker and (2) symmetric regeneration; that call moves this to library-dev.
+- FIX SHIPPED to a branch 2026-08-22: PyAutoArray `claude/jax-grad-assertions-ci-hontn3` @ 5ef6eea.
+ `should_simulate` now also regenerates on the small->full transition, inferring the regime from
+ data.fits's shape (the cap emits EXACTLY 16x16). Design went through an adversarial review that
+ corrected three things: no pixel-scale check (not in the FITS header), `==` not `<=` (the cap
+ cannot emit 12x12), and data.fits BY NAME not first-FITS-in-dir (PSFs are legitimately 11x11 and
+ dataset/cluster/test/psf.fits is 5760 B โ a glob would have deleted real data every run).
+ Verified: control-tested, 1168 tests pass, 12 new tests over all four regime transitions, and
+ end-to-end โ poison then full-datasets run now PASSES where it raised. Steady state 0.64 ms.
+ NO PR opened (not requested); branch is pushed and ready.
+- SCOPE: imaging manifestation only. Point-source/weak-lensing (JSON, no FITS) and interferometer
+ (shape-invariant under the cap, so it fails SILENTLY) remain exposed; stated in the docstring.
+- follow-ups filed (not absorbed):
+ - PyAutoNerves#153 โ stamp the regime at the single FITS writer funnel (fitsable.py:89); the only
+ discriminant that can catch the silent interferometer case. Kept out of the fix deliberately: it
+ changes a header card on every FITS the stack writes (round-trip tests, file-hash pins).
+ - PyAutoArray#470 โ separate live defect: the small-datasets branch rmtree's
+ dataset/point_source/simple, which is COMMITTED and allowlisted in .gitignore:13, replacing it
+ with capped-solver garbage. Recoverable via git checkout but violates the allowlist invariant.
- follow-up (separate defect, not this bug): autolens_workspace_test
`.github/scripts/smoke_install.sh:9` `pip install "jax<0.7" "jaxlib<0.7"` downgrades jax to
0.6.2 and conflicts with autonerves' jax>=0.7,<0.11; the run only lands on the intended
@@ -60,3 +76,4 @@
- out-of-bounds: moving lp.py's evaluation point, adding skip_indices, or widening a
tolerance without a measured basis. All three mask the trap instead of removing it.
- repos:
+ - PyAutoArray: claude/jax-grad-assertions-ci-hontn3
diff --git a/dashboard.html b/dashboard.html
index bc6c302d..243c1930 100644
--- a/dashboard.html
+++ b/dashboard.html
@@ -59,7 +59,7 @@