Skip to content

Commit 097d76c

Browse files
Jammy2211claude
andauthored
mind: land the autonerves-floor task state, one new prompt and one re-park (#269)
* prompt: issue + route bump-autonerves-floor (#482) -> library-dev The prompt was filed blocked on the PyAutoNerves release. That release landed (autonerves 2026.8.23.1, the first carrying the SMALLDAT stamp), so the task is unblocked and issued as PyAutoArray#482. Advances the prompt draft/ -> active/ and registers the task in active.md. Co-Authored-By: Claude <noreply@anthropic.com> * prompt: file untrack-generated-fits-test-artifacts (maintenance/libraries) autoarray's test suite writes output into 13 tracked paths under output_test/, so any autonerves FITS-writer change dirties the tree and forces an unrelated binary into the diff. Surfaced by PyAutoArray#483, where the PyAutoNerves#155 header-comment fix silently modified a committed fixture. The convention already exists but was applied file-by-file: .gitignore names two individual generated files and misses the other thirteen. Filed via intake, which classified low-confidence to triage/; re-homed by hand to maintenance/libraries and the body written with the real inventory. Co-Authored-By: Claude <noreply@anthropic.com> * complete: bump-autonerves-floor (#482, PyAutoArray#483 merged) autonerves floored at 2026.8.23.1, the first release carrying the SMALLDAT stamp. Blocker cleared itself the same day the prompt was filed. Records the two findings worth keeping: the duplication comment in dataset_util.py named the floor and so had to change whatever was decided about the literal (kept, on a decoupling rationale), and the suite dirtied a tracked FITS output artifact — a distinct problem from the regime-dependent *input* fixtures the parent task solved, filed as its own maintenance prompt. Co-Authored-By: Claude <noreply@anthropic.com> * prompt: re-park point-source-json-regime — both blockers still hold (2026-08-23) The prompt's own step 1 gates the work on two expiring facts. Both re-verified today and both still hold, so nothing was built: PyAutoLens#480 is still open (untouched since 2026-04-28, no closing PRs), and weak/simple is still regime-invariant (scripts/weak/simulator.py calls via_tracer_from over an explicit annulus and reads no environment variable). Records the re-check with its date so the next attempt does not repeat it, and fixes two paths that cost a search: the no_run.yaml exclusion lives in autolens_workspace rather than autolens_workspace_test, and it skips two scripts (simulator and modeling), not one. Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent 18a6a82 commit 097d76c

7 files changed

Lines changed: 277 additions & 52 deletions

File tree

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
- issue: https://github.com/PyAutoLabs/PyAutoArray/issues/482
2+
- completed: 2026-08-23
3+
- library-pr: https://github.com/PyAutoLabs/PyAutoArray/pull/483 (merged 0f75c3d)
4+
- workspace-pr: none — no workspace change needed
5+
6+
The floor `autonerves>=2026.8.22.1` predated the SMALLDAT regime stamp
7+
(PyAutoNerves#153/#154), so a PyPI-installed autoarray resolved an autonerves
8+
whose writer emits no card: `should_simulate` read the absent stamp as "unknown"
9+
and fell back to the shape heuristic, which cannot see capped interferometer
10+
datasets — the case the stamp exists for. Bumped to `2026.8.23.1`.
11+
12+
**THE BLOCKER CLEARED ITSELF THE SAME DAY.** The prompt was filed 2026-08-22
13+
blocked on "the PyAutoNerves release". `autonerves 2026.8.23.1` was uploaded
14+
2026-08-23T00:41:41Z, hours before this ran. Worth remembering as a pattern: a
15+
prompt parked on an external release is worth re-checking on sight rather than
16+
trusting its `Status:`.
17+
18+
**Verified by unpacking both wheels, not by reading commit dates.** The prompt
19+
named commits `39014b6` and `0ecefa0` and said "the release that carries them is
20+
the floor to name" — but commit membership is not the same claim as wheel
21+
contents. Unpacked from PyPI: `2026.8.22.1` has neither
22+
`stamp_small_datasets_regime` nor `SMALL_DATASETS_HEADER_KEY` and still writes
23+
the `[""]` header comment; `2026.8.23.1` has both plus the `""` fix. No release
24+
sits between them, so it is provably the first.
25+
26+
**THE PROMPT UNDERSTATED THE DUPLICATION ITEM.** It framed converting
27+
`dataset_util.SMALL_DATASETS_HEADER_KEY` to an import as "optional and low
28+
value... decide deliberately". It is not optional in either direction: the
29+
comment justifying the duplication *names the floor* ("floors autonerves at a
30+
release that predates the stamp, so an import would hard-fail"), so bumping the
31+
floor makes that comment **factually false**. The comment had to change whatever
32+
was decided about the literal.
33+
34+
Decision: **keep the duplication, replace the reason.** A floor constrains
35+
dependency *resolution* only. An editable checkout, `pip install --no-deps`, or a
36+
hand-built virtualenv (the HPC one) can still put a pre-stamp autonerves on the
37+
path. Under the literal that yields "card absent" -> shape fallback, the safe
38+
direction and the same path every pre-stamp dataset on disk already takes. Under
39+
an import it is an `ImportError` at module load. Silent-safe beats hard-fail; the
40+
literal is not debt, it is a deliberate decoupling.
41+
42+
**TRAPS**
43+
- The other floor reason is still load-bearing. PyAutoLens#687/#702 (JAX in
44+
autonerves' base dependencies) shares this pin; both versions carry
45+
`jax>=0.7.0` in base `Requires-Dist`, so that condition has been met since
46+
`2026.8.22.1` and its "bump once it exists" phrasing was stale. Both reasons
47+
are now stated. Dropping either silently re-opens the other's failure mode.
48+
- Do NOT remove the shape fallback or `_is_capped_at_the_current_cap`. The floor
49+
governs what a fresh install *writes*; every dataset already on disk is
50+
unstamped and depends on those paths.
51+
- A `>=` floor does not constrain the upper end, so this bump reaches no new jax
52+
range — `2026.8.23.1` widens its own cap to `<0.12.0`, but that was already
53+
resolvable under the old floor. The bump raises the minimum only.
54+
55+
**A TRACKED TEST ARTIFACT CHANGED UNDER US.** Running the suite dirtied
56+
`test_autoarray/structures/arrays/files/array/output_test/array.fits` — the
57+
newly-floored autonerves drops the `/ ['']` comment literal (PyAutoNerves#155),
58+
so the committed copy no longer matched what a compliant install writes:
59+
60+
```
61+
HEAD : PIXSCAY = 1.0 / ['']
62+
WORKING : PIXSCAY = 1.0
63+
```
64+
65+
Verified cosmetic (identical cards, values, data, byte size 5760 -> 5760) and
66+
committed, because the file is test *output*`test_uniform_2d.py:201-208`
67+
rmtrees the directory and rewrites it — so leaving it stale would dirty the tree
68+
on every run under the new floor. Only 1 of 61 tracked `.fits` was affected,
69+
because only it carries `header_dict` comment cards.
70+
71+
This is a different problem from the one the parent task solved. That one fixed
72+
fixtures that are genuinely *inputs* and became regime-dependent, via an autouse
73+
conftest fixture. This is files that are *outputs* and should not be tracked at
74+
all — and the convention already exists, applied inconsistently: `.gitignore`
75+
names two individual generated files under `dataset/files/array/output_test/`
76+
and misses thirteen others.
77+
78+
**Follow-up filed**
79+
- `draft/maintenance/libraries/untrack_generated_fits_test_artifacts.md` — the
80+
13 tracked output files across five `output_test/` directories, their writers,
81+
and the two candidate fixes (`tmp_path` preferred over widening `.gitignore`).
82+
Notes that `structures/arrays/test_uniform_1d.py:12` *reads* from an
83+
`output_test` path and must be checked for a real input before untracking.
84+
85+
**Method note.** Filed via `/intake`, which classified it low-confidence to
86+
`triage/` at difficulty large (score 7) off a long description, and again at
87+
medium off a short one. Re-homed by hand to `maintenance/libraries` and the body
88+
written from a real inventory (`git ls-files | grep output_test` plus the
89+
writers). The sizing inflation on prose-dense input is the same effect recorded
90+
in the parent task and in `complete/2026/08/jax-grad-smoke-timeout-budget.md`.
91+
92+
## Original prompt
93+
94+
# Bump autoarray's autonerves floor once the regime stamp is released
95+
96+
Type: maintenance
97+
Target: libraries
98+
Repos:
99+
- @PyAutoArray
100+
Difficulty: small
101+
Autonomy: supervised
102+
Priority: medium
103+
Status: formalised
104+
105+
Filed 2026-08-22 as the step that makes PyAutoNerves#153/#154 actually take
106+
effect. Blocked on the PyAutoNerves release, not on any code.
107+
108+
`autoarray/pyproject.toml:30` floors `autonerves>=2026.8.22.1`. That version is
109+
currently the **newest release on PyPI** and it **predates the SMALLDAT regime
110+
stamp**. So an autoarray installed from PyPI resolves an autonerves whose writer
111+
emits no card at all: `should_simulate` sees an absent stamp, reads it as
112+
"unknown", and falls back to the shape heuristic — which provably cannot see
113+
capped interferometer datasets, the case the whole change exists for.
114+
115+
Nothing is broken by that; it is the designed degradation. But until the floor
116+
names a stamped release, the fix is inert for anyone who installs rather than
117+
runs from a checkout.
118+
119+
## Do this after PyAutoNerves is released
120+
121+
1. Bump `"autonerves>=2026.8.22.1"` to the first release containing the stamp
122+
(the commits are `39014b6` and `0ecefa0` on nerves main; the release that
123+
carries them is the floor to name).
124+
2. Keep the comment block above the pin current — it currently explains a
125+
*different* historical reason for the floor (PyAutoLens#687/#702, JAX moving
126+
into autonerves' base dependencies). Add the stamp reason rather than
127+
replacing that one; both are now load-bearing.
128+
3. **Do not remove the shape fallback in `should_simulate`.** The floor governs
129+
what a fresh install *writes* going forward; it says nothing about datasets
130+
already on disk, every one of which is unstamped. The fallback protects those
131+
and must stay. Same for `_is_capped_at_the_current_cap` on the capped branch.
132+
133+
## Note on the duplicated header key
134+
135+
`autoarray.util.dataset_util.SMALL_DATASETS_HEADER_KEY` duplicates the `"SMALLDAT"`
136+
literal rather than importing it from autonerves, *because* of this floor — an
137+
import would hard-fail against a legitimately-resolved older autonerves. Once the
138+
floor names a stamped release that objection disappears and the import becomes
139+
safe. Converting it is optional and low value: the duplication is documented, and
140+
a stale reader degrades to the fallback, which is the safe direction. Decide
141+
deliberately rather than by reflex.

complete/index.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ Token-light navigation over the finished-work records (schema:
66
only then grep a dated bucket. Curators: edit the band between the CURATED
77
markers; everything below GENERATED is rebuilt.
88

9-
1084 records across 7 buckets.
9+
1085 records across 7 buckets.
1010

1111
<!-- CURATED:START -->
1212
## Highlights
@@ -36,6 +36,7 @@ _(curate hard-won records here — survives regeneration.)_
3636
- [border-relocator-backend-parity](2026/08/border-relocator-backend-parity.md) — Isolated the native NumPy/JAX likelihood gap to mathematically non-unique PCA axes for a near-isotropic border…
3737
- [border-relocator-degenerate-pca](2026/08/border-relocator-degenerate-pca.md) — Stabilized near-isotropic border PCA axes with a deterministic axis-aligned branch at a scale-aware eigenvalue…
3838
- [brain-readability-pass](2026/08/brain-readability-pass.md) — auto-closed on merge
39+
- [bump-autonerves-floor](2026/08/bump-autonerves-floor.md)
3940
- [circular-ell-comps-image-gradient](2026/08/circular-ell-comps-image-gradient.md) — Replaced the Sersic image path's Cartesian-to-polar ellipticity conversion with an algebraically equivalent Ca…
4041
- [cli-noise-autonerves-batch](2026/08/cli-noise-autonerves-batch.md)
4142
- [cli-noise-pyautofit-batch](2026/08/cli-noise-pyautofit-batch.md)

dashboard.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ <h2>Backlog <a class="mdsrc" href="https://github.com/PyAutoLabs/PyAutoMind/tree
168168
</details>
169169
<details>
170170
<summary>maintenance — 21</summary>
171-
<div class="task"><button class="copy" data-cmd="/start_dev draft/maintenance/libraries/bump_autoarray_autonerves_floor_after_stamp_release.md" aria-label="Copy the Claude command">📋</button><p><a href="https://github.com/PyAutoLabs/PyAutoMind/blob/main/draft/maintenance/libraries/bump_autoarray_autonerves_floor_after_stamp_release.md">Bump autoarray's autonerves floor once the regime stamp is released</a><span class="facets">libraries · small · supervised · medium</span></p></div>
171+
<div class="task"><button class="copy" data-cmd="/start_dev draft/maintenance/libraries/untrack_generated_fits_test_artifacts.md" aria-label="Copy the Claude command">📋</button><p><a href="https://github.com/PyAutoLabs/PyAutoMind/blob/main/draft/maintenance/libraries/untrack_generated_fits_test_artifacts.md">Untrack the generated FITS test artifacts in autoarray</a><span class="facets">libraries · small · supervised · medium</span></p></div>
172172
<div class="task"><button class="copy" data-cmd="/start_dev draft/maintenance/ci/smoke_install_stale_jax_pin.md" aria-label="Copy the Claude command">📋</button><p><a href="https://github.com/PyAutoLabs/PyAutoMind/blob/main/draft/maintenance/ci/smoke_install_stale_jax_pin.md">smoke_install.sh's stale <code>jax&lt;0.7</code> pin — CI is on the right</a><span class="facets">ci · low · supervised · medium</span></p></div>
173173
<div class="task"><button class="copy" data-cmd="/start_dev draft/maintenance/autolens_workspace_developer/rectangular_experiments_gut_stash.md" aria-label="Copy the Claude command">📋</button><p><a href="https://github.com/PyAutoLabs/PyAutoMind/blob/main/draft/maintenance/autolens_workspace_developer/rectangular_experiments_gut_stash.md">autolens_workspace_developer rectangular experiments — Gut stash + rename</a><span class="facets">autolens_workspace_developer · small · supervised · normal</span></p></div>
174174
<div class="task"><button class="copy" data-cmd="/start_dev draft/maintenance/libraries/defer_scipy_sparse_import.md" aria-label="Copy the Claude command">📋</button><p><a href="https://github.com/PyAutoLabs/PyAutoMind/blob/main/draft/maintenance/libraries/defer_scipy_sparse_import.md">Defer the eager scipy.sparse import in derivative_util (~0.10 s of</a><span class="facets">libraries · small · safe · normal</span></p></div>

dashboard.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -887,10 +887,10 @@ Scoped but not started; some are not yet prompt files. Full detail in [`planned.
887887
<details>
888888
<summary><b>maintenance</b> — 21</summary>
889889

890-
<details><summary>📋 <a href="draft/maintenance/libraries/bump_autoarray_autonerves_floor_after_stamp_release.md">Bump autoarray's autonerves floor once the regime stamp is released</a> — libraries · small · supervised · medium</summary>
890+
<details><summary>📋 <a href="draft/maintenance/libraries/untrack_generated_fits_test_artifacts.md">Untrack the generated FITS test artifacts in autoarray</a> — libraries · small · supervised · medium</summary>
891891

892892
```
893-
/start_dev draft/maintenance/libraries/bump_autoarray_autonerves_floor_after_stamp_release.md
893+
/start_dev draft/maintenance/libraries/untrack_generated_fits_test_artifacts.md
894894
```
895895

896896
</details>

draft/bug/pyautolens/point_source_json_datasets_record_no_regime.md

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,44 @@ no FITS". That is wrong: ordinary point-source datasets write a top-level
7575
`autolens_workspace_test#260` traps. This needs a naming-convention decision
7676
first, and that decision is the real work here.
7777

78+
## Re-check log
79+
80+
**2026-08-23 — both facts re-verified, STILL BLOCKED. Do not build.**
81+
Checked at the top of a `/start_dev` run; the gate in step 1 below said re-park,
82+
so nothing was built, no issue was opened and no branch was cut.
83+
84+
1. **PyAutoLens#480 is still open.** Created 2026-04-28, `updated_at` identical
85+
to `created_at`, no assignees, `closed_by_pull_requests: 0`. Untouched in
86+
~4 months.
87+
2. **`weak/simple` is still regime-invariant.** Its simulator calls
88+
`simulator.via_tracer_from(tracer=tracer, grid=positions, name=dataset_name)`
89+
over an explicit 1500-galaxy annulus with `np.random.default_rng(1)`. It does
90+
not call `via_tracer_random_positions_from`, and the file contains no
91+
`os.environ` read at all, so nothing reads `PYAUTO_SMALL_DATASETS`.
92+
93+
Two path corrections found while re-checking — the originals below cost a search,
94+
so they are fixed here rather than left to bite again:
95+
96+
- The `no_run.yaml` exclusion is in **@autolens_workspace**, not
97+
autolens_workspace_test (whose `config/build/no_run.yaml` has no
98+
`multiple_sources` entry at all). Line numbers omitted deliberately: the
99+
original `:41-42` had already drifted. Match on the entries themselves —
100+
101+
```
102+
- point_source/features/multiple_sources/simulator # Blocked by PyAutoLens #480: solver finds 0 positions for intermediate-plane source
103+
- point_source/features/multiple_sources/modeling # Blocked by PyAutoLens #480: same root cause as simulator above
104+
```
105+
106+
Note this is **two** skipped scripts, simulator *and* modeling, not one.
107+
- The script path is `scripts/point_source/features/multiple_sources/`, not
108+
`dataset/point_source/multiple_sources` (that is the *output* directory).
109+
Likewise the weak simulator is `scripts/weak/simulator.py` in
110+
@autolens_workspace.
111+
112+
Next re-check: when PyAutoLens#480 closes. That is the only trigger — fact 2 is a
113+
standing invariant, not a countdown, and only breaks if someone switches
114+
`weak/simulator.py` to the random-positions helper.
115+
78116
## Suggested scope
79117

80118
1. Re-check both expiring facts above. If #480 is still open and `weak/simple`

draft/maintenance/libraries/bump_autoarray_autonerves_floor_after_stamp_release.md

Lines changed: 0 additions & 48 deletions
This file was deleted.

0 commit comments

Comments
 (0)