From 6623c81d1f926f7d425799b412cd77b49fe67ca7 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 5 Nov 2026 18:55:57 +0000 Subject: [PATCH 1/9] close: 4 stale drafts already shipped on main; re-size repos_sync dedup - repos-sync-test-keys-on-dir-name, glance-shadow-window-reached: fixed by 679b1319f (glance ruling 2026-11-04) - arxiv-edge-refuses-stdlib-urllib: superseded by 4d8290555 (curl fallback on 406) - arxiv-refs-api-errors: shipped in PyAutoMemory#143 - repos_sync_check_dedup: re-sized large, awaiting a human design call (file is now 3204 lines) Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_016nhQ8MZyNga1wamBmFdfAK --- .../11/arxiv-edge-refuses-stdlib-urllib.md | 8 + .../2026/11/arxiv-refs-api-errors.md | 8 + .../2026/11/glance-shadow-window-reached.md | 6 + .../11/repos-sync-test-keys-on-dir-name.md | 6 + complete/index.md | 6 +- dashboard.html | 134 +++-- dashboard.md | 490 ++++++++---------- .../pyautomind/repos_sync_check_dedup.md | 20 +- state.json | 14 +- 9 files changed, 351 insertions(+), 341 deletions(-) rename draft/bug/pyautomind/arxiv_edge_refuses_the_stdlib_urllib_client.md => complete/2026/11/arxiv-edge-refuses-stdlib-urllib.md (79%) rename draft/bug/pyautomemory/arxiv_refs_swallows_every_api_error_silently.md => complete/2026/11/arxiv-refs-api-errors.md (72%) rename draft/bug/pyautomind/glance_shadow_window_reached.md => complete/2026/11/glance-shadow-window-reached.md (62%) rename draft/bug/pyautomind/repos_sync_test_keys_on_dir_name.md => complete/2026/11/repos-sync-test-keys-on-dir-name.md (54%) diff --git a/draft/bug/pyautomind/arxiv_edge_refuses_the_stdlib_urllib_client.md b/complete/2026/11/arxiv-edge-refuses-stdlib-urllib.md similarity index 79% rename from draft/bug/pyautomind/arxiv_edge_refuses_the_stdlib_urllib_client.md rename to complete/2026/11/arxiv-edge-refuses-stdlib-urllib.md index 9fca8f235..fe67a3d21 100644 --- a/draft/bug/pyautomind/arxiv_edge_refuses_the_stdlib_urllib_client.md +++ b/complete/2026/11/arxiv-edge-refuses-stdlib-urllib.md @@ -1,3 +1,11 @@ +- summary: superseded by a different fix — closed. Commit 4d8290555 (2026-09-20, "fix: fall back to curl when arXiv rejects urllib with 406") keeps urllib but retries any 406 once through `curl` (already on the runner) before the back-off ladder, rather than moving `_get()` to `requests`. The 406 retry from #412 is kept, so prompt items 2–3 are covered by a dependency-free route. Item 4 (PyAutoMemory) shipped separately in PyAutoMemory#143 (record `arxiv-refs-api-errors`). +- evidence: `arxiv_papers.yml` scheduled runs 2026-10-29..11-05 all green. Of the two failures in the last 10 runs, 2026-10-27 was a pyautolabs-bot token 403 pushing to PyAutoMemory (not arXiv), and 2026-10-28 was HTTP 429 on all six attempts from the shared runner egress (rate-limiting, not the 406 fingerprint block). +- witness: the cache-busted urllib-vs-requests live probe (prompt item 1) was NOT run; this close rests on the run history above, not on a fingerprint measurement. +- follow-up candidate (not filed): on a 429 day, `--livecheck` spends a full ~6 min ladder before the fetch step spends another, doubling load on a throttled egress. Worth filing only if 429 days recur. +- found by: queue check-in 2026-11-05. + +## Original prompt + # arXiv's Fastly edge refuses `urllib.request` outright — retrying a 406 only delays the failure Type: bug diff --git a/draft/bug/pyautomemory/arxiv_refs_swallows_every_api_error_silently.md b/complete/2026/11/arxiv-refs-api-errors.md similarity index 72% rename from draft/bug/pyautomemory/arxiv_refs_swallows_every_api_error_silently.md rename to complete/2026/11/arxiv-refs-api-errors.md index f0fae130c..9c5c94c9c 100644 --- a/draft/bug/pyautomemory/arxiv_refs_swallows_every_api_error_silently.md +++ b/complete/2026/11/arxiv-refs-api-errors.md @@ -1,3 +1,11 @@ +- summary: already shipped — closed as stale draft. PyAutoMemory#143 (merged 2026-11-03, merge 1f22de7; commits 0c3e2dc, 625b583): `resolve_title()` raises `ArxivAPIError` on transport/parse failure so `None` means only "arXiv answered, no unique match"; `_api_query()` has a back-off ladder shaped like Mind's `_get()` (406/429/5xx, Retry-After capped) plus the curl-on-406 fallback; `backfill_arxiv_refs.py` gains `api_failed`/`unattempted` counters, stops at the first API failure and exits 1 (stricter than "when transport failure dominates"); `arxiv_refs.yml` writes an "arXiv API failure" step-summary banner and goes red; `--mark-unresolved` never NOTE-marks after a transport failure. +- witness: `test_witness_a_429_is_an_api_failure_not_a_non_match` in tests/test_arxiv_refs.py — fails on the pre-0c3e2dc source, passes now; Memory suite 286 passed, test_arxiv_refs.py 38 passed, `make validate` passes (2026-11-05). +- history check: 2026-09-13..20 touched reading-queue.md/arxiv-inbox.md in 575978a and b3233c6 only; neither added a NOTE line — nothing was mis-marked during the outage. +- not done: client not switched to `requests` (curl fallback makes it unnecessary). +- found by: queue check-in 2026-11-05. + +## Original prompt + # `arxiv_refs.py` swallows every API error, so an arXiv outage resolves nothing and still reports green Type: bug diff --git a/draft/bug/pyautomind/glance_shadow_window_reached.md b/complete/2026/11/glance-shadow-window-reached.md similarity index 62% rename from draft/bug/pyautomind/glance_shadow_window_reached.md rename to complete/2026/11/glance-shadow-window-reached.md index 0fe3c6fed..dfee6fa22 100644 --- a/draft/bug/pyautomind/glance_shadow_window_reached.md +++ b/complete/2026/11/glance-shadow-window-reached.md @@ -1,3 +1,9 @@ +- summary: already shipped — closed as stale draft. Item 1 (code): commit 679b1319f (2026-10-16) made `shadow_count_line()` append "window reached" once graded rows ≥ SHADOW_TARGET; it now also cites the ruling (SHADOW_RULED). Item 2 (human doctrine call): the human ruled 2026-11-04 — `glance` granted, narrowed; rows keep accumulating, with unattended merges in a stage-2 sub-window (record `complete/2026/11/glance-tier-ruling.md`, PyAutoBrain#567, PyAutoMind#529). +- witness: `tests/test_autonomy_log_shadow.py` passes on main; autonomy_log.md count line reads "…window reached — ruled 2026-11-04: `glance` granted, narrowed…" (2026-11-05). +- found by: queue check-in 2026-11-05. + +## Original prompt + # Glance shadow window reached 20/20 clean — count line must say "reached"; record the glance confirmation decision Type: bug diff --git a/draft/bug/pyautomind/repos_sync_test_keys_on_dir_name.md b/complete/2026/11/repos-sync-test-keys-on-dir-name.md similarity index 54% rename from draft/bug/pyautomind/repos_sync_test_keys_on_dir_name.md rename to complete/2026/11/repos-sync-test-keys-on-dir-name.md index 5592275b2..0549c92fe 100644 --- a/draft/bug/pyautomind/repos_sync_test_keys_on_dir_name.md +++ b/complete/2026/11/repos-sync-test-keys-on-dir-name.md @@ -1,3 +1,9 @@ +- summary: already shipped — closed as stale draft. Commit 679b1319f (2026-10-16, "test: Mind suite green on main — shadow line says window reached; standards test keys on PyAutoMind") changed `test_mind_owns_an_exact_generated_block` to key on the literal `specs["PyAutoMind"]`, so the lookup no longer depends on the checkout directory name. +- witness: `pytest tests/test_repos_sync_standards_block.py tests/test_autonomy_log_shadow.py` → 47 passed on main (2026-11-05). +- found by: queue check-in 2026-11-05 (the draft was never closed when the fix landed directly on main). + +## Original prompt + # repos_sync standards-block test keys on the checkout dir name (KeyError in non-canonical worktrees) Type: bug diff --git a/complete/index.md b/complete/index.md index 333a6a825..15770499b 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. -2140 records across 11 buckets. +2144 records across 11 buckets. ## Highlights @@ -123,6 +123,8 @@ markers; everything below GENERATED is rebuilt. - [alw-optdeps-escapes](2026/11/alw-optdeps-escapes.md) - [arcticpy-lazy-import](2026/11/arcticpy-lazy-import.md) +- [arxiv-edge-refuses-stdlib-urllib](2026/11/arxiv-edge-refuses-stdlib-urllib.md) — superseded by a different fix — closed. Commit 4d8290555 (2026-09-20, "fix: fall back to curl when arXiv rejec… +- [arxiv-refs-api-errors](2026/11/arxiv-refs-api-errors.md) — already shipped — closed as stale draft. PyAutoMemory#143 (merged 2026-11-03, merge 1f22de7; commits 0c3e2dc, … - [autonomous-orchestrators-p1](2026/11/autonomous-orchestrators-p1.md) — phase 1 of 7; epic draft/feature/pyautobrain/autonomous_orchestrators_epic.md - [autonomous-orchestrators-p2](2026/11/autonomous-orchestrators-p2.md) — phase 2 of 7; epic draft/feature/pyautobrain/autonomous_orchestrators_epic.md - [autonomous-orchestrators-p3a](2026/11/autonomous-orchestrators-p3a.md) — phase 3a of 3a–3d; epic draft/feature/pyautobrain/autonomous_orchestrators_epic.md @@ -140,6 +142,7 @@ markers; everything below GENERATED is rebuilt. - [cti-likelihood-pins](2026/11/cti-likelihood-pins.md) — cti-upkeep phase 0b - [cti-release-train-wiring](2026/11/cti-release-train-wiring.md) - [generate-converter-preflight](2026/11/generate-converter-preflight.md) +- [glance-shadow-window-reached](2026/11/glance-shadow-window-reached.md) — already shipped — closed as stale draft. Item 1 (code): commit 679b1319f (2026-10-16) made `shadow_count_line(… - [glance-tier-ruling](2026/11/glance-tier-ruling.md) — prerequisite for phase 4 unattended merges; epic draft/feature/pyautobrain/autonomous_orchestrators_epic.md - [gradient-campaign-impact](2026/11/gradient-campaign-impact.md) — human-requested assessment of whether the two PyAutoArray#671 defects affected the likelihood-lifecycle phase-… - [howto-chapter2-format](2026/11/howto-chapter2-format.md) — Restored descriptive contents for Lens lessons 1–4 and complete ordered contents for Galaxy lessons 1–6, corre… @@ -174,6 +177,7 @@ markers; everything below GENERATED is rebuilt. - [rectangular-gradient-rtu-sparse](2026/11/rectangular-gradient-rtu-sparse.md) — the filed symptom (|g| ~2e9 on the imaging/rectangular/hst fiducial, RTU all backends, Bilinear CPU sparse) sp… - [rectangular-mapper-bilinear-row-weights](2026/11/rectangular-mapper-bilinear-row-weights.md) — - **Retired as already-fixed** by the gradient-correctness sweep (autolens_profiling#517, item 12). The draft … - [registry-reconcile-app-token](2026/11/registry-reconcile-app-token.md) +- [repos-sync-test-keys-on-dir-name](2026/11/repos-sync-test-keys-on-dir-name.md) — already shipped — closed as stale draft. Commit 679b1319f (2026-10-16, "test: Mind suite green on main — shado… - [results-library-p2-completeness](2026/11/results-library-p2-completeness.md) — phase 2; ledger draft/feature/autofit/results_library_epic.md - [results-library-p3-exports](2026/11/results-library-p3-exports.md) — phase 3; ledger draft/feature/autofit/results_library_epic.md - [results-library-p4-package](2026/11/results-library-p4-package.md) — phase 4; ledger draft/feature/autofit/results_library_epic.md diff --git a/dashboard.html b/dashboard.html index 2b249e16c..04278f5fd 100644 --- a/dashboard.html +++ b/dashboard.html @@ -327,16 +327,15 @@ Keep track of decisions and outstanding questions throughout this conversation. After changes, report what was recorded, where it lives and what remains to do. Work on GitHub: -- Open Mind repository: https://github.com/PyAutoLabs/PyAutoMind
Last updated 2026-11-05 17:43:14 UTC
↻ Update

- +- Open Mind repository: https://github.com/PyAutoLabs/PyAutoMind
Last updated 2026-11-05 18:55:50 UTC
↻ Update

+
Batch 2026-11-05-am — 0 in progress · 0 awaiting review

Nothing to review yet.

Start here

24
-

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

+

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

-

Fix KNN neighbor search for a partial final point block🐛 bugautoarraymediumsupervisedhigh

@@ -345,7 +344,8 @@

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

Fix Sibson interpolation at internal edges🐛 bugautoarraylargesupervisedhigh

-

Fits a slot (ready to run unattended, cheapest to review first) — showing 12 of 92

+

Deep research: Can we speed up Delaunay in PyAutoArray?🔬 researchautoarraytoo-largesupervisedhigh

+

Fits a slot (ready to run unattended, cheapest to review first) — showing 12 of 91

Guard every workspace script against untimed network downloads🧪 testautolens_workspacesmallsafemedium

@@ -535,8 +535,8 @@

Fits a slot (ready to run unattended, cheapest to revie

interferometer-primary-beam-persistence-mirror — filed 2026-10-21 — ready — PyAutoLens claim released 2026-10-21 (point-dataset-positions-panel shipped…

point-plots-yaml-keys-assistant — filed 2026-10-22 — unblocked 2026-10-23 — cosmos-web-ring-notebook merged (autolens_assistant#161, complete/2026/10/cosmos-web-ring-notebook.md)…

-

Backlog

297
-

Lanes: any 287 · local-dev 8

+

Backlog

293
+

Lanes: any 283 · local-dev 8

Human review — 2

Human review: the scaling_relation slam parks (imaging un-parked, multi_galaxy kept)👀 human_reviewautolens_workspacenormal — flagged for review 2026-08-29

-bug — 66 +feature — 41 + + + + + + +

COOLEST: export MGE lens light and pixelized sources as pixel grids✨ featureautolensmediumsupervisedmedium

+

A dedicated Documentation conductor in PyAutoBrain✨ featurepyautobrainmediumsupervisedmedium

+

Nightly run of one HowTo tutorial per chapter at real settings✨ featurepyautoheartmediumsupervisedmedium

+

Board phase 2: the remaining four legs onto the seam✨ featurepyautobrainsmallsafenormal

+

Brain board follow-ups: what real mornings surface✨ featurepyautobrainsmallsupervisednormal

+

bump_colab_urls.sh: cover autolens_assistant Colab links✨ featurepyautohandssmallsafenormal

+

Can create a list of InversionMatrix objects for each dataset✨ featureautoarraymediumsupervisednormal

+

A joint unit-disk constraint (or reparameterisation) for ell_comps✨ featureautogalaxymediumsupervisednormal

+

Tune cluster-scale JOSS benchmarks toward their 5-minute targets✨ featureautolens_workspacemediumsafenormal

+ +

batch slice — the decomposition pass for needs-slicing prompts✨ featurepyautobrainmediumsupervisednormal

+ + +

EP analytic updates — implement the four planned work packages✨ featureautofitlargesupervisednormal

+ +

Remote-MCP deployment tiers (2 + 3) for the results-inspector server✨ featureautofit_assistantlargehuman-requirednormal

+

Multi-plane time delays✨ featureautolenslargesupervisednormal

+

Adopt oversampled PSFs in the start-here dataset chain (option a)✨ featureautolens_workspacelargesupervisednormal

+

Restore lensing-of-lens in the multiple_sources workspace example✨ featureworkspaceslargesupervisednormal

+

Follow-up to rectangular_adapt_cdf.md (issue #322) and Path A✨ featureautoarraytoo-largesupervisednormal

+

PIEMass.potential_2d_from: implement the missing lensing potential✨ featureautogalaxytoo-largesupervisednormal

+

autolens_jax_joss benchmark repo + real-data start_here pairing✨ featureautolens_jax_josstoo-largesupervisednormal

+

Context: PyAutoLens issue #542 follow-up (Gap 1, deferred during the✨ featurejax_substructuretoo-largesupervisednormal

+

Context: PyAutoLens issue #542 follow-up (Gap 2, deferred during the✨ featurejax_substructuretoo-largesupervisednormal

+

dPIE: optional central-dispersion (sigma_0) parameterization✨ featureautogalaxysmallsupervisedlow

+ +

Release board: local run_logs enrichment✨ featurepyautohandssmallsupervisedlow

+ +

Animated logos for PyAutoGalaxy and PyAutoFit✨ featurepyautoscientistmediumsafelow

+

Deferred: make the *Power adapt classes the defaults (breaking)✨ featureautoarraylargehuman-requiredlow

+ + + + +

Simplify reading-queue token management✨ featurepyautomemory

+
+
+bug — 62 -

Fix KNN neighbor search for a partial final point block🐛 bugautoarraymediumsupervisedhigh

Fix Sibson interpolation at internal edges🐛 bugautoarraylargesupervisedhigh

@@ -586,7 +629,6 @@

Fits a slot (ready to run unattended, cheapest to revie - @@ -596,7 +638,6 @@

Fits a slot (ready to run unattended, cheapest to revie - @@ -632,56 +673,11 @@

Fits a slot (ready to run unattended, cheapest to revie

Point-source JSON datasets record no resolution regime🐛 bugpyautolensmediumsupervisedlow

-

-feature — 41 - - - - - - -

COOLEST: export MGE lens light and pixelized sources as pixel grids✨ featureautolensmediumsupervisedmedium

-

A dedicated Documentation conductor in PyAutoBrain✨ featurepyautobrainmediumsupervisedmedium

-

Nightly run of one HowTo tutorial per chapter at real settings✨ featurepyautoheartmediumsupervisedmedium

-

Board phase 2: the remaining four legs onto the seam✨ featurepyautobrainsmallsafenormal

-

Brain board follow-ups: what real mornings surface✨ featurepyautobrainsmallsupervisednormal

-

bump_colab_urls.sh: cover autolens_assistant Colab links✨ featurepyautohandssmallsafenormal

-

Can create a list of InversionMatrix objects for each dataset✨ featureautoarraymediumsupervisednormal

-

A joint unit-disk constraint (or reparameterisation) for ell_comps✨ featureautogalaxymediumsupervisednormal

-

Tune cluster-scale JOSS benchmarks toward their 5-minute targets✨ featureautolens_workspacemediumsafenormal

- -

batch slice — the decomposition pass for needs-slicing prompts✨ featurepyautobrainmediumsupervisednormal

- - -

EP analytic updates — implement the four planned work packages✨ featureautofitlargesupervisednormal

- -

Remote-MCP deployment tiers (2 + 3) for the results-inspector server✨ featureautofit_assistantlargehuman-requirednormal

-

Multi-plane time delays✨ featureautolenslargesupervisednormal

-

Adopt oversampled PSFs in the start-here dataset chain (option a)✨ featureautolens_workspacelargesupervisednormal

-

Restore lensing-of-lens in the multiple_sources workspace example✨ featureworkspaceslargesupervisednormal

-

Follow-up to rectangular_adapt_cdf.md (issue #322) and Path A✨ featureautoarraytoo-largesupervisednormal

-

PIEMass.potential_2d_from: implement the missing lensing potential✨ featureautogalaxytoo-largesupervisednormal

-

autolens_jax_joss benchmark repo + real-data start_here pairing✨ featureautolens_jax_josstoo-largesupervisednormal

-

Context: PyAutoLens issue #542 follow-up (Gap 1, deferred during the✨ featurejax_substructuretoo-largesupervisednormal

-

Context: PyAutoLens issue #542 follow-up (Gap 2, deferred during the✨ featurejax_substructuretoo-largesupervisednormal

-

dPIE: optional central-dispersion (sigma_0) parameterization✨ featureautogalaxysmallsupervisedlow

- -

Release board: local run_logs enrichment✨ featurepyautohandssmallsupervisedlow

- -

Animated logos for PyAutoGalaxy and PyAutoFit✨ featurepyautoscientistmediumsafelow

-

Deferred: make the *Power adapt classes the defaults (breaking)✨ featureautoarraylargehuman-requiredlow

- - - - -

Simplify reading-queue token management✨ featurepyautomemory

-
-
research — 43 @@ -789,7 +785,7 @@

Fits a slot (ready to run unattended, cheapest to revie

Repo cleanup: retire the Abell 1201 worktree and local raw data♻️ refactorworkspacessmallhuman-requiredlow

Trim autogalaxy_assistant skills toward their autolens size♻️ refactorautogalaxy_assistantmediumsupervisedlow

-

Deduplicate repos_sync.py's check/write pairs♻️ refactorpyautomindmediumsupervisedlow

+

Deduplicate repos_sync.py's check/write pairs♻️ refactorpyautomindlargesupervisedlow

@@ -990,22 +986,10 @@

Fits a slot (ready to run unattended, cheapest to revie 2026-10-16 filed -repos_sync standards-block test keys on the checkout dir name… - - - -2026-10-16 -filed Re-measure the shapelets/modeling.py SLOW park (#586) under the… -2026-10-16 -filed -Glance shadow window reached 20/20 clean — count line must say… - - - 2026-10-14 filed @autofit_workspace six searches/ scripts fail on main at… @@ -1113,6 +1097,18 @@

Fits a slot (ready to run unattended, cheapest to revie Building a JAX Fitness then calling register_tracer_classes raises… + +2026-09-26 +filed +bump_colab_urls.sh: cover autolens_assistant Colab links + + + +2026-09-26 +filed +Repo cleanup: retire the Abell 1201 worktree and local raw data + +

Pending release

2
diff --git a/dashboard.md b/dashboard.md index ba0035e94..4b286fed2 100644 --- a/dashboard.md +++ b/dashboard.md @@ -12,7 +12,7 @@ | [Epics](#epics) | 21 | | [In flight](#in-flight) | 8 | | [Planned](#planned) | 9 | -| [Backlog](#backlog) | 297 | +| [Backlog](#backlog) | 293 | | [Recent](#recent) | 50 | | [Pending release](#pending-release) | 2 | @@ -23,7 +23,7 @@ ## Start here -**Highest priority** (filed as `high`) — showing 12 of 19 +**Highest priority** (filed as `high`) — showing 12 of 18
📋 autolens_assistant leg of the PyAutoLabs AI-options page (deferred from #87) — autolens_assistant · small · supervised · high @@ -49,14 +49,6 @@ Use the start-dev skill. draft/bug/euclid/sed_chain_waveband_fit_can_spin_foreve
-
📋 arXiv's Fastly edge refuses urllib.request outright — retrying a 406 only delays… — pyautomind · small · supervised · high - -``` -Use the start-dev skill. draft/bug/pyautomind/arxiv_edge_refuses_the_stdlib_urllib_client.md -``` - -
-
📋 Fix KNN neighbor search for a partial final point block — autoarray · medium · supervised · high ``` @@ -121,7 +113,15 @@ Use the start-dev skill. draft/research/euclid/euclid_dr1_positions_gate_remodel
-**Fits a slot** (ready to run unattended, cheapest to review first) — showing 12 of 92 +
📋 Deep research: Can we speed up Delaunay in PyAutoArray? — autoarray · too-large · supervised · high + +``` +Use the start-dev skill. draft/research/autoarray/delaunay_research.md +``` + +
+ +**Fits a slot** (ready to run unattended, cheapest to review first) — showing 12 of 91
📋 Guard every workspace script against untimed network downloads — autolens_workspace · small · safe · medium @@ -1235,7 +1235,7 @@ Use the start-dev skill. draft/docs/autolens_assistant/point_plots_yaml_keys.md ## Backlog -Lanes: any 287 · local-dev 8 +Lanes: any 283 · local-dev 8
@@ -1286,865 +1286,833 @@ regenerate the dashboard. If I do not sign it off, file the follow-up with
-bug — 66 - -
📋 test_latent_euclid_variables_traces_under_jax_jit went red on main: total_source_flux differs by 6% between jax.jit… — euclid · small · supervised · high - -``` -Use the start-dev skill. draft/bug/euclid/latent_total_source_flux_jax_vs_numpy_regression.md -``` - -
- -
📋 SED chain waveband fit can spin forever in Nautilus exploration… — euclid · small · supervised · high - -``` -Use the start-dev skill. draft/bug/euclid/sed_chain_waveband_fit_can_spin_forever.md -``` - -
+feature — 41 -
📋 arXiv's Fastly edge refuses urllib.request outright — retrying a 406 only delays… — pyautomind · small · supervised · high +
📋 Eyes cluster visualization group: render every cluster/point-source figure for PyAutoEyes — autolens_visualization · large · supervised · high ``` -Use the start-dev skill. draft/bug/pyautomind/arxiv_edge_refuses_the_stdlib_urllib_client.md +Use the start-dev skill. draft/feature/autolens_visualization/eyes_cluster_visualization_group_render_every_cl.md ```
-
📋 Fix KNN neighbor search for a partial final point block — autoarray · medium · supervised · high +
📋 Inversion.source_clumps_from needs a robust scale — thresholding against the raw maximum finds… — autoarray · small · supervised · medium ``` -Use the start-dev skill. draft/bug/autoarray/fix_knn_neighbor_search_for_a_partial.md +Use the start-dev skill. draft/feature/autoarray/source_clumps_robust_scale.md ```
-
📋 Sparse (w-tilde) inversion fits the unsubtracted image when a regular light profile… — autoarray · medium · supervised · high +
📋 autofit_assistant: a skill that owns loading the user's data and its selection… — autofit_assistant · small · safe · medium ``` -Use the start-dev skill. draft/bug/autoarray/sparse_inversion_ignores_profile_subtracted_image.md +Use the start-dev skill. draft/feature/autofit_assistant/data_loading_and_selection_cuts_skill.md ```
-
📋 Fix Sibson interpolation at internal edges — autoarray · large · supervised · high +
📋 Filed: 2026-11-05 (phase 2 of autolens_profiling#519; Pulse task PyAutoPulse/tasks/numba_num_threads_pin_and_delaunay_nn_remeasure.md steps 2-4) — autolens_profiling · small · medium ``` -Use the start-dev skill. draft/bug/autoarray/fix_sibson_interpolation_at_internal_edges.md +Use the start-dev skill. draft/feature/autolens_profiling/delaunay_nn_numba_optimal_remeasure_after_677.md ```
-
📋 Investigate Euclid Einstein-radius latent uncertainty collapse — autofit · too-large · supervised · high +
📋 Which other searches need prior-support handling — coverage audit after Prodigy — autofit · medium · safe · medium ``` -Use the start-dev skill. draft/bug/autofit/investigate_euclid_einstein_radius_latent_uncert.md +Use the start-dev skill. draft/feature/autofit/prior_exit_sampler_coverage.md ```
-
📋 Fix release result/sample parameter-path regressions — health_fixes · too-large · supervised · high +
📋 Give PyAutoFit searches a seed — today no search can be made… — autofit · medium · safe · medium ``` -Use the start-dev skill. draft/bug/health_fixes/samples_parameter_paths.md +Use the start-dev skill. draft/feature/autofit/search_seed_reproducibility.md ```
-
📋 Filed: 2026-11-05 (found by the autolens_profiling#519 worker-route witness) — autoarray · small · medium +
📋 COOLEST: export MGE lens light and pixelized sources as pixel grids — autolens · medium · supervised · medium ``` -Use the start-dev skill. draft/bug/autoarray/sibson_serial_kernel_loses_allocation_hoisting.md +Use the start-dev skill. draft/feature/autolens/coolest_pixel_grid_export.md ```
-
📋 Interferometer galaxy_image_dict drops a mixed galaxy's ordinary light (dict merge overwrites) — autogalaxy · small · supervised · medium +
📋 A dedicated Documentation conductor in PyAutoBrain — pyautobrain · medium · supervised · medium ``` -Use the start-dev skill. draft/bug/autogalaxy/galaxy_image_dict_mixed_galaxy_overwrites_ordinary_light.md +Use the start-dev skill. draft/feature/pyautobrain/docs_conductor.md ```
-
📋 Reverse-mode jax.grad of MGE deflections returns NaN when the profile centre lands… — autogalaxy · small · supervised · medium +
📋 Nightly run of one HowTo tutorial per chapter at real settings — pyautoheart · medium · supervised · medium ``` -Use the start-dev skill. draft/bug/autogalaxy/mge_deflections_reverse_mode_nan_at_grid_centre.md +Use the start-dev skill. draft/feature/pyautoheart/howto_real_settings_nightly.md ```
-
📋 imaging/features/pixelization/delaunay.py sits on the 300 s smoke cap… — autolens_workspace · small · safe · medium +
📋 Board phase 2: the remaining four legs onto the seam — pyautobrain · small · safe · normal ``` -Use the start-dev skill. draft/bug/autolens_workspace/delaunay_smoke_300s_cap.md +Use the start-dev skill. draft/feature/pyautobrain/board_without_gh_phase2_legs.md ```
-
📋 subhalo/sensitivity/slam_source_pixelized.py fails on main: al.MapperValued no longer exists — autolens_workspace · small · supervised · medium +
📋 Brain board follow-ups: what real mornings surface — pyautobrain · small · supervised · normal ``` -Use the start-dev skill. draft/bug/autolens_workspace/sensitivity_slam_source_pixelized_mappervalued.md +Use the start-dev skill. draft/feature/pyautobrain/brain_board_follow_ups.md ```
-
📋 Bundle stages 1/5/6 read OUTPUT_DIR, but the SED chain writes sersic_lens_model… — euclid · small · supervised · medium +
📋 bump_colab_urls.sh: cover autolens_assistant Colab links — pyautohands · small · safe · normal ``` -Use the start-dev skill. draft/bug/euclid/bundle_sersic_products_read_output_dir_not_sed_output_dir.md +Use the start-dev skill. draft/feature/pyautohands/bump_colab_urls_autolens_assistant.md ```
-
📋 vis_lp passes batch_size=50 to af.Nautilus, which has no such parameter — euclid · small · supervised · medium +
📋 Can create a list of InversionMatrix objects for each dataset — autoarray · medium · supervised · normal ``` -Use the start-dev skill. draft/bug/euclid/vis_lp_batch_size_kwarg_silently_ignored.md +Use the start-dev skill. draft/feature/autoarray/multiwavelength_inversion.md ```
-
📋 Profiling conductor compile drift compares one point against one point — pyautobrain · small · supervised · medium +
📋 A joint unit-disk constraint (or reparameterisation) for ell_comps — autogalaxy · medium · supervised · normal ``` -Use the start-dev skill. draft/bug/pyautobrain/profiling_compile_drift_point_vs_point.md +Use the start-dev skill. draft/feature/autogalaxy/ell_comps_joint_disk_constraint.md ```
-
📋 arxiv_refs.py swallows every API error, so an arXiv outage resolves nothing… — pyautomemory · small · supervised · medium +
📋 Tune cluster-scale JOSS benchmarks toward their 5-minute targets — autolens_workspace · medium · safe · normal ``` -Use the start-dev skill. draft/bug/pyautomemory/arxiv_refs_swallows_every_api_error_silently.md +Use the start-dev skill. draft/feature/autolens_workspace/joss_cluster_benchmark_tuning.md ```
-
📋 Adaptive Delaunay mesh places two mesh pixels 0.001" apart — a degenerate… — autoarray · medium · supervised · medium +
📋 Upstream the DR1 final-catalogue tooling to the pipeline, with a vis_lp-only appendix… — euclid · medium · supervised · normal ``` -Use the start-dev skill. draft/bug/autoarray/adaptive_mesh_degenerate_pixel_pair.md +Use the start-dev skill. draft/feature/euclid/upstream_dr1_final_catalogue_tooling.md ```
-
📋 Interferometer log_evidence fails (LinAlgError / NaN) at large regularization coefficients the jitted… — autoarray · medium · supervised · medium +
📋 batch slice — the decomposition pass for needs-slicing prompts — pyautobrain · medium · supervised · normal ``` -Use the start-dev skill. draft/bug/autoarray/interferometer_log_evidence_large_regularization_coefficient_cholesky.md +Use the start-dev skill. draft/feature/pyautobrain/batch_slice.md ```
-
📋 Sparse interferometer terms: NUFFT ignores the mask origin and provenance cannot see… — autoarray · medium · supervised · medium +
📋 The imaging features/advanced/los_halos example needs improving and padding out before — workspaces · medium · safe · normal ``` -Use the start-dev skill. draft/bug/autoarray/sparse_terms_nufft_origin_and_mask_compatibility.md +Use the start-dev skill. draft/feature/workspaces/group_los_halos.md ```
-
📋 Imaging sparse-operator path gives a very different log L from dense… — autoarray · medium · supervised · medium +
📋 The imaging features/advanced/subhalo/sensitivity example needs improving and padding out before — workspaces · medium · safe · normal ``` -Use the start-dev skill. draft/bug/autoarray/sparse_vs_dense_log_likelihood_mismatch_nonlinear_lens_light.md +Use the start-dev skill. draft/feature/workspaces/group_subhalo_sensitivity.md ```
-
📋 Cluster likelihood scripts: image-plane manual check disagrees with the library; point_0 truth… — autolens_workspace · medium · supervised · medium +
📋 EP analytic updates — implement the four planned work packages — autofit · large · supervised · normal ``` -Use the start-dev skill. draft/bug/autolens_workspace/cluster_likelihood_scripts_preexisting_mismatches.md +Use the start-dev skill. draft/feature/autofit/ep_analytic_updates.md ```
-
📋 imaging/start_here: 26-minute XLA compile of the 48-start Prodigy multi-start on CPU — autolens_workspace · medium · supervised · medium +
📋 Skip the likelihood for assertion-violating samples on the JAX path — autofit · large · supervised · normal ``` -Use the start-dev skill. draft/bug/autolens_workspace/start_here_multistart_compile_time.md +Use the start-dev skill. draft/feature/autofit/skip_the_likelihood_for_assertion_violating_samp.md ```
-
📋 Visualization warm-up swallowed for ellipse and point-source analyses — autofit · large · supervised · medium +
📋 Remote-MCP deployment tiers (2 + 3) for the results-inspector server — autofit_assistant · large · human-required · normal ``` -Use the start-dev skill. draft/bug/autofit/visualization_warmup_swallowed_exception.md +Use the start-dev skill. draft/feature/autofit_assistant/remote_mcp_deployment_tiers.md ```
-
📋 SimulatorImaging draws Poisson noise before checking add_poisson_noise_to_data — autoarray · low · safe · medium +
📋 Multi-plane time delays — autolens · large · supervised · normal ``` -Use the start-dev skill. draft/bug/autoarray/simulator_imaging_poisson_drawn_before_flag_check.md +Use the start-dev skill. draft/feature/autolens/multi_plane_time_delays.md ```
-
📋 Standard-size gradient cells record "point": "prior_medians" while evaluating at iid draw 0 — autolens_profiling · easy · supervised · medium +
📋 Adopt oversampled PSFs in the start-here dataset chain (option a) — autolens_workspace · large · supervised · normal ``` -Use the start-dev skill. draft/bug/autolens_profiling/gradient_json_point_label_standard_cells.md +Use the start-dev skill. draft/feature/autolens_workspace/oversampled_psf_dataset_adoption.md ```
-
📋 Glance shadow window reached 20/20 clean — count line must say "reached"… — pyautomind · easy · supervised · medium +
📋 Restore lensing-of-lens in the multiple_sources workspace example — workspaces · large · supervised · normal ``` -Use the start-dev skill. draft/bug/pyautomind/glance_shadow_window_reached.md +Use the start-dev skill. draft/feature/workspaces/restore_multiple_sources_lensing_of_lens.md ```
-
📋 rectangular.py parity contract: absolute-nats bound, and import autogalaxy before jax — workspaces · easy · supervised · medium +
📋 Follow-up to rectangular_adapt_cdf.md (issue #322) and Path A — autoarray · too-large · supervised · normal ``` -Use the start-dev skill. draft/bug/workspaces/rectangular_parity_absolute_bound_and_x64_import_order.md +Use the start-dev skill. draft/feature/autoarray/rectangular_multi_submesh.md ```
-
📋 Building a JAX Fitness then calling register_tracer_classes raises "Duplicate custom PyTreeDef type… — autoarray · small · supervised · normal +
📋 PIEMass.potential_2d_from: implement the missing lensing potential — autogalaxy · too-large · supervised · normal ``` -Use the start-dev skill. draft/bug/autoarray/galaxy_duplicate_pytree_registration_after_jax_fitness.md +Use the start-dev skill. draft/feature/autogalaxy/piemass_potential.md ```
-
📋 DatasetModel with a free grid_offset cannot round-trip autofit.jax.register_model — autofit · small · safe · normal +
📋 autolens_jax_joss benchmark repo + real-data start_here pairing — autolens_jax_joss · too-large · supervised · normal ``` -Use the start-dev skill. draft/bug/autofit/dataset_model_free_grid_offset_pytree_roundtrip.md +Use the start-dev skill. draft/feature/autolens_jax_joss/autolens_jax_joss_benchmark_repo.md ```
-
📋 Nautilus as an EP default_optimiser crashes on PriorFactors (reads analysis._use_jax unguarded) — autofit · small · safe · normal +
📋 Context: PyAutoLens issue #542 follow-up (Gap 1, deferred during the — jax_substructure · too-large · supervised · normal ``` -Use the start-dev skill. draft/bug/autofit/nautilus_ep_default_optimiser_reads_use_jax_unguarded.md +Use the start-dev skill. draft/feature/jax_substructure/5_prng_key_vmap_noise.md ```
-
📋 autofit: Samples.with_paths / without_paths break on factor-graph fits with shared priors — autofit · small · supervised · normal +
📋 Context: PyAutoLens issue #542 follow-up (Gap 2, deferred during the — jax_substructure · too-large · supervised · normal ``` -Use the start-dev skill. draft/bug/autofit/samples_with_paths_shared_prior_factor_graph.md +Use the start-dev skill. draft/feature/jax_substructure/6_deflection_equivalence_test.md ```
-
📋 Stale enable_pytrees register_model advice in NUTS and SMC errors and searches docs — autofit · small · safe · normal +
📋 dPIE: optional central-dispersion (sigma_0) parameterization — autogalaxy · small · supervised · low ``` -Use the start-dev skill. draft/bug/autofit/stale_enable_pytrees_register_model_advice_in.md +Use the start-dev skill. draft/feature/autogalaxy/dpie_sigma0_parameterization.md ```
-
📋 PlotterEllipse.fit_ellipse writes every variant to ellipse_fit.png, so only the last survives — autogalaxy · small · normal +
📋 PyAutoLens mirror of the interferometer primary-beam persistence (docstring + round-trip test) — autolens · small · safe · low ``` -Use the start-dev skill. draft/bug/autogalaxy/ellipse_plotter_fit_ellipse_overwrites.md +Use the start-dev skill. draft/feature/autolens/interferometer_primary_beam_persistence_mirror.md ```
-
📋 Move the positions_threshold test fixture off the symmetry axis — autolens · small · safe · normal +
📋 Release board: local run_logs enrichment — pyautohands · small · supervised · low ``` -Use the start-dev skill. draft/bug/autolens/positions_threshold_fixture_off_axis.md +Use the start-dev skill. draft/feature/pyautohands/release_board_run_logs_enrichment.md ```
-
📋 SLaM simultaneous subhalo grid search fits last band only — autolens_workspace · small · safe · normal +
📋 Gallery runner: add visualization_upper + decide the modeling_visualization_jit tier — workspaces · small · safe · low ``` -Use the start-dev skill. draft/bug/autolens_workspace/slam_simultaneous_subhalo_grid_search_fits_last.md +Use the start-dev skill. draft/feature/workspaces/gallery_runner_missing_tiers.md ```
-
📋 JAX_ENABLE_X64=False is overridden to True, so the fp32 inference leg runs fp64… — autonerves · small · supervised · normal +
📋 Animated logos for PyAutoGalaxy and PyAutoFit — pyautoscientist · medium · safe · low ``` -Use the start-dev skill. draft/bug/autonerves/jax_enable_x64_env_ignored_and_fp32_leg_runs_fp64.md +Use the start-dev skill. draft/feature/pyautoscientist/animated_logos_for_pyautogalaxy_and_pyautofit.md ```
-
📋 intake classify --file injects an unrelated Memory: line on organ-targeted prompts — pyautobrain · small · supervised · normal +
📋 Deferred: make the *Power adapt classes the defaults (breaking) — autoarray · large · human-required · low ``` -Use the start-dev skill. draft/bug/pyautobrain/intake_classify_file_drops_declared_epic_phase.md +Use the start-dev skill. draft/feature/autoarray/adapt_linear_default_flip.md ```
-
📋 Convolver "No blurring_image provided" warning in canonical workspace scripts — workspaces · small · safe · normal +
📋 LensTwin survey 01 — PyAutoLens and PyAutoGalaxy (read-only, 2026-10-28) — autolens ``` -Use the start-dev skill. draft/bug/workspaces/convolver_blurring_image_warning.md +Use the start-dev skill. draft/feature/autolens/lenstwin_epic_surveys/01_pyautolens_pyautogalaxy.md ```
-
📋 A non-uniform over_sample_size costs several times more JAX compile than a uniform… — autoarray · medium · supervised · normal +
📋 LensTwin survey 02 — autolens_assistant and autolens_workspace (read-only, 2026-10-28) — autolens ``` -Use the start-dev skill. draft/bug/autoarray/non_uniform_over_sample_jax_compile_cost.md +Use the start-dev skill. draft/feature/autolens/lenstwin_epic_surveys/02_assistant_workspace.md ```
-
📋 vmap(jit) likelihood recompiles once per distinct Nautilus batch length — autofit · medium · supervised · normal +
📋 Human-readable Cortex Projects dashboard — cortex ``` -Use the start-dev skill. draft/bug/autofit/vmap_jit_recompiles_per_nautilus_batch_length.md +Use the start-dev skill. draft/feature/cortex/human_readable_projects_dashboard.md ```
-
📋 LensCalc tangential caustic on a masked grid differs ~27 % in ellipticity… — autogalaxy · medium · supervised · normal +
📋 Cortex output summaries — phase 2 — cortex ``` -Use the start-dev skill. draft/bug/autogalaxy/lenscalc_masked_grid_caustic_differs_from_unmasked.md +Use the start-dev skill. draft/feature/cortex/output_summary.md ```
-
📋 JIT cache not hit in modeling_visualization delaunay/rectangular scripts — autolens · medium · safe · normal +
📋 Simplify reading-queue token management — pyautomemory ``` -Use the start-dev skill. draft/bug/autolens/jit_cache_not_hit_modeling_visualization.md +Use the start-dev skill. draft/feature/pyautomemory/reading-queue-token-management.md ```
-
📋 Profile multi_galaxy/start_here.py's release cost and retire its 3600s override — autolens_workspace · medium · supervised · normal - -``` -Use the start-dev skill. draft/bug/autolens_workspace/multi_galaxy_start_here_release_cost.md -``` -
-
📋 multi_dataset/jax_likelihood/delaunay.py asserts the wrong likelihood on main (−72070 vs 1995) — autolens_workspace_test · medium · supervised · normal - -``` -Use the start-dev skill. draft/bug/autolens_workspace_test/multi_dataset_jax_likelihood_delaunay_wrong_likelihood.md -``` - -
+
+bug — 62 -
📋 PyAutoNerves emits a false "workspace is stale, git pull" warning… — autonerves · medium · supervised · normal +
📋 test_latent_euclid_variables_traces_under_jax_jit went red on main: total_source_flux differs by 6% between jax.jit… — euclid · small · supervised · high ``` -Use the start-dev skill. draft/bug/autonerves/pyautonerves_emits_a_false_workspace_is_stale.md +Use the start-dev skill. draft/bug/euclid/latent_total_source_flux_jax_vs_numpy_regression.md ```
-
📋 CI timing must compare equivalent executed job coverage — health_fixes · medium · supervised · normal +
📋 SED chain waveband fit can spin forever in Nautilus exploration… — euclid · small · supervised · high ``` -Use the start-dev skill. draft/bug/health_fixes/ci_timing_execution_coverage.md +Use the start-dev skill. draft/bug/euclid/sed_chain_waveband_fit_can_spin_forever.md ```
-
📋 Heart Health rerun cannot publish after main advances — health_fixes · medium · supervised · normal +
📋 Fix KNN neighbor search for a partial final point block — autoarray · medium · supervised · high ``` -Use the start-dev skill. draft/bug/health_fixes/heart_health_rerun_stale_push.md +Use the start-dev skill. draft/bug/autoarray/fix_knn_neighbor_search_for_a_partial.md ```
-
📋 @PyAutoFit TransformedMessage.logpdf/pdf omit the transform Jacobian — priors · medium · supervised · normal +
📋 Sparse (w-tilde) inversion fits the unsubtracted image when a regular light profile… — autoarray · medium · supervised · high ``` -Use the start-dev skill. draft/bug/priors/15_transformed_message_logpdf_jacobian.md +Use the start-dev skill. draft/bug/autoarray/sparse_inversion_ignores_profile_subtracted_image.md ```
-
📋 MultiStartGradient searches ignore iterations_per_quick_update and live_visual_update while announcing the cadence… — autofit · large · supervised · normal +
📋 Fix Sibson interpolation at internal edges — autoarray · large · supervised · high ``` -Use the start-dev skill. draft/bug/autofit/multistartgradient_searches_ignore_iterations_pe.md +Use the start-dev skill. draft/bug/autoarray/fix_sibson_interpolation_at_internal_edges.md ```
-
📋 Resolve release-profile timeout scripts deliberately — health_fixes · too-large · supervised · normal +
📋 Investigate Euclid Einstein-radius latent uncertainty collapse — autofit · too-large · supervised · high ``` -Use the start-dev skill. draft/bug/health_fixes/release_timeout_policy.md +Use the start-dev skill. draft/bug/autofit/investigate_euclid_einstein_radius_latent_uncert.md ```
-
📋 @PyAutoFit Refactor: each density should live in one place, not three — priors · too-large · supervised · normal +
📋 Fix release result/sample parameter-path regressions — health_fixes · too-large · supervised · high ``` -Use the start-dev skill. draft/bug/priors/12_single_source_density_refactor.md +Use the start-dev skill. draft/bug/health_fixes/samples_parameter_paths.md ```
-
📋 @PyAutoFit Refactor: collapse the Prior / Message two-layer hierarchy — priors · too-large · supervised · normal +
📋 Filed: 2026-11-05 (found by the autolens_profiling#519 worker-route witness) — autoarray · small · medium ``` -Use the start-dev skill. draft/bug/priors/13_collapse_prior_and_message.md +Use the start-dev skill. draft/bug/autoarray/sibson_serial_kernel_loses_allocation_hoisting.md ```
-
📋 @PyAutoFit Refactor: replace hand-rolled AbstractDensityTransform with tfp.bijectors / numpyro.distributions.transforms — priors · too-large · supervised · normal +
📋 Interferometer galaxy_image_dict drops a mixed galaxy's ordinary light (dict merge overwrites) — autogalaxy · small · supervised · medium ``` -Use the start-dev skill. draft/bug/priors/14_replace_transform_stack_with_bijectors.md +Use the start-dev skill. draft/bug/autogalaxy/galaxy_image_dict_mixed_galaxy_overwrites_ordinary_light.md ```
-
📋 Priors & Messages cleanup — tracker — priors · too-large · supervised · normal +
📋 Reverse-mode jax.grad of MGE deflections returns NaN when the profile centre lands… — autogalaxy · small · supervised · medium ``` -Use the start-dev skill. draft/bug/priors/z_features.md +Use the start-dev skill. draft/bug/autogalaxy/mge_deflections_reverse_mode_nan_at_grid_centre.md ```
-
📋 Colab pins nautilus-sampler==1.0.4 while PyAutoFit declares 1.0.5 — autonerves · trivial · supervised · normal +
📋 imaging/features/pixelization/delaunay.py sits on the 300 s smoke cap… — autolens_workspace · small · safe · medium ``` -Use the start-dev skill. draft/bug/autonerves/nautilus_sampler_pin_drifts_from_pyautofit.md +Use the start-dev skill. draft/bug/autolens_workspace/delaunay_smoke_300s_cap.md ```
-
📋 sub_slim_indexes_for_pix_index appends -1 row padding to the last pixel's list — autoarray · small · supervised · low +
📋 subhalo/sensitivity/slam_source_pixelized.py fails on main: al.MapperValued no longer exists — autolens_workspace · small · supervised · medium ``` -Use the start-dev skill. draft/bug/autoarray/sub_slim_indexes_for_pix_index_padding.md +Use the start-dev skill. draft/bug/autolens_workspace/sensitivity_slam_source_pixelized_mappervalued.md ```
-
📋 Aggregator reload of an in-memory sparse-operator interferometer fit silently falls back… — autogalaxy · small · supervised · low +
📋 Bundle stages 1/5/6 read OUTPUT_DIR, but the SED chain writes sersic_lens_model… — euclid · small · supervised · medium ``` -Use the start-dev skill. draft/bug/autogalaxy/aggregator_reload_drops_sparse_operator.md +Use the start-dev skill. draft/bug/euclid/bundle_sersic_products_read_output_dir_not_sed_output_dir.md ```
-
📋 Database-path searches cannot reload dataset.fits (written to disk, never registered via save_fits) — autogalaxy · small · supervised · low +
📋 vis_lp passes batch_size=50 to af.Nautilus, which has no such parameter — euclid · small · supervised · medium ``` -Use the start-dev skill. draft/bug/autogalaxy/database_paths_dataset_fits_not_registered.md +Use the start-dev skill. draft/bug/euclid/vis_lp_batch_size_kwarg_silently_ignored.md ```
-
📋 @autolens_profiling stale auto-simulated dataset/cluster/simple is never regenerated — autolens_profiling · small · supervised · low +
📋 Profiling conductor compile drift compares one point against one point — pyautobrain · small · supervised · medium ``` -Use the start-dev skill. draft/bug/autolens_profiling/stale_auto_simulated_cluster_dataset.md +Use the start-dev skill. draft/bug/pyautobrain/profiling_compile_drift_point_vs_point.md ```
-
📋 The reconstruction noise map is not the truncated posterior the NNLS solve… — autoarray · medium · human-required · low +
📋 Adaptive Delaunay mesh places two mesh pixels 0.001" apart — a degenerate… — autoarray · medium · supervised · medium ``` -Use the start-dev skill. draft/bug/autoarray/reconstruction_noise_map_truncated_posterior.md +Use the start-dev skill. draft/bug/autoarray/adaptive_mesh_degenerate_pixel_pair.md ```
-
📋 Point-source JSON datasets record no resolution regime — pyautolens · medium · supervised · low +
📋 Interferometer log_evidence fails (LinAlgError / NaN) at large regularization coefficients the jitted… — autoarray · medium · supervised · medium ``` -Use the start-dev skill. draft/bug/pyautolens/point_source_json_datasets_record_no_regime.md +Use the start-dev skill. draft/bug/autoarray/interferometer_log_evidence_large_regularization_coefficient_cholesky.md ```
-
📋 repos_sync standards-block test keys on the checkout dir name… — pyautomind · easy · safe-capped · low +
📋 Sparse interferometer terms: NUFFT ignores the mask origin and provenance cannot see… — autoarray · medium · supervised · medium ``` -Use the start-dev skill. draft/bug/pyautomind/repos_sync_test_keys_on_dir_name.md +Use the start-dev skill. draft/bug/autoarray/sparse_terms_nufft_origin_and_mask_compatibility.md ```
-
📋 Same-class q-clamp and bare-sqrt ellipticity gradient sites (follow-up to PyAutoGalaxy#631) — autogalaxy +
📋 Imaging sparse-operator path gives a very different log L from dense… — autoarray · medium · supervised · medium ``` -Use the start-dev skill. draft/bug/autogalaxy/q_clamp_and_bare_sqrt_ellipticity_grad_sweep.md +Use the start-dev skill. draft/bug/autoarray/sparse_vs_dense_log_likelihood_mismatch_nonlinear_lens_light.md ```
-
📋 autolens_workspace point_source/plot.py crashes: residual_map (4,2) vs (5,2) broadcast; the model solves 5… — autolens · human-required +
📋 Cluster likelihood scripts: image-plane manual check disagrees with the library; point_0 truth… — autolens_workspace · medium · supervised · medium ``` -Use the start-dev skill. draft/bug/autolens/point_source_plot_script_residual_shape_mismatch.md +Use the start-dev skill. draft/bug/autolens_workspace/cluster_likelihood_scripts_preexisting_mismatches.md ```
-
📋 euclid_dr1: every dataset rgb.jpg is upside down relative to the VIS FITS… — euclid · supervised +
📋 imaging/start_here: 26-minute XLA compile of the 48-start Prodigy multi-start on CPU — autolens_workspace · medium · supervised · medium ``` -Use the start-dev skill. draft/bug/euclid/euclid_dr1_flip_rgb_jpg_upside_down.md +Use the start-dev skill. draft/bug/autolens_workspace/start_here_multistart_compile_time.md ```
-
- -
-feature — 41 - -
📋 Eyes cluster visualization group: render every cluster/point-source figure for PyAutoEyes — autolens_visualization · large · supervised · high +
📋 Visualization warm-up swallowed for ellipse and point-source analyses — autofit · large · supervised · medium ``` -Use the start-dev skill. draft/feature/autolens_visualization/eyes_cluster_visualization_group_render_every_cl.md +Use the start-dev skill. draft/bug/autofit/visualization_warmup_swallowed_exception.md ```
-
📋 Inversion.source_clumps_from needs a robust scale — thresholding against the raw maximum finds… — autoarray · small · supervised · medium +
📋 SimulatorImaging draws Poisson noise before checking add_poisson_noise_to_data — autoarray · low · safe · medium ``` -Use the start-dev skill. draft/feature/autoarray/source_clumps_robust_scale.md +Use the start-dev skill. draft/bug/autoarray/simulator_imaging_poisson_drawn_before_flag_check.md ```
-
📋 autofit_assistant: a skill that owns loading the user's data and its selection… — autofit_assistant · small · safe · medium +
📋 Standard-size gradient cells record "point": "prior_medians" while evaluating at iid draw 0 — autolens_profiling · easy · supervised · medium ``` -Use the start-dev skill. draft/feature/autofit_assistant/data_loading_and_selection_cuts_skill.md +Use the start-dev skill. draft/bug/autolens_profiling/gradient_json_point_label_standard_cells.md ```
-
📋 Filed: 2026-11-05 (phase 2 of autolens_profiling#519; Pulse task PyAutoPulse/tasks/numba_num_threads_pin_and_delaunay_nn_remeasure.md steps 2-4) — autolens_profiling · small · medium +
📋 rectangular.py parity contract: absolute-nats bound, and import autogalaxy before jax — workspaces · easy · supervised · medium ``` -Use the start-dev skill. draft/feature/autolens_profiling/delaunay_nn_numba_optimal_remeasure_after_677.md +Use the start-dev skill. draft/bug/workspaces/rectangular_parity_absolute_bound_and_x64_import_order.md ```
-
📋 Which other searches need prior-support handling — coverage audit after Prodigy — autofit · medium · safe · medium +
📋 Building a JAX Fitness then calling register_tracer_classes raises "Duplicate custom PyTreeDef type… — autoarray · small · supervised · normal ``` -Use the start-dev skill. draft/feature/autofit/prior_exit_sampler_coverage.md +Use the start-dev skill. draft/bug/autoarray/galaxy_duplicate_pytree_registration_after_jax_fitness.md ```
-
📋 Give PyAutoFit searches a seed — today no search can be made… — autofit · medium · safe · medium +
📋 DatasetModel with a free grid_offset cannot round-trip autofit.jax.register_model — autofit · small · safe · normal ``` -Use the start-dev skill. draft/feature/autofit/search_seed_reproducibility.md +Use the start-dev skill. draft/bug/autofit/dataset_model_free_grid_offset_pytree_roundtrip.md ```
-
📋 COOLEST: export MGE lens light and pixelized sources as pixel grids — autolens · medium · supervised · medium +
📋 Nautilus as an EP default_optimiser crashes on PriorFactors (reads analysis._use_jax unguarded) — autofit · small · safe · normal ``` -Use the start-dev skill. draft/feature/autolens/coolest_pixel_grid_export.md +Use the start-dev skill. draft/bug/autofit/nautilus_ep_default_optimiser_reads_use_jax_unguarded.md ```
-
📋 A dedicated Documentation conductor in PyAutoBrain — pyautobrain · medium · supervised · medium +
📋 autofit: Samples.with_paths / without_paths break on factor-graph fits with shared priors — autofit · small · supervised · normal ``` -Use the start-dev skill. draft/feature/pyautobrain/docs_conductor.md +Use the start-dev skill. draft/bug/autofit/samples_with_paths_shared_prior_factor_graph.md ```
-
📋 Nightly run of one HowTo tutorial per chapter at real settings — pyautoheart · medium · supervised · medium +
📋 Stale enable_pytrees register_model advice in NUTS and SMC errors and searches docs — autofit · small · safe · normal ``` -Use the start-dev skill. draft/feature/pyautoheart/howto_real_settings_nightly.md +Use the start-dev skill. draft/bug/autofit/stale_enable_pytrees_register_model_advice_in.md ```
-
📋 Board phase 2: the remaining four legs onto the seam — pyautobrain · small · safe · normal +
📋 PlotterEllipse.fit_ellipse writes every variant to ellipse_fit.png, so only the last survives — autogalaxy · small · normal ``` -Use the start-dev skill. draft/feature/pyautobrain/board_without_gh_phase2_legs.md +Use the start-dev skill. draft/bug/autogalaxy/ellipse_plotter_fit_ellipse_overwrites.md ```
-
📋 Brain board follow-ups: what real mornings surface — pyautobrain · small · supervised · normal +
📋 Move the positions_threshold test fixture off the symmetry axis — autolens · small · safe · normal ``` -Use the start-dev skill. draft/feature/pyautobrain/brain_board_follow_ups.md +Use the start-dev skill. draft/bug/autolens/positions_threshold_fixture_off_axis.md ```
-
📋 bump_colab_urls.sh: cover autolens_assistant Colab links — pyautohands · small · safe · normal +
📋 SLaM simultaneous subhalo grid search fits last band only — autolens_workspace · small · safe · normal ``` -Use the start-dev skill. draft/feature/pyautohands/bump_colab_urls_autolens_assistant.md +Use the start-dev skill. draft/bug/autolens_workspace/slam_simultaneous_subhalo_grid_search_fits_last.md ```
-
📋 Can create a list of InversionMatrix objects for each dataset — autoarray · medium · supervised · normal +
📋 JAX_ENABLE_X64=False is overridden to True, so the fp32 inference leg runs fp64… — autonerves · small · supervised · normal ``` -Use the start-dev skill. draft/feature/autoarray/multiwavelength_inversion.md +Use the start-dev skill. draft/bug/autonerves/jax_enable_x64_env_ignored_and_fp32_leg_runs_fp64.md ```
-
📋 A joint unit-disk constraint (or reparameterisation) for ell_comps — autogalaxy · medium · supervised · normal +
📋 intake classify --file injects an unrelated Memory: line on organ-targeted prompts — pyautobrain · small · supervised · normal ``` -Use the start-dev skill. draft/feature/autogalaxy/ell_comps_joint_disk_constraint.md +Use the start-dev skill. draft/bug/pyautobrain/intake_classify_file_drops_declared_epic_phase.md ```
-
📋 Tune cluster-scale JOSS benchmarks toward their 5-minute targets — autolens_workspace · medium · safe · normal +
📋 Convolver "No blurring_image provided" warning in canonical workspace scripts — workspaces · small · safe · normal ``` -Use the start-dev skill. draft/feature/autolens_workspace/joss_cluster_benchmark_tuning.md +Use the start-dev skill. draft/bug/workspaces/convolver_blurring_image_warning.md ```
-
📋 Upstream the DR1 final-catalogue tooling to the pipeline, with a vis_lp-only appendix… — euclid · medium · supervised · normal +
📋 A non-uniform over_sample_size costs several times more JAX compile than a uniform… — autoarray · medium · supervised · normal ``` -Use the start-dev skill. draft/feature/euclid/upstream_dr1_final_catalogue_tooling.md +Use the start-dev skill. draft/bug/autoarray/non_uniform_over_sample_jax_compile_cost.md ```
-
📋 batch slice — the decomposition pass for needs-slicing prompts — pyautobrain · medium · supervised · normal +
📋 vmap(jit) likelihood recompiles once per distinct Nautilus batch length — autofit · medium · supervised · normal ``` -Use the start-dev skill. draft/feature/pyautobrain/batch_slice.md +Use the start-dev skill. draft/bug/autofit/vmap_jit_recompiles_per_nautilus_batch_length.md ```
-
📋 The imaging features/advanced/los_halos example needs improving and padding out before — workspaces · medium · safe · normal +
📋 LensCalc tangential caustic on a masked grid differs ~27 % in ellipticity… — autogalaxy · medium · supervised · normal ``` -Use the start-dev skill. draft/feature/workspaces/group_los_halos.md +Use the start-dev skill. draft/bug/autogalaxy/lenscalc_masked_grid_caustic_differs_from_unmasked.md ```
-
📋 The imaging features/advanced/subhalo/sensitivity example needs improving and padding out before — workspaces · medium · safe · normal +
📋 JIT cache not hit in modeling_visualization delaunay/rectangular scripts — autolens · medium · safe · normal ``` -Use the start-dev skill. draft/feature/workspaces/group_subhalo_sensitivity.md +Use the start-dev skill. draft/bug/autolens/jit_cache_not_hit_modeling_visualization.md ```
-
📋 EP analytic updates — implement the four planned work packages — autofit · large · supervised · normal +
📋 Profile multi_galaxy/start_here.py's release cost and retire its 3600s override — autolens_workspace · medium · supervised · normal ``` -Use the start-dev skill. draft/feature/autofit/ep_analytic_updates.md +Use the start-dev skill. draft/bug/autolens_workspace/multi_galaxy_start_here_release_cost.md ```
-
📋 Skip the likelihood for assertion-violating samples on the JAX path — autofit · large · supervised · normal +
📋 multi_dataset/jax_likelihood/delaunay.py asserts the wrong likelihood on main (−72070 vs 1995) — autolens_workspace_test · medium · supervised · normal ``` -Use the start-dev skill. draft/feature/autofit/skip_the_likelihood_for_assertion_violating_samp.md +Use the start-dev skill. draft/bug/autolens_workspace_test/multi_dataset_jax_likelihood_delaunay_wrong_likelihood.md ```
-
📋 Remote-MCP deployment tiers (2 + 3) for the results-inspector server — autofit_assistant · large · human-required · normal +
📋 PyAutoNerves emits a false "workspace is stale, git pull" warning… — autonerves · medium · supervised · normal ``` -Use the start-dev skill. draft/feature/autofit_assistant/remote_mcp_deployment_tiers.md +Use the start-dev skill. draft/bug/autonerves/pyautonerves_emits_a_false_workspace_is_stale.md ```
-
📋 Multi-plane time delays — autolens · large · supervised · normal +
📋 CI timing must compare equivalent executed job coverage — health_fixes · medium · supervised · normal ``` -Use the start-dev skill. draft/feature/autolens/multi_plane_time_delays.md +Use the start-dev skill. draft/bug/health_fixes/ci_timing_execution_coverage.md ```
-
📋 Adopt oversampled PSFs in the start-here dataset chain (option a) — autolens_workspace · large · supervised · normal +
📋 Heart Health rerun cannot publish after main advances — health_fixes · medium · supervised · normal ``` -Use the start-dev skill. draft/feature/autolens_workspace/oversampled_psf_dataset_adoption.md +Use the start-dev skill. draft/bug/health_fixes/heart_health_rerun_stale_push.md ```
-
📋 Restore lensing-of-lens in the multiple_sources workspace example — workspaces · large · supervised · normal +
📋 @PyAutoFit TransformedMessage.logpdf/pdf omit the transform Jacobian — priors · medium · supervised · normal ``` -Use the start-dev skill. draft/feature/workspaces/restore_multiple_sources_lensing_of_lens.md +Use the start-dev skill. draft/bug/priors/15_transformed_message_logpdf_jacobian.md ```
-
📋 Follow-up to rectangular_adapt_cdf.md (issue #322) and Path A — autoarray · too-large · supervised · normal +
📋 MultiStartGradient searches ignore iterations_per_quick_update and live_visual_update while announcing the cadence… — autofit · large · supervised · normal ``` -Use the start-dev skill. draft/feature/autoarray/rectangular_multi_submesh.md +Use the start-dev skill. draft/bug/autofit/multistartgradient_searches_ignore_iterations_pe.md ```
-
📋 PIEMass.potential_2d_from: implement the missing lensing potential — autogalaxy · too-large · supervised · normal +
📋 Resolve release-profile timeout scripts deliberately — health_fixes · too-large · supervised · normal ``` -Use the start-dev skill. draft/feature/autogalaxy/piemass_potential.md +Use the start-dev skill. draft/bug/health_fixes/release_timeout_policy.md ```
-
📋 autolens_jax_joss benchmark repo + real-data start_here pairing — autolens_jax_joss · too-large · supervised · normal +
📋 @PyAutoFit Refactor: each density should live in one place, not three — priors · too-large · supervised · normal ``` -Use the start-dev skill. draft/feature/autolens_jax_joss/autolens_jax_joss_benchmark_repo.md +Use the start-dev skill. draft/bug/priors/12_single_source_density_refactor.md ```
-
📋 Context: PyAutoLens issue #542 follow-up (Gap 1, deferred during the — jax_substructure · too-large · supervised · normal +
📋 @PyAutoFit Refactor: collapse the Prior / Message two-layer hierarchy — priors · too-large · supervised · normal ``` -Use the start-dev skill. draft/feature/jax_substructure/5_prng_key_vmap_noise.md +Use the start-dev skill. draft/bug/priors/13_collapse_prior_and_message.md ```
-
📋 Context: PyAutoLens issue #542 follow-up (Gap 2, deferred during the — jax_substructure · too-large · supervised · normal +
📋 @PyAutoFit Refactor: replace hand-rolled AbstractDensityTransform with tfp.bijectors / numpyro.distributions.transforms — priors · too-large · supervised · normal ``` -Use the start-dev skill. draft/feature/jax_substructure/6_deflection_equivalence_test.md +Use the start-dev skill. draft/bug/priors/14_replace_transform_stack_with_bijectors.md ```
-
📋 dPIE: optional central-dispersion (sigma_0) parameterization — autogalaxy · small · supervised · low +
📋 Priors & Messages cleanup — tracker — priors · too-large · supervised · normal ``` -Use the start-dev skill. draft/feature/autogalaxy/dpie_sigma0_parameterization.md +Use the start-dev skill. draft/bug/priors/z_features.md ```
-
📋 PyAutoLens mirror of the interferometer primary-beam persistence (docstring + round-trip test) — autolens · small · safe · low +
📋 Colab pins nautilus-sampler==1.0.4 while PyAutoFit declares 1.0.5 — autonerves · trivial · supervised · normal ``` -Use the start-dev skill. draft/feature/autolens/interferometer_primary_beam_persistence_mirror.md +Use the start-dev skill. draft/bug/autonerves/nautilus_sampler_pin_drifts_from_pyautofit.md ```
-
📋 Release board: local run_logs enrichment — pyautohands · small · supervised · low +
📋 sub_slim_indexes_for_pix_index appends -1 row padding to the last pixel's list — autoarray · small · supervised · low ``` -Use the start-dev skill. draft/feature/pyautohands/release_board_run_logs_enrichment.md +Use the start-dev skill. draft/bug/autoarray/sub_slim_indexes_for_pix_index_padding.md ```
-
📋 Gallery runner: add visualization_upper + decide the modeling_visualization_jit tier — workspaces · small · safe · low +
📋 Aggregator reload of an in-memory sparse-operator interferometer fit silently falls back… — autogalaxy · small · supervised · low ``` -Use the start-dev skill. draft/feature/workspaces/gallery_runner_missing_tiers.md +Use the start-dev skill. draft/bug/autogalaxy/aggregator_reload_drops_sparse_operator.md ```
-
📋 Animated logos for PyAutoGalaxy and PyAutoFit — pyautoscientist · medium · safe · low +
📋 Database-path searches cannot reload dataset.fits (written to disk, never registered via save_fits) — autogalaxy · small · supervised · low ``` -Use the start-dev skill. draft/feature/pyautoscientist/animated_logos_for_pyautogalaxy_and_pyautofit.md +Use the start-dev skill. draft/bug/autogalaxy/database_paths_dataset_fits_not_registered.md ```
-
📋 Deferred: make the *Power adapt classes the defaults (breaking) — autoarray · large · human-required · low +
📋 @autolens_profiling stale auto-simulated dataset/cluster/simple is never regenerated — autolens_profiling · small · supervised · low ``` -Use the start-dev skill. draft/feature/autoarray/adapt_linear_default_flip.md +Use the start-dev skill. draft/bug/autolens_profiling/stale_auto_simulated_cluster_dataset.md ```
-
📋 LensTwin survey 01 — PyAutoLens and PyAutoGalaxy (read-only, 2026-10-28) — autolens +
📋 The reconstruction noise map is not the truncated posterior the NNLS solve… — autoarray · medium · human-required · low ``` -Use the start-dev skill. draft/feature/autolens/lenstwin_epic_surveys/01_pyautolens_pyautogalaxy.md +Use the start-dev skill. draft/bug/autoarray/reconstruction_noise_map_truncated_posterior.md ```
-
📋 LensTwin survey 02 — autolens_assistant and autolens_workspace (read-only, 2026-10-28) — autolens +
📋 Point-source JSON datasets record no resolution regime — pyautolens · medium · supervised · low ``` -Use the start-dev skill. draft/feature/autolens/lenstwin_epic_surveys/02_assistant_workspace.md +Use the start-dev skill. draft/bug/pyautolens/point_source_json_datasets_record_no_regime.md ```
-
📋 Human-readable Cortex Projects dashboard — cortex +
📋 Same-class q-clamp and bare-sqrt ellipticity gradient sites (follow-up to PyAutoGalaxy#631) — autogalaxy ``` -Use the start-dev skill. draft/feature/cortex/human_readable_projects_dashboard.md +Use the start-dev skill. draft/bug/autogalaxy/q_clamp_and_bare_sqrt_ellipticity_grad_sweep.md ```
-
📋 Cortex output summaries — phase 2 — cortex +
📋 autolens_workspace point_source/plot.py crashes: residual_map (4,2) vs (5,2) broadcast; the model solves 5… — autolens · human-required ``` -Use the start-dev skill. draft/feature/cortex/output_summary.md +Use the start-dev skill. draft/bug/autolens/point_source_plot_script_residual_shape_mismatch.md ```
-
📋 Simplify reading-queue token management — pyautomemory +
📋 euclid_dr1: every dataset rgb.jpg is upside down relative to the VIS FITS… — euclid · supervised ``` -Use the start-dev skill. draft/feature/pyautomemory/reading-queue-token-management.md +Use the start-dev skill. draft/bug/euclid/euclid_dr1_flip_rgb_jpg_upside_down.md ```
@@ -2945,7 +2913,7 @@ Use the start-dev skill. draft/refactor/autolens/witt_wynne_solver_library_home.
-
📋 Deduplicate repos_sync.py's check/write pairs — pyautomind · medium · supervised · low +
📋 Deduplicate repos_sync.py's check/write pairs — pyautomind · large · supervised · low ``` Use the start-dev skill. draft/refactor/pyautomind/repos_sync_check_dedup.md @@ -3101,14 +3069,12 @@ Use the start-dev skill. draft/triage/autolens/jit_fit_from_is_vacuous.md | 2026-10-21 | issued | Matrix-free interferometer inversion for very large rectangular… | | 2026-10-21 | filed | Interferometer primary beam: workspace example and docs | | 2026-10-21 | filed | Cluster likelihood scripts: image-plane manual check disagrees with… | -| 2026-10-16 | filed | repos_sync standards-block test keys on the checkout dir name… | +| 2026-10-16 | filed | Re-measure the shapelets/modeling.py SLOW park (#586) under the… |
… 10 more (20 left) | Date | Event | Task | |------|-------|------| -| 2026-10-16 | filed | Re-measure the shapelets/modeling.py SLOW park (#586) under the… | -| 2026-10-16 | filed | Glance shadow window reached 20/20 clean — count line must say… | | 2026-10-14 | filed | @autofit_workspace six searches/ scripts fail on main at… | | 2026-10-14 | filed | Human-readable Cortex Projects dashboard | | 2026-10-14 | filed | Cortex output summaries — phase 2 | @@ -3117,13 +3083,13 @@ Use the start-dev skill. draft/triage/autolens/jit_fit_from_is_vacuous.md | 2026-10-07 | filed | Upstream the DR1 final-catalogue tooling to the pipeline, with a… | | 2026-10-02 | filed | sibson-internal-edge-continuity | | 2026-10-02 | filed | knn-partial-point-block | +| 2026-10-02 | filed | Fix Sibson interpolation at internal edges | +| 2026-10-02 | filed | Fix KNN neighbor search for a partial final point block |
… 10 more (10 left) | Date | Event | Task | |------|-------|------| -| 2026-10-02 | filed | Fix Sibson interpolation at internal edges | -| 2026-10-02 | filed | Fix KNN neighbor search for a partial final point block | | 2026-10-01 | filed | Sparse interferometer terms: NUFFT ignores the mask origin and… | | 2026-10-01 | filed | Interferometer log_evidence fails (LinAlgError / NaN) at large… | | 2026-10-01 | filed | Interferometer galaxy_image_dict drops a mixed galaxy's ordinary… | @@ -3132,6 +3098,8 @@ Use the start-dev skill. draft/triage/autolens/jit_fit_from_is_vacuous.md | 2026-09-27 | filed | Sparse interferometer inversion: jax.grad of the log-evidence terms… | | 2026-09-27 | filed | Same-class q-clamp and bare-sqrt ellipticity gradient sites… | | 2026-09-27 | filed | Building a JAX Fitness then calling register_tracer_classes raises… | +| 2026-09-26 | filed | bump_colab_urls.sh: cover autolens_assistant Colab links | +| 2026-09-26 | filed | Repo cleanup: retire the Abell 1201 worktree and local raw data |
@@ -3233,7 +3201,7 @@ _Dates come from each task's registry entry — `lifecycle.py dates` reports any
-69 prompt(s) with unknown theme keyword(s) — not in [`themes.md`](themes.md), so they group loudly rather than silently. Correct the prompt, or add the keyword to the vocabulary. +67 prompt(s) with unknown theme keyword(s) — not in [`themes.md`](themes.md), so they group loudly rather than silently. Correct the prompt, or add the keyword to the vocabulary.
Unknown theme keywords @@ -3288,8 +3256,6 @@ _Dates come from each task's registry entry — `lifecycle.py dates` reports any - `draft/bug/euclid/vis_lp_batch_size_kwarg_silently_ignored.md — unknown theme keyword(s): euclid` - `draft/bug/pyautobrain/profiling_compile_drift_point_vs_point.md — unknown theme keyword(s): measurement-tools` - `draft/bug/pyautoheart/ral_venv_dependency_floor_drift.md — unknown theme keyword(s): hpc, dependencies, reproducibility` -- `draft/bug/pyautomemory/arxiv_refs_swallows_every_api_error_silently.md — unknown theme keyword(s): ci, robustness` -- `draft/bug/pyautomind/arxiv_edge_refuses_the_stdlib_urllib_client.md — unknown theme keyword(s): ci, robustness` - `draft/refactor/autofit/ep_analysis_level_compile_cache.md — unknown theme keyword(s): jax` - `draft/refactor/autolens/cache_readers_fall_back_to_zip_member.md — unknown theme keyword(s): aggregator, paths` - `draft/refactor/autolens/witt_wynne_solver_library_home.md — unknown theme keyword(s): euclid` diff --git a/draft/refactor/pyautomind/repos_sync_check_dedup.md b/draft/refactor/pyautomind/repos_sync_check_dedup.md index 6929722fd..33d709919 100644 --- a/draft/refactor/pyautomind/repos_sync_check_dedup.md +++ b/draft/refactor/pyautomind/repos_sync_check_dedup.md @@ -7,14 +7,14 @@ Repos: Themes: - mind-workflow - hygiene -Difficulty: medium +Difficulty: large Autonomy: supervised Priority: low Status: formalised Consequence: notify Witness: `repos_sync.py` has one declaration per generated surface driving both `check` and `--write`; every CLI flag's output is byte-identical before and after (captured in a test); `tests/test_repos_sync_hygiene_coverage.py` and the firewall_gate.yml legs pass. Review-minutes: 0 -Unattended: ready +Unattended: never Filed: 2026-08-19 (backfilled from git) Found by the 2026-08-19 readability-pass census (#248). Behaviour-preserving @@ -31,3 +31,19 @@ surface means one new declaration instead of a new function plus a new call site. All existing CLI flags and outputs stay byte-identical; `tests/test_repos_sync_hygiene_coverage.py` and the firewall_gate.yml legs are the safety net. + +## Re-sized 2026-11-05 (queue check-in) — needs a human design call before start + +The premise has moved: `scripts/repos_sync.py` is now 3204 lines (was 940), with +23 check legs. The `--write` leg is no longer a set of uniform `write_block` +pairs: it carries mode gates (`codex_only_write`, `smoke_only_write`, +`standards_only_write`, the held smoke rollout), self-installing marker +insertion (`insert_deliverable_markers`, `write_filing_blocks`) whose ordering +matters, and standards pre-validation that must run before any writer. A +one-`Check`-dataclass collapse therefore has to model write ordering and +mode-exclusive writers — a design fork, not a mechanical dedup. + +Options for the human: (a) narrow to the uniform subset only — the five +`AGENTS.md` marker blocks (map/history/remote/deliverable/filing) plus public +tables — as one declaration table, leaving special writers explicit; (b) keep +the full refactor, re-sized large, phased; (c) park it. Recommendation: (a). diff --git a/state.json b/state.json index acd7b09d9..59fcec58a 100644 --- a/state.json +++ b/state.json @@ -4,7 +4,7 @@ "repo": "PyAutoMind", "status": "yellow", "headline": "YELLOW \u2014 24 picks \u00b7 8 in flight", - "updated": "2026-11-05T17:43:14Z", + "updated": "2026-11-05T18:55:50Z", "pages_url": "https://pyautolabs.github.io/PyAutoMind/", "items": [ { @@ -61,12 +61,6 @@ "url": "https://github.com/PyAutoLabs/PyAutoMind/blob/main/draft/bug/euclid/sed_chain_waveband_fit_can_spin_forever.md", "prompt": "Use the start-dev skill. draft/bug/euclid/sed_chain_waveband_fit_can_spin_forever.md" }, - { - "severity": "info", - "text": "pick: arXiv's Fastly edge refuses `urllib.request` outright \u2014 retrying a 406 only delays\u2026", - "url": "https://github.com/PyAutoLabs/PyAutoMind/blob/main/draft/bug/pyautomind/arxiv_edge_refuses_the_stdlib_urllib_client.md", - "prompt": "Use the start-dev skill. draft/bug/pyautomind/arxiv_edge_refuses_the_stdlib_urllib_client.md" - }, { "severity": "info", "text": "pick: Fix KNN neighbor search for a partial final point block", @@ -115,6 +109,12 @@ "url": "https://github.com/PyAutoLabs/PyAutoMind/blob/main/draft/research/euclid/euclid_dr1_positions_gate_remodel_run.md", "prompt": "Use the start-dev skill. draft/research/euclid/euclid_dr1_positions_gate_remodel_run.md" }, + { + "severity": "info", + "text": "pick: Deep research: Can we speed up Delaunay in PyAutoArray?", + "url": "https://github.com/PyAutoLabs/PyAutoMind/blob/main/draft/research/autoarray/delaunay_research.md", + "prompt": "Use the start-dev skill. draft/research/autoarray/delaunay_research.md" + }, { "severity": "info", "text": "pick: Guard every workspace script against untimed network downloads", From bd38878bcef975208fbf33863eb3b3e44545913d Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 5 Nov 2026 18:57:25 +0000 Subject: [PATCH 2/9] close: intake-memory-line-organ-targets (already shipped, Brain 557f8e0/ba38413); note compile-drift option (a) on branch Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_016nhQ8MZyNga1wamBmFdfAK --- .../11/intake-memory-line-organ-targets.md | 6 +++++ complete/index.md | 3 ++- dashboard.html | 27 +++++++++---------- dashboard.md | 26 +++++++----------- .../profiling_compile_drift_point_vs_point.md | 16 +++++++++++ state.json | 2 +- 6 files changed, 47 insertions(+), 33 deletions(-) rename draft/bug/pyautobrain/intake_classify_file_drops_declared_epic_phase.md => complete/2026/11/intake-memory-line-organ-targets.md (80%) diff --git a/draft/bug/pyautobrain/intake_classify_file_drops_declared_epic_phase.md b/complete/2026/11/intake-memory-line-organ-targets.md similarity index 80% rename from draft/bug/pyautobrain/intake_classify_file_drops_declared_epic_phase.md rename to complete/2026/11/intake-memory-line-organ-targets.md index 89754e293..b412d61d0 100644 --- a/draft/bug/pyautobrain/intake_classify_file_drops_declared_epic_phase.md +++ b/complete/2026/11/intake-memory-line-organ-targets.md @@ -1,3 +1,9 @@ +- summary: already shipped — closed as stale draft. The `_with_memory` gate in `agents/conductors/intake/_intake.py` landed in PyAutoBrain 557f8e0 and ba38413: organ targets get no `Memory:` line. The organ set comes from `PyAutoMind/repos.yaml` (`_sizing.ORGANISM_REPOS` = `category: organ`, plus `_intake._ORGANS_DIR_REPOS` for repos under `organs/`, which covers PyAutoScientist). `Target:` is normalised by `_sizing.normalise_repo` (case, leading `@`, path suffix). +- witness: PyAutoBrain branch `ccr-f98d2a4d-92r7rv` commit 906b5dd adds `test_organ_target_spellings_get_no_memory_line` (organ spellings `pyautobrain`, `@PyAutoBrain`, `PYAUTOMIND`, `@PyAutoBrain/agents`, PyAutoScientist get no line; a library target still gets one); tests/test_intake_memory.py 8 passed; Brain suite 1576 passed, 1 skipped (2026-11-05). The test-only commit is unmerged and needs a PR. +- found by: queue check-in 2026-11-05. + +## Original prompt + # intake classify --file injects an unrelated Memory: line on organ-targeted prompts Type: bug diff --git a/complete/index.md b/complete/index.md index 15770499b..437b5e360 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. -2144 records across 11 buckets. +2145 records across 11 buckets. ## Highlights @@ -154,6 +154,7 @@ markers; everything below GENERATED is rebuilt. - [hpc-campaign-p5a-assistant](2026/11/hpc-campaign-p5a-assistant.md) — phase 5a; ledger draft/research/autofit/hpc_campaign_epic.md - [hygiene-extras-tomllib](2026/11/hygiene-extras-tomllib.md) - [hygiene-refs-false-positives](2026/11/hygiene-refs-false-positives.md) +- [intake-memory-line-organ-targets](2026/11/intake-memory-line-organ-targets.md) — already shipped — closed as stale draft. The `_with_memory` gate in `agents/conductors/intake/_intake.py` land… - [latest-per-test-tie](2026/11/latest-per-test-tie.md) — test_autofit/results/test_identity.py::test_latest_per_keeps_the_latest_sibling flaked (main red at 963ff296a, - [likelihood-lifecycle-p3-day-zero-pages](2026/11/likelihood-lifecycle-p3-day-zero-pages.md) - [likelihood-lifecycle-p3-day-zero-stamp](2026/11/likelihood-lifecycle-p3-day-zero-stamp.md) diff --git a/dashboard.html b/dashboard.html index 04278f5fd..4b8c4d5c9 100644 --- a/dashboard.html +++ b/dashboard.html @@ -327,8 +327,8 @@ Keep track of decisions and outstanding questions throughout this conversation. After changes, report what was recorded, where it lives and what remains to do. Work on GitHub: -- Open Mind repository: https://github.com/PyAutoLabs/PyAutoMind
Last updated 2026-11-05 18:55:50 UTC
↻ Update

- +- Open Mind repository: https://github.com/PyAutoLabs/PyAutoMind
Last updated 2026-11-05 18:57:23 UTC
↻ Update

+
Batch 2026-11-05-am — 0 in progress · 0 awaiting review

Nothing to review yet.

Start here

24
@@ -345,7 +345,7 @@

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

Eyes cluster visualization group: render every cluster/point-source figure for PyAutoEyes✨ featureautolens_visualizationlargesupervisedhigh

Deep research: Can we speed up Delaunay in PyAutoArray?🔬 researchautoarraytoo-largesupervisedhigh

-

Fits a slot (ready to run unattended, cheapest to review first) — showing 12 of 91

+

Fits a slot (ready to run unattended, cheapest to review first) — showing 12 of 90

Guard every workspace script against untimed network downloads🧪 testautolens_workspacesmallsafemedium

@@ -535,8 +535,8 @@

Fits a slot (ready to run unattended, cheapest to revie

interferometer-primary-beam-persistence-mirror — filed 2026-10-21 — ready — PyAutoLens claim released 2026-10-21 (point-dataset-positions-panel shipped…

point-plots-yaml-keys-assistant — filed 2026-10-22 — unblocked 2026-10-23 — cosmos-web-ring-notebook merged (autolens_assistant#161, complete/2026/10/cosmos-web-ring-notebook.md)…

-

Backlog

293
-

Lanes: any 283 · local-dev 8

+

Backlog

292
+

Lanes: any 282 · local-dev 8

Human review — 2

Simplify reading-queue token management✨ featurepyautomemory

-bug — 62 +bug — 61

Fix KNN neighbor search for a partial final point block🐛 bugautoarraymediumsupervisedhigh

@@ -648,7 +648,6 @@

Fits a slot (ready to run unattended, cheapest to revie

SLaM simultaneous subhalo grid search fits last band only🐛 bugautolens_workspacesmallsafenormal

- @@ -840,12 +839,6 @@

Fits a slot (ready to run unattended, cheapest to revie -2026-11-03 -filed -intake classify --file injects an unrelated Memory: line on… - - - 2026-11-02 filed Unexplained autodiff-vs-FD gaps in the phase-6 gradient records… @@ -869,7 +862,7 @@

Fits a slot (ready to run unattended, cheapest to revie Issued: 2026-11-02 - + 2026-11-02 filed Imaging sparse-operator path gives a very different log L from dense… @@ -1109,6 +1102,12 @@

Fits a slot (ready to run unattended, cheapest to revie Repo cleanup: retire the Abell 1201 worktree and local raw data + +2026-09-25 +filed +test_latent_euclid_variables_traces_under_jax_jit went red on main… + +

Pending release

2
diff --git a/dashboard.md b/dashboard.md index 4b286fed2..9fd72fc00 100644 --- a/dashboard.md +++ b/dashboard.md @@ -12,7 +12,7 @@ | [Epics](#epics) | 21 | | [In flight](#in-flight) | 8 | | [Planned](#planned) | 9 | -| [Backlog](#backlog) | 293 | +| [Backlog](#backlog) | 292 | | [Recent](#recent) | 50 | | [Pending release](#pending-release) | 2 | @@ -121,7 +121,7 @@ Use the start-dev skill. draft/research/autoarray/delaunay_research.md
-**Fits a slot** (ready to run unattended, cheapest to review first) — showing 12 of 91 +**Fits a slot** (ready to run unattended, cheapest to review first) — showing 12 of 90
📋 Guard every workspace script against untimed network downloads — autolens_workspace · small · safe · medium @@ -1235,7 +1235,7 @@ Use the start-dev skill. draft/docs/autolens_assistant/point_plots_yaml_keys.md ## Backlog -Lanes: any 283 · local-dev 8 +Lanes: any 282 · local-dev 8
@@ -1619,7 +1619,7 @@ Use the start-dev skill. draft/feature/pyautomemory/reading-queue-token-manageme
-bug — 62 +bug — 61
📋 test_latent_euclid_variables_traces_under_jax_jit went red on main: total_source_flux differs by 6% between jax.jit… — euclid · small · supervised · high @@ -1893,14 +1893,6 @@ Use the start-dev skill. draft/bug/autonerves/jax_enable_x64_env_ignored_and_fp3
-
📋 intake classify --file injects an unrelated Memory: line on organ-targeted prompts — pyautobrain · small · supervised · normal - -``` -Use the start-dev skill. draft/bug/pyautobrain/intake_classify_file_drops_declared_epic_phase.md -``` - -
-
📋 Convolver "No blurring_image provided" warning in canonical workspace scripts — workspaces · small · safe · normal ``` @@ -3035,17 +3027,16 @@ Use the start-dev skill. draft/triage/autolens/jit_fit_from_is_vacuous.md | 2026-11-05 | filed | Filed: 2026-11-05 (phase 2 of autolens_profiling#519; Pulse task… | | 2026-11-05 | filed | Filed: 2026-11-05 (found by the autolens_profiling#519 worker-route… | | 2026-11-04 | issued | Autonomous orchestrators phase 4c: run the Dev orchestrator pilot… | -| 2026-11-03 | filed | intake classify --file injects an unrelated Memory: line on… | | 2026-11-02 | filed | Unexplained autodiff-vs-FD gaps in the phase-6 gradient records… | | 2026-11-02 | filed | Standard-size gradient cells record "point": "prior_medians" while… | | 2026-11-02 | issued | Magnification maps 8d: wire into fit subplots and make them pretty | | 2026-11-02 | issued | Issued: 2026-11-02 | +| 2026-11-02 | filed | Imaging sparse-operator path gives a very different log L from dense… |
… 10 more (40 left) | Date | Event | Task | |------|-------|------| -| 2026-11-02 | filed | Imaging sparse-operator path gives a very different log L from dense… | | 2026-11-02 | issued | Gradient-correctness sweep: triage and investigate every open… | | 2026-10-31 | issued | Sky orientation (north/east): euclid_dr1 catalogue, paper and… | | 2026-10-30 | filed | Should PyAutoArray flip FITS rows at load so +y is north | @@ -3055,12 +3046,12 @@ Use the start-dev skill. draft/triage/autolens/jit_fit_from_is_vacuous.md | 2026-10-25 | filed | CI timing must compare equivalent executed job coverage | | 2026-10-23 | filed | autolens_assistant leg of the PyAutoLabs AI-options page (deferred… | | 2026-10-23 | filed | @autolens_profiling stale auto-simulated dataset/cluster/simple… | +| 2026-10-23 | filed | A dedicated Documentation conductor in PyAutoBrain |
… 10 more (30 left) | Date | Event | Task | |------|-------|------| -| 2026-10-23 | filed | A dedicated Documentation conductor in PyAutoBrain | | 2026-10-22 | filed | point-plots-yaml-keys-assistant | | 2026-10-21 | filed | interferometer-primary-beam-persistence-mirror | | 2026-10-21 | filed | PyAutoLens mirror of the interferometer primary-beam persistence… | @@ -3070,12 +3061,12 @@ Use the start-dev skill. draft/triage/autolens/jit_fit_from_is_vacuous.md | 2026-10-21 | filed | Interferometer primary beam: workspace example and docs | | 2026-10-21 | filed | Cluster likelihood scripts: image-plane manual check disagrees with… | | 2026-10-16 | filed | Re-measure the shapelets/modeling.py SLOW park (#586) under the… | +| 2026-10-14 | filed | @autofit_workspace six searches/ scripts fail on main at… |
… 10 more (20 left) | Date | Event | Task | |------|-------|------| -| 2026-10-14 | filed | @autofit_workspace six searches/ scripts fail on main at… | | 2026-10-14 | filed | Human-readable Cortex Projects dashboard | | 2026-10-14 | filed | Cortex output summaries — phase 2 | | 2026-10-09 | filed | Profiling conductor compile drift compares one point against one point | @@ -3085,12 +3076,12 @@ Use the start-dev skill. draft/triage/autolens/jit_fit_from_is_vacuous.md | 2026-10-02 | filed | knn-partial-point-block | | 2026-10-02 | filed | Fix Sibson interpolation at internal edges | | 2026-10-02 | filed | Fix KNN neighbor search for a partial final point block | +| 2026-10-01 | filed | Sparse interferometer terms: NUFFT ignores the mask origin and… |
… 10 more (10 left) | Date | Event | Task | |------|-------|------| -| 2026-10-01 | filed | Sparse interferometer terms: NUFFT ignores the mask origin and… | | 2026-10-01 | filed | Interferometer log_evidence fails (LinAlgError / NaN) at large… | | 2026-10-01 | filed | Interferometer galaxy_image_dict drops a mixed galaxy's ordinary… | | 2026-09-29 | filed | PlotterEllipse.fit_ellipse writes every variant to… | @@ -3100,6 +3091,7 @@ Use the start-dev skill. draft/triage/autolens/jit_fit_from_is_vacuous.md | 2026-09-27 | filed | Building a JAX Fitness then calling register_tracer_classes raises… | | 2026-09-26 | filed | bump_colab_urls.sh: cover autolens_assistant Colab links | | 2026-09-26 | filed | Repo cleanup: retire the Abell 1201 worktree and local raw data | +| 2026-09-25 | filed | test_latent_euclid_variables_traces_under_jax_jit went red on main… |
diff --git a/draft/bug/pyautobrain/profiling_compile_drift_point_vs_point.md b/draft/bug/pyautobrain/profiling_compile_drift_point_vs_point.md index 4aa3e5f31..54d4e071b 100644 --- a/draft/bug/pyautobrain/profiling_compile_drift_point_vs_point.md +++ b/draft/bug/pyautobrain/profiling_compile_drift_point_vs_point.md @@ -35,3 +35,19 @@ execution costs separate. Synthetic witness required for any change. "prm and then do 3b and leftovers fully wrap up --auto" — filed as the Brain hand-off named in the audit note; not part of the #362 PRs. + +## Implemented 2026-11-05 — awaiting the human's call on option (a) and a PR + +Decide-and-flag: the agent took **option (a)**. The change is on PyAutoBrain branch +`ccr-f98d2a4d-92r7rv`, commit ed0782c, unmerged with no PR yet. The 2x +`COMPILE_DRIFT_RATIO` band and 1 s floor stay as a gross flag. Each drifted row now +carries `comparison` (`single-sample` / `repeat-summarised`), `pinned_repeats`, +`observed_repeats` and `caveat` ("single-sample endpoint(s): a gross 2x-band flag from +one pinned timing vs one observed timing, not a measured change"), and +`triage --axis compile` passes them through. Repeat counts come from an optional +`compile_repeats` field (both sides ≥ 2, P7's rule), which no producer writes yet, so +every real drift reports single-sample today. Compile cost only. +Tests: `test_compile_drift_is_reported_as_a_single_sample_comparison`, +`test_compile_drift_reports_repeat_counts_when_the_data_carries_them`. Brain suite 1576 +passed. Possible follow-up: autolens_profiling's `jax_compile` tooling writes `compile_repeats`. +Tier stays judge, so this needs a human /prm. diff --git a/state.json b/state.json index 59fcec58a..bcdb94a1d 100644 --- a/state.json +++ b/state.json @@ -4,7 +4,7 @@ "repo": "PyAutoMind", "status": "yellow", "headline": "YELLOW \u2014 24 picks \u00b7 8 in flight", - "updated": "2026-11-05T18:55:50Z", + "updated": "2026-11-05T18:57:23Z", "pages_url": "https://pyautolabs.github.io/PyAutoMind/", "items": [ { From dc471e1d685166fad8ea2db91d0d26fe58126d65 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 5 Nov 2026 19:02:40 +0000 Subject: [PATCH 3/9] refactor(repos_sync): one OptInBlock declaration drives the map/history/remote check and write legs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Narrowed scope (option a of the 2026-11-05 re-size): the three opt-in AGENTS.md blocks share one declaration; check_* names stay as thin wrappers. Deliverable, filing, standards, hooks and the mode-gated writers stay explicit. Witness: --check on the live workspace, --write on a scratch copy of the workspace, and the post-write --check are byte-identical before/after, as are the files --write produced. New tests/test_repos_sync_opt_in_blocks.py pins the shared contract per block. Mind suite 725 passed, 1 pre-existing failure (test_the_hook_survives_an_unwritable_tools_dir, red without this change — root in the container can write a chmod'd dir). Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_016nhQ8MZyNga1wamBmFdfAK --- scripts/repos_sync.py | 140 +++++++++++-------------- tests/test_repos_sync_opt_in_blocks.py | 67 ++++++++++++ 2 files changed, 127 insertions(+), 80 deletions(-) create mode 100644 tests/test_repos_sync_opt_in_blocks.py diff --git a/scripts/repos_sync.py b/scripts/repos_sync.py index faf7b4554..25171fa53 100644 --- a/scripts/repos_sync.py +++ b/scripts/repos_sync.py @@ -129,6 +129,7 @@ import re import subprocess import sys +from dataclasses import dataclass from pathlib import Path import smoke_bootstrap_sync as smoke_sync @@ -1010,23 +1011,58 @@ def check_labels(root, repos): # reported as drift. +# The opt-in AGENTS.md blocks: one declaration per generated surface drives +# both the drift check and the --write leg. Opt-in means a repo that has not +# added the markers is skipped (never a problem), an absent AGENTS.md is +# skipped, and a present block must equal the generator byte-for-byte. The +# deliverable and filing blocks are NOT here: they self-install and report a +# missing block, so their contract differs. +@dataclass(frozen=True) +class OptInBlock: + noun: str # as the stale message names it: "'': block is stale" + begin: str + end: str + organs_only: bool = False + + def targets(self, root, repos): + for name, repo in repos.items(): + if self.organs_only and repo["category"] != "organ": + continue + yield name, repo_checkout(root, name) / "AGENTS.md" + + def check(self, root, repos, expected): + problems = [] + for name, agents in self.targets(root, repos): + if not agents.exists(): + continue # not checked out, or no AGENTS.md of its own + text = agents.read_text() + if self.begin not in text or self.end not in text: + continue # opt-in: the repo has not added these markers yet + if extract_block(text, self.begin, self.end) != expected: + problems.append( + f"'{name}': {self.noun} block is stale — run " + f"`python3 PyAutoMind/scripts/repos_sync.py --write`" + ) + return problems + + def write(self, path, content): + write_block(path, content, self.begin, self.end, required=False) + + +MAP_BLOCK = OptInBlock("organism-map", MAP_BEGIN, MAP_END, organs_only=True) +# The history policy is universal — written into every repo (not just organs) +# that has added the markers. Single source (policy/never_rewrite_history.md) +# + this check is what lets the safety text live inline in every repo without +# drifting. +HISTORY_BLOCK = OptInBlock("never-rewrite-history", HISTORY_BEGIN, HISTORY_END) +# Same contract as the history block. Opt-in, not mandatory, so a repo that has +# not added the markers is skipped rather than failing a session (or a CI leg) +# that cannot see it — see the module comment on REMOTE_SESSIONS_FILE. +REMOTE_BLOCK = OptInBlock("remote-session", REMOTE_BEGIN, REMOTE_END) + + def check_map_blocks(root, repos, smap): - problems = [] - for name, repo in repos.items(): - if repo["category"] != "organ": - continue - agents = repo_checkout(root, name) / "AGENTS.md" - if not agents.exists(): - continue # not checked out, or an organ without its own AGENTS.md - text = agents.read_text() - if MAP_BEGIN not in text or MAP_END not in text: - continue # opt-in: an organ that has not added the map markers - if extract_block(text, MAP_BEGIN, MAP_END) != smap: - problems.append( - f"'{name}': organism-map block is stale — run " - f"`python3 PyAutoMind/scripts/repos_sync.py --write`" - ) - return problems + return MAP_BLOCK.check(root, repos, smap) # The two `required=True` targets of --write — the workspace-root AGENTS.md @@ -1072,48 +1108,11 @@ def check_owner_map(root, categories, repos): def check_history_blocks(root, repos, hpol): - """Every AGENTS.md that opts into the repos_sync:history markers must carry - the canonical policy verbatim. Single source (policy/never_rewrite_history.md) - + this check is what lets the safety text live inline in every repo without - drifting.""" - problems = [] - for name in repos: - agents = repo_checkout(root, name) / "AGENTS.md" - if not agents.exists(): - continue - text = agents.read_text() - if HISTORY_BEGIN not in text or HISTORY_END not in text: - continue # opt-in: repo hasn't added the history markers yet - if extract_block(text, HISTORY_BEGIN, HISTORY_END) != hpol: - problems.append( - f"'{name}': never-rewrite-history block is stale — run " - f"`python3 PyAutoMind/scripts/repos_sync.py --write`" - ) - return problems + return HISTORY_BLOCK.check(root, repos, hpol) def check_remote_blocks(root, repos, remote): - """Same contract as the history block: opt in with the markers, and the copy - must then be the canonical text verbatim. - - Opt-in, not mandatory, so a repo that has not added the markers is skipped - rather than failing a session (or a CI leg) that cannot see it. That is also - the honest state of this rollout — see the module comment on - REMOTE_SESSIONS_FILE.""" - problems = [] - for name in repos: - agents = repo_checkout(root, name) / "AGENTS.md" - if not agents.exists(): - continue - text = agents.read_text() - if REMOTE_BEGIN not in text or REMOTE_END not in text: - continue # opt-in: repo hasn't added the remote-session markers yet - if extract_block(text, REMOTE_BEGIN, REMOTE_END) != remote: - problems.append( - f"'{name}': remote-session block is stale — run " - f"`python3 PyAutoMind/scripts/repos_sync.py --write`" - ) - return problems + return REMOTE_BLOCK.check(root, repos, remote) def check_deliverable_blocks(root, repos, policy): @@ -3068,16 +3067,8 @@ def main(): owner_map(categories, repos), required=True, ) - for name, repo in repos.items(): - if repo["category"] != "organ": - continue - write_block( - repo_checkout(root, name) / "AGENTS.md", - smap, - MAP_BEGIN, - MAP_END, - required=False, - ) + for _, agents in MAP_BLOCK.targets(root, repos): + MAP_BLOCK.write(agents, smap) # The history policy is universal — written into every repo (not just # organs) that has added the markers. # @@ -3088,22 +3079,11 @@ def main(): # each repo to opt in is how the long tail stays unprotected.) insert_deliverable_markers(root, repos) for name in repos: + agents = repo_checkout(root, name) / "AGENTS.md" + HISTORY_BLOCK.write(agents, hpol) + REMOTE_BLOCK.write(agents, remote) write_block( - repo_checkout(root, name) / "AGENTS.md", - hpol, - HISTORY_BEGIN, - HISTORY_END, - required=False, - ) - write_block( - repo_checkout(root, name) / "AGENTS.md", - remote, - REMOTE_BEGIN, - REMOTE_END, - required=False, - ) - write_block( - repo_checkout(root, name) / "AGENTS.md", + agents, deliverable, DELIVERABLE_BEGIN, DELIVERABLE_END, diff --git a/tests/test_repos_sync_opt_in_blocks.py b/tests/test_repos_sync_opt_in_blocks.py new file mode 100644 index 000000000..b449e8be7 --- /dev/null +++ b/tests/test_repos_sync_opt_in_blocks.py @@ -0,0 +1,67 @@ +"""The opt-in AGENTS.md blocks share one declaration (`OptInBlock`). + +The map, history and remote blocks used to be three hand-copied check +functions plus hand-copied `write_block` calls; they are now one declaration per +surface driving both legs. This pins the shared contract for each declaration, +so a new opt-in surface inherits it rather than re-copying it. + +Conventions, as in the sibling repos_sync tests: fictional fixtures only +(`tests/**` is copied into the public template), and every leg is shown to FAIL. +""" + +import sys +from pathlib import Path + +import pytest + +sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "scripts")) + +import repos_sync # noqa: E402 + +REPOS = {"OrganCore": {"category": "organ"}, "LibAlpha": {"category": "library"}} +BLOCKS = [repos_sync.MAP_BLOCK, repos_sync.HISTORY_BLOCK, repos_sync.REMOTE_BLOCK] + + +def _agents(root, name, body): + (root / name).mkdir(parents=True, exist_ok=True) + path = root / name / "AGENTS.md" + path.write_text(body) + return path + + +def _with(block, content): + return f"# Repo\n\n{block.begin}\n{content}\n{block.end}\n" + + +@pytest.mark.parametrize("block", BLOCKS, ids=lambda b: b.noun) +def test_a_current_block_passes_and_a_stale_one_is_named(tmp_path, block): + _agents(tmp_path, "OrganCore", _with(block, "canonical")) + assert block.check(tmp_path, REPOS, "canonical") == [] + _agents(tmp_path, "OrganCore", _with(block, "hand-edited")) + assert block.check(tmp_path, REPOS, "canonical") == [ + f"'OrganCore': {block.noun} block is stale — run " + "`python3 PyAutoMind/scripts/repos_sync.py --write`" + ] + + +@pytest.mark.parametrize("block", BLOCKS, ids=lambda b: b.noun) +def test_absent_files_and_missing_markers_are_skipped(tmp_path, block): + assert block.check(tmp_path, REPOS, "canonical") == [] + _agents(tmp_path, "OrganCore", "# Repo\n\nno markers here\n") + assert block.check(tmp_path, REPOS, "canonical") == [] + + +@pytest.mark.parametrize("block", BLOCKS, ids=lambda b: b.noun) +def test_write_repairs_what_check_flags(tmp_path, block): + path = _agents(tmp_path, "OrganCore", _with(block, "stale")) + assert block.check(tmp_path, REPOS, "canonical") + block.write(path, "canonical") + assert block.check(tmp_path, REPOS, "canonical") == [] + + +def test_only_the_map_block_is_organs_only(tmp_path): + for block in BLOCKS: + _agents(tmp_path, "LibAlpha", _with(block, "stale")) + flagged = block.check(tmp_path, REPOS, "canonical") + assert bool(flagged) is (not block.organs_only), block.noun + assert [b.noun for b in BLOCKS if b.organs_only] == ["organism-map"] From 028ab4ca8e41a2249063477be0d8c7b6fbfe0400 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 5 Nov 2026 19:18:56 +0000 Subject: [PATCH 4/9] close: 4 drafts from the stale-draft sweep (human-approved) - rtd-organism-currency: Brain 1aa2ed4 (#563) + 7654757 (#564) - board-without-gh-phase2-legs: Brain 15317af (#564), witness test 10 passed - session-start-hook-copies-regen: all 27 swept copies match canonical; profile README patch unverified - cortex-projects-dashboard-parent: phase 1 Brain#526; phase 2 stays as output_summary.md Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_016nhQ8MZyNga1wamBmFdfAK --- .../2026/11/board-without-gh-phase2-legs.md | 6 ++ .../11/cortex-projects-dashboard-parent.md | 5 ++ .../2026/11/rtd-organism-currency.md | 6 ++ .../11/session-start-hook-copies-regen.md | 7 ++ complete/index.md | 6 +- dashboard.html | 48 +++++------ dashboard.md | 84 ++++++------------- draft/feature/cortex/output_summary.md | 2 +- .../pyautobrain/brain_board_follow_ups.md | 2 +- state.json | 2 +- 10 files changed, 80 insertions(+), 88 deletions(-) rename draft/feature/pyautobrain/board_without_gh_phase2_legs.md => complete/2026/11/board-without-gh-phase2-legs.md (70%) rename draft/feature/cortex/human_readable_projects_dashboard.md => complete/2026/11/cortex-projects-dashboard-parent.md (91%) rename draft/docs/pyautobrain/rtd_organism_currency.md => complete/2026/11/rtd-organism-currency.md (71%) rename draft/maintenance/pyautomind/session_start_hook_copies_regen.md => complete/2026/11/session-start-hook-copies-regen.md (74%) diff --git a/draft/feature/pyautobrain/board_without_gh_phase2_legs.md b/complete/2026/11/board-without-gh-phase2-legs.md similarity index 70% rename from draft/feature/pyautobrain/board_without_gh_phase2_legs.md rename to complete/2026/11/board-without-gh-phase2-legs.md index 3473b1e2b..5b532210d 100644 --- a/draft/feature/pyautobrain/board_without_gh_phase2_legs.md +++ b/complete/2026/11/board-without-gh-phase2-legs.md @@ -1,3 +1,9 @@ +- summary: already shipped, closed as a stale draft. PyAutoBrain 15317af (merged via #564, 2026-11-03) "phase 2 — the remaining GitHub legs onto the --github-data seam". The upkeep leg now reads through the seam. The versions, community and resume legs had already been retired from the board by 41ec5c5 (2026-10-08). So a remote render has zero unread legs, which meets the umbrella's headline criterion. +- witness: `test_a_remote_render_reads_all_four_phase2_legs` in Brain `tests/test_board_github_data.py`; the file gives 10 passed, 2026-11-05. +- found by: stale-draft sweep 2026-11-05. The shipping session merged without closing the draft. Closure approved by the human. + +## Original prompt + # Board phase 2: the remaining four legs onto the seam Type: feature diff --git a/draft/feature/cortex/human_readable_projects_dashboard.md b/complete/2026/11/cortex-projects-dashboard-parent.md similarity index 91% rename from draft/feature/cortex/human_readable_projects_dashboard.md rename to complete/2026/11/cortex-projects-dashboard-parent.md index d3b39f290..149464877 100644 --- a/draft/feature/cortex/human_readable_projects_dashboard.md +++ b/complete/2026/11/cortex-projects-dashboard-parent.md @@ -1,3 +1,8 @@ +- summary: parent closed. Phase 1, the presentation change, shipped in PyAutoBrain#526 (merge 92de427, 2026-10-15; record `complete/2026/10/cortex-project-readability.md`). Phase 2, output accounting, stays open as its own draft, `draft/feature/cortex/output_summary.md`, which carries the human's two-phase approval and the verbatim request reference. It still needs plan approval before any source change. +- found by: stale-draft sweep 2026-11-05. Closure approved by the human. + +## Original prompt + # Human-readable Cortex Projects dashboard Targets: @PyAutoBrain @PyAutoCortex diff --git a/draft/docs/pyautobrain/rtd_organism_currency.md b/complete/2026/11/rtd-organism-currency.md similarity index 71% rename from draft/docs/pyautobrain/rtd_organism_currency.md rename to complete/2026/11/rtd-organism-currency.md index 23a553acf..3e6a1b3b0 100644 --- a/draft/docs/pyautobrain/rtd_organism_currency.md +++ b/complete/2026/11/rtd-organism-currency.md @@ -1,3 +1,9 @@ +- summary: already shipped, closed as a stale draft. PyAutoBrain 1aa2ed4 (#563) renamed `docs/organs/build` to `organs/hands` with a redirect and added Broca to the organ table. 7654757 (merged via #564), both dated 2026-11-03, brought the RTD organism pages up to date: new Nerves, DNA and Broca pages, and the hard-coded organ counts are gone. +- witness: `docs/organs/` on Brain main has nerves.md, hands.md, dna.md and broca.md, and no "five/six organs" phrasing remains in docs/. Commit message: Sphinx warnings 0→0. Both commits are on origin/main, checked 2026-11-05. +- found by: stale-draft sweep 2026-11-05. The shipping session merged without closing the draft. Closure approved by the human. + +## Original prompt + # RTD organism docs currency: Nerves page, organ-count drift, hands.md rename Type: docs diff --git a/draft/maintenance/pyautomind/session_start_hook_copies_regen.md b/complete/2026/11/session-start-hook-copies-regen.md similarity index 74% rename from draft/maintenance/pyautomind/session_start_hook_copies_regen.md rename to complete/2026/11/session-start-hook-copies-regen.md index 32ef9e59b..a3abdf0f6 100644 --- a/draft/maintenance/pyautomind/session_start_hook_copies_regen.md +++ b/complete/2026/11/session-start-hook-copies-regen.md @@ -1,3 +1,10 @@ +- summary: shipped, closed. The 2026-09-29 sweep PRs landed. On HEAD of all 27 swept repos, `.claude/hooks/session-start.sh` is byte-identical to Mind's canonical `policy/session_start_hook.sh`, and so are the Brain, Cortex and Memory copies. PyAutoMemory#106 merged 2026-09-30. +- witness: the Witness (`repos_sync.py --check` hooks leg reporting 0 mismatches across the organism) was NOT run, because the sibling repos are not cloned in this session. The evidence is a per-repo raw-file comparison against the canonical hook. In this session's 4-repo checkout, the hooks leg reads "OK (4 of 50 checked out, 1 excluded)". +- unverified: the human-only `.github/profile/README.md` patch. If it is still outstanding, it is the human's to apply. No task tracks it. +- found by: stale-draft sweep 2026-11-05. Closure approved by the human. + +## Original prompt + # Regenerate the 28 drifted `.claude/hooks/session-start.sh` copies after the organ-order change Type: maintenance diff --git a/complete/index.md b/complete/index.md index 437b5e360..2bcc94d0c 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. -2145 records across 11 buckets. +2149 records across 11 buckets. ## Highlights @@ -134,9 +134,11 @@ markers; everything below GENERATED is rebuilt. - [autonomous-orchestrators-p4a](2026/11/autonomous-orchestrators-p4a.md) — phase 4a of 4a–4c; epic draft/feature/pyautobrain/autonomous_orchestrators_epic.md - [autonomous-orchestrators-p4b](2026/11/autonomous-orchestrators-p4b.md) — phase 4b of 4a–4c; epic draft/feature/pyautobrain/autonomous_orchestrators_epic.md - [batch-watch-live-view](2026/11/batch-watch-live-view.md) — pilot 4c follow-up; issue PyAutoBrain#575 +- [board-without-gh-phase2-legs](2026/11/board-without-gh-phase2-legs.md) — already shipped, closed as a stale draft. PyAutoBrain 15317af (merged via #564, 2026-11-03) "phase 2 — the rem… - [brain-hygiene-cleanup-bugs](2026/11/brain-hygiene-cleanup-bugs.md) - [chapter2-continuation](2026/11/chapter2-continuation.md) — All continuation scope merged: Tutorials 5 and 6, optional speed and runnable model_centred prior passing, sum… - [cloud-validation-rehearsal-clock-skew](2026/11/cloud-validation-rehearsal-clock-skew.md) +- [cortex-projects-dashboard-parent](2026/11/cortex-projects-dashboard-parent.md) — parent closed. Phase 1, the presentation change, shipped in PyAutoBrain#526 (merge 92de427, 2026-10-15; record… - [cti-database-examples-drift](2026/11/cti-database-examples-drift.md) - [cti-fits-fit-output-dir](2026/11/cti-fits-fit-output-dir.md) - [cti-likelihood-pins](2026/11/cti-likelihood-pins.md) — cti-upkeep phase 0b @@ -183,6 +185,8 @@ markers; everything below GENERATED is rebuilt. - [results-library-p3-exports](2026/11/results-library-p3-exports.md) — phase 3; ledger draft/feature/autofit/results_library_epic.md - [results-library-p4-package](2026/11/results-library-p4-package.md) — phase 4; ledger draft/feature/autofit/results_library_epic.md - [results-library-p5b-cortex](2026/11/results-library-p5b-cortex.md) — phase 5b; ledger draft/feature/autofit/results_library_epic.md +- [rtd-organism-currency](2026/11/rtd-organism-currency.md) — already shipped, closed as a stale draft. PyAutoBrain 1aa2ed4 (#563) renamed `docs/organs/build` to `organs/ha… +- [session-start-hook-copies-regen](2026/11/session-start-hook-copies-regen.md) — shipped, closed. The 2026-09-29 sweep PRs landed. On HEAD of all 27 swept repos, `.claude/hooks/session-start.… - [shift-digest-readable-picks](2026/11/shift-digest-readable-picks.md) — pilot 4c follow-up; issue PyAutoBrain#579 - [simulate-if-needed-workspace-sweep](2026/11/simulate-if-needed-workspace-sweep.md) - [tutorial-link-sweep](2026/11/tutorial-link-sweep.md) diff --git a/dashboard.html b/dashboard.html index 4b8c4d5c9..801cae156 100644 --- a/dashboard.html +++ b/dashboard.html @@ -327,8 +327,8 @@ Keep track of decisions and outstanding questions throughout this conversation. After changes, report what was recorded, where it lives and what remains to do. Work on GitHub: -- Open Mind repository: https://github.com/PyAutoLabs/PyAutoMind
Last updated 2026-11-05 18:57:23 UTC
↻ Update

- +- Open Mind repository: https://github.com/PyAutoLabs/PyAutoMind
Last updated 2026-11-05 19:18:54 UTC
↻ Update

+
Batch 2026-11-05-am — 0 in progress · 0 awaiting review

Nothing to review yet.

Start here

24
@@ -345,19 +345,19 @@

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

Eyes cluster visualization group: render every cluster/point-source figure for PyAutoEyes✨ featureautolens_visualizationlargesupervisedhigh

Deep research: Can we speed up Delaunay in PyAutoArray?🔬 researchautoarraytoo-largesupervisedhigh

-

Fits a slot (ready to run unattended, cheapest to review first) — showing 12 of 90

+

Fits a slot (ready to run unattended, cheapest to review first) — showing 12 of 88

Guard every workspace script against untimed network downloads🧪 testautolens_workspacesmallsafemedium

- -

Board phase 2: the remaining four legs onto the seam✨ featurepyautobrainsmallsafenormal

Use readthedocs or migrate to GitHub docs🔬 researchpyautohandssmallsupervisednormal

batch slice — the decomposition pass for needs-slicing prompts✨ featurepyautobrainmediumsupervisednormal

Remove the dead EDEN packaging tooling from PyAutoFit♻️ refactorpyautofitmediumsupervisednormal

PyAutoMemory canonical-key TODO sweep🧹 maintenancepyautomemorymediumsafenormal

+

Demo subplot_ellipse_errors from a real ellipse model-fit📖 docsworkspaceslargesupervisednormal

+

Epics

21

Long-running multi-phase programmes — 📋 copies a prompt that works out where the epic stands from its ledger and continues it from the next logical point. Members are worked in order through the epic's ledger — continue the epic rather than starting one standalone.

@@ -535,8 +535,8 @@

Fits a slot (ready to run unattended, cheapest to revie

interferometer-primary-beam-persistence-mirror — filed 2026-10-21 — ready — PyAutoLens claim released 2026-10-21 (point-dataset-positions-panel shipped…

point-plots-yaml-keys-assistant — filed 2026-10-22 — unblocked 2026-10-23 — cosmos-web-ring-notebook merged (autolens_assistant#161, complete/2026/10/cosmos-web-ring-notebook.md)…

-

Backlog

292
-

Lanes: any 282 · local-dev 8

+

Backlog

288
+

Lanes: any 278 · local-dev 8

Human review — 2

Human review: the scaling_relation slam parks (imaging un-parked, multi_galaxy kept)👀 human_reviewautolens_workspacenormal — flagged for review 2026-08-29

-feature — 41 +feature — 39 @@ -579,7 +579,6 @@

Fits a slot (ready to run unattended, cheapest to revie

COOLEST: export MGE lens light and pixelized sources as pixel grids✨ featureautolensmediumsupervisedmedium

A dedicated Documentation conductor in PyAutoBrain✨ featurepyautobrainmediumsupervisedmedium

Nightly run of one HowTo tutorial per chapter at real settings✨ featurepyautoheartmediumsupervisedmedium

-

Board phase 2: the remaining four legs onto the seam✨ featurepyautobrainsmallsafenormal

Brain board follow-ups: what real mornings surface✨ featurepyautobrainsmallsupervisednormal

bump_colab_urls.sh: cover autolens_assistant Colab links✨ featurepyautohandssmallsafenormal

Can create a list of InversionMatrix objects for each dataset✨ featureautoarraymediumsupervisednormal

@@ -608,7 +607,6 @@

Fits a slot (ready to run unattended, cheapest to revie

Deferred: make the *Power adapt classes the defaults (breaking)✨ featureautoarraylargehuman-requiredlow

-

Simplify reading-queue token management✨ featurepyautomemory

@@ -723,7 +721,7 @@

Fits a slot (ready to run unattended, cheapest to revie

-docs — 25 +docs — 24

Split lensing regimes: multi_galaxy / group / cluster (epic plan)📖 docsautolenstoo-largesupervisedhigh

Advanced workspace guide: Preloads (PyAutoArray)📖 docsworkspacestoo-largesupervisedhigh

@@ -731,7 +729,6 @@

Fits a slot (ready to run unattended, cheapest to revie

Adapt image is the S/N map: fix the prose and assess…📖 docsautogalaxylargesupervisedmedium

-

docs/api/plot.rst omits already-exported plot symbols📖 docsautolensmediumsafenormal

Demo subplot_ellipse_errors from a real ellipse model-fit📖 docsworkspaceslargesupervisednormal

@@ -751,7 +748,7 @@

Fits a slot (ready to run unattended, cheapest to revie

-maintenance — 18 +maintenance — 17

Reduce the organism's per-session and per-task token load by half🧹 maintenanceorgansmediumsupervisedhigh

CTI upkeep parity — bring PyAutoCTI and its satellites to the same…🧹 maintenanceautoctitoo-largehuman-requiredhigh

Keep caches off $HOME on HPC — phase 2 remainder: euclid pipeline…🧹 maintenanceworkspacessmallsupervisedmedium

@@ -768,7 +765,6 @@

Fits a slot (ready to run unattended, cheapest to revie

Deferred Heart dashboard housekeeping after release recovery🧹 maintenancepyautoheartlargehuman-requiredlow

-

@@ -991,12 +987,6 @@

Fits a slot (ready to run unattended, cheapest to revie 2026-10-14 filed -Human-readable Cortex Projects dashboard - - - -2026-10-14 -filed Cortex output summaries — phase 2 @@ -1067,12 +1057,6 @@

Fits a slot (ready to run unattended, cheapest to revie -2026-09-29 -filed -Regenerate the 28 drifted .claude/hooks/session-start.sh copies… - - - 2026-09-27 filed Sparse interferometer inversion: jax.grad of the log-evidence terms… @@ -1108,6 +1092,18 @@

Fits a slot (ready to run unattended, cheapest to revie test_latent_euclid_variables_traces_under_jax_jit went red on main… + +2026-09-25 +filed +Keep caches off $HOME on HPC — phase 2 remainder: euclid pipeline… + + + +2026-09-24 +filed +euclid_dr1: run the positions gate over DR1 and submit the remodel set + +

Pending release

2
diff --git a/dashboard.md b/dashboard.md index 9fd72fc00..da024944d 100644 --- a/dashboard.md +++ b/dashboard.md @@ -12,7 +12,7 @@ | [Epics](#epics) | 21 | | [In flight](#in-flight) | 8 | | [Planned](#planned) | 9 | -| [Backlog](#backlog) | 292 | +| [Backlog](#backlog) | 288 | | [Recent](#recent) | 50 | | [Pending release](#pending-release) | 2 | @@ -121,7 +121,7 @@ Use the start-dev skill. draft/research/autoarray/delaunay_research.md
-**Fits a slot** (ready to run unattended, cheapest to review first) — showing 12 of 90 +**Fits a slot** (ready to run unattended, cheapest to review first) — showing 12 of 88
📋 Guard every workspace script against untimed network downloads — autolens_workspace · small · safe · medium @@ -163,58 +163,58 @@ Use the start-dev skill. draft/test/autolens_workspace_test/latent_smoke_asserti
-
📋 RTD organism docs currency: Nerves page, organ-count drift, hands.md rename — pyautobrain · small · supervised · normal +
📋 Use readthedocs or migrate to GitHub docs — pyautohands · small · supervised · normal ``` -Use the start-dev skill. draft/docs/pyautobrain/rtd_organism_currency.md +Use the start-dev skill. draft/research/pyautohands/git_docs.md ```
-
📋 Board phase 2: the remaining four legs onto the seam — pyautobrain · small · safe · normal +
📋 Verify jax.jit / jax.grad parity on the critical-curve and caustic calculations — autolens_workspace_test · medium · safe · normal ``` -Use the start-dev skill. draft/feature/pyautobrain/board_without_gh_phase2_legs.md +Use the start-dev skill. draft/test/autolens_workspace_test/jax_zero_contour.md ```
-
📋 Use readthedocs or migrate to GitHub docs — pyautohands · small · supervised · normal +
📋 batch slice — the decomposition pass for needs-slicing prompts — pyautobrain · medium · supervised · normal ``` -Use the start-dev skill. draft/research/pyautohands/git_docs.md +Use the start-dev skill. draft/feature/pyautobrain/batch_slice.md ```
-
📋 Verify jax.jit / jax.grad parity on the critical-curve and caustic calculations — autolens_workspace_test · medium · safe · normal +
📋 Remove the dead EDEN packaging tooling from PyAutoFit — pyautofit · medium · supervised · normal ``` -Use the start-dev skill. draft/test/autolens_workspace_test/jax_zero_contour.md +Use the start-dev skill. draft/refactor/pyautofit/remove_eden_packaging_tooling.md ```
-
📋 batch slice — the decomposition pass for needs-slicing prompts — pyautobrain · medium · supervised · normal +
📋 PyAutoMemory canonical-key TODO sweep — pyautomemory · medium · safe · normal ``` -Use the start-dev skill. draft/feature/pyautobrain/batch_slice.md +Use the start-dev skill. draft/maintenance/pyautomemory/canonical_key_todo_sweep.md ```
-
📋 Remove the dead EDEN packaging tooling from PyAutoFit — pyautofit · medium · supervised · normal +
📋 Demo subplot_ellipse_errors from a real ellipse model-fit — workspaces · large · supervised · normal ``` -Use the start-dev skill. draft/refactor/pyautofit/remove_eden_packaging_tooling.md +Use the start-dev skill. draft/docs/workspaces/demo_subplot_ellipse_errors.md ```
-
📋 PyAutoMemory canonical-key TODO sweep — pyautomemory · medium · safe · normal +
📋 cluster/mass_parameterizations*.py promise model.info prints (and figures) they never make — autolens_workspace · small · supervised · low ``` -Use the start-dev skill. draft/maintenance/pyautomemory/canonical_key_todo_sweep.md +Use the start-dev skill. draft/docs/autolens_workspace/cluster_mass_parameterizations_print_and_draw_every_model.md ```
@@ -1235,7 +1235,7 @@ Use the start-dev skill. draft/docs/autolens_assistant/point_plots_yaml_keys.md ## Backlog -Lanes: any 282 · local-dev 8 +Lanes: any 278 · local-dev 8
@@ -1286,7 +1286,7 @@ regenerate the dashboard. If I do not sign it off, file the follow-up with
-feature — 41 +feature — 39
📋 Eyes cluster visualization group: render every cluster/point-source figure for PyAutoEyes — autolens_visualization · large · supervised · high @@ -1360,14 +1360,6 @@ Use the start-dev skill. draft/feature/pyautoheart/howto_real_settings_nightly.m
-
📋 Board phase 2: the remaining four legs onto the seam — pyautobrain · small · safe · normal - -``` -Use the start-dev skill. draft/feature/pyautobrain/board_without_gh_phase2_legs.md -``` - -
-
📋 Brain board follow-ups: what real mornings surface — pyautobrain · small · supervised · normal ``` @@ -1592,14 +1584,6 @@ Use the start-dev skill. draft/feature/autolens/lenstwin_epic_surveys/02_assista
-
📋 Human-readable Cortex Projects dashboard — cortex - -``` -Use the start-dev skill. draft/feature/cortex/human_readable_projects_dashboard.md -``` - -
-
📋 Cortex output summaries — phase 2 — cortex ``` @@ -2461,7 +2445,7 @@ Use the start-dev skill. draft/research/autolens_profiling/likelihood_lifecycle_
-docs — 25 +docs — 24
📋 autolens_assistant leg of the PyAutoLabs AI-options page (deferred from #87) — autolens_assistant · small · supervised · high @@ -2519,14 +2503,6 @@ Use the start-dev skill. draft/docs/autolens_workspace/multi_plane_guide_richard
-
📋 RTD organism docs currency: Nerves page, organ-count drift, hands.md rename — pyautobrain · small · supervised · normal - -``` -Use the start-dev skill. draft/docs/pyautobrain/rtd_organism_currency.md -``` - -
-
📋 docs/api/plot.rst omits already-exported plot symbols — autolens · medium · safe · normal ``` @@ -2666,7 +2642,7 @@ Use the start-dev skill. draft/docs/howtolens/tutorial_correctness_and_howtogala
-maintenance — 18 +maintenance — 17
📋 Reduce the organism's per-session and per-task token load by half — organs · medium · supervised · high @@ -2796,14 +2772,6 @@ Use the start-dev skill. draft/maintenance/euclid/skip_fit_output_no_longer_gate
-
📋 Regenerate the 28 drifted .claude/hooks/session-start.sh copies after the organ-order change — pyautomind · small - -``` -Use the start-dev skill. draft/maintenance/pyautomind/session_start_hook_copies_regen.md -``` - -
-
📋 CTI upkeep parity — survey report (2026-11-04) — autocti ``` @@ -3067,7 +3035,6 @@ Use the start-dev skill. draft/triage/autolens/jit_fit_from_is_vacuous.md | Date | Event | Task | |------|-------|------| -| 2026-10-14 | filed | Human-readable Cortex Projects dashboard | | 2026-10-14 | filed | Cortex output summaries — phase 2 | | 2026-10-09 | filed | Profiling conductor compile drift compares one point against one point | | 2026-10-08 | filed | JAX_ENABLE_X64=False is overridden to True, so the fp32 inference… | @@ -3077,21 +3044,22 @@ Use the start-dev skill. draft/triage/autolens/jit_fit_from_is_vacuous.md | 2026-10-02 | filed | Fix Sibson interpolation at internal edges | | 2026-10-02 | filed | Fix KNN neighbor search for a partial final point block | | 2026-10-01 | filed | Sparse interferometer terms: NUFFT ignores the mask origin and… | +| 2026-10-01 | filed | Interferometer log_evidence fails (LinAlgError / NaN) at large… |
… 10 more (10 left) | Date | Event | Task | |------|-------|------| -| 2026-10-01 | filed | Interferometer log_evidence fails (LinAlgError / NaN) at large… | | 2026-10-01 | filed | Interferometer galaxy_image_dict drops a mixed galaxy's ordinary… | | 2026-09-29 | filed | PlotterEllipse.fit_ellipse writes every variant to… | -| 2026-09-29 | filed | Regenerate the 28 drifted .claude/hooks/session-start.sh copies… | | 2026-09-27 | filed | Sparse interferometer inversion: jax.grad of the log-evidence terms… | | 2026-09-27 | filed | Same-class q-clamp and bare-sqrt ellipticity gradient sites… | | 2026-09-27 | filed | Building a JAX Fitness then calling register_tracer_classes raises… | | 2026-09-26 | filed | bump_colab_urls.sh: cover autolens_assistant Colab links | | 2026-09-26 | filed | Repo cleanup: retire the Abell 1201 worktree and local raw data | | 2026-09-25 | filed | test_latent_euclid_variables_traces_under_jax_jit went red on main… | +| 2026-09-25 | filed | Keep caches off $HOME on HPC — phase 2 remainder: euclid pipeline… | +| 2026-09-24 | filed | euclid_dr1: run the positions gate over DR1 and submit the remodel set |
@@ -3144,7 +3112,7 @@ _Dates come from each task's registry entry — `lifecycle.py dates` reports any
-128 prompt(s) with no `Witness:` — the machine-checkable claim that would make the work reviewable in minutes. Absent, a prompt grades `judge` (a PI's quarter-hour) whatever its size, which is the intended default and not a bug. Nothing derives or backfills a witness — an invented one is plausible prose with nothing behind it — so this is a human writing one, a prompt at a time. +127 prompt(s) with no `Witness:` — the machine-checkable claim that would make the work reviewable in minutes. Absent, a prompt grades `judge` (a PI's quarter-hour) whatever its size, which is the intended default and not a bug. Nothing derives or backfills a witness — an invented one is plausible prose with nothing behind it — so this is a human writing one, a prompt at a time.
Prompts with no witness @@ -3166,7 +3134,6 @@ _Dates come from each task's registry entry — `lifecycle.py dates` reports any - `draft/feature/autolens_profiling/gradient_cost_hazard_on_ral_cpu_value.md` - `draft/feature/autolens_workspace/cluster_point_solver_validation_check.md` - `draft/feature/autolens_workspace/pointsolver_grid_extent_per_package.md` -- `draft/feature/cortex/human_readable_projects_dashboard.md` - `draft/feature/cortex/output_summary.md` - `draft/feature/euclid/euclid_dr1_prep_epic.md` - `draft/feature/jax_substructure/5_prng_key_vmap_noise.md` @@ -3189,7 +3156,8 @@ _Dates come from each task's registry entry — `lifecycle.py dates` reports any - `draft/bug/autoarray/reconstruction_noise_map_truncated_posterior.md` - `draft/bug/autoarray/rectangular_adaptive_zeroed_ring_guard_row_mismatch.md` - `draft/bug/autoarray/sibson_serial_kernel_loses_allocation_hoisting.md` -- _… and 88 more_ +- `draft/bug/autoarray/sub_slim_indexes_for_pix_index_padding.md` +- _… and 87 more_
diff --git a/draft/feature/cortex/output_summary.md b/draft/feature/cortex/output_summary.md index e7853473b..86b1468fd 100644 --- a/draft/feature/cortex/output_summary.md +++ b/draft/feature/cortex/output_summary.md @@ -4,7 +4,7 @@ Targets: @PyAutoBrain @PyAutoCortex Type: feature Filed: 2026-10-14 -Parent request and verbatim user text: human_readable_projects_dashboard.md. +Parent request and verbatim user text: `complete/2026/11/cortex-projects-dashboard-parent.md` (parent closed 2026-11-05; phase 1 shipped in PyAutoBrain#526). After the presentation phase, inspect supported project output metadata and define explicit read-only collection of structured summary receipts. Distinguish unique datasets with completed outputs from fit counts; report CPU core-hours and GPU device-hours independently, with timestamp, provenance, measured/estimated basis and coverage. Never equate resource requests with consumption or infer scientific acceptance. Rendering reads saved receipts without filesystem crawls or cluster calls. Validate duplicates/restarts, partial coverage, absent metadata, stale receipts and offline rendering. Final collector details depend on source inspection; await human plan approval before source changes. diff --git a/draft/feature/pyautobrain/brain_board_follow_ups.md b/draft/feature/pyautobrain/brain_board_follow_ups.md index 39afbf7da..09cfec2e6 100644 --- a/draft/feature/pyautobrain/brain_board_follow_ups.md +++ b/draft/feature/pyautobrain/brain_board_follow_ups.md @@ -44,6 +44,6 @@ Remaining candidates — pick up only when a real morning shows the need: own copies (the keep-in-step comments then come out). 3. **Whatever a week of mornings surfaces** — append here before starting. -Filed separately, because it is not a nit: **`board_without_gh.md`** (umbrella archived 2026-09-17 under `complete/archive/epics/`; phase 2 is `board_without_gh_phase2_legs.md`) — the +Filed separately, because it is not a nit: **`board_without_gh.md`** (umbrella archived 2026-09-17 under `complete/archive/epics/`; phase 2 shipped 2026-11-03, record `complete/2026/11/board-without-gh-phase2-legs.md`) — the eleven legs that read GitHub through `gh api` are dark in a remote session, which has no `gh`. A mobile morning is mostly blind until that is closed. diff --git a/state.json b/state.json index bcdb94a1d..2df5691b4 100644 --- a/state.json +++ b/state.json @@ -4,7 +4,7 @@ "repo": "PyAutoMind", "status": "yellow", "headline": "YELLOW \u2014 24 picks \u00b7 8 in flight", - "updated": "2026-11-05T18:57:23Z", + "updated": "2026-11-05T19:18:55Z", "pages_url": "https://pyautolabs.github.io/PyAutoMind/", "items": [ { From f5d3205193acac00d15fa0f51925cd5e45de1ede Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 5 Nov 2026 19:45:29 +0000 Subject: [PATCH 5/9] sweep: close 18 shipped/superseded drafts; re-scope 24 partly-done drafts to their remainder Draft-queue sweep 2026-11-05 (read-only audit of all 280 drafts against the Mind ledger and GitHub commit/PR/code search), closures approved by the human. Each record cites its evidence. Partly-done drafts gain a dated 'what is left' section (Done / Remaining); titles and intent unchanged. Live pointers updated in active/gradient_correctness_sweep.md and the likelihood-lifecycle ledger. Dashboard regenerated with the epic-companion census fix (PyAutoBrain#588): backlog 286 -> 239 prompts, hygiene flags 31 -> 5. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_016nhQ8MZyNga1wamBmFdfAK --- .../2026/11/autocti-render-yml-blocked-dup.md | 65 + complete/2026/11/dr1-rgb-flip-superseded.md | 43 + .../2026/11/ell-comps-disk-constraint-dup.md | 114 ++ .../2026/11/eyes-group-cluster-gallery.md | 38 + complete/2026/11/eyes-multi-galaxy-gallery.md | 38 + complete/2026/11/gradient-json-point-label.md | 26 + complete/2026/11/hpc-cache-off-home-euclid.md | 101 ++ complete/2026/11/jax-joss-benchmark-repo.md | 109 ++ .../11/lifecycle-p3-designation-proposals.md | 1370 +++++++++++++++++ .../11/multistart-gradient-quick-update.md | 68 + complete/2026/11/nautilus-ep-use-jax-guard.md | 40 + .../2026/11/nautilus-pin-tracks-autofit.md | 53 + .../2026/11/nerves-false-workspace-stale.md | 46 + .../2026/11/numba-gate-retune-superseded.md | 60 + complete/2026/11/point-magnification-api.md | 70 + complete/2026/11/scientist-minimal-starter.md | 50 + .../2026/11/search-seed-reproducibility.md | 95 ++ .../11/sersic-products-read-sed-output-dir.md | 52 + 18 files changed, 2438 insertions(+) create mode 100644 complete/2026/11/autocti-render-yml-blocked-dup.md create mode 100644 complete/2026/11/dr1-rgb-flip-superseded.md create mode 100644 complete/2026/11/ell-comps-disk-constraint-dup.md create mode 100644 complete/2026/11/eyes-group-cluster-gallery.md create mode 100644 complete/2026/11/eyes-multi-galaxy-gallery.md create mode 100644 complete/2026/11/gradient-json-point-label.md create mode 100644 complete/2026/11/hpc-cache-off-home-euclid.md create mode 100644 complete/2026/11/jax-joss-benchmark-repo.md create mode 100644 complete/2026/11/lifecycle-p3-designation-proposals.md create mode 100644 complete/2026/11/multistart-gradient-quick-update.md create mode 100644 complete/2026/11/nautilus-ep-use-jax-guard.md create mode 100644 complete/2026/11/nautilus-pin-tracks-autofit.md create mode 100644 complete/2026/11/nerves-false-workspace-stale.md create mode 100644 complete/2026/11/numba-gate-retune-superseded.md create mode 100644 complete/2026/11/point-magnification-api.md create mode 100644 complete/2026/11/scientist-minimal-starter.md create mode 100644 complete/2026/11/search-seed-reproducibility.md create mode 100644 complete/2026/11/sersic-products-read-sed-output-dir.md diff --git a/complete/2026/11/autocti-render-yml-blocked-dup.md b/complete/2026/11/autocti-render-yml-blocked-dup.md new file mode 100644 index 000000000..8b9e906d9 --- /dev/null +++ b/complete/2026/11/autocti-render-yml-blocked-dup.md @@ -0,0 +1,65 @@ +- summary: superseded/shipped — autocti_visualization#8 (2026-10-23), record `complete/2026/10/autocti-viz-render-from-mains.md`: render.yml renders from the library mains instead of waiting for a PyAutoCTI release; render 40032877406 went green and dispatched eyes-refresh (the Witness). That record's original prompt duplicates this draft. +- found by: draft-queue sweep 2026-11-05 (read-only audit against the Mind ledger + GitHub commit/PR/code search); closure approved by the human. + +## Original prompt + +# autocti_visualization render.yml fails on the released stack until PyAutoCTI releases + +Type: bug +Target: autocti_visualization +Repos: +- autocti_visualization +- PyAutoCTI +- PyAutoHands +Themes: +- visualization +- infrastructure +Difficulty: small +Autonomy: supervised +Priority: normal +Lane: local-dev +Status: draft +Consequence: judge +Witness: `gh workflow run render -R PyAutoLabs/autocti_visualization` completes green and its last step logs "Dispatched eyes-refresh to PyAutoLabs/PyAutoEyes" +Epic: cti-upkeep +Phase: 5 +Filed: 2026-09-29 + +## Task + +The first post-merge `workflow_dispatch` of `render.yml` +(run 36626066338, https://github.com/PyAutoLabs/autocti_visualization/actions/runs/36626066338) +failed at "Render figures + rebuild GALLERY.md + gallery/viz_manifest.yaml". +The "Install the released stack from PyPI" step ran +`pip install "autocti[optional]"`, which resolves to `autocti-2024.11.13.2`, +the latest autocti on PyPI. That release is older than autonerves and older +than the `aplt.*` plot-function API the producers call. Both producers fail on +import: + +``` +File ".../scripts/dataset_1d/visualization.py", line 64, in + from autonerves import conf +ModuleNotFoundError: No module named 'autonerves' +``` + +(`scripts/imaging_ci/visualization.py` line 73 fails the same way.) The commit +and `eyes-refresh` steps were skipped, so PyAutoEyes got no dispatch from cti. +The tracked PNGs on main still come from the source-checkout render at birth. +`lint.yml` stays green because it installs the library mains, not PyPI. + +For comparison, the autofit_visualization render (run 36626061620) installed +autofit 2026.9.27.2 and autonerves 2026.9.27.2 from PyPI and succeeded. + +## Fix (choose one, in this order of preference) + +a. **Release PyAutoCTI** on the current cadence. After that, + `pyautocti-release` and this workflow work as designed. This is the blocker + to name on the Hands release board: autocti has not published since + 2024-11. +b. **Interim:** when `autocti_version` is empty, have `render.yml` fall back to + the library mains by mirroring `lint.yml`'s checkout/install step. That + makes `workflow_dispatch` re-renders work before a release. The + `rendered_with` stamp must then say it came from a source build. + +Found during the `/prm` close-out of `eyes-fit-cti-instances` +(`complete/2026/09/eyes-fit-cti-instances.md`, PyAutoMind#455). diff --git a/complete/2026/11/dr1-rgb-flip-superseded.md b/complete/2026/11/dr1-rgb-flip-superseded.md new file mode 100644 index 000000000..098ae2773 --- /dev/null +++ b/complete/2026/11/dr1-rgb-flip-superseded.md @@ -0,0 +1,43 @@ +- summary: superseded by the human 2026-10-30 (the draft's own banner); `complete/2026/10/sky-orientation-dr1-p1.md` records "AGREED: the old rgb-flip bug draft … is superseded". It was never moved out of draft/. +- found by: draft-queue sweep 2026-11-05 (read-only audit against the Mind ledger + GitHub commit/PR/code search); closure approved by the human. + +## Original prompt + +# euclid_dr1: every dataset rgb.jpg is upside down relative to the VIS FITS — flip them all, locally and on RAL + +> **SUPERSEDED 2026-10-30 (human).** The flip ran on 2026-09-20 (`preprocess/flip_rgb.py`, originals kept as +> `rgb_raw.jpg`). User-facing RGBs are now north-up products under +> `draft/research/euclid/sky_orientation_euclid_dr1_and_library.md`. Do not start this task. Leftover: 4 local tiles +> have a flipped `rgb.jpg` but no `rgb_raw.jpg` marker, so a rerun would flip them back. + +Type: bug +Target: euclid +Repos: +- euclid_dr1 (science project, /mnt/c/Users/Jammy/Science/euclid_dr1; RAL /mnt/ral/jnightin/euclid_dr1) +Themes: +- euclid +- hpc +Autonomy: supervised +Witness: for Tile102007000RA0642357198143DECNEG0666711522747, after the flip `plt.imread("rgb.jpg")` shown with `origin="upper"` puts the blue arc top-left and the companion galaxy bottom-left, matching the VIS_BGSUB HDU shown the same way (before the flip the arc is bottom-left). + +## Problem +The `rgb.jpg` in each tile of `dataset/dr1_sep1_rest//` (written 2026-09-20; 101–102 px square, not the 100 px of the FITS) is flipped vertically relative to the VIS/NIR FITS cut-outs. Drawn row 0 at the top, the VIS image and the segmentation binaries match each other but the RGB is mirrored top-to-bottom. There is no left–right mirroring. I found this on 2026-09-24 while building the artefact-fix before/after panels (`scratchpad/artefact_fix_first100/make_panels.py` has to use `rgb[::-1]` to line them up). + +The pipeline reads the file as-is: `util.py:421-456` (`_open_rgb("rgb")` → `al.Array2DRGB`, no flip). So the RGB panel in every vis_lp `image/rgb.png` subplot is upside down relative to the fit panels, and so is the `rgb.png` in the inspect bundles (`scripts/tools/build_inspect.py`). + +## Task +Write a script (e.g. `preprocess/flip_rgb.py`) that flips every dataset `rgb.jpg` vertically, then run it: +1. **Locally** on `dataset/dr1_sep1_rest/` (14,032 tiles) and any other `dataset/` folder with the same problem. Check `q1_walsmley` and the legacy `rgb_0`/`rgb_1` thumbnails against their FITS before deciding whether to include them; don't assume. +2. **On RAL** on `/mnt/ral/jnightin/euclid_dr1/dataset/...`, running the script there over SSH (`euclid_jump`). Don't re-upload: RAL uploads from the laptop run at ~95 KB/s. + +Requirements: +- **Idempotent.** Running it twice must not flip the file back. Record the flip somehow (e.g. a `rgb_flipped` marker file per tile or a manifest), and check the marker, not the image. +- **Lossless where possible.** Re-saving a JPEG with PIL recompresses it. Prefer `jpegtran -flip vertical -perfect` and fall back to a high-quality re-encode only for the tiles where `-perfect` fails (101/102 px isn't a multiple of the MCU size). Alternatively, write a PNG and point `_open_rgb` at it. Say which approach you picked. +- Keep originals recoverable until the flip is verified (e.g. `rgb_raw.jpg`, or a tarball of the originals). +- Check the upstream writer. If whatever produced `rgb.jpg` on 2026-09-20 lives in this repo or the pipeline repo, fix it there too so that newly delivered tiles (the 15 sep1 remainder upload batches) aren't upside down. Otherwise flip them before submission. +- Any in-flight or queued RAL runs read `rgb.jpg` only for the visualisation subplot, so the flip doesn't change any likelihood. Still, don't rewrite files under a running array task's dataset while it's being read. + +## Verification +- The witness above, plus a 3-panel by-eye grid (RGB | VIS | lens+source binary contours) for ~20 random tiles, locally and on RAL. +- Count of flipped / skipped (marker already present) / failed tiles, locally and on RAL. The two totals should match the tile counts. +- Record the result in the euclid_dr1 Cortex ledger. diff --git a/complete/2026/11/ell-comps-disk-constraint-dup.md b/complete/2026/11/ell-comps-disk-constraint-dup.md new file mode 100644 index 000000000..066fd50a5 --- /dev/null +++ b/complete/2026/11/ell-comps-disk-constraint-dup.md @@ -0,0 +1,114 @@ +- summary: already shipped before it was filed — PyAutoFit#1538 (96dad519) + PyAutoGalaxy#589 (merge 0fbe863d, 2026-08-28), record `complete/2026/08/ell-comps-disk-constraint.md`; the draft was filed 2026-09-01 (duplicate). Unfiled residue per that record: a workspace example and a campaign re-measure. +- found by: draft-queue sweep 2026-11-05 (read-only audit against the Mind ledger + GitHub commit/PR/code search); closure approved by the human. + +## Original prompt + +# A joint unit-disk constraint (or reparameterisation) for `ell_comps` + +Type: feature +Target: autogalaxy +Repos: +- PyAutoGalaxy +- PyAutoFit +Themes: +- jax-gradient +- samplers +Difficulty: medium +Autonomy: supervised +Priority: normal +Status: draft +Consequence: judge +Review-minutes: 20 +Unattended: needs-slicing +Filed: 2026-09-01 +Issue: https://github.com/PyAutoLabs/PyAutoGalaxy/issues/594 (opened 2026-09-01 as a Cortex gate ref; reuse in start_dev — never open a second) + +Note 2026-09-04: `autolens_profiling/results/notes/inference/PROGRAMME.md` was frozen/retired on 2026-09-04, so the W10 measurement quoted below is cited as **history**, not as a live programme item; and PyAutoGalaxy#594 was opened as a Cortex gate ref for an epic that no longer exists — it is now simply this prompt's own issue, so reuse it in `start_dev` and never open a second. + +## The question + +`ell_comps` is a two-component elliptical parameterisation whose physical domain +is the **unit disk** (|e| ≤ 1), but it is priored and clipped as a **per-component +box**. The box is not the disk, and the corner of the box is where gradient +searches go to die. Should PyAutoGalaxy (with PyAutoFit's prior/clipper +machinery) offer a **joint disk constraint** on the pair, or a +**reparameterisation** whose whole domain is physical? This is a library +question and is deliberately filed as a Mind prompt rather than implemented in +the profiling repo. + +## The measurement that motivates it + +From the JAX inference programme ledger +(`autolens_profiling/results/notes/inference/PROGRAMME.md`, work item **W10**): + +> Non-physical `ell_comps`: 1,252/6,240 gradient-lane best points sit outside the +> unit disk (20.1 %; 31.5 % of final points), max |e| = 1.41421 = the box corner. +> The per-component `ell_comps` box admits 21.5 % non-physical volume, +> `validate_ell_comps` is silent on JAX tracers, and the clipper is faithful to +> the wrong box — so lanes settle there, and it is both the Phase-4 degradation +> channel and the Phase 8B crash channel. A joint disk constraint / +> reparameterisation is a library question — filed as PyAutoMind draft +> `feature/autogalaxy/ell_comps_joint_disk_constraint.md`, NOT implemented here + +Four facts inside that, each independently actionable: + +1. **20.1 % of gradient-lane best points are non-physical** (1,252 of 6,240), and + 31.5 % of *final* points are. `max |e| = 1.41421` is √2 — exactly the box + corner, which is the signature of the box, not of the data. +2. **The box admits 21.5 % non-physical volume.** The measured 20.1 % is very + close to what you would get by sampling the box uniformly, so the lanes are + not being pushed there by the likelihood — the parameterisation simply lets + them go there. +3. **`validate_ell_comps` is silent on JAX tracers.** The existing guard does not + fire under `jit`/`grad`, so nothing catches it in the gradient path. +4. **The clipper is faithful to the wrong box.** `ClipperPriorBoxJoint` does what + it is asked; what it is asked for is the box. + +The same corner shows up in the Phase 8B log-coordinate bijector A/B (same +ledger, "Phase 8B log-coordinate bijector A/B (W5)" row): + +> **23 of 39 best points are non-physical (59 %), clustered at the |e|=1.41421 box +> corner** — a property of the pixelized cells' box-clipped `ell_comps` geometry +> (W10), not of the bijector. + +At 59 % this is the majority of a completed 39-arm campaign, and it forced a +reading caveat on the whole verdict. + +## The crash channel — PyAutoFit#1535 + +The failure is not only a quality problem. In the same 8B campaign, **six +finished arms crashed at results-write on out-of-unit-disk `ell_comps`** +(PyAutoFit#1535) and had to be rebuilt offline from `search_internal.dill`. So a +box-legal, disk-illegal best point costs an A100 arm outright: the search +completes, and the write fails. Any fix should say what happens to that channel. + +## What a good answer looks like + +Not a decision made here — the point of the prompt is to ask the library the +question with the evidence attached. Plausible shapes, in rough order of +invasiveness: + +- **A joint prior/clipper constraint** on the `ell_comps` pair, so the sampled + region *is* the disk. Needs a form the gradient path can honour (differentiable, + tracer-safe) rather than a post-hoc rejection. +- **A reparameterisation** whose full domain maps into the disk (e.g. a magnitude + bounded by construction with a free angle), so no constraint is needed at all — + at the cost of a coordinate change that every downstream consumer of `ell_comps` + and every existing prior config has to be checked against. +- **A tracer-safe `validate_ell_comps`** as the minimum, so the condition is at + least detectable under `jit`/`grad` even if the geometry is unchanged. + +Whatever is chosen must be evaluated on the gradient lanes, not only on +nested-sampling runs: the 20.1 % is a *gradient-lane* number, and the whole +motivation is that gradient searches settle in the corner. + +## Acceptance + +- A decision recorded with reasons: joint constraint, reparameterisation, or + neither with a stated alternative. +- Whatever lands is exercised under JAX `jit`/`grad`, with evidence that the + non-physical fraction moves (the 20.1 % / 59 % numbers are the before). +- The PyAutoFit#1535 results-write crash channel is explicitly addressed — + fixed, or stated to be out of scope with the reason. +- Backward compatibility of existing `ell_comps` priors and configs is stated, + not assumed. diff --git a/complete/2026/11/eyes-group-cluster-gallery.md b/complete/2026/11/eyes-group-cluster-gallery.md new file mode 100644 index 000000000..23db5ed4b --- /dev/null +++ b/complete/2026/11/eyes-group-cluster-gallery.md @@ -0,0 +1,38 @@ +- summary: superseded by human decision — autolens_visualization#5 and #14, record `complete/2026/10/viz-all-dataset-types.md`: group and cluster producers shipped (dataset.png and fit.png, cluster per source plane); full figures were replaced by "bespoke via Eyes" follow-ups. +- found by: draft-queue sweep 2026-11-05 (read-only audit against the Mind ledger + GitHub commit/PR/code search); closure approved by the human. + +## Original prompt + +# autolens_visualization: group and cluster galleries (point-source + extended) + +Type: feature +Target: autolens_visualization +Repos: +- autolens_visualization +Themes: +- visualization +Difficulty: large +Autonomy: supervised +Priority: normal +Epic: pyautoeyes-birth +Phase: 7 +Status: draft — follows pyautoeyes-birth phase 1a and the multi-galaxy gallery; retargeted from the retired autolens-visualization epic (PyAutoMind#436), then to the `autolens_visualization` project repo under the 2026-09-28 layered design +Filed: 2026-09-25 + +Extend the permanent gallery to group- and cluster-scale lenses, for both +point-source and extended-source modelling: + +- tracked group and cluster datasets (point-source positions/fluxes and + extended imaging), each with a simulator under `scripts/misc/simulators/`; +- flat producers `scripts/group/visualization.py` and + `scripts/cluster/visualization.py` rendering every visualizer output the + corresponding fit writes (point-source `FitPositions`/flux figures and the + extended-source imaging figures), into `scripts//images/visualization/`; +- gallery rebuild, `GALLERY.md` sections, lint/render workflow coverage. + +Reference producers: `autolens_workspace_test/scripts/cluster/visualization.py` +and `scripts/point_source/visualization/` there (tiny build datasets, figures +gitignored). + +Witness: `python gallery/gallery_build.py --check` in `lens/autolens_visualization` exits 0 with group and cluster +sections; the Eyes survey reports both producers with 0 gaps and 0 orphans. diff --git a/complete/2026/11/eyes-multi-galaxy-gallery.md b/complete/2026/11/eyes-multi-galaxy-gallery.md new file mode 100644 index 000000000..905407dc2 --- /dev/null +++ b/complete/2026/11/eyes-multi-galaxy-gallery.md @@ -0,0 +1,38 @@ +- summary: superseded by human decision — autolens_visualization#5 (+ 465fc508 datasets), record `complete/2026/10/viz-all-dataset-types.md`: the multi_galaxy dataset, simulator and producer shipped, writing dataset.png and fit.png only (not the full all-true plots), as the human decided. +- found by: draft-queue sweep 2026-11-05 (read-only audit against the Mind ledger + GitHub commit/PR/code search); closure approved by the human. + +## Original prompt + +# autolens_visualization: multi-galaxy gallery — producer and dataset + +Type: feature +Target: autolens_visualization +Repos: +- autolens_visualization +Themes: +- visualization +Difficulty: medium +Autonomy: supervised +Priority: normal +Epic: pyautoeyes-birth +Phase: 6 +Status: draft — follows pyautoeyes-birth phase 1a (the lens project repo re-birth); retargeted from the retired autolens-visualization epic (PyAutoMind#436), then to the `autolens_visualization` project repo under the 2026-09-28 layered design +Filed: 2026-09-25 + +The PyAutoMind#436 birth shipped imaging and interferometer +galleries only. Add the multi-galaxy domain to the gallery: + +- a tracked HST-scale multi-galaxy dataset (lens plus at least one extra + line-of-sight or companion galaxy), with its simulator under + `scripts/misc/simulators/` so it regenerates; +- a flat `scripts/multi_galaxy/visualization.py` producer following the existing + imaging/interferometer pattern (true model, `visualize_before_fit` + `visualize` with the all-true + `config/visualize/plots.yaml`, parametric and Delaunay sources) writing to + `scripts/multi_galaxy/images/visualization/`; +- the render harness (`gallery/gallery_build.py`) picks the domain up and the tracked + `gallery/viz_manifest.yaml` lists it (so the PyAutoEyes dashboard shows it); `GALLERY.md` regenerated and + `--check` green; lint/render workflows run the new producer. + +Witness: `python gallery/gallery_build.py --check` in `lens/autolens_visualization` exits 0 with a multi_galaxy section +in `GALLERY.md`, and `pyauto-brain eyes survey lens/autolens_visualization --json` +reports the new producer with 0 gaps and 0 orphans. diff --git a/complete/2026/11/gradient-json-point-label.md b/complete/2026/11/gradient-json-point-label.md new file mode 100644 index 000000000..584a95add --- /dev/null +++ b/complete/2026/11/gradient-json-point-label.md @@ -0,0 +1,26 @@ +- summary: already shipped — autolens_profiling#518 (9d2ee2d3d, merged 2026-11-02 22:38, filed 16:18 the same day) records the real gradient evaluation point: 53 gradient.json records now say "iid draw 0"; the 18 still saying prior_medians are MGE cells, where that label is correct. +- found by: draft-queue sweep 2026-11-05 (read-only audit against the Mind ledger + GitHub commit/PR/code search); closure approved by the human. + +## Original prompt + +# Standard-size gradient cells record `"point": "prior_medians"` while evaluating at iid draw 0 + +Type: bug +Target: autolens_profiling +Repos: +- autolens_profiling +Themes: +- jax-gradient +Difficulty: easy +Autonomy: supervised +Priority: medium +Status: formalised +Consequence: glance +Witness: every standard-size driver passes the real evaluation point to `harness.run_gradient(point=...)` (as `galaxy_group_standard.py` does), the stored `results/**/gradient.json` `point` fields of standard-size cells read "iid draw 0 of the seeded sequence", and `gradient_witness.py --check` / `build_catalogue.py --check` stay green +Review-minutes: 3 +Unattended: ready +Filed: 2026-11-02 + +Found in autolens_profiling#515 (research note `wiki/research/gradient_campaign_impact_border_tie.md`). The imaging (`standard_jax_cell` path in `scripts/imaging/*/likelihood_runtime.py`), interferometer (`likelihood_breakdown/interferometer_standard.py`), datacube (`datacube_standard.py`) and multi_dataset (`multi_dataset_standard.py`) standard drivers call `run_gradient(...)` without `point=`, so the harness default label `prior_medians` is written although the instance is `iid_instances(...)[0]`. Only `galaxy_group_standard.py` passes `point="iid draw 0 of the seeded sequence"`. + +The wrong label made the PyAutoArray#671 defects (which only bite at the exact prior medians) look like a campaign risk. Fix the drivers, then correct the stored labels in place (label-only edit of the committed records; the values are unaffected) or note the correction where the records are catalogued. diff --git a/complete/2026/11/hpc-cache-off-home-euclid.md b/complete/2026/11/hpc-cache-off-home-euclid.md new file mode 100644 index 000000000..d37ef53d9 --- /dev/null +++ b/complete/2026/11/hpc-cache-off-home-euclid.md @@ -0,0 +1,101 @@ +- summary: already shipped — euclid_strong_lens_modeling_pipeline 37034f22 (2026-09-25, default branch) "activate.sh: keep Python/JAX caches off $HOME on HPC"; code search finds `PYAUTO_HPC_CACHE` in activate.sh on main. +- not done: the fake-base witness was not re-run. +- found by: draft-queue sweep 2026-11-05 (read-only audit against the Mind ledger + GitHub commit/PR/code search); closure approved by the human. + +## Original prompt + +# Keep caches off `$HOME` on HPC — phase 2 remainder: euclid pipeline `activate.sh` + +Type: maintenance +Target: workspaces +Repos: +- euclid_strong_lens_modeling_pipeline +Difficulty: small +Autonomy: supervised +Priority: medium +Status: formalised +Consequence: glance +Blocked-by: draft/bug/euclid/latent_total_source_flux_jax_vs_numpy_regression.md — euclid_strong_lens_modeling_pipeline main CI "Tests" red since a89a468 (2026-09-25; last green 3130898, 2026-09-22) on `tests/test_compute_latent_variable.py::test_latent_euclid_variables_traces_under_jax_jit` +Witness: `bash -n activate.sh`; fake-base witness (source `activate.sh` with a fake `PYAUTO_HPC_BASE`: every cache variable lands under `${PYAUTO_HPC_CACHE:-$(dirname "$PYAUTO_HPC_BASE")/.cache}`, a preset `JAX_COMPILATION_CACHE_DIR` wins, an explicitly empty one stays empty, and it survives `set -e` as a SLURM script would run it); repo pytest green. +Review-minutes: 3 +Unattended: ready +Filed: 2026-09-25 + +## What + +The euclid half of `hpc-cache-off-home-phase2` (autolens_profiling#310), re-filed at +the partial-merge close-out on 2026-09-25 — record: +`complete/2026/09/hpc-cache-off-home-phase2.md` (autolens_profiling half shipped as +autolens_profiling#311). Apply phase 1's cache block to the `PYAUTO_HPC_BASE` branch of +`euclid_strong_lens_modeling_pipeline/activate.sh` — the block below, identical to +autolens_assistant's. Only `activate.sh` changes. + +It was held, not rejected: the patch passed `bash -n` and the fake-base witness, but the +repo's pytest fails on the branch AND on main (`total_source_flux` 3.511 under +`jax.jit` vs 3.320 eager, rel=1e-3) — unrelated to `activate.sh`, which no test +sources. Ship once the bug above has turned main green (or on a human call to push +onto a red main with an override). + +The commit also survives as `a7f0d0a` on the local branch +`feature/hpc-cache-off-home-p2` of the canonical `lens/euclid_strong_lens_modeling_pipeline` +checkout (never pushed); cherry-pick it or apply the patch below onto current main. + +Parallel claim: `vis-lp-inspection-bundle` (feature/vis-lp-inspection-bundle) also +claims this repo; its diff (catalogue/, scripts/build_inspection_bundle.sh, +scripts/tools/build_inspect.py, hpc/batch_cpu/submit_build_inspection_bundle, tests/, +READMEs) does not touch `activate.sh` — a parallel claim is fine. + +## Ready patch (a7f0d0a) + +```diff +From a7f0d0a223971eb26171d7d65aaef55106adb902 Mon Sep 17 00:00:00 2001 +From: Jammy2211 +Date: Fri, 25 Sep 2026 21:08:41 +0100 +Subject: [PATCH] maintenance: keep Python/JAX caches off $HOME on HPC + (autolens_profiling#310) + +Phase 2 of autolens_inference#13 (RAL admin, 2026-09-25: ~/.cache filling node root +disks). The PYAUTO_HPC_BASE branch of activate.sh now carries phase 1's cache block +(verbatim from autolens_assistant): every cache variable lands under +${PYAUTO_HPC_CACHE:-$(dirname "$PYAUTO_HPC_BASE")/.cache}, filling only unset variables. +Laptop .venv users never reach this branch. + +Co-Authored-By: Claude Opus 5.5 +--- + activate.sh | 19 +++++++++++++++++++ + 1 file changed, 19 insertions(+) + +diff --git a/activate.sh b/activate.sh +index e2ca106..b2a8eb7 100644 +--- a/activate.sh ++++ b/activate.sh +@@ -23,6 +23,25 @@ $BASE/PyAutoFit:\ + $BASE/PyAutoArray:\ + $BASE/PyAutoGalaxy:\ + $BASE/PyAutoLens ++ # --- Keep caches OFF $HOME on HPC --------------------------------------- ++ # On many clusters (RAL: every node) /home sits on a small root disk, so tools that ++ # default to ~/.cache — the PyAutoNerves JAX compile cache (~/.cache/pyauto_jax), pip, ++ # matplotlib, numba, CUDA/Triton kernels — fill it and break the node (RAL admin, ++ # 2026-09-25). Send them to the shared project filesystem instead: by default a ++ # `.cache/` next to PYAUTO_HPC_BASE (override with PYAUTO_HPC_CACHE). Only unset ++ # variables are filled, so a submit script's own JAX_COMPILATION_CACHE_DIR still wins ++ # (and an explicitly EMPTY one still disables the JAX cache). Laptop `.venv` users ++ # never reach this branch. ++ export PYAUTO_HPC_CACHE="${PYAUTO_HPC_CACHE:-$(dirname "$PYAUTO_HPC_BASE")/.cache}" ++ mkdir -p "$PYAUTO_HPC_CACHE" 2>/dev/null || true ++ export XDG_CACHE_HOME="${XDG_CACHE_HOME:-$PYAUTO_HPC_CACHE}" ++ export PIP_CACHE_DIR="${PIP_CACHE_DIR:-$PYAUTO_HPC_CACHE/pip}" ++ export MPLCONFIGDIR="${MPLCONFIGDIR:-$PYAUTO_HPC_CACHE/matplotlib}" ++ export NUMBA_CACHE_DIR="${NUMBA_CACHE_DIR:-$PYAUTO_HPC_CACHE/numba}" ++ export CUDA_CACHE_PATH="${CUDA_CACHE_PATH:-$PYAUTO_HPC_CACHE/nv}" ++ export TRITON_CACHE_DIR="${TRITON_CACHE_DIR:-$PYAUTO_HPC_CACHE/triton}" ++ export JAX_COMPILATION_CACHE_DIR="${JAX_COMPILATION_CACHE_DIR-$PYAUTO_HPC_CACHE/pyauto_jax}" ++ export ASTROPY_CACHE_DIR="${ASTROPY_CACHE_DIR:-$PYAUTO_HPC_CACHE/astropy}" + else + echo "No local .venv found (set PYAUTO_HPC_BASE for a shared/HPC PyAuto checkout)." >&2 + fi +-- +2.34.1 + +``` diff --git a/complete/2026/11/jax-joss-benchmark-repo.md b/complete/2026/11/jax-joss-benchmark-repo.md new file mode 100644 index 000000000..2effb4d98 --- /dev/null +++ b/complete/2026/11/jax-joss-benchmark-repo.md @@ -0,0 +1,109 @@ +- summary: already shipped — PyAutoLabs/autolens_jax_joss: 9c66b020 (birth, 10 benchmark scripts), 64204f69 (A100 sweep of 8 benchmarks), 6b14c207 (paired_example refs); `complete/2026/09/workspace-dead-weight-cleanup.md` already flagged it as looking shipped. The 5-minute runtime targets stay tracked in joss_cluster_benchmark_tuning. +- found by: draft-queue sweep 2026-11-05 (read-only audit against the Mind ledger + GitHub commit/PR/code search); closure approved by the human. + +## Original prompt + +# autolens_jax_joss benchmark repo + real-data start_here pairing + +Type: feature +Target: autolens_workspace +Repos: +- autolens_jax_joss (new repo) +- autolens_workspace +Themes: +- profiling +- notebooks +- hpc-gpu +Difficulty: too-large +Autonomy: supervised +Priority: normal +Status: formalised +Consequence: judge +Review-minutes: 25 +Unattended: needs-slicing +Filed: 2026-07-16 (backfilled from git) + +Create a repo autolens_jax_joss which provides examples to run each JAX benchmark from the PyAutoLens-JAX paper draft and reports the run time and info. These benchmarks currently do not exist. + +Single-dataset and single-regime benchmarks (establish GPU acceleration and autodiff across lensing scales and data types): + +- Galaxy-scale CCD imaging: Model JWST COSMOS-Web Ring F150W imaging, including lens-light subtraction and a pixelized source reconstruction, in approximately five minutes. +- Interferometry: Model a real ALMA strong-lensing dataset containing more than one million interferometer visibilities in approximately five minutes. +- Point-source lensing: Model a real multiply imaged quasar or supernova using point-source observables, including image positions and, where available, time delays or flux information, in under five minutes. +- Group-scale strong lensing: Model a real group-scale lens containing multiple deflecting galaxies in under five minutes, demonstrating that PyAutoLens-JAX is not restricted to isolated galaxy-scale lenses. +- Cluster-scale strong lensing: Model a real cluster lens with multiple mass components, multiple images, and potentially multiple source planes in under five minutes. +- Weak lensing: Fit a weak-lensing shear catalogue using a differentiable JAX likelihood in under five minutes, demonstrating that PyAutoLens-JAX is not restricted to strong-lensing data. + +Joint and multi-dataset benchmarks (different datasets, lensing regimes, and physical scales combined in a single differentiable, GPU-accelerated probabilistic model): + +- Multi-band imaging: Jointly model the four available JWST COSMOS-Web Ring bands, constraining a common lens mass model while fitting the wavelength-dependent lens and source emission in each dataset. +- Joint strong and weak lensing: Constrain a single group- or cluster-scale mass model using both strong-lensing and weak-lensing observables. +- Imaging and point-source lensing: Jointly model extended arcs and point-source constraints from a lensed quasar or supernova within the same lens model. +- Imaging and interferometry: Jointly fit optical or infrared imaging and radio or submillimetre interferometer visibilities, constraining a common mass model using complementary observations of the lensed source. + +Pairing requirement: pair each benchmark to the start_here.py file in each autolens_workspace package. For example the JWST COSMOS-Web Ring F150W example, which is made fast, is paired to autolens_workspace/scripts/imaging/start_here.py. All 6 single-dataset start_here.py examples should use real data, and each JOSS example should use the same real data. + +The four multi examples pair to examples in autolens_workspace/scripts/multi or scripts/weak/features/strong_lensing. A new multi script will likely be needed for the imaging + point-source lensing joint-modelling benchmark. + + + +--- + +## PARKED 2026-07-28 — resume state (moved out of `active.md`) + +Parked by user request during a `/repo_cleanup` sweep ("we will come back to JOSS +benchmarks later"). The `active.md` registry entry was removed; this section is +the authoritative resume context. Issue: + +**Status at park:** `#282 MERGED+cleaned`; 8/8 runnable A100 rows committed +(`autolens_jax_joss@64204f6`). + +**Worktree:** `~/Code/PyAutoLabs-wt/jax-joss-benchmarks` **no longer exists on +disk** — recreate it (`start_workspace`) before resuming. Autonomy: supervised. +New repo `autolens_jax_joss` (PyAutoLabs, public) was born alongside this task. +Datasets SDP.81 / RXJ1131 / A2744 are user-approved. 5-phase epic, one-shot +attempt per user. + +**SDP.81 prep** = detached RAL job `330608`. (Job `330605` diagnosed: an empty +leftover `extracted/` skipped the untar — fixed via a `test -d` guard; `casatools` +import needs `~/.casa/data` — also fixed. The 42GB tarball is CACHED, so no +re-download.) Pipeline: 45GB ALMA Band6 download -> casatools venv -> 3-level +export -> installs `dataset/interferometer/{sdp81,sdp81_mid,sdp81_full}` under +`/mnt/ral/jnightin/autolens_jax_joss`. + +**RESUME (short session):** + +1. Check `/mnt/ral/jnightin/sdp81_prep_330608.log` — expect `SDP81 PREP ALL DONE` + plus per-level visibility counts. Failure modes: casatools pip wheel on py3.12 + (fallback = monolithic CASA tarball), datacolumn, `MS_LIST` empty (check the + find patterns). +2. `sbatch` the interferometry benchmarks on A100: `benchmarks/interferometer.py` + at `--nvis` default/mid/full, plus `benchmarks/imaging_and_interferometer.py` + (pattern: `/mnt/ral/jnightin/autolens_jax_joss/run_rest.sbatch`). +3. `scp results/*.json` back, regenerate `RESULTS.md`, commit — **guard: commit + explicit file paths only**. +4. Copy the small `sdp81/` product locally and rewrite + `scripts/interferometer/start_here.py` on a NEW branch (`start_workspace`; + #282 is merged) using it. Decide hosting: commit few-MB FITS to the workspace + with a `.gitignore` allowlist + `git add -f`, or Zenodo + `SDP81_URL`. +5. Final issue #281 update. + +**Also pending:** cluster-tuning prompt +`draft/feature/autolens_workspace/joss_cluster_benchmark_tuning.md`; weak JAX-viz +`PyAutoLens#614`. + +## Update 2026-09-18 — likely shipped; needs reconcile, not deletion + +`PyAutoLabs/autolens_jax_joss` **now exists on GitHub** at `6bce65e` with benchmark +scripts under `benchmarks/`, committed `results/*.json` and a `RESULTS.md`; its last +science commit reads "complete first A100 sweep — 8 benchmarks + imaging Nautilus +comparison". So the core of this prompt appears **delivered**. + +Its **local checkout was removed** 2026-09-18 (PyAutoBrain#389) as dead weight — the +remote is untouched and remains the citable artefact behind the JOSS paper. + +This prompt was NOT retired, because "shipped" was not verified: confirm which of the +listed benchmarks (galaxy-scale, interferometry, point-source, group, cluster, weak) +actually exist, and whether the paired `autolens_workspace` `start_here` examples +landed, then retire to `complete/` per the intake reconcile procedure. Verification +now needs a clone or the GitHub UI rather than a local checkout. diff --git a/complete/2026/11/lifecycle-p3-designation-proposals.md b/complete/2026/11/lifecycle-p3-designation-proposals.md new file mode 100644 index 000000000..e010dffdb --- /dev/null +++ b/complete/2026/11/lifecycle-p3-designation-proposals.md @@ -0,0 +1,1370 @@ +- summary: decided and shipped — the human approved all 39 designations (datacube/delaunay gpu_a100 held provisional); PyAutoPulse#84 (bcaf6b86, 2026-10-31), record `complete/2026/10/likelihood-lifecycle-p3-designation-records.md` (its Witness cites Appendix B of this proposals file as approved); epic ledger updated. +- found by: draft-queue sweep 2026-11-05 (read-only audit against the Mind ledger + GitHub commit/PR/code search); closure approved by the human. + +## Original prompt + +# Likelihood lifecycle phase 3: designation proposals for the completed campaigns (2a imaging, 2b interferometer, 2c point source) — DRAFT for the human + +Type: research +Target: autolens_profiling +Repos: +- autolens_profiling +- PyAutoPulse +Themes: +- profiling +- dashboard +Difficulty: large +Autonomy: human-required +Priority: high +Status: draft proposals for the human — never issued itself; no Pulse decision record exists or is implied, and `catalogue/provisional_designations.json` is unchanged. The phase 3 prompt (filed after the "campaigns complete" gate) cites this file +Consequence: judge +Review-minutes: 45 +Unattended: never +Epic: likelihood-lifecycle +Parent: draft/research/autolens_profiling/likelihood_lifecycle_epic.md +Filed: 2026-10-29 + +Written 2026-10-29 (Opus 5.5) from autolens_profiling `main` at 32c0becd (`dashboard/catalogue.json` generated 2026-10-29T09:46:25Z, `dashboard/coverage.json`, `catalogue/provisional_designations.json`, `catalogue/reference_hosts.json`, and the campaign pages below) and PyAutoPulse `main` at 4a4bdee (`decisions/README.md` "Designation decisions", `REFERENCE.md`, `pulse/decisions.py`). No repo code was changed, no decision recorded, no compute submitted. + +## Re-derivation 2026-10-31 on the day-zero catalogue (supersedes Appendix A for the record step) + +Re-derived from autolens_profiling PR #496 head `c218a428` (`dashboard/catalogue.json`). That is main after #494 (the quiet reruns) plus every 2a–2c JAX row on jax/jaxlib 0.11.2, which is the catalogue main will hold once #496 merges. It covers all seven campaigns (2a–2g) on the axis the human fixed on 2026-10-30: +- **Q1/Q3:** rank by projected calls/s per node within each hardware class. A setup separates when the winner beats the runner-up by more than the larger recorded p10–p90 spread, or by more than the 9 % arm-to-arm noise when no spread is recorded. +- **Q2/Q11:** `gpu_a100` means GPU setups only, with GPU-only secondaries. +- **Q5:** interferometer is designated by `standard`, with an instrument-keyed rule. +- **Q10:** untested branches are named in the rule. + +The generator scripts are `designate.py` and `appendix_b.py` (session scratch, reproduced in the PR that records the decisions). Every entry passes `pulse.decisions._designation`. + +**Result: 40 likelihood × hardware-class groups. 39 can be designated (21 separated, 18 uncontested) and 1 holds.** + +- **Hold:** `datacube/delaunay` `gpu_a100`. At sma, `jax_gpu_sparse_fp64_wtilde` 3.46 against `jax_gpu_dense_fp64_nufft` 3.37 calls/s/node is 1.03×, inside the 9 % tolerance; alma and alma_high measured only W~ sparse. It keeps its §3.3 provisional label. +- **Changed since 2026-10-29:** + 1. `interferometer/delaunay` `cpu_many_core`, jvla: the old **HOLD (25 %) now separates.** Numba is 1.22 against JAX 0.564 calls/s/node (2.17×). The quiet rerun sped numba up (0.87×) and jax 0.11.2 plus the eigen flag slowed JAX CPU W~ down (1.50×). + 2. `point_source_source/source_plane` `gpu_a100`: the old draft proposed the node CPU (`jax_cpu_na_fp64`). Under Q2 it is `jax_gpu_na_fp64`. This follows the ruling, not new data. + 3. The interferometer ids are now `…-standard-…` instead of the n_vis bins (Q5). The optimal setup is the same in every old bin. +- **Unchanged:** every other 2a, 2b and 2c proposal keeps its optimal setup. +- **The JAX CPU slowdown flips nothing.** Every CPU group with a numba setup was already numba, by 2.2–50× per node (min interferometer/delaunay jvla 2.17×, max group/delaunay euclid 49.6×). JAX-only CPU groups (MGE, point source, cluster, weak) are uncontested. +- **New groups (2d–2g):** + - group, multi_galaxy and multi_dataset follow imaging: numba on CPU, `jax_gpu_dense_fp64` on the A100, all separated. + - datacube on CPU: numba W~, separated. + - cluster and weak: uncontested JAX. +- **Caveats:** + - imaging/rectangular euclid numba has no MaxRSS (sacct missed the task), so it has no projection; that instrument is ranked per call (numba 3.22× JAX). + - Uncontested groups rest on one measured setup. + - Projections are upper bounds: η = 1.0, declared and unmeasured until phase 4. Every record says `basis: projected` in its prose (Q4 option a). + +**For the human (the record step):** approve the 39, or name the ones to hold, and confirm the datacube A100 hold. On approval the conductor writes the 39 `decisions/.md` and `decisions.yaml` rows in PyAutoPulse, then the producers re-declare `class: optimal` + `decision_id` on the cited rows (autolens_profiling), and `pyauto-pulse check` must resolve them. + +## What this is, and what it is not + +The epic's rule (ledger Summary; report §3.2) is that an optimal setup is always a Pulse `designation` decision made by the human, never inferred. Phase 3 (ledger card; report §4 "Phase 3") must produce: a pinned released tag with every Optimal/Secondary cell measured on it, `day_zero` stamped, a Pulse `day_zero` snapshot, **one `designation` decision per likelihood × hardware class (the conductor drafts, the human records)**, `wiki/campaigns///day_zero.md` decision-rule notes, the Pulse `setup-baseline` campaign adopted and closed with its 1,044-slot manifest replaced, no `not_measured` Optimal cell on Coverage, and the `runtime_estimates` export. Phase 3 is gated on the human's "campaigns complete" confirmation, which has not happened (2d–2g have not run on RAL). + +This file is the "conductor drafts" part for the three campaigns that are complete. For each likelihood × hardware class it gives the §3.3 provisional setups, the measured evidence, a proposed optimal and secondary, a one-line reason, whether it confirms or overturns §3.3, and the caveats that could change the call. Appendix A holds each proposal as a draft `decisions.yaml` entry in the shape `decisions/README.md` specifies; all 26 pass `pulse.decisions._designation` (run against PyAutoPulse `pulse/decisions.py`, identical to `main`). They are drafts: the `date` is a placeholder for the human's decision date, and nothing is in any index. + +Sources: + +- Campaign pages (autolens_profiling 32c0becd): imaging [`wiki/campaigns/imaging/likelihood_lifecycle_p2a.md`](https://github.com/PyAutoLabs/autolens_profiling/blob/32c0becd/wiki/campaigns/imaging/likelihood_lifecycle_p2a.md) (#461, #467; 106/106 current); interferometer [`wiki/campaigns/interferometer/likelihood_lifecycle_p2b.md`](https://github.com/PyAutoLabs/autolens_profiling/blob/32c0becd/wiki/campaigns/interferometer/likelihood_lifecycle_p2b.md) (#471, #483; 60/60); point source [`wiki/campaigns/point_source_source/source_plane/likelihood_lifecycle_p2c.md`](https://github.com/PyAutoLabs/autolens_profiling/blob/32c0becd/wiki/campaigns/point_source_source/source_plane/likelihood_lifecycle_p2c.md) and its [image-plane twin](https://github.com/PyAutoLabs/autolens_profiling/blob/32c0becd/wiki/campaigns/point_source_image/image_plane/likelihood_lifecycle_p2c.md) (#480; 10/10; human ruling: the published runtime is the Solved likelihood). +- Node throughput: phase 2x (#463, #465, PyAutoPulse#77), the `projected_node_throughput` block on every runtime record. +- Every current runtime row of these likelihoods is on `release_pin` 2026.10.25.1 (imaging rows measured on 2026.10.23.1 and carried by the declared `carry_forward`, #466/#467). + +## The comparison axis (pre-registered by the report; restated, not chosen here) + +The report's "Amendment 2026-10-25: node throughput" (human-approved) fixes the axis before the data: keep **separate** Optimal GPU and Optimal CPU designations; within each, **rank by projected throughput on the named hardware budget (calls per second per node)**, with per-call latency only as secondary evidence; designations made before phase 4 carry `basis: projected` and are revisited when phase 4 measures the parallel efficiency η. The proposals below follow that axis and say where the per-call axis would give a different answer. Two gaps the report leaves open are questions for the human (Q2, Q4): whether a GPU node's "hardware budget" includes its 124 CPU cores, and where `basis: projected` goes, since the Pulse designation schema refuses any field it does not list. + +Mapping used: host class `hpc_a100` (RAL gpu node, 4 × A100 80GB PCIe, 124 cores, 885 GB) → `hardware_class: gpu_a100`; `hpc_ral_cpu` (RAL ral node, declared 236 cores, 921 GB) → `cpu_many_core` (`catalogue/reference_hosts.json`). `laptop` has no current evidence (R7: laptop rows are never current), so no laptop proposal is made (Q6). + +## How to read the evidence tables + +- **Headline per call**, by the basis the campaign pages define: JAX `single-jit median` (median of individually timed calls after the warm calls; 200 calls in 2a/2c), or `single-jit block mean †` where the leg recorded only the one-block mean (catalogue `metric: single_jit_block` on a JAX row); numba `warm iid median` (median over seeded iid draws after the compile: 16 in 2a; 16/16/6/1 at sma/alma/alma_high/jvla in 2b, per the 2b page). For 2b numba rows the forced `direct_conv` and NumPy FFT route arms are shown beside the cost-model pick (2b ruling R4). +- **p10–p90**: the single-jit spread recorded in the row (`full_pipeline_single_jit_p{10,90}_ms`); absent on † rows and numba rows. +- **vmap per call [batch]**: batch time / batch size at the batch the script chose. It is the per-call source of every JAX row's projection (`per_call_source: vmap.per_call`); numba's is the warm iid median. +- **Projected calls/s per node**: `projected_node_throughput.hosts[0]` — workers = min(cores / cores per call, node memory / peak RSS), or one per GPU, × η (declared 1.0, an upper bound, unmeasured) / per-call time; each row projected only onto the node class it was measured on (#464). Not modelled: Nautilus `n_batch`, shared memory bandwidth. +- **Peak RSS** is the row's (2b/2c) or the sacct backfill's (2a: exact per RAL leg; the multi-leg A100 job's peak, an upper bound, on A100). +- **Parity** is the cell's witness status from the catalogue's `parity_witnesses` (all 88 cell witnesses here — 53 imaging, 30 interferometer, 5 point source — `match`; 0 `diverged`). +- **Rounding**: one rule for every number below, applied to the record value: per-call times to 4 significant figures (integers with separators from 1,000 ms), projections and RSS to 3 significant figures. The campaign pages round some values one digit differently (e.g. 0.1986 ms prints as 0.20 on the 2a page and 0.1986 here); the record id is the source. +- **Record ids are path-hashed** (2b page, Journal 2026-10-29): when the quiet-rerun ingest replaces a RAL CPU row in place, the same id will name the new row. Re-resolve every evidence id at the freeze commit before recording a decision. + +## Cross-cutting caveats (referenced as C1–C9 below) + +- **C1 RAL CPU load.** 2a RAL CPU rows: load average 8.6–37 at write (2a page). 2b: every RAL CPU row started at a 1-minute load of 45–72 on euclid-ral-compute-1 (2b page, "Load"). 2c: the two solved RAL CPU runtime rows started at 33.4 on euclid-ral-compute-10-5 (2c page). All are refused as dashboard trend points (cap 8) but stay `current`. The quiet reruns RAL 413267 (2c, 2 legs) and 413268–413271 (2b, 38 legs) are queued (`likelihood_lifecycle_p2bc_quiet_rerun_ingest.md`; their state was not checked from this session, RAL is not mounted here), so **every 2b and 2c RAL CPU number may move**. The 2a RAL CPU rows are **not** in the rerun. +- **C2 A100 host.** Every A100 runtime row here ran on euclid-ral-gpu-1; the release sweep pins euclid-ral-gpu-2 (`hpc/release_sweep.conf`), so they are flagged off-host on the run-time dashboard. Comparisons inside `gpu_a100` are all on gpu-1, so they are like-for-like with each other. A100 load at write: 9–13 (2a), 1–7 (2b), ≤ 2.5 (2c). +- **C3 Close calls.** Where two setups sit inside each other's p10–p90, or within a few per cent with no spread recorded, the evidence does not separate them; each is named where it occurs. +- **C4 jax version and the XLA:CPU deadlock.** Every current 2a/2b/2c row records `jax`/`jaxlib` **0.10.2** (`identity.software`; checked in the raw rows) and `XLA_FLAGS` without `--xla_cpu_multi_thread_eigen=false`. The jaxlib 0.11.2 XLA:CPU deadlock (PyAutoPulse `knowledge/xla_cpu_deadlock_jaxlib_0_11_2.md`; decision `xla-cpu-deadlock-eigen-workaround`, D12) was found on 0.11.2 and is untested for these executables. But tag 2026.10.25.1's PyAutoNerves declares `jax>=0.7.0,<0.12.0,!=0.10.*,!=0.11.0` ("CPU batched LAPACK can deadlock in 0.10.x / 0.11.0 (Heart#274)", commit 249ba9e, 2026-10-04): **the JAX evidence was measured on a jax the pinned tag excludes**, while the superseded 2026.10.17.1 point-source rows recorded jaxlib 0.11.2 and the 2d–2g legs will run on 0.11.2 with the D12 flag (+25 % per call on laptop group/mge against the deadlocking default; within ~15 % on pixelized cells). A 2a/2b/2c JAX CPU row is therefore not like-for-like with a 2d–2g JAX CPU row on two axes (jax version, eigen flag). Numba rows (numba 0.65.1) are not affected by the jax version. This is Q7 and the largest open item for the freeze. +- **C5 Mixed precision** is `experimental` everywhere (R4; footnote to §3.3). No mixed-precision row exists in 2a–2c, so no proposal names one. +- **C6 Per call vs per node.** Within one hardware class the two axes agree everywhere except: imaging/delaunay euclid on RAL (per-call tie), interferometer pixelized alma_high and jvla on RAL (JAX CPU faster per call, numba ahead per node), and point-source source plane on the A100 node (per-call tie, CPU cores ahead per node). Across classes (which hardware a fit should request), a ral node is projected ahead of a 4×A100 node for interferometer pixelized at sma and alma but behind it at alma_high and jvla (2b headline), and ahead on hst Delaunay imaging but behind on ao (2a). That cross-class choice is phase 5's (`setup="auto"` when both are present), not a designation; it is stated here because it is the same axis question. +- **C7 JAX CPU cores per call.** Every JAX CPU row ran with 8 threads (`cpus_per_eval` 8), so a ral node projects 29 JAX CPU workers against 236 numba workers. A JAX CPU leg with fewer threads per call was never measured, so the per-node rank of JAX CPU against numba is conditional on that thread count. +- **C8 Projection source.** Projections use vmap per call, which on some rows is slower than the single-jit median (e.g. interferometer rectangular alma A100: vmap 51.22 ms [3] against single-jit 36.01 ms; interferometer/mge sma RAL: 112.5 against 90.63 ms). No within-class ordering below changes if the single-jit median is used instead. +- **C9 Phase 4.** η is declared 1.0 (upper bound). The CPU projections (hundreds of workers sharing memory bandwidth) are the most optimistic (2a page). Phase 4 measures η per setup and host; any designation here is `basis: projected` until then (report amendment). + +## Evidence (current runtime rows; size-variant 28² rows excluded) + +The four `size_variant` rows at hst rectangular 784 source pixels (`source_pixels_784/`, autolens_profiling#468, the rect28 rows for autolens_inference) are current but not the standard size, so they are not evidence for a standard-regime designation. + +### Evidence: imaging/delaunay + +| instrument | setup @ host | headline per call (ms), basis | p10–p90 (ms) | vmap per call (ms) [batch] | cores/call | peak RSS (GB) | projected calls/s per node (workers, bound) | parity | runtime record | +|---|---|---|---|---|---|---|---|---|---| +| euclid | `jax_cpu_sparse_fp64` @ A100 node | 1,146, single-jit median | 1,127–1,169 | 857.4 [3] | 8 | 1.91 | 17.5 (15, cores) | match | `lifecycle/a9e102b324300939da14` | +| euclid | `jax_gpu_dense_fp64` @ A100 node | 44.73, single-jit median | 44.24–45.63 | 14.80 [64] | 8 | 1.91 | 270 (4, gpus) | match | `lifecycle/c07af59a8d393975dd28` | +| euclid | `jax_gpu_sparse_fp64` @ A100 node | 46.85, single-jit median | 46.67–47.30 | 18.16 [64] | 8 | 1.91 | 220 (4, gpus) | match | `lifecycle/371f67d50254479493ee` | +| euclid | `jax_cpu_sparse_fp64` @ RAL | 1,122, single-jit median | 1,100–1,165 | 826.6 [3] | 8 | 1.74 | 35.1 (29, cores) | match | `lifecycle/b202eb6f7da58a38882f` | +| euclid | `numba_cpu_sparse_fp64` @ RAL | 820.0, numba warm iid median | — | — | 1 | 0.551 | 288 (236, cores) | match | `lifecycle/5556ca430bc180c2d536` | +| hst | `jax_cpu_sparse_fp64` @ A100 node | 2,562, single-jit block mean † | — | 2,110 [3] | 8 | 10.7 | 7.11 (15, cores) | match | `lifecycle/0f45aa8eb79d60157031` | +| hst | `jax_gpu_dense_fp64` @ A100 node | 59.58, single-jit median | 59.19–60.42 | 35.05 [16] | 8 | 10.7 | 114 (4, gpus) | match | `lifecycle/73c19173fcc983318b61` | +| hst | `jax_gpu_sparse_fp64` @ A100 node | 76.23, single-jit median | 75.45–76.79 | 47.93 [16] | 8 | 10.7 | 83.5 (4, gpus) | match | `lifecycle/12c678df16e04f4f9011` | +| hst | `jax_cpu_sparse_fp64` @ RAL | 2,221, single-jit block mean † | — | 1,895 [3] | 8 | 3.20 | 15.3 (29, cores) | match | `lifecycle/06a9dad80c65ecd81c6c` | +| hst | `numba_cpu_sparse_fp64` @ RAL | 951.7, numba warm iid median | — | — | 1 | 0.854 | 248 (236, cores) | match | `lifecycle/321ec1f6f2a5955a9a20` | +| jwst | `jax_cpu_sparse_fp64` @ A100 node | 5,086, single-jit block mean † | — | 4,686 [3] | 8 | 7.38 | 3.20 (15, cores) | match | `lifecycle/97d2ae3cab5f9bbc9d8f` | +| jwst | `jax_gpu_dense_fp64` @ A100 node | 88.63, single-jit median | 87.74–90.16 | 72.29 [8] | 8 | 7.38 | 55.3 (4, gpus) | match | `lifecycle/12348bea7be2ca70cffb` | +| jwst | `jax_gpu_sparse_fp64` @ A100 node | 124.2, single-jit median | 124.0–124.6 | 108.1 [8] | 8 | 7.38 | 37.0 (4, gpus) | match | `lifecycle/d34ebb3d52e02dfb8b16` | +| jwst | `jax_cpu_sparse_fp64` @ RAL | 4,759, single-jit block mean † | — | 4,361 [3] | 8 | 5.58 | 6.65 (29, cores) | match | `lifecycle/b5b87c504713b9831857` | +| jwst | `numba_cpu_sparse_fp64` @ RAL | 1,745, numba warm iid median | — | — | 1 | 1.98 | 135 (236, cores) | match | `lifecycle/d93b4dad29e8a0f77987` | +| ao | `jax_cpu_sparse_fp64` @ A100 node | 56,742, single-jit block mean † | — | 57,179 [1] | 8 | 39.8 | 0.262 (15, cores) | match | `lifecycle/780ad479b1fe66279696` | +| ao | `jax_gpu_dense_fp64` @ A100 node | 368.2, single-jit median | 363.9–371.5 | 366.9 [1] | 8 | 39.8 | 10.9 (4, gpus) | match | `lifecycle/fa028d54604cd08d3555` | +| ao | `jax_gpu_sparse_fp64` @ A100 node | 886.7, single-jit median | 885.9–887.5 | 935.3 [1] | 8 | 39.8 | 4.28 (4, gpus) | match | `lifecycle/99d7c3c7623e3d43d059` | +| ao | `jax_cpu_sparse_fp64` @ RAL | 56,746, single-jit block mean † | — | 55,292 [1] | 8 | 19.5 | 0.524 (29, cores) | match | `lifecycle/e08b7a6ff7b9daea8790` | +| ao | `numba_cpu_sparse_fp64` @ RAL | 8,671, numba warm iid median | — | — | 1 | 23.0 | 4.61 (40, memory) | match | `lifecycle/1f22a4a5fcd73276ec53` | + +### Evidence: imaging/delaunay_nn + +| instrument | setup @ host | headline per call (ms), basis | p10–p90 (ms) | vmap per call (ms) [batch] | cores/call | peak RSS (GB) | projected calls/s per node (workers, bound) | parity | runtime record | +|---|---|---|---|---|---|---|---|---|---| +| hst | `jax_cpu_sparse_fp64` @ A100 node | 6,250, single-jit block mean † | — | 6,235 [3] | 8 | 10.7 | 2.41 (15, cores) | match | `lifecycle/cbc5540f3214caf61aba` | +| hst | `jax_gpu_dense_fp64` @ A100 node | 89.59, single-jit median | 89.50–89.82 | 42.74 [16] | 8 | 10.7 | 93.6 (4, gpus) | match | `lifecycle/c661098ad46c65fa59b2` | +| hst | `jax_gpu_sparse_fp64` @ A100 node | 1,201, single-jit median | 1,200–1,201 | 1,149 [16] | 8 | 10.7 | 3.48 (4, gpus) | match | `lifecycle/70bcae3ab1c4777651f0` | +| hst | `jax_cpu_sparse_fp64` @ RAL | 6,831, single-jit block mean † | — | 6,427 [3] | 8 | 10.8 | 4.51 (29, cores) | match | `lifecycle/1ae46b0872f10459a7c4` | +| hst | `numba_cpu_sparse_fp64` @ RAL | 1,295, numba warm iid median | — | — | 1 | 0.831 | 182 (236, cores) | match | `lifecycle/05dde64a0eb7fdd0c4a1` | + +### Evidence: imaging/mge + +| instrument | setup @ host | headline per call (ms), basis | p10–p90 (ms) | vmap per call (ms) [batch] | cores/call | peak RSS (GB) | projected calls/s per node (workers, bound) | parity | runtime record | +|---|---|---|---|---|---|---|---|---|---| +| euclid | `jax_gpu_dense_fp64` @ A100 node | 5.916, single-jit median | 5.729–6.194 | 0.1986 [64] | 8 | 1.91 | 20,100 (4, gpus) | match | `lifecycle/770dce7d7db7a1fc3b53` | +| euclid | `jax_cpu_dense_fp64` @ RAL | 7.896, single-jit median | 7.535–8.377 | 6.797 [3] | 8 | — | not projected (no peak RSS) | match | `lifecycle/190ebc582d9aba9aaa9c` | +| hst | `jax_gpu_dense_fp64` @ A100 node | 6.285, single-jit median | 6.250–6.337 | 0.4116 [64] | 8 | 10.7 | 9,720 (4, gpus) | match | `lifecycle/8a475e9abd97a8c4a1c0` | +| hst | `jax_cpu_dense_fp64` @ RAL | 21.22, single-jit median | 19.55–22.43 | 14.39 [3] | 8 | — | not projected (no peak RSS) | match | `lifecycle/54979849c807d452c510` | +| jwst | `jax_gpu_dense_fp64` @ A100 node | 7.000, single-jit median | 6.933–7.354 | 0.9966 [64] | 8 | 7.38 | 4,010 (4, gpus) | match | `lifecycle/0756e600e86d7ae6a462` | +| jwst | `jax_cpu_dense_fp64` @ RAL | 50.25, single-jit median | 45.86–59.97 | 41.55 [3] | 8 | 1.29 | 698 (29, cores) | match | `lifecycle/4baa9bc04c8d24a713b6` | +| ao | `jax_gpu_dense_fp64` @ A100 node | 15.73, single-jit median | 15.68–15.78 | 18.98 [3] | 8 | 39.8 | 211 (4, gpus) | match | `lifecycle/4b514c4262172f610fee` | +| ao | `jax_cpu_dense_fp64` @ RAL | 388.9, single-jit median | 347.7–444.2 | 329.7 [3] | 8 | 3.49 | 88.0 (29, cores) | match | `lifecycle/3216ffc143645fb46c72` | + +### Evidence: imaging/rectangular + +| instrument | setup @ host | headline per call (ms), basis | p10–p90 (ms) | vmap per call (ms) [batch] | cores/call | peak RSS (GB) | projected calls/s per node (workers, bound) | parity | runtime record | +|---|---|---|---|---|---|---|---|---|---| +| euclid | `jax_cpu_sparse_fp64` @ A100 node | 827.4, single-jit median | 810.4–859.4 | 633.8 [3] | 8 | 1.91 | 23.7 (15, cores) | match | `lifecycle/9e4861d45b9802a91868` | +| euclid | `jax_gpu_dense_fp64` @ A100 node | 29.83, single-jit median | 29.19–30.50 | 7.926 [64] | 8 | 1.91 | 505 (4, gpus) | match | `lifecycle/456f7d65babc5524183a` | +| euclid | `jax_gpu_sparse_fp64` @ A100 node | 34.68, single-jit median | 34.62–34.86 | 13.19 [64] | 8 | 1.91 | 303 (4, gpus) | match | `lifecycle/bc5ed323618c58fc7682` | +| euclid | `jax_cpu_sparse_fp64` @ RAL | 858.5, single-jit median | 772.5–942.2 | 683.0 [3] | 8 | 1.91 | 42.5 (29, cores) | match | `lifecycle/4c53e409a27040f5d6a4` | +| euclid | `numba_cpu_sparse_fp64` @ RAL | 282.5, numba warm iid median | — | — | 1 | — | not projected (no peak RSS) | match | `lifecycle/6060fdcfa2e5a4a0c168` | +| hst | `jax_cpu_sparse_fp64` @ A100 node | 1,968, single-jit median | 1,946–2,009 | 1,709 [3] | 8 | 10.7 | 8.78 (15, cores) | match | `lifecycle/22c24ae6e2c83dc51d89` | +| hst | `jax_gpu_dense_fp64` @ A100 node | 40.66, single-jit median | 40.59–40.77 | 25.50 [16] | 8 | 10.7 | 157 (4, gpus) | match | `lifecycle/42f6a707360ce63b8150` | +| hst | `jax_gpu_sparse_fp64` @ A100 node | 61.55, single-jit median | 61.50–61.67 | 41.19 [16] | 8 | 10.7 | 97.1 (4, gpus) | match | `lifecycle/cc3f3365b6ac65388a93` | +| hst | `jax_cpu_sparse_fp64` @ RAL | 2,155, single-jit block mean † | — | 2,029 [3] | 8 | 3.15 | 14.3 (29, cores) | match | `lifecycle/2b5e34f509175fd4d030` | +| hst | `numba_cpu_sparse_fp64` @ RAL | 696.7, numba warm iid median | — | — | 1 | 1.02 | 339 (236, cores) | match | `lifecycle/b62534053c00fb102bf4` | +| jwst | `jax_cpu_sparse_fp64` @ A100 node | 4,141, single-jit block mean † | — | 3,940 [3] | 8 | 7.38 | 3.81 (15, cores) | match | `lifecycle/cfba00e49ad2fb8681cb` | +| jwst | `jax_gpu_dense_fp64` @ A100 node | 66.30, single-jit median | 65.77–66.77 | 62.84 [8] | 8 | 7.38 | 63.6 (4, gpus) | match | `lifecycle/ec69a200557ea8212e5e` | +| jwst | `jax_gpu_sparse_fp64` @ A100 node | 116.8, single-jit median | 116.7–117.6 | 107.5 [8] | 8 | 7.38 | 37.2 (4, gpus) | match | `lifecycle/bdffd9d6d157b3b66435` | +| jwst | `jax_cpu_sparse_fp64` @ RAL | 4,453, single-jit block mean † | — | 4,210 [3] | 8 | 5.38 | 6.89 (29, cores) | match | `lifecycle/9bb2e30e94491253641b` | +| jwst | `numba_cpu_sparse_fp64` @ RAL | 1,688, numba warm iid median | — | — | 1 | 1.98 | 140 (236, cores) | match | `lifecycle/304ac75d242dcbc2c22f` | +| ao | `jax_cpu_sparse_fp64` @ A100 node | 50,291, single-jit block mean † | — | 50,843 [1] | 8 | 39.8 | 0.295 (15, cores) | match | `lifecycle/3617cdce4ec7d5357c4f` | +| ao | `jax_gpu_dense_fp64` @ A100 node | 309.6, single-jit median | 308.6–310.9 | 310.8 [1] | 8 | 39.8 | 12.9 (4, gpus) | match | `lifecycle/d570569f32c953038fde` | +| ao | `jax_gpu_sparse_fp64` @ A100 node | 968.4, single-jit median | 967.2–969.4 | 1,053 [1] | 8 | 39.8 | 3.80 (4, gpus) | match | `lifecycle/46db4990a22e25aee123` | +| ao | `jax_cpu_sparse_fp64` @ RAL | 50,877, single-jit block mean † | — | 48,794 [1] | 8 | 22.3 | 0.594 (29, cores) | match | `lifecycle/d7020017fca2249bf32b` | +| ao | `numba_cpu_sparse_fp64` @ RAL | 9,982, numba warm iid median | — | — | 1 | 28.0 | 3.21 (32, memory) | match | `lifecycle/403420f8debaaa38956c` | + +### Evidence: interferometer/delaunay + +| instrument | setup @ host | headline per call (ms), basis | p10–p90 (ms) | vmap per call (ms) [batch] | cores/call | peak RSS (GB) | projected calls/s per node (workers, bound) | parity | runtime record | +|---|---|---|---|---|---|---|---|---|---| +| sma | `jax_gpu_dense_fp64_nufft` @ A100 node | 55.86, single-jit median | 55.76–56.23 | 55.77 [1] | 8 | 5.00 | 71.7 (4, gpus) | match | `lifecycle/ff5c53947f845ee5f2d8` | +| sma | `jax_gpu_sparse_fp64_wtilde` @ A100 node | 27.49, single-jit median | 27.39–27.69 | 12.09 [64] | 8 | 1.68 | 331 (4, gpus) | match | `lifecycle/742eaf1292ed737e591e` | +| sma | `jax_cpu_dense_fp64_nufft` @ RAL | 6,411, single-jit block mean † | — | 5,702 [3] | 8 | 33.0 | 4.74 (27, memory) | match | `lifecycle/284efdc05b70e06e060a` | +| sma | `jax_cpu_sparse_fp64_wtilde` @ RAL | 1,169, single-jit median | 1,001–1,298 | 859.2 [3] | 8 | 1.32 | 33.8 (29, cores) | match | `lifecycle/00838694b2c3c955a644` | +| sma | `numba_cpu_sparse_fp64_wtilde` @ RAL | 335.1, numba warm iid median (route arms: direct_conv 338.4, NumPy FFT 1,166) | — | — | 1 | 0.853 | 704 (236, cores) | match | `lifecycle/b2d01ef74bf71e49d774` | +| alma | `jax_gpu_sparse_fp64_wtilde` @ A100 node | 40.26, single-jit median | 40.02–41.05 | 22.65 [64] | 8 | 2.53 | 177 (4, gpus) | match | `lifecycle/8dada4df3a4ed30d1721` | +| alma | `jax_cpu_sparse_fp64_wtilde` @ RAL | 2,845, single-jit block mean † | — | 2,712 [3] | 8 | 2.39 | 10.7 (29, cores) | match | `lifecycle/60747d6f7a1867da50c9` | +| alma | `numba_cpu_sparse_fp64_wtilde` @ RAL | 823.6, numba warm iid median (route arms: direct_conv 817.9, NumPy FFT 3,052) | — | — | 1 | 1.55 | 286 (236, cores) | match | `lifecycle/5e9d64046821795b4651` | +| alma_high | `jax_gpu_sparse_fp64_wtilde` @ A100 node | 82.48, single-jit median | 82.36–82.80 | 68.81 [16] | 8 | 4.16 | 58.1 (4, gpus) | match | `lifecycle/ba12584bdfe8c2e16f30` | +| alma_high | `jax_cpu_sparse_fp64_wtilde` @ RAL | 9,692, single-jit block mean † | — | 8,500 [3] | 8 | 9.31 | 3.41 (29, cores) | match | `lifecycle/d54c6814c51c381564cf` | +| alma_high | `numba_cpu_sparse_fp64_wtilde` @ RAL | 11,301, numba warm iid median (route arms: direct_conv 8,777, NumPy FFT 11,267) | — | — | 1 | 2.36 | 20.9 (236, cores) | match | `lifecycle/bfe464d85eab437c56be` | +| jvla | `jax_gpu_sparse_fp64_wtilde` @ A100 node | 440.2, single-jit median | 440.0–440.7 | 459.4 [3] | 8 | 14.3 | 8.71 (4, gpus) | match | `lifecycle/3c33efbabefe647c901b` | +| jvla | `jax_cpu_sparse_fp64_wtilde` @ RAL | 34,832, single-jit block mean † | — | 34,209 [3] | 8 | 23.0 | 0.848 (29, cores) | match | `lifecycle/757d2c2d7167cdef0457` | +| jvla | `numba_cpu_sparse_fp64_wtilde` @ RAL | 73,492, numba warm iid median (route arms: direct_conv 315,196, NumPy FFT 77,134) | — | — | 1 | 11.7 | 1.06 (78, memory) | match | `lifecycle/e63a97d451e1633c91aa` | + +### Evidence: interferometer/mge + +| instrument | setup @ host | headline per call (ms), basis | p10–p90 (ms) | vmap per call (ms) [batch] | cores/call | peak RSS (GB) | projected calls/s per node (workers, bound) | parity | runtime record | +|---|---|---|---|---|---|---|---|---|---| +| sma | `jax_gpu_dense_fp64_nufft` @ A100 node | 3.718, single-jit median | 3.670–3.797 | 0.5729 [64] | 8 | 1.57 | 6,980 (4, gpus) | match | `lifecycle/4c9e3b4239cc98b8a7ff` | +| sma | `jax_cpu_dense_fp64_nufft` @ RAL | 90.63, single-jit median | 71.48–125.1 | 112.5 [3] | 8 | 1.30 | 258 (29, cores) | match | `lifecycle/02e5496a9c9da3407d87` | + +### Evidence: interferometer/rectangular + +| instrument | setup @ host | headline per call (ms), basis | p10–p90 (ms) | vmap per call (ms) [batch] | cores/call | peak RSS (GB) | projected calls/s per node (workers, bound) | parity | runtime record | +|---|---|---|---|---|---|---|---|---|---| +| sma | `jax_gpu_dense_fp64_nufft` @ A100 node | 50.06, single-jit median | 50.00–50.33 | 50.13 [1] | 8 | 4.78 | 79.8 (4, gpus) | match | `lifecycle/e44acbf15a2387706fa1` | +| sma | `jax_gpu_sparse_fp64_wtilde` @ A100 node | 22.95, single-jit median | 22.87–23.04 | 7.191 [64] | 8 | 1.65 | 556 (4, gpus) | match | `lifecycle/a39d6114339d546f6bd6` | +| sma | `jax_cpu_dense_fp64_nufft` @ RAL | 3,781, single-jit block mean † | — | 3,488 [3] | 8 | 31.6 | 8.31 (29, cores) | match | `lifecycle/0cec032ed12d6d948802` | +| sma | `jax_cpu_sparse_fp64_wtilde` @ RAL | 856.0, single-jit median | 756.5–970.7 | 757.7 [3] | 8 | 1.33 | 38.3 (29, cores) | match | `lifecycle/29d350ddd936276d4121` | +| sma | `numba_cpu_sparse_fp64_wtilde` @ RAL | 287.3, numba warm iid median (route arms: direct_conv 301.3, NumPy FFT 1,040) | — | — | 1 | 0.826 | 822 (236, cores) | match | `lifecycle/0e27b1175ce084dff51e` | +| alma | `jax_gpu_sparse_fp64_wtilde` @ A100 node | 36.01, single-jit median | 35.95–36.23 | 51.22 [3] | 8 | 1.42 | 78.1 (4, gpus) | match | `lifecycle/fe32c3ee13ad9afc455c` | +| alma | `jax_cpu_sparse_fp64_wtilde` @ RAL | 2,907, single-jit block mean † | — | 2,796 [3] | 8 | 2.35 | 10.4 (29, cores) | match | `lifecycle/41fd14e1f19bad947f24` | +| alma | `numba_cpu_sparse_fp64_wtilde` @ RAL | 897.9, numba warm iid median (route arms: direct_conv 887.8, NumPy FFT 1,960) | — | — | 1 | 0.927 | 263 (236, cores) | match | `lifecycle/4663f221c8c3ce49b76f` | +| alma_high | `jax_gpu_sparse_fp64_wtilde` @ A100 node | 73.70, single-jit median | 73.66–73.96 | 86.62 [3] | 8 | 4.14 | 46.2 (4, gpus) | match | `lifecycle/2ab9504c46bb8170ba54` | +| alma_high | `jax_cpu_sparse_fp64_wtilde` @ RAL | 8,731, single-jit block mean † | — | 9,809 [3] | 8 | 9.45 | 2.96 (29, cores) | match | `lifecycle/fe0f252f68dcc26d7d13` | +| alma_high | `numba_cpu_sparse_fp64_wtilde` @ RAL | 17,723, numba warm iid median (route arms: direct_conv 16,789, NumPy FFT 16,328) | — | — | 1 | 2.32 | 13.3 (236, cores) | match | `lifecycle/d79f1b94f4b03452d745` | +| jvla | `jax_gpu_sparse_fp64_wtilde` @ A100 node | 437.8, single-jit median | 437.7–438.1 | 450.6 [3] | 8 | 14.2 | 8.88 (4, gpus) | match | `lifecycle/220d076d8421130e83cf` | +| jvla | `jax_cpu_sparse_fp64_wtilde` @ RAL | 58,366, single-jit block mean † | — | 58,633 [3] | 8 | 22.4 | 0.495 (29, cores) | match | `lifecycle/99c70939e335d08c4cff` | +| jvla | `numba_cpu_sparse_fp64_wtilde` @ RAL | 71,933, numba warm iid median (route arms: direct_conv 437,013, NumPy FFT 70,490) | — | — | 1 | 10.9 | 1.17 (84, memory) | match | `lifecycle/15aded078686cdf03ff5` | + +### Evidence: point_source_image/image_plane + +| instrument | setup @ host | headline per call (ms), basis | p10–p90 (ms) | vmap per call (ms) [batch] | cores/call | peak RSS (GB) | projected calls/s per node (workers, bound) | parity | runtime record | +|---|---|---|---|---|---|---|---|---|---| +| simple | `jax_gpu_na_fp64` @ A100 node | 0.8472, single-jit median | 0.8334–0.9058 | 0.4055 [3] | 8 | 1.18 | 9,860 (4, gpus) | match | `lifecycle/6282556b81be530f7bce` | +| simple | `jax_cpu_na_fp64` @ RAL | 1.556, single-jit median | 1.466–1.910 | 1.097 [3] | 8 | 1.06 | 26,400 (29, cores) | match | `lifecycle/6cbf08c848ae6cdb820f` | + +### Evidence: point_source_source/source_plane + +| instrument | setup @ host | headline per call (ms), basis | p10–p90 (ms) | vmap per call (ms) [batch] | cores/call | peak RSS (GB) | projected calls/s per node (workers, bound) | parity | runtime record | +|---|---|---|---|---|---|---|---|---|---| +| simple | `jax_cpu_na_fp64` @ A100 node | 0.2653, single-jit median | 0.2377–0.3155 | 0.1107 [3] | 8 | 0.577 | 136,000 (15, cores) | match | `lifecycle/c2bfeea342f97959dc7c` | +| simple | `jax_gpu_na_fp64` @ A100 node | 0.2617, single-jit median | 0.2531–0.2827 | 0.1087 [3] | 8 | 0.689 | 36,800 (4, gpus) | match | `lifecycle/fcb319f0f24b8cc9fd37` | +| simple | `jax_cpu_na_fp64` @ RAL | 0.1557, single-jit median | 0.1356–0.2076 | 0.06085 [3] | 8 | 0.573 | 476,000 (29, cores) | match | `lifecycle/61082dc032d7280b3bd1` | + +## Proposals + +Each block: §3.3 provisional (report §3.3 text, and its machine reading in `catalogue/provisional_designations.json` `tables`) → evidence (the table rows above) → proposed optimal / secondary → reason → confirms or overturns → caveats. "Uncontested" means only one setup was planned and measured on that hardware class: the evidence confirms it runs, matches parity and what it costs, but compares it with nothing. "Does not separate" means two measured setups are inside each other's spread or within the noise named. + +### imaging/mge (regime `standard`; instruments euclid, hst, jwst, ao) + +| | `gpu_a100` | `cpu_many_core` | +|---|---|---| +| §3.3 provisional | optimal `jax_gpu_dense_fp64`; secondary — | optimal `jax_cpu_dense_fp64`; secondary — | +| Evidence | only setup measured on the node: vmap per call 0.1986 [64] / 0.4116 [64] / 0.9966 [64] / 18.98 [3] ms (euclid/hst/jwst/ao); single-jit 5.916 / 6.285 / 7.000 / 15.73 ms; parity match ×4 | only setup measured: vmap per call 6.797 / 14.39 / 41.55 / 329.7 ms [3]; single-jit 7.896 / 21.22 / 50.25 / 388.9 ms; euclid and hst rows have no peak RSS, so not projected; parity match ×4 | +| **Proposed** | optimal `jax_gpu_dense_fp64`; secondary [] | optimal `jax_cpu_dense_fp64`; secondary [] | +| Reason | the only planned GPU setup; runs every instrument, ao in 15.73 ms | the only planned CPU setup for a parametric source | +| Verdict | **confirms (uncontested)** | **confirms (uncontested)** | +| Caveats | C2; C4 (GPU rows on jax 0.10.2); the node-CPU arm was not measured (Q2), though on its own ral node `jax_cpu_dense_fp64` projects 698 calls/s (jwst) and 88.0 (ao) against the gpu node's 4,010 and 211, so a whole ral node is behind | C1 (2a load 8.6–37; not in the quiet rerun); C4 (no eigen flag; D12 measured +25 % on laptop group/mge); C7 | + +### imaging/rectangular, imaging/delaunay, imaging/delaunay_nn (regime `standard`) + +**`gpu_a100`** — §3.3: optimal `jax_gpu_dense_fp64` ("`jax_gpu_sparse_fp64` secondary until the light_fixed divergence is explained"); machine-reading secondary [`jax_cpu_sparse_fp64`, `jax_gpu_sparse_fp64`]. + +| Likelihood | dense vs sparse, vmap per call (ms) euclid / hst / jwst / ao | single-jit p10–p90 overlap? | Per node | +|---|---|---|---| +| rectangular | 7.926 vs 13.19 / 25.50 vs 41.19 / 62.84 vs 107.5 / 310.8 vs 1,053 | no, on any instrument | same order (one process per GPU each): 505 vs 303 … 12.9 vs 3.80 calls/s | +| delaunay | 14.80 vs 18.16 / 35.05 vs 47.93 / 72.29 vs 108.1 / 366.9 vs 935.3 | no; closest euclid 44.24–45.63 vs 46.67–47.30 ms | 270 vs 220 … 10.9 vs 4.28 | +| delaunay_nn (hst only) | 42.74 vs 1,149 | no | 93.6 vs 3.48 | + +`jax_cpu_sparse_fp64` on the gpu node's CPU is 1–2 orders slower than either GPU setup on every cell (e.g. hst Delaunay vmap 2,110 ms [3], 7.11 calls/s per node). Parity match on all 27 cells. + +- **Proposed:** optimal `jax_gpu_dense_fp64`; secondary [`jax_gpu_sparse_fp64`, `jax_cpu_sparse_fp64`], for each of the three likelihoods. +- **Reason:** dense is fastest per call and per node on every instrument, separated beyond the spread. +- **Verdict:** **confirms** §3.3 (optimal and secondary). +- **Caveats:** C2; C4 (GPU rows on jax 0.10.2; a jaxlib change could move GPU numbers, untested). Q2: numba was never measured on the gpu node's 124 cores. On its own ral node numba projects 248 calls/s on hst Delaunay against 114 for the gpu node's GPUs (2a page), so on a per-node axis that counts the GPU node's cores the CPU arm could matter, and there is no row to say. The 2026-10-18 `jax_gpu_sparse_fp64` light_fixed divergence blocks only an Optimal designation of that setup (ledger, phase 4 card). delaunay_nn `jax_gpu_sparse_fp64` at 1,149 ms against 42.74 ms dense is flagged on the 2a page ("worth a look in phase 3"); it does not change the order. ao A100 peak RSS (39.8 GB) is the multi-leg job's peak, an upper bound. + +**`cpu_many_core`** — §3.3: optimal `numba_cpu_sparse_fp64` "+ cores"; secondary `jax_cpu_sparse_fp64` (numba dense dropped 2026-10-18); rule branches on "cores ≥ threshold (phase 4 efficiency curve); source pixels". + +| Likelihood | numba vs JAX CPU sparse, per node (calls/s) euclid / hst / jwst / ao | per call (ms): numba warm iid median vs JAX vmap [3] or [1] | +|---|---|---| +| rectangular | numba not projected (no peak RSS) vs 42.5 / 339 vs 14.3 / 140 vs 6.89 / 3.21 (32 workers, memory) vs 0.594 | 282.5 vs 683.0 / 696.7 vs 2,029 / 1,688 vs 4,210 / 9,982 vs 48,794 | +| delaunay | 288 vs 35.1 / 248 vs 15.3 / 135 vs 6.65 / 4.61 (40, memory) vs 0.524 | **820.0 vs 826.6** / 951.7 vs 1,895 / 1,745 vs 4,361 / 8,671 vs 55,292 | +| delaunay_nn (hst) | 182 vs 4.51 | 1,295 vs 6,427 | + +- **Proposed:** optimal `numba_cpu_sparse_fp64`; secondary [`jax_cpu_sparse_fp64`], each likelihood. +- **Reason:** numba is ahead per node on every projected cell (5× to 40×) at one core per call. Per call it is ahead everywhere except euclid Delaunay, where the two tie (0.8 %). +- **Verdict:** **confirms** §3.3. The "+ cores" threshold cannot be written yet (phase 4). The draft rule says workers are capped by node memory over peak RSS, which binds at ao (32 and 40 workers). +- **Caveats:** C1 (2a RAL load 8.6–37; not in the quiet rerun); C4 (JAX CPU side only); C7; C9. euclid rectangular numba has no peak RSS, so its per-node figure is missing (per call it is 2.4× ahead at 1/8 the cores). The §3.3 laptop optimal for pixelized imaging (`jax_cpu_dense_fp64`) was never measured on any host. + +### interferometer/mge (sma only; 190 visibilities → regime `n_vis_lt_1e5`) + +| | `gpu_a100` | `cpu_many_core` | +|---|---|---| +| §3.3 provisional | `jax_gpu_dense_fp64_` by the `n_vis × n_pix` crossover ≈ 1e7; secondary — | `jax_cpu_dense_fp64_`; secondary — | +| Evidence | `jax_gpu_dense_fp64_nufft` single-jit 3.718 ms (3.670–3.797), vmap 0.5729 [64]; parity match | `jax_cpu_dense_fp64_nufft` single-jit 90.63 ms (71.48–125.1), vmap 112.5 [3]; 258 calls/s per node; parity match | +| **Proposed** | optimal `jax_gpu_dense_fp64_nufft`; secondary [] — regime `n_vis_lt_1e5` only | optimal `jax_cpu_dense_fp64_nufft`; secondary [] — `n_vis_lt_1e5` only | +| Reason | the only measured setup | the only measured setup | +| Verdict | **confirms the NUFFT half (uncontested); the DFT branch is untested** (2b R2: no DFT cells), so the evidence does not separate DFT from NUFFT; no MGE row above sma (R9), so no proposal for the other regimes | same | +| Caveats | sma here has 190 visibilities at σ = 1000 (2b caveats), a small regime anchor; C2; C4 | C1 (2b load 45–72; rerun 413268); C4; C7 | + +### interferometer/rectangular, interferometer/delaunay + +Regimes as `provisional_designations.json` names them, read from each row's `configuration.visibilities`: sma 190 → `n_vis_lt_1e5`; alma 1,000,000 and alma_high 5,000,000 → `n_vis_1e5_1e7`; jvla 25,000,000 → `n_vis_ge_1e7`. Note: every catalogue record carries `regime: standard`. Designating by n_vis regime needs the producer to emit these regimes (Q5). + +**`gpu_a100`** — §3.3: optimal `jax_gpu_sparse_fp64_wtilde`, `streaming` at `n_vis ≥ 1e7`; secondary "dense routes" (machine reading: `jax_gpu_dense_fp64_{dft,nufft}`). + +| Regime | Evidence (rectangular; delaunay) | Proposed optimal / secondary | Verdict | +|---|---|---|---| +| `n_vis_lt_1e5` (sma) | W~ vmap 7.191 [64] vs dense NUFFT 50.13 [1] ms; single-jit 22.95 (22.87–23.04) vs 50.06 (50.00–50.33); per node 556 vs 79.8. Delaunay 12.09 [64] vs 55.77 [1]; 27.49 (27.39–27.69) vs 55.86 (55.76–56.23); 331 vs 71.7 | `jax_gpu_sparse_fp64_wtilde` / [`jax_gpu_dense_fp64_nufft`] | **confirms** (DFT secondary untested, R2) | +| `n_vis_1e5_1e7` (alma, alma_high) | W~ only: rectangular single-jit 36.01 / 73.70 ms; delaunay 40.26 / 82.48 ms. The dense route cannot form its mapping matrix above sma (R1(a): 20.5 GB at alma, 102 GB at alma_high) | `jax_gpu_sparse_fp64_wtilde` / [] | **confirms optimal (uncontested); overturns the provisional secondary**: no dense route runs in this regime | +| `n_vis_ge_1e7` (jvla) | W~ only: rectangular 437.8 ms (437.7–438.1), delaunay 440.2 ms (440.0–440.7), peak 14.2 / 14.3 GB on one A100 | `jax_gpu_sparse_fp64_wtilde` / [] | **departs from §3.3 by absence, not by measurement**: §3.3 names `streaming` here and streaming was not measured, so W~ vs streaming does not separate (Q10) | + +Caveats (all regimes): C2; C4. + +**`cpu_many_core`** — §3.3: "per the interferometer decision matrix: numba direct_conv vs FFT cost model (symmetric gate 0.7); `streaming` at large n_vis"; machine reading optimal `numba_cpu_sparse_fp64_wtilde`, secondary [`jax_cpu_dense_fp64_{dft,nufft}`, `jax_cpu_sparse_fp64_wtilde`]. + +| Regime | Per node, numba vs JAX CPU W~ (calls/s) rectangular; delaunay | Per call (ms), numba pick vs JAX CPU W~ vmap [3] | Proposed optimal / secondary | Verdict | +|---|---|---|---|---| +| `n_vis_lt_1e5` (sma) | 822 vs 38.3 (dense NUFFT 8.31); 704 vs 33.8 (dense 4.74) | 287.3 vs 757.7; 335.1 vs 859.2 (cost model picked direct_conv; forced arms 301.3 / 338.4) | `numba_cpu_sparse_fp64_wtilde` / [`jax_cpu_sparse_fp64_wtilde`, `jax_cpu_dense_fp64_nufft`] | **confirms** (DFT untested) | +| `n_vis_1e5_1e7` (alma, alma_high) | alma 263 vs 10.4, alma_high 13.3 vs 2.96; alma 286 vs 10.7, alma_high 20.9 vs 3.41 | alma 897.9 vs 2,796 and 823.6 vs 2,712 (numba ahead); **alma_high 17,723 vs 9,809 and 11,301 vs 8,500 (JAX CPU ahead per call)** | `numba_cpu_sparse_fp64_wtilde` / [`jax_cpu_sparse_fp64_wtilde`] | **confirms on the per-node axis**; on a per-call axis the regime would split between 1e6 and 5e6 visibilities (C6) | +| `n_vis_ge_1e7` (jvla) | rectangular 1.17 (84 workers, memory) vs 0.495 — separated (2.4×); **delaunay 1.06 (78, memory) vs 0.848 — 25 %** | 71,933 vs 58,633; 73,492 vs 34,209 (JAX CPU ahead per call) | rectangular: `numba_cpu_sparse_fp64_wtilde` / [`jax_cpu_sparse_fp64_wtilde`]. **delaunay: does not separate** (hold; §3.3's numba stands as provisional) | rectangular **confirms** per node; delaunay: no call. The 25 % margin rests on one numba warm draw at jvla and two loaded-node rows (C1), with η unmeasured and JAX CPU fixed at 8 threads (C7) | + +- **The cost-model miss (2b page "The numba route").** At delaunay alma_high the cost model picked the NumPy FFT route (11,301 ms) but the forced `direct_conv` arm ran in 8,777 ms (22 % faster), on 6 warm draws on a loaded node. On the same node, two arms of one route differ by up to 9 % (rectangular alma_high: FFT pick 17,723 ms against forced FFT 16,328 ms). The miss is larger than that, but it is still thin evidence. It does not change the setup_id (both routes are inside `numba_cpu_sparse_fp64_wtilde`), and the per-node rank holds on either route. On the per-call axis, `direct_conv` would bring numba level with JAX CPU W~ (8,777 against 8,500 ms), which then does not separate. The fix belongs to the route-gate decision (PyAutoPulse `interferometer-route-gate-cost-model`, `direct-conv-symmetric-gate`), not to the designation. The draft rule says "route chosen by the packaged cost model" so a gate change does not reopen the designation. +- **Caveats:** C1 (every 2b RAL CPU row; quiet reruns 413268–413271 queued); C4 (JAX CPU side); C7; C9. Streaming on CPU was not measured. + +### point_source_image/image_plane (instrument `simple`; regime `standard`) + +| | `gpu_a100` | `cpu_many_core` | +|---|---|---| +| §3.3 provisional | optimal `jax_gpu_na_fp64` (§3.3 writes `jax_gpu_dense_fp64`; R1 machine reading `_na_`); secondary — | optimal `jax_cpu_na_fp64`; secondary — | +| Evidence (Solved likelihood, human ruling 2026-10-29) | single-jit 0.8472 ms (0.8334–0.9058), vmap 0.4055 [3]; 9,860 calls/s per node; parity match | single-jit 1.556 ms (1.466–1.910), vmap 1.097 [3]; 26,400 calls/s per ral node; parity match | +| **Proposed** | optimal `jax_gpu_na_fp64`; secondary [] | optimal `jax_cpu_na_fp64`; secondary [] | +| Reason | the only setup planned on the gpu node; faster per call than RAL CPU (0.8472 against 1.556 ms) | the only setup planned | +| Verdict | **confirms (uncontested)** on the per-call axis. On the per-node axis it is open: `jax_cpu_na_fp64@hpc_a100` was not planned for the image plane, and on its own ral node `jax_cpu_na_fp64` projects 26,400 calls/s against the gpu node's 9,860, so the node-CPU arm could win on a gpu node (Q2). Not separable without that row | **confirms (uncontested)** | +| Caveats | C2; C4 | C1 (load 33.4 at import; rerun 413267); C4; C7. The plain likelihood (`experiments/plain_runtime/`) is within 4 % of the solved one on every setup (2c page) | + +### point_source_source/source_plane (instrument `simple`; regime `standard`) + +| | `gpu_a100` | `cpu_many_core` | +|---|---|---| +| §3.3 provisional | optimal `jax_cpu_na_fp64` ("cheap; GPU warm-up dominates"); secondary `jax_gpu_na_fp64` | optimal `jax_cpu_na_fp64`; secondary `jax_gpu_na_fp64` (host-agnostic Secondary column; a GPU setup on a GPU-less host, D2 / #481) | +| Evidence | node CPU `jax_cpu_na_fp64` single-jit 0.2653 ms (0.2377–0.3155), vmap 0.1107 [3], **136,000 calls/s per node (15 workers × 8 cores)**; GPU `jax_gpu_na_fp64` 0.2617 ms (0.2531–0.2827), vmap 0.1087 [3], **36,800 (4 GPUs)**; breakdown fused solved 0.261 vs 0.250 ms (2c page); parity match ×2 | `jax_cpu_na_fp64` single-jit 0.1557 ms (0.1356–0.2076), vmap 0.06085 [3]; 476,000 calls/s per ral node; parity match | +| **Proposed** | optimal `jax_cpu_na_fp64`; secondary [`jax_gpu_na_fp64`] | optimal `jax_cpu_na_fp64`; secondary [] | +| Reason | per call the two **do not separate** (1.4 % apart, inside each other's p10–p90; GPU ahead by ≤ 4 % in both scripts); per node the CPU cores project 3.7× the GPUs | the only setup runnable on the host | +| Verdict | **confirms §3.3 on the per-node axis only**; on the per-call axis the evidence does not separate them (the 2c page verdict) | **confirms the optimal; overturns the secondary** (no GPU on the host; #481 already stopped planning it) | +| Caveats | C2; C4; C9 (15 JAX workers on a 124-core node at η = 1, `n_batch` not modelled); the A100 GPU per call rose 12 % against 2026.10.17.1 (0.233 → 0.262 ms), not investigated (2c page). The proposal depends on Q1 (axis) and Q2 (GPU node's CPU cores counted) | C1 (load 33.4; rerun 413267); C4; C7 | + +## Summary + +| Likelihood | Regime | `gpu_a100` proposed optimal / secondary | vs §3.3 | `cpu_many_core` proposed optimal / secondary | vs §3.3 | +|---|---|---|---|---|---| +| imaging/mge | standard | `jax_gpu_dense_fp64` / — | confirms (uncontested) | `jax_cpu_dense_fp64` / — | confirms (uncontested) | +| imaging/rectangular | standard | `jax_gpu_dense_fp64` / `jax_gpu_sparse_fp64`, `jax_cpu_sparse_fp64` | confirms | `numba_cpu_sparse_fp64` / `jax_cpu_sparse_fp64` | confirms | +| imaging/delaunay | standard | same as rectangular | confirms | same as rectangular | confirms (per-call tie at euclid) | +| imaging/delaunay_nn | standard (hst) | same as rectangular | confirms | same as rectangular | confirms | +| interferometer/mge | n_vis_lt_1e5 (sma) | `jax_gpu_dense_fp64_nufft` / — | confirms NUFFT; DFT untested | `jax_cpu_dense_fp64_nufft` / — | confirms NUFFT; DFT untested | +| interferometer/{rectangular, delaunay} | n_vis_lt_1e5 (sma) | `jax_gpu_sparse_fp64_wtilde` / `jax_gpu_dense_fp64_nufft` | confirms | `numba_cpu_sparse_fp64_wtilde` / `jax_cpu_sparse_fp64_wtilde`, `jax_cpu_dense_fp64_nufft` | confirms | +| interferometer/{rectangular, delaunay} | n_vis_1e5_1e7 (alma, alma_high) | `jax_gpu_sparse_fp64_wtilde` / — | confirms optimal; overturns secondary (dense cannot run) | `numba_cpu_sparse_fp64_wtilde` / `jax_cpu_sparse_fp64_wtilde` | confirms per node (per call splits) | +| interferometer/rectangular | n_vis_ge_1e7 (jvla) | `jax_gpu_sparse_fp64_wtilde` / — | streaming untested (Q10) | `numba_cpu_sparse_fp64_wtilde` / `jax_cpu_sparse_fp64_wtilde` | confirms per node | +| interferometer/delaunay | n_vis_ge_1e7 (jvla) | `jax_gpu_sparse_fp64_wtilde` / — | streaming untested (Q10) | **does not separate** (numba 1.06 vs JAX 0.848 calls/s) | hold | +| point_source_image/image_plane | standard | `jax_gpu_na_fp64` / — | confirms per call; per node open (Q2) | `jax_cpu_na_fp64` / — | confirms (uncontested) | +| point_source_source/source_plane | standard | `jax_cpu_na_fp64` / `jax_gpu_na_fp64` | confirms per node; per call does not separate | `jax_cpu_na_fp64` / — | confirms optimal; overturns secondary | + +26 proposals (Appendix A): 25 with a proposed optimal, 1 hold. None overturns a §3.3 **optimal** on measured evidence. The departures are three dropped secondaries that cannot run (dense interferometer above sma ×2 likelihoods; GPU on a GPU-less host) and §3.3 branches that were never measured (interferometer DFT, GPU streaming at n_vis ≥ 1e7, every laptop cell). + +## Human rulings (2026-10-30, chat, after the "campaigns complete" gate) + +- **Q1 + Q3 — adopted as recommended:** rank by projected calls/s per node within each hardware class, per call as secondary evidence; record a designation only where setups separate beyond the recorded spread (or the arm-to-arm noise), otherwise keep the §3.3 provisional label with no decision. +- **Q2 — A100s only:** `gpu_a100` designations are GPU setups; the node's CPU stays a measured secondary where it exists. No node-CPU rows are added. +- **Q7 — re-measure the 2a–2c JAX rows:** day zero is one environment (jax/jaxlib 0.11.2, `--xla_cpu_multi_thread_eigen=false` on CPU legs). Every 2a/2b/2c JAX row (CPU and GPU) is re-measured; numba rows are carried. The 2b/2c quiet reruns (RAL 413319–413323, on 0.11.2 with the flag) already cover the 2b/2c RAL CPU legs; the remainder is every 2a JAX leg and the 2b/2c A100 JAX legs. +- **Q8 — freeze on 2026.10.25.1:** every row is on it; no carry. +- **Q9 — settled by the human's 2026-10-30 ruling on loaded RAL nodes** ("ignore loaded node stuff for now"): the 2a RAL CPU rows are accepted. +- Q4, Q5, Q6, Q10, Q11: the recommended handling in this file stands unless the human says otherwise ((a) `basis: projected` in the decision prose; designate interferometer by `standard` with an instrument-keyed rule unless the producer emits n_vis regimes; laptop undesignated; untested branches named in the rule; GPU-class secondaries GPU-only per Q2). + +## Questions for the human + +- **Q1 — Axis.** The report amendment (2026-10-25) pre-registered per-node projected throughput within each hardware class, with per call as secondary evidence. Confirm it for the records. It decides four proposals: interferometer pixelized alma_high and jvla on RAL (numba per node, JAX CPU per call), euclid Delaunay imaging on RAL (per-call tie), and the source-plane A100 node (per-call tie, CPU cores 3.7× per node). +- **Q2 — What a GPU node's budget includes.** Does `gpu_a100` mean "use the A100s" or "use the gpu node": 4 GPUs plus 124 cores? Source plane measured the node CPU (D2) and the proposal there rests on it. Image-plane point source, imaging pixelized (numba) and interferometer were never measured on the gpu node's CPU, and on their own ral nodes those CPU setups project ahead of the gpu node on several cells (point source 26,400 vs 9,860; hst Delaunay 248 vs 114). If the node counts, those arms need rows before the GPU designations are final. Rows are not projected across machines (human 2026-10-25). +- **Q3 — Close calls.** Proposed handling: record a designation only where the setups separate on the chosen axis beyond the recorded p10–p90 (or, with no spread recorded, beyond the arm-to-arm noise seen on the same node, about 9 % for 2b numba). Otherwise record "does not separate" and keep the §3.3 provisional label without a decision. Current cases: interferometer/delaunay jvla on RAL per node (25 %; hold), source plane on the A100 node per call (1.4 %), and euclid Delaunay imaging on RAL per call (0.8 %). +- **Q4 — `basis: projected`.** The amendment says pre-phase-4 designations carry `basis: projected`. Pulse's `decisions.yaml` refuses any field outside `id, title, date, url, kind` plus the eight designation fields (`pulse/decisions.py`). Options: (a) say it in the canonical `decisions/.md` and the `rule` sentence; (b) a Pulse change adding `basis`. The appendix assumes (a). +- **Q5 — Interferometer regimes.** Every catalogue record says `regime: standard`. Designate interferometer by the n_vis regimes in `provisional_designations.json` (needs the producer to emit `regime` per record, and a decision on where alma_high at 5e6 sits), or by `standard` with an instrument-keyed rule? +- **Q6 — Laptop.** No laptop evidence can be current (R7), and a designation needs non-empty `evidence`. Leave `laptop` undesignated at day zero, or record §3.3's laptop column citing the CPU-node rows? +- **Q7 — The jax environment (C4).** The 2a/2b/2c JAX rows ran on jax/jaxlib 0.10.2, which tag 2026.10.25.1 excludes (`!=0.10.*`, Heart#274). 2d–2g will run on 0.11.2 with the D12 eigen flag. Freeze the 0.10.2 rows as day zero, or re-measure every JAX row (CPU and GPU) on 0.11.2 with the flag so day zero is one environment? Numba rows are unaffected. +- **Q8 — Which tag phase 3 freezes on.** See the next section. +- **Q9 — 2a RAL CPU rows.** They ran at load 8.6–37 and are not in the quiet rerun. Accept them, or rerun them quiet? +- **Q10 — Untested §3.3 branches.** Interferometer MGE DFT (R2: no DFT cells), GPU `streaming` at n_vis ≥ 1e7, CPU streaming. Record designations without them, with the branch named as untested in the rule, or measure first? +- **Q11 — Secondary lists.** Is `jax_cpu_sparse_fp64` (the gpu node's CPU) a useful secondary for imaging on `gpu_a100`, as §3.3's host-agnostic column implies, or should a GPU-class secondary be GPU-only? + +## Release interaction (the tag phase 3 freezes on) + +Every proposal rests on rows published at 2026.10.25.1 (imaging measured on 2026.10.23.1 and carried by `catalogue/release_revisions.json`, human ruling 2026-10-26, #466). Phase 3 must freeze on a released tag (ledger orchestration step 7). Two facts: + +1. **A release after the pin already exists:** 2026.10.26.1 (all five libraries tagged 2026-10-25/26; PyAutoNerves 2026.10.25.1 = 2026.10.26.1 = `main` = ec8b5c1). The release the human is planning now would come after it. +2. **Likelihood-path commits since 2026.10.25.1** (`git log 2026.10.25.1..origin/main`, fetched 2026-10-29; "[26.1]" = already in 2026.10.26.1): + +| Repo | Commit | What | Touches a 2a–2c cell's per-call path? | +|---|---|---|---| +| PyAutoArray | 71a3ef49 [26.1] | matrix-free interferometer route, `Settings(interferometer_route="matrix_free")`; `inversion/inversion/factory.py` gains an opt-in branch, `inversion/interferometer/matrix_free.py` new | No by default: the branch fires only when the setting is `"matrix_free"` (2b's matrix-free experiment, never current). It is an edit to the pixelized interferometer factory, so re-run the 2b parity smokes before carrying | +| PyAutoArray | 171eacca [26.1] | config leaf comments | No (comment-only; values unchanged in `general.yaml`) | +| PyAutoArray | cd26722b | introductory four-panel imaging plot | No (plotting) | +| PyAutoGalaxy | 499827fe [26.1] | `PowerLaw` JAX unit-vector transform | No: the standard cells use `Isothermal` + `ExternalShear` (`_production_config.py`; point-source scripts `Isothermal`). `PowerLaw` appears only in fixed-light and experiment scripts | +| PyAutoGalaxy | 36ec41b2 [26.1] | `MassSheet` JAX deflections | No (not in the standard cells) | +| PyAutoGalaxy | 9be12cae [26.1] | reject singular isothermal dipole multipoles (`power_law_multipole.py`) | No (not in the standard cells) | +| PyAutoGalaxy | 0fee6daf [26.1] | `SersicCoreSph` mass-to-light ratio | No | +| PyAutoGalaxy | eaf12527, ac1adc08, 6c0fac8f [26.1] | latent ("derived") parameter declarations (`convert.py`; `ExternalShear` +3 lines of declarations) | No per-call change expected (declarations for corner plots) | +| PyAutoGalaxy | acfc61ad | gNFW convergence integral tabulated instead of per-point `quad` (perf) | No for 2a–2c; a 2d–2g cell using gNFW would change (the profiling scripts reference `NFWSph`, `NFWMCRLudlowSph`, not gNFW) | +| PyAutoGalaxy | f539aca7 | `mass_integral` length-1 radius fix (Einstein radius, angular mass) | No (not called in a likelihood) | +| PyAutoGalaxy | 6879610f, abcb81b8, 22f849c9 | aperture mass, `MassBudget` (lenstwin), plots | No | +| PyAutoLens | f6800bb50, 9541c87bb | `al.twins` (lenstwin) | No (new package) | +| PyAutoLens | 8cff95d5f [26.1], a0666e7ef, 05f0a776d, 1d430dcd9 | config comments, cluster/intro plots, point-dataset tests | No | +| PyAutoFit | 00a153ceb [26.1] | config leaf comments | No | +| PyAutoNerves | — | no commits | — | + +Dependencies: no `pyproject.toml` change to jax, jaxlib or numba floors since the pin. The only change is PyAutoGalaxy's `autofit>=2026.10.23.1` floor. Non-comment config diffs in `general.yaml` / `non_linear.yaml`: none. + +**The agent's reading for the human:** a release cut from today's mains changes no per-call likelihood of a 2a–2c standard cell. The one likelihood-adjacent edit is the opt-in branch in the interferometer inversion factory. The options: + +- (a) **Freeze on 2026.10.25.1.** Valid as a released tag, but the day-zero pin is then older than the library users install. +- (b) **Carry the 2a–2c rows to the new tag** under the existing `carry_forward` rule (the #466 precedent: re-stamp, don't rerun), after the 2b parity smokes pass on the new tag. +- (c) **Re-measure on the new tag.** + +The tag diff alone does not justify (c). The environment does: C4/Q7 (the rows ran on jax 0.10.2, which the tag excludes) is independent of which tag is chosen. If the human wants one environment for 2a–2g, (c) for the JAX rows (with numba rows carried) is the consistent choice, and it could share RAL time with the 2d–2g batches. Whatever is chosen, 2d–2g should run on the tag phase 3 will freeze on, so they need no carry. + +## What phase 3 still needs (checklist) + +From 2d–2g and phase 2: + +- [ ] 2d multi_galaxy + group, 2e cluster, 2f multi_dataset + datacube, 2g weak: decision reviews, batch-0 goes, RAL batches, PR B, campaign pages with verdicts (`likelihood_lifecycle_p2{d_galaxy_group,e_cluster,f_dataset_datacube,g_weak}_runs.md`). Coverage today: 272 planned, 176 current, 96 missing (`dashboard/coverage.md`, 2026-10-29T09:46:25Z), the 96 all theirs. +- [ ] Their evidence for the "as imaging" / "as interferometer" / "as point source" inheritance in §3.3 (multi_galaxy, group, multi_dataset → imaging; datacube → interferometer per channel; cluster → point source × n_sources; weak → `jax_cpu_dense_fp64` with a GPU secondary): their designations are drafted after their campaigns, like these. +- [x] Quiet-rerun ingest — DONE 2026-10-31, autolens_profiling#494, record `complete/2026/10/likelihood-lifecycle-p2bc-quiet-ingest.md` (was RAL 413267–413271 → 413319–413323): replaces 38 2b and 2 2c RAL CPU rows. Then re-check every `cpu_many_core` interferometer and point-source proposal above, especially the interferometer/delaunay jvla hold and the alma_high per-call flip, and re-resolve evidence ids (path-hashed). +- [ ] The human's "campaigns complete" confirmation (the phase 3 gate). + +Human decisions before records (this file's questions): Q1 axis; Q2 GPU-node budget (and, if the node counts, node-CPU rows for image-plane point source, imaging pixelized numba and interferometer); Q3 close-call rule; Q4 where `basis: projected` lives; Q5 interferometer regimes; Q6 laptop; Q7 jax environment; Q8 tag; Q9 2a RAL load; Q10 untested branches; Q11 secondary lists. + +Phase 3 deliverables themselves (ledger card; report §4): + +- [ ] Pin the released tag; re-measure (or carry, by ruling) every Optimal/Secondary cell not on it; stamp `day_zero`; Pulse snapshot `day_zero`. +- [ ] The designation records: one canonical `decisions/.md` per likelihood × regime × hardware class plus its `decisions.yaml` row (human-recorded; Appendix A is the draft). Then producers re-declare `class: optimal` + `decision_id` on the cited rows, and `pyauto-pulse check` resolves them. +- [ ] `catalogue/provisional_designations.json` replaced or retired in favour of the records (it must agree with them, and phase 5's library rule table is generated from and tested against them). +- [ ] `wiki/campaigns///day_zero.md` per likelihood, with rules in dataset-property terms. +- [ ] Pulse `setup-baseline` campaign adopted and closed, its 1,044-slot manifest replaced (R10). +- [ ] Coverage shows no `not_measured` Optimal cell; the `runtime_estimates` export exists (for 5E). + +## Appendix A — draft `decisions.yaml` entries (NOT published, NOT indexed) + +Generated from `dashboard/catalogue.json` at autolens_profiling 32c0becd. Each entry was checked with `pulse.decisions._designation` (PyAutoPulse `pulse/decisions.py`, identical to `main` 4a4bdee). `evidence` lists, per instrument and setup measured on that host class, the runtime record id followed by its parity record id. `date` is a placeholder for the human's decision date, quoted as a string when recorded. The `# separation:` comment above each entry is this draft's label on the pre-registered per-node axis (see the Proposals for where the per-call axis differs), not a field. The `hold` entry must not be recorded as written. Ids follow the README template `--` in kebab case. Re-resolve every id at the freeze commit (path-hashed ids; quiet-rerun ingest). + +```yaml +# separation: uncontested +- id: imaging-mge-standard-gpu-a100 + title: 'Designation: imaging/mge standard gpu_a100' + date: YYYY-MM-DD + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/imaging-mge-standard-gpu-a100.md + kind: designation + likelihood: imaging/mge + regime: standard + hardware_class: gpu_a100 + optimal: jax_gpu_dense_fp64 + secondary: [] + evidence: [lifecycle/770dce7d7db7a1fc3b53, lifecycle/2d7064bb66242f2ca6cc, lifecycle/8a475e9abd97a8c4a1c0, lifecycle/4e93e744f3e1295b3c8d, lifecycle/0756e600e86d7ae6a462, lifecycle/a58929ead49f62c064da, lifecycle/4b514c4262172f610fee, lifecycle/eb44c9d7e6987735cdd1] + rule: Any imaging dataset fitted with a parametric (MGE) source on an A100 node uses jax_gpu_dense_fp64. + supersedes: null +# separation: uncontested +- id: imaging-mge-standard-cpu-many-core + title: 'Designation: imaging/mge standard cpu_many_core' + date: YYYY-MM-DD + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/imaging-mge-standard-cpu-many-core.md + kind: designation + likelihood: imaging/mge + regime: standard + hardware_class: cpu_many_core + optimal: jax_cpu_dense_fp64 + secondary: [] + evidence: [lifecycle/190ebc582d9aba9aaa9c, lifecycle/acf067a34aa2005d1b11, lifecycle/54979849c807d452c510, lifecycle/d2aece86956eba227ada, lifecycle/4baa9bc04c8d24a713b6, lifecycle/2cf94e6d7d8231a57c92, lifecycle/3216ffc143645fb46c72, lifecycle/a37560173314cc078894] + rule: Any imaging dataset fitted with a parametric (MGE) source on a many-core CPU node with no GPU uses jax_cpu_dense_fp64. + supersedes: null +# separation: separated +- id: imaging-rectangular-standard-gpu-a100 + title: 'Designation: imaging/rectangular standard gpu_a100' + date: YYYY-MM-DD + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/imaging-rectangular-standard-gpu-a100.md + kind: designation + likelihood: imaging/rectangular + regime: standard + hardware_class: gpu_a100 + optimal: jax_gpu_dense_fp64 + secondary: [jax_gpu_sparse_fp64, jax_cpu_sparse_fp64] + evidence: [lifecycle/9e4861d45b9802a91868, lifecycle/eb746ec4a8c1668c7a40, lifecycle/456f7d65babc5524183a, lifecycle/a429326f9f33ea12e6b8, lifecycle/bc5ed323618c58fc7682, lifecycle/688c98aeb69ac24ea6f3, lifecycle/22c24ae6e2c83dc51d89, lifecycle/0b43689b6e8f601ade78, lifecycle/42f6a707360ce63b8150, lifecycle/51cd6f8ab1edb2761cb8, lifecycle/cc3f3365b6ac65388a93, lifecycle/d1a3e06d7571bd6b5eba, lifecycle/cfba00e49ad2fb8681cb, lifecycle/72add1d2a2a70bb1304c, lifecycle/ec69a200557ea8212e5e, lifecycle/76d01fc60350dd469eed, lifecycle/bdffd9d6d157b3b66435, lifecycle/df1e242101ab32dea573, lifecycle/3617cdce4ec7d5357c4f, lifecycle/48ae4d8138f5bb99846a, lifecycle/d570569f32c953038fde, lifecycle/32ca51df82e1724685ab, lifecycle/46db4990a22e25aee123, lifecycle/67787bf45d6bb0b3aa42] + rule: Any imaging dataset with a rectangular pixelized source on an A100 node uses jax_gpu_dense_fp64, falling back to jax_gpu_sparse_fp64. + supersedes: null +# separation: separated +- id: imaging-rectangular-standard-cpu-many-core + title: 'Designation: imaging/rectangular standard cpu_many_core' + date: YYYY-MM-DD + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/imaging-rectangular-standard-cpu-many-core.md + kind: designation + likelihood: imaging/rectangular + regime: standard + hardware_class: cpu_many_core + optimal: numba_cpu_sparse_fp64 + secondary: [jax_cpu_sparse_fp64] + evidence: [lifecycle/4c53e409a27040f5d6a4, lifecycle/39a0a9b81376f2be8446, lifecycle/6060fdcfa2e5a4a0c168, lifecycle/ae663292d53c60a65c62, lifecycle/2b5e34f509175fd4d030, lifecycle/ee2df565d3603ba2bbd3, lifecycle/b62534053c00fb102bf4, lifecycle/8db1316c3491c8569223, lifecycle/9bb2e30e94491253641b, lifecycle/dd67472c35e8ed230b03, lifecycle/304ac75d242dcbc2c22f, lifecycle/0de8cf81e718d21ee2aa, lifecycle/d7020017fca2249bf32b, lifecycle/e44433f6b0bb6fbb1519, lifecycle/403420f8debaaa38956c, lifecycle/a721c437cf9355984ca5] + rule: Any imaging dataset with a rectangular pixelized source on a many-core CPU node with no GPU uses numba_cpu_sparse_fp64, one serial likelihood per core (workers capped by node memory over peak RSS). + supersedes: null +# separation: separated +- id: imaging-delaunay-standard-gpu-a100 + title: 'Designation: imaging/delaunay standard gpu_a100' + date: YYYY-MM-DD + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/imaging-delaunay-standard-gpu-a100.md + kind: designation + likelihood: imaging/delaunay + regime: standard + hardware_class: gpu_a100 + optimal: jax_gpu_dense_fp64 + secondary: [jax_gpu_sparse_fp64, jax_cpu_sparse_fp64] + evidence: [lifecycle/a9e102b324300939da14, lifecycle/1c09fadde930b03b7518, lifecycle/c07af59a8d393975dd28, lifecycle/f706db5c42869fee8ea5, lifecycle/371f67d50254479493ee, lifecycle/b72ae27c889b5f309c7d, lifecycle/0f45aa8eb79d60157031, lifecycle/d8087ff55a7a9c1902cc, lifecycle/73c19173fcc983318b61, lifecycle/dbb5a42b977bbac7679e, lifecycle/12c678df16e04f4f9011, lifecycle/720a326dbad29c263006, lifecycle/97d2ae3cab5f9bbc9d8f, lifecycle/e0e005616c964f881ccd, lifecycle/12348bea7be2ca70cffb, lifecycle/ff61f1cb7a87d8382b9a, lifecycle/d34ebb3d52e02dfb8b16, lifecycle/5f300473b328b24bac66, lifecycle/780ad479b1fe66279696, lifecycle/afc236d86c1d2fad6db9, lifecycle/fa028d54604cd08d3555, lifecycle/9b34de15d3aca2deb34c, lifecycle/99d7c3c7623e3d43d059, lifecycle/93f7eea188801e17127a] + rule: Any imaging dataset with a Delaunay pixelized source on an A100 node uses jax_gpu_dense_fp64, falling back to jax_gpu_sparse_fp64. + supersedes: null +# separation: separated +- id: imaging-delaunay-standard-cpu-many-core + title: 'Designation: imaging/delaunay standard cpu_many_core' + date: YYYY-MM-DD + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/imaging-delaunay-standard-cpu-many-core.md + kind: designation + likelihood: imaging/delaunay + regime: standard + hardware_class: cpu_many_core + optimal: numba_cpu_sparse_fp64 + secondary: [jax_cpu_sparse_fp64] + evidence: [lifecycle/b202eb6f7da58a38882f, lifecycle/095071358666d6efbc20, lifecycle/5556ca430bc180c2d536, lifecycle/99cf9f43e4608fb548ea, lifecycle/06a9dad80c65ecd81c6c, lifecycle/51b8245cf58b86533327, lifecycle/321ec1f6f2a5955a9a20, lifecycle/3c0e90f2b30d48843af2, lifecycle/b5b87c504713b9831857, lifecycle/489bebc145a525eab14d, lifecycle/d93b4dad29e8a0f77987, lifecycle/e3b1cad17937b4c1f9dc, lifecycle/e08b7a6ff7b9daea8790, lifecycle/e77729fc4ba5d235e1b0, lifecycle/1f22a4a5fcd73276ec53, lifecycle/572824ce3cc75acae94b] + rule: Any imaging dataset with a Delaunay pixelized source on a many-core CPU node with no GPU uses numba_cpu_sparse_fp64, one serial likelihood per core (workers capped by node memory over peak RSS). + supersedes: null +# separation: separated +- id: imaging-delaunay-nn-standard-gpu-a100 + title: 'Designation: imaging/delaunay_nn standard gpu_a100' + date: YYYY-MM-DD + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/imaging-delaunay-nn-standard-gpu-a100.md + kind: designation + likelihood: imaging/delaunay_nn + regime: standard + hardware_class: gpu_a100 + optimal: jax_gpu_dense_fp64 + secondary: [jax_gpu_sparse_fp64, jax_cpu_sparse_fp64] + evidence: [lifecycle/cbc5540f3214caf61aba, lifecycle/5033bab3983481d5c826, lifecycle/c661098ad46c65fa59b2, lifecycle/2461a4934062a3be2dc9, lifecycle/70bcae3ab1c4777651f0, lifecycle/5082531d009e61e07a7d] + rule: Any imaging dataset with a Delaunay natural-neighbour source on an A100 node uses jax_gpu_dense_fp64. + supersedes: null +# separation: separated +- id: imaging-delaunay-nn-standard-cpu-many-core + title: 'Designation: imaging/delaunay_nn standard cpu_many_core' + date: YYYY-MM-DD + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/imaging-delaunay-nn-standard-cpu-many-core.md + kind: designation + likelihood: imaging/delaunay_nn + regime: standard + hardware_class: cpu_many_core + optimal: numba_cpu_sparse_fp64 + secondary: [jax_cpu_sparse_fp64] + evidence: [lifecycle/1ae46b0872f10459a7c4, lifecycle/2e8ae296db66eeaf44a7, lifecycle/05dde64a0eb7fdd0c4a1, lifecycle/22e86297033ff62cf19e] + rule: Any imaging dataset with a Delaunay natural-neighbour source on a many-core CPU node with no GPU uses numba_cpu_sparse_fp64, one serial likelihood per core. + supersedes: null +# separation: uncontested +- id: interferometer-mge-n-vis-lt-1e5-gpu-a100 + title: 'Designation: interferometer/mge n_vis_lt_1e5 gpu_a100' + date: YYYY-MM-DD + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/interferometer-mge-n-vis-lt-1e5-gpu-a100.md + kind: designation + likelihood: interferometer/mge + regime: n_vis_lt_1e5 + hardware_class: gpu_a100 + optimal: jax_gpu_dense_fp64_nufft + secondary: [] + evidence: [lifecycle/4c9e3b4239cc98b8a7ff, lifecycle/6cfb178c7acab8b84e63] + rule: An interferometer dataset with fewer than 1e5 visibilities and a parametric (MGE) source on an A100 node uses jax_gpu_dense_fp64_nufft. + supersedes: null +# separation: uncontested +- id: interferometer-mge-n-vis-lt-1e5-cpu-many-core + title: 'Designation: interferometer/mge n_vis_lt_1e5 cpu_many_core' + date: YYYY-MM-DD + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/interferometer-mge-n-vis-lt-1e5-cpu-many-core.md + kind: designation + likelihood: interferometer/mge + regime: n_vis_lt_1e5 + hardware_class: cpu_many_core + optimal: jax_cpu_dense_fp64_nufft + secondary: [] + evidence: [lifecycle/02e5496a9c9da3407d87, lifecycle/9a3e014c9053e1d98114] + rule: An interferometer dataset with fewer than 1e5 visibilities and a parametric (MGE) source on a many-core CPU node with no GPU uses jax_cpu_dense_fp64_nufft. + supersedes: null +# separation: separated +- id: interferometer-rectangular-n-vis-lt-1e5-gpu-a100 + title: 'Designation: interferometer/rectangular n_vis_lt_1e5 gpu_a100' + date: YYYY-MM-DD + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/interferometer-rectangular-n-vis-lt-1e5-gpu-a100.md + kind: designation + likelihood: interferometer/rectangular + regime: n_vis_lt_1e5 + hardware_class: gpu_a100 + optimal: jax_gpu_sparse_fp64_wtilde + secondary: [jax_gpu_dense_fp64_nufft] + evidence: [lifecycle/e44acbf15a2387706fa1, lifecycle/18947283f540e425ae11, lifecycle/a39d6114339d546f6bd6, lifecycle/e98a8f4000e25e6d9f35] + rule: An interferometer dataset with fewer than 1e5 visibilities and a rectangular pixelized source on an A100 node uses jax_gpu_sparse_fp64_wtilde, falling back to jax_gpu_dense_fp64_nufft. + supersedes: null +# separation: uncontested +- id: interferometer-rectangular-n-vis-1e5-1e7-gpu-a100 + title: 'Designation: interferometer/rectangular n_vis_1e5_1e7 gpu_a100' + date: YYYY-MM-DD + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/interferometer-rectangular-n-vis-1e5-1e7-gpu-a100.md + kind: designation + likelihood: interferometer/rectangular + regime: n_vis_1e5_1e7 + hardware_class: gpu_a100 + optimal: jax_gpu_sparse_fp64_wtilde + secondary: [] + evidence: [lifecycle/fe32c3ee13ad9afc455c, lifecycle/94c8f316ca657a6536ad, lifecycle/2ab9504c46bb8170ba54, lifecycle/1aafc8c30c529ae51479] + rule: An interferometer dataset with 1e5 to 1e7 visibilities and a rectangular pixelized source on an A100 node uses jax_gpu_sparse_fp64_wtilde (the dense route cannot form its mapping matrix above 1e5 visibilities). + supersedes: null +# separation: uncontested +- id: interferometer-rectangular-n-vis-ge-1e7-gpu-a100 + title: 'Designation: interferometer/rectangular n_vis_ge_1e7 gpu_a100' + date: YYYY-MM-DD + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/interferometer-rectangular-n-vis-ge-1e7-gpu-a100.md + kind: designation + likelihood: interferometer/rectangular + regime: n_vis_ge_1e7 + hardware_class: gpu_a100 + optimal: jax_gpu_sparse_fp64_wtilde + secondary: [] + evidence: [lifecycle/220d076d8421130e83cf, lifecycle/7aad4d80e0298f32687c] + rule: An interferometer dataset with at least 1e7 visibilities and a rectangular pixelized source on an A100 node uses jax_gpu_sparse_fp64_wtilde (streaming not measured). + supersedes: null +# separation: separated +- id: interferometer-rectangular-n-vis-lt-1e5-cpu-many-core + title: 'Designation: interferometer/rectangular n_vis_lt_1e5 cpu_many_core' + date: YYYY-MM-DD + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/interferometer-rectangular-n-vis-lt-1e5-cpu-many-core.md + kind: designation + likelihood: interferometer/rectangular + regime: n_vis_lt_1e5 + hardware_class: cpu_many_core + optimal: numba_cpu_sparse_fp64_wtilde + secondary: [jax_cpu_sparse_fp64_wtilde, jax_cpu_dense_fp64_nufft] + evidence: [lifecycle/0cec032ed12d6d948802, lifecycle/ad305d23a04bd7700b82, lifecycle/29d350ddd936276d4121, lifecycle/f90468fb8090019a8659, lifecycle/0e27b1175ce084dff51e, lifecycle/f8de59681124b4e117d2] + rule: An interferometer dataset with fewer than 1e5 visibilities and a rectangular pixelized source on a many-core CPU node with no GPU uses numba_cpu_sparse_fp64_wtilde, one serial likelihood per core, with the curvature route chosen by the packaged cost model. + supersedes: null +# separation: separated +- id: interferometer-rectangular-n-vis-1e5-1e7-cpu-many-core + title: 'Designation: interferometer/rectangular n_vis_1e5_1e7 cpu_many_core' + date: YYYY-MM-DD + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/interferometer-rectangular-n-vis-1e5-1e7-cpu-many-core.md + kind: designation + likelihood: interferometer/rectangular + regime: n_vis_1e5_1e7 + hardware_class: cpu_many_core + optimal: numba_cpu_sparse_fp64_wtilde + secondary: [jax_cpu_sparse_fp64_wtilde] + evidence: [lifecycle/41fd14e1f19bad947f24, lifecycle/5772383ee5a1c474afff, lifecycle/4663f221c8c3ce49b76f, lifecycle/85d104c103a554b56afa, lifecycle/fe0f252f68dcc26d7d13, lifecycle/7f44ae97f7ce3ccc7864, lifecycle/d79f1b94f4b03452d745, lifecycle/af1beefd41024500ad13] + rule: An interferometer dataset with 1e5 to 1e7 visibilities and a rectangular pixelized source on a many-core CPU node with no GPU uses numba_cpu_sparse_fp64_wtilde, one serial likelihood per core, with the curvature route chosen by the packaged cost model. + supersedes: null +# separation: separated +- id: interferometer-rectangular-n-vis-ge-1e7-cpu-many-core + title: 'Designation: interferometer/rectangular n_vis_ge_1e7 cpu_many_core' + date: YYYY-MM-DD + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/interferometer-rectangular-n-vis-ge-1e7-cpu-many-core.md + kind: designation + likelihood: interferometer/rectangular + regime: n_vis_ge_1e7 + hardware_class: cpu_many_core + optimal: numba_cpu_sparse_fp64_wtilde + secondary: [jax_cpu_sparse_fp64_wtilde] + evidence: [lifecycle/99c70939e335d08c4cff, lifecycle/8aeeeff35ca0d5d5b855, lifecycle/15aded078686cdf03ff5, lifecycle/598903fd79ec17f4328f] + rule: An interferometer dataset with at least 1e7 visibilities and a rectangular pixelized source on a many-core CPU node with no GPU uses numba_cpu_sparse_fp64_wtilde, with workers capped by node memory over peak RSS. + supersedes: null +# separation: separated +- id: interferometer-delaunay-n-vis-lt-1e5-gpu-a100 + title: 'Designation: interferometer/delaunay n_vis_lt_1e5 gpu_a100' + date: YYYY-MM-DD + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/interferometer-delaunay-n-vis-lt-1e5-gpu-a100.md + kind: designation + likelihood: interferometer/delaunay + regime: n_vis_lt_1e5 + hardware_class: gpu_a100 + optimal: jax_gpu_sparse_fp64_wtilde + secondary: [jax_gpu_dense_fp64_nufft] + evidence: [lifecycle/ff5c53947f845ee5f2d8, lifecycle/7babc936c9e3d3d61400, lifecycle/742eaf1292ed737e591e, lifecycle/f0257d6c38e984e02a27] + rule: An interferometer dataset with fewer than 1e5 visibilities and a delaunay pixelized source on an A100 node uses jax_gpu_sparse_fp64_wtilde, falling back to jax_gpu_dense_fp64_nufft. + supersedes: null +# separation: uncontested +- id: interferometer-delaunay-n-vis-1e5-1e7-gpu-a100 + title: 'Designation: interferometer/delaunay n_vis_1e5_1e7 gpu_a100' + date: YYYY-MM-DD + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/interferometer-delaunay-n-vis-1e5-1e7-gpu-a100.md + kind: designation + likelihood: interferometer/delaunay + regime: n_vis_1e5_1e7 + hardware_class: gpu_a100 + optimal: jax_gpu_sparse_fp64_wtilde + secondary: [] + evidence: [lifecycle/8dada4df3a4ed30d1721, lifecycle/3604b6b6097ea2ead0a3, lifecycle/ba12584bdfe8c2e16f30, lifecycle/d1bef0d03e8078e165cf] + rule: An interferometer dataset with 1e5 to 1e7 visibilities and a delaunay pixelized source on an A100 node uses jax_gpu_sparse_fp64_wtilde (the dense route cannot form its mapping matrix above 1e5 visibilities). + supersedes: null +# separation: uncontested +- id: interferometer-delaunay-n-vis-ge-1e7-gpu-a100 + title: 'Designation: interferometer/delaunay n_vis_ge_1e7 gpu_a100' + date: YYYY-MM-DD + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/interferometer-delaunay-n-vis-ge-1e7-gpu-a100.md + kind: designation + likelihood: interferometer/delaunay + regime: n_vis_ge_1e7 + hardware_class: gpu_a100 + optimal: jax_gpu_sparse_fp64_wtilde + secondary: [] + evidence: [lifecycle/3c33efbabefe647c901b, lifecycle/20d0956c95b461dbae98] + rule: An interferometer dataset with at least 1e7 visibilities and a delaunay pixelized source on an A100 node uses jax_gpu_sparse_fp64_wtilde (streaming not measured). + supersedes: null +# separation: separated +- id: interferometer-delaunay-n-vis-lt-1e5-cpu-many-core + title: 'Designation: interferometer/delaunay n_vis_lt_1e5 cpu_many_core' + date: YYYY-MM-DD + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/interferometer-delaunay-n-vis-lt-1e5-cpu-many-core.md + kind: designation + likelihood: interferometer/delaunay + regime: n_vis_lt_1e5 + hardware_class: cpu_many_core + optimal: numba_cpu_sparse_fp64_wtilde + secondary: [jax_cpu_sparse_fp64_wtilde, jax_cpu_dense_fp64_nufft] + evidence: [lifecycle/284efdc05b70e06e060a, lifecycle/56f48185c11f75209119, lifecycle/00838694b2c3c955a644, lifecycle/a152a69dfb443926581d, lifecycle/b2d01ef74bf71e49d774, lifecycle/ea2702adb920859138bf] + rule: An interferometer dataset with fewer than 1e5 visibilities and a delaunay pixelized source on a many-core CPU node with no GPU uses numba_cpu_sparse_fp64_wtilde, one serial likelihood per core, with the curvature route chosen by the packaged cost model. + supersedes: null +# separation: separated +- id: interferometer-delaunay-n-vis-1e5-1e7-cpu-many-core + title: 'Designation: interferometer/delaunay n_vis_1e5_1e7 cpu_many_core' + date: YYYY-MM-DD + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/interferometer-delaunay-n-vis-1e5-1e7-cpu-many-core.md + kind: designation + likelihood: interferometer/delaunay + regime: n_vis_1e5_1e7 + hardware_class: cpu_many_core + optimal: numba_cpu_sparse_fp64_wtilde + secondary: [jax_cpu_sparse_fp64_wtilde] + evidence: [lifecycle/60747d6f7a1867da50c9, lifecycle/72fa1f4145e1b837daad, lifecycle/5e9d64046821795b4651, lifecycle/52f7465981114aecc98d, lifecycle/d54c6814c51c381564cf, lifecycle/ebd642f6c596e964cea9, lifecycle/bfe464d85eab437c56be, lifecycle/2790184b43d78bf4da78] + rule: An interferometer dataset with 1e5 to 1e7 visibilities and a delaunay pixelized source on a many-core CPU node with no GPU uses numba_cpu_sparse_fp64_wtilde, one serial likelihood per core, with the curvature route chosen by the packaged cost model. + supersedes: null +# separation: HOLD - does not separate; do not record as written +- id: interferometer-delaunay-n-vis-ge-1e7-cpu-many-core + title: 'Designation: interferometer/delaunay n_vis_ge_1e7 cpu_many_core' + date: YYYY-MM-DD + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/interferometer-delaunay-n-vis-ge-1e7-cpu-many-core.md + kind: designation + likelihood: interferometer/delaunay + regime: n_vis_ge_1e7 + hardware_class: cpu_many_core + optimal: numba_cpu_sparse_fp64_wtilde + secondary: [jax_cpu_sparse_fp64_wtilde] + evidence: [lifecycle/757d2c2d7167cdef0457, lifecycle/b9bd70be62ec18cf0a02, lifecycle/e63a97d451e1633c91aa, lifecycle/bb2f3d9734b53f7fca77] + rule: An interferometer dataset with at least 1e7 visibilities and a delaunay pixelized source on a many-core CPU node with no GPU uses numba_cpu_sparse_fp64_wtilde, with workers capped by node memory over peak RSS. + supersedes: null +# separation: uncontested +- id: point-source-image-image-plane-standard-gpu-a100 + title: 'Designation: point_source_image/image_plane standard gpu_a100' + date: YYYY-MM-DD + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/point-source-image-image-plane-standard-gpu-a100.md + kind: designation + likelihood: point_source_image/image_plane + regime: standard + hardware_class: gpu_a100 + optimal: jax_gpu_na_fp64 + secondary: [] + evidence: [lifecycle/6282556b81be530f7bce, lifecycle/f4dfadf54484b22e9f69] + rule: A galaxy-scale point-source dataset fitted in the image plane on an A100 node uses jax_gpu_na_fp64. + supersedes: null +# separation: uncontested +- id: point-source-image-image-plane-standard-cpu-many-core + title: 'Designation: point_source_image/image_plane standard cpu_many_core' + date: YYYY-MM-DD + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/point-source-image-image-plane-standard-cpu-many-core.md + kind: designation + likelihood: point_source_image/image_plane + regime: standard + hardware_class: cpu_many_core + optimal: jax_cpu_na_fp64 + secondary: [] + evidence: [lifecycle/6cbf08c848ae6cdb820f, lifecycle/a884951a80a697791744] + rule: A galaxy-scale point-source dataset fitted in the image plane on a many-core CPU node with no GPU uses jax_cpu_na_fp64. + supersedes: null +# separation: per-node only +- id: point-source-source-source-plane-standard-gpu-a100 + title: 'Designation: point_source_source/source_plane standard gpu_a100' + date: YYYY-MM-DD + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/point-source-source-source-plane-standard-gpu-a100.md + kind: designation + likelihood: point_source_source/source_plane + regime: standard + hardware_class: gpu_a100 + optimal: jax_cpu_na_fp64 + secondary: [jax_gpu_na_fp64] + evidence: [lifecycle/c2bfeea342f97959dc7c, lifecycle/5e68a4c3f41437c52c70, lifecycle/fcb319f0f24b8cc9fd37, lifecycle/403a31905c1445a750ba] + rule: A galaxy-scale point-source dataset fitted in the source plane on an A100 node uses jax_cpu_na_fp64 on the node CPU cores, not the GPUs. + supersedes: null +# separation: uncontested +- id: point-source-source-source-plane-standard-cpu-many-core + title: 'Designation: point_source_source/source_plane standard cpu_many_core' + date: YYYY-MM-DD + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/point-source-source-source-plane-standard-cpu-many-core.md + kind: designation + likelihood: point_source_source/source_plane + regime: standard + hardware_class: cpu_many_core + optimal: jax_cpu_na_fp64 + secondary: [] + evidence: [lifecycle/61082dc032d7280b3bd1, lifecycle/fa18efad842f4cc9fa73] + rule: A galaxy-scale point-source dataset fitted in the source plane on a many-core CPU node with no GPU uses jax_cpu_na_fp64. + supersedes: null +``` + +## Appendix B — re-derived 2026-10-31 on the day-zero catalogue (PR #496 head c218a428; NOT published) + +```yaml +# separation: uncontested +- id: cluster-image-plane-standard-cpu-many-core + title: 'Designation: cluster/image_plane standard cpu_many_core' + date: 'YYYY-MM-DD' + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/cluster-image-plane-standard-cpu-many-core.md + kind: designation + likelihood: cluster/image_plane + regime: standard + hardware_class: cpu_many_core + optimal: jax_cpu_na_fp64 + secondary: [] + evidence: [lifecycle/86d6277f36e3c8ec1d2f, lifecycle/0533eec58c25ebd8637b] + rule: 'A cluster-scale point-source dataset fitted in the image plane on a many-core CPU node with no GPU uses jax_cpu_na_fp64.' + supersedes: null +# separation: uncontested +- id: cluster-image-plane-standard-gpu-a100 + title: 'Designation: cluster/image_plane standard gpu_a100' + date: 'YYYY-MM-DD' + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/cluster-image-plane-standard-gpu-a100.md + kind: designation + likelihood: cluster/image_plane + regime: standard + hardware_class: gpu_a100 + optimal: jax_gpu_na_fp64 + secondary: [] + evidence: [lifecycle/d92190013ae10eaa21f6, lifecycle/7e5edbcfcccee90b11b5] + rule: 'A cluster-scale point-source dataset fitted in the image plane on an A100 node uses jax_gpu_na_fp64.' + supersedes: null +# separation: uncontested +- id: cluster-source-plane-standard-cpu-many-core + title: 'Designation: cluster/source_plane standard cpu_many_core' + date: 'YYYY-MM-DD' + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/cluster-source-plane-standard-cpu-many-core.md + kind: designation + likelihood: cluster/source_plane + regime: standard + hardware_class: cpu_many_core + optimal: jax_cpu_na_fp64 + secondary: [] + evidence: [lifecycle/004001caf29a727421e0, lifecycle/8909566077ecf0ba922a] + rule: 'A cluster-scale point-source dataset fitted in the source plane on a many-core CPU node with no GPU uses jax_cpu_na_fp64.' + supersedes: null +# separation: uncontested +- id: cluster-source-plane-standard-gpu-a100 + title: 'Designation: cluster/source_plane standard gpu_a100' + date: 'YYYY-MM-DD' + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/cluster-source-plane-standard-gpu-a100.md + kind: designation + likelihood: cluster/source_plane + regime: standard + hardware_class: gpu_a100 + optimal: jax_gpu_na_fp64 + secondary: [] + evidence: [lifecycle/02df871c3e8378b505ca, lifecycle/34d551d02bba3ac253a1] + rule: 'A cluster-scale point-source dataset fitted in the source plane on an A100 node uses jax_gpu_na_fp64.' + supersedes: null +# separation: separated +- id: datacube-delaunay-standard-cpu-many-core + title: 'Designation: datacube/delaunay standard cpu_many_core' + date: 'YYYY-MM-DD' + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/datacube-delaunay-standard-cpu-many-core.md + kind: designation + likelihood: datacube/delaunay + regime: standard + hardware_class: cpu_many_core + optimal: numba_cpu_sparse_fp64_wtilde + secondary: [jax_cpu_sparse_fp64_wtilde] + evidence: [lifecycle/8e374ab509e7626573da, lifecycle/b767269193c94e381a30, lifecycle/5800a501664b981824d4, lifecycle/821bc78b048e1ae58e0a, lifecycle/6669e2835516e93361f1, lifecycle/3339ddf063b8cf824048, lifecycle/3ea56488a996d6f0ffd1, lifecycle/ffa08d2b2e0136acbb7d, lifecycle/84cc85952546c05eabe2, lifecycle/803151df21c7de55861a, lifecycle/649dfad640b1afce5631, lifecycle/8f9413a9807f794ae36e, lifecycle/5b411896dcf5b1cc5853, lifecycle/cdcbd9feaefdff4aba33] + rule: 'A datacube (interferometer channels fitted together) with a Delaunay pixelized source on a many-core CPU node with no GPU uses numba_cpu_sparse_fp64_wtilde, one serial likelihood per core (workers capped by node memory over peak RSS), falling back to jax_cpu_sparse_fp64_wtilde.' + supersedes: null +# separation: does not separate — HOLD: does not separate; do not record as written +- id: datacube-delaunay-standard-gpu-a100 + title: 'Designation: datacube/delaunay standard gpu_a100' + date: 'YYYY-MM-DD' + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/datacube-delaunay-standard-gpu-a100.md + kind: designation + likelihood: datacube/delaunay + regime: standard + hardware_class: gpu_a100 + optimal: jax_gpu_sparse_fp64_wtilde + secondary: [jax_gpu_dense_fp64_nufft] + evidence: [lifecycle/c3ed1c5a8847d28eb792, lifecycle/7c22bd05b2e6a332c05f, lifecycle/5ddc372d7a91e6f979a8, lifecycle/9779431a4492758cb70b, lifecycle/b62555fd25c854bfdf3d, lifecycle/bb703db94dff9a1c1ff7, lifecycle/5a76ad3529beab044b72, lifecycle/2dd892f07fead03714bf] + rule: 'A datacube (interferometer channels fitted together) with a Delaunay pixelized source on an A100 node uses jax_gpu_sparse_fp64_wtilde, falling back to jax_gpu_dense_fp64_nufft.' + supersedes: null +# separation: separated +- id: group-delaunay-standard-cpu-many-core + title: 'Designation: group/delaunay standard cpu_many_core' + date: 'YYYY-MM-DD' + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/group-delaunay-standard-cpu-many-core.md + kind: designation + likelihood: group/delaunay + regime: standard + hardware_class: cpu_many_core + optimal: numba_cpu_sparse_fp64 + secondary: [jax_cpu_sparse_fp64] + evidence: [lifecycle/f4474b23fc3ee5d4b43f, lifecycle/3312f41b04546c2ef2b6, lifecycle/22696238c7226a6971dd, lifecycle/15ff2e809477e969c467] + rule: 'A group-scale imaging dataset with a Delaunay pixelized source on a many-core CPU node with no GPU uses numba_cpu_sparse_fp64, one serial likelihood per core (workers capped by node memory over peak RSS), falling back to jax_cpu_sparse_fp64.' + supersedes: null +# separation: separated +- id: group-delaunay-standard-gpu-a100 + title: 'Designation: group/delaunay standard gpu_a100' + date: 'YYYY-MM-DD' + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/group-delaunay-standard-gpu-a100.md + kind: designation + likelihood: group/delaunay + regime: standard + hardware_class: gpu_a100 + optimal: jax_gpu_dense_fp64 + secondary: [jax_gpu_sparse_fp64] + evidence: [lifecycle/826e517e5786c2398767, lifecycle/4d43ba6e6f51755c0a00, lifecycle/af408d3bf87b7b904f2d, lifecycle/a99fbbd0cb8f8eaedcc4] + rule: 'A group-scale imaging dataset with a Delaunay pixelized source on an A100 node uses jax_gpu_dense_fp64, falling back to jax_gpu_sparse_fp64.' + supersedes: null +# separation: uncontested +- id: group-mge-standard-cpu-many-core + title: 'Designation: group/mge standard cpu_many_core' + date: 'YYYY-MM-DD' + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/group-mge-standard-cpu-many-core.md + kind: designation + likelihood: group/mge + regime: standard + hardware_class: cpu_many_core + optimal: jax_cpu_dense_fp64 + secondary: [] + evidence: [lifecycle/eb438402eb57e940aa63, lifecycle/5637649f49871e13e428] + rule: 'A group-scale imaging dataset with a parametric (MGE) source on a many-core CPU node with no GPU uses jax_cpu_dense_fp64.' + supersedes: null +# separation: uncontested +- id: group-mge-standard-gpu-a100 + title: 'Designation: group/mge standard gpu_a100' + date: 'YYYY-MM-DD' + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/group-mge-standard-gpu-a100.md + kind: designation + likelihood: group/mge + regime: standard + hardware_class: gpu_a100 + optimal: jax_gpu_dense_fp64 + secondary: [] + evidence: [lifecycle/c631285eca889fc2c2c4, lifecycle/883d959ca124d30992b1] + rule: 'A group-scale imaging dataset with a parametric (MGE) source on an A100 node uses jax_gpu_dense_fp64.' + supersedes: null +# separation: separated +- id: group-rectangular-standard-cpu-many-core + title: 'Designation: group/rectangular standard cpu_many_core' + date: 'YYYY-MM-DD' + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/group-rectangular-standard-cpu-many-core.md + kind: designation + likelihood: group/rectangular + regime: standard + hardware_class: cpu_many_core + optimal: numba_cpu_sparse_fp64 + secondary: [jax_cpu_sparse_fp64] + evidence: [lifecycle/acba8d20547d37e8f89c, lifecycle/6e8c2db0c3afbfa0112f, lifecycle/a393fa2e139fd0560564, lifecycle/d1eb8e9cc712b7a123b0] + rule: 'A group-scale imaging dataset with a rectangular pixelized source on a many-core CPU node with no GPU uses numba_cpu_sparse_fp64, one serial likelihood per core (workers capped by node memory over peak RSS), falling back to jax_cpu_sparse_fp64.' + supersedes: null +# separation: separated +- id: group-rectangular-standard-gpu-a100 + title: 'Designation: group/rectangular standard gpu_a100' + date: 'YYYY-MM-DD' + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/group-rectangular-standard-gpu-a100.md + kind: designation + likelihood: group/rectangular + regime: standard + hardware_class: gpu_a100 + optimal: jax_gpu_dense_fp64 + secondary: [jax_gpu_sparse_fp64] + evidence: [lifecycle/506bcbce87ad6c020945, lifecycle/e69558ac3425ca0f7c32, lifecycle/34335ddd284ac5077dc2, lifecycle/1fd3b971b77882c2ec7f] + rule: 'A group-scale imaging dataset with a rectangular pixelized source on an A100 node uses jax_gpu_dense_fp64, falling back to jax_gpu_sparse_fp64.' + supersedes: null +# separation: separated +- id: imaging-delaunay-standard-cpu-many-core + title: 'Designation: imaging/delaunay standard cpu_many_core' + date: 'YYYY-MM-DD' + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/imaging-delaunay-standard-cpu-many-core.md + kind: designation + likelihood: imaging/delaunay + regime: standard + hardware_class: cpu_many_core + optimal: numba_cpu_sparse_fp64 + secondary: [jax_cpu_sparse_fp64] + evidence: [lifecycle/e08b7a6ff7b9daea8790, lifecycle/e77729fc4ba5d235e1b0, lifecycle/1f22a4a5fcd73276ec53, lifecycle/572824ce3cc75acae94b, lifecycle/b202eb6f7da58a38882f, lifecycle/095071358666d6efbc20, lifecycle/5556ca430bc180c2d536, lifecycle/99cf9f43e4608fb548ea, lifecycle/06a9dad80c65ecd81c6c, lifecycle/51b8245cf58b86533327, lifecycle/321ec1f6f2a5955a9a20, lifecycle/3c0e90f2b30d48843af2, lifecycle/b5b87c504713b9831857, lifecycle/489bebc145a525eab14d, lifecycle/d93b4dad29e8a0f77987, lifecycle/e3b1cad17937b4c1f9dc] + rule: 'Any imaging dataset with a Delaunay pixelized source on a many-core CPU node with no GPU uses numba_cpu_sparse_fp64, one serial likelihood per core (workers capped by node memory over peak RSS).' + supersedes: null +# separation: separated +- id: imaging-delaunay-standard-gpu-a100 + title: 'Designation: imaging/delaunay standard gpu_a100' + date: 'YYYY-MM-DD' + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/imaging-delaunay-standard-gpu-a100.md + kind: designation + likelihood: imaging/delaunay + regime: standard + hardware_class: gpu_a100 + optimal: jax_gpu_dense_fp64 + secondary: [jax_gpu_sparse_fp64] + evidence: [lifecycle/fa028d54604cd08d3555, lifecycle/9b34de15d3aca2deb34c, lifecycle/99d7c3c7623e3d43d059, lifecycle/93f7eea188801e17127a, lifecycle/c07af59a8d393975dd28, lifecycle/f706db5c42869fee8ea5, lifecycle/371f67d50254479493ee, lifecycle/b72ae27c889b5f309c7d, lifecycle/73c19173fcc983318b61, lifecycle/dbb5a42b977bbac7679e, lifecycle/12c678df16e04f4f9011, lifecycle/720a326dbad29c263006, lifecycle/12348bea7be2ca70cffb, lifecycle/ff61f1cb7a87d8382b9a, lifecycle/d34ebb3d52e02dfb8b16, lifecycle/5f300473b328b24bac66] + rule: 'Any imaging dataset with a Delaunay pixelized source on an A100 node uses jax_gpu_dense_fp64, falling back to jax_gpu_sparse_fp64.' + supersedes: null +# separation: separated +- id: imaging-delaunay-nn-standard-cpu-many-core + title: 'Designation: imaging/delaunay_nn standard cpu_many_core' + date: 'YYYY-MM-DD' + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/imaging-delaunay-nn-standard-cpu-many-core.md + kind: designation + likelihood: imaging/delaunay_nn + regime: standard + hardware_class: cpu_many_core + optimal: numba_cpu_sparse_fp64 + secondary: [jax_cpu_sparse_fp64] + evidence: [lifecycle/1ae46b0872f10459a7c4, lifecycle/2e8ae296db66eeaf44a7, lifecycle/05dde64a0eb7fdd0c4a1, lifecycle/22e86297033ff62cf19e] + rule: 'Any imaging dataset with a Delaunay natural-neighbour source on a many-core CPU node with no GPU uses numba_cpu_sparse_fp64, one serial likelihood per core.' + supersedes: null +# separation: separated +- id: imaging-delaunay-nn-standard-gpu-a100 + title: 'Designation: imaging/delaunay_nn standard gpu_a100' + date: 'YYYY-MM-DD' + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/imaging-delaunay-nn-standard-gpu-a100.md + kind: designation + likelihood: imaging/delaunay_nn + regime: standard + hardware_class: gpu_a100 + optimal: jax_gpu_dense_fp64 + secondary: [jax_gpu_sparse_fp64] + evidence: [lifecycle/c661098ad46c65fa59b2, lifecycle/2461a4934062a3be2dc9, lifecycle/70bcae3ab1c4777651f0, lifecycle/5082531d009e61e07a7d] + rule: 'Any imaging dataset with a Delaunay natural-neighbour source on an A100 node uses jax_gpu_dense_fp64.' + supersedes: null +# separation: uncontested +- id: imaging-mge-standard-cpu-many-core + title: 'Designation: imaging/mge standard cpu_many_core' + date: 'YYYY-MM-DD' + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/imaging-mge-standard-cpu-many-core.md + kind: designation + likelihood: imaging/mge + regime: standard + hardware_class: cpu_many_core + optimal: jax_cpu_dense_fp64 + secondary: [] + evidence: [lifecycle/3216ffc143645fb46c72, lifecycle/a37560173314cc078894, lifecycle/190ebc582d9aba9aaa9c, lifecycle/acf067a34aa2005d1b11, lifecycle/54979849c807d452c510, lifecycle/d2aece86956eba227ada, lifecycle/4baa9bc04c8d24a713b6, lifecycle/2cf94e6d7d8231a57c92] + rule: 'Any imaging dataset fitted with a parametric (MGE) source on a many-core CPU node with no GPU uses jax_cpu_dense_fp64.' + supersedes: null +# separation: uncontested +- id: imaging-mge-standard-gpu-a100 + title: 'Designation: imaging/mge standard gpu_a100' + date: 'YYYY-MM-DD' + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/imaging-mge-standard-gpu-a100.md + kind: designation + likelihood: imaging/mge + regime: standard + hardware_class: gpu_a100 + optimal: jax_gpu_dense_fp64 + secondary: [] + evidence: [lifecycle/4b514c4262172f610fee, lifecycle/eb44c9d7e6987735cdd1, lifecycle/770dce7d7db7a1fc3b53, lifecycle/2d7064bb66242f2ca6cc, lifecycle/8a475e9abd97a8c4a1c0, lifecycle/4e93e744f3e1295b3c8d, lifecycle/0756e600e86d7ae6a462, lifecycle/a58929ead49f62c064da] + rule: 'Any imaging dataset fitted with a parametric (MGE) source on an A100 node uses jax_gpu_dense_fp64.' + supersedes: null +# separation: separated +- id: imaging-rectangular-standard-cpu-many-core + title: 'Designation: imaging/rectangular standard cpu_many_core' + date: 'YYYY-MM-DD' + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/imaging-rectangular-standard-cpu-many-core.md + kind: designation + likelihood: imaging/rectangular + regime: standard + hardware_class: cpu_many_core + optimal: numba_cpu_sparse_fp64 + secondary: [jax_cpu_sparse_fp64] + evidence: [lifecycle/d7020017fca2249bf32b, lifecycle/e44433f6b0bb6fbb1519, lifecycle/403420f8debaaa38956c, lifecycle/a721c437cf9355984ca5, lifecycle/4c53e409a27040f5d6a4, lifecycle/39a0a9b81376f2be8446, lifecycle/6060fdcfa2e5a4a0c168, lifecycle/ae663292d53c60a65c62, lifecycle/2b5e34f509175fd4d030, lifecycle/ee2df565d3603ba2bbd3, lifecycle/b62534053c00fb102bf4, lifecycle/9e90c7a031fd6370f9af, lifecycle/9bb2e30e94491253641b, lifecycle/dd67472c35e8ed230b03, lifecycle/304ac75d242dcbc2c22f, lifecycle/0de8cf81e718d21ee2aa] + rule: 'Any imaging dataset with a rectangular pixelized source on a many-core CPU node with no GPU uses numba_cpu_sparse_fp64, one serial likelihood per core (workers capped by node memory over peak RSS).' + supersedes: null +# separation: separated +- id: imaging-rectangular-standard-gpu-a100 + title: 'Designation: imaging/rectangular standard gpu_a100' + date: 'YYYY-MM-DD' + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/imaging-rectangular-standard-gpu-a100.md + kind: designation + likelihood: imaging/rectangular + regime: standard + hardware_class: gpu_a100 + optimal: jax_gpu_dense_fp64 + secondary: [jax_gpu_sparse_fp64] + evidence: [lifecycle/d570569f32c953038fde, lifecycle/32ca51df82e1724685ab, lifecycle/46db4990a22e25aee123, lifecycle/67787bf45d6bb0b3aa42, lifecycle/456f7d65babc5524183a, lifecycle/a429326f9f33ea12e6b8, lifecycle/bc5ed323618c58fc7682, lifecycle/688c98aeb69ac24ea6f3, lifecycle/42f6a707360ce63b8150, lifecycle/9bbfceb21916e4329a0a, lifecycle/cc3f3365b6ac65388a93, lifecycle/27f711205e5a76c127cb, lifecycle/ec69a200557ea8212e5e, lifecycle/76d01fc60350dd469eed, lifecycle/bdffd9d6d157b3b66435, lifecycle/df1e242101ab32dea573] + rule: 'Any imaging dataset with a rectangular pixelized source on an A100 node uses jax_gpu_dense_fp64, falling back to jax_gpu_sparse_fp64.' + supersedes: null +# separation: separated +- id: interferometer-delaunay-standard-cpu-many-core + title: 'Designation: interferometer/delaunay standard cpu_many_core' + date: 'YYYY-MM-DD' + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/interferometer-delaunay-standard-cpu-many-core.md + kind: designation + likelihood: interferometer/delaunay + regime: standard + hardware_class: cpu_many_core + optimal: numba_cpu_sparse_fp64_wtilde + secondary: [jax_cpu_sparse_fp64_wtilde] + evidence: [lifecycle/60747d6f7a1867da50c9, lifecycle/72fa1f4145e1b837daad, lifecycle/5e9d64046821795b4651, lifecycle/52f7465981114aecc98d, lifecycle/d54c6814c51c381564cf, lifecycle/ebd642f6c596e964cea9, lifecycle/bfe464d85eab437c56be, lifecycle/2790184b43d78bf4da78, lifecycle/757d2c2d7167cdef0457, lifecycle/b9bd70be62ec18cf0a02, lifecycle/e63a97d451e1633c91aa, lifecycle/bb2f3d9734b53f7fca77, lifecycle/284efdc05b70e06e060a, lifecycle/56f48185c11f75209119, lifecycle/00838694b2c3c955a644, lifecycle/a152a69dfb443926581d, lifecycle/b2d01ef74bf71e49d774, lifecycle/ea2702adb920859138bf] + rule: 'Any interferometer dataset with a Delaunay pixelized source on a many-core CPU node with no GPU uses numba_cpu_sparse_fp64_wtilde, one serial likelihood per core (workers capped by node memory over peak RSS), falling back to jax_cpu_sparse_fp64_wtilde. Untested: CPU streaming and the MGE DFT route.' + supersedes: null +# separation: separated +- id: interferometer-delaunay-standard-gpu-a100 + title: 'Designation: interferometer/delaunay standard gpu_a100' + date: 'YYYY-MM-DD' + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/interferometer-delaunay-standard-gpu-a100.md + kind: designation + likelihood: interferometer/delaunay + regime: standard + hardware_class: gpu_a100 + optimal: jax_gpu_sparse_fp64_wtilde + secondary: [jax_gpu_dense_fp64_nufft] + evidence: [lifecycle/8dada4df3a4ed30d1721, lifecycle/3604b6b6097ea2ead0a3, lifecycle/ba12584bdfe8c2e16f30, lifecycle/d1bef0d03e8078e165cf, lifecycle/3c33efbabefe647c901b, lifecycle/20d0956c95b461dbae98, lifecycle/ff5c53947f845ee5f2d8, lifecycle/7babc936c9e3d3d61400, lifecycle/742eaf1292ed737e591e, lifecycle/f0257d6c38e984e02a27] + rule: 'Any interferometer dataset with a Delaunay pixelized source on an A100 node uses jax_gpu_sparse_fp64_wtilde, falling back to jax_gpu_dense_fp64_nufft. Untested: the GPU streaming route (measured up to jvla, 2.5e7 visibilities, on W~ sparse).' + supersedes: null +# separation: uncontested +- id: interferometer-mge-standard-cpu-many-core + title: 'Designation: interferometer/mge standard cpu_many_core' + date: 'YYYY-MM-DD' + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/interferometer-mge-standard-cpu-many-core.md + kind: designation + likelihood: interferometer/mge + regime: standard + hardware_class: cpu_many_core + optimal: jax_cpu_dense_fp64_nufft + secondary: [] + evidence: [lifecycle/02e5496a9c9da3407d87, lifecycle/9a3e014c9053e1d98114] + rule: 'Any interferometer dataset with a parametric (MGE) source on a many-core CPU node with no GPU uses jax_cpu_dense_fp64_nufft. Untested: CPU streaming and the MGE DFT route.' + supersedes: null +# separation: uncontested +- id: interferometer-mge-standard-gpu-a100 + title: 'Designation: interferometer/mge standard gpu_a100' + date: 'YYYY-MM-DD' + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/interferometer-mge-standard-gpu-a100.md + kind: designation + likelihood: interferometer/mge + regime: standard + hardware_class: gpu_a100 + optimal: jax_gpu_dense_fp64_nufft + secondary: [] + evidence: [lifecycle/4c9e3b4239cc98b8a7ff, lifecycle/6cfb178c7acab8b84e63] + rule: 'Any interferometer dataset with a parametric (MGE) source on an A100 node uses jax_gpu_dense_fp64_nufft. Untested: the GPU streaming route (measured up to jvla, 2.5e7 visibilities, on W~ sparse).' + supersedes: null +# separation: separated +- id: interferometer-rectangular-standard-cpu-many-core + title: 'Designation: interferometer/rectangular standard cpu_many_core' + date: 'YYYY-MM-DD' + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/interferometer-rectangular-standard-cpu-many-core.md + kind: designation + likelihood: interferometer/rectangular + regime: standard + hardware_class: cpu_many_core + optimal: numba_cpu_sparse_fp64_wtilde + secondary: [jax_cpu_sparse_fp64_wtilde] + evidence: [lifecycle/41fd14e1f19bad947f24, lifecycle/5772383ee5a1c474afff, lifecycle/4663f221c8c3ce49b76f, lifecycle/85d104c103a554b56afa, lifecycle/fe0f252f68dcc26d7d13, lifecycle/7f44ae97f7ce3ccc7864, lifecycle/d79f1b94f4b03452d745, lifecycle/af1beefd41024500ad13, lifecycle/99c70939e335d08c4cff, lifecycle/8aeeeff35ca0d5d5b855, lifecycle/15aded078686cdf03ff5, lifecycle/598903fd79ec17f4328f, lifecycle/0cec032ed12d6d948802, lifecycle/ad305d23a04bd7700b82, lifecycle/29d350ddd936276d4121, lifecycle/f90468fb8090019a8659, lifecycle/0e27b1175ce084dff51e, lifecycle/f8de59681124b4e117d2] + rule: 'Any interferometer dataset with a rectangular pixelized source on a many-core CPU node with no GPU uses numba_cpu_sparse_fp64_wtilde, one serial likelihood per core (workers capped by node memory over peak RSS), falling back to jax_cpu_sparse_fp64_wtilde. Untested: CPU streaming and the MGE DFT route.' + supersedes: null +# separation: separated +- id: interferometer-rectangular-standard-gpu-a100 + title: 'Designation: interferometer/rectangular standard gpu_a100' + date: 'YYYY-MM-DD' + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/interferometer-rectangular-standard-gpu-a100.md + kind: designation + likelihood: interferometer/rectangular + regime: standard + hardware_class: gpu_a100 + optimal: jax_gpu_sparse_fp64_wtilde + secondary: [jax_gpu_dense_fp64_nufft] + evidence: [lifecycle/fe32c3ee13ad9afc455c, lifecycle/94c8f316ca657a6536ad, lifecycle/2ab9504c46bb8170ba54, lifecycle/1aafc8c30c529ae51479, lifecycle/220d076d8421130e83cf, lifecycle/7aad4d80e0298f32687c, lifecycle/e44acbf15a2387706fa1, lifecycle/18947283f540e425ae11, lifecycle/a39d6114339d546f6bd6, lifecycle/e98a8f4000e25e6d9f35] + rule: 'Any interferometer dataset with a rectangular pixelized source on an A100 node uses jax_gpu_sparse_fp64_wtilde, falling back to jax_gpu_dense_fp64_nufft. Untested: the GPU streaming route (measured up to jvla, 2.5e7 visibilities, on W~ sparse).' + supersedes: null +# separation: separated +- id: multi-dataset-delaunay-standard-cpu-many-core + title: 'Designation: multi_dataset/delaunay standard cpu_many_core' + date: 'YYYY-MM-DD' + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/multi-dataset-delaunay-standard-cpu-many-core.md + kind: designation + likelihood: multi_dataset/delaunay + regime: standard + hardware_class: cpu_many_core + optimal: numba_cpu_sparse_fp64 + secondary: [jax_cpu_sparse_fp64] + evidence: [lifecycle/f1dc379c56f5c2c7f32d, lifecycle/41ebc7e42114bbb5173a, lifecycle/f57f23fc63823bcdf1bc, lifecycle/d0be4a7b3506be7b53e9] + rule: 'A multi-dataset imaging fit (several datasets fitted together) with a Delaunay pixelized source on a many-core CPU node with no GPU uses numba_cpu_sparse_fp64, one serial likelihood per core (workers capped by node memory over peak RSS), falling back to jax_cpu_sparse_fp64.' + supersedes: null +# separation: separated +- id: multi-dataset-delaunay-standard-gpu-a100 + title: 'Designation: multi_dataset/delaunay standard gpu_a100' + date: 'YYYY-MM-DD' + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/multi-dataset-delaunay-standard-gpu-a100.md + kind: designation + likelihood: multi_dataset/delaunay + regime: standard + hardware_class: gpu_a100 + optimal: jax_gpu_dense_fp64 + secondary: [jax_gpu_sparse_fp64] + evidence: [lifecycle/b5dea27fcaf8b14ec9bb, lifecycle/0a0078bdc1dee2e7f555, lifecycle/b14372bc431d168fa7ff, lifecycle/74d94bd622ecce0679fe] + rule: 'A multi-dataset imaging fit (several datasets fitted together) with a Delaunay pixelized source on an A100 node uses jax_gpu_dense_fp64, falling back to jax_gpu_sparse_fp64.' + supersedes: null +# separation: separated +- id: multi-galaxy-delaunay-standard-cpu-many-core + title: 'Designation: multi_galaxy/delaunay standard cpu_many_core' + date: 'YYYY-MM-DD' + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/multi-galaxy-delaunay-standard-cpu-many-core.md + kind: designation + likelihood: multi_galaxy/delaunay + regime: standard + hardware_class: cpu_many_core + optimal: numba_cpu_sparse_fp64 + secondary: [jax_cpu_sparse_fp64] + evidence: [lifecycle/d3102456687aef830651, lifecycle/844f80aec856dd9e86ff, lifecycle/fc2096cb1c848e64b674, lifecycle/ba7ba9f1625678852fd7] + rule: 'A multi-galaxy imaging dataset with a Delaunay pixelized source on a many-core CPU node with no GPU uses numba_cpu_sparse_fp64, one serial likelihood per core (workers capped by node memory over peak RSS), falling back to jax_cpu_sparse_fp64.' + supersedes: null +# separation: separated +- id: multi-galaxy-delaunay-standard-gpu-a100 + title: 'Designation: multi_galaxy/delaunay standard gpu_a100' + date: 'YYYY-MM-DD' + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/multi-galaxy-delaunay-standard-gpu-a100.md + kind: designation + likelihood: multi_galaxy/delaunay + regime: standard + hardware_class: gpu_a100 + optimal: jax_gpu_dense_fp64 + secondary: [jax_gpu_sparse_fp64] + evidence: [lifecycle/5a510cca4fff0c0d5b58, lifecycle/dfd272620e2836754417, lifecycle/ec0a8fbc9c4e2d8b587e, lifecycle/633b3471528047682453] + rule: 'A multi-galaxy imaging dataset with a Delaunay pixelized source on an A100 node uses jax_gpu_dense_fp64, falling back to jax_gpu_sparse_fp64.' + supersedes: null +# separation: uncontested +- id: multi-galaxy-mge-standard-cpu-many-core + title: 'Designation: multi_galaxy/mge standard cpu_many_core' + date: 'YYYY-MM-DD' + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/multi-galaxy-mge-standard-cpu-many-core.md + kind: designation + likelihood: multi_galaxy/mge + regime: standard + hardware_class: cpu_many_core + optimal: jax_cpu_dense_fp64 + secondary: [] + evidence: [lifecycle/2ee75bc51ab781c2df4e, lifecycle/9edfaee55c6a1193e6f4] + rule: 'A multi-galaxy imaging dataset with a parametric (MGE) source on a many-core CPU node with no GPU uses jax_cpu_dense_fp64.' + supersedes: null +# separation: uncontested +- id: multi-galaxy-mge-standard-gpu-a100 + title: 'Designation: multi_galaxy/mge standard gpu_a100' + date: 'YYYY-MM-DD' + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/multi-galaxy-mge-standard-gpu-a100.md + kind: designation + likelihood: multi_galaxy/mge + regime: standard + hardware_class: gpu_a100 + optimal: jax_gpu_dense_fp64 + secondary: [] + evidence: [lifecycle/ad7e6ff9cd88a460649a, lifecycle/9068d8507411cfbcf803] + rule: 'A multi-galaxy imaging dataset with a parametric (MGE) source on an A100 node uses jax_gpu_dense_fp64.' + supersedes: null +# separation: separated +- id: multi-galaxy-rectangular-standard-cpu-many-core + title: 'Designation: multi_galaxy/rectangular standard cpu_many_core' + date: 'YYYY-MM-DD' + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/multi-galaxy-rectangular-standard-cpu-many-core.md + kind: designation + likelihood: multi_galaxy/rectangular + regime: standard + hardware_class: cpu_many_core + optimal: numba_cpu_sparse_fp64 + secondary: [jax_cpu_sparse_fp64] + evidence: [lifecycle/51f5d0ecf49223f09154, lifecycle/d7185e051ab18a8d35e1, lifecycle/a3ef052bb150d3365992, lifecycle/b7ba7f751e33237bf6a3] + rule: 'A multi-galaxy imaging dataset with a rectangular pixelized source on a many-core CPU node with no GPU uses numba_cpu_sparse_fp64, one serial likelihood per core (workers capped by node memory over peak RSS), falling back to jax_cpu_sparse_fp64.' + supersedes: null +# separation: separated +- id: multi-galaxy-rectangular-standard-gpu-a100 + title: 'Designation: multi_galaxy/rectangular standard gpu_a100' + date: 'YYYY-MM-DD' + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/multi-galaxy-rectangular-standard-gpu-a100.md + kind: designation + likelihood: multi_galaxy/rectangular + regime: standard + hardware_class: gpu_a100 + optimal: jax_gpu_dense_fp64 + secondary: [jax_gpu_sparse_fp64] + evidence: [lifecycle/6d59cdcd3eb1e4abf967, lifecycle/e291f6a166388b23e52f, lifecycle/f6d5339ad2b2bd8b790b, lifecycle/dd733151c3847dd9349f] + rule: 'A multi-galaxy imaging dataset with a rectangular pixelized source on an A100 node uses jax_gpu_dense_fp64, falling back to jax_gpu_sparse_fp64.' + supersedes: null +# separation: uncontested +- id: point-source-image-image-plane-standard-cpu-many-core + title: 'Designation: point_source_image/image_plane standard cpu_many_core' + date: 'YYYY-MM-DD' + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/point-source-image-image-plane-standard-cpu-many-core.md + kind: designation + likelihood: point_source_image/image_plane + regime: standard + hardware_class: cpu_many_core + optimal: jax_cpu_na_fp64 + secondary: [] + evidence: [lifecycle/6cbf08c848ae6cdb820f, lifecycle/a884951a80a697791744] + rule: 'A galaxy-scale point-source dataset fitted in the image plane on a many-core CPU node with no GPU uses jax_cpu_na_fp64.' + supersedes: null +# separation: uncontested +- id: point-source-image-image-plane-standard-gpu-a100 + title: 'Designation: point_source_image/image_plane standard gpu_a100' + date: 'YYYY-MM-DD' + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/point-source-image-image-plane-standard-gpu-a100.md + kind: designation + likelihood: point_source_image/image_plane + regime: standard + hardware_class: gpu_a100 + optimal: jax_gpu_na_fp64 + secondary: [] + evidence: [lifecycle/6282556b81be530f7bce, lifecycle/f4dfadf54484b22e9f69] + rule: 'A galaxy-scale point-source dataset fitted in the image plane on an A100 node uses jax_gpu_na_fp64.' + supersedes: null +# separation: uncontested +- id: point-source-source-source-plane-standard-cpu-many-core + title: 'Designation: point_source_source/source_plane standard cpu_many_core' + date: 'YYYY-MM-DD' + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/point-source-source-source-plane-standard-cpu-many-core.md + kind: designation + likelihood: point_source_source/source_plane + regime: standard + hardware_class: cpu_many_core + optimal: jax_cpu_na_fp64 + secondary: [] + evidence: [lifecycle/61082dc032d7280b3bd1, lifecycle/fa18efad842f4cc9fa73] + rule: 'A galaxy-scale point-source dataset fitted in the source plane on a many-core CPU node with no GPU uses jax_cpu_na_fp64.' + supersedes: null +# separation: uncontested — CHANGED from 2026-10-29 (was jax_cpu_na_fp64) +- id: point-source-source-source-plane-standard-gpu-a100 + title: 'Designation: point_source_source/source_plane standard gpu_a100' + date: 'YYYY-MM-DD' + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/point-source-source-source-plane-standard-gpu-a100.md + kind: designation + likelihood: point_source_source/source_plane + regime: standard + hardware_class: gpu_a100 + optimal: jax_gpu_na_fp64 + secondary: [] + evidence: [lifecycle/fcb319f0f24b8cc9fd37, lifecycle/403a31905c1445a750ba] + rule: 'A galaxy-scale point-source dataset fitted in the source plane on an A100 node uses jax_gpu_na_fp64.' + supersedes: null +# separation: uncontested +- id: weak-isothermal-standard-cpu-many-core + title: 'Designation: weak/isothermal standard cpu_many_core' + date: 'YYYY-MM-DD' + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/weak-isothermal-standard-cpu-many-core.md + kind: designation + likelihood: weak/isothermal + regime: standard + hardware_class: cpu_many_core + optimal: jax_cpu_dense_fp64 + secondary: [] + evidence: [lifecycle/03601d3a29aca4f5c389, lifecycle/7f6973aafe0b068ba1ab] + rule: 'A weak-lensing shear dataset with an isothermal lens on a many-core CPU node with no GPU uses jax_cpu_dense_fp64.' + supersedes: null +# separation: uncontested +- id: weak-isothermal-standard-gpu-a100 + title: 'Designation: weak/isothermal standard gpu_a100' + date: 'YYYY-MM-DD' + url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/weak-isothermal-standard-gpu-a100.md + kind: designation + likelihood: weak/isothermal + regime: standard + hardware_class: gpu_a100 + optimal: jax_gpu_dense_fp64 + secondary: [] + evidence: [lifecycle/fbd315b1a0e03f308c76, lifecycle/bfd2db209cd80e6a6354] + rule: 'A weak-lensing shear dataset with an isothermal lens on an A100 node uses jax_gpu_dense_fp64.' + supersedes: null +``` diff --git a/complete/2026/11/multistart-gradient-quick-update.md b/complete/2026/11/multistart-gradient-quick-update.md new file mode 100644 index 000000000..ee838ed0f --- /dev/null +++ b/complete/2026/11/multistart-gradient-quick-update.md @@ -0,0 +1,68 @@ +- summary: already shipped — PyAutoFit#1556 (merged 2026-09-01) wires iterations_per_quick_update into the MultiStart gradient step loop (ba22d5ba2 flips the tripwire to assert quick updates fire); 94a658b32 makes MultiStart* honour iterations_per_quick_update / live_visual_update. +- found by: draft-queue sweep 2026-11-05 (read-only audit against the Mind ledger + GitHub commit/PR/code search); closure approved by the human. + +## Original prompt + +# MultiStartGradient searches ignore iterations_per_quick_update and live_visual_update while announcing the cadence… + +Type: bug +Target: PyAutoFit +Repos: +- PyAutoFit +- autolens_workspace +Difficulty: large +Autonomy: supervised +Priority: normal +Status: formalised +Consequence: glance +Witness: a MultiStartProdigy fit run with a finite iterations_per_quick_update writes one fit.png per cadence boundary under the search output directory (counted by a test that drives the step loop and asserts the number of perform_quick_update calls), and multi_start_gradient/search.py is removed from the EXEMPT map in test_autofit/non_linear/search/test_quick_update_wiring.py rather than left in it; on the workspace side, an AST guard asserts no MultiStart* call site in scripts/ passes a kwarg the search does not honour. +Review-minutes: 3 +Unattended: ready + +MultiStartGradient searches ignore iterations_per_quick_update and live_visual_update while announcing the cadence in the startup log + +## What was observed + +Running autolens_workspace scripts/imaging/start_here.py logs: + + 2026-08-31 11:50:25,370 - autofit.non_linear.search.abstract_search - INFO - On-the-fly updates of the maximum likelihood model every 50 iterations. + +50 looks alarmingly frequent for a search whose whole budget is n_steps=300. It is not: nothing fires, so the cadence costs nothing. Raising it to 1000 would change nothing either. + +## Why nothing fires + +AbstractMultiStartGradient builds its Fitness (PyAutoFit autofit/non_linear/search/mle/multi_start_gradient/search.py:816) WITHOUT iterations_per_quick_update and WITHOUT live_visual_update, deliberately. fitness.call is traced inside jax.jit(jax.vmap(...)), so the Python-side counter in Fitness.manage_quick_update would run once at trace time and never again. The exemption is recorded in the EXEMPT map of test_autofit/non_linear/search/test_quick_update_wiring.py and in PyAutoFit#1433, which shipped iterations_per_log (default 10) as the replacement progress channel for these four searches. + +Consequences for MultiStartProdigy / MultiStartAdam / MultiStartADABelief / MultiStartLion: no periodic fit.png, no live matplotlib window in script mode, no self-refreshing Jupyter cell, and no runtime cost from the setting. + +## Defect 1 - the startup message is a false claim (PyAutoFit) + +AbstractSearch emits the "On-the-fly updates ... every N iterations" line (autofit/non_linear/search/abstract_search.py:476-488) from the base class, unconditionally, whether or not the concrete search wires the cadence through to its Fitness. The wiring test's own comment already names this failure mode: "once the cadence is announced in the startup log, a missing forward turns a dead feature into a false claim in the CLI." + +Two silent kwargs sit behind it: passing iterations_per_quick_update or live_visual_update to a MultiStart* search is accepted, stored, reported in the log, and then ignored. + +## Defect 2 - the workspace documents behaviour that does not happen + +Three scripts pass both dead kwargs to MultiStartProdigy: + +- scripts/imaging/start_here.py (iterations_per_quick_update=50, live_visual_update=True) +- scripts/interferometer/start_here.py +- scripts/multi_galaxy/start_here.py + +Each carries an __Iterations Per Update__ and a __Live Visual Update__ prose section describing a ~10 second update every 50 gradient steps, a matplotlib window that opens automatically in script mode, and a Jupyter cell that refreshes in place. None of that happens. + +The prose is also wrong on the unit, even for the searches where the machinery IS live: Fitness.manage_quick_update increments quick_update_count by the batch size (fitness.py:607, total_updates = log_likelihood.shape[0]), not by one per step. With n_starts=48, iterations_per_quick_update=50 would fire roughly every SECOND gradient step, not every fiftieth. + +The same __Live Visual Update__ prose appears in ~14 workspace scripts, but only the three above attach it to a MultiStart search - the rest use Nautilus, where the quick-update machinery is genuinely live and the prose is correct. + +## Asked-for fix + +Wire real quick updates into the multi-start searches rather than only removing the false claim. The step loop in AbstractMultiStartGradient._fit is plain host Python and already forces a device sync every step, so a counter there works where the traced one cannot - this is the same seam iterations_per_log already uses. + +1. PyAutoFit - honour iterations_per_quick_update in AbstractMultiStartGradient's step loop: at each cadence boundary, build the instance from the current global-best parameters and call analysis.perform_quick_update, and support live_visual_update through the same LiveDisplay / BackgroundQuickUpdate path Fitness uses. Decide the unit deliberately and document it (a gradient step is the natural unit here, which differs from the batch-size counting Fitness does - the two must not silently disagree). Remove multi_start_gradient/search.py from the wiring test's EXEMPT map once it honours the kwarg. +2. PyAutoFit - make the startup message honest for any search that still does not wire the cadence, and warn when an ignored kwarg is passed, pointing at the channel that does work. +3. autolens_workspace - once the library honours it, re-tune the three scripts to a sane cadence in the new unit (50 gradient steps is reasonable if the unit is steps; it is far too frequent if the unit stays batch-counted) and rewrite the __Iterations Per Update__ and __Live Visual Update__ prose so it describes what the search actually does, including how it relates to iterations_per_log. + +Expect a phase split: library first (quick-update wiring, then the honest-message / warning leg), workspace follow-up once the unit and the kwarg semantics are settled. + + diff --git a/complete/2026/11/nautilus-ep-use-jax-guard.md b/complete/2026/11/nautilus-ep-use-jax-guard.md new file mode 100644 index 000000000..81acea935 --- /dev/null +++ b/complete/2026/11/nautilus-ep-use-jax-guard.md @@ -0,0 +1,40 @@ +- summary: superseded — PyAutoFit 196abf39a (2026-10-08) "Analysis.is_jax as the single JAX probe": Nautilus reads `analysis.is_jax`, whose body is `bool(getattr(self, "_use_jax", False))`, and `PriorFactor(FactorKW, Analysis)` inherits it, so the unguarded `_use_jax` read that crashed EP prior-factor steps is gone. +- not done: the EP regression test the draft asked for (Nautilus as default_optimiser over a FactorGraphModel with PriorFactors, one step) was not found; re-file as a small test task if wanted. +- found by: draft-queue sweep 2026-11-05 (read-only audit against the Mind ledger + GitHub commit/PR/code search); closure approved by the human. + +## Original prompt + +# Nautilus as an EP default_optimiser crashes on PriorFactors (reads analysis._use_jax unguarded) + +Type: bug +Target: PyAutoFit +Repos: +- PyAutoFit +Themes: +- graphical-ep +- nautilus +Difficulty: small +Autonomy: safe +Priority: normal +Status: formalised +Consequence: glance +Witness: an EP fit whose EPOptimiser is built with default_optimiser=af.Nautilus(number_of_cores=1) over a FactorGraphModel with PriorFactors runs its prior-factor steps instead of raising AttributeError on _use_jax; a test builds that optimiser over one AnalysisFactor plus its priors and runs one step. +Review-minutes: 3 +Unattended: ready +Filed: 2026-09-17 + +Found while building the memory witness for PyAutoFit#1631. + +A `FactorGraphModel` contains `PriorFactor`s whose `.analysis` is the +`PriorFactor` itself, which has no `_use_jax` attribute. `AbstractSearch.optimise` +already reads it defensively (`getattr(analysis, "_use_jax", False)`), but the +Nautilus `_fit` (`autofit/non_linear/search/nest/nautilus/search.py`, the +`if self.force_x1_cpu or analysis._use_jax:` branch) reads it unguarded, so +`af.Nautilus` handed to `EPOptimiser` as the `default_optimiser` raises +`AttributeError` the first time a prior factor is stepped. The workaround in +the #1631 witness was a per-factor `optimiser=af.Nautilus(...)` on each +`AnalysisFactor` with `default_optimiser=af.LaplaceOptimiser()` for the priors. + +Fix: read `_use_jax` through `getattr(..., False)` in the Nautilus `_fit`, and +grep the other searches' `_fit` bodies for the same unguarded read. Add a small +EP test that drives one step with Nautilus as the default optimiser. diff --git a/complete/2026/11/nautilus-pin-tracks-autofit.md b/complete/2026/11/nautilus-pin-tracks-autofit.md new file mode 100644 index 000000000..a151d7b90 --- /dev/null +++ b/complete/2026/11/nautilus-pin-tracks-autofit.md @@ -0,0 +1,53 @@ +- summary: already shipped — PyAutoNerves#169 (merge 8eca4b3, 2026-09-15), record `complete/2026/09/colab-bootstrap-lazy-deps.md`: `setup_colab.py` pins nautilus-sampler==1.0.5 and `TestSpecifiersTrackAutofit` reads PyAutoFit's pyproject at run time — the Witness. +- found by: draft-queue sweep 2026-11-05 (read-only audit against the Mind ledger + GitHub commit/PR/code search); closure approved by the human. + +## Original prompt + +# Colab pins `nautilus-sampler==1.0.4` while PyAutoFit declares `1.0.5` + +Type: bug +Target: PyAutoNerves +Repos: +- PyAutoNerves +Difficulty: trivial +Autonomy: supervised +Priority: normal +Status: formalised +Consequence: notify +Witness: `autonerves/setup_colab.py`'s `nautilus-sampler` specifier matches the one PyAutoFit's `pyproject.toml` declares, checked by a test that reads both rather than hard-coding either version, so the two cannot drift apart again silently. +Review-minutes: 10 +Unattended: ready + +`autonerves/setup_colab.py` pins `nautilus-sampler==1.0.4` in `_SHARED_EXTRAS`: + + "nautilus-sampler==1.0.4", + +while PyAutoFit's `pyproject.toml` (line 85) declares: + + "nautilus-sampler==1.0.5", + +Every other sampler specifier in that list matches autofit exactly — the comment +above `_SHARED_EXTRAS` says outright that "their specifiers track that file" — so +this one looks like drift rather than intent. + +Why it matters: the Colab bootstrap installs with `pip install *packages --no-deps`, +so pip performs no resolution and the pinned 1.0.4 is simply what lands. Every +Colab user of all six `_PROJECTS` entries therefore runs `af.Nautilus` on 1.0.4 +against an autofit that expects 1.0.5. Nothing errors at import, which is exactly +why it went unnoticed. + +Found during PyAutoNerves#165 / #166 (the regression test asserting all three +samplers are installed). That test deliberately matches on requirement NAME with +the specifier split off, so it passes either way and does not catch this. + +Fix direction: decide which version is correct and align the two. Prefer a check +that derives the expected specifier from PyAutoFit's `pyproject.toml` rather than +restating a literal in a second place — restating it is what allowed the drift. +Consider whether the other `_SHARED_EXTRAS` pins deserve the same treatment. + +Type: bug +Target: PyAutoNerves +Difficulty: trivial +Priority: normal + + diff --git a/complete/2026/11/nerves-false-workspace-stale.md b/complete/2026/11/nerves-false-workspace-stale.md new file mode 100644 index 000000000..629cbf854 --- /dev/null +++ b/complete/2026/11/nerves-false-workspace-stale.md @@ -0,0 +1,46 @@ +- summary: already shipped — PyAutoNerves#203 (issue #202, merged 2026-10-17), record `complete/2026/10/workspace-freshness-stamp.md`: floor-only workspaces no longer generate false staleness warnings; that record's original prompt is a twin of this draft. +- found by: draft-queue sweep 2026-11-05 (read-only audit against the Mind ledger + GitHub commit/PR/code search); closure approved by the human. + +## Original prompt + +# PyAutoNerves emits a false "workspace is stale, git pull" warning… + +Type: bug +Target: PyAutoNerves +Repos: +- autolens_workspace +- PyAutoNerves +Difficulty: medium +Autonomy: supervised +Priority: normal +Status: formalised +Consequence: judge +Witness: a regression test in PyAutoNerves asserting that `check_version("2026.8.17.1", workspace_root=)` emits no warning - i.e. an installed library arbitrarily newer than the floor is the passing case, not a staleness signal. The existing below-floor case (install older than the floor raises `WorkspaceVersionMismatchError`) must still pass unchanged. +Review-minutes: 20 +Unattended: ready + +PyAutoNerves emits a false "workspace is stale, git pull" warning on an up-to-date main workspace clone. + +Running `python scripts/imaging/start_here.py` from a freshly-pulled autolens_workspace main prints: + + UserWarning: The workspace at .../autolens_workspace records library version 2026.7.9.1, + but the installed library is 2026.8.17.1 - more than 30 days newer. The workspace examples + and configs may lag the installed API. Pull the latest workspace: + cd .../autolens_workspace && git pull origin main + +The workspace IS on latest main (fd80ada0). Pulling again does nothing, so the remedy the warning suggests cannot ever clear it. + +Root cause: `autonerves/workspace.py` (`check_version` / `_stale_workspace_message`) treats `version.minimum_library_version` from `config/general.yaml` as a proxy for how fresh the workspace clone is, and warns when the installed library's date-version is more than `_STALENESS_WINDOW_DAYS` (30) newer than it. But since PyAutoBuild#120 / PyAutoNerves#118 that key is a deliberately-bumped compatibility FLOOR - the oldest library the workspace scripts work against - not a per-release stamp of the clone's age. A workspace whose scripts require no API newer than 2026.7.9.1 keeps that floor indefinitely, so every library release more than 30 days later fires the warning permanently, on an entirely current clone. The floor's age carries no information about clone staleness. + +Fix direction: decouple the staleness signal from the floor. Either drop the staleness branch entirely (the floor already covers the actionable case - an install older than the floor raises `WorkspaceVersionMismatchError`), or derive clone freshness from something that actually tracks it (workspace git commit date, or a separate release-written stamp) and only then suggest a pull. + +Note `autolens_workspace/config/general.yaml` already carries a comment telling main-branch users to set `workspace_version_check: False`. That is a documented workaround for this false positive, not a fix - it disables the whole check, including the floor guard that is genuinely useful. + +Type: bug +Target: PyAutoNerves +Witness: a regression test in PyAutoNerves asserting that `check_version("2026.8.17.1", workspace_root=)` emits no warning - i.e. an installed library arbitrarily newer than the floor is the passing case, not a staleness signal. The existing below-floor case (install older than the floor raises `WorkspaceVersionMismatchError`) must still pass unchanged. + +Difficulty: medium +Priority: normal + + diff --git a/complete/2026/11/numba-gate-retune-superseded.md b/complete/2026/11/numba-gate-retune-superseded.md new file mode 100644 index 000000000..614520f01 --- /dev/null +++ b/complete/2026/11/numba-gate-retune-superseded.md @@ -0,0 +1,60 @@ +- summary: superseded — PyAutoArray#632 (17caf228), records `complete/2026/10/interferometer-numba-route-gate.md` and `decision-matrix-gate-wording.md`: a cost model (`nnz_per_source_max: null`) replaced the fixed 60 gate, so a retune to 70 no longer applies. +- found by: draft-queue sweep 2026-11-05 (read-only audit against the Mind ledger + GitHub commit/PR/code search); closure approved by the human. + +## Original prompt + +# Retune the interferometer numba gate 60 → 70 (in-situ crossover, autolens_profiling#332) + +Type: feature +Target: autoarray +Repos: +- PyAutoArray +- autolens_profiling +Themes: +- interferometer +- numba-cpu +- config +Difficulty: small +Autonomy: supervised +Priority: low +Status: draft +Consequence: glance +Witness: with `interferometer_numba_nnz_per_source_max: 70.0`, the factory routes to the faster arm at every measured RAL CPU cell of autolens_profiling#332 (sma / alma r2.0-6.0 / alma_high, both meshes) plus two new in-band cells (alma rect r4.6, nnz ≈ 70; alma Delaunay r5.4, nnz ≈ 66), each measured numba vs NumPy FFT on the #332 harness. +Review-minutes: 6 +Lane: local-dev +Epic: interferometer-likelihood-campaign +Filed: 2026-09-27 + +## Context + +The packaged gate is one number for both meshes: PyAutoArray `autoarray/config/general.yaml:21` +(`interferometer_numba_nnz_per_source_max: 60.0`), read at +`autoarray/inversion/inversion/factory.py:284` in `_use_interferometer_numba`. Its comment quotes +"~60 (Delaunay) and ~77 (rectangular)" from #226 (prototype pack, three fiducials). + +The in-situ library-dispatch sweep in autolens_profiling#332 +(`results/notes/interferometer_mesh_cpu_breakdown_2026_09.md`) measured the numba / NumPy FFT +full-call ratio across alma mask radii. It brackets the crossover at **nnz/col ≈ 66–67 +(Delaunay: 55.6 → 0.886, 81.4 → 1.169)** and **≈ 72–73 (rect: 59.7 → 0.749, 82.7 → 1.225)**. + +- **Gate 60.** Rect cells with nnz 60–72 run the FFT route, up to 1.33× slower than numba. + Delaunay cells at 60–66 are up to 1.08× slower. +- **Gate 70.** The worst mis-route is ≤ 1.03× (Delaunay 66–70) and ≤ 1.07× (rect 70–72). +- Every *measured* cell routes correctly at both 60 and 70. The move rests on interpolation, so + the witness adds measured in-band cells first. + +## What + +1. autolens_profiling: two RAL CPU rows on the #332 harness + (`scripts/interferometer/likelihood_breakdown/{pixelization,delaunay}_numba.py --mask-radius`) + at alma rect r4.6 and alma Delaunay r5.4. Confirm the predicted nnz/col and the ratio side. +2. PyAutoArray: set `general.yaml:21` to 70.0 and re-quote its comment to "in situ ≈ 66 + (Delaunay) / ≈ 72 (rectangular), autolens_profiling#332". Mention that the crossover drifts up + with the extent (alma_high extrapolates to ≈ 80). Update the docstrings that quote 60 / 77: + `inversion_interferometer_numba_util.py` `nnz_per_source_column_from` and + `interferometer_numba/sparse.py` class docstring. +3. Any unit test pinning 60.0 as the default. + +## Out of scope + +A per-mesh or per-extent gate (the data does not yet justify a second number). GPU routing. diff --git a/complete/2026/11/point-magnification-api.md b/complete/2026/11/point-magnification-api.md new file mode 100644 index 000000000..54aa7de86 --- /dev/null +++ b/complete/2026/11/point-magnification-api.md @@ -0,0 +1,70 @@ +- summary: already shipped — PyAutoLens#798 (f791ac77) + autolens_workspace#598 (0f8b4db5), records `complete/2026/10/point-magnification-signed-surface.md` and `point-magnification-workspace-docs.md` ("Phase 5 of the arc is complete (5a + 5b)"). +- found by: draft-queue sweep 2026-11-05 (read-only audit against the Mind ledger + GitHub commit/PR/code search); closure approved by the human. + +## Original prompt + +# Magnification at a point: surface the existing API in source_science + point package, extend to multi-plane + +Type: feature +Target: PyAutoLens +Repos: +- PyAutoLens +Themes: +- cluster +- point-source +Difficulty: large +Autonomy: supervised +Priority: high +Status: formalised +Consequence: glance +Witness: Every `source_science.py` (both tiers) carries a worked mu-at-a-point example (a chosen (y,x) and each multiple-image position) via `LensCalc.magnification_2d_via_hessian_from`; the point `Result`/dataset surface exposes per-image magnifications with the parity decision (signed or |mu|) documented; the multi-plane example's mu for a source at a given `plane_redshift` equals `LensCalc.from_tracer(..., plane_j=j)` directly; and the stale `Tracer.magnification_2d_from` claim in `cluster/likelihood_function.py` is gone. +Review-minutes: 3 +Unattended: ready +Epic: cluster-strong-lensing +Phase: 5 +Parent: draft/feature/autolens/source_cluster_arc.md +Filed: 2026-08-19 (backfilled from git) + +Part of the Source & Cluster arc (phase 5 of 12). User request (verbatim): "Ability to +get Magnification at a point in source science scripts, important for clusters and then +extend to multi plane for clusters. It is common for lens modeling codes to give the +magnification at a point in the image plane. PyAutoLens may do that but its not +documented clearly, and should be in all source_science.py examples and the point source +package." + +Audit answer: PyAutoLens DOES do it, in three places, none documented in source_science: +- `LensCalc.magnification_2d_via_hessian_from(grid, xp)` (lens_calc.py:624) — arbitrary + (y,x) points, ArrayIrregular, JAX-viable; multi-plane via + `LensCalc.from_tracer(..., use_multi_plane=True, plane_j=j)`. +- `magnifications_at_positions` on the point fit (point/fit/abstract.py:111) — per-image, + multi-plane aware. But it applies `abs()` (:140) — **parity/sign is discarded at every + consumer** in the stack; decide whether to expose signed magnification (parity is + physical: image parities are standard cluster-lensing observables). +- The only closed-form profile magnification is dPIE + (dual_pseudo_isothermal_mass.py:446,779). + +Science anchor (LEGGOS II, arXiv:2606.20804): point magnification for a clump is the +magnification-map value at the pixel containing the clump centroid; per-clump errors +come from evaluating the same pixel across posterior-draw models (phase 7 handles the +draws; this phase makes the point evaluation a first-class documented call). + +Work: +1. Document magnification-at-a-point in every source_science.py (both tiers) with a + worked example: μ at chosen (y,x), μ at the positions of each multiple image. +2. Point package: expose per-image magnifications on the point Result/dataset surface + (today magnification exists only on the fit; the dataset has no magnification + attribute), and document the parity decision. +3. Multi-plane: worked example for cluster use — μ at a point for a source at given + plane_redshift (per-source LensCalc plane_j); note the #678 trap (final-plane + default). +4. Fix the stale doc claim `Tracer.magnification_2d_from` in + cluster/likelihood_function.py:387 (no such method — calls route through LensCalc). + + + +## Solver boundary — approved 2026-10-01 + +Magnification at supplied/observed coordinates and explicit source redshift can +proceed independently of forward PointSolver repairs. Do not silently substitute +solver-discovered coordinates in these examples; any such path must satisfy its +workload's accuracy/coverage/overflow checks from the separate solver programme. diff --git a/complete/2026/11/scientist-minimal-starter.md b/complete/2026/11/scientist-minimal-starter.md new file mode 100644 index 000000000..53f1c1358 --- /dev/null +++ b/complete/2026/11/scientist-minimal-starter.md @@ -0,0 +1,50 @@ +- summary: already shipped — Mind#502 / PR #503, record `complete/2026/10/scientist-starter-acceptance.md`; slices PyAutoScientist#62, #64, Mind#499, PyAutoBrain#517/#518. The draft's own "next" points at the sibling `scientist_optional_organ_activation.md`, which stays open. +- found by: draft-queue sweep 2026-11-05 (read-only audit against the Mind ledger + GitHub commit/PR/code search); closure approved by the human. + +## Original prompt + +# Minimal independent Scientist starter + +Type: feature +Epic: scientist-adoption-pilot +Target: PyAutoScientist +Difficulty: medium +Autonomy: supervised +Consequence: judge +Status: needs-slicing + +Parent: `collaborator_led_pyautoscientist_adoption_pilot.md`. + +Audit current templates and runtime dependencies. Build a small starter with empty user-owned state, configured identities and clear AI-led connect-project instructions. Choose one supported layout/harness; do not assume collaborator project/access. Prove a differently named synthetic instance first. Ask for collaborator details only at the real pilot boundary. + +Start-dev must inspect current implementation and produce a bounded one-task/one-PR plan before execution. This is a next-step record, not an active repo claim. + +## First bounded slice completed — 2026-10-11 + +`complete/2026/10/scientist-instance-profile.md` (Scientist#61) supplies portable identity, explicit optional organ connections and an empty synthetic dashboard preview. This parent remains for the next bootstrap slice: initialize empty user-owned task/knowledge state from supported templates, audit/install one local harness, connect an existing project and prove fresh-chat resumption. Do not duplicate profile work or claim the preview is a fully operational starter. + +PRs: Brain#516 then Scientist#62. Both merged and Scientist#61 closed. The next task should start with the bootstrap/harness audit above, reusing this profile API. + +## Configuration initialization slice — 2026-10-11 + +`complete/2026/10/scientist-starter-init.md` (Scientist#63 closed; PR#64 merged) adds offline dry-run/apply initialization of a new configuration directory and a local fresh-chat handoff. This does not initialize Mind/Memory or install a harness. Audit found Mind spawn targets the fuller template family and Brain's installer writes harness-wide settings; the next bootstrap slice must explicitly support a minimal layout before invoking those. Reuse both existing owners rather than duplicating their templates or installer. + +## Minimal local Mind seed — 2026-10-11 + +`complete/2026/10/scientist-minimal-mind-seed.md` (Mind#498 closed; PR#499 merged) adds a local Mind-only mode to the existing generator: empty records/body map, no automation or satellite family. Remaining next step: explicitly configure canonical identities and validate one minimal local harness with Scientist + Brain + this seed; connect one synthetic existing project and prove fresh-chat resumption. Optional Memory remains separate and no remote access is assumed. + +## Workspace-local discovery — 2026-10-11 + +`complete/2026/10/scientist-local-discovery.md` (Brain#517) integrates registered Brain/Mind skills at the workspace root for a minimal local Claude pilot, with explicit canonical identities and a synthetic no-assistant project walkthrough. CLI integration verifies generated Mind + 40 local skill links + named Scientist + project validation/rendering. Actual fresh-session conversational acceptance remains required before declaring an adopter harness validated. Optional organ activation, upgrades and hosting remain later tasks. + +## Fresh-session diagnostic — 2026-10-11 + +Brain#518 merged and is recorded in `complete/2026/10/scientist-local-discovery.md`. A real read-only Claude session identified the synthetic Mira instance and its empty task state, but found source-instance assumptions in generated Mind instructions. `complete/2026/10/minimal-seed-instructions.md` (Mind#500, PR#501) fixes that minimal-seed output. A subsequent fresh read-only session correctly reports no configured community destination, no required optional organs, no installed automation, and user-record preservation. + +This is partial acceptance evidence only. The first diagnostic excluded the Skill tool and copied relative links needed regeneration after fixture relocation; its discovery result is not product-failure evidence. With corrected links and Skill available, the local skill name is visible, but its runtime provenance is not established because the fixture is nested in the maintainer workspace. Still required: prove workspace-local skill provenance, connect a project through an actual fresh conversation, and resume it while preserving user records. Do not claim full adopter-harness acceptance from these read-only checks. Evidence: tmp/scientist-local-discovery/acceptance-corrected-result.json and the Mind#500 task's acceptance.json. + +## Bounded conversational acceptance — 2026-10-11 + +`complete/2026/10/scientist-starter-acceptance.md` (Mind#502, PR#503 merged) records the remaining local connection/resumption test. A real Skill tool message proves the sampled sizing skill resolves from this fixture's local discovery directory. A fresh conversation connected synthetic Spectra by changing only the instance project catalogue and its own canonical map. Two further fresh conversations recovered saved identity, project relationships and the existing baseline-A research note without edits; the confirmation run preserved all 532 file hashes. Owner validators/renderers pass, and all 40 local skill links remain valid. + +See `docs/scientist-starter-acceptance.md` on PR#503 for pinned inputs, replay procedure and limits. This is bounded local conversational acceptance, not a pristine installation or full adopter/release certification: existing authenticated CLI, nested maintainer workspace, hooks disabled, one sampled skill, synthetic project. No collaborator access, optional-organ activation, hosting or upgrade claim. Next implementation: one optional organ's resumable setup and validation; actual collaborator/harness validation remains its separate milestone. diff --git a/complete/2026/11/search-seed-reproducibility.md b/complete/2026/11/search-seed-reproducibility.md new file mode 100644 index 000000000..18c554c08 --- /dev/null +++ b/complete/2026/11/search-seed-reproducibility.md @@ -0,0 +1,95 @@ +- summary: already shipped — PyAutoFit#1686 (5bf057f2, 2026-10-14; search-ext A4b), record `complete/2026/10/search-ext-a4-decompose.md`: one search-level `seed` with SeedSequence fan-out, seeded dynesty/emcee and an identifier test. +- found by: draft-queue sweep 2026-11-05 (read-only audit against the Mind ledger + GitHub commit/PR/code search); closure approved by the human. + +## Original prompt + +# Give PyAutoFit searches a `seed` — today no search can be made reproducible + +Type: feature +Target: autofit +Repos: +- PyAutoFit +Themes: +- samplers +Difficulty: medium +Autonomy: safe +Priority: medium +Status: formalised +Consequence: glance +Witness: A search constructed with a fixed `seed` produces bit-identical `samples` across two runs and across two processes (dynesty first); with `seed` unset no existing search's identifier or output changes (identifier pinned in a test); the `seed_search_randomness` fixture in `test_autofit/interpolator/test_covariance.py` no longer monkeypatches `dynesty.dynesty`. +Review-minutes: 3 +Unattended: ready +Issue: (none yet) +Filed: 2026-08-05 (backfilled from git) + +## The gap + +There is no supported way to make a PyAutoFit search reproducible. A search's +randomness comes from three places, and the caller can reach none of them: + +1. **The sampler's own generator.** `DynestyStatic.search_internal_from` builds + `dynesty.NestedSampler(...)` and splats `**self.search_kwargs` + (`autofit/non_linear/search/nest/dynesty/search/abstract.py:157`). That + property is a **closed dict** of eleven fixed keys — `bound`, `sample`, + `walks`, … — so an extra kwarg cannot be threaded through it. `dynesty` + itself *does* accept `rstate`, and defaults it to + `np.random.Generator(PCG64(None))` — OS entropy + (`dynesty/dynesty.py:607-608`, `814`). So the one knob that would fix this + exists in the dependency and is unreachable from PyAutoFit. +2. **The initializer.** `autofit/non_linear/initializer.py:301` draws initial + unit values with the stdlib `random.uniform`, i.e. off the process-global + `random` module rather than a search-owned generator. +3. **`numpy.random`**, wherever callers or model code touch the legacy global. + +Seeding any one of these leaves the other two free. + +## Why it matters + +This is the *root* cause behind +`complete/…/covariance_interpolator_test_unseeded_rng.md` +(PyAutoFit#1450) — the flake that killed the **2026.8.2.1 live release**. That +fix had to seed all three sources from a test fixture, and to reach (1) at all +it **monkeypatches `dynesty.dynesty.get_random_generator`** — reaching into a +third-party module's namespace from a test, which is exactly the kind of thing +that breaks silently on a dependency upgrade. + +Two consequences beyond that one test: + +- **Any** test that runs a real search is unseedable by construction, so the + same flake class can reappear anywhere in the suite. `test_single_variable` + in that same file was already flaking at 3.6% on source (1) alone, with no + random call of its own. +- **Users cannot reproduce a fit.** Re-running the same model on the same data + gives a different chain. For a scientific inference library that is a real + gap, not only a test-hygiene one. + +## Proposed work + +1. Add a `seed` parameter to the search classes (`AbstractSearch`, honoured by + the dynesty searches first), defaulting to `None` = today's behaviour, so + this is additive and no existing fit changes. +2. When `seed` is set, derive and pass `rstate` into the dynesty sampler — + either by adding `rstate` to `search_kwargs` or by giving subclasses a hook + to extend it. Check `DynamicNestedSampler` takes the same route. +3. Give the initializer a generator seeded from the same `seed`, instead of the + global `random` module. +4. **Check the identifier and serialization surface before committing to the + shape.** PyAutoFit hashes search configuration into run identifiers + (`__identifier_fields__`) and writes search config to JSON/the database. A + `np.random.Generator` is not JSON-serializable, so store the integer seed, + not a generator object, and decide deliberately whether `seed` belongs in + `__identifier_fields__` — including it changes identifiers for existing + runs, which is the trap PyAutoGalaxy#549 was careful about. +5. Once it exists, simplify the `seed_search_randomness` fixture in + `test_autofit/interpolator/test_covariance.py` to use it and drop the + `dynesty.dynesty` monkeypatch. +6. Consider extending to the other samplers (emcee/zeus already take a seed + concept; nautilus and the MLE searches need checking) — but land dynesty + first rather than blocking on full coverage. + +## Exit criteria + +A search constructed with a fixed `seed` produces a bit-identical result across +repeated runs and across processes; no existing search's identifier or output +changes when `seed` is left unset; the interpolator test fixture no longer +monkeypatches a third-party module. diff --git a/complete/2026/11/sersic-products-read-sed-output-dir.md b/complete/2026/11/sersic-products-read-sed-output-dir.md new file mode 100644 index 000000000..c4c6cb67e --- /dev/null +++ b/complete/2026/11/sersic-products-read-sed-output-dir.md @@ -0,0 +1,52 @@ +- summary: already shipped — euclid_strong_lens_modeling_pipeline 126167b00 (2026-10-05) "catalogue: read Sersic fits from output_sed…"; `build_inspection_bundle.sh` now documents `SED_OUTPUT_DIR` as holding every Sersic fit (VIS sersic_lens_model/vis and the per-band SED fits). Stage numbering changed since filing (09-17). +- found by: draft-queue sweep 2026-11-05 (read-only audit against the Mind ledger + GitHub commit/PR/code search); closure approved by the human. + +## Original prompt + +# Bundle stages 1/5/6 read OUTPUT_DIR, but the SED chain writes sersic_lens_model into SED_OUTPUT_DIR — the Sersic products never appear in a documented bundle build + +Type: bug +Target: euclid +Repos: +- euclid_strong_lens_modeling_pipeline +Themes: +- euclid +- catalogue +Difficulty: small +Autonomy: supervised +Priority: medium +Status: draft +Consequence: glance +Witness: `build_inspection_bundle.sh dr1_sep1` on a tree whose sersic_lens_model results live in output_sed/ yields lens_sersic.csv (9 rows), source_sersic.csv, fit_sersic.png and coolest_sersic.json; today it yields none of them +Review-minutes: 3 +Unattended: ready +Filed: 2026-09-17 + +## Observed + +Seen 2026-09-17 building the `dr1_sep1` bundle in `Science/euclid_dr1` after SLURM array 343381 (the CPU +SED chain, `scripts/sersic_lens_model_waveband.py` under `PYAUTO_OUTPUT_DIR=output_sed`). The chain +writes `sersic_lens_model/vis` (and the bands) into `output_sed///`. `scripts/build_inspection_bundle.sh` +runs stages 1 (`build_inspect.py` → `fit_sersic.png`, `coolest_sersic.json`), 5 (`lens_sersic.py`) and +6 (`source_sersic.py`) against `OUTPUT_DIR` (default `output`), where the Sersic stage never lands, so +the bundle reports "no completed sersic_lens_model/vis results" and ships without `lens_sersic.csv`, +`source_sersic.csv`, `fit_sersic.png` or `coolest_sersic.json`. Run by hand with `--output_path=output_sed`, +`lens_sersic.py` and `source_sersic.py` produce 9 rows each — the fits are fine, only the wiring is wrong. +`euclid_dr1_prelim/inspect/dr1_prelim_grade_ab_342629/` has the identical gap, so this has been silently +true since the prelim run; `catalogue/README.md`'s "Fits the bundle expects" documents exactly this +three-command recipe, so the documented path cannot produce 4 of the 19 bundle files. + +## Ask + +Decide where the Sersic stage canonically lives (the SED chain's `output_sed`, since `sersic_lens_model.py` +run standalone is the exception, not the rule) and make stages 1, 5 and 6 read it from there — e.g. a +`SERSIC_OUTPUT_DIR` defaulting to `SED_OUTPUT_DIR`, or have stages 5/6 fall back to the SED tree when the +main tree has no `sersic_lens_model` results. Update `catalogue/README.md`'s producer table ("Upstream fit +it needs") and the env table, and add a fast test that a tree with `sersic_lens_model` only under the SED +directory still yields the four products (the `tests/test_catalogue_latent_columns.py` result-tree fixture +is the pattern). + +## Evidence + +- `Science/euclid_dr1/wiki/project/2026-09-17-sed-chain-sep1.md` ("Drift" section) and the bundle logs + in the 2026-09-17 session scratchpad. From a242d7104a893d50fba1750ca01aa9118b4f4fe6 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 5 Nov 2026 19:46:32 +0000 Subject: [PATCH 6/9] sweep: remove the 18 closed drafts, apply the 24 re-scope notes and pointer updates Completes f5d320519, which carried only the new records (a stash round-trip left these changes unstaged). Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_016nhQ8MZyNga1wamBmFdfAK --- active/gradient_correctness_sweep.md | 2 +- complete/index.md | 20 +- dashboard.html | 179 +-- dashboard.md | 836 +++------- ...der_yml_blocked_until_pyautocti_release.md | 60 - ...tgradient_searches_ignore_iterations_pe.md | 63 - ...fault_optimiser_reads_use_jax_unguarded.md | 34 - ...enable_pytrees_register_model_advice_in.md | 7 + ...ingle_jit_median_reach_and_a100_witness.md | 7 + ...radient_json_point_label_standard_cells.md | 21 - ...tilus_sampler_pin_drifts_from_pyautofit.md | 48 - ...nerves_emits_a_false_workspace_is_stale.md | 41 - ...ucts_read_output_dir_not_sed_output_dir.md | 47 - .../euclid_dr1_flip_rgb_jpg_upside_down.md | 38 - .../autogalaxy/adapt_image_is_the_s_n_map.md | 7 + .../ai_options_page_autolens_leg.md | 7 + ..._ring_guided_walkthrough_p3_front_doors.md | 7 + .../workspaces/assistants_regime_extension.md | 7 + .../interferometer_numba_gate_retune_70.md | 55 - .../autofit/search_seed_reproducibility.md | 90 -- .../ell_comps_joint_disk_constraint.md | 109 -- ...r_fit_visualizer_cluster_wide_model_fit.md | 7 + .../magnification_maps_visualization.md | 7 + .../autolens/point_magnification_api.md | 65 - .../autolens_jax_joss_benchmark_repo.md | 104 -- ...ter_visualization_group_render_every_cl.md | 7 + .../catalogue_extension_coolest_mass_fits.md | 7 + .../pyautobroca/broca_communication_pilot.md | 7 + .../pyautoears/community_organ_birth.md | 7 + .../pyautoeyes/group_cluster_gallery.md | 33 - .../pyautoeyes/multi_galaxy_gallery.md | 33 - .../scientist_minimal_starter.md | 45 - .../scientist_optional_organ_activation.md | 7 + .../workspaces/model_figures_6_rollout.md | 7 + .../small_datasets_followups_after_8c.md | 7 + .../organs/reduce_session_token_load.md | 7 + .../hpc_cache_off_home_phase2_euclid.md | 95 -- .../pynufft_removal_downstream_residue.md | 7 + .../critical_curves_dispatch_cluster.md | 7 + .../remove_eden_packaging_tooling.md | 7 + draft/research/autoarray/delaunay_research.md | 7 + .../autolens/lenstwin_p4_identifiability.md | 7 + .../likelihood_lifecycle_epic.md | 2 +- ...hood_lifecycle_p3_designation_proposals.md | 1365 ----------------- .../matrix_free_interferometer_phase5.md | 7 + .../euclid_dr1_positions_gate_remodel_run.md | 7 + .../mesh_magnification_correctness.md | 7 + state.json | 2 +- 48 files changed, 470 insertions(+), 3085 deletions(-) delete mode 100644 draft/bug/autocti_visualization/render_yml_blocked_until_pyautocti_release.md delete mode 100644 draft/bug/autofit/multistartgradient_searches_ignore_iterations_pe.md delete mode 100644 draft/bug/autofit/nautilus_ep_default_optimiser_reads_use_jax_unguarded.md delete mode 100644 draft/bug/autolens_profiling/gradient_json_point_label_standard_cells.md delete mode 100644 draft/bug/autonerves/nautilus_sampler_pin_drifts_from_pyautofit.md delete mode 100644 draft/bug/autonerves/pyautonerves_emits_a_false_workspace_is_stale.md delete mode 100644 draft/bug/euclid/bundle_sersic_products_read_output_dir_not_sed_output_dir.md delete mode 100644 draft/bug/euclid/euclid_dr1_flip_rgb_jpg_upside_down.md delete mode 100644 draft/feature/autoarray/interferometer_numba_gate_retune_70.md delete mode 100644 draft/feature/autofit/search_seed_reproducibility.md delete mode 100644 draft/feature/autogalaxy/ell_comps_joint_disk_constraint.md delete mode 100644 draft/feature/autolens/point_magnification_api.md delete mode 100644 draft/feature/autolens_jax_joss/autolens_jax_joss_benchmark_repo.md delete mode 100644 draft/feature/pyautoeyes/group_cluster_gallery.md delete mode 100644 draft/feature/pyautoeyes/multi_galaxy_gallery.md delete mode 100644 draft/feature/pyautoscientist/scientist_minimal_starter.md delete mode 100644 draft/maintenance/workspaces/hpc_cache_off_home_phase2_euclid.md delete mode 100644 draft/research/autolens_profiling/likelihood_lifecycle_p3_designation_proposals.md diff --git a/active/gradient_correctness_sweep.md b/active/gradient_correctness_sweep.md index 2c108b1b8..f589336ce 100644 --- a/active/gradient_correctness_sweep.md +++ b/active/gradient_correctness_sweep.md @@ -71,7 +71,7 @@ Human request (2026-11-02): "find all gradient related issues that investigate b ### C. Bookkeeping, tests and corrections -10. **`gradient.json` `point` mislabel.** Source: `draft/bug/autolens_profiling/gradient_json_point_label_standard_cells.md` (glance; a quick win, do it early). +10. **`gradient.json` `point` mislabel.** Source: `draft/bug/autolens_profiling/gradient_json_point_label_standard_cells.md` (glance; a quick win, do it early). **Shipped** in autolens_profiling#518 (9d2ee2d3d, 2026-11-02); draft closed 2026-11-05 as `complete/2026/11/gradient-json-point-label.md`. 11. **Correct the #515 research note.** In autolens_profiling `wiki/research/gradient_campaign_impact_border_tie.md`, the table row for `point_source_image/image_plane` and `cluster/image_plane` says *autodiff* is exactly zero. It is the **FD** that is zero and autodiff that is nonzero (mechanism E). Fix that row and link item 9. 12. **Verify the rectangular mapper row-weights bug is fixed.** Source: `draft/bug/autoarray/rectangular_mapper_bilinear_row_weights.md` (filed 2026-08-26, Status: draft). The code in `autoarray/inversion/mesh/interpolator/rectangular.py` now carries comments saying the mirrored row weights and the `ceil` bracketing were fixed (autolens_workspace_test#279). Verify, then retire it with the fixing commit. 13. **Critical-curve / caustic `jit` / `grad` parity test.** Source: `draft/test/autolens_workspace_test/jax_zero_contour.md` (notify). diff --git a/complete/index.md b/complete/index.md index 2bcc94d0c..8a4e9b344 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. -2149 records across 11 buckets. +2167 records across 11 buckets. ## Highlights @@ -125,6 +125,7 @@ markers; everything below GENERATED is rebuilt. - [arcticpy-lazy-import](2026/11/arcticpy-lazy-import.md) - [arxiv-edge-refuses-stdlib-urllib](2026/11/arxiv-edge-refuses-stdlib-urllib.md) — superseded by a different fix — closed. Commit 4d8290555 (2026-09-20, "fix: fall back to curl when arXiv rejec… - [arxiv-refs-api-errors](2026/11/arxiv-refs-api-errors.md) — already shipped — closed as stale draft. PyAutoMemory#143 (merged 2026-11-03, merge 1f22de7; commits 0c3e2dc, … +- [autocti-render-yml-blocked-dup](2026/11/autocti-render-yml-blocked-dup.md) — superseded/shipped — autocti_visualization#8 (2026-10-23), record `complete/2026/10/autocti-viz-render-from-ma… - [autonomous-orchestrators-p1](2026/11/autonomous-orchestrators-p1.md) — phase 1 of 7; epic draft/feature/pyautobrain/autonomous_orchestrators_epic.md - [autonomous-orchestrators-p2](2026/11/autonomous-orchestrators-p2.md) — phase 2 of 7; epic draft/feature/pyautobrain/autonomous_orchestrators_epic.md - [autonomous-orchestrators-p3a](2026/11/autonomous-orchestrators-p3a.md) — phase 3a of 3a–3d; epic draft/feature/pyautobrain/autonomous_orchestrators_epic.md @@ -143,21 +144,29 @@ markers; everything below GENERATED is rebuilt. - [cti-fits-fit-output-dir](2026/11/cti-fits-fit-output-dir.md) - [cti-likelihood-pins](2026/11/cti-likelihood-pins.md) — cti-upkeep phase 0b - [cti-release-train-wiring](2026/11/cti-release-train-wiring.md) +- [dr1-rgb-flip-superseded](2026/11/dr1-rgb-flip-superseded.md) — superseded by the human 2026-10-30 (the draft's own banner); `complete/2026/10/sky-orientation-dr1-p1.md` reco… +- [ell-comps-disk-constraint-dup](2026/11/ell-comps-disk-constraint-dup.md) — already shipped before it was filed — PyAutoFit#1538 (96dad519) + PyAutoGalaxy#589 (merge 0fbe863d, 2026-08-28… +- [eyes-group-cluster-gallery](2026/11/eyes-group-cluster-gallery.md) — superseded by human decision — autolens_visualization#5 and #14, record `complete/2026/10/viz-all-dataset-type… +- [eyes-multi-galaxy-gallery](2026/11/eyes-multi-galaxy-gallery.md) — superseded by human decision — autolens_visualization#5 (+ 465fc508 datasets), record `complete/2026/10/viz-al… - [generate-converter-preflight](2026/11/generate-converter-preflight.md) - [glance-shadow-window-reached](2026/11/glance-shadow-window-reached.md) — already shipped — closed as stale draft. Item 1 (code): commit 679b1319f (2026-10-16) made `shadow_count_line(… - [glance-tier-ruling](2026/11/glance-tier-ruling.md) — prerequisite for phase 4 unattended merges; epic draft/feature/pyautobrain/autonomous_orchestrators_epic.md - [gradient-campaign-impact](2026/11/gradient-campaign-impact.md) — human-requested assessment of whether the two PyAutoArray#671 defects affected the likelihood-lifecycle phase-… +- [gradient-json-point-label](2026/11/gradient-json-point-label.md) — already shipped — autolens_profiling#518 (9d2ee2d3d, merged 2026-11-02 22:38, filed 16:18 the same day) record… - [howto-chapter2-format](2026/11/howto-chapter2-format.md) — Restored descriptive contents for Lens lessons 1–4 and complete ordered contents for Galaxy lessons 1–6, corre… - [howto-prose-format](2026/11/howto-prose-format.md) - [howtogalaxy-ch3-parity](2026/11/howtogalaxy-ch3-parity.md) — Ported the approved HowToLens Chapter 3 teaching improvements to directly observed galaxies: Goldilocks/log-ev… - [howtolens-ch2-explanations](2026/11/howtolens-ch2-explanations.md) — Completed the approved Chapter 2 rewrite, including explicit parameter-space explanations, delayed linear-prof… - [howtolens-ch3-approved](2026/11/howtolens-ch3-approved.md) — Implemented all 66 approved Chapter 3 prose blocks, restored Fit Problems and introductory positivity/mapping-… - [howtolens-chapter2](2026/11/howtolens-chapter2.md) — Applied approved tutorials 1–4, optional Prodigy introduction, notebook generation and navigation. Later Chapt… +- [hpc-cache-off-home-euclid](2026/11/hpc-cache-off-home-euclid.md) — already shipped — euclid_strong_lens_modeling_pipeline 37034f22 (2026-09-25, default branch) "activate.sh: kee… - [hpc-campaign-p5a-assistant](2026/11/hpc-campaign-p5a-assistant.md) — phase 5a; ledger draft/research/autofit/hpc_campaign_epic.md - [hygiene-extras-tomllib](2026/11/hygiene-extras-tomllib.md) - [hygiene-refs-false-positives](2026/11/hygiene-refs-false-positives.md) - [intake-memory-line-organ-targets](2026/11/intake-memory-line-organ-targets.md) — already shipped — closed as stale draft. The `_with_memory` gate in `agents/conductors/intake/_intake.py` land… +- [jax-joss-benchmark-repo](2026/11/jax-joss-benchmark-repo.md) — already shipped — PyAutoLabs/autolens_jax_joss: 9c66b020 (birth, 10 benchmark scripts), 64204f69 (A100 sweep o… - [latest-per-test-tie](2026/11/latest-per-test-tie.md) — test_autofit/results/test_identity.py::test_latest_per_keeps_the_latest_sibling flaked (main red at 963ff296a, +- [lifecycle-p3-designation-proposals](2026/11/lifecycle-p3-designation-proposals.md) — decided and shipped — the human approved all 39 designations (datacube/delaunay gpu_a100 held provisional); Py… - [likelihood-lifecycle-p3-day-zero-pages](2026/11/likelihood-lifecycle-p3-day-zero-pages.md) - [likelihood-lifecycle-p3-day-zero-stamp](2026/11/likelihood-lifecycle-p3-day-zero-stamp.md) - [likelihood-lifecycle-p3-setup-baseline-close](2026/11/likelihood-lifecycle-p3-setup-baseline-close.md) @@ -173,10 +182,16 @@ markers; everything below GENERATED is rebuilt. - [magnification-maps-image-plane](2026/11/magnification-maps-image-plane.md) - [magnification-maps-source-plane](2026/11/magnification-maps-source-plane.md) - [magnification-maps-uncertainty](2026/11/magnification-maps-uncertainty.md) +- [multistart-gradient-quick-update](2026/11/multistart-gradient-quick-update.md) — already shipped — PyAutoFit#1556 (merged 2026-09-01) wires iterations_per_quick_update into the MultiStart gra… - [multistart-resume-cadence](2026/11/multistart-resume-cadence.md) — 2 → 100 +- [nautilus-ep-use-jax-guard](2026/11/nautilus-ep-use-jax-guard.md) — superseded — PyAutoFit 196abf39a (2026-10-08) "Analysis.is_jax as the single JAX probe": Nautilus reads `analy… +- [nautilus-pin-tracks-autofit](2026/11/nautilus-pin-tracks-autofit.md) — already shipped — PyAutoNerves#169 (merge 8eca4b3, 2026-09-15), record `complete/2026/09/colab-bootstrap-lazy-… +- [nerves-false-workspace-stale](2026/11/nerves-false-workspace-stale.md) — already shipped — PyAutoNerves#203 (issue #202, merged 2026-10-17), record `complete/2026/10/workspace-freshne… - [nightly-token-refresh](2026/11/nightly-token-refresh.md) - [numba-fork-safe-threading](2026/11/numba-fork-safe-threading.md) +- [numba-gate-retune-superseded](2026/11/numba-gate-retune-superseded.md) — superseded — PyAutoArray#632 (17caf228), records `complete/2026/10/interferometer-numba-route-gate.md` and `de… - [one-line-auto-simulate-helper](2026/11/one-line-auto-simulate-helper.md) +- [point-magnification-api](2026/11/point-magnification-api.md) — already shipped — PyAutoLens#798 (f791ac77) + autolens_workspace#598 (0f8b4db5), records `complete/2026/10/poi… - [rectangular-gradient-rtu-sparse](2026/11/rectangular-gradient-rtu-sparse.md) — the filed symptom (|g| ~2e9 on the imaging/rectangular/hst fiducial, RTU all backends, Bilinear CPU sparse) sp… - [rectangular-mapper-bilinear-row-weights](2026/11/rectangular-mapper-bilinear-row-weights.md) — - **Retired as already-fixed** by the gradient-correctness sweep (autolens_profiling#517, item 12). The draft … - [registry-reconcile-app-token](2026/11/registry-reconcile-app-token.md) @@ -186,6 +201,9 @@ markers; everything below GENERATED is rebuilt. - [results-library-p4-package](2026/11/results-library-p4-package.md) — phase 4; ledger draft/feature/autofit/results_library_epic.md - [results-library-p5b-cortex](2026/11/results-library-p5b-cortex.md) — phase 5b; ledger draft/feature/autofit/results_library_epic.md - [rtd-organism-currency](2026/11/rtd-organism-currency.md) — already shipped, closed as a stale draft. PyAutoBrain 1aa2ed4 (#563) renamed `docs/organs/build` to `organs/ha… +- [scientist-minimal-starter](2026/11/scientist-minimal-starter.md) — already shipped — Mind#502 / PR #503, record `complete/2026/10/scientist-starter-acceptance.md`; slices PyAuto… +- [search-seed-reproducibility](2026/11/search-seed-reproducibility.md) — already shipped — PyAutoFit#1686 (5bf057f2, 2026-10-14; search-ext A4b), record `complete/2026/10/search-ext-a… +- [sersic-products-read-sed-output-dir](2026/11/sersic-products-read-sed-output-dir.md) — already shipped — euclid_strong_lens_modeling_pipeline 126167b00 (2026-10-05) "catalogue: read Sersic fits fro… - [session-start-hook-copies-regen](2026/11/session-start-hook-copies-regen.md) — shipped, closed. The 2026-09-29 sweep PRs landed. On HEAD of all 27 swept repos, `.claude/hooks/session-start.… - [shift-digest-readable-picks](2026/11/shift-digest-readable-picks.md) — pilot 4c follow-up; issue PyAutoBrain#579 - [simulate-if-needed-workspace-sweep](2026/11/simulate-if-needed-workspace-sweep.md) diff --git a/dashboard.html b/dashboard.html index 801cae156..6464693b8 100644 --- a/dashboard.html +++ b/dashboard.html @@ -327,8 +327,8 @@ Keep track of decisions and outstanding questions throughout this conversation. After changes, report what was recorded, where it lives and what remains to do. Work on GitHub: -- Open Mind repository: https://github.com/PyAutoLabs/PyAutoMind
Last updated 2026-11-05 19:18:54 UTC
↻ Update

- +- Open Mind repository: https://github.com/PyAutoLabs/PyAutoMind
Last updated 2026-11-05 19:42:17 UTC
↻ Update

+
Batch 2026-11-05-am — 0 in progress · 0 awaiting review

Nothing to review yet.

Start here

24
@@ -345,7 +345,7 @@

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

Eyes cluster visualization group: render every cluster/point-source figure for PyAutoEyes✨ featureautolens_visualizationlargesupervisedhigh

Deep research: Can we speed up Delaunay in PyAutoArray?🔬 researchautoarraytoo-largesupervisedhigh

-

Fits a slot (ready to run unattended, cheapest to review first) — showing 12 of 88

+

Fits a slot (ready to run unattended, cheapest to review first) — showing 12 of 80

Guard every workspace script against untimed network downloads🧪 testautolens_workspacesmallsafemedium

@@ -361,17 +361,16 @@

Fits a slot (ready to run unattended, cheapest to revie

Epics

21

Long-running multi-phase programmes — 📋 copies a prompt that works out where the epic stands from its ledger and continues it from the next logical point. Members are worked in order through the epic's ledger — continue the epic rather than starting one standalone.

-CTI upkeep parity — release-train wiring and first modern autocti release, arcticpy modernisation (upstream 2.7 / wheels, DNA, docs), integration-test parity (smoke coverage, workspace_test rebuild, 3.12–3.14 matrix, docs build), autocti_profiling + Pulse cti row, figures/assistant/docs currency, hygiene — 6 queued prompt(s), in order +CTI upkeep parity — release-train wiring and first modern autocti release, arcticpy modernisation (upstream 2.7 / wheels, DNA, docs), integration-test parity (smoke coverage, workspace_test rebuild, 3.12–3.14 matrix, docs build), autocti_profiling + Pulse cti row, figures/assistant/docs currency, hygiene — 5 queued prompt(s), in order

CTI upkeep parity — release-train wiring and first modern autocti release, arcticpy modernisation (upstream 2.7 / wheels, DNA, docs), integration-test parity (smoke coverage, workspace_test rebuild, 3.12–3.14 matrix, docs build), autocti_profiling + Pulse cti row, figures/assistant/docs currency, hygiene — ledger: draft/maintenance/autocti/cti_upkeep_epic.md — FILED 2026-11-04 — survey in draft/maintenance/autocti/cti_upkeep_epic_report.md; R1–R6 RULED 2026-11-04 (arcticpy fixed upstream…

-

Heart/DNA: bump the arcticpy pin after the upstream release, re-pin CTI values🧹 maintenancepyautoheartmediumhuman-requirednormal

-Likelihood lifecycle — optimal setups baked into PyAutoLens (setup="auto"), Pulse/Insight day zero, mirrored autolens_profiling / autolens_inference trees, and one repeatable profiling → validation → gradient → sampler sequence per likelihood — 9 queued prompt(s), in order +Likelihood lifecycle — optimal setups baked into PyAutoLens (setup="auto"), Pulse/Insight day zero, mirrored autolens_profiling / autolens_inference trees, and one repeatable profiling → validation → gradient → sampler sequence per likelihood — 7 queued prompt(s), in order

Likelihood lifecycle — optimal setups baked into PyAutoLens (setup="auto"), Pulse/Insight day zero, mirrored autolens_profiling / autolens_inference trees, and one repeatable profiling → validation → gradient → sampler sequence per likelihood — ledger: draft/research/autolens_profiling/likelihood_lifecycle_epic.md — PHASE 0 COMPLETE 2026-10-24 — 0A PyAutoPulse#70; 0B autolens_profiling#444/#447/#448/#449/#450/#451 + PyAutoPulse#74 (lens at…

Gradient cost hazard on RAL CPU: value_and_grad above 4x the forward call…✨ featureautolens_profilingmediumsupervisedlow

@@ -380,15 +379,12 @@

Fits a slot (ready to run unattended, cheapest to revie

Likelihood lifecycle epic: optimal setups baked into PyAutoLens, Pulse/Insight day zero…🔬 researchautolens_profilingtoo-largehuman-requiredhigh

-

Likelihood lifecycle epic — research report and phased plan🔬 researchautolens_profilingtoo-largehuman-requiredhigh

-

Likelihood lifecycle phase 3: designation proposals for the completed campaigns…🔬 researchautolens_profilinglargehuman-requiredhigh

-LensTwin — observation-anchored digital twins of fitted strong lenses: al.twins in PyAutoLens, mass-normalisation primitives in PyAutoGalaxy, used from ordinary Science/active projects, and the first stellar-plus-dark-matter identifiability experiment (ERC dark-matter cores vs cusps) — 3 queued prompt(s), in order +LensTwin — observation-anchored digital twins of fitted strong lenses: al.twins in PyAutoLens, mass-normalisation primitives in PyAutoGalaxy, used from ordinary Science/active projects, and the first stellar-plus-dark-matter identifiability experiment (ERC dark-matter cores vs cusps) — 2 queued prompt(s), in order

LensTwin — observation-anchored digital twins of fitted strong lenses: al.twins in PyAutoLens, mass-normalisation primitives in PyAutoGalaxy, used from ordinary Science/active projects, and the first stellar-plus-dark-matter identifiability experiment (ERC dark-matter cores vs cusps) — ledger: draft/feature/autolens/lenstwin_epic.md — filed 2026-10-28 from the LensTwin brief; R1–R2 RULED 2026-10-28 (al.twins; observed noise map by default). PHASE 0 COMPLETE…

-

LensTwin epic — research report, architecture and detailed phase bodies✨ featureautolenstoo-largehuman-requiredhigh

HPC campaign — run large PyAutoFit modelling campaigns efficiently, token-cheaply and low-carbon: per-fit status records, declarative campaign.yaml with Slurm/Local/Fake adapters, evidence-graded planning, carbon reporting — 1 queued prompt(s), in order @@ -396,10 +392,9 @@

Fits a slot (ready to run unattended, cheapest to revie

-Results library — PyAutoFit infrastructure to index, complete, export, package and reconcile thousands of finished results (follow-up to hpc-campaign; Euclid DR1 is the pilot) — 2 queued prompt(s), in order +Results library — PyAutoFit infrastructure to index, complete, export, package and reconcile thousands of finished results (follow-up to hpc-campaign; Euclid DR1 is the pilot) — 1 queued prompt(s), in order

Results library — PyAutoFit infrastructure to index, complete, export, package and reconcile thousands of finished results (follow-up to hpc-campaign; Euclid DR1 is the pilot) — ledger: draft/feature/autofit/results_library_epic.md — STARTED 2026-10-28 — concurrent with hpc-campaign; phase 0 shared, owned by results-library. Rulings F1–F12 recorded in the…

-

Results library epic — lessons from building the Euclid DR1 catalogue✨ featureautofittoo-largehuman-requiredhigh

Search extensibility — a PyAutoFit search framework for many samplers, a unified JAX contract, generated search docs, and the autofit_inference / autofit_profiling benchmark repos — 2 queued prompt(s), in order @@ -454,11 +449,10 @@

Fits a slot (ready to run unattended, cheapest to revie

autolens_inference — inference benchmarking repo, birth to first base run — ledger: https://github.com/PyAutoLabs/PyAutoInsight/blob/main/campaigns.yaml

Linear-solver accuracy/tolerance programme — a standing autolens_profiling package for positive-only solver studies — ledger: autolens_profiling/wiki/campaigns/linear_solver_accuracy.md (contract: complete/2026/09/linear-solver-accuracy-study.md) — phase 2 SHIPPED 2026-09-30 — PyAutoArray#595 merged (7a89e19a0, forward polish; pending release) + autolens_profiling#357 merged…

-Cluster strong lensing — Source & Cluster arc — 15 queued prompt(s), in order +Cluster strong lensing — Source & Cluster arc — 14 queued prompt(s), in order

Cluster strong lensing — Source & Cluster arc — ledger: draft/feature/autolens/source_cluster_arc.md — In progress — 1a–1d, phase 3a audit (profiling#364, workspace_test#341) and phase 3b field-preserving cap fix (Galaxy#646…

- @@ -473,14 +467,13 @@

Fits a slot (ready to run unattended, cheapest to revie

-Scientist adoption pilot — project resources, clear organ destinations and a growing independent Scientist — 7 queued prompt(s), in order +Scientist adoption pilot — project resources, clear organ destinations and a growing independent Scientist — 6 queued prompt(s), in order

Scientist adoption pilot — project resources, clear organ destinations and a growing independent Scientist — ledger: draft/feature/pyautoscientist/collaborator_led_pyautoscientist_adoption_pilot.md — In progress — project cards and organ-linked resource routing merged and published (Scientist PRs #56 and #58); remaining members…

Broca communication ownership and inventory contract✨ featurepyautobrocamediumsupervised

Broca communication documentation and workspaces✨ featurepyautobrocalargesupervisednormal

Broca documentation and workspace upkeep pilot✨ featurepyautobrocamediumsupervised

Collaborator-led PyAutoScientist adoption pilot✨ featurepyautoscientisttoo-largesupervisednormal

Independent collaborator validation✨ featurepyautoscientistmediumsupervised

-

Minimal independent Scientist starter✨ featurepyautoscientistmediumsupervised

Progressive optional organ activation✨ featurepyautoscientistmediumsupervised

@@ -489,13 +482,12 @@

Fits a slot (ready to run unattended, cheapest to revie

-interferometer-likelihood-campaign — 6 queued prompt(s) — ⚠️ not in epics.md +interferometer-likelihood-campaign — 5 queued prompt(s) — ⚠️ not in epics.md -
certified-positive-solver — 2 queued prompt(s) — ⚠️ not in epics.md @@ -503,9 +495,7 @@

Fits a slot (ready to run unattended, cheapest to revie

-pyautoeyes-birth — 4 queued prompt(s) — ⚠️ not in epics.md -

autolens_visualization: multi-galaxy gallery — producer and dataset✨ featurepyautoeyesmediumsupervisednormal

- +pyautoeyes-birth — 2 queued prompt(s) — ⚠️ not in epics.md

Hands release.yml fires the visualization re-render dispatches✨ featurepyautohandssmallsupervisednormal

autofit_visualization — seed every sampler so re-renders are byte-stable🧹 maintenanceautofit_visualizationsmallsafenormal

@@ -535,8 +525,8 @@

Fits a slot (ready to run unattended, cheapest to revie

interferometer-primary-beam-persistence-mirror — filed 2026-10-21 — ready — PyAutoLens claim released 2026-10-21 (point-dataset-positions-panel shipped…

point-plots-yaml-keys-assistant — filed 2026-10-22 — unblocked 2026-10-23 — cosmos-web-ring-notebook merged (autolens_assistant#161, complete/2026/10/cosmos-web-ring-notebook.md)…

-

Backlog

288
-

Lanes: any 278 · local-dev 8

+

Backlog

241
+

Lanes: any 233 · local-dev 6

Human review — 2

Human review: the scaling_relation slam parks (imaging un-parked, multi_galaxy kept)👀 human_reviewautolens_workspacenormal — flagged for review 2026-08-29

-feature — 39 - - - - - - -

COOLEST: export MGE lens light and pixelized sources as pixel grids✨ featureautolensmediumsupervisedmedium

-

A dedicated Documentation conductor in PyAutoBrain✨ featurepyautobrainmediumsupervisedmedium

-

Nightly run of one HowTo tutorial per chapter at real settings✨ featurepyautoheartmediumsupervisedmedium

-

Brain board follow-ups: what real mornings surface✨ featurepyautobrainsmallsupervisednormal

-

bump_colab_urls.sh: cover autolens_assistant Colab links✨ featurepyautohandssmallsafenormal

-

Can create a list of InversionMatrix objects for each dataset✨ featureautoarraymediumsupervisednormal

-

A joint unit-disk constraint (or reparameterisation) for ell_comps✨ featureautogalaxymediumsupervisednormal

-

Tune cluster-scale JOSS benchmarks toward their 5-minute targets✨ featureautolens_workspacemediumsafenormal

- -

batch slice — the decomposition pass for needs-slicing prompts✨ featurepyautobrainmediumsupervisednormal

- - -

EP analytic updates — implement the four planned work packages✨ featureautofitlargesupervisednormal

- -

Remote-MCP deployment tiers (2 + 3) for the results-inspector server✨ featureautofit_assistantlargehuman-requirednormal

-

Multi-plane time delays✨ featureautolenslargesupervisednormal

-

Adopt oversampled PSFs in the start-here dataset chain (option a)✨ featureautolens_workspacelargesupervisednormal

-

Restore lensing-of-lens in the multiple_sources workspace example✨ featureworkspaceslargesupervisednormal

-

Follow-up to rectangular_adapt_cdf.md (issue #322) and Path A✨ featureautoarraytoo-largesupervisednormal

-

PIEMass.potential_2d_from: implement the missing lensing potential✨ featureautogalaxytoo-largesupervisednormal

-

autolens_jax_joss benchmark repo + real-data start_here pairing✨ featureautolens_jax_josstoo-largesupervisednormal

-

Context: PyAutoLens issue #542 follow-up (Gap 1, deferred during the✨ featurejax_substructuretoo-largesupervisednormal

-

Context: PyAutoLens issue #542 follow-up (Gap 2, deferred during the✨ featurejax_substructuretoo-largesupervisednormal

-

dPIE: optional central-dispersion (sigma_0) parameterization✨ featureautogalaxysmallsupervisedlow

- -

Release board: local run_logs enrichment✨ featurepyautohandssmallsupervisedlow

- -

Animated logos for PyAutoGalaxy and PyAutoFit✨ featurepyautoscientistmediumsafelow

-

Deferred: make the *Power adapt classes the defaults (breaking)✨ featureautoarraylargehuman-requiredlow

- - - -

Simplify reading-queue token management✨ featurepyautomemory

-
-
-bug — 61 +bug — 54

Fix KNN neighbor search for a partial final point block🐛 bugautoarraymediumsupervisedhigh

@@ -624,7 +572,6 @@

Fits a slot (ready to run unattended, cheapest to revie - @@ -635,11 +582,9 @@

Fits a slot (ready to run unattended, cheapest to revie - - @@ -653,17 +598,14 @@

Fits a slot (ready to run unattended, cheapest to revie -

CI timing must compare equivalent executed job coverage🐛 bughealth_fixesmediumsupervisednormal

Heart Health rerun cannot publish after main advances🐛 bughealth_fixesmediumsupervisednormal

-

Resolve release-profile timeout scripts deliberately🐛 bughealth_fixestoo-largesupervisednormal

Priors & Messages cleanup — tracker🐛 bugpriorstoo-largesupervisednormal

-

Colab pins nautilus-sampler==1.0.4 while PyAutoFit declares 1.0.5🐛 bugautonervestrivialsupervisednormal

@@ -672,10 +614,46 @@

Fits a slot (ready to run unattended, cheapest to revie

Point-source JSON datasets record no resolution regime🐛 bugpyautolensmediumsupervisedlow

-

-research — 43 +feature — 34 + + + + + +

COOLEST: export MGE lens light and pixelized sources as pixel grids✨ featureautolensmediumsupervisedmedium

+

A dedicated Documentation conductor in PyAutoBrain✨ featurepyautobrainmediumsupervisedmedium

+

Nightly run of one HowTo tutorial per chapter at real settings✨ featurepyautoheartmediumsupervisedmedium

+

Brain board follow-ups: what real mornings surface✨ featurepyautobrainsmallsupervisednormal

+

bump_colab_urls.sh: cover autolens_assistant Colab links✨ featurepyautohandssmallsafenormal

+

Can create a list of InversionMatrix objects for each dataset✨ featureautoarraymediumsupervisednormal

+

Tune cluster-scale JOSS benchmarks toward their 5-minute targets✨ featureautolens_workspacemediumsafenormal

+ +

batch slice — the decomposition pass for needs-slicing prompts✨ featurepyautobrainmediumsupervisednormal

+ + +

EP analytic updates — implement the four planned work packages✨ featureautofitlargesupervisednormal

+ +

Remote-MCP deployment tiers (2 + 3) for the results-inspector server✨ featureautofit_assistantlargehuman-requirednormal

+

Multi-plane time delays✨ featureautolenslargesupervisednormal

+

Adopt oversampled PSFs in the start-here dataset chain (option a)✨ featureautolens_workspacelargesupervisednormal

+

Restore lensing-of-lens in the multiple_sources workspace example✨ featureworkspaceslargesupervisednormal

+

Follow-up to rectangular_adapt_cdf.md (issue #322) and Path A✨ featureautoarraytoo-largesupervisednormal

+

PIEMass.potential_2d_from: implement the missing lensing potential✨ featureautogalaxytoo-largesupervisednormal

+

Context: PyAutoLens issue #542 follow-up (Gap 1, deferred during the✨ featurejax_substructuretoo-largesupervisednormal

+

Context: PyAutoLens issue #542 follow-up (Gap 2, deferred during the✨ featurejax_substructuretoo-largesupervisednormal

+

dPIE: optional central-dispersion (sigma_0) parameterization✨ featureautogalaxysmallsupervisedlow

+ +

Release board: local run_logs enrichment✨ featurepyautohandssmallsupervisedlow

+ +

Animated logos for PyAutoGalaxy and PyAutoFit✨ featurepyautoscientistmediumsafelow

+

Deferred: make the *Power adapt classes the defaults (breaking)✨ featureautoarraylargehuman-requiredlow

+ +

Simplify reading-queue token management✨ featurepyautomemory

+
+
+research — 20

Deep research: Can we speed up Delaunay in PyAutoArray?🔬 researchautoarraytoo-largesupervisedhigh

@@ -696,29 +674,6 @@

Fits a slot (ready to run unattended, cheapest to revie

Should TransformedMessage carry its own support, rather than the prior?🔬 researchgraphical_epmediumhuman-requiredlow

- - - - - - -

**§1 Verdict**🔬 researchautofit

- - - - - - - - - - - - - - - -

docs — 24 @@ -748,10 +703,9 @@

Fits a slot (ready to run unattended, cheapest to revie

-maintenance — 17 +maintenance — 15

Reduce the organism's per-session and per-task token load by half🧹 maintenanceorgansmediumsupervisedhigh

CTI upkeep parity — bring PyAutoCTI and its satellites to the same…🧹 maintenanceautoctitoo-largehuman-requiredhigh

-

Keep caches off $HOME on HPC — phase 2 remainder: euclid pipeline…🧹 maintenanceworkspacessmallsupervisedmedium

autolens_workspace_developer: broad stale-API rot (56 symbols, no CI)🧹 maintenanceautolens_workspace_developermediumsupervisednormal

@@ -765,7 +719,6 @@

Fits a slot (ready to run unattended, cheapest to revie

Deferred Heart dashboard housekeeping after release recovery🧹 maintenancepyautoheartlargehuman-requiredlow

-

refactor — 13 @@ -842,12 +795,6 @@

Fits a slot (ready to run unattended, cheapest to revie 2026-11-02 -filed -Standard-size gradient cells record "point": "prior_medians" while… - - - -2026-11-02 issued Magnification maps 8d: wire into fit subplots and make them pretty @@ -864,7 +811,7 @@

Fits a slot (ready to run unattended, cheapest to revie Imaging sparse-operator path gives a very different log L from dense… - + 2026-11-02 issued Gradient-correctness sweep: triage and investigate every open… @@ -1093,17 +1040,23 @@

Fits a slot (ready to run unattended, cheapest to revie -2026-09-25 -filed -Keep caches off $HOME on HPC — phase 2 remainder: euclid pipeline… - - - 2026-09-24 filed euclid_dr1: run the positions gate over DR1 and submit the remodel set + +2026-09-23 +filed +multi_dataset/jax_likelihood/delaunay.py asserts the wrong likelihood… + + + +2026-09-18 +filed +autolens_workspace: __Model__ bullets whose profiles or parameter… + +

Pending release

2
diff --git a/dashboard.md b/dashboard.md index da024944d..7d67b1ab7 100644 --- a/dashboard.md +++ b/dashboard.md @@ -12,7 +12,7 @@ | [Epics](#epics) | 21 | | [In flight](#in-flight) | 8 | | [Planned](#planned) | 9 | -| [Backlog](#backlog) | 288 | +| [Backlog](#backlog) | 241 | | [Recent](#recent) | 50 | | [Pending release](#pending-release) | 2 | @@ -121,7 +121,7 @@ Use the start-dev skill. draft/research/autoarray/delaunay_research.md
-**Fits a slot** (ready to run unattended, cheapest to review first) — showing 12 of 88 +**Fits a slot** (ready to run unattended, cheapest to review first) — showing 12 of 80
📋 Guard every workspace script against untimed network downloads — autolens_workspace · small · safe · medium @@ -224,7 +224,7 @@ Use the start-dev skill. draft/docs/autolens_workspace/cluster_mass_parameteriza Long-running multi-phase programmes. Each epic's 📋 prompt has the assistant read its ledger, work out where it stands, and continue from the next logical point. Members are worked in order through the epic's ledger — continue the epic rather than starting one standalone. Full record in [`epics.md`](epics.md).
-CTI upkeep parity — release-train wiring and first modern autocti release, arcticpy modernisation (upstream 2.7 / wheels, DNA, docs), integration-test parity (smoke coverage, workspace_test rebuild, 3.12–3.14 matrix, docs build), autocti_profiling + Pulse cti row, figures/assistant/docs currency, hygiene — 6 queued prompt(s), in order +CTI upkeep parity — release-train wiring and first modern autocti release, arcticpy modernisation (upstream 2.7 / wheels, DNA, docs), integration-test parity (smoke coverage, workspace_test rebuild, 3.12–3.14 matrix, docs build), autocti_profiling + Pulse cti row, figures/assistant/docs currency, hygiene — 5 queued prompt(s), in order
📋 CTI upkeep parity — release-train wiring and first modern autocti release, arcticpy modernisation (upstream 2.7 / wheels, DNA, docs), integration-test parity (smoke coverage, workspace_test rebuild, 3.12–3.14 matrix, docs build), autocti_profiling + Pulse cti row, figures/assistant/docs currency, hygiene — ledger: `draft/maintenance/autocti/cti_upkeep_epic.md` — FILED 2026-11-04 — survey in draft/maintenance/autocti/cti_upkeep_epic_report.md; R1–R6 RULED 2026-11-04 (arcticpy fixed upstream… @@ -242,14 +242,6 @@ Use the start-dev skill. draft/bug/autocti_visualization/manifest_rendered_with_
-
📋 autocti_visualization render.yml fails on the released stack until PyAutoCTI releases — autocti_visualization · small · supervised · normal - -``` -Use the start-dev skill. draft/bug/autocti_visualization/render_yml_blocked_until_pyautocti_release.md -``` - -
-
📋 Rewrite PyAutoCTI docs/api — 55 of 89 autosummary entries are dead — autocti · medium · supervised · normal ``` @@ -285,7 +277,7 @@ Use the start-dev skill. draft/release/arcticpy/upstream_packaging_pr.md
-Likelihood lifecycle — optimal setups baked into PyAutoLens (setup="auto"), Pulse/Insight day zero, mirrored autolens_profiling / autolens_inference trees, and one repeatable profiling → validation → gradient → sampler sequence per likelihood — 9 queued prompt(s), in order +Likelihood lifecycle — optimal setups baked into PyAutoLens (setup="auto"), Pulse/Insight day zero, mirrored autolens_profiling / autolens_inference trees, and one repeatable profiling → validation → gradient → sampler sequence per likelihood — 7 queued prompt(s), in order
📋 Likelihood lifecycle — optimal setups baked into PyAutoLens (setup="auto"), Pulse/Insight day zero, mirrored autolens_profiling / autolens_inference trees, and one repeatable profiling → validation → gradient → sampler sequence per likelihood — ledger: `draft/research/autolens_profiling/likelihood_lifecycle_epic.md` — PHASE 0 COMPLETE 2026-10-24 — 0A PyAutoPulse#70; 0B autolens_profiling#444/#447/#448/#449/#450/#451 + PyAutoPulse#74 (lens at… @@ -351,26 +343,10 @@ Use the start-dev skill. draft/research/autolens_profiling/likelihood_lifecycle_
-
📋 Likelihood lifecycle epic — research report and phased plan — autolens_profiling · too-large · human-required · high - -``` -Use the start-dev skill. draft/research/autolens_profiling/likelihood_lifecycle_epic_report.md -``` - -
- -
📋 Likelihood lifecycle phase 3: designation proposals for the completed campaigns… — autolens_profiling · large · human-required · high - -``` -Use the start-dev skill. draft/research/autolens_profiling/likelihood_lifecycle_p3_designation_proposals.md -``` - -
-
-LensTwin — observation-anchored digital twins of fitted strong lenses: al.twins in PyAutoLens, mass-normalisation primitives in PyAutoGalaxy, used from ordinary Science/active projects, and the first stellar-plus-dark-matter identifiability experiment (ERC dark-matter cores vs cusps) — 3 queued prompt(s), in order +LensTwin — observation-anchored digital twins of fitted strong lenses: al.twins in PyAutoLens, mass-normalisation primitives in PyAutoGalaxy, used from ordinary Science/active projects, and the first stellar-plus-dark-matter identifiability experiment (ERC dark-matter cores vs cusps) — 2 queued prompt(s), in order
📋 LensTwin — observation-anchored digital twins of fitted strong lenses: al.twins in PyAutoLens, mass-normalisation primitives in PyAutoGalaxy, used from ordinary Science/active projects, and the first stellar-plus-dark-matter identifiability experiment (ERC dark-matter cores vs cusps) — ledger: `draft/feature/autolens/lenstwin_epic.md` — filed 2026-10-28 from the LensTwin brief; R1–R2 RULED 2026-10-28 (al.twins; observed noise map by default). PHASE 0 COMPLETE… @@ -396,14 +372,6 @@ Use the start-dev skill. draft/feature/autolens/lenstwin_epic.md
-
📋 LensTwin epic — research report, architecture and detailed phase bodies — autolens · too-large · human-required · high - -``` -Use the start-dev skill. draft/feature/autolens/lenstwin_epic_report.md -``` - -
-
@@ -428,7 +396,7 @@ Use the start-dev skill. draft/research/autofit/hpc_campaign_epic.md
-Results library — PyAutoFit infrastructure to index, complete, export, package and reconcile thousands of finished results (follow-up to hpc-campaign; Euclid DR1 is the pilot) — 2 queued prompt(s), in order +Results library — PyAutoFit infrastructure to index, complete, export, package and reconcile thousands of finished results (follow-up to hpc-campaign; Euclid DR1 is the pilot) — 1 queued prompt(s), in order
📋 Results library — PyAutoFit infrastructure to index, complete, export, package and reconcile thousands of finished results (follow-up to hpc-campaign; Euclid DR1 is the pilot) — ledger: `draft/feature/autofit/results_library_epic.md` — STARTED 2026-10-28 — concurrent with hpc-campaign; phase 0 shared, owned by results-library. Rulings F1–F12 recorded in the… @@ -446,14 +414,6 @@ Use the start-dev skill. draft/feature/autofit/results_library_epic.md
-
📋 Results library epic — lessons from building the Euclid DR1 catalogue — autofit · too-large · human-required · high - -``` -Use the start-dev skill. draft/feature/autofit/results_library_epic_report.md -``` - -
-
@@ -740,7 +700,7 @@ Continue the 'Linear-solver accuracy/tolerance programme — a standing autolens
-Cluster strong lensing — Source & Cluster arc — 15 queued prompt(s), in order +Cluster strong lensing — Source & Cluster arc — 14 queued prompt(s), in order
📋 Cluster strong lensing — Source & Cluster arc — ledger: `draft/feature/autolens/source_cluster_arc.md` — In progress — 1a–1d, phase 3a audit (profiling#364, workspace_test#341) and phase 3b field-preserving cap fix (Galaxy#646… @@ -766,14 +726,6 @@ Use the start-dev skill. draft/test/workspaces/mesh_magnification_correctness.md
-
📋 Magnification at a point: surface the existing API in source_science + point… — autolens · large · supervised · high - -``` -Use the start-dev skill. draft/feature/autolens/point_magnification_api.md -``` - -
-
📋 Magnification maps: image-plane contour maps, source-plane mesh maps, uncertainty maps — autolens · large · supervised · high ``` @@ -873,7 +825,7 @@ Use the start-dev skill. draft/research/autolens_inference/kernel_regularization
-Scientist adoption pilot — project resources, clear organ destinations and a growing independent Scientist — 7 queued prompt(s), in order +Scientist adoption pilot — project resources, clear organ destinations and a growing independent Scientist — 6 queued prompt(s), in order
📋 Scientist adoption pilot — project resources, clear organ destinations and a growing independent Scientist — ledger: `draft/feature/pyautoscientist/collaborator_led_pyautoscientist_adoption_pilot.md` — In progress — project cards and organ-linked resource routing merged and published (Scientist PRs #56 and #58); remaining members… @@ -923,14 +875,6 @@ Use the start-dev skill. draft/feature/pyautoscientist/scientist_collaborator_va
-
📋 Minimal independent Scientist starter — pyautoscientist · medium · supervised - -``` -Use the start-dev skill. draft/feature/pyautoscientist/scientist_minimal_starter.md -``` - -
-
📋 Progressive optional organ activation — pyautoscientist · medium · supervised ``` @@ -963,7 +907,7 @@ Use the start-dev skill. draft/feature/pyautobrain/autonomous_orchestrators_epic
-interferometer-likelihood-campaign — 6 queued prompt(s) — ⚠️ not in `epics.md` +interferometer-likelihood-campaign — 5 queued prompt(s) — ⚠️ not in `epics.md`
📋 RAL PyAuto venv: third-party packages below the library floors… — pyautoheart · easy · supervised · medium @@ -1005,14 +949,6 @@ Use the start-dev skill. draft/feature/autoarray/interferometer_direct_conv_pran
-
📋 Retune the interferometer numba gate 60 → 70 (in-situ crossover, autolens_profiling#332) — autoarray · small · supervised · low - -``` -Use the start-dev skill. draft/feature/autoarray/interferometer_numba_gate_retune_70.md -``` - -
-
@@ -1037,23 +973,7 @@ Use the start-dev skill. draft/feature/autofit/certified_solver_batched_guard_c2
-pyautoeyes-birth — 4 queued prompt(s) — ⚠️ not in `epics.md` - -
📋 autolens_visualization: multi-galaxy gallery — producer and dataset — pyautoeyes · medium · supervised · normal - -``` -Use the start-dev skill. draft/feature/pyautoeyes/multi_galaxy_gallery.md -``` - -
- -
📋 autolens_visualization: group and cluster galleries (point-source + extended) — pyautoeyes · large · supervised · normal - -``` -Use the start-dev skill. draft/feature/pyautoeyes/group_cluster_gallery.md -``` - -
+pyautoeyes-birth — 2 queued prompt(s) — ⚠️ not in `epics.md`
📋 Hands release.yml fires the visualization re-render dispatches — pyautohands · small · supervised · normal @@ -1235,7 +1155,7 @@ Use the start-dev skill. draft/docs/autolens_assistant/point_plots_yaml_keys.md ## Backlog -Lanes: any 278 · local-dev 8 +Lanes: any 233 · local-dev 6
@@ -1286,809 +1206,713 @@ regenerate the dashboard. If I do not sign it off, file the follow-up with
-feature — 39 +bug — 54 -
📋 Eyes cluster visualization group: render every cluster/point-source figure for PyAutoEyes — autolens_visualization · large · supervised · high +
📋 test_latent_euclid_variables_traces_under_jax_jit went red on main: total_source_flux differs by 6% between jax.jit… — euclid · small · supervised · high ``` -Use the start-dev skill. draft/feature/autolens_visualization/eyes_cluster_visualization_group_render_every_cl.md +Use the start-dev skill. draft/bug/euclid/latent_total_source_flux_jax_vs_numpy_regression.md ```
-
📋 Inversion.source_clumps_from needs a robust scale — thresholding against the raw maximum finds… — autoarray · small · supervised · medium +
📋 SED chain waveband fit can spin forever in Nautilus exploration… — euclid · small · supervised · high ``` -Use the start-dev skill. draft/feature/autoarray/source_clumps_robust_scale.md +Use the start-dev skill. draft/bug/euclid/sed_chain_waveband_fit_can_spin_forever.md ```
-
📋 autofit_assistant: a skill that owns loading the user's data and its selection… — autofit_assistant · small · safe · medium +
📋 Fix KNN neighbor search for a partial final point block — autoarray · medium · supervised · high ``` -Use the start-dev skill. draft/feature/autofit_assistant/data_loading_and_selection_cuts_skill.md +Use the start-dev skill. draft/bug/autoarray/fix_knn_neighbor_search_for_a_partial.md ```
-
📋 Filed: 2026-11-05 (phase 2 of autolens_profiling#519; Pulse task PyAutoPulse/tasks/numba_num_threads_pin_and_delaunay_nn_remeasure.md steps 2-4) — autolens_profiling · small · medium +
📋 Sparse (w-tilde) inversion fits the unsubtracted image when a regular light profile… — autoarray · medium · supervised · high ``` -Use the start-dev skill. draft/feature/autolens_profiling/delaunay_nn_numba_optimal_remeasure_after_677.md +Use the start-dev skill. draft/bug/autoarray/sparse_inversion_ignores_profile_subtracted_image.md ```
-
📋 Which other searches need prior-support handling — coverage audit after Prodigy — autofit · medium · safe · medium +
📋 Fix Sibson interpolation at internal edges — autoarray · large · supervised · high ``` -Use the start-dev skill. draft/feature/autofit/prior_exit_sampler_coverage.md +Use the start-dev skill. draft/bug/autoarray/fix_sibson_interpolation_at_internal_edges.md ```
-
📋 Give PyAutoFit searches a seed — today no search can be made… — autofit · medium · safe · medium +
📋 Investigate Euclid Einstein-radius latent uncertainty collapse — autofit · too-large · supervised · high ``` -Use the start-dev skill. draft/feature/autofit/search_seed_reproducibility.md +Use the start-dev skill. draft/bug/autofit/investigate_euclid_einstein_radius_latent_uncert.md ```
-
📋 COOLEST: export MGE lens light and pixelized sources as pixel grids — autolens · medium · supervised · medium +
📋 Fix release result/sample parameter-path regressions — health_fixes · too-large · supervised · high ``` -Use the start-dev skill. draft/feature/autolens/coolest_pixel_grid_export.md +Use the start-dev skill. draft/bug/health_fixes/samples_parameter_paths.md ```
-
📋 A dedicated Documentation conductor in PyAutoBrain — pyautobrain · medium · supervised · medium +
📋 Filed: 2026-11-05 (found by the autolens_profiling#519 worker-route witness) — autoarray · small · medium ``` -Use the start-dev skill. draft/feature/pyautobrain/docs_conductor.md +Use the start-dev skill. draft/bug/autoarray/sibson_serial_kernel_loses_allocation_hoisting.md ```
-
📋 Nightly run of one HowTo tutorial per chapter at real settings — pyautoheart · medium · supervised · medium +
📋 Interferometer galaxy_image_dict drops a mixed galaxy's ordinary light (dict merge overwrites) — autogalaxy · small · supervised · medium ``` -Use the start-dev skill. draft/feature/pyautoheart/howto_real_settings_nightly.md +Use the start-dev skill. draft/bug/autogalaxy/galaxy_image_dict_mixed_galaxy_overwrites_ordinary_light.md ```
-
📋 Brain board follow-ups: what real mornings surface — pyautobrain · small · supervised · normal +
📋 Reverse-mode jax.grad of MGE deflections returns NaN when the profile centre lands… — autogalaxy · small · supervised · medium ``` -Use the start-dev skill. draft/feature/pyautobrain/brain_board_follow_ups.md +Use the start-dev skill. draft/bug/autogalaxy/mge_deflections_reverse_mode_nan_at_grid_centre.md ```
-
📋 bump_colab_urls.sh: cover autolens_assistant Colab links — pyautohands · small · safe · normal +
📋 imaging/features/pixelization/delaunay.py sits on the 300 s smoke cap… — autolens_workspace · small · safe · medium ``` -Use the start-dev skill. draft/feature/pyautohands/bump_colab_urls_autolens_assistant.md +Use the start-dev skill. draft/bug/autolens_workspace/delaunay_smoke_300s_cap.md ```
-
📋 Can create a list of InversionMatrix objects for each dataset — autoarray · medium · supervised · normal +
📋 subhalo/sensitivity/slam_source_pixelized.py fails on main: al.MapperValued no longer exists — autolens_workspace · small · supervised · medium ``` -Use the start-dev skill. draft/feature/autoarray/multiwavelength_inversion.md +Use the start-dev skill. draft/bug/autolens_workspace/sensitivity_slam_source_pixelized_mappervalued.md ```
-
📋 A joint unit-disk constraint (or reparameterisation) for ell_comps — autogalaxy · medium · supervised · normal +
📋 vis_lp passes batch_size=50 to af.Nautilus, which has no such parameter — euclid · small · supervised · medium ``` -Use the start-dev skill. draft/feature/autogalaxy/ell_comps_joint_disk_constraint.md +Use the start-dev skill. draft/bug/euclid/vis_lp_batch_size_kwarg_silently_ignored.md ```
-
📋 Tune cluster-scale JOSS benchmarks toward their 5-minute targets — autolens_workspace · medium · safe · normal +
📋 Profiling conductor compile drift compares one point against one point — pyautobrain · small · supervised · medium ``` -Use the start-dev skill. draft/feature/autolens_workspace/joss_cluster_benchmark_tuning.md +Use the start-dev skill. draft/bug/pyautobrain/profiling_compile_drift_point_vs_point.md ```
-
📋 Upstream the DR1 final-catalogue tooling to the pipeline, with a vis_lp-only appendix… — euclid · medium · supervised · normal +
📋 Adaptive Delaunay mesh places two mesh pixels 0.001" apart — a degenerate… — autoarray · medium · supervised · medium ``` -Use the start-dev skill. draft/feature/euclid/upstream_dr1_final_catalogue_tooling.md +Use the start-dev skill. draft/bug/autoarray/adaptive_mesh_degenerate_pixel_pair.md ```
-
📋 batch slice — the decomposition pass for needs-slicing prompts — pyautobrain · medium · supervised · normal +
📋 Interferometer log_evidence fails (LinAlgError / NaN) at large regularization coefficients the jitted… — autoarray · medium · supervised · medium ``` -Use the start-dev skill. draft/feature/pyautobrain/batch_slice.md +Use the start-dev skill. draft/bug/autoarray/interferometer_log_evidence_large_regularization_coefficient_cholesky.md ```
-
📋 The imaging features/advanced/los_halos example needs improving and padding out before — workspaces · medium · safe · normal +
📋 Sparse interferometer terms: NUFFT ignores the mask origin and provenance cannot see… — autoarray · medium · supervised · medium ``` -Use the start-dev skill. draft/feature/workspaces/group_los_halos.md +Use the start-dev skill. draft/bug/autoarray/sparse_terms_nufft_origin_and_mask_compatibility.md ```
-
📋 The imaging features/advanced/subhalo/sensitivity example needs improving and padding out before — workspaces · medium · safe · normal +
📋 Imaging sparse-operator path gives a very different log L from dense… — autoarray · medium · supervised · medium ``` -Use the start-dev skill. draft/feature/workspaces/group_subhalo_sensitivity.md +Use the start-dev skill. draft/bug/autoarray/sparse_vs_dense_log_likelihood_mismatch_nonlinear_lens_light.md ```
-
📋 EP analytic updates — implement the four planned work packages — autofit · large · supervised · normal +
📋 Cluster likelihood scripts: image-plane manual check disagrees with the library; point_0 truth… — autolens_workspace · medium · supervised · medium ``` -Use the start-dev skill. draft/feature/autofit/ep_analytic_updates.md +Use the start-dev skill. draft/bug/autolens_workspace/cluster_likelihood_scripts_preexisting_mismatches.md ```
-
📋 Skip the likelihood for assertion-violating samples on the JAX path — autofit · large · supervised · normal +
📋 imaging/start_here: 26-minute XLA compile of the 48-start Prodigy multi-start on CPU — autolens_workspace · medium · supervised · medium ``` -Use the start-dev skill. draft/feature/autofit/skip_the_likelihood_for_assertion_violating_samp.md +Use the start-dev skill. draft/bug/autolens_workspace/start_here_multistart_compile_time.md ```
-
📋 Remote-MCP deployment tiers (2 + 3) for the results-inspector server — autofit_assistant · large · human-required · normal +
📋 Visualization warm-up swallowed for ellipse and point-source analyses — autofit · large · supervised · medium ``` -Use the start-dev skill. draft/feature/autofit_assistant/remote_mcp_deployment_tiers.md +Use the start-dev skill. draft/bug/autofit/visualization_warmup_swallowed_exception.md ```
-
📋 Multi-plane time delays — autolens · large · supervised · normal +
📋 SimulatorImaging draws Poisson noise before checking add_poisson_noise_to_data — autoarray · low · safe · medium ``` -Use the start-dev skill. draft/feature/autolens/multi_plane_time_delays.md +Use the start-dev skill. draft/bug/autoarray/simulator_imaging_poisson_drawn_before_flag_check.md ```
-
📋 Adopt oversampled PSFs in the start-here dataset chain (option a) — autolens_workspace · large · supervised · normal +
📋 rectangular.py parity contract: absolute-nats bound, and import autogalaxy before jax — workspaces · easy · supervised · medium ``` -Use the start-dev skill. draft/feature/autolens_workspace/oversampled_psf_dataset_adoption.md +Use the start-dev skill. draft/bug/workspaces/rectangular_parity_absolute_bound_and_x64_import_order.md ```
-
📋 Restore lensing-of-lens in the multiple_sources workspace example — workspaces · large · supervised · normal +
📋 Building a JAX Fitness then calling register_tracer_classes raises "Duplicate custom PyTreeDef type… — autoarray · small · supervised · normal ``` -Use the start-dev skill. draft/feature/workspaces/restore_multiple_sources_lensing_of_lens.md +Use the start-dev skill. draft/bug/autoarray/galaxy_duplicate_pytree_registration_after_jax_fitness.md ```
-
📋 Follow-up to rectangular_adapt_cdf.md (issue #322) and Path A — autoarray · too-large · supervised · normal +
📋 DatasetModel with a free grid_offset cannot round-trip autofit.jax.register_model — autofit · small · safe · normal ``` -Use the start-dev skill. draft/feature/autoarray/rectangular_multi_submesh.md +Use the start-dev skill. draft/bug/autofit/dataset_model_free_grid_offset_pytree_roundtrip.md ```
-
📋 PIEMass.potential_2d_from: implement the missing lensing potential — autogalaxy · too-large · supervised · normal +
📋 autofit: Samples.with_paths / without_paths break on factor-graph fits with shared priors — autofit · small · supervised · normal ``` -Use the start-dev skill. draft/feature/autogalaxy/piemass_potential.md +Use the start-dev skill. draft/bug/autofit/samples_with_paths_shared_prior_factor_graph.md ```
-
📋 autolens_jax_joss benchmark repo + real-data start_here pairing — autolens_jax_joss · too-large · supervised · normal +
📋 Stale enable_pytrees register_model advice in NUTS and SMC errors and searches docs — autofit · small · safe · normal ``` -Use the start-dev skill. draft/feature/autolens_jax_joss/autolens_jax_joss_benchmark_repo.md +Use the start-dev skill. draft/bug/autofit/stale_enable_pytrees_register_model_advice_in.md ```
-
📋 Context: PyAutoLens issue #542 follow-up (Gap 1, deferred during the — jax_substructure · too-large · supervised · normal +
📋 PlotterEllipse.fit_ellipse writes every variant to ellipse_fit.png, so only the last survives — autogalaxy · small · normal ``` -Use the start-dev skill. draft/feature/jax_substructure/5_prng_key_vmap_noise.md +Use the start-dev skill. draft/bug/autogalaxy/ellipse_plotter_fit_ellipse_overwrites.md ```
-
📋 Context: PyAutoLens issue #542 follow-up (Gap 2, deferred during the — jax_substructure · too-large · supervised · normal +
📋 Move the positions_threshold test fixture off the symmetry axis — autolens · small · safe · normal ``` -Use the start-dev skill. draft/feature/jax_substructure/6_deflection_equivalence_test.md +Use the start-dev skill. draft/bug/autolens/positions_threshold_fixture_off_axis.md ```
-
📋 dPIE: optional central-dispersion (sigma_0) parameterization — autogalaxy · small · supervised · low +
📋 SLaM simultaneous subhalo grid search fits last band only — autolens_workspace · small · safe · normal ``` -Use the start-dev skill. draft/feature/autogalaxy/dpie_sigma0_parameterization.md +Use the start-dev skill. draft/bug/autolens_workspace/slam_simultaneous_subhalo_grid_search_fits_last.md ```
-
📋 PyAutoLens mirror of the interferometer primary-beam persistence (docstring + round-trip test) — autolens · small · safe · low +
📋 JAX_ENABLE_X64=False is overridden to True, so the fp32 inference leg runs fp64… — autonerves · small · supervised · normal ``` -Use the start-dev skill. draft/feature/autolens/interferometer_primary_beam_persistence_mirror.md +Use the start-dev skill. draft/bug/autonerves/jax_enable_x64_env_ignored_and_fp32_leg_runs_fp64.md ```
-
📋 Release board: local run_logs enrichment — pyautohands · small · supervised · low +
📋 Convolver "No blurring_image provided" warning in canonical workspace scripts — workspaces · small · safe · normal ``` -Use the start-dev skill. draft/feature/pyautohands/release_board_run_logs_enrichment.md +Use the start-dev skill. draft/bug/workspaces/convolver_blurring_image_warning.md ```
-
📋 Gallery runner: add visualization_upper + decide the modeling_visualization_jit tier — workspaces · small · safe · low +
📋 A non-uniform over_sample_size costs several times more JAX compile than a uniform… — autoarray · medium · supervised · normal ``` -Use the start-dev skill. draft/feature/workspaces/gallery_runner_missing_tiers.md +Use the start-dev skill. draft/bug/autoarray/non_uniform_over_sample_jax_compile_cost.md ```
-
📋 Animated logos for PyAutoGalaxy and PyAutoFit — pyautoscientist · medium · safe · low +
📋 vmap(jit) likelihood recompiles once per distinct Nautilus batch length — autofit · medium · supervised · normal ``` -Use the start-dev skill. draft/feature/pyautoscientist/animated_logos_for_pyautogalaxy_and_pyautofit.md +Use the start-dev skill. draft/bug/autofit/vmap_jit_recompiles_per_nautilus_batch_length.md ```
-
📋 Deferred: make the *Power adapt classes the defaults (breaking) — autoarray · large · human-required · low +
📋 LensCalc tangential caustic on a masked grid differs ~27 % in ellipticity… — autogalaxy · medium · supervised · normal ``` -Use the start-dev skill. draft/feature/autoarray/adapt_linear_default_flip.md +Use the start-dev skill. draft/bug/autogalaxy/lenscalc_masked_grid_caustic_differs_from_unmasked.md ```
-
📋 LensTwin survey 01 — PyAutoLens and PyAutoGalaxy (read-only, 2026-10-28) — autolens +
📋 JIT cache not hit in modeling_visualization delaunay/rectangular scripts — autolens · medium · safe · normal ``` -Use the start-dev skill. draft/feature/autolens/lenstwin_epic_surveys/01_pyautolens_pyautogalaxy.md +Use the start-dev skill. draft/bug/autolens/jit_cache_not_hit_modeling_visualization.md ```
-
📋 LensTwin survey 02 — autolens_assistant and autolens_workspace (read-only, 2026-10-28) — autolens +
📋 Profile multi_galaxy/start_here.py's release cost and retire its 3600s override — autolens_workspace · medium · supervised · normal ``` -Use the start-dev skill. draft/feature/autolens/lenstwin_epic_surveys/02_assistant_workspace.md +Use the start-dev skill. draft/bug/autolens_workspace/multi_galaxy_start_here_release_cost.md ```
-
📋 Cortex output summaries — phase 2 — cortex +
📋 multi_dataset/jax_likelihood/delaunay.py asserts the wrong likelihood on main (−72070 vs 1995) — autolens_workspace_test · medium · supervised · normal ``` -Use the start-dev skill. draft/feature/cortex/output_summary.md +Use the start-dev skill. draft/bug/autolens_workspace_test/multi_dataset_jax_likelihood_delaunay_wrong_likelihood.md ```
-
📋 Simplify reading-queue token management — pyautomemory +
📋 CI timing must compare equivalent executed job coverage — health_fixes · medium · supervised · normal ``` -Use the start-dev skill. draft/feature/pyautomemory/reading-queue-token-management.md +Use the start-dev skill. draft/bug/health_fixes/ci_timing_execution_coverage.md ```
-
- -
-bug — 61 - -
📋 test_latent_euclid_variables_traces_under_jax_jit went red on main: total_source_flux differs by 6% between jax.jit… — euclid · small · supervised · high +
📋 Heart Health rerun cannot publish after main advances — health_fixes · medium · supervised · normal ``` -Use the start-dev skill. draft/bug/euclid/latent_total_source_flux_jax_vs_numpy_regression.md +Use the start-dev skill. draft/bug/health_fixes/heart_health_rerun_stale_push.md ```
-
📋 SED chain waveband fit can spin forever in Nautilus exploration… — euclid · small · supervised · high +
📋 @PyAutoFit TransformedMessage.logpdf/pdf omit the transform Jacobian — priors · medium · supervised · normal ``` -Use the start-dev skill. draft/bug/euclid/sed_chain_waveband_fit_can_spin_forever.md +Use the start-dev skill. draft/bug/priors/15_transformed_message_logpdf_jacobian.md ```
-
📋 Fix KNN neighbor search for a partial final point block — autoarray · medium · supervised · high +
📋 Resolve release-profile timeout scripts deliberately — health_fixes · too-large · supervised · normal ``` -Use the start-dev skill. draft/bug/autoarray/fix_knn_neighbor_search_for_a_partial.md +Use the start-dev skill. draft/bug/health_fixes/release_timeout_policy.md ```
-
📋 Sparse (w-tilde) inversion fits the unsubtracted image when a regular light profile… — autoarray · medium · supervised · high +
📋 @PyAutoFit Refactor: each density should live in one place, not three — priors · too-large · supervised · normal ``` -Use the start-dev skill. draft/bug/autoarray/sparse_inversion_ignores_profile_subtracted_image.md +Use the start-dev skill. draft/bug/priors/12_single_source_density_refactor.md ```
-
📋 Fix Sibson interpolation at internal edges — autoarray · large · supervised · high +
📋 @PyAutoFit Refactor: collapse the Prior / Message two-layer hierarchy — priors · too-large · supervised · normal ``` -Use the start-dev skill. draft/bug/autoarray/fix_sibson_interpolation_at_internal_edges.md +Use the start-dev skill. draft/bug/priors/13_collapse_prior_and_message.md ```
-
📋 Investigate Euclid Einstein-radius latent uncertainty collapse — autofit · too-large · supervised · high +
📋 @PyAutoFit Refactor: replace hand-rolled AbstractDensityTransform with tfp.bijectors / numpyro.distributions.transforms — priors · too-large · supervised · normal ``` -Use the start-dev skill. draft/bug/autofit/investigate_euclid_einstein_radius_latent_uncert.md +Use the start-dev skill. draft/bug/priors/14_replace_transform_stack_with_bijectors.md ```
-
📋 Fix release result/sample parameter-path regressions — health_fixes · too-large · supervised · high +
📋 Priors & Messages cleanup — tracker — priors · too-large · supervised · normal ``` -Use the start-dev skill. draft/bug/health_fixes/samples_parameter_paths.md +Use the start-dev skill. draft/bug/priors/z_features.md ```
-
📋 Filed: 2026-11-05 (found by the autolens_profiling#519 worker-route witness) — autoarray · small · medium +
📋 sub_slim_indexes_for_pix_index appends -1 row padding to the last pixel's list — autoarray · small · supervised · low ``` -Use the start-dev skill. draft/bug/autoarray/sibson_serial_kernel_loses_allocation_hoisting.md +Use the start-dev skill. draft/bug/autoarray/sub_slim_indexes_for_pix_index_padding.md ```
-
📋 Interferometer galaxy_image_dict drops a mixed galaxy's ordinary light (dict merge overwrites) — autogalaxy · small · supervised · medium +
📋 Aggregator reload of an in-memory sparse-operator interferometer fit silently falls back… — autogalaxy · small · supervised · low ``` -Use the start-dev skill. draft/bug/autogalaxy/galaxy_image_dict_mixed_galaxy_overwrites_ordinary_light.md +Use the start-dev skill. draft/bug/autogalaxy/aggregator_reload_drops_sparse_operator.md ```
-
📋 Reverse-mode jax.grad of MGE deflections returns NaN when the profile centre lands… — autogalaxy · small · supervised · medium +
📋 Database-path searches cannot reload dataset.fits (written to disk, never registered via save_fits) — autogalaxy · small · supervised · low ``` -Use the start-dev skill. draft/bug/autogalaxy/mge_deflections_reverse_mode_nan_at_grid_centre.md +Use the start-dev skill. draft/bug/autogalaxy/database_paths_dataset_fits_not_registered.md ```
-
📋 imaging/features/pixelization/delaunay.py sits on the 300 s smoke cap… — autolens_workspace · small · safe · medium +
📋 @autolens_profiling stale auto-simulated dataset/cluster/simple is never regenerated — autolens_profiling · small · supervised · low ``` -Use the start-dev skill. draft/bug/autolens_workspace/delaunay_smoke_300s_cap.md +Use the start-dev skill. draft/bug/autolens_profiling/stale_auto_simulated_cluster_dataset.md ```
-
📋 subhalo/sensitivity/slam_source_pixelized.py fails on main: al.MapperValued no longer exists — autolens_workspace · small · supervised · medium +
📋 The reconstruction noise map is not the truncated posterior the NNLS solve… — autoarray · medium · human-required · low ``` -Use the start-dev skill. draft/bug/autolens_workspace/sensitivity_slam_source_pixelized_mappervalued.md -``` - -
- -
📋 Bundle stages 1/5/6 read OUTPUT_DIR, but the SED chain writes sersic_lens_model… — euclid · small · supervised · medium - -``` -Use the start-dev skill. draft/bug/euclid/bundle_sersic_products_read_output_dir_not_sed_output_dir.md -``` - -
- -
📋 vis_lp passes batch_size=50 to af.Nautilus, which has no such parameter — euclid · small · supervised · medium - -``` -Use the start-dev skill. draft/bug/euclid/vis_lp_batch_size_kwarg_silently_ignored.md -``` - -
- -
📋 Profiling conductor compile drift compares one point against one point — pyautobrain · small · supervised · medium - -``` -Use the start-dev skill. draft/bug/pyautobrain/profiling_compile_drift_point_vs_point.md -``` - -
- -
📋 Adaptive Delaunay mesh places two mesh pixels 0.001" apart — a degenerate… — autoarray · medium · supervised · medium - -``` -Use the start-dev skill. draft/bug/autoarray/adaptive_mesh_degenerate_pixel_pair.md -``` - -
- -
📋 Interferometer log_evidence fails (LinAlgError / NaN) at large regularization coefficients the jitted… — autoarray · medium · supervised · medium - -``` -Use the start-dev skill. draft/bug/autoarray/interferometer_log_evidence_large_regularization_coefficient_cholesky.md -``` - -
- -
📋 Sparse interferometer terms: NUFFT ignores the mask origin and provenance cannot see… — autoarray · medium · supervised · medium - -``` -Use the start-dev skill. draft/bug/autoarray/sparse_terms_nufft_origin_and_mask_compatibility.md -``` - -
- -
📋 Imaging sparse-operator path gives a very different log L from dense… — autoarray · medium · supervised · medium - -``` -Use the start-dev skill. draft/bug/autoarray/sparse_vs_dense_log_likelihood_mismatch_nonlinear_lens_light.md -``` - -
- -
📋 Cluster likelihood scripts: image-plane manual check disagrees with the library; point_0 truth… — autolens_workspace · medium · supervised · medium - -``` -Use the start-dev skill. draft/bug/autolens_workspace/cluster_likelihood_scripts_preexisting_mismatches.md -``` - -
- -
📋 imaging/start_here: 26-minute XLA compile of the 48-start Prodigy multi-start on CPU — autolens_workspace · medium · supervised · medium - -``` -Use the start-dev skill. draft/bug/autolens_workspace/start_here_multistart_compile_time.md -``` - -
- -
📋 Visualization warm-up swallowed for ellipse and point-source analyses — autofit · large · supervised · medium - -``` -Use the start-dev skill. draft/bug/autofit/visualization_warmup_swallowed_exception.md +Use the start-dev skill. draft/bug/autoarray/reconstruction_noise_map_truncated_posterior.md ```
-
📋 SimulatorImaging draws Poisson noise before checking add_poisson_noise_to_data — autoarray · low · safe · medium +
📋 Point-source JSON datasets record no resolution regime — pyautolens · medium · supervised · low ``` -Use the start-dev skill. draft/bug/autoarray/simulator_imaging_poisson_drawn_before_flag_check.md +Use the start-dev skill. draft/bug/pyautolens/point_source_json_datasets_record_no_regime.md ```
-
📋 Standard-size gradient cells record "point": "prior_medians" while evaluating at iid draw 0 — autolens_profiling · easy · supervised · medium +
📋 Same-class q-clamp and bare-sqrt ellipticity gradient sites (follow-up to PyAutoGalaxy#631) — autogalaxy ``` -Use the start-dev skill. draft/bug/autolens_profiling/gradient_json_point_label_standard_cells.md +Use the start-dev skill. draft/bug/autogalaxy/q_clamp_and_bare_sqrt_ellipticity_grad_sweep.md ```
-
📋 rectangular.py parity contract: absolute-nats bound, and import autogalaxy before jax — workspaces · easy · supervised · medium +
📋 autolens_workspace point_source/plot.py crashes: residual_map (4,2) vs (5,2) broadcast; the model solves 5… — autolens · human-required ``` -Use the start-dev skill. draft/bug/workspaces/rectangular_parity_absolute_bound_and_x64_import_order.md +Use the start-dev skill. draft/bug/autolens/point_source_plot_script_residual_shape_mismatch.md ```
-
📋 Building a JAX Fitness then calling register_tracer_classes raises "Duplicate custom PyTreeDef type… — autoarray · small · supervised · normal - -``` -Use the start-dev skill. draft/bug/autoarray/galaxy_duplicate_pytree_registration_after_jax_fitness.md -``` -
-
📋 DatasetModel with a free grid_offset cannot round-trip autofit.jax.register_model — autofit · small · safe · normal - -``` -Use the start-dev skill. draft/bug/autofit/dataset_model_free_grid_offset_pytree_roundtrip.md -``` - -
+
+feature — 34 -
📋 Nautilus as an EP default_optimiser crashes on PriorFactors (reads analysis._use_jax unguarded) — autofit · small · safe · normal +
📋 Eyes cluster visualization group: render every cluster/point-source figure for PyAutoEyes — autolens_visualization · large · supervised · high ``` -Use the start-dev skill. draft/bug/autofit/nautilus_ep_default_optimiser_reads_use_jax_unguarded.md +Use the start-dev skill. draft/feature/autolens_visualization/eyes_cluster_visualization_group_render_every_cl.md ```
-
📋 autofit: Samples.with_paths / without_paths break on factor-graph fits with shared priors — autofit · small · supervised · normal +
📋 Inversion.source_clumps_from needs a robust scale — thresholding against the raw maximum finds… — autoarray · small · supervised · medium ``` -Use the start-dev skill. draft/bug/autofit/samples_with_paths_shared_prior_factor_graph.md +Use the start-dev skill. draft/feature/autoarray/source_clumps_robust_scale.md ```
-
📋 Stale enable_pytrees register_model advice in NUTS and SMC errors and searches docs — autofit · small · safe · normal +
📋 autofit_assistant: a skill that owns loading the user's data and its selection… — autofit_assistant · small · safe · medium ``` -Use the start-dev skill. draft/bug/autofit/stale_enable_pytrees_register_model_advice_in.md +Use the start-dev skill. draft/feature/autofit_assistant/data_loading_and_selection_cuts_skill.md ```
-
📋 PlotterEllipse.fit_ellipse writes every variant to ellipse_fit.png, so only the last survives — autogalaxy · small · normal +
📋 Filed: 2026-11-05 (phase 2 of autolens_profiling#519; Pulse task PyAutoPulse/tasks/numba_num_threads_pin_and_delaunay_nn_remeasure.md steps 2-4) — autolens_profiling · small · medium ``` -Use the start-dev skill. draft/bug/autogalaxy/ellipse_plotter_fit_ellipse_overwrites.md +Use the start-dev skill. draft/feature/autolens_profiling/delaunay_nn_numba_optimal_remeasure_after_677.md ```
-
📋 Move the positions_threshold test fixture off the symmetry axis — autolens · small · safe · normal +
📋 Which other searches need prior-support handling — coverage audit after Prodigy — autofit · medium · safe · medium ``` -Use the start-dev skill. draft/bug/autolens/positions_threshold_fixture_off_axis.md +Use the start-dev skill. draft/feature/autofit/prior_exit_sampler_coverage.md ```
-
📋 SLaM simultaneous subhalo grid search fits last band only — autolens_workspace · small · safe · normal +
📋 COOLEST: export MGE lens light and pixelized sources as pixel grids — autolens · medium · supervised · medium ``` -Use the start-dev skill. draft/bug/autolens_workspace/slam_simultaneous_subhalo_grid_search_fits_last.md +Use the start-dev skill. draft/feature/autolens/coolest_pixel_grid_export.md ```
-
📋 JAX_ENABLE_X64=False is overridden to True, so the fp32 inference leg runs fp64… — autonerves · small · supervised · normal +
📋 A dedicated Documentation conductor in PyAutoBrain — pyautobrain · medium · supervised · medium ``` -Use the start-dev skill. draft/bug/autonerves/jax_enable_x64_env_ignored_and_fp32_leg_runs_fp64.md +Use the start-dev skill. draft/feature/pyautobrain/docs_conductor.md ```
-
📋 Convolver "No blurring_image provided" warning in canonical workspace scripts — workspaces · small · safe · normal +
📋 Nightly run of one HowTo tutorial per chapter at real settings — pyautoheart · medium · supervised · medium ``` -Use the start-dev skill. draft/bug/workspaces/convolver_blurring_image_warning.md +Use the start-dev skill. draft/feature/pyautoheart/howto_real_settings_nightly.md ```
-
📋 A non-uniform over_sample_size costs several times more JAX compile than a uniform… — autoarray · medium · supervised · normal +
📋 Brain board follow-ups: what real mornings surface — pyautobrain · small · supervised · normal ``` -Use the start-dev skill. draft/bug/autoarray/non_uniform_over_sample_jax_compile_cost.md +Use the start-dev skill. draft/feature/pyautobrain/brain_board_follow_ups.md ```
-
📋 vmap(jit) likelihood recompiles once per distinct Nautilus batch length — autofit · medium · supervised · normal +
📋 bump_colab_urls.sh: cover autolens_assistant Colab links — pyautohands · small · safe · normal ``` -Use the start-dev skill. draft/bug/autofit/vmap_jit_recompiles_per_nautilus_batch_length.md +Use the start-dev skill. draft/feature/pyautohands/bump_colab_urls_autolens_assistant.md ```
-
📋 LensCalc tangential caustic on a masked grid differs ~27 % in ellipticity… — autogalaxy · medium · supervised · normal +
📋 Can create a list of InversionMatrix objects for each dataset — autoarray · medium · supervised · normal ``` -Use the start-dev skill. draft/bug/autogalaxy/lenscalc_masked_grid_caustic_differs_from_unmasked.md +Use the start-dev skill. draft/feature/autoarray/multiwavelength_inversion.md ```
-
📋 JIT cache not hit in modeling_visualization delaunay/rectangular scripts — autolens · medium · safe · normal +
📋 Tune cluster-scale JOSS benchmarks toward their 5-minute targets — autolens_workspace · medium · safe · normal ``` -Use the start-dev skill. draft/bug/autolens/jit_cache_not_hit_modeling_visualization.md +Use the start-dev skill. draft/feature/autolens_workspace/joss_cluster_benchmark_tuning.md ```
-
📋 Profile multi_galaxy/start_here.py's release cost and retire its 3600s override — autolens_workspace · medium · supervised · normal +
📋 Upstream the DR1 final-catalogue tooling to the pipeline, with a vis_lp-only appendix… — euclid · medium · supervised · normal ``` -Use the start-dev skill. draft/bug/autolens_workspace/multi_galaxy_start_here_release_cost.md +Use the start-dev skill. draft/feature/euclid/upstream_dr1_final_catalogue_tooling.md ```
-
📋 multi_dataset/jax_likelihood/delaunay.py asserts the wrong likelihood on main (−72070 vs 1995) — autolens_workspace_test · medium · supervised · normal +
📋 batch slice — the decomposition pass for needs-slicing prompts — pyautobrain · medium · supervised · normal ``` -Use the start-dev skill. draft/bug/autolens_workspace_test/multi_dataset_jax_likelihood_delaunay_wrong_likelihood.md +Use the start-dev skill. draft/feature/pyautobrain/batch_slice.md ```
-
📋 PyAutoNerves emits a false "workspace is stale, git pull" warning… — autonerves · medium · supervised · normal +
📋 The imaging features/advanced/los_halos example needs improving and padding out before — workspaces · medium · safe · normal ``` -Use the start-dev skill. draft/bug/autonerves/pyautonerves_emits_a_false_workspace_is_stale.md +Use the start-dev skill. draft/feature/workspaces/group_los_halos.md ```
-
📋 CI timing must compare equivalent executed job coverage — health_fixes · medium · supervised · normal +
📋 The imaging features/advanced/subhalo/sensitivity example needs improving and padding out before — workspaces · medium · safe · normal ``` -Use the start-dev skill. draft/bug/health_fixes/ci_timing_execution_coverage.md +Use the start-dev skill. draft/feature/workspaces/group_subhalo_sensitivity.md ```
-
📋 Heart Health rerun cannot publish after main advances — health_fixes · medium · supervised · normal +
📋 EP analytic updates — implement the four planned work packages — autofit · large · supervised · normal ``` -Use the start-dev skill. draft/bug/health_fixes/heart_health_rerun_stale_push.md +Use the start-dev skill. draft/feature/autofit/ep_analytic_updates.md ```
-
📋 @PyAutoFit TransformedMessage.logpdf/pdf omit the transform Jacobian — priors · medium · supervised · normal +
📋 Skip the likelihood for assertion-violating samples on the JAX path — autofit · large · supervised · normal ``` -Use the start-dev skill. draft/bug/priors/15_transformed_message_logpdf_jacobian.md +Use the start-dev skill. draft/feature/autofit/skip_the_likelihood_for_assertion_violating_samp.md ```
-
📋 MultiStartGradient searches ignore iterations_per_quick_update and live_visual_update while announcing the cadence… — autofit · large · supervised · normal +
📋 Remote-MCP deployment tiers (2 + 3) for the results-inspector server — autofit_assistant · large · human-required · normal ``` -Use the start-dev skill. draft/bug/autofit/multistartgradient_searches_ignore_iterations_pe.md +Use the start-dev skill. draft/feature/autofit_assistant/remote_mcp_deployment_tiers.md ```
-
📋 Resolve release-profile timeout scripts deliberately — health_fixes · too-large · supervised · normal +
📋 Multi-plane time delays — autolens · large · supervised · normal ``` -Use the start-dev skill. draft/bug/health_fixes/release_timeout_policy.md +Use the start-dev skill. draft/feature/autolens/multi_plane_time_delays.md ```
-
📋 @PyAutoFit Refactor: each density should live in one place, not three — priors · too-large · supervised · normal +
📋 Adopt oversampled PSFs in the start-here dataset chain (option a) — autolens_workspace · large · supervised · normal ``` -Use the start-dev skill. draft/bug/priors/12_single_source_density_refactor.md +Use the start-dev skill. draft/feature/autolens_workspace/oversampled_psf_dataset_adoption.md ```
-
📋 @PyAutoFit Refactor: collapse the Prior / Message two-layer hierarchy — priors · too-large · supervised · normal +
📋 Restore lensing-of-lens in the multiple_sources workspace example — workspaces · large · supervised · normal ``` -Use the start-dev skill. draft/bug/priors/13_collapse_prior_and_message.md +Use the start-dev skill. draft/feature/workspaces/restore_multiple_sources_lensing_of_lens.md ```
-
📋 @PyAutoFit Refactor: replace hand-rolled AbstractDensityTransform with tfp.bijectors / numpyro.distributions.transforms — priors · too-large · supervised · normal +
📋 Follow-up to rectangular_adapt_cdf.md (issue #322) and Path A — autoarray · too-large · supervised · normal ``` -Use the start-dev skill. draft/bug/priors/14_replace_transform_stack_with_bijectors.md +Use the start-dev skill. draft/feature/autoarray/rectangular_multi_submesh.md ```
-
📋 Priors & Messages cleanup — tracker — priors · too-large · supervised · normal +
📋 PIEMass.potential_2d_from: implement the missing lensing potential — autogalaxy · too-large · supervised · normal ``` -Use the start-dev skill. draft/bug/priors/z_features.md +Use the start-dev skill. draft/feature/autogalaxy/piemass_potential.md ```
-
📋 Colab pins nautilus-sampler==1.0.4 while PyAutoFit declares 1.0.5 — autonerves · trivial · supervised · normal +
📋 Context: PyAutoLens issue #542 follow-up (Gap 1, deferred during the — jax_substructure · too-large · supervised · normal ``` -Use the start-dev skill. draft/bug/autonerves/nautilus_sampler_pin_drifts_from_pyautofit.md +Use the start-dev skill. draft/feature/jax_substructure/5_prng_key_vmap_noise.md ```
-
📋 sub_slim_indexes_for_pix_index appends -1 row padding to the last pixel's list — autoarray · small · supervised · low +
📋 Context: PyAutoLens issue #542 follow-up (Gap 2, deferred during the — jax_substructure · too-large · supervised · normal ``` -Use the start-dev skill. draft/bug/autoarray/sub_slim_indexes_for_pix_index_padding.md +Use the start-dev skill. draft/feature/jax_substructure/6_deflection_equivalence_test.md ```
-
📋 Aggregator reload of an in-memory sparse-operator interferometer fit silently falls back… — autogalaxy · small · supervised · low +
📋 dPIE: optional central-dispersion (sigma_0) parameterization — autogalaxy · small · supervised · low ``` -Use the start-dev skill. draft/bug/autogalaxy/aggregator_reload_drops_sparse_operator.md +Use the start-dev skill. draft/feature/autogalaxy/dpie_sigma0_parameterization.md ```
-
📋 Database-path searches cannot reload dataset.fits (written to disk, never registered via save_fits) — autogalaxy · small · supervised · low +
📋 PyAutoLens mirror of the interferometer primary-beam persistence (docstring + round-trip test) — autolens · small · safe · low ``` -Use the start-dev skill. draft/bug/autogalaxy/database_paths_dataset_fits_not_registered.md +Use the start-dev skill. draft/feature/autolens/interferometer_primary_beam_persistence_mirror.md ```
-
📋 @autolens_profiling stale auto-simulated dataset/cluster/simple is never regenerated — autolens_profiling · small · supervised · low +
📋 Release board: local run_logs enrichment — pyautohands · small · supervised · low ``` -Use the start-dev skill. draft/bug/autolens_profiling/stale_auto_simulated_cluster_dataset.md +Use the start-dev skill. draft/feature/pyautohands/release_board_run_logs_enrichment.md ```
-
📋 The reconstruction noise map is not the truncated posterior the NNLS solve… — autoarray · medium · human-required · low +
📋 Gallery runner: add visualization_upper + decide the modeling_visualization_jit tier — workspaces · small · safe · low ``` -Use the start-dev skill. draft/bug/autoarray/reconstruction_noise_map_truncated_posterior.md +Use the start-dev skill. draft/feature/workspaces/gallery_runner_missing_tiers.md ```
-
📋 Point-source JSON datasets record no resolution regime — pyautolens · medium · supervised · low +
📋 Animated logos for PyAutoGalaxy and PyAutoFit — pyautoscientist · medium · safe · low ``` -Use the start-dev skill. draft/bug/pyautolens/point_source_json_datasets_record_no_regime.md +Use the start-dev skill. draft/feature/pyautoscientist/animated_logos_for_pyautogalaxy_and_pyautofit.md ```
-
📋 Same-class q-clamp and bare-sqrt ellipticity gradient sites (follow-up to PyAutoGalaxy#631) — autogalaxy +
📋 Deferred: make the *Power adapt classes the defaults (breaking) — autoarray · large · human-required · low ``` -Use the start-dev skill. draft/bug/autogalaxy/q_clamp_and_bare_sqrt_ellipticity_grad_sweep.md +Use the start-dev skill. draft/feature/autoarray/adapt_linear_default_flip.md ```
-
📋 autolens_workspace point_source/plot.py crashes: residual_map (4,2) vs (5,2) broadcast; the model solves 5… — autolens · human-required +
📋 Cortex output summaries — phase 2 — cortex ``` -Use the start-dev skill. draft/bug/autolens/point_source_plot_script_residual_shape_mismatch.md +Use the start-dev skill. draft/feature/cortex/output_summary.md ```
-
📋 euclid_dr1: every dataset rgb.jpg is upside down relative to the VIS FITS… — euclid · supervised +
📋 Simplify reading-queue token management — pyautomemory ``` -Use the start-dev skill. draft/bug/euclid/euclid_dr1_flip_rgb_jpg_upside_down.md +Use the start-dev skill. draft/feature/pyautomemory/reading-queue-token-management.md ```
@@ -2096,7 +1920,7 @@ Use the start-dev skill. draft/bug/euclid/euclid_dr1_flip_rgb_jpg_upside_down.md
-research — 43 +research — 20
📋 @autofit_inference B5c-2a-rerun: re-pilot the 80 Emcee/Zeus rows lost to the harness bug… — autofit_inference · medium · supervised · high @@ -2258,190 +2082,6 @@ Use the start-dev skill. draft/research/autoarray/delaunay_interpolator_pure_cal
-
📋 HPC campaign epic — research report and phased plan — autofit - -``` -Use the start-dev skill. draft/research/autofit/hpc_campaign_epic_report.md -``` - -
- -
📋 Energy and CO2e for PyAuto HPC campaigns: methods, inputs, worked estimate — autofit - -``` -Use the start-dev skill. draft/research/autofit/hpc_campaign_epic_surveys/carbon.md -``` - -
- -
📋 HPC campaign epic: what the codebase already has — autofit - -``` -Use the start-dev skill. draft/research/autofit/hpc_campaign_epic_surveys/codebase.md -``` - -
- -
📋 euclid_dr1 HPC glue + Slurm mechanics — research report — autofit - -``` -Use the start-dev skill. draft/research/autofit/hpc_campaign_epic_surveys/euclid_hpc.md -``` - -
- -
📋 Prior art: status, right-sizing and failure triage for large HPC fit campaigns — autofit - -``` -Use the start-dev skill. draft/research/autofit/hpc_campaign_epic_surveys/prior_art.md -``` - -
- -
📋 Search extensibility epic: research report and phased plan — autofit - -``` -Use the start-dev skill. draft/research/autofit/search_extensibility_epic_report.md -``` - -
- -
📋 **§1 Verdict** — autofit - -``` -Use the start-dev skill. draft/research/autofit/search_extensibility_epic_reviews/01_codex_gpt6_astra.md -``` - -
- -
📋 Independent review — search extensibility epic report (Fable, high effort) — autofit - -``` -Use the start-dev skill. draft/research/autofit/search_extensibility_epic_reviews/02_claude_fable_high.md -``` - -
- -
📋 Codex gpt-6-astra adversary review — B2 (autofit_inference#3), 2026-10-08 — autofit - -``` -Use the start-dev skill. draft/research/autofit/search_extensibility_epic_reviews/03_codex_astra_b2_pr3.md -``` - -
- -
📋 Codex gpt-6-astra adversary review — A1 (PyAutoFit#1675), 2026-10-08 — autofit - -``` -Use the start-dev skill. draft/research/autofit/search_extensibility_epic_reviews/04_codex_astra_a1_pr1675.md -``` - -
- -
📋 Codex gpt-6-astra adversary review — A2/A3/A3b (PyAutoFit#1679/#1680/#1681), post-merge, 2026-10-08 — autofit - -``` -Use the start-dev skill. draft/research/autofit/search_extensibility_epic_reviews/05_codex_astra_a2_a3_a3b_postmerge.md -``` - -
- -
📋 Codex gpt-6-astra adversary review — B3 (autofit_inference#5, PyAutoInsight#23, PyAutoCortex#61), post-merge, 2026-10-08 — autofit - -``` -Use the start-dev skill. draft/research/autofit/search_extensibility_epic_reviews/06_codex_astra_b3_postmerge.md -``` - -
- -
📋 Codex gpt-6-astra adversary review — A4 stack (PyAutoFit#1685 → #1686 → #1687)… — autofit - -``` -Use the start-dev skill. draft/research/autofit/search_extensibility_epic_reviews/07_codex_astra_a4_stack_premerge.md -``` - -
- -
📋 01 — PyAutoFit non-linear search architecture audit — autofit - -``` -Use the start-dev skill. draft/research/autofit/search_extensibility_epic_surveys/01_search_architecture.md -``` - -
- -
📋 02 — JAX interface across PyAutoFit non-linear searches (read-only audit) — autofit - -``` -Use the start-dev skill. draft/research/autofit/search_extensibility_epic_surveys/02_jax_interface.md -``` - -
- -
📋 03 — How non-linear searches are documented across PyAuto, and how… — autofit - -``` -Use the start-dev skill. draft/research/autofit/search_extensibility_epic_surveys/03_search_docs.md -``` - -
- -
📋 04 — Inference and profiling infrastructure survey for autofit_inference and autofit_profiling — autofit - -``` -Use the start-dev skill. draft/research/autofit/search_extensibility_epic_surveys/04_inference_profiling_infra.md -``` - -
- -
📋 Survey 01 — autolens_profiling and autolens_inference layout census (2026-10-21, Explore worker, read-only) — autolens_profiling - -``` -Use the start-dev skill. draft/research/autolens_profiling/likelihood_lifecycle_epic_surveys/01_profiling_inference_layout.md -``` - -
- -
📋 Survey 02 — PyAutoPulse and PyAutoInsight data model, contracts, dashboards, boundaries… — autolens_profiling - -``` -Use the start-dev skill. draft/research/autolens_profiling/likelihood_lifecycle_epic_surveys/02_pulse_insight_contracts.md -``` - -
- -
📋 Survey 03 — PyAutoEyes and autolens_visualization coverage per dataset type… — autolens_profiling - -``` -Use the start-dev skill. draft/research/autolens_profiling/likelihood_lifecycle_epic_surveys/03_eyes_viz_coverage.md -``` - -
- -
📋 Survey 04 — Compute-setup knobs in PyAutoLens: what an "auto / optimal… — autolens_profiling - -``` -Use the start-dev skill. draft/research/autolens_profiling/likelihood_lifecycle_epic_surveys/04_setup_knobs_source.md -``` - -
- -
📋 Survey 05 — Mind epic format, Brain intake/conductors, overlapping epics and tasks… — autolens_profiling - -``` -Use the start-dev skill. draft/research/autolens_profiling/likelihood_lifecycle_epic_surveys/05_brain_conductors_epic_format.md -``` - -
- -
📋 Likelihood lifecycle 2b — interferometer campaign: survey and draft plan — autolens_profiling - -``` -Use the start-dev skill. draft/research/autolens_profiling/likelihood_lifecycle_epic_surveys/p2b_interferometer_survey_2026_10_25.md -``` - -
-
@@ -2642,7 +2282,7 @@ Use the start-dev skill. draft/docs/howtolens/tutorial_correctness_and_howtogala
-maintenance — 17 +maintenance — 15
📋 Reduce the organism's per-session and per-task token load by half — organs · medium · supervised · high @@ -2660,14 +2300,6 @@ Use the start-dev skill. draft/maintenance/autocti/cti_upkeep_epic.md
-
📋 Keep caches off $HOME on HPC — phase 2 remainder: euclid pipeline… — workspaces · small · supervised · medium - -``` -Use the start-dev skill. draft/maintenance/workspaces/hpc_cache_off_home_phase2_euclid.md -``` - -
-
📋 autolens_workspace_developer: broad stale-API rot (56 symbols, no CI) — autolens_workspace_developer · medium · supervised · normal ``` @@ -2772,14 +2404,6 @@ Use the start-dev skill. draft/maintenance/euclid/skip_fit_output_no_longer_gate
-
📋 CTI upkeep parity — survey report (2026-11-04) — autocti - -``` -Use the start-dev skill. draft/maintenance/autocti/cti_upkeep_epic_report.md -``` - -
-
@@ -2996,16 +2620,15 @@ Use the start-dev skill. draft/triage/autolens/jit_fit_from_is_vacuous.md | 2026-11-05 | filed | Filed: 2026-11-05 (found by the autolens_profiling#519 worker-route… | | 2026-11-04 | issued | Autonomous orchestrators phase 4c: run the Dev orchestrator pilot… | | 2026-11-02 | filed | Unexplained autodiff-vs-FD gaps in the phase-6 gradient records… | -| 2026-11-02 | filed | Standard-size gradient cells record "point": "prior_medians" while… | | 2026-11-02 | issued | Magnification maps 8d: wire into fit subplots and make them pretty | | 2026-11-02 | issued | Issued: 2026-11-02 | | 2026-11-02 | filed | Imaging sparse-operator path gives a very different log L from dense… | +| 2026-11-02 | issued | Gradient-correctness sweep: triage and investigate every open… |
… 10 more (40 left) | Date | Event | Task | |------|-------|------| -| 2026-11-02 | issued | Gradient-correctness sweep: triage and investigate every open… | | 2026-10-31 | issued | Sky orientation (north/east): euclid_dr1 catalogue, paper and… | | 2026-10-30 | filed | Should PyAutoArray flip FITS rows at load so +y is north | | 2026-10-29 | issued | ECLIPSE site: serve R2 lens files through a Pages Function behind… | @@ -3015,12 +2638,12 @@ Use the start-dev skill. draft/triage/autolens/jit_fit_from_is_vacuous.md | 2026-10-23 | filed | autolens_assistant leg of the PyAutoLabs AI-options page (deferred… | | 2026-10-23 | filed | @autolens_profiling stale auto-simulated dataset/cluster/simple… | | 2026-10-23 | filed | A dedicated Documentation conductor in PyAutoBrain | +| 2026-10-22 | filed | point-plots-yaml-keys-assistant |
… 10 more (30 left) | Date | Event | Task | |------|-------|------| -| 2026-10-22 | filed | point-plots-yaml-keys-assistant | | 2026-10-21 | filed | interferometer-primary-beam-persistence-mirror | | 2026-10-21 | filed | PyAutoLens mirror of the interferometer primary-beam persistence… | | 2026-10-21 | filed | Note in autolens_profiling that plain source-plane lane values… | @@ -3030,12 +2653,12 @@ Use the start-dev skill. draft/triage/autolens/jit_fit_from_is_vacuous.md | 2026-10-21 | filed | Cluster likelihood scripts: image-plane manual check disagrees with… | | 2026-10-16 | filed | Re-measure the shapelets/modeling.py SLOW park (#586) under the… | | 2026-10-14 | filed | @autofit_workspace six searches/ scripts fail on main at… | +| 2026-10-14 | filed | Cortex output summaries — phase 2 |
… 10 more (20 left) | Date | Event | Task | |------|-------|------| -| 2026-10-14 | filed | Cortex output summaries — phase 2 | | 2026-10-09 | filed | Profiling conductor compile drift compares one point against one point | | 2026-10-08 | filed | JAX_ENABLE_X64=False is overridden to True, so the fp32 inference… | | 2026-10-07 | filed | Upstream the DR1 final-catalogue tooling to the pipeline, with a… | @@ -3045,12 +2668,12 @@ Use the start-dev skill. draft/triage/autolens/jit_fit_from_is_vacuous.md | 2026-10-02 | filed | Fix KNN neighbor search for a partial final point block | | 2026-10-01 | filed | Sparse interferometer terms: NUFFT ignores the mask origin and… | | 2026-10-01 | filed | Interferometer log_evidence fails (LinAlgError / NaN) at large… | +| 2026-10-01 | filed | Interferometer galaxy_image_dict drops a mixed galaxy's ordinary… |
… 10 more (10 left) | Date | Event | Task | |------|-------|------| -| 2026-10-01 | filed | Interferometer galaxy_image_dict drops a mixed galaxy's ordinary… | | 2026-09-29 | filed | PlotterEllipse.fit_ellipse writes every variant to… | | 2026-09-27 | filed | Sparse interferometer inversion: jax.grad of the log-evidence terms… | | 2026-09-27 | filed | Same-class q-clamp and bare-sqrt ellipticity gradient sites… | @@ -3058,8 +2681,9 @@ Use the start-dev skill. draft/triage/autolens/jit_fit_from_is_vacuous.md | 2026-09-26 | filed | bump_colab_urls.sh: cover autolens_assistant Colab links | | 2026-09-26 | filed | Repo cleanup: retire the Abell 1201 worktree and local raw data | | 2026-09-25 | filed | test_latent_euclid_variables_traces_under_jax_jit went red on main… | -| 2026-09-25 | filed | Keep caches off $HOME on HPC — phase 2 remainder: euclid pipeline… | | 2026-09-24 | filed | euclid_dr1: run the positions gate over DR1 and submit the remodel set | +| 2026-09-23 | filed | multi_dataset/jax_likelihood/delaunay.py asserts the wrong likelihood… | +| 2026-09-18 | filed | autolens_workspace: __Model__ bullets whose profiles or parameter… |
@@ -3073,46 +2697,20 @@ _Dates come from each task's registry entry — `lifecycle.py dates` reports any ## Hygiene -31 prompt(s) without a metadata header — they show no facets above. Re-home or re-run intake on them when touched. +5 prompt(s) without a metadata header — they show no facets above. Re-home or re-run intake on them when touched.
Headerless prompts -- `draft/feature/autolens/lenstwin_epic_surveys/01_pyautolens_pyautogalaxy.md` -- `draft/feature/autolens/lenstwin_epic_surveys/02_assistant_workspace.md` - `draft/docs/autolens_assistant/cosmos_web_ring_guided_walkthrough.md` - `draft/docs/autolens_assistant/cosmos_web_ring_guided_walkthrough_p2_greeting.md` - `draft/docs/autolens_assistant/cosmos_web_ring_guided_walkthrough_p3_front_doors.md` - `draft/docs/howtolens/paired_tutorial_review_resume.md` - `draft/docs/howtolens/tutorial_correctness_and_howtogalaxy_parity.md` -- `draft/maintenance/autocti/cti_upkeep_epic_report.md` -- `draft/research/autofit/hpc_campaign_epic_report.md` -- `draft/research/autofit/hpc_campaign_epic_surveys/carbon.md` -- `draft/research/autofit/hpc_campaign_epic_surveys/codebase.md` -- `draft/research/autofit/hpc_campaign_epic_surveys/euclid_hpc.md` -- `draft/research/autofit/hpc_campaign_epic_surveys/prior_art.md` -- `draft/research/autofit/search_extensibility_epic_report.md` -- `draft/research/autofit/search_extensibility_epic_reviews/01_codex_gpt6_astra.md` -- `draft/research/autofit/search_extensibility_epic_reviews/02_claude_fable_high.md` -- `draft/research/autofit/search_extensibility_epic_reviews/03_codex_astra_b2_pr3.md` -- `draft/research/autofit/search_extensibility_epic_reviews/04_codex_astra_a1_pr1675.md` -- `draft/research/autofit/search_extensibility_epic_reviews/05_codex_astra_a2_a3_a3b_postmerge.md` -- `draft/research/autofit/search_extensibility_epic_reviews/06_codex_astra_b3_postmerge.md` -- `draft/research/autofit/search_extensibility_epic_reviews/07_codex_astra_a4_stack_premerge.md` -- `draft/research/autofit/search_extensibility_epic_surveys/01_search_architecture.md` -- `draft/research/autofit/search_extensibility_epic_surveys/02_jax_interface.md` -- `draft/research/autofit/search_extensibility_epic_surveys/03_search_docs.md` -- `draft/research/autofit/search_extensibility_epic_surveys/04_inference_profiling_infra.md` -- `draft/research/autolens_profiling/likelihood_lifecycle_epic_surveys/01_profiling_inference_layout.md` -- `draft/research/autolens_profiling/likelihood_lifecycle_epic_surveys/02_pulse_insight_contracts.md` -- `draft/research/autolens_profiling/likelihood_lifecycle_epic_surveys/03_eyes_viz_coverage.md` -- `draft/research/autolens_profiling/likelihood_lifecycle_epic_surveys/04_setup_knobs_source.md` -- `draft/research/autolens_profiling/likelihood_lifecycle_epic_surveys/05_brain_conductors_epic_format.md` -- `draft/research/autolens_profiling/likelihood_lifecycle_epic_surveys/p2b_interferometer_survey_2026_10_25.md` - -
- -127 prompt(s) with no `Witness:` — the machine-checkable claim that would make the work reviewable in minutes. Absent, a prompt grades `judge` (a PI's quarter-hour) whatever its size, which is the intended default and not a bug. Nothing derives or backfills a witness — an invented one is plausible prose with nothing behind it — so this is a human writing one, a prompt at a time. + +
+ +92 prompt(s) with no `Witness:` — the machine-checkable claim that would make the work reviewable in minutes. Absent, a prompt grades `judge` (a PI's quarter-hour) whatever its size, which is the intended default and not a bug. Nothing derives or backfills a witness — an invented one is plausible prose with nothing behind it — so this is a human writing one, a prompt at a time.
Prompts with no witness @@ -3120,16 +2718,10 @@ _Dates come from each task's registry entry — `lifecycle.py dates` reports any - `draft/feature/autoarray/adapt_linear_default_flip.md` - `draft/feature/autoarray/rectangular_multi_submesh.md` - `draft/feature/autofit/model_figures_epic.md` -- `draft/feature/autofit/results_library_epic_report.md` - `draft/feature/autofit_assistant/remote_mcp_deployment_tiers.md` -- `draft/feature/autogalaxy/ell_comps_joint_disk_constraint.md` - `draft/feature/autogalaxy/piemass_potential.md` -- `draft/feature/autolens/lenstwin_epic_report.md` -- `draft/feature/autolens/lenstwin_epic_surveys/01_pyautolens_pyautogalaxy.md` -- `draft/feature/autolens/lenstwin_epic_surveys/02_assistant_workspace.md` - `draft/feature/autolens/magnification_maps_visualization.md` - `draft/feature/autolens/source_cluster_arc.md` -- `draft/feature/autolens_jax_joss/autolens_jax_joss_benchmark_repo.md` - `draft/feature/autolens_profiling/delaunay_nn_numba_optimal_remeasure_after_677.md` - `draft/feature/autolens_profiling/gradient_cost_hazard_on_ral_cpu_value.md` - `draft/feature/autolens_workspace/cluster_point_solver_validation_check.md` @@ -3144,24 +2736,30 @@ _Dates come from each task's registry entry — `lifecycle.py dates` reports any - `draft/feature/pyautobroca/broca_communication_documentation_and_workspaces.md` - `draft/feature/pyautobroca/broca_communication_pilot.md` - `draft/feature/pyautoears/community_organ_birth.md` -- `draft/feature/pyautoeyes/group_cluster_gallery.md` -- `draft/feature/pyautoeyes/multi_galaxy_gallery.md` - `draft/feature/pyautohands/bump_colab_urls_autolens_assistant.md` - `draft/feature/pyautomemory/reading-queue-token-management.md` - `draft/feature/pyautoscientist/collaborator_led_pyautoscientist_adoption_pilot.md` - `draft/feature/pyautoscientist/scientist_collaborator_validation.md` -- `draft/feature/pyautoscientist/scientist_minimal_starter.md` - `draft/feature/pyautoscientist/scientist_optional_organ_activation.md` - `draft/feature/workspaces/model_figures_6_rollout.md` - `draft/bug/autoarray/reconstruction_noise_map_truncated_posterior.md` - `draft/bug/autoarray/rectangular_adaptive_zeroed_ring_guard_row_mismatch.md` - `draft/bug/autoarray/sibson_serial_kernel_loses_allocation_hoisting.md` - `draft/bug/autoarray/sub_slim_indexes_for_pix_index_padding.md` -- _… and 87 more_ +- `draft/bug/autocti_visualization/manifest_rendered_with_stale_in_mains_mode.md` +- `draft/bug/autofit/investigate_euclid_einstein_radius_latent_uncert.md` +- `draft/bug/autogalaxy/area_magnification_critical_curve_fragments.md` +- `draft/bug/autogalaxy/q_clamp_and_bare_sqrt_ellipticity_grad_sweep.md` +- `draft/bug/autogalaxy/wrong_jax_gradient_on_mge_likelihoods_fd.md` +- `draft/bug/autolens/point_solver_error_bisect_health.md` +- `draft/bug/autolens/point_source_plot_script_residual_shape_mismatch.md` +- `draft/bug/autolens/runtime_single_jit_median_reach_and_a100_witness.md` +- `draft/bug/autolens_workspace/cluster_likelihood_scripts_preexisting_mismatches.md` +- _… and 52 more_
-67 prompt(s) with unknown theme keyword(s) — not in [`themes.md`](themes.md), so they group loudly rather than silently. Correct the prompt, or add the keyword to the vocabulary. +61 prompt(s) with unknown theme keyword(s) — not in [`themes.md`](themes.md), so they group loudly rather than silently. Correct the prompt, or add the keyword to the vocabulary.
Unknown theme keywords @@ -3170,11 +2768,9 @@ _Dates come from each task's registry entry — `lifecycle.py dates` reports any - `draft/feature/autoarray/edge_zeroed_log_det_cholesky_reuse.md — unknown theme keyword(s): inversion` - `draft/feature/autoarray/interferometer_chunked_transform_mapping_matrix.md — unknown theme keyword(s): jax-gpu, vram` - `draft/feature/autoarray/interferometer_curvature_preload_phase1.md — unknown theme keyword(s): inversion, likelihood-profiling` -- `draft/feature/autoarray/interferometer_numba_gate_retune_70.md — unknown theme keyword(s): config` - `draft/feature/autoarray/source_clumps_robust_scale.md — unknown theme keyword(s): source-reconstruction` - `draft/feature/autofit/certified_solver_batched_guard_c2.md — unknown theme keyword(s): inversion` - `draft/feature/autofit/results_library_epic.md — unknown theme keyword(s): hpc, euclid, results, aggregator` -- `draft/feature/autofit/results_library_epic_report.md — unknown theme keyword(s): results, euclid` - `draft/feature/autolens/coolest_pixel_grid_export.md — unknown theme keyword(s): coolest, interop, euclid` - `draft/feature/euclid/catalogue_extension_coolest_mass_fits.md — unknown theme keyword(s): euclid, catalogue` - `draft/feature/euclid/euclid_dr1_prep_epic.md — unknown theme keyword(s): euclid` @@ -3193,9 +2789,7 @@ _Dates come from each task's registry entry — `lifecycle.py dates` reports any - `draft/bug/autoarray/sparse_inversion_ignores_profile_subtracted_image.md — unknown theme keyword(s): inversion, sparse-operator, correctness` - `draft/bug/autoarray/sparse_terms_nufft_origin_and_mask_compatibility.md — unknown theme keyword(s): sparse-operator` - `draft/bug/autoarray/sparse_vs_dense_log_likelihood_mismatch_nonlinear_lens_light.md — unknown theme keyword(s): source-reconstruction` -- `draft/bug/autocti_visualization/render_yml_blocked_until_pyautocti_release.md — unknown theme keyword(s): infrastructure` - `draft/bug/autofit/dataset_model_free_grid_offset_pytree_roundtrip.md — unknown theme keyword(s): jax` -- `draft/bug/autofit/nautilus_ep_default_optimiser_reads_use_jax_unguarded.md — unknown theme keyword(s): nautilus` - `draft/bug/autofit/samples_with_paths_shared_prior_factor_graph.md — unknown theme keyword(s): samples, factor-graph` - `draft/bug/autofit/vmap_jit_recompiles_per_nautilus_batch_length.md — unknown theme keyword(s): jax, nautilus` - `draft/bug/autogalaxy/aggregator_reload_drops_sparse_operator.md — unknown theme keyword(s): sparse-operator, aggregator` @@ -3207,9 +2801,7 @@ _Dates come from each task's registry entry — `lifecycle.py dates` reports any - `draft/bug/autolens/runtime_single_jit_median_reach_and_a100_witness.md — unknown theme keyword(s): jax` - `draft/bug/autolens_profiling/stale_auto_simulated_cluster_dataset.md — unknown theme keyword(s): datasets` - `draft/bug/autolens_workspace/start_here_multistart_compile_time.md — unknown theme keyword(s): jax, compile-time, first-contact` -- `draft/bug/euclid/bundle_sersic_products_read_output_dir_not_sed_output_dir.md — unknown theme keyword(s): euclid, catalogue` - `draft/bug/euclid/drawer_pix_initializer_exception_flake.md — unknown theme keyword(s): euclid, ci, source-reconstruction` -- `draft/bug/euclid/euclid_dr1_flip_rgb_jpg_upside_down.md — unknown theme keyword(s): euclid, hpc` - `draft/bug/euclid/gpu_per_lens_time_vs_documented_10_min.md — unknown theme keyword(s): euclid, jax, hpc` - `draft/bug/euclid/latent_total_source_flux_jax_vs_numpy_regression.md — unknown theme keyword(s): euclid, jax, latent` - `draft/bug/euclid/sed_chain_waveband_fit_can_spin_forever.md — unknown theme keyword(s): euclid, hpc, catalogue` diff --git a/draft/bug/autocti_visualization/render_yml_blocked_until_pyautocti_release.md b/draft/bug/autocti_visualization/render_yml_blocked_until_pyautocti_release.md deleted file mode 100644 index 54246420c..000000000 --- a/draft/bug/autocti_visualization/render_yml_blocked_until_pyautocti_release.md +++ /dev/null @@ -1,60 +0,0 @@ -# autocti_visualization render.yml fails on the released stack until PyAutoCTI releases - -Type: bug -Target: autocti_visualization -Repos: -- autocti_visualization -- PyAutoCTI -- PyAutoHands -Themes: -- visualization -- infrastructure -Difficulty: small -Autonomy: supervised -Priority: normal -Lane: local-dev -Status: draft -Consequence: judge -Witness: `gh workflow run render -R PyAutoLabs/autocti_visualization` completes green and its last step logs "Dispatched eyes-refresh to PyAutoLabs/PyAutoEyes" -Epic: cti-upkeep -Phase: 5 -Filed: 2026-09-29 - -## Task - -The first post-merge `workflow_dispatch` of `render.yml` -(run 36626066338, https://github.com/PyAutoLabs/autocti_visualization/actions/runs/36626066338) -failed at "Render figures + rebuild GALLERY.md + gallery/viz_manifest.yaml". -The "Install the released stack from PyPI" step ran -`pip install "autocti[optional]"`, which resolves to `autocti-2024.11.13.2`, -the latest autocti on PyPI. That release is older than autonerves and older -than the `aplt.*` plot-function API the producers call. Both producers fail on -import: - -``` -File ".../scripts/dataset_1d/visualization.py", line 64, in - from autonerves import conf -ModuleNotFoundError: No module named 'autonerves' -``` - -(`scripts/imaging_ci/visualization.py` line 73 fails the same way.) The commit -and `eyes-refresh` steps were skipped, so PyAutoEyes got no dispatch from cti. -The tracked PNGs on main still come from the source-checkout render at birth. -`lint.yml` stays green because it installs the library mains, not PyPI. - -For comparison, the autofit_visualization render (run 36626061620) installed -autofit 2026.9.27.2 and autonerves 2026.9.27.2 from PyPI and succeeded. - -## Fix (choose one, in this order of preference) - -a. **Release PyAutoCTI** on the current cadence. After that, - `pyautocti-release` and this workflow work as designed. This is the blocker - to name on the Hands release board: autocti has not published since - 2024-11. -b. **Interim:** when `autocti_version` is empty, have `render.yml` fall back to - the library mains by mirroring `lint.yml`'s checkout/install step. That - makes `workflow_dispatch` re-renders work before a release. The - `rendered_with` stamp must then say it came from a source build. - -Found during the `/prm` close-out of `eyes-fit-cti-instances` -(`complete/2026/09/eyes-fit-cti-instances.md`, PyAutoMind#455). diff --git a/draft/bug/autofit/multistartgradient_searches_ignore_iterations_pe.md b/draft/bug/autofit/multistartgradient_searches_ignore_iterations_pe.md deleted file mode 100644 index bfa55146a..000000000 --- a/draft/bug/autofit/multistartgradient_searches_ignore_iterations_pe.md +++ /dev/null @@ -1,63 +0,0 @@ -# MultiStartGradient searches ignore iterations_per_quick_update and live_visual_update while announcing the cadence… - -Type: bug -Target: PyAutoFit -Repos: -- PyAutoFit -- autolens_workspace -Difficulty: large -Autonomy: supervised -Priority: normal -Status: formalised -Consequence: glance -Witness: a MultiStartProdigy fit run with a finite iterations_per_quick_update writes one fit.png per cadence boundary under the search output directory (counted by a test that drives the step loop and asserts the number of perform_quick_update calls), and multi_start_gradient/search.py is removed from the EXEMPT map in test_autofit/non_linear/search/test_quick_update_wiring.py rather than left in it; on the workspace side, an AST guard asserts no MultiStart* call site in scripts/ passes a kwarg the search does not honour. -Review-minutes: 3 -Unattended: ready - -MultiStartGradient searches ignore iterations_per_quick_update and live_visual_update while announcing the cadence in the startup log - -## What was observed - -Running autolens_workspace scripts/imaging/start_here.py logs: - - 2026-08-31 11:50:25,370 - autofit.non_linear.search.abstract_search - INFO - On-the-fly updates of the maximum likelihood model every 50 iterations. - -50 looks alarmingly frequent for a search whose whole budget is n_steps=300. It is not: nothing fires, so the cadence costs nothing. Raising it to 1000 would change nothing either. - -## Why nothing fires - -AbstractMultiStartGradient builds its Fitness (PyAutoFit autofit/non_linear/search/mle/multi_start_gradient/search.py:816) WITHOUT iterations_per_quick_update and WITHOUT live_visual_update, deliberately. fitness.call is traced inside jax.jit(jax.vmap(...)), so the Python-side counter in Fitness.manage_quick_update would run once at trace time and never again. The exemption is recorded in the EXEMPT map of test_autofit/non_linear/search/test_quick_update_wiring.py and in PyAutoFit#1433, which shipped iterations_per_log (default 10) as the replacement progress channel for these four searches. - -Consequences for MultiStartProdigy / MultiStartAdam / MultiStartADABelief / MultiStartLion: no periodic fit.png, no live matplotlib window in script mode, no self-refreshing Jupyter cell, and no runtime cost from the setting. - -## Defect 1 - the startup message is a false claim (PyAutoFit) - -AbstractSearch emits the "On-the-fly updates ... every N iterations" line (autofit/non_linear/search/abstract_search.py:476-488) from the base class, unconditionally, whether or not the concrete search wires the cadence through to its Fitness. The wiring test's own comment already names this failure mode: "once the cadence is announced in the startup log, a missing forward turns a dead feature into a false claim in the CLI." - -Two silent kwargs sit behind it: passing iterations_per_quick_update or live_visual_update to a MultiStart* search is accepted, stored, reported in the log, and then ignored. - -## Defect 2 - the workspace documents behaviour that does not happen - -Three scripts pass both dead kwargs to MultiStartProdigy: - -- scripts/imaging/start_here.py (iterations_per_quick_update=50, live_visual_update=True) -- scripts/interferometer/start_here.py -- scripts/multi_galaxy/start_here.py - -Each carries an __Iterations Per Update__ and a __Live Visual Update__ prose section describing a ~10 second update every 50 gradient steps, a matplotlib window that opens automatically in script mode, and a Jupyter cell that refreshes in place. None of that happens. - -The prose is also wrong on the unit, even for the searches where the machinery IS live: Fitness.manage_quick_update increments quick_update_count by the batch size (fitness.py:607, total_updates = log_likelihood.shape[0]), not by one per step. With n_starts=48, iterations_per_quick_update=50 would fire roughly every SECOND gradient step, not every fiftieth. - -The same __Live Visual Update__ prose appears in ~14 workspace scripts, but only the three above attach it to a MultiStart search - the rest use Nautilus, where the quick-update machinery is genuinely live and the prose is correct. - -## Asked-for fix - -Wire real quick updates into the multi-start searches rather than only removing the false claim. The step loop in AbstractMultiStartGradient._fit is plain host Python and already forces a device sync every step, so a counter there works where the traced one cannot - this is the same seam iterations_per_log already uses. - -1. PyAutoFit - honour iterations_per_quick_update in AbstractMultiStartGradient's step loop: at each cadence boundary, build the instance from the current global-best parameters and call analysis.perform_quick_update, and support live_visual_update through the same LiveDisplay / BackgroundQuickUpdate path Fitness uses. Decide the unit deliberately and document it (a gradient step is the natural unit here, which differs from the batch-size counting Fitness does - the two must not silently disagree). Remove multi_start_gradient/search.py from the wiring test's EXEMPT map once it honours the kwarg. -2. PyAutoFit - make the startup message honest for any search that still does not wire the cadence, and warn when an ignored kwarg is passed, pointing at the channel that does work. -3. autolens_workspace - once the library honours it, re-tune the three scripts to a sane cadence in the new unit (50 gradient steps is reasonable if the unit is steps; it is far too frequent if the unit stays batch-counted) and rewrite the __Iterations Per Update__ and __Live Visual Update__ prose so it describes what the search actually does, including how it relates to iterations_per_log. - -Expect a phase split: library first (quick-update wiring, then the honest-message / warning leg), workspace follow-up once the unit and the kwarg semantics are settled. - - diff --git a/draft/bug/autofit/nautilus_ep_default_optimiser_reads_use_jax_unguarded.md b/draft/bug/autofit/nautilus_ep_default_optimiser_reads_use_jax_unguarded.md deleted file mode 100644 index 3f6083637..000000000 --- a/draft/bug/autofit/nautilus_ep_default_optimiser_reads_use_jax_unguarded.md +++ /dev/null @@ -1,34 +0,0 @@ -# Nautilus as an EP default_optimiser crashes on PriorFactors (reads analysis._use_jax unguarded) - -Type: bug -Target: PyAutoFit -Repos: -- PyAutoFit -Themes: -- graphical-ep -- nautilus -Difficulty: small -Autonomy: safe -Priority: normal -Status: formalised -Consequence: glance -Witness: an EP fit whose EPOptimiser is built with default_optimiser=af.Nautilus(number_of_cores=1) over a FactorGraphModel with PriorFactors runs its prior-factor steps instead of raising AttributeError on _use_jax; a test builds that optimiser over one AnalysisFactor plus its priors and runs one step. -Review-minutes: 3 -Unattended: ready -Filed: 2026-09-17 - -Found while building the memory witness for PyAutoFit#1631. - -A `FactorGraphModel` contains `PriorFactor`s whose `.analysis` is the -`PriorFactor` itself, which has no `_use_jax` attribute. `AbstractSearch.optimise` -already reads it defensively (`getattr(analysis, "_use_jax", False)`), but the -Nautilus `_fit` (`autofit/non_linear/search/nest/nautilus/search.py`, the -`if self.force_x1_cpu or analysis._use_jax:` branch) reads it unguarded, so -`af.Nautilus` handed to `EPOptimiser` as the `default_optimiser` raises -`AttributeError` the first time a prior factor is stepped. The workaround in -the #1631 witness was a per-factor `optimiser=af.Nautilus(...)` on each -`AnalysisFactor` with `default_optimiser=af.LaplaceOptimiser()` for the priors. - -Fix: read `_use_jax` through `getattr(..., False)` in the Nautilus `_fit`, and -grep the other searches' `_fit` bodies for the same unguarded read. Add a small -EP test that drives one step with Nautilus as the default optimiser. diff --git a/draft/bug/autofit/stale_enable_pytrees_register_model_advice_in.md b/draft/bug/autofit/stale_enable_pytrees_register_model_advice_in.md index 98d780df9..33f299492 100644 --- a/draft/bug/autofit/stale_enable_pytrees_register_model_advice_in.md +++ b/draft/bug/autofit/stale_enable_pytrees_register_model_advice_in.md @@ -17,3 +17,10 @@ Unattended: ready autofit/non_linear/search/mcmc/blackjax/nuts/search.py:270 and autofit/non_linear/search/mcmc/blackjax/smc/search.py:328 tell users to call enable_pytrees() / register_model(model), and the workspace script scripts/searches/mcmc.py lines 244-247 and 283-286 do the same in prose and code. Neither function is exposed on the af namespace and Fitness.__init__ (autofit/non_linear/fitness.py:261-265) already calls them internally; scripts/searches/mle.py:232-235 in the same workspace says the opposite. NUTS was verified to run without them on 2026-09-10. Fix the two error strings and the mcmc.py prose (the workspace half lands in autofit_workspace). + +## Re-scoped 2026-11-05 — what is left (draft-queue sweep) + +- **Done:** Library advice removed: PyAutoFit now has `enable_pytrees` only in jax/pytrees.py, jax/__init__.py and fitness.py, not in the blackjax nuts/smc searches (commit not pinned). +- **Remaining:** autofit_workspace `scripts/searches/mcmc.py` (and its notebook) still teaches `enable_pytrees()` / `register_model` — fix the workspace leg. + +_Evidence from the 2026-11-05 read-only sweep (Mind ledger + GitHub search); remaining items are the live scope of this prompt._ diff --git a/draft/bug/autolens/runtime_single_jit_median_reach_and_a100_witness.md b/draft/bug/autolens/runtime_single_jit_median_reach_and_a100_witness.md index 8a4ca2b4d..0fb7b4b2f 100644 --- a/draft/bug/autolens/runtime_single_jit_median_reach_and_a100_witness.md +++ b/draft/bug/autolens/runtime_single_jit_median_reach_and_a100_witness.md @@ -31,3 +31,10 @@ Contract: PyAutoPulse `tasks/runtime_cell_single_jit_gpu_warmup.md`. beside the unchanged `full_pipeline_single_jit`. Do not re-base committed rows. Do step 2 only once step 1 confirms the median removes the post-compile transient. + +## Re-scoped 2026-11-05 — what is left (draft-queue sweep) + +- **Done:** Step 2 "Reach": autolens_profiling#408 (2026-10-09, record `complete/2026/10/timing-noise-audit-p6-median-headline-gpu-marker.md`) — 11 runtime cells write `_median_ms/_p10/_p90`. +- **Remaining:** Step 1 only: the A100 witness — no committed row carries a median yet (per that record). + +_Evidence from the 2026-11-05 read-only sweep (Mind ledger + GitHub search); remaining items are the live scope of this prompt._ diff --git a/draft/bug/autolens_profiling/gradient_json_point_label_standard_cells.md b/draft/bug/autolens_profiling/gradient_json_point_label_standard_cells.md deleted file mode 100644 index 44b0fc4f4..000000000 --- a/draft/bug/autolens_profiling/gradient_json_point_label_standard_cells.md +++ /dev/null @@ -1,21 +0,0 @@ -# Standard-size gradient cells record `"point": "prior_medians"` while evaluating at iid draw 0 - -Type: bug -Target: autolens_profiling -Repos: -- autolens_profiling -Themes: -- jax-gradient -Difficulty: easy -Autonomy: supervised -Priority: medium -Status: formalised -Consequence: glance -Witness: every standard-size driver passes the real evaluation point to `harness.run_gradient(point=...)` (as `galaxy_group_standard.py` does), the stored `results/**/gradient.json` `point` fields of standard-size cells read "iid draw 0 of the seeded sequence", and `gradient_witness.py --check` / `build_catalogue.py --check` stay green -Review-minutes: 3 -Unattended: ready -Filed: 2026-11-02 - -Found in autolens_profiling#515 (research note `wiki/research/gradient_campaign_impact_border_tie.md`). The imaging (`standard_jax_cell` path in `scripts/imaging/*/likelihood_runtime.py`), interferometer (`likelihood_breakdown/interferometer_standard.py`), datacube (`datacube_standard.py`) and multi_dataset (`multi_dataset_standard.py`) standard drivers call `run_gradient(...)` without `point=`, so the harness default label `prior_medians` is written although the instance is `iid_instances(...)[0]`. Only `galaxy_group_standard.py` passes `point="iid draw 0 of the seeded sequence"`. - -The wrong label made the PyAutoArray#671 defects (which only bite at the exact prior medians) look like a campaign risk. Fix the drivers, then correct the stored labels in place (label-only edit of the committed records; the values are unaffected) or note the correction where the records are catalogued. diff --git a/draft/bug/autonerves/nautilus_sampler_pin_drifts_from_pyautofit.md b/draft/bug/autonerves/nautilus_sampler_pin_drifts_from_pyautofit.md deleted file mode 100644 index 190c38064..000000000 --- a/draft/bug/autonerves/nautilus_sampler_pin_drifts_from_pyautofit.md +++ /dev/null @@ -1,48 +0,0 @@ -# Colab pins `nautilus-sampler==1.0.4` while PyAutoFit declares `1.0.5` - -Type: bug -Target: PyAutoNerves -Repos: -- PyAutoNerves -Difficulty: trivial -Autonomy: supervised -Priority: normal -Status: formalised -Consequence: notify -Witness: `autonerves/setup_colab.py`'s `nautilus-sampler` specifier matches the one PyAutoFit's `pyproject.toml` declares, checked by a test that reads both rather than hard-coding either version, so the two cannot drift apart again silently. -Review-minutes: 10 -Unattended: ready - -`autonerves/setup_colab.py` pins `nautilus-sampler==1.0.4` in `_SHARED_EXTRAS`: - - "nautilus-sampler==1.0.4", - -while PyAutoFit's `pyproject.toml` (line 85) declares: - - "nautilus-sampler==1.0.5", - -Every other sampler specifier in that list matches autofit exactly — the comment -above `_SHARED_EXTRAS` says outright that "their specifiers track that file" — so -this one looks like drift rather than intent. - -Why it matters: the Colab bootstrap installs with `pip install *packages --no-deps`, -so pip performs no resolution and the pinned 1.0.4 is simply what lands. Every -Colab user of all six `_PROJECTS` entries therefore runs `af.Nautilus` on 1.0.4 -against an autofit that expects 1.0.5. Nothing errors at import, which is exactly -why it went unnoticed. - -Found during PyAutoNerves#165 / #166 (the regression test asserting all three -samplers are installed). That test deliberately matches on requirement NAME with -the specifier split off, so it passes either way and does not catch this. - -Fix direction: decide which version is correct and align the two. Prefer a check -that derives the expected specifier from PyAutoFit's `pyproject.toml` rather than -restating a literal in a second place — restating it is what allowed the drift. -Consider whether the other `_SHARED_EXTRAS` pins deserve the same treatment. - -Type: bug -Target: PyAutoNerves -Difficulty: trivial -Priority: normal - - diff --git a/draft/bug/autonerves/pyautonerves_emits_a_false_workspace_is_stale.md b/draft/bug/autonerves/pyautonerves_emits_a_false_workspace_is_stale.md deleted file mode 100644 index 90e4a4fa1..000000000 --- a/draft/bug/autonerves/pyautonerves_emits_a_false_workspace_is_stale.md +++ /dev/null @@ -1,41 +0,0 @@ -# PyAutoNerves emits a false "workspace is stale, git pull" warning… - -Type: bug -Target: PyAutoNerves -Repos: -- autolens_workspace -- PyAutoNerves -Difficulty: medium -Autonomy: supervised -Priority: normal -Status: formalised -Consequence: judge -Witness: a regression test in PyAutoNerves asserting that `check_version("2026.8.17.1", workspace_root=)` emits no warning - i.e. an installed library arbitrarily newer than the floor is the passing case, not a staleness signal. The existing below-floor case (install older than the floor raises `WorkspaceVersionMismatchError`) must still pass unchanged. -Review-minutes: 20 -Unattended: ready - -PyAutoNerves emits a false "workspace is stale, git pull" warning on an up-to-date main workspace clone. - -Running `python scripts/imaging/start_here.py` from a freshly-pulled autolens_workspace main prints: - - UserWarning: The workspace at .../autolens_workspace records library version 2026.7.9.1, - but the installed library is 2026.8.17.1 - more than 30 days newer. The workspace examples - and configs may lag the installed API. Pull the latest workspace: - cd .../autolens_workspace && git pull origin main - -The workspace IS on latest main (fd80ada0). Pulling again does nothing, so the remedy the warning suggests cannot ever clear it. - -Root cause: `autonerves/workspace.py` (`check_version` / `_stale_workspace_message`) treats `version.minimum_library_version` from `config/general.yaml` as a proxy for how fresh the workspace clone is, and warns when the installed library's date-version is more than `_STALENESS_WINDOW_DAYS` (30) newer than it. But since PyAutoBuild#120 / PyAutoNerves#118 that key is a deliberately-bumped compatibility FLOOR - the oldest library the workspace scripts work against - not a per-release stamp of the clone's age. A workspace whose scripts require no API newer than 2026.7.9.1 keeps that floor indefinitely, so every library release more than 30 days later fires the warning permanently, on an entirely current clone. The floor's age carries no information about clone staleness. - -Fix direction: decouple the staleness signal from the floor. Either drop the staleness branch entirely (the floor already covers the actionable case - an install older than the floor raises `WorkspaceVersionMismatchError`), or derive clone freshness from something that actually tracks it (workspace git commit date, or a separate release-written stamp) and only then suggest a pull. - -Note `autolens_workspace/config/general.yaml` already carries a comment telling main-branch users to set `workspace_version_check: False`. That is a documented workaround for this false positive, not a fix - it disables the whole check, including the floor guard that is genuinely useful. - -Type: bug -Target: PyAutoNerves -Witness: a regression test in PyAutoNerves asserting that `check_version("2026.8.17.1", workspace_root=)` emits no warning - i.e. an installed library arbitrarily newer than the floor is the passing case, not a staleness signal. The existing below-floor case (install older than the floor raises `WorkspaceVersionMismatchError`) must still pass unchanged. - -Difficulty: medium -Priority: normal - - diff --git a/draft/bug/euclid/bundle_sersic_products_read_output_dir_not_sed_output_dir.md b/draft/bug/euclid/bundle_sersic_products_read_output_dir_not_sed_output_dir.md deleted file mode 100644 index 354917a76..000000000 --- a/draft/bug/euclid/bundle_sersic_products_read_output_dir_not_sed_output_dir.md +++ /dev/null @@ -1,47 +0,0 @@ -# Bundle stages 1/5/6 read OUTPUT_DIR, but the SED chain writes sersic_lens_model into SED_OUTPUT_DIR — the Sersic products never appear in a documented bundle build - -Type: bug -Target: euclid -Repos: -- euclid_strong_lens_modeling_pipeline -Themes: -- euclid -- catalogue -Difficulty: small -Autonomy: supervised -Priority: medium -Status: draft -Consequence: glance -Witness: `build_inspection_bundle.sh dr1_sep1` on a tree whose sersic_lens_model results live in output_sed/ yields lens_sersic.csv (9 rows), source_sersic.csv, fit_sersic.png and coolest_sersic.json; today it yields none of them -Review-minutes: 3 -Unattended: ready -Filed: 2026-09-17 - -## Observed - -Seen 2026-09-17 building the `dr1_sep1` bundle in `Science/euclid_dr1` after SLURM array 343381 (the CPU -SED chain, `scripts/sersic_lens_model_waveband.py` under `PYAUTO_OUTPUT_DIR=output_sed`). The chain -writes `sersic_lens_model/vis` (and the bands) into `output_sed///`. `scripts/build_inspection_bundle.sh` -runs stages 1 (`build_inspect.py` → `fit_sersic.png`, `coolest_sersic.json`), 5 (`lens_sersic.py`) and -6 (`source_sersic.py`) against `OUTPUT_DIR` (default `output`), where the Sersic stage never lands, so -the bundle reports "no completed sersic_lens_model/vis results" and ships without `lens_sersic.csv`, -`source_sersic.csv`, `fit_sersic.png` or `coolest_sersic.json`. Run by hand with `--output_path=output_sed`, -`lens_sersic.py` and `source_sersic.py` produce 9 rows each — the fits are fine, only the wiring is wrong. -`euclid_dr1_prelim/inspect/dr1_prelim_grade_ab_342629/` has the identical gap, so this has been silently -true since the prelim run; `catalogue/README.md`'s "Fits the bundle expects" documents exactly this -three-command recipe, so the documented path cannot produce 4 of the 19 bundle files. - -## Ask - -Decide where the Sersic stage canonically lives (the SED chain's `output_sed`, since `sersic_lens_model.py` -run standalone is the exception, not the rule) and make stages 1, 5 and 6 read it from there — e.g. a -`SERSIC_OUTPUT_DIR` defaulting to `SED_OUTPUT_DIR`, or have stages 5/6 fall back to the SED tree when the -main tree has no `sersic_lens_model` results. Update `catalogue/README.md`'s producer table ("Upstream fit -it needs") and the env table, and add a fast test that a tree with `sersic_lens_model` only under the SED -directory still yields the four products (the `tests/test_catalogue_latent_columns.py` result-tree fixture -is the pattern). - -## Evidence - -- `Science/euclid_dr1/wiki/project/2026-09-17-sed-chain-sep1.md` ("Drift" section) and the bundle logs - in the 2026-09-17 session scratchpad. diff --git a/draft/bug/euclid/euclid_dr1_flip_rgb_jpg_upside_down.md b/draft/bug/euclid/euclid_dr1_flip_rgb_jpg_upside_down.md deleted file mode 100644 index 68244c1e4..000000000 --- a/draft/bug/euclid/euclid_dr1_flip_rgb_jpg_upside_down.md +++ /dev/null @@ -1,38 +0,0 @@ -# euclid_dr1: every dataset rgb.jpg is upside down relative to the VIS FITS — flip them all, locally and on RAL - -> **SUPERSEDED 2026-10-30 (human).** The flip ran on 2026-09-20 (`preprocess/flip_rgb.py`, originals kept as -> `rgb_raw.jpg`). User-facing RGBs are now north-up products under -> `draft/research/euclid/sky_orientation_euclid_dr1_and_library.md`. Do not start this task. Leftover: 4 local tiles -> have a flipped `rgb.jpg` but no `rgb_raw.jpg` marker, so a rerun would flip them back. - -Type: bug -Target: euclid -Repos: -- euclid_dr1 (science project, /mnt/c/Users/Jammy/Science/euclid_dr1; RAL /mnt/ral/jnightin/euclid_dr1) -Themes: -- euclid -- hpc -Autonomy: supervised -Witness: for Tile102007000RA0642357198143DECNEG0666711522747, after the flip `plt.imread("rgb.jpg")` shown with `origin="upper"` puts the blue arc top-left and the companion galaxy bottom-left, matching the VIS_BGSUB HDU shown the same way (before the flip the arc is bottom-left). - -## Problem -The `rgb.jpg` in each tile of `dataset/dr1_sep1_rest//` (written 2026-09-20; 101–102 px square, not the 100 px of the FITS) is flipped vertically relative to the VIS/NIR FITS cut-outs. Drawn row 0 at the top, the VIS image and the segmentation binaries match each other but the RGB is mirrored top-to-bottom. There is no left–right mirroring. I found this on 2026-09-24 while building the artefact-fix before/after panels (`scratchpad/artefact_fix_first100/make_panels.py` has to use `rgb[::-1]` to line them up). - -The pipeline reads the file as-is: `util.py:421-456` (`_open_rgb("rgb")` → `al.Array2DRGB`, no flip). So the RGB panel in every vis_lp `image/rgb.png` subplot is upside down relative to the fit panels, and so is the `rgb.png` in the inspect bundles (`scripts/tools/build_inspect.py`). - -## Task -Write a script (e.g. `preprocess/flip_rgb.py`) that flips every dataset `rgb.jpg` vertically, then run it: -1. **Locally** on `dataset/dr1_sep1_rest/` (14,032 tiles) and any other `dataset/` folder with the same problem. Check `q1_walsmley` and the legacy `rgb_0`/`rgb_1` thumbnails against their FITS before deciding whether to include them; don't assume. -2. **On RAL** on `/mnt/ral/jnightin/euclid_dr1/dataset/...`, running the script there over SSH (`euclid_jump`). Don't re-upload: RAL uploads from the laptop run at ~95 KB/s. - -Requirements: -- **Idempotent.** Running it twice must not flip the file back. Record the flip somehow (e.g. a `rgb_flipped` marker file per tile or a manifest), and check the marker, not the image. -- **Lossless where possible.** Re-saving a JPEG with PIL recompresses it. Prefer `jpegtran -flip vertical -perfect` and fall back to a high-quality re-encode only for the tiles where `-perfect` fails (101/102 px isn't a multiple of the MCU size). Alternatively, write a PNG and point `_open_rgb` at it. Say which approach you picked. -- Keep originals recoverable until the flip is verified (e.g. `rgb_raw.jpg`, or a tarball of the originals). -- Check the upstream writer. If whatever produced `rgb.jpg` on 2026-09-20 lives in this repo or the pipeline repo, fix it there too so that newly delivered tiles (the 15 sep1 remainder upload batches) aren't upside down. Otherwise flip them before submission. -- Any in-flight or queued RAL runs read `rgb.jpg` only for the visualisation subplot, so the flip doesn't change any likelihood. Still, don't rewrite files under a running array task's dataset while it's being read. - -## Verification -- The witness above, plus a 3-panel by-eye grid (RGB | VIS | lens+source binary contours) for ~20 random tiles, locally and on RAL. -- Count of flipped / skipped (marker already present) / failed tiles, locally and on RAL. The two totals should match the tile counts. -- Record the result in the euclid_dr1 Cortex ledger. diff --git a/draft/docs/autogalaxy/adapt_image_is_the_s_n_map.md b/draft/docs/autogalaxy/adapt_image_is_the_s_n_map.md index dd229bcaf..bed64a116 100644 --- a/draft/docs/autogalaxy/adapt_image_is_the_s_n_map.md +++ b/draft/docs/autogalaxy/adapt_image_is_the_s_n_map.md @@ -129,3 +129,10 @@ paragraph; the assessment report is attached to the issue with a recommendation. Where it came from: autolens_workspace#521 / PR #522 review, 2026-09-02. + +## Re-scoped 2026-11-05 — what is left (draft-queue sweep) + +- **Done:** Library docstrings: PyAutoGalaxy#644 (merged 2026-10-02). +- **Remaining:** Workspace prose still saying "estimate of the": autolens_workspace `slam_start_here.py`, `multi_galaxy/.../adaptive.py`, subhalo `slam_source_pixelized.py`. + +_Evidence from the 2026-11-05 read-only sweep (Mind ledger + GitHub search); remaining items are the live scope of this prompt._ diff --git a/draft/docs/autolens_assistant/ai_options_page_autolens_leg.md b/draft/docs/autolens_assistant/ai_options_page_autolens_leg.md index 5ae24de12..4e67182e1 100644 --- a/draft/docs/autolens_assistant/ai_options_page_autolens_leg.md +++ b/draft/docs/autolens_assistant/ai_options_page_autolens_leg.md @@ -34,3 +34,10 @@ PyAutoScientist#87 (record `complete/2026/10/assistant-ai-options-page.md`) ship ## Done when README shorter and linking to the shared page; listed legacy gone; wiki-currency and boundary CI green. + +## Re-scoped 2026-11-05 — what is left (draft-queue sweep) + +- **Done:** README rewrite: autolens_assistant#163 (record `complete/2026/10/assistant-readmes-human-style.md`). +- **Remaining:** The legacy deletions (`opencode_cli` refs, `docs/archive/*`) and the AI_OPTIONS.md stub. + +_Evidence from the 2026-11-05 read-only sweep (Mind ledger + GitHub search); remaining items are the live scope of this prompt._ diff --git a/draft/docs/autolens_assistant/cosmos_web_ring_guided_walkthrough_p3_front_doors.md b/draft/docs/autolens_assistant/cosmos_web_ring_guided_walkthrough_p3_front_doors.md index 48887c249..a3f02c4aa 100644 --- a/draft/docs/autolens_assistant/cosmos_web_ring_guided_walkthrough_p3_front_doors.md +++ b/draft/docs/autolens_assistant/cosmos_web_ring_guided_walkthrough_p3_front_doors.md @@ -26,3 +26,10 @@ Depends on phases 1–2. HowToLens tutorial 2 shows the vendored schematic; README/first_prompts open with it; website hand-off file written; PRs open (HowToLens, autolens_assistant). + +## Re-scoped 2026-11-05 — what is left (draft-queue sweep) + +- **Done:** HowToLens `tutorial_2_ray_tracing.py` now uses strong_lens_schematic.png (imgur link gone); autolens_assistant README opens with the schematic. +- **Remaining:** The website hand-off (`docs/archive/website_cosmos_web_ring_section.md` 404s) and a re-check of first_prompts.md. + +_Evidence from the 2026-11-05 read-only sweep (Mind ledger + GitHub search); remaining items are the live scope of this prompt._ diff --git a/draft/docs/workspaces/assistants_regime_extension.md b/draft/docs/workspaces/assistants_regime_extension.md index 4da19dec8..d8b59ddc8 100644 --- a/draft/docs/workspaces/assistants_regime_extension.md +++ b/draft/docs/workspaces/assistants_regime_extension.md @@ -79,3 +79,10 @@ cluster_regime_narrative, autogalaxy packages. The workspace/docs core shipped 2026-07-25 (autolens_workspace#346 + companions), so the autolens_assistant leg is now unblocked; the autogalaxy-side leg still waits on the autogalaxy packages. + +## Re-scoped 2026-11-05 — what is left (draft-queue sweep) + +- **Done:** autolens leg: autolens_assistant#91. +- **Remaining:** The autogalaxy_assistant leg (no multi_galaxy in its wiki/). + +_Evidence from the 2026-11-05 read-only sweep (Mind ledger + GitHub search); remaining items are the live scope of this prompt._ diff --git a/draft/feature/autoarray/interferometer_numba_gate_retune_70.md b/draft/feature/autoarray/interferometer_numba_gate_retune_70.md deleted file mode 100644 index e1b0d8014..000000000 --- a/draft/feature/autoarray/interferometer_numba_gate_retune_70.md +++ /dev/null @@ -1,55 +0,0 @@ -# Retune the interferometer numba gate 60 → 70 (in-situ crossover, autolens_profiling#332) - -Type: feature -Target: autoarray -Repos: -- PyAutoArray -- autolens_profiling -Themes: -- interferometer -- numba-cpu -- config -Difficulty: small -Autonomy: supervised -Priority: low -Status: draft -Consequence: glance -Witness: with `interferometer_numba_nnz_per_source_max: 70.0`, the factory routes to the faster arm at every measured RAL CPU cell of autolens_profiling#332 (sma / alma r2.0-6.0 / alma_high, both meshes) plus two new in-band cells (alma rect r4.6, nnz ≈ 70; alma Delaunay r5.4, nnz ≈ 66), each measured numba vs NumPy FFT on the #332 harness. -Review-minutes: 6 -Lane: local-dev -Epic: interferometer-likelihood-campaign -Filed: 2026-09-27 - -## Context - -The packaged gate is one number for both meshes: PyAutoArray `autoarray/config/general.yaml:21` -(`interferometer_numba_nnz_per_source_max: 60.0`), read at -`autoarray/inversion/inversion/factory.py:284` in `_use_interferometer_numba`. Its comment quotes -"~60 (Delaunay) and ~77 (rectangular)" from #226 (prototype pack, three fiducials). - -The in-situ library-dispatch sweep in autolens_profiling#332 -(`results/notes/interferometer_mesh_cpu_breakdown_2026_09.md`) measured the numba / NumPy FFT -full-call ratio across alma mask radii. It brackets the crossover at **nnz/col ≈ 66–67 -(Delaunay: 55.6 → 0.886, 81.4 → 1.169)** and **≈ 72–73 (rect: 59.7 → 0.749, 82.7 → 1.225)**. - -- **Gate 60.** Rect cells with nnz 60–72 run the FFT route, up to 1.33× slower than numba. - Delaunay cells at 60–66 are up to 1.08× slower. -- **Gate 70.** The worst mis-route is ≤ 1.03× (Delaunay 66–70) and ≤ 1.07× (rect 70–72). -- Every *measured* cell routes correctly at both 60 and 70. The move rests on interpolation, so - the witness adds measured in-band cells first. - -## What - -1. autolens_profiling: two RAL CPU rows on the #332 harness - (`scripts/interferometer/likelihood_breakdown/{pixelization,delaunay}_numba.py --mask-radius`) - at alma rect r4.6 and alma Delaunay r5.4. Confirm the predicted nnz/col and the ratio side. -2. PyAutoArray: set `general.yaml:21` to 70.0 and re-quote its comment to "in situ ≈ 66 - (Delaunay) / ≈ 72 (rectangular), autolens_profiling#332". Mention that the crossover drifts up - with the extent (alma_high extrapolates to ≈ 80). Update the docstrings that quote 60 / 77: - `inversion_interferometer_numba_util.py` `nnz_per_source_column_from` and - `interferometer_numba/sparse.py` class docstring. -3. Any unit test pinning 60.0 as the default. - -## Out of scope - -A per-mesh or per-extent gate (the data does not yet justify a second number). GPU routing. diff --git a/draft/feature/autofit/search_seed_reproducibility.md b/draft/feature/autofit/search_seed_reproducibility.md deleted file mode 100644 index 5dd4a061f..000000000 --- a/draft/feature/autofit/search_seed_reproducibility.md +++ /dev/null @@ -1,90 +0,0 @@ -# Give PyAutoFit searches a `seed` — today no search can be made reproducible - -Type: feature -Target: autofit -Repos: -- PyAutoFit -Themes: -- samplers -Difficulty: medium -Autonomy: safe -Priority: medium -Status: formalised -Consequence: glance -Witness: A search constructed with a fixed `seed` produces bit-identical `samples` across two runs and across two processes (dynesty first); with `seed` unset no existing search's identifier or output changes (identifier pinned in a test); the `seed_search_randomness` fixture in `test_autofit/interpolator/test_covariance.py` no longer monkeypatches `dynesty.dynesty`. -Review-minutes: 3 -Unattended: ready -Issue: (none yet) -Filed: 2026-08-05 (backfilled from git) - -## The gap - -There is no supported way to make a PyAutoFit search reproducible. A search's -randomness comes from three places, and the caller can reach none of them: - -1. **The sampler's own generator.** `DynestyStatic.search_internal_from` builds - `dynesty.NestedSampler(...)` and splats `**self.search_kwargs` - (`autofit/non_linear/search/nest/dynesty/search/abstract.py:157`). That - property is a **closed dict** of eleven fixed keys — `bound`, `sample`, - `walks`, … — so an extra kwarg cannot be threaded through it. `dynesty` - itself *does* accept `rstate`, and defaults it to - `np.random.Generator(PCG64(None))` — OS entropy - (`dynesty/dynesty.py:607-608`, `814`). So the one knob that would fix this - exists in the dependency and is unreachable from PyAutoFit. -2. **The initializer.** `autofit/non_linear/initializer.py:301` draws initial - unit values with the stdlib `random.uniform`, i.e. off the process-global - `random` module rather than a search-owned generator. -3. **`numpy.random`**, wherever callers or model code touch the legacy global. - -Seeding any one of these leaves the other two free. - -## Why it matters - -This is the *root* cause behind -`complete/…/covariance_interpolator_test_unseeded_rng.md` -(PyAutoFit#1450) — the flake that killed the **2026.8.2.1 live release**. That -fix had to seed all three sources from a test fixture, and to reach (1) at all -it **monkeypatches `dynesty.dynesty.get_random_generator`** — reaching into a -third-party module's namespace from a test, which is exactly the kind of thing -that breaks silently on a dependency upgrade. - -Two consequences beyond that one test: - -- **Any** test that runs a real search is unseedable by construction, so the - same flake class can reappear anywhere in the suite. `test_single_variable` - in that same file was already flaking at 3.6% on source (1) alone, with no - random call of its own. -- **Users cannot reproduce a fit.** Re-running the same model on the same data - gives a different chain. For a scientific inference library that is a real - gap, not only a test-hygiene one. - -## Proposed work - -1. Add a `seed` parameter to the search classes (`AbstractSearch`, honoured by - the dynesty searches first), defaulting to `None` = today's behaviour, so - this is additive and no existing fit changes. -2. When `seed` is set, derive and pass `rstate` into the dynesty sampler — - either by adding `rstate` to `search_kwargs` or by giving subclasses a hook - to extend it. Check `DynamicNestedSampler` takes the same route. -3. Give the initializer a generator seeded from the same `seed`, instead of the - global `random` module. -4. **Check the identifier and serialization surface before committing to the - shape.** PyAutoFit hashes search configuration into run identifiers - (`__identifier_fields__`) and writes search config to JSON/the database. A - `np.random.Generator` is not JSON-serializable, so store the integer seed, - not a generator object, and decide deliberately whether `seed` belongs in - `__identifier_fields__` — including it changes identifiers for existing - runs, which is the trap PyAutoGalaxy#549 was careful about. -5. Once it exists, simplify the `seed_search_randomness` fixture in - `test_autofit/interpolator/test_covariance.py` to use it and drop the - `dynesty.dynesty` monkeypatch. -6. Consider extending to the other samplers (emcee/zeus already take a seed - concept; nautilus and the MLE searches need checking) — but land dynesty - first rather than blocking on full coverage. - -## Exit criteria - -A search constructed with a fixed `seed` produces a bit-identical result across -repeated runs and across processes; no existing search's identifier or output -changes when `seed` is left unset; the interpolator test fixture no longer -monkeypatches a third-party module. diff --git a/draft/feature/autogalaxy/ell_comps_joint_disk_constraint.md b/draft/feature/autogalaxy/ell_comps_joint_disk_constraint.md deleted file mode 100644 index e18838df5..000000000 --- a/draft/feature/autogalaxy/ell_comps_joint_disk_constraint.md +++ /dev/null @@ -1,109 +0,0 @@ -# A joint unit-disk constraint (or reparameterisation) for `ell_comps` - -Type: feature -Target: autogalaxy -Repos: -- PyAutoGalaxy -- PyAutoFit -Themes: -- jax-gradient -- samplers -Difficulty: medium -Autonomy: supervised -Priority: normal -Status: draft -Consequence: judge -Review-minutes: 20 -Unattended: needs-slicing -Filed: 2026-09-01 -Issue: https://github.com/PyAutoLabs/PyAutoGalaxy/issues/594 (opened 2026-09-01 as a Cortex gate ref; reuse in start_dev — never open a second) - -Note 2026-09-04: `autolens_profiling/results/notes/inference/PROGRAMME.md` was frozen/retired on 2026-09-04, so the W10 measurement quoted below is cited as **history**, not as a live programme item; and PyAutoGalaxy#594 was opened as a Cortex gate ref for an epic that no longer exists — it is now simply this prompt's own issue, so reuse it in `start_dev` and never open a second. - -## The question - -`ell_comps` is a two-component elliptical parameterisation whose physical domain -is the **unit disk** (|e| ≤ 1), but it is priored and clipped as a **per-component -box**. The box is not the disk, and the corner of the box is where gradient -searches go to die. Should PyAutoGalaxy (with PyAutoFit's prior/clipper -machinery) offer a **joint disk constraint** on the pair, or a -**reparameterisation** whose whole domain is physical? This is a library -question and is deliberately filed as a Mind prompt rather than implemented in -the profiling repo. - -## The measurement that motivates it - -From the JAX inference programme ledger -(`autolens_profiling/results/notes/inference/PROGRAMME.md`, work item **W10**): - -> Non-physical `ell_comps`: 1,252/6,240 gradient-lane best points sit outside the -> unit disk (20.1 %; 31.5 % of final points), max |e| = 1.41421 = the box corner. -> The per-component `ell_comps` box admits 21.5 % non-physical volume, -> `validate_ell_comps` is silent on JAX tracers, and the clipper is faithful to -> the wrong box — so lanes settle there, and it is both the Phase-4 degradation -> channel and the Phase 8B crash channel. A joint disk constraint / -> reparameterisation is a library question — filed as PyAutoMind draft -> `feature/autogalaxy/ell_comps_joint_disk_constraint.md`, NOT implemented here - -Four facts inside that, each independently actionable: - -1. **20.1 % of gradient-lane best points are non-physical** (1,252 of 6,240), and - 31.5 % of *final* points are. `max |e| = 1.41421` is √2 — exactly the box - corner, which is the signature of the box, not of the data. -2. **The box admits 21.5 % non-physical volume.** The measured 20.1 % is very - close to what you would get by sampling the box uniformly, so the lanes are - not being pushed there by the likelihood — the parameterisation simply lets - them go there. -3. **`validate_ell_comps` is silent on JAX tracers.** The existing guard does not - fire under `jit`/`grad`, so nothing catches it in the gradient path. -4. **The clipper is faithful to the wrong box.** `ClipperPriorBoxJoint` does what - it is asked; what it is asked for is the box. - -The same corner shows up in the Phase 8B log-coordinate bijector A/B (same -ledger, "Phase 8B log-coordinate bijector A/B (W5)" row): - -> **23 of 39 best points are non-physical (59 %), clustered at the |e|=1.41421 box -> corner** — a property of the pixelized cells' box-clipped `ell_comps` geometry -> (W10), not of the bijector. - -At 59 % this is the majority of a completed 39-arm campaign, and it forced a -reading caveat on the whole verdict. - -## The crash channel — PyAutoFit#1535 - -The failure is not only a quality problem. In the same 8B campaign, **six -finished arms crashed at results-write on out-of-unit-disk `ell_comps`** -(PyAutoFit#1535) and had to be rebuilt offline from `search_internal.dill`. So a -box-legal, disk-illegal best point costs an A100 arm outright: the search -completes, and the write fails. Any fix should say what happens to that channel. - -## What a good answer looks like - -Not a decision made here — the point of the prompt is to ask the library the -question with the evidence attached. Plausible shapes, in rough order of -invasiveness: - -- **A joint prior/clipper constraint** on the `ell_comps` pair, so the sampled - region *is* the disk. Needs a form the gradient path can honour (differentiable, - tracer-safe) rather than a post-hoc rejection. -- **A reparameterisation** whose full domain maps into the disk (e.g. a magnitude - bounded by construction with a free angle), so no constraint is needed at all — - at the cost of a coordinate change that every downstream consumer of `ell_comps` - and every existing prior config has to be checked against. -- **A tracer-safe `validate_ell_comps`** as the minimum, so the condition is at - least detectable under `jit`/`grad` even if the geometry is unchanged. - -Whatever is chosen must be evaluated on the gradient lanes, not only on -nested-sampling runs: the 20.1 % is a *gradient-lane* number, and the whole -motivation is that gradient searches settle in the corner. - -## Acceptance - -- A decision recorded with reasons: joint constraint, reparameterisation, or - neither with a stated alternative. -- Whatever lands is exercised under JAX `jit`/`grad`, with evidence that the - non-physical fraction moves (the 20.1 % / 59 % numbers are the before). -- The PyAutoFit#1535 results-write crash channel is explicitly addressed — - fixed, or stated to be out of scope with the reason. -- Backward compatibility of existing `ell_comps` priors and configs is stated, - not assumed. diff --git a/draft/feature/autolens/cluster_fit_visualizer_cluster_wide_model_fit.md b/draft/feature/autolens/cluster_fit_visualizer_cluster_wide_model_fit.md index ecd1de636..468574ec6 100644 --- a/draft/feature/autolens/cluster_fit_visualizer_cluster_wide_model_fit.md +++ b/draft/feature/autolens/cluster_fit_visualizer_cluster_wide_model_fit.md @@ -80,3 +80,10 @@ visualizer, so model-fit output never uses it. at cluster scale. + +## Re-scoped 2026-11-05 — what is left (draft-queue sweep) + +- **Done:** Multi-source cluster fit.png and fit_per_image.png written in a real search.fit: PyAutoLens#794, record `complete/2026/10/cluster-point-figures.md`. +- **Remaining:** The Witness's `cluster_fit_overlay.png`; the defaults audit; Include2D. (Per-system zooms were dropped by design.) + +_Evidence from the 2026-11-05 read-only sweep (Mind ledger + GitHub search); remaining items are the live scope of this prompt._ diff --git a/draft/feature/autolens/magnification_maps_visualization.md b/draft/feature/autolens/magnification_maps_visualization.md index 6d4c37d95..f1df5381f 100644 --- a/draft/feature/autolens/magnification_maps_visualization.md +++ b/draft/feature/autolens/magnification_maps_visualization.md @@ -65,3 +65,10 @@ Work: 8a SHIPPED 2026-11-02 (record `complete/2026/11/magnification-maps-image-plane.md`; Galaxy#690, Lens#815, ws#614) → 8b SHIPPED 2026-11-02 (record `complete/2026/11/magnification-maps-source-plane.md`; Array#674, Galaxy#691, Lens#816, ws#615) → 8c SHIPPED 2026-11-02 (record `complete/2026/11/magnification-maps-uncertainty.md`; Galaxy#693, Lens#817, ws#616) → 8d `magnification_maps_8d_wiring_pretty.md`. One at a time via /start_dev. + +## Re-scoped 2026-11-05 — what is left (draft-queue sweep) + +- **Done:** 8a (PyAutoGalaxy#690, PyAutoLens#815, autolens_workspace#614), 8b (PyAutoArray#674, PyAutoGalaxy#691, PyAutoLens#816), 8c (PyAutoGalaxy#693, PyAutoLens#817, autolens_workspace#616). +- **Remaining:** 8d (wiring + "pretty" pass) only, already issued as `active/magnification_maps_8d_wiring_pretty.md`. Close this draft when 8d ships. + +_Evidence from the 2026-11-05 read-only sweep (Mind ledger + GitHub search); remaining items are the live scope of this prompt._ diff --git a/draft/feature/autolens/point_magnification_api.md b/draft/feature/autolens/point_magnification_api.md deleted file mode 100644 index f478f5042..000000000 --- a/draft/feature/autolens/point_magnification_api.md +++ /dev/null @@ -1,65 +0,0 @@ -# Magnification at a point: surface the existing API in source_science + point package, extend to multi-plane - -Type: feature -Target: PyAutoLens -Repos: -- PyAutoLens -Themes: -- cluster -- point-source -Difficulty: large -Autonomy: supervised -Priority: high -Status: formalised -Consequence: glance -Witness: Every `source_science.py` (both tiers) carries a worked mu-at-a-point example (a chosen (y,x) and each multiple-image position) via `LensCalc.magnification_2d_via_hessian_from`; the point `Result`/dataset surface exposes per-image magnifications with the parity decision (signed or |mu|) documented; the multi-plane example's mu for a source at a given `plane_redshift` equals `LensCalc.from_tracer(..., plane_j=j)` directly; and the stale `Tracer.magnification_2d_from` claim in `cluster/likelihood_function.py` is gone. -Review-minutes: 3 -Unattended: ready -Epic: cluster-strong-lensing -Phase: 5 -Parent: draft/feature/autolens/source_cluster_arc.md -Filed: 2026-08-19 (backfilled from git) - -Part of the Source & Cluster arc (phase 5 of 12). User request (verbatim): "Ability to -get Magnification at a point in source science scripts, important for clusters and then -extend to multi plane for clusters. It is common for lens modeling codes to give the -magnification at a point in the image plane. PyAutoLens may do that but its not -documented clearly, and should be in all source_science.py examples and the point source -package." - -Audit answer: PyAutoLens DOES do it, in three places, none documented in source_science: -- `LensCalc.magnification_2d_via_hessian_from(grid, xp)` (lens_calc.py:624) — arbitrary - (y,x) points, ArrayIrregular, JAX-viable; multi-plane via - `LensCalc.from_tracer(..., use_multi_plane=True, plane_j=j)`. -- `magnifications_at_positions` on the point fit (point/fit/abstract.py:111) — per-image, - multi-plane aware. But it applies `abs()` (:140) — **parity/sign is discarded at every - consumer** in the stack; decide whether to expose signed magnification (parity is - physical: image parities are standard cluster-lensing observables). -- The only closed-form profile magnification is dPIE - (dual_pseudo_isothermal_mass.py:446,779). - -Science anchor (LEGGOS II, arXiv:2606.20804): point magnification for a clump is the -magnification-map value at the pixel containing the clump centroid; per-clump errors -come from evaluating the same pixel across posterior-draw models (phase 7 handles the -draws; this phase makes the point evaluation a first-class documented call). - -Work: -1. Document magnification-at-a-point in every source_science.py (both tiers) with a - worked example: μ at chosen (y,x), μ at the positions of each multiple image. -2. Point package: expose per-image magnifications on the point Result/dataset surface - (today magnification exists only on the fit; the dataset has no magnification - attribute), and document the parity decision. -3. Multi-plane: worked example for cluster use — μ at a point for a source at given - plane_redshift (per-source LensCalc plane_j); note the #678 trap (final-plane - default). -4. Fix the stale doc claim `Tracer.magnification_2d_from` in - cluster/likelihood_function.py:387 (no such method — calls route through LensCalc). - - - -## Solver boundary — approved 2026-10-01 - -Magnification at supplied/observed coordinates and explicit source redshift can -proceed independently of forward PointSolver repairs. Do not silently substitute -solver-discovered coordinates in these examples; any such path must satisfy its -workload's accuracy/coverage/overflow checks from the separate solver programme. diff --git a/draft/feature/autolens_jax_joss/autolens_jax_joss_benchmark_repo.md b/draft/feature/autolens_jax_joss/autolens_jax_joss_benchmark_repo.md deleted file mode 100644 index 19a920ed6..000000000 --- a/draft/feature/autolens_jax_joss/autolens_jax_joss_benchmark_repo.md +++ /dev/null @@ -1,104 +0,0 @@ -# autolens_jax_joss benchmark repo + real-data start_here pairing - -Type: feature -Target: autolens_workspace -Repos: -- autolens_jax_joss (new repo) -- autolens_workspace -Themes: -- profiling -- notebooks -- hpc-gpu -Difficulty: too-large -Autonomy: supervised -Priority: normal -Status: formalised -Consequence: judge -Review-minutes: 25 -Unattended: needs-slicing -Filed: 2026-07-16 (backfilled from git) - -Create a repo autolens_jax_joss which provides examples to run each JAX benchmark from the PyAutoLens-JAX paper draft and reports the run time and info. These benchmarks currently do not exist. - -Single-dataset and single-regime benchmarks (establish GPU acceleration and autodiff across lensing scales and data types): - -- Galaxy-scale CCD imaging: Model JWST COSMOS-Web Ring F150W imaging, including lens-light subtraction and a pixelized source reconstruction, in approximately five minutes. -- Interferometry: Model a real ALMA strong-lensing dataset containing more than one million interferometer visibilities in approximately five minutes. -- Point-source lensing: Model a real multiply imaged quasar or supernova using point-source observables, including image positions and, where available, time delays or flux information, in under five minutes. -- Group-scale strong lensing: Model a real group-scale lens containing multiple deflecting galaxies in under five minutes, demonstrating that PyAutoLens-JAX is not restricted to isolated galaxy-scale lenses. -- Cluster-scale strong lensing: Model a real cluster lens with multiple mass components, multiple images, and potentially multiple source planes in under five minutes. -- Weak lensing: Fit a weak-lensing shear catalogue using a differentiable JAX likelihood in under five minutes, demonstrating that PyAutoLens-JAX is not restricted to strong-lensing data. - -Joint and multi-dataset benchmarks (different datasets, lensing regimes, and physical scales combined in a single differentiable, GPU-accelerated probabilistic model): - -- Multi-band imaging: Jointly model the four available JWST COSMOS-Web Ring bands, constraining a common lens mass model while fitting the wavelength-dependent lens and source emission in each dataset. -- Joint strong and weak lensing: Constrain a single group- or cluster-scale mass model using both strong-lensing and weak-lensing observables. -- Imaging and point-source lensing: Jointly model extended arcs and point-source constraints from a lensed quasar or supernova within the same lens model. -- Imaging and interferometry: Jointly fit optical or infrared imaging and radio or submillimetre interferometer visibilities, constraining a common mass model using complementary observations of the lensed source. - -Pairing requirement: pair each benchmark to the start_here.py file in each autolens_workspace package. For example the JWST COSMOS-Web Ring F150W example, which is made fast, is paired to autolens_workspace/scripts/imaging/start_here.py. All 6 single-dataset start_here.py examples should use real data, and each JOSS example should use the same real data. - -The four multi examples pair to examples in autolens_workspace/scripts/multi or scripts/weak/features/strong_lensing. A new multi script will likely be needed for the imaging + point-source lensing joint-modelling benchmark. - - - ---- - -## PARKED 2026-07-28 — resume state (moved out of `active.md`) - -Parked by user request during a `/repo_cleanup` sweep ("we will come back to JOSS -benchmarks later"). The `active.md` registry entry was removed; this section is -the authoritative resume context. Issue: - -**Status at park:** `#282 MERGED+cleaned`; 8/8 runnable A100 rows committed -(`autolens_jax_joss@64204f6`). - -**Worktree:** `~/Code/PyAutoLabs-wt/jax-joss-benchmarks` **no longer exists on -disk** — recreate it (`start_workspace`) before resuming. Autonomy: supervised. -New repo `autolens_jax_joss` (PyAutoLabs, public) was born alongside this task. -Datasets SDP.81 / RXJ1131 / A2744 are user-approved. 5-phase epic, one-shot -attempt per user. - -**SDP.81 prep** = detached RAL job `330608`. (Job `330605` diagnosed: an empty -leftover `extracted/` skipped the untar — fixed via a `test -d` guard; `casatools` -import needs `~/.casa/data` — also fixed. The 42GB tarball is CACHED, so no -re-download.) Pipeline: 45GB ALMA Band6 download -> casatools venv -> 3-level -export -> installs `dataset/interferometer/{sdp81,sdp81_mid,sdp81_full}` under -`/mnt/ral/jnightin/autolens_jax_joss`. - -**RESUME (short session):** - -1. Check `/mnt/ral/jnightin/sdp81_prep_330608.log` — expect `SDP81 PREP ALL DONE` - plus per-level visibility counts. Failure modes: casatools pip wheel on py3.12 - (fallback = monolithic CASA tarball), datacolumn, `MS_LIST` empty (check the - find patterns). -2. `sbatch` the interferometry benchmarks on A100: `benchmarks/interferometer.py` - at `--nvis` default/mid/full, plus `benchmarks/imaging_and_interferometer.py` - (pattern: `/mnt/ral/jnightin/autolens_jax_joss/run_rest.sbatch`). -3. `scp results/*.json` back, regenerate `RESULTS.md`, commit — **guard: commit - explicit file paths only**. -4. Copy the small `sdp81/` product locally and rewrite - `scripts/interferometer/start_here.py` on a NEW branch (`start_workspace`; - #282 is merged) using it. Decide hosting: commit few-MB FITS to the workspace - with a `.gitignore` allowlist + `git add -f`, or Zenodo + `SDP81_URL`. -5. Final issue #281 update. - -**Also pending:** cluster-tuning prompt -`draft/feature/autolens_workspace/joss_cluster_benchmark_tuning.md`; weak JAX-viz -`PyAutoLens#614`. - -## Update 2026-09-18 — likely shipped; needs reconcile, not deletion - -`PyAutoLabs/autolens_jax_joss` **now exists on GitHub** at `6bce65e` with benchmark -scripts under `benchmarks/`, committed `results/*.json` and a `RESULTS.md`; its last -science commit reads "complete first A100 sweep — 8 benchmarks + imaging Nautilus -comparison". So the core of this prompt appears **delivered**. - -Its **local checkout was removed** 2026-09-18 (PyAutoBrain#389) as dead weight — the -remote is untouched and remains the citable artefact behind the JOSS paper. - -This prompt was NOT retired, because "shipped" was not verified: confirm which of the -listed benchmarks (galaxy-scale, interferometry, point-source, group, cluster, weak) -actually exist, and whether the paired `autolens_workspace` `start_here` examples -landed, then retire to `complete/` per the intake reconcile procedure. Verification -now needs a clone or the GitHub UI rather than a local checkout. diff --git a/draft/feature/autolens_visualization/eyes_cluster_visualization_group_render_every_cl.md b/draft/feature/autolens_visualization/eyes_cluster_visualization_group_render_every_cl.md index 4d8c5ecf0..2fbcdbbb6 100644 --- a/draft/feature/autolens_visualization/eyes_cluster_visualization_group_render_every_cl.md +++ b/draft/feature/autolens_visualization/eyes_cluster_visualization_group_render_every_cl.md @@ -56,3 +56,10 @@ cluster scale; the Eyes review loop is where that gets caught and routed back as cluster figures after its next render; the human reviews them through `/eyes`. + +## Re-scoped 2026-11-05 — what is left (draft-queue sweep) + +- **Done:** Cluster producers and cluster point figures render: autolens_visualization#5, #14, #15 (merged 2026-10-21/22). +- **Remaining:** The A2744 zooms and the `viz_manifest` cluster rows the Witness names — nothing else. This is a high-priority dashboard pick; size it against this remainder, not the original scope. + +_Evidence from the 2026-11-05 read-only sweep (Mind ledger + GitHub search); remaining items are the live scope of this prompt._ diff --git a/draft/feature/euclid/catalogue_extension_coolest_mass_fits.md b/draft/feature/euclid/catalogue_extension_coolest_mass_fits.md index b8d585f15..9b355d9f2 100644 --- a/draft/feature/euclid/catalogue_extension_coolest_mass_fits.md +++ b/draft/feature/euclid/catalogue_extension_coolest_mass_fits.md @@ -118,3 +118,10 @@ FITS, even if by a one-off script that is not promoted to permanent infrastructu - The retroactive-update question has an explicit recommendation, whichever way it falls. - Magnification maps in the FITS product should carry phase 6b's trust caveat if that phase found the estimates unreliable. + +## Re-scoped 2026-11-05 — what is left (draft-queue sweep) + +- **Done:** Mass FITS and the retroactive-update verdict: pipeline PR #81 + PyAutoFit#1633, record `complete/2026/09/catalogue-mass-maps-fits.md`. +- **Remaining:** The COOLEST per-lens .csv and the magnification plane. + +_Evidence from the 2026-11-05 read-only sweep (Mind ledger + GitHub search); remaining items are the live scope of this prompt._ diff --git a/draft/feature/pyautobroca/broca_communication_pilot.md b/draft/feature/pyautobroca/broca_communication_pilot.md index ad54bfbc2..950fc928b 100644 --- a/draft/feature/pyautobroca/broca_communication_pilot.md +++ b/draft/feature/pyautobroca/broca_communication_pilot.md @@ -32,3 +32,10 @@ mapped skills that no longer exist, max per-notebook context size vs the 20k cap (mapping commit older than the newest skill or workspace-folder change) — and show a "refresh needed" action pointing at the assistant's `*_refresh_colab_contexts` maintainer skill. The AI scan itself lives in each assistant. + +## Re-scoped 2026-11-05 — what is left (draft-queue sweep) + +- **Done:** Presentation slice: record `complete/2026/10/broca-communication-resource-dropdowns.md` (PyAutoHeart#295, PyAutoBroca#7, PyAutoScientist#66). +- **Remaining:** Evidence ingestion. + +_Evidence from the 2026-11-05 read-only sweep (Mind ledger + GitHub search); remaining items are the live scope of this prompt._ diff --git a/draft/feature/pyautoears/community_organ_birth.md b/draft/feature/pyautoears/community_organ_birth.md index 6c63d0cef..4f58b0715 100644 --- a/draft/feature/pyautoears/community_organ_birth.md +++ b/draft/feature/pyautoears/community_organ_birth.md @@ -249,3 +249,10 @@ phase: phase4 assistant distribution of /feedback. Phases5–6 remain unissued. Production witness: Ears board run37137496430 succeeded; published snapshot generated 2026-10-03T16:37:04.144623+00:00 contains 13 conversations. Discussion hub receipt is complete. Only euclid_assistant remains unavailable. + +## Re-scoped 2026-11-05 — what is left (draft-queue sweep) + +- **Done:** Bootstrap and feedback slices: records `complete/2026/10/ears-bootstrap.md`, `community-feedback.md` (both say the programme is not complete). +- **Remaining:** The remaining programme items those records list as open. + +_Evidence from the 2026-11-05 read-only sweep (Mind ledger + GitHub search); remaining items are the live scope of this prompt._ diff --git a/draft/feature/pyautoeyes/group_cluster_gallery.md b/draft/feature/pyautoeyes/group_cluster_gallery.md deleted file mode 100644 index 9f7c50fc7..000000000 --- a/draft/feature/pyautoeyes/group_cluster_gallery.md +++ /dev/null @@ -1,33 +0,0 @@ -# autolens_visualization: group and cluster galleries (point-source + extended) - -Type: feature -Target: autolens_visualization -Repos: -- autolens_visualization -Themes: -- visualization -Difficulty: large -Autonomy: supervised -Priority: normal -Epic: pyautoeyes-birth -Phase: 7 -Status: draft — follows pyautoeyes-birth phase 1a and the multi-galaxy gallery; retargeted from the retired autolens-visualization epic (PyAutoMind#436), then to the `autolens_visualization` project repo under the 2026-09-28 layered design -Filed: 2026-09-25 - -Extend the permanent gallery to group- and cluster-scale lenses, for both -point-source and extended-source modelling: - -- tracked group and cluster datasets (point-source positions/fluxes and - extended imaging), each with a simulator under `scripts/misc/simulators/`; -- flat producers `scripts/group/visualization.py` and - `scripts/cluster/visualization.py` rendering every visualizer output the - corresponding fit writes (point-source `FitPositions`/flux figures and the - extended-source imaging figures), into `scripts//images/visualization/`; -- gallery rebuild, `GALLERY.md` sections, lint/render workflow coverage. - -Reference producers: `autolens_workspace_test/scripts/cluster/visualization.py` -and `scripts/point_source/visualization/` there (tiny build datasets, figures -gitignored). - -Witness: `python gallery/gallery_build.py --check` in `lens/autolens_visualization` exits 0 with group and cluster -sections; the Eyes survey reports both producers with 0 gaps and 0 orphans. diff --git a/draft/feature/pyautoeyes/multi_galaxy_gallery.md b/draft/feature/pyautoeyes/multi_galaxy_gallery.md deleted file mode 100644 index bbc654368..000000000 --- a/draft/feature/pyautoeyes/multi_galaxy_gallery.md +++ /dev/null @@ -1,33 +0,0 @@ -# autolens_visualization: multi-galaxy gallery — producer and dataset - -Type: feature -Target: autolens_visualization -Repos: -- autolens_visualization -Themes: -- visualization -Difficulty: medium -Autonomy: supervised -Priority: normal -Epic: pyautoeyes-birth -Phase: 6 -Status: draft — follows pyautoeyes-birth phase 1a (the lens project repo re-birth); retargeted from the retired autolens-visualization epic (PyAutoMind#436), then to the `autolens_visualization` project repo under the 2026-09-28 layered design -Filed: 2026-09-25 - -The PyAutoMind#436 birth shipped imaging and interferometer -galleries only. Add the multi-galaxy domain to the gallery: - -- a tracked HST-scale multi-galaxy dataset (lens plus at least one extra - line-of-sight or companion galaxy), with its simulator under - `scripts/misc/simulators/` so it regenerates; -- a flat `scripts/multi_galaxy/visualization.py` producer following the existing - imaging/interferometer pattern (true model, `visualize_before_fit` + `visualize` with the all-true - `config/visualize/plots.yaml`, parametric and Delaunay sources) writing to - `scripts/multi_galaxy/images/visualization/`; -- the render harness (`gallery/gallery_build.py`) picks the domain up and the tracked - `gallery/viz_manifest.yaml` lists it (so the PyAutoEyes dashboard shows it); `GALLERY.md` regenerated and - `--check` green; lint/render workflows run the new producer. - -Witness: `python gallery/gallery_build.py --check` in `lens/autolens_visualization` exits 0 with a multi_galaxy section -in `GALLERY.md`, and `pyauto-brain eyes survey lens/autolens_visualization --json` -reports the new producer with 0 gaps and 0 orphans. diff --git a/draft/feature/pyautoscientist/scientist_minimal_starter.md b/draft/feature/pyautoscientist/scientist_minimal_starter.md deleted file mode 100644 index 6e4da2328..000000000 --- a/draft/feature/pyautoscientist/scientist_minimal_starter.md +++ /dev/null @@ -1,45 +0,0 @@ -# Minimal independent Scientist starter - -Type: feature -Epic: scientist-adoption-pilot -Target: PyAutoScientist -Difficulty: medium -Autonomy: supervised -Consequence: judge -Status: needs-slicing - -Parent: `collaborator_led_pyautoscientist_adoption_pilot.md`. - -Audit current templates and runtime dependencies. Build a small starter with empty user-owned state, configured identities and clear AI-led connect-project instructions. Choose one supported layout/harness; do not assume collaborator project/access. Prove a differently named synthetic instance first. Ask for collaborator details only at the real pilot boundary. - -Start-dev must inspect current implementation and produce a bounded one-task/one-PR plan before execution. This is a next-step record, not an active repo claim. - -## First bounded slice completed — 2026-10-11 - -`complete/2026/10/scientist-instance-profile.md` (Scientist#61) supplies portable identity, explicit optional organ connections and an empty synthetic dashboard preview. This parent remains for the next bootstrap slice: initialize empty user-owned task/knowledge state from supported templates, audit/install one local harness, connect an existing project and prove fresh-chat resumption. Do not duplicate profile work or claim the preview is a fully operational starter. - -PRs: Brain#516 then Scientist#62. Both merged and Scientist#61 closed. The next task should start with the bootstrap/harness audit above, reusing this profile API. - -## Configuration initialization slice — 2026-10-11 - -`complete/2026/10/scientist-starter-init.md` (Scientist#63 closed; PR#64 merged) adds offline dry-run/apply initialization of a new configuration directory and a local fresh-chat handoff. This does not initialize Mind/Memory or install a harness. Audit found Mind spawn targets the fuller template family and Brain's installer writes harness-wide settings; the next bootstrap slice must explicitly support a minimal layout before invoking those. Reuse both existing owners rather than duplicating their templates or installer. - -## Minimal local Mind seed — 2026-10-11 - -`complete/2026/10/scientist-minimal-mind-seed.md` (Mind#498 closed; PR#499 merged) adds a local Mind-only mode to the existing generator: empty records/body map, no automation or satellite family. Remaining next step: explicitly configure canonical identities and validate one minimal local harness with Scientist + Brain + this seed; connect one synthetic existing project and prove fresh-chat resumption. Optional Memory remains separate and no remote access is assumed. - -## Workspace-local discovery — 2026-10-11 - -`complete/2026/10/scientist-local-discovery.md` (Brain#517) integrates registered Brain/Mind skills at the workspace root for a minimal local Claude pilot, with explicit canonical identities and a synthetic no-assistant project walkthrough. CLI integration verifies generated Mind + 40 local skill links + named Scientist + project validation/rendering. Actual fresh-session conversational acceptance remains required before declaring an adopter harness validated. Optional organ activation, upgrades and hosting remain later tasks. - -## Fresh-session diagnostic — 2026-10-11 - -Brain#518 merged and is recorded in `complete/2026/10/scientist-local-discovery.md`. A real read-only Claude session identified the synthetic Mira instance and its empty task state, but found source-instance assumptions in generated Mind instructions. `complete/2026/10/minimal-seed-instructions.md` (Mind#500, PR#501) fixes that minimal-seed output. A subsequent fresh read-only session correctly reports no configured community destination, no required optional organs, no installed automation, and user-record preservation. - -This is partial acceptance evidence only. The first diagnostic excluded the Skill tool and copied relative links needed regeneration after fixture relocation; its discovery result is not product-failure evidence. With corrected links and Skill available, the local skill name is visible, but its runtime provenance is not established because the fixture is nested in the maintainer workspace. Still required: prove workspace-local skill provenance, connect a project through an actual fresh conversation, and resume it while preserving user records. Do not claim full adopter-harness acceptance from these read-only checks. Evidence: tmp/scientist-local-discovery/acceptance-corrected-result.json and the Mind#500 task's acceptance.json. - -## Bounded conversational acceptance — 2026-10-11 - -`complete/2026/10/scientist-starter-acceptance.md` (Mind#502, PR#503 merged) records the remaining local connection/resumption test. A real Skill tool message proves the sampled sizing skill resolves from this fixture's local discovery directory. A fresh conversation connected synthetic Spectra by changing only the instance project catalogue and its own canonical map. Two further fresh conversations recovered saved identity, project relationships and the existing baseline-A research note without edits; the confirmation run preserved all 532 file hashes. Owner validators/renderers pass, and all 40 local skill links remain valid. - -See `docs/scientist-starter-acceptance.md` on PR#503 for pinned inputs, replay procedure and limits. This is bounded local conversational acceptance, not a pristine installation or full adopter/release certification: existing authenticated CLI, nested maintainer workspace, hooks disabled, one sampled skill, synthetic project. No collaborator access, optional-organ activation, hosting or upgrade claim. Next implementation: one optional organ's resumable setup and validation; actual collaborator/harness validation remains its separate milestone. diff --git a/draft/feature/pyautoscientist/scientist_optional_organ_activation.md b/draft/feature/pyautoscientist/scientist_optional_organ_activation.md index 7b5d64b07..ae7194c46 100644 --- a/draft/feature/pyautoscientist/scientist_optional_organ_activation.md +++ b/draft/feature/pyautoscientist/scientist_optional_organ_activation.md @@ -81,3 +81,10 @@ independent-organ acceptance is still unproven: select an adopter/synthetic host destination and exercise publication through connection/resume when appropriate. Record-preserving upgrades/recovery and actual collaborator acceptance remain their separate programme milestones; no collaborator access or live deployment is implied. + +## Re-scoped 2026-11-05 — what is left (draft-queue sweep) + +- **Done:** Discovery, setup and publication slices: PyAutoScientist#68, PyAutoBroca#17, #19. +- **Remaining:** Actual activation, upgrade and rollback. + +_Evidence from the 2026-11-05 read-only sweep (Mind ledger + GitHub search); remaining items are the live scope of this prompt._ diff --git a/draft/feature/workspaces/model_figures_6_rollout.md b/draft/feature/workspaces/model_figures_6_rollout.md index 848032a4a..a92b84c97 100644 --- a/draft/feature/workspaces/model_figures_6_rollout.md +++ b/draft/feature/workspaces/model_figures_6_rollout.md @@ -123,3 +123,10 @@ text. Canonical wording: `complete/2026/09/model-figures-rollout-lens.md`. Any **tutorial prose** written or revised in this rollout stays Opus-or-above per the tutorial-prose split in `PyAutoBrain/skills/WORKFLOW.md`. The figure call itself is mechanical and delegates normally. + +## Re-scoped 2026-11-05 — what is left (draft-queue sweep) + +- **Done:** (a) PyAutoFit#1621, autofit_workspace#154, HowToFit#52; (b) record `complete/2026/09/model-figures-rollout-lens.md`; (c) partly. +- **Remaining:** (c) the HowToGalaxy leg (untouched); (d) and (e) in full. + +_Evidence from the 2026-11-05 read-only sweep (Mind ledger + GitHub search); remaining items are the live scope of this prompt._ diff --git a/draft/maintenance/autoarray/small_datasets_followups_after_8c.md b/draft/maintenance/autoarray/small_datasets_followups_after_8c.md index fc589bfde..6ee9720e8 100644 --- a/draft/maintenance/autoarray/small_datasets_followups_after_8c.md +++ b/draft/maintenance/autoarray/small_datasets_followups_after_8c.md @@ -27,3 +27,10 @@ both gated on releases that do not exist yet: cap in PyAutoArray#529 resolves to the same `(16, 16)` and makes them redundant. Revert the four guards (and regenerate the notebooks) once the PyAutoArray release with the cap is what the HowTo smoke gates install. + +## Re-scoped 2026-11-05 — what is left (draft-queue sweep) + +- **Done:** PyAutoArray floor bumped to `autonerves>2026.10.4.1`. +- **Remaining:** Revert the HowToLens ch3 tutorial_1/2 mesh_shape guards; verify/remove the #529 fallback. + +_Evidence from the 2026-11-05 read-only sweep (Mind ledger + GitHub search); remaining items are the live scope of this prompt._ diff --git a/draft/maintenance/organs/reduce_session_token_load.md b/draft/maintenance/organs/reduce_session_token_load.md index 26e684c9e..7e8f577a0 100644 --- a/draft/maintenance/organs/reduce_session_token_load.md +++ b/draft/maintenance/organs/reduce_session_token_load.md @@ -66,3 +66,10 @@ Every session pays the first number before it does anything; every task pays the second twice (start and close) and writes the third once. At ~100 tasks a week the September record volume alone was ~1,800 agent-written lines a day that the memory faculty greps by title. + +## Re-scoped 2026-11-05 — what is left (draft-queue sweep) + +- **Done:** `scripts/token_load.py` and the Mind instruction slimming (d01f8f484); `complete/2026/09/codex-context-efficiency.md`. +- **Remaining:** The ≤6k target: AGENTS.md across Mind/Brain/Cortex/Memory still totals ~11.9k tokens, Cortex grew to ~5.4k; completion-record work not done. + +_Evidence from the 2026-11-05 read-only sweep (Mind ledger + GitHub search); remaining items are the live scope of this prompt._ diff --git a/draft/maintenance/workspaces/hpc_cache_off_home_phase2_euclid.md b/draft/maintenance/workspaces/hpc_cache_off_home_phase2_euclid.md deleted file mode 100644 index 14d2a60eb..000000000 --- a/draft/maintenance/workspaces/hpc_cache_off_home_phase2_euclid.md +++ /dev/null @@ -1,95 +0,0 @@ -# Keep caches off `$HOME` on HPC — phase 2 remainder: euclid pipeline `activate.sh` - -Type: maintenance -Target: workspaces -Repos: -- euclid_strong_lens_modeling_pipeline -Difficulty: small -Autonomy: supervised -Priority: medium -Status: formalised -Consequence: glance -Blocked-by: draft/bug/euclid/latent_total_source_flux_jax_vs_numpy_regression.md — euclid_strong_lens_modeling_pipeline main CI "Tests" red since a89a468 (2026-09-25; last green 3130898, 2026-09-22) on `tests/test_compute_latent_variable.py::test_latent_euclid_variables_traces_under_jax_jit` -Witness: `bash -n activate.sh`; fake-base witness (source `activate.sh` with a fake `PYAUTO_HPC_BASE`: every cache variable lands under `${PYAUTO_HPC_CACHE:-$(dirname "$PYAUTO_HPC_BASE")/.cache}`, a preset `JAX_COMPILATION_CACHE_DIR` wins, an explicitly empty one stays empty, and it survives `set -e` as a SLURM script would run it); repo pytest green. -Review-minutes: 3 -Unattended: ready -Filed: 2026-09-25 - -## What - -The euclid half of `hpc-cache-off-home-phase2` (autolens_profiling#310), re-filed at -the partial-merge close-out on 2026-09-25 — record: -`complete/2026/09/hpc-cache-off-home-phase2.md` (autolens_profiling half shipped as -autolens_profiling#311). Apply phase 1's cache block to the `PYAUTO_HPC_BASE` branch of -`euclid_strong_lens_modeling_pipeline/activate.sh` — the block below, identical to -autolens_assistant's. Only `activate.sh` changes. - -It was held, not rejected: the patch passed `bash -n` and the fake-base witness, but the -repo's pytest fails on the branch AND on main (`total_source_flux` 3.511 under -`jax.jit` vs 3.320 eager, rel=1e-3) — unrelated to `activate.sh`, which no test -sources. Ship once the bug above has turned main green (or on a human call to push -onto a red main with an override). - -The commit also survives as `a7f0d0a` on the local branch -`feature/hpc-cache-off-home-p2` of the canonical `lens/euclid_strong_lens_modeling_pipeline` -checkout (never pushed); cherry-pick it or apply the patch below onto current main. - -Parallel claim: `vis-lp-inspection-bundle` (feature/vis-lp-inspection-bundle) also -claims this repo; its diff (catalogue/, scripts/build_inspection_bundle.sh, -scripts/tools/build_inspect.py, hpc/batch_cpu/submit_build_inspection_bundle, tests/, -READMEs) does not touch `activate.sh` — a parallel claim is fine. - -## Ready patch (a7f0d0a) - -```diff -From a7f0d0a223971eb26171d7d65aaef55106adb902 Mon Sep 17 00:00:00 2001 -From: Jammy2211 -Date: Fri, 25 Sep 2026 21:08:41 +0100 -Subject: [PATCH] maintenance: keep Python/JAX caches off $HOME on HPC - (autolens_profiling#310) - -Phase 2 of autolens_inference#13 (RAL admin, 2026-09-25: ~/.cache filling node root -disks). The PYAUTO_HPC_BASE branch of activate.sh now carries phase 1's cache block -(verbatim from autolens_assistant): every cache variable lands under -${PYAUTO_HPC_CACHE:-$(dirname "$PYAUTO_HPC_BASE")/.cache}, filling only unset variables. -Laptop .venv users never reach this branch. - -Co-Authored-By: Claude Opus 5.5 ---- - activate.sh | 19 +++++++++++++++++++ - 1 file changed, 19 insertions(+) - -diff --git a/activate.sh b/activate.sh -index e2ca106..b2a8eb7 100644 ---- a/activate.sh -+++ b/activate.sh -@@ -23,6 +23,25 @@ $BASE/PyAutoFit:\ - $BASE/PyAutoArray:\ - $BASE/PyAutoGalaxy:\ - $BASE/PyAutoLens -+ # --- Keep caches OFF $HOME on HPC --------------------------------------- -+ # On many clusters (RAL: every node) /home sits on a small root disk, so tools that -+ # default to ~/.cache — the PyAutoNerves JAX compile cache (~/.cache/pyauto_jax), pip, -+ # matplotlib, numba, CUDA/Triton kernels — fill it and break the node (RAL admin, -+ # 2026-09-25). Send them to the shared project filesystem instead: by default a -+ # `.cache/` next to PYAUTO_HPC_BASE (override with PYAUTO_HPC_CACHE). Only unset -+ # variables are filled, so a submit script's own JAX_COMPILATION_CACHE_DIR still wins -+ # (and an explicitly EMPTY one still disables the JAX cache). Laptop `.venv` users -+ # never reach this branch. -+ export PYAUTO_HPC_CACHE="${PYAUTO_HPC_CACHE:-$(dirname "$PYAUTO_HPC_BASE")/.cache}" -+ mkdir -p "$PYAUTO_HPC_CACHE" 2>/dev/null || true -+ export XDG_CACHE_HOME="${XDG_CACHE_HOME:-$PYAUTO_HPC_CACHE}" -+ export PIP_CACHE_DIR="${PIP_CACHE_DIR:-$PYAUTO_HPC_CACHE/pip}" -+ export MPLCONFIGDIR="${MPLCONFIGDIR:-$PYAUTO_HPC_CACHE/matplotlib}" -+ export NUMBA_CACHE_DIR="${NUMBA_CACHE_DIR:-$PYAUTO_HPC_CACHE/numba}" -+ export CUDA_CACHE_PATH="${CUDA_CACHE_PATH:-$PYAUTO_HPC_CACHE/nv}" -+ export TRITON_CACHE_DIR="${TRITON_CACHE_DIR:-$PYAUTO_HPC_CACHE/triton}" -+ export JAX_COMPILATION_CACHE_DIR="${JAX_COMPILATION_CACHE_DIR-$PYAUTO_HPC_CACHE/pyauto_jax}" -+ export ASTROPY_CACHE_DIR="${ASTROPY_CACHE_DIR:-$PYAUTO_HPC_CACHE/astropy}" - else - echo "No local .venv found (set PYAUTO_HPC_BASE for a shared/HPC PyAuto checkout)." >&2 - fi --- -2.34.1 - -``` diff --git a/draft/maintenance/workspaces/pynufft_removal_downstream_residue.md b/draft/maintenance/workspaces/pynufft_removal_downstream_residue.md index 92c864715..6943d2a46 100644 --- a/draft/maintenance/workspaces/pynufft_removal_downstream_residue.md +++ b/draft/maintenance/workspaces/pynufft_removal_downstream_residue.md @@ -205,3 +205,10 @@ agent, so this routed through the Feature Agent; recorded as a follow-up. data plus a differing `SMALLDAT` header stamp. 3. **@autolens_workspace_developer has no test CI** (one Copilot workflow), which is why the phase-1 break rotted unnoticed and why #129 merged unchecked. + +## Re-scoped 2026-11-05 — what is left (draft-queue sweep) + +- **Done:** Phases 1–3: `complete/2026/08/pynufft-removal-residue-phase-{1,2,3}.md`. +- **Remaining:** autogalaxy_workspace markdown only: `pynufft` still in `markdown/interferometer/simulator.md` and `start_here.md`. + +_Evidence from the 2026-11-05 read-only sweep (Mind ledger + GitHub search); remaining items are the live scope of this prompt._ diff --git a/draft/refactor/autogalaxy/critical_curves_dispatch_cluster.md b/draft/refactor/autogalaxy/critical_curves_dispatch_cluster.md index dfbae4010..17031de9b 100644 --- a/draft/refactor/autogalaxy/critical_curves_dispatch_cluster.md +++ b/draft/refactor/autogalaxy/critical_curves_dispatch_cluster.md @@ -77,3 +77,10 @@ This is the next Source & Cluster arc step after extraction of its old phase-1 remainder and phase-2 profiling into cluster-pointsolver-speed. No blanket PointSolver-health gate applies. Re-audit the historical findings against current source and slice this too-large prompt through start_dev before issuing one task. + +## Re-scoped 2026-11-05 — what is left (draft-queue sweep) + +- **Done:** 3a audit (autolens_profiling#364), 3b cap fix (PyAutoGalaxy#646), cluster dispatch (PyAutoLens#808); records in complete/2026/10/. +- **Remaining:** The rest of phase 3 the ledger deferred: seed-coverage robustness and engine dedupe. + +_Evidence from the 2026-11-05 read-only sweep (Mind ledger + GitHub search); remaining items are the live scope of this prompt._ diff --git a/draft/refactor/pyautofit/remove_eden_packaging_tooling.md b/draft/refactor/pyautofit/remove_eden_packaging_tooling.md index 3e420f3c5..b838dc967 100644 --- a/draft/refactor/pyautofit/remove_eden_packaging_tooling.md +++ b/draft/refactor/pyautofit/remove_eden_packaging_tooling.md @@ -67,3 +67,10 @@ tooling is orphaned. - Ship library-first per the workflow; no downstream workspace impact expected. + +## Re-scoped 2026-11-05 — what is left (draft-queue sweep) + +- **Done:** The eden module is gone from PyAutoFit. +- **Remaining:** Delete `eden.yaml` from PyAutoFit main. + +_Evidence from the 2026-11-05 read-only sweep (Mind ledger + GitHub search); remaining items are the live scope of this prompt._ diff --git a/draft/research/autoarray/delaunay_research.md b/draft/research/autoarray/delaunay_research.md index 2f5b4a6ab..ab7352de9 100644 --- a/draft/research/autoarray/delaunay_research.md +++ b/draft/research/autoarray/delaunay_research.md @@ -466,3 +466,10 @@ Phase 2 (B): closed 2026-05-11) + +## Re-scoped 2026-11-05 — what is left (draft-queue sweep) + +- **Done:** kNN option failed (PyAutoArray#317/#318); option A built and shelved (`complete/archive/shelved/delaunay_jax_find_simplex_split.md`); frozen-tables gradient shipped (`complete/2026/07/delaunay-frozen-tables-gradient.md`). +- **Remaining:** Option B (batched callback) only — consider re-scoping to that or closing. + +_Evidence from the 2026-11-05 read-only sweep (Mind ledger + GitHub search); remaining items are the live scope of this prompt._ diff --git a/draft/research/autolens/lenstwin_p4_identifiability.md b/draft/research/autolens/lenstwin_p4_identifiability.md index 308bcd185..e3613babe 100644 --- a/draft/research/autolens/lenstwin_p4_identifiability.md +++ b/draft/research/autolens/lenstwin_p4_identifiability.md @@ -39,3 +39,10 @@ Phase 4 of the `lenstwin` epic (ledger `draft/feature/autolens/lenstwin_epic.md` - Seed count and Nautilus settings for the RAL array. Out of scope: multi-galaxy budgets (phase 5, R7), misspecified fits (later), workspace/assistant (phase 6). + +## Re-scoped 2026-11-05 — what is left (draft-queue sweep) + +- **Done:** 4a: PyAutoLens#811 (bf18d5c) + PyAutoGalaxy#681, record `complete/2026/10/lenstwin-p4a-twin-fit-model.md`; RAL array 413331 submitted 2026-10-29. +- **Remaining:** Pull 413331's results (still open in Cortex) and run recover.py. + +_Evidence from the 2026-11-05 read-only sweep (Mind ledger + GitHub search); remaining items are the live scope of this prompt._ diff --git a/draft/research/autolens_profiling/likelihood_lifecycle_epic.md b/draft/research/autolens_profiling/likelihood_lifecycle_epic.md index d0008ef2d..ee1abdcd8 100644 --- a/draft/research/autolens_profiling/likelihood_lifecycle_epic.md +++ b/draft/research/autolens_profiling/likelihood_lifecycle_epic.md @@ -269,7 +269,7 @@ explicit side, think hard about where this separation is for different likelihoo - 2026-10-25 (2x Pulse view DONE): PyAutoPulse#77 MERGED db5e7c02 (record complete/2026/10/likelihood-lifecycle-p2x-pulse-view.md). Phase 2x COMPLETE (#463, #465, Pulse#77). NEXT: 2b interferometer (now complete/2026/10/likelihood-lifecycle-p2b-interferometer.md), pin 2026.10.23.1. - 2026-10-25 (2b survey): read-only survey at likelihood_lifecycle_epic_surveys/p2b_interferometer_survey_2026_10_25.md (autolens_profiling 29caed89). 84 cells (RAL 50 / A100 34); no DFT planned; dense NUFFT above sma infeasible (61 GiB alma → 1.46 TiB jvla per transform); interferometer harnesses lack standard size / fit.png / parity / resources; rulings R1–R9 proposed to the human (R10 obsolete: Heart YELLOW). - 2026-10-29 (2b + 2c DONE; 2d–2g setup shipped; /prm close-out): all merged 2026-10-29 in autolens_profiling. **2b** #471 (PR A) + #483 (PR B: 72/73 legs, interferometer 60/60 current, 30/30 parity match; matrix-free alma 192² leg 413191_6 TIMEOUT recorded missing by human ruling) — record complete/2026/10/likelihood-lifecycle-p2b-interferometer.md. **2c** #480 (point source 10/10 current; human rulings: published runtime = Solved likelihood; dashboard refusal guard option A — host-change refusals allowed when no carried endpoint) — record complete/2026/10/likelihood-lifecycle-p2c-point-source.md. **Planner fix** #481 (human "fix the planner gap": GPU setups planned only on `gpu_hosts`). **2d** #484 + PyAutoPulse#81 (D12 decided: keep `--xla_cpu_multi_thread_eigen=false`, jaxlib 0.11.2 XLA:CPU deadlock), **2e** #478 (D3 solved headline decided, D4 settled by #481), **2f** #479, **2g** #477 (D5 settled by #481): campaign setup only, no RAL run (human held them for review) — records complete/2026/10/likelihood-lifecycle-p2{d-galaxy-group,e-cluster,f-dataset-datacube,g-weak}.md. Issues #469, #472–#476 closed. Re-filed: draft/research/autolens_profiling/likelihood_lifecycle_p2{d_galaxy_group,e_cluster,f_dataset_datacube,g_weak}_runs.md (open decisions, batch-0 go, RAL batches, PR B) and likelihood_lifecycle_p2bc_quiet_rerun_ingest.md. IN FLIGHT: quiet-node reruns of 38 2b + 2 2c RAL CPU legs (RAL 413267–413271, branches feature/likelihood-lifecycle-p2{b,c}-quiet-rerun, no PRs; they change the shared `_common.py`). NEXT: 2d–2g reviews and batch-0 goes; quiet-rerun ingest; then the human's "campaigns complete" gate for phase 3. -- 2026-10-29 (phase 3 designation proposals DRAFTED, not decided): draft/research/autolens_profiling/likelihood_lifecycle_p3_designation_proposals.md — 26 draft designations (likelihood × regime × hardware class) for 2a/2b/2c from autolens_profiling 32c0becd, with evidence, confirms/overturns §3.3, caveats, questions Q1–Q11 for the human, the release/tag interaction (the 2a–2c JAX rows record jax 0.10.2, which tag 2026.10.25.1 excludes) and the 2d–2g checklist. No Pulse record written; provisional_designations.json unchanged; gated on "campaigns complete". +- 2026-10-29 (phase 3 designation proposals DRAFTED, not decided): draft/research/autolens_profiling/likelihood_lifecycle_p3_designation_proposals.md (closed 2026-11-05; full text incl. the approved Appendix B folded into `complete/2026/11/lifecycle-p3-designation-proposals.md`) — 26 draft designations (likelihood × regime × hardware class) for 2a/2b/2c from autolens_profiling 32c0becd, with evidence, confirms/overturns §3.3, caveats, questions Q1–Q11 for the human, the release/tag interaction (the 2a–2c JAX rows record jax 0.10.2, which tag 2026.10.25.1 excludes) and the 2d–2g checklist. No Pulse record written; provisional_designations.json unchanged; gated on "campaigns complete". - 2026-10-30 (2d–2g batch 0 in; 2g DONE; 2d/2e/2f batch 1 submitted; /prm): batch 0 (2026-10-29, RAL 413272–413274/413292–413293, A100 413294–413297, jax 0.11.2) all 56 legs exit 0, every witness match. autolens_profiling#487 (walls from batch 0, 2d driver keeps the eigen flag off GPU legs) and #488 (2g rows, 6/6 current, coverage 182/272) and PyAutoPulse#82 (likelihood-lifecycle campaign row) MERGED 2026-10-30 (human /prm). Human rulings: loaded RAL nodes accepted (batch-0 RAL rows loadavg 95–109; no quiet gate for batch 1); fix the 2d GPU-leg flag. Batch 1 of 2d/2e/2f SUBMITTED from p2dg @ 830314e9 (RAL 413445–413452, A100 413453–413459). Record complete/2026/10/likelihood-lifecycle-p2g-weak-runs.md. NEXT: verify batch 1, PR B for 2d/2e/2f. - 2026-10-30 (2d/2e/2f DONE; phase 2 coverage complete; phase 3 gate passed; /prm): batch 1 all exit 0 (RAL 413445–413452, A100 413453–413459). PR B autolens_profiling#489 (2d, 48 rows, 24/24 match), #490 (2e, 10 rows, 5/5), #491 (2f, 32 rows, 16/16) MERGED 2026-10-30 (human /prm): coverage 272/272 current, 0 stale, 0 missing, no planned parity witness missing. Records complete/2026/10/likelihood-lifecycle-p2{d-galaxy-group,e-cluster,f-dataset-datacube}-runs.md. HUMAN GATE 2026-10-30 (chat): "yes phase 3 it is" — the phase-2 "campaigns complete" gate is passed. Open phase-2 follow-up: 2b/2c quiet-rerun ingest (draft likelihood_lifecycle_p2bc_quiet_rerun_ingest.md). NEXT: phase 3 from likelihood_lifecycle_p3_designation_proposals.md (extend to 2d–2g, then the human's designation decisions). - 2026-10-30 (phase 3 opened; human rulings): Q1+Q3 per-node axis, close calls stay provisional; Q2 gpu_a100 = A100s only; Q7 re-measure every 2a–2c JAX row on jax 0.11.2 + eigen flag (numba carried; 2b/2c RAL CPU legs covered by the quiet reruns 413319–413323); Q8 freeze on 2026.10.25.1; Q9 settled by the loaded-node ruling. Recorded in likelihood_lifecycle_p3_designation_proposals.md "Human rulings". First bounded phase-3 step: the 2a–2c JAX re-measure submits. diff --git a/draft/research/autolens_profiling/likelihood_lifecycle_p3_designation_proposals.md b/draft/research/autolens_profiling/likelihood_lifecycle_p3_designation_proposals.md deleted file mode 100644 index c17607999..000000000 --- a/draft/research/autolens_profiling/likelihood_lifecycle_p3_designation_proposals.md +++ /dev/null @@ -1,1365 +0,0 @@ -# Likelihood lifecycle phase 3: designation proposals for the completed campaigns (2a imaging, 2b interferometer, 2c point source) — DRAFT for the human - -Type: research -Target: autolens_profiling -Repos: -- autolens_profiling -- PyAutoPulse -Themes: -- profiling -- dashboard -Difficulty: large -Autonomy: human-required -Priority: high -Status: draft proposals for the human — never issued itself; no Pulse decision record exists or is implied, and `catalogue/provisional_designations.json` is unchanged. The phase 3 prompt (filed after the "campaigns complete" gate) cites this file -Consequence: judge -Review-minutes: 45 -Unattended: never -Epic: likelihood-lifecycle -Parent: draft/research/autolens_profiling/likelihood_lifecycle_epic.md -Filed: 2026-10-29 - -Written 2026-10-29 (Opus 5.5) from autolens_profiling `main` at 32c0becd (`dashboard/catalogue.json` generated 2026-10-29T09:46:25Z, `dashboard/coverage.json`, `catalogue/provisional_designations.json`, `catalogue/reference_hosts.json`, and the campaign pages below) and PyAutoPulse `main` at 4a4bdee (`decisions/README.md` "Designation decisions", `REFERENCE.md`, `pulse/decisions.py`). No repo code was changed, no decision recorded, no compute submitted. - -## Re-derivation 2026-10-31 on the day-zero catalogue (supersedes Appendix A for the record step) - -Re-derived from autolens_profiling PR #496 head `c218a428` (`dashboard/catalogue.json`). That is main after #494 (the quiet reruns) plus every 2a–2c JAX row on jax/jaxlib 0.11.2, which is the catalogue main will hold once #496 merges. It covers all seven campaigns (2a–2g) on the axis the human fixed on 2026-10-30: -- **Q1/Q3:** rank by projected calls/s per node within each hardware class. A setup separates when the winner beats the runner-up by more than the larger recorded p10–p90 spread, or by more than the 9 % arm-to-arm noise when no spread is recorded. -- **Q2/Q11:** `gpu_a100` means GPU setups only, with GPU-only secondaries. -- **Q5:** interferometer is designated by `standard`, with an instrument-keyed rule. -- **Q10:** untested branches are named in the rule. - -The generator scripts are `designate.py` and `appendix_b.py` (session scratch, reproduced in the PR that records the decisions). Every entry passes `pulse.decisions._designation`. - -**Result: 40 likelihood × hardware-class groups. 39 can be designated (21 separated, 18 uncontested) and 1 holds.** - -- **Hold:** `datacube/delaunay` `gpu_a100`. At sma, `jax_gpu_sparse_fp64_wtilde` 3.46 against `jax_gpu_dense_fp64_nufft` 3.37 calls/s/node is 1.03×, inside the 9 % tolerance; alma and alma_high measured only W~ sparse. It keeps its §3.3 provisional label. -- **Changed since 2026-10-29:** - 1. `interferometer/delaunay` `cpu_many_core`, jvla: the old **HOLD (25 %) now separates.** Numba is 1.22 against JAX 0.564 calls/s/node (2.17×). The quiet rerun sped numba up (0.87×) and jax 0.11.2 plus the eigen flag slowed JAX CPU W~ down (1.50×). - 2. `point_source_source/source_plane` `gpu_a100`: the old draft proposed the node CPU (`jax_cpu_na_fp64`). Under Q2 it is `jax_gpu_na_fp64`. This follows the ruling, not new data. - 3. The interferometer ids are now `…-standard-…` instead of the n_vis bins (Q5). The optimal setup is the same in every old bin. -- **Unchanged:** every other 2a, 2b and 2c proposal keeps its optimal setup. -- **The JAX CPU slowdown flips nothing.** Every CPU group with a numba setup was already numba, by 2.2–50× per node (min interferometer/delaunay jvla 2.17×, max group/delaunay euclid 49.6×). JAX-only CPU groups (MGE, point source, cluster, weak) are uncontested. -- **New groups (2d–2g):** - - group, multi_galaxy and multi_dataset follow imaging: numba on CPU, `jax_gpu_dense_fp64` on the A100, all separated. - - datacube on CPU: numba W~, separated. - - cluster and weak: uncontested JAX. -- **Caveats:** - - imaging/rectangular euclid numba has no MaxRSS (sacct missed the task), so it has no projection; that instrument is ranked per call (numba 3.22× JAX). - - Uncontested groups rest on one measured setup. - - Projections are upper bounds: η = 1.0, declared and unmeasured until phase 4. Every record says `basis: projected` in its prose (Q4 option a). - -**For the human (the record step):** approve the 39, or name the ones to hold, and confirm the datacube A100 hold. On approval the conductor writes the 39 `decisions/.md` and `decisions.yaml` rows in PyAutoPulse, then the producers re-declare `class: optimal` + `decision_id` on the cited rows (autolens_profiling), and `pyauto-pulse check` must resolve them. - -## What this is, and what it is not - -The epic's rule (ledger Summary; report §3.2) is that an optimal setup is always a Pulse `designation` decision made by the human, never inferred. Phase 3 (ledger card; report §4 "Phase 3") must produce: a pinned released tag with every Optimal/Secondary cell measured on it, `day_zero` stamped, a Pulse `day_zero` snapshot, **one `designation` decision per likelihood × hardware class (the conductor drafts, the human records)**, `wiki/campaigns///day_zero.md` decision-rule notes, the Pulse `setup-baseline` campaign adopted and closed with its 1,044-slot manifest replaced, no `not_measured` Optimal cell on Coverage, and the `runtime_estimates` export. Phase 3 is gated on the human's "campaigns complete" confirmation, which has not happened (2d–2g have not run on RAL). - -This file is the "conductor drafts" part for the three campaigns that are complete. For each likelihood × hardware class it gives the §3.3 provisional setups, the measured evidence, a proposed optimal and secondary, a one-line reason, whether it confirms or overturns §3.3, and the caveats that could change the call. Appendix A holds each proposal as a draft `decisions.yaml` entry in the shape `decisions/README.md` specifies; all 26 pass `pulse.decisions._designation` (run against PyAutoPulse `pulse/decisions.py`, identical to `main`). They are drafts: the `date` is a placeholder for the human's decision date, and nothing is in any index. - -Sources: - -- Campaign pages (autolens_profiling 32c0becd): imaging [`wiki/campaigns/imaging/likelihood_lifecycle_p2a.md`](https://github.com/PyAutoLabs/autolens_profiling/blob/32c0becd/wiki/campaigns/imaging/likelihood_lifecycle_p2a.md) (#461, #467; 106/106 current); interferometer [`wiki/campaigns/interferometer/likelihood_lifecycle_p2b.md`](https://github.com/PyAutoLabs/autolens_profiling/blob/32c0becd/wiki/campaigns/interferometer/likelihood_lifecycle_p2b.md) (#471, #483; 60/60); point source [`wiki/campaigns/point_source_source/source_plane/likelihood_lifecycle_p2c.md`](https://github.com/PyAutoLabs/autolens_profiling/blob/32c0becd/wiki/campaigns/point_source_source/source_plane/likelihood_lifecycle_p2c.md) and its [image-plane twin](https://github.com/PyAutoLabs/autolens_profiling/blob/32c0becd/wiki/campaigns/point_source_image/image_plane/likelihood_lifecycle_p2c.md) (#480; 10/10; human ruling: the published runtime is the Solved likelihood). -- Node throughput: phase 2x (#463, #465, PyAutoPulse#77), the `projected_node_throughput` block on every runtime record. -- Every current runtime row of these likelihoods is on `release_pin` 2026.10.25.1 (imaging rows measured on 2026.10.23.1 and carried by the declared `carry_forward`, #466/#467). - -## The comparison axis (pre-registered by the report; restated, not chosen here) - -The report's "Amendment 2026-10-25: node throughput" (human-approved) fixes the axis before the data: keep **separate** Optimal GPU and Optimal CPU designations; within each, **rank by projected throughput on the named hardware budget (calls per second per node)**, with per-call latency only as secondary evidence; designations made before phase 4 carry `basis: projected` and are revisited when phase 4 measures the parallel efficiency η. The proposals below follow that axis and say where the per-call axis would give a different answer. Two gaps the report leaves open are questions for the human (Q2, Q4): whether a GPU node's "hardware budget" includes its 124 CPU cores, and where `basis: projected` goes, since the Pulse designation schema refuses any field it does not list. - -Mapping used: host class `hpc_a100` (RAL gpu node, 4 × A100 80GB PCIe, 124 cores, 885 GB) → `hardware_class: gpu_a100`; `hpc_ral_cpu` (RAL ral node, declared 236 cores, 921 GB) → `cpu_many_core` (`catalogue/reference_hosts.json`). `laptop` has no current evidence (R7: laptop rows are never current), so no laptop proposal is made (Q6). - -## How to read the evidence tables - -- **Headline per call**, by the basis the campaign pages define: JAX `single-jit median` (median of individually timed calls after the warm calls; 200 calls in 2a/2c), or `single-jit block mean †` where the leg recorded only the one-block mean (catalogue `metric: single_jit_block` on a JAX row); numba `warm iid median` (median over seeded iid draws after the compile: 16 in 2a; 16/16/6/1 at sma/alma/alma_high/jvla in 2b, per the 2b page). For 2b numba rows the forced `direct_conv` and NumPy FFT route arms are shown beside the cost-model pick (2b ruling R4). -- **p10–p90**: the single-jit spread recorded in the row (`full_pipeline_single_jit_p{10,90}_ms`); absent on † rows and numba rows. -- **vmap per call [batch]**: batch time / batch size at the batch the script chose. It is the per-call source of every JAX row's projection (`per_call_source: vmap.per_call`); numba's is the warm iid median. -- **Projected calls/s per node**: `projected_node_throughput.hosts[0]` — workers = min(cores / cores per call, node memory / peak RSS), or one per GPU, × η (declared 1.0, an upper bound, unmeasured) / per-call time; each row projected only onto the node class it was measured on (#464). Not modelled: Nautilus `n_batch`, shared memory bandwidth. -- **Peak RSS** is the row's (2b/2c) or the sacct backfill's (2a: exact per RAL leg; the multi-leg A100 job's peak, an upper bound, on A100). -- **Parity** is the cell's witness status from the catalogue's `parity_witnesses` (all 88 cell witnesses here — 53 imaging, 30 interferometer, 5 point source — `match`; 0 `diverged`). -- **Rounding**: one rule for every number below, applied to the record value: per-call times to 4 significant figures (integers with separators from 1,000 ms), projections and RSS to 3 significant figures. The campaign pages round some values one digit differently (e.g. 0.1986 ms prints as 0.20 on the 2a page and 0.1986 here); the record id is the source. -- **Record ids are path-hashed** (2b page, Journal 2026-10-29): when the quiet-rerun ingest replaces a RAL CPU row in place, the same id will name the new row. Re-resolve every evidence id at the freeze commit before recording a decision. - -## Cross-cutting caveats (referenced as C1–C9 below) - -- **C1 RAL CPU load.** 2a RAL CPU rows: load average 8.6–37 at write (2a page). 2b: every RAL CPU row started at a 1-minute load of 45–72 on euclid-ral-compute-1 (2b page, "Load"). 2c: the two solved RAL CPU runtime rows started at 33.4 on euclid-ral-compute-10-5 (2c page). All are refused as dashboard trend points (cap 8) but stay `current`. The quiet reruns RAL 413267 (2c, 2 legs) and 413268–413271 (2b, 38 legs) are queued (`likelihood_lifecycle_p2bc_quiet_rerun_ingest.md`; their state was not checked from this session, RAL is not mounted here), so **every 2b and 2c RAL CPU number may move**. The 2a RAL CPU rows are **not** in the rerun. -- **C2 A100 host.** Every A100 runtime row here ran on euclid-ral-gpu-1; the release sweep pins euclid-ral-gpu-2 (`hpc/release_sweep.conf`), so they are flagged off-host on the run-time dashboard. Comparisons inside `gpu_a100` are all on gpu-1, so they are like-for-like with each other. A100 load at write: 9–13 (2a), 1–7 (2b), ≤ 2.5 (2c). -- **C3 Close calls.** Where two setups sit inside each other's p10–p90, or within a few per cent with no spread recorded, the evidence does not separate them; each is named where it occurs. -- **C4 jax version and the XLA:CPU deadlock.** Every current 2a/2b/2c row records `jax`/`jaxlib` **0.10.2** (`identity.software`; checked in the raw rows) and `XLA_FLAGS` without `--xla_cpu_multi_thread_eigen=false`. The jaxlib 0.11.2 XLA:CPU deadlock (PyAutoPulse `knowledge/xla_cpu_deadlock_jaxlib_0_11_2.md`; decision `xla-cpu-deadlock-eigen-workaround`, D12) was found on 0.11.2 and is untested for these executables. But tag 2026.10.25.1's PyAutoNerves declares `jax>=0.7.0,<0.12.0,!=0.10.*,!=0.11.0` ("CPU batched LAPACK can deadlock in 0.10.x / 0.11.0 (Heart#274)", commit 249ba9e, 2026-10-04): **the JAX evidence was measured on a jax the pinned tag excludes**, while the superseded 2026.10.17.1 point-source rows recorded jaxlib 0.11.2 and the 2d–2g legs will run on 0.11.2 with the D12 flag (+25 % per call on laptop group/mge against the deadlocking default; within ~15 % on pixelized cells). A 2a/2b/2c JAX CPU row is therefore not like-for-like with a 2d–2g JAX CPU row on two axes (jax version, eigen flag). Numba rows (numba 0.65.1) are not affected by the jax version. This is Q7 and the largest open item for the freeze. -- **C5 Mixed precision** is `experimental` everywhere (R4; footnote to §3.3). No mixed-precision row exists in 2a–2c, so no proposal names one. -- **C6 Per call vs per node.** Within one hardware class the two axes agree everywhere except: imaging/delaunay euclid on RAL (per-call tie), interferometer pixelized alma_high and jvla on RAL (JAX CPU faster per call, numba ahead per node), and point-source source plane on the A100 node (per-call tie, CPU cores ahead per node). Across classes (which hardware a fit should request), a ral node is projected ahead of a 4×A100 node for interferometer pixelized at sma and alma but behind it at alma_high and jvla (2b headline), and ahead on hst Delaunay imaging but behind on ao (2a). That cross-class choice is phase 5's (`setup="auto"` when both are present), not a designation; it is stated here because it is the same axis question. -- **C7 JAX CPU cores per call.** Every JAX CPU row ran with 8 threads (`cpus_per_eval` 8), so a ral node projects 29 JAX CPU workers against 236 numba workers. A JAX CPU leg with fewer threads per call was never measured, so the per-node rank of JAX CPU against numba is conditional on that thread count. -- **C8 Projection source.** Projections use vmap per call, which on some rows is slower than the single-jit median (e.g. interferometer rectangular alma A100: vmap 51.22 ms [3] against single-jit 36.01 ms; interferometer/mge sma RAL: 112.5 against 90.63 ms). No within-class ordering below changes if the single-jit median is used instead. -- **C9 Phase 4.** η is declared 1.0 (upper bound). The CPU projections (hundreds of workers sharing memory bandwidth) are the most optimistic (2a page). Phase 4 measures η per setup and host; any designation here is `basis: projected` until then (report amendment). - -## Evidence (current runtime rows; size-variant 28² rows excluded) - -The four `size_variant` rows at hst rectangular 784 source pixels (`source_pixels_784/`, autolens_profiling#468, the rect28 rows for autolens_inference) are current but not the standard size, so they are not evidence for a standard-regime designation. - -### Evidence: imaging/delaunay - -| instrument | setup @ host | headline per call (ms), basis | p10–p90 (ms) | vmap per call (ms) [batch] | cores/call | peak RSS (GB) | projected calls/s per node (workers, bound) | parity | runtime record | -|---|---|---|---|---|---|---|---|---|---| -| euclid | `jax_cpu_sparse_fp64` @ A100 node | 1,146, single-jit median | 1,127–1,169 | 857.4 [3] | 8 | 1.91 | 17.5 (15, cores) | match | `lifecycle/a9e102b324300939da14` | -| euclid | `jax_gpu_dense_fp64` @ A100 node | 44.73, single-jit median | 44.24–45.63 | 14.80 [64] | 8 | 1.91 | 270 (4, gpus) | match | `lifecycle/c07af59a8d393975dd28` | -| euclid | `jax_gpu_sparse_fp64` @ A100 node | 46.85, single-jit median | 46.67–47.30 | 18.16 [64] | 8 | 1.91 | 220 (4, gpus) | match | `lifecycle/371f67d50254479493ee` | -| euclid | `jax_cpu_sparse_fp64` @ RAL | 1,122, single-jit median | 1,100–1,165 | 826.6 [3] | 8 | 1.74 | 35.1 (29, cores) | match | `lifecycle/b202eb6f7da58a38882f` | -| euclid | `numba_cpu_sparse_fp64` @ RAL | 820.0, numba warm iid median | — | — | 1 | 0.551 | 288 (236, cores) | match | `lifecycle/5556ca430bc180c2d536` | -| hst | `jax_cpu_sparse_fp64` @ A100 node | 2,562, single-jit block mean † | — | 2,110 [3] | 8 | 10.7 | 7.11 (15, cores) | match | `lifecycle/0f45aa8eb79d60157031` | -| hst | `jax_gpu_dense_fp64` @ A100 node | 59.58, single-jit median | 59.19–60.42 | 35.05 [16] | 8 | 10.7 | 114 (4, gpus) | match | `lifecycle/73c19173fcc983318b61` | -| hst | `jax_gpu_sparse_fp64` @ A100 node | 76.23, single-jit median | 75.45–76.79 | 47.93 [16] | 8 | 10.7 | 83.5 (4, gpus) | match | `lifecycle/12c678df16e04f4f9011` | -| hst | `jax_cpu_sparse_fp64` @ RAL | 2,221, single-jit block mean † | — | 1,895 [3] | 8 | 3.20 | 15.3 (29, cores) | match | `lifecycle/06a9dad80c65ecd81c6c` | -| hst | `numba_cpu_sparse_fp64` @ RAL | 951.7, numba warm iid median | — | — | 1 | 0.854 | 248 (236, cores) | match | `lifecycle/321ec1f6f2a5955a9a20` | -| jwst | `jax_cpu_sparse_fp64` @ A100 node | 5,086, single-jit block mean † | — | 4,686 [3] | 8 | 7.38 | 3.20 (15, cores) | match | `lifecycle/97d2ae3cab5f9bbc9d8f` | -| jwst | `jax_gpu_dense_fp64` @ A100 node | 88.63, single-jit median | 87.74–90.16 | 72.29 [8] | 8 | 7.38 | 55.3 (4, gpus) | match | `lifecycle/12348bea7be2ca70cffb` | -| jwst | `jax_gpu_sparse_fp64` @ A100 node | 124.2, single-jit median | 124.0–124.6 | 108.1 [8] | 8 | 7.38 | 37.0 (4, gpus) | match | `lifecycle/d34ebb3d52e02dfb8b16` | -| jwst | `jax_cpu_sparse_fp64` @ RAL | 4,759, single-jit block mean † | — | 4,361 [3] | 8 | 5.58 | 6.65 (29, cores) | match | `lifecycle/b5b87c504713b9831857` | -| jwst | `numba_cpu_sparse_fp64` @ RAL | 1,745, numba warm iid median | — | — | 1 | 1.98 | 135 (236, cores) | match | `lifecycle/d93b4dad29e8a0f77987` | -| ao | `jax_cpu_sparse_fp64` @ A100 node | 56,742, single-jit block mean † | — | 57,179 [1] | 8 | 39.8 | 0.262 (15, cores) | match | `lifecycle/780ad479b1fe66279696` | -| ao | `jax_gpu_dense_fp64` @ A100 node | 368.2, single-jit median | 363.9–371.5 | 366.9 [1] | 8 | 39.8 | 10.9 (4, gpus) | match | `lifecycle/fa028d54604cd08d3555` | -| ao | `jax_gpu_sparse_fp64` @ A100 node | 886.7, single-jit median | 885.9–887.5 | 935.3 [1] | 8 | 39.8 | 4.28 (4, gpus) | match | `lifecycle/99d7c3c7623e3d43d059` | -| ao | `jax_cpu_sparse_fp64` @ RAL | 56,746, single-jit block mean † | — | 55,292 [1] | 8 | 19.5 | 0.524 (29, cores) | match | `lifecycle/e08b7a6ff7b9daea8790` | -| ao | `numba_cpu_sparse_fp64` @ RAL | 8,671, numba warm iid median | — | — | 1 | 23.0 | 4.61 (40, memory) | match | `lifecycle/1f22a4a5fcd73276ec53` | - -### Evidence: imaging/delaunay_nn - -| instrument | setup @ host | headline per call (ms), basis | p10–p90 (ms) | vmap per call (ms) [batch] | cores/call | peak RSS (GB) | projected calls/s per node (workers, bound) | parity | runtime record | -|---|---|---|---|---|---|---|---|---|---| -| hst | `jax_cpu_sparse_fp64` @ A100 node | 6,250, single-jit block mean † | — | 6,235 [3] | 8 | 10.7 | 2.41 (15, cores) | match | `lifecycle/cbc5540f3214caf61aba` | -| hst | `jax_gpu_dense_fp64` @ A100 node | 89.59, single-jit median | 89.50–89.82 | 42.74 [16] | 8 | 10.7 | 93.6 (4, gpus) | match | `lifecycle/c661098ad46c65fa59b2` | -| hst | `jax_gpu_sparse_fp64` @ A100 node | 1,201, single-jit median | 1,200–1,201 | 1,149 [16] | 8 | 10.7 | 3.48 (4, gpus) | match | `lifecycle/70bcae3ab1c4777651f0` | -| hst | `jax_cpu_sparse_fp64` @ RAL | 6,831, single-jit block mean † | — | 6,427 [3] | 8 | 10.8 | 4.51 (29, cores) | match | `lifecycle/1ae46b0872f10459a7c4` | -| hst | `numba_cpu_sparse_fp64` @ RAL | 1,295, numba warm iid median | — | — | 1 | 0.831 | 182 (236, cores) | match | `lifecycle/05dde64a0eb7fdd0c4a1` | - -### Evidence: imaging/mge - -| instrument | setup @ host | headline per call (ms), basis | p10–p90 (ms) | vmap per call (ms) [batch] | cores/call | peak RSS (GB) | projected calls/s per node (workers, bound) | parity | runtime record | -|---|---|---|---|---|---|---|---|---|---| -| euclid | `jax_gpu_dense_fp64` @ A100 node | 5.916, single-jit median | 5.729–6.194 | 0.1986 [64] | 8 | 1.91 | 20,100 (4, gpus) | match | `lifecycle/770dce7d7db7a1fc3b53` | -| euclid | `jax_cpu_dense_fp64` @ RAL | 7.896, single-jit median | 7.535–8.377 | 6.797 [3] | 8 | — | not projected (no peak RSS) | match | `lifecycle/190ebc582d9aba9aaa9c` | -| hst | `jax_gpu_dense_fp64` @ A100 node | 6.285, single-jit median | 6.250–6.337 | 0.4116 [64] | 8 | 10.7 | 9,720 (4, gpus) | match | `lifecycle/8a475e9abd97a8c4a1c0` | -| hst | `jax_cpu_dense_fp64` @ RAL | 21.22, single-jit median | 19.55–22.43 | 14.39 [3] | 8 | — | not projected (no peak RSS) | match | `lifecycle/54979849c807d452c510` | -| jwst | `jax_gpu_dense_fp64` @ A100 node | 7.000, single-jit median | 6.933–7.354 | 0.9966 [64] | 8 | 7.38 | 4,010 (4, gpus) | match | `lifecycle/0756e600e86d7ae6a462` | -| jwst | `jax_cpu_dense_fp64` @ RAL | 50.25, single-jit median | 45.86–59.97 | 41.55 [3] | 8 | 1.29 | 698 (29, cores) | match | `lifecycle/4baa9bc04c8d24a713b6` | -| ao | `jax_gpu_dense_fp64` @ A100 node | 15.73, single-jit median | 15.68–15.78 | 18.98 [3] | 8 | 39.8 | 211 (4, gpus) | match | `lifecycle/4b514c4262172f610fee` | -| ao | `jax_cpu_dense_fp64` @ RAL | 388.9, single-jit median | 347.7–444.2 | 329.7 [3] | 8 | 3.49 | 88.0 (29, cores) | match | `lifecycle/3216ffc143645fb46c72` | - -### Evidence: imaging/rectangular - -| instrument | setup @ host | headline per call (ms), basis | p10–p90 (ms) | vmap per call (ms) [batch] | cores/call | peak RSS (GB) | projected calls/s per node (workers, bound) | parity | runtime record | -|---|---|---|---|---|---|---|---|---|---| -| euclid | `jax_cpu_sparse_fp64` @ A100 node | 827.4, single-jit median | 810.4–859.4 | 633.8 [3] | 8 | 1.91 | 23.7 (15, cores) | match | `lifecycle/9e4861d45b9802a91868` | -| euclid | `jax_gpu_dense_fp64` @ A100 node | 29.83, single-jit median | 29.19–30.50 | 7.926 [64] | 8 | 1.91 | 505 (4, gpus) | match | `lifecycle/456f7d65babc5524183a` | -| euclid | `jax_gpu_sparse_fp64` @ A100 node | 34.68, single-jit median | 34.62–34.86 | 13.19 [64] | 8 | 1.91 | 303 (4, gpus) | match | `lifecycle/bc5ed323618c58fc7682` | -| euclid | `jax_cpu_sparse_fp64` @ RAL | 858.5, single-jit median | 772.5–942.2 | 683.0 [3] | 8 | 1.91 | 42.5 (29, cores) | match | `lifecycle/4c53e409a27040f5d6a4` | -| euclid | `numba_cpu_sparse_fp64` @ RAL | 282.5, numba warm iid median | — | — | 1 | — | not projected (no peak RSS) | match | `lifecycle/6060fdcfa2e5a4a0c168` | -| hst | `jax_cpu_sparse_fp64` @ A100 node | 1,968, single-jit median | 1,946–2,009 | 1,709 [3] | 8 | 10.7 | 8.78 (15, cores) | match | `lifecycle/22c24ae6e2c83dc51d89` | -| hst | `jax_gpu_dense_fp64` @ A100 node | 40.66, single-jit median | 40.59–40.77 | 25.50 [16] | 8 | 10.7 | 157 (4, gpus) | match | `lifecycle/42f6a707360ce63b8150` | -| hst | `jax_gpu_sparse_fp64` @ A100 node | 61.55, single-jit median | 61.50–61.67 | 41.19 [16] | 8 | 10.7 | 97.1 (4, gpus) | match | `lifecycle/cc3f3365b6ac65388a93` | -| hst | `jax_cpu_sparse_fp64` @ RAL | 2,155, single-jit block mean † | — | 2,029 [3] | 8 | 3.15 | 14.3 (29, cores) | match | `lifecycle/2b5e34f509175fd4d030` | -| hst | `numba_cpu_sparse_fp64` @ RAL | 696.7, numba warm iid median | — | — | 1 | 1.02 | 339 (236, cores) | match | `lifecycle/b62534053c00fb102bf4` | -| jwst | `jax_cpu_sparse_fp64` @ A100 node | 4,141, single-jit block mean † | — | 3,940 [3] | 8 | 7.38 | 3.81 (15, cores) | match | `lifecycle/cfba00e49ad2fb8681cb` | -| jwst | `jax_gpu_dense_fp64` @ A100 node | 66.30, single-jit median | 65.77–66.77 | 62.84 [8] | 8 | 7.38 | 63.6 (4, gpus) | match | `lifecycle/ec69a200557ea8212e5e` | -| jwst | `jax_gpu_sparse_fp64` @ A100 node | 116.8, single-jit median | 116.7–117.6 | 107.5 [8] | 8 | 7.38 | 37.2 (4, gpus) | match | `lifecycle/bdffd9d6d157b3b66435` | -| jwst | `jax_cpu_sparse_fp64` @ RAL | 4,453, single-jit block mean † | — | 4,210 [3] | 8 | 5.38 | 6.89 (29, cores) | match | `lifecycle/9bb2e30e94491253641b` | -| jwst | `numba_cpu_sparse_fp64` @ RAL | 1,688, numba warm iid median | — | — | 1 | 1.98 | 140 (236, cores) | match | `lifecycle/304ac75d242dcbc2c22f` | -| ao | `jax_cpu_sparse_fp64` @ A100 node | 50,291, single-jit block mean † | — | 50,843 [1] | 8 | 39.8 | 0.295 (15, cores) | match | `lifecycle/3617cdce4ec7d5357c4f` | -| ao | `jax_gpu_dense_fp64` @ A100 node | 309.6, single-jit median | 308.6–310.9 | 310.8 [1] | 8 | 39.8 | 12.9 (4, gpus) | match | `lifecycle/d570569f32c953038fde` | -| ao | `jax_gpu_sparse_fp64` @ A100 node | 968.4, single-jit median | 967.2–969.4 | 1,053 [1] | 8 | 39.8 | 3.80 (4, gpus) | match | `lifecycle/46db4990a22e25aee123` | -| ao | `jax_cpu_sparse_fp64` @ RAL | 50,877, single-jit block mean † | — | 48,794 [1] | 8 | 22.3 | 0.594 (29, cores) | match | `lifecycle/d7020017fca2249bf32b` | -| ao | `numba_cpu_sparse_fp64` @ RAL | 9,982, numba warm iid median | — | — | 1 | 28.0 | 3.21 (32, memory) | match | `lifecycle/403420f8debaaa38956c` | - -### Evidence: interferometer/delaunay - -| instrument | setup @ host | headline per call (ms), basis | p10–p90 (ms) | vmap per call (ms) [batch] | cores/call | peak RSS (GB) | projected calls/s per node (workers, bound) | parity | runtime record | -|---|---|---|---|---|---|---|---|---|---| -| sma | `jax_gpu_dense_fp64_nufft` @ A100 node | 55.86, single-jit median | 55.76–56.23 | 55.77 [1] | 8 | 5.00 | 71.7 (4, gpus) | match | `lifecycle/ff5c53947f845ee5f2d8` | -| sma | `jax_gpu_sparse_fp64_wtilde` @ A100 node | 27.49, single-jit median | 27.39–27.69 | 12.09 [64] | 8 | 1.68 | 331 (4, gpus) | match | `lifecycle/742eaf1292ed737e591e` | -| sma | `jax_cpu_dense_fp64_nufft` @ RAL | 6,411, single-jit block mean † | — | 5,702 [3] | 8 | 33.0 | 4.74 (27, memory) | match | `lifecycle/284efdc05b70e06e060a` | -| sma | `jax_cpu_sparse_fp64_wtilde` @ RAL | 1,169, single-jit median | 1,001–1,298 | 859.2 [3] | 8 | 1.32 | 33.8 (29, cores) | match | `lifecycle/00838694b2c3c955a644` | -| sma | `numba_cpu_sparse_fp64_wtilde` @ RAL | 335.1, numba warm iid median (route arms: direct_conv 338.4, NumPy FFT 1,166) | — | — | 1 | 0.853 | 704 (236, cores) | match | `lifecycle/b2d01ef74bf71e49d774` | -| alma | `jax_gpu_sparse_fp64_wtilde` @ A100 node | 40.26, single-jit median | 40.02–41.05 | 22.65 [64] | 8 | 2.53 | 177 (4, gpus) | match | `lifecycle/8dada4df3a4ed30d1721` | -| alma | `jax_cpu_sparse_fp64_wtilde` @ RAL | 2,845, single-jit block mean † | — | 2,712 [3] | 8 | 2.39 | 10.7 (29, cores) | match | `lifecycle/60747d6f7a1867da50c9` | -| alma | `numba_cpu_sparse_fp64_wtilde` @ RAL | 823.6, numba warm iid median (route arms: direct_conv 817.9, NumPy FFT 3,052) | — | — | 1 | 1.55 | 286 (236, cores) | match | `lifecycle/5e9d64046821795b4651` | -| alma_high | `jax_gpu_sparse_fp64_wtilde` @ A100 node | 82.48, single-jit median | 82.36–82.80 | 68.81 [16] | 8 | 4.16 | 58.1 (4, gpus) | match | `lifecycle/ba12584bdfe8c2e16f30` | -| alma_high | `jax_cpu_sparse_fp64_wtilde` @ RAL | 9,692, single-jit block mean † | — | 8,500 [3] | 8 | 9.31 | 3.41 (29, cores) | match | `lifecycle/d54c6814c51c381564cf` | -| alma_high | `numba_cpu_sparse_fp64_wtilde` @ RAL | 11,301, numba warm iid median (route arms: direct_conv 8,777, NumPy FFT 11,267) | — | — | 1 | 2.36 | 20.9 (236, cores) | match | `lifecycle/bfe464d85eab437c56be` | -| jvla | `jax_gpu_sparse_fp64_wtilde` @ A100 node | 440.2, single-jit median | 440.0–440.7 | 459.4 [3] | 8 | 14.3 | 8.71 (4, gpus) | match | `lifecycle/3c33efbabefe647c901b` | -| jvla | `jax_cpu_sparse_fp64_wtilde` @ RAL | 34,832, single-jit block mean † | — | 34,209 [3] | 8 | 23.0 | 0.848 (29, cores) | match | `lifecycle/757d2c2d7167cdef0457` | -| jvla | `numba_cpu_sparse_fp64_wtilde` @ RAL | 73,492, numba warm iid median (route arms: direct_conv 315,196, NumPy FFT 77,134) | — | — | 1 | 11.7 | 1.06 (78, memory) | match | `lifecycle/e63a97d451e1633c91aa` | - -### Evidence: interferometer/mge - -| instrument | setup @ host | headline per call (ms), basis | p10–p90 (ms) | vmap per call (ms) [batch] | cores/call | peak RSS (GB) | projected calls/s per node (workers, bound) | parity | runtime record | -|---|---|---|---|---|---|---|---|---|---| -| sma | `jax_gpu_dense_fp64_nufft` @ A100 node | 3.718, single-jit median | 3.670–3.797 | 0.5729 [64] | 8 | 1.57 | 6,980 (4, gpus) | match | `lifecycle/4c9e3b4239cc98b8a7ff` | -| sma | `jax_cpu_dense_fp64_nufft` @ RAL | 90.63, single-jit median | 71.48–125.1 | 112.5 [3] | 8 | 1.30 | 258 (29, cores) | match | `lifecycle/02e5496a9c9da3407d87` | - -### Evidence: interferometer/rectangular - -| instrument | setup @ host | headline per call (ms), basis | p10–p90 (ms) | vmap per call (ms) [batch] | cores/call | peak RSS (GB) | projected calls/s per node (workers, bound) | parity | runtime record | -|---|---|---|---|---|---|---|---|---|---| -| sma | `jax_gpu_dense_fp64_nufft` @ A100 node | 50.06, single-jit median | 50.00–50.33 | 50.13 [1] | 8 | 4.78 | 79.8 (4, gpus) | match | `lifecycle/e44acbf15a2387706fa1` | -| sma | `jax_gpu_sparse_fp64_wtilde` @ A100 node | 22.95, single-jit median | 22.87–23.04 | 7.191 [64] | 8 | 1.65 | 556 (4, gpus) | match | `lifecycle/a39d6114339d546f6bd6` | -| sma | `jax_cpu_dense_fp64_nufft` @ RAL | 3,781, single-jit block mean † | — | 3,488 [3] | 8 | 31.6 | 8.31 (29, cores) | match | `lifecycle/0cec032ed12d6d948802` | -| sma | `jax_cpu_sparse_fp64_wtilde` @ RAL | 856.0, single-jit median | 756.5–970.7 | 757.7 [3] | 8 | 1.33 | 38.3 (29, cores) | match | `lifecycle/29d350ddd936276d4121` | -| sma | `numba_cpu_sparse_fp64_wtilde` @ RAL | 287.3, numba warm iid median (route arms: direct_conv 301.3, NumPy FFT 1,040) | — | — | 1 | 0.826 | 822 (236, cores) | match | `lifecycle/0e27b1175ce084dff51e` | -| alma | `jax_gpu_sparse_fp64_wtilde` @ A100 node | 36.01, single-jit median | 35.95–36.23 | 51.22 [3] | 8 | 1.42 | 78.1 (4, gpus) | match | `lifecycle/fe32c3ee13ad9afc455c` | -| alma | `jax_cpu_sparse_fp64_wtilde` @ RAL | 2,907, single-jit block mean † | — | 2,796 [3] | 8 | 2.35 | 10.4 (29, cores) | match | `lifecycle/41fd14e1f19bad947f24` | -| alma | `numba_cpu_sparse_fp64_wtilde` @ RAL | 897.9, numba warm iid median (route arms: direct_conv 887.8, NumPy FFT 1,960) | — | — | 1 | 0.927 | 263 (236, cores) | match | `lifecycle/4663f221c8c3ce49b76f` | -| alma_high | `jax_gpu_sparse_fp64_wtilde` @ A100 node | 73.70, single-jit median | 73.66–73.96 | 86.62 [3] | 8 | 4.14 | 46.2 (4, gpus) | match | `lifecycle/2ab9504c46bb8170ba54` | -| alma_high | `jax_cpu_sparse_fp64_wtilde` @ RAL | 8,731, single-jit block mean † | — | 9,809 [3] | 8 | 9.45 | 2.96 (29, cores) | match | `lifecycle/fe0f252f68dcc26d7d13` | -| alma_high | `numba_cpu_sparse_fp64_wtilde` @ RAL | 17,723, numba warm iid median (route arms: direct_conv 16,789, NumPy FFT 16,328) | — | — | 1 | 2.32 | 13.3 (236, cores) | match | `lifecycle/d79f1b94f4b03452d745` | -| jvla | `jax_gpu_sparse_fp64_wtilde` @ A100 node | 437.8, single-jit median | 437.7–438.1 | 450.6 [3] | 8 | 14.2 | 8.88 (4, gpus) | match | `lifecycle/220d076d8421130e83cf` | -| jvla | `jax_cpu_sparse_fp64_wtilde` @ RAL | 58,366, single-jit block mean † | — | 58,633 [3] | 8 | 22.4 | 0.495 (29, cores) | match | `lifecycle/99c70939e335d08c4cff` | -| jvla | `numba_cpu_sparse_fp64_wtilde` @ RAL | 71,933, numba warm iid median (route arms: direct_conv 437,013, NumPy FFT 70,490) | — | — | 1 | 10.9 | 1.17 (84, memory) | match | `lifecycle/15aded078686cdf03ff5` | - -### Evidence: point_source_image/image_plane - -| instrument | setup @ host | headline per call (ms), basis | p10–p90 (ms) | vmap per call (ms) [batch] | cores/call | peak RSS (GB) | projected calls/s per node (workers, bound) | parity | runtime record | -|---|---|---|---|---|---|---|---|---|---| -| simple | `jax_gpu_na_fp64` @ A100 node | 0.8472, single-jit median | 0.8334–0.9058 | 0.4055 [3] | 8 | 1.18 | 9,860 (4, gpus) | match | `lifecycle/6282556b81be530f7bce` | -| simple | `jax_cpu_na_fp64` @ RAL | 1.556, single-jit median | 1.466–1.910 | 1.097 [3] | 8 | 1.06 | 26,400 (29, cores) | match | `lifecycle/6cbf08c848ae6cdb820f` | - -### Evidence: point_source_source/source_plane - -| instrument | setup @ host | headline per call (ms), basis | p10–p90 (ms) | vmap per call (ms) [batch] | cores/call | peak RSS (GB) | projected calls/s per node (workers, bound) | parity | runtime record | -|---|---|---|---|---|---|---|---|---|---| -| simple | `jax_cpu_na_fp64` @ A100 node | 0.2653, single-jit median | 0.2377–0.3155 | 0.1107 [3] | 8 | 0.577 | 136,000 (15, cores) | match | `lifecycle/c2bfeea342f97959dc7c` | -| simple | `jax_gpu_na_fp64` @ A100 node | 0.2617, single-jit median | 0.2531–0.2827 | 0.1087 [3] | 8 | 0.689 | 36,800 (4, gpus) | match | `lifecycle/fcb319f0f24b8cc9fd37` | -| simple | `jax_cpu_na_fp64` @ RAL | 0.1557, single-jit median | 0.1356–0.2076 | 0.06085 [3] | 8 | 0.573 | 476,000 (29, cores) | match | `lifecycle/61082dc032d7280b3bd1` | - -## Proposals - -Each block: §3.3 provisional (report §3.3 text, and its machine reading in `catalogue/provisional_designations.json` `tables`) → evidence (the table rows above) → proposed optimal / secondary → reason → confirms or overturns → caveats. "Uncontested" means only one setup was planned and measured on that hardware class: the evidence confirms it runs, matches parity and what it costs, but compares it with nothing. "Does not separate" means two measured setups are inside each other's spread or within the noise named. - -### imaging/mge (regime `standard`; instruments euclid, hst, jwst, ao) - -| | `gpu_a100` | `cpu_many_core` | -|---|---|---| -| §3.3 provisional | optimal `jax_gpu_dense_fp64`; secondary — | optimal `jax_cpu_dense_fp64`; secondary — | -| Evidence | only setup measured on the node: vmap per call 0.1986 [64] / 0.4116 [64] / 0.9966 [64] / 18.98 [3] ms (euclid/hst/jwst/ao); single-jit 5.916 / 6.285 / 7.000 / 15.73 ms; parity match ×4 | only setup measured: vmap per call 6.797 / 14.39 / 41.55 / 329.7 ms [3]; single-jit 7.896 / 21.22 / 50.25 / 388.9 ms; euclid and hst rows have no peak RSS, so not projected; parity match ×4 | -| **Proposed** | optimal `jax_gpu_dense_fp64`; secondary [] | optimal `jax_cpu_dense_fp64`; secondary [] | -| Reason | the only planned GPU setup; runs every instrument, ao in 15.73 ms | the only planned CPU setup for a parametric source | -| Verdict | **confirms (uncontested)** | **confirms (uncontested)** | -| Caveats | C2; C4 (GPU rows on jax 0.10.2); the node-CPU arm was not measured (Q2), though on its own ral node `jax_cpu_dense_fp64` projects 698 calls/s (jwst) and 88.0 (ao) against the gpu node's 4,010 and 211, so a whole ral node is behind | C1 (2a load 8.6–37; not in the quiet rerun); C4 (no eigen flag; D12 measured +25 % on laptop group/mge); C7 | - -### imaging/rectangular, imaging/delaunay, imaging/delaunay_nn (regime `standard`) - -**`gpu_a100`** — §3.3: optimal `jax_gpu_dense_fp64` ("`jax_gpu_sparse_fp64` secondary until the light_fixed divergence is explained"); machine-reading secondary [`jax_cpu_sparse_fp64`, `jax_gpu_sparse_fp64`]. - -| Likelihood | dense vs sparse, vmap per call (ms) euclid / hst / jwst / ao | single-jit p10–p90 overlap? | Per node | -|---|---|---|---| -| rectangular | 7.926 vs 13.19 / 25.50 vs 41.19 / 62.84 vs 107.5 / 310.8 vs 1,053 | no, on any instrument | same order (one process per GPU each): 505 vs 303 … 12.9 vs 3.80 calls/s | -| delaunay | 14.80 vs 18.16 / 35.05 vs 47.93 / 72.29 vs 108.1 / 366.9 vs 935.3 | no; closest euclid 44.24–45.63 vs 46.67–47.30 ms | 270 vs 220 … 10.9 vs 4.28 | -| delaunay_nn (hst only) | 42.74 vs 1,149 | no | 93.6 vs 3.48 | - -`jax_cpu_sparse_fp64` on the gpu node's CPU is 1–2 orders slower than either GPU setup on every cell (e.g. hst Delaunay vmap 2,110 ms [3], 7.11 calls/s per node). Parity match on all 27 cells. - -- **Proposed:** optimal `jax_gpu_dense_fp64`; secondary [`jax_gpu_sparse_fp64`, `jax_cpu_sparse_fp64`], for each of the three likelihoods. -- **Reason:** dense is fastest per call and per node on every instrument, separated beyond the spread. -- **Verdict:** **confirms** §3.3 (optimal and secondary). -- **Caveats:** C2; C4 (GPU rows on jax 0.10.2; a jaxlib change could move GPU numbers, untested). Q2: numba was never measured on the gpu node's 124 cores. On its own ral node numba projects 248 calls/s on hst Delaunay against 114 for the gpu node's GPUs (2a page), so on a per-node axis that counts the GPU node's cores the CPU arm could matter, and there is no row to say. The 2026-10-18 `jax_gpu_sparse_fp64` light_fixed divergence blocks only an Optimal designation of that setup (ledger, phase 4 card). delaunay_nn `jax_gpu_sparse_fp64` at 1,149 ms against 42.74 ms dense is flagged on the 2a page ("worth a look in phase 3"); it does not change the order. ao A100 peak RSS (39.8 GB) is the multi-leg job's peak, an upper bound. - -**`cpu_many_core`** — §3.3: optimal `numba_cpu_sparse_fp64` "+ cores"; secondary `jax_cpu_sparse_fp64` (numba dense dropped 2026-10-18); rule branches on "cores ≥ threshold (phase 4 efficiency curve); source pixels". - -| Likelihood | numba vs JAX CPU sparse, per node (calls/s) euclid / hst / jwst / ao | per call (ms): numba warm iid median vs JAX vmap [3] or [1] | -|---|---|---| -| rectangular | numba not projected (no peak RSS) vs 42.5 / 339 vs 14.3 / 140 vs 6.89 / 3.21 (32 workers, memory) vs 0.594 | 282.5 vs 683.0 / 696.7 vs 2,029 / 1,688 vs 4,210 / 9,982 vs 48,794 | -| delaunay | 288 vs 35.1 / 248 vs 15.3 / 135 vs 6.65 / 4.61 (40, memory) vs 0.524 | **820.0 vs 826.6** / 951.7 vs 1,895 / 1,745 vs 4,361 / 8,671 vs 55,292 | -| delaunay_nn (hst) | 182 vs 4.51 | 1,295 vs 6,427 | - -- **Proposed:** optimal `numba_cpu_sparse_fp64`; secondary [`jax_cpu_sparse_fp64`], each likelihood. -- **Reason:** numba is ahead per node on every projected cell (5× to 40×) at one core per call. Per call it is ahead everywhere except euclid Delaunay, where the two tie (0.8 %). -- **Verdict:** **confirms** §3.3. The "+ cores" threshold cannot be written yet (phase 4). The draft rule says workers are capped by node memory over peak RSS, which binds at ao (32 and 40 workers). -- **Caveats:** C1 (2a RAL load 8.6–37; not in the quiet rerun); C4 (JAX CPU side only); C7; C9. euclid rectangular numba has no peak RSS, so its per-node figure is missing (per call it is 2.4× ahead at 1/8 the cores). The §3.3 laptop optimal for pixelized imaging (`jax_cpu_dense_fp64`) was never measured on any host. - -### interferometer/mge (sma only; 190 visibilities → regime `n_vis_lt_1e5`) - -| | `gpu_a100` | `cpu_many_core` | -|---|---|---| -| §3.3 provisional | `jax_gpu_dense_fp64_` by the `n_vis × n_pix` crossover ≈ 1e7; secondary — | `jax_cpu_dense_fp64_`; secondary — | -| Evidence | `jax_gpu_dense_fp64_nufft` single-jit 3.718 ms (3.670–3.797), vmap 0.5729 [64]; parity match | `jax_cpu_dense_fp64_nufft` single-jit 90.63 ms (71.48–125.1), vmap 112.5 [3]; 258 calls/s per node; parity match | -| **Proposed** | optimal `jax_gpu_dense_fp64_nufft`; secondary [] — regime `n_vis_lt_1e5` only | optimal `jax_cpu_dense_fp64_nufft`; secondary [] — `n_vis_lt_1e5` only | -| Reason | the only measured setup | the only measured setup | -| Verdict | **confirms the NUFFT half (uncontested); the DFT branch is untested** (2b R2: no DFT cells), so the evidence does not separate DFT from NUFFT; no MGE row above sma (R9), so no proposal for the other regimes | same | -| Caveats | sma here has 190 visibilities at σ = 1000 (2b caveats), a small regime anchor; C2; C4 | C1 (2b load 45–72; rerun 413268); C4; C7 | - -### interferometer/rectangular, interferometer/delaunay - -Regimes as `provisional_designations.json` names them, read from each row's `configuration.visibilities`: sma 190 → `n_vis_lt_1e5`; alma 1,000,000 and alma_high 5,000,000 → `n_vis_1e5_1e7`; jvla 25,000,000 → `n_vis_ge_1e7`. Note: every catalogue record carries `regime: standard`. Designating by n_vis regime needs the producer to emit these regimes (Q5). - -**`gpu_a100`** — §3.3: optimal `jax_gpu_sparse_fp64_wtilde`, `streaming` at `n_vis ≥ 1e7`; secondary "dense routes" (machine reading: `jax_gpu_dense_fp64_{dft,nufft}`). - -| Regime | Evidence (rectangular; delaunay) | Proposed optimal / secondary | Verdict | -|---|---|---|---| -| `n_vis_lt_1e5` (sma) | W~ vmap 7.191 [64] vs dense NUFFT 50.13 [1] ms; single-jit 22.95 (22.87–23.04) vs 50.06 (50.00–50.33); per node 556 vs 79.8. Delaunay 12.09 [64] vs 55.77 [1]; 27.49 (27.39–27.69) vs 55.86 (55.76–56.23); 331 vs 71.7 | `jax_gpu_sparse_fp64_wtilde` / [`jax_gpu_dense_fp64_nufft`] | **confirms** (DFT secondary untested, R2) | -| `n_vis_1e5_1e7` (alma, alma_high) | W~ only: rectangular single-jit 36.01 / 73.70 ms; delaunay 40.26 / 82.48 ms. The dense route cannot form its mapping matrix above sma (R1(a): 20.5 GB at alma, 102 GB at alma_high) | `jax_gpu_sparse_fp64_wtilde` / [] | **confirms optimal (uncontested); overturns the provisional secondary**: no dense route runs in this regime | -| `n_vis_ge_1e7` (jvla) | W~ only: rectangular 437.8 ms (437.7–438.1), delaunay 440.2 ms (440.0–440.7), peak 14.2 / 14.3 GB on one A100 | `jax_gpu_sparse_fp64_wtilde` / [] | **departs from §3.3 by absence, not by measurement**: §3.3 names `streaming` here and streaming was not measured, so W~ vs streaming does not separate (Q10) | - -Caveats (all regimes): C2; C4. - -**`cpu_many_core`** — §3.3: "per the interferometer decision matrix: numba direct_conv vs FFT cost model (symmetric gate 0.7); `streaming` at large n_vis"; machine reading optimal `numba_cpu_sparse_fp64_wtilde`, secondary [`jax_cpu_dense_fp64_{dft,nufft}`, `jax_cpu_sparse_fp64_wtilde`]. - -| Regime | Per node, numba vs JAX CPU W~ (calls/s) rectangular; delaunay | Per call (ms), numba pick vs JAX CPU W~ vmap [3] | Proposed optimal / secondary | Verdict | -|---|---|---|---|---| -| `n_vis_lt_1e5` (sma) | 822 vs 38.3 (dense NUFFT 8.31); 704 vs 33.8 (dense 4.74) | 287.3 vs 757.7; 335.1 vs 859.2 (cost model picked direct_conv; forced arms 301.3 / 338.4) | `numba_cpu_sparse_fp64_wtilde` / [`jax_cpu_sparse_fp64_wtilde`, `jax_cpu_dense_fp64_nufft`] | **confirms** (DFT untested) | -| `n_vis_1e5_1e7` (alma, alma_high) | alma 263 vs 10.4, alma_high 13.3 vs 2.96; alma 286 vs 10.7, alma_high 20.9 vs 3.41 | alma 897.9 vs 2,796 and 823.6 vs 2,712 (numba ahead); **alma_high 17,723 vs 9,809 and 11,301 vs 8,500 (JAX CPU ahead per call)** | `numba_cpu_sparse_fp64_wtilde` / [`jax_cpu_sparse_fp64_wtilde`] | **confirms on the per-node axis**; on a per-call axis the regime would split between 1e6 and 5e6 visibilities (C6) | -| `n_vis_ge_1e7` (jvla) | rectangular 1.17 (84 workers, memory) vs 0.495 — separated (2.4×); **delaunay 1.06 (78, memory) vs 0.848 — 25 %** | 71,933 vs 58,633; 73,492 vs 34,209 (JAX CPU ahead per call) | rectangular: `numba_cpu_sparse_fp64_wtilde` / [`jax_cpu_sparse_fp64_wtilde`]. **delaunay: does not separate** (hold; §3.3's numba stands as provisional) | rectangular **confirms** per node; delaunay: no call. The 25 % margin rests on one numba warm draw at jvla and two loaded-node rows (C1), with η unmeasured and JAX CPU fixed at 8 threads (C7) | - -- **The cost-model miss (2b page "The numba route").** At delaunay alma_high the cost model picked the NumPy FFT route (11,301 ms) but the forced `direct_conv` arm ran in 8,777 ms (22 % faster), on 6 warm draws on a loaded node. On the same node, two arms of one route differ by up to 9 % (rectangular alma_high: FFT pick 17,723 ms against forced FFT 16,328 ms). The miss is larger than that, but it is still thin evidence. It does not change the setup_id (both routes are inside `numba_cpu_sparse_fp64_wtilde`), and the per-node rank holds on either route. On the per-call axis, `direct_conv` would bring numba level with JAX CPU W~ (8,777 against 8,500 ms), which then does not separate. The fix belongs to the route-gate decision (PyAutoPulse `interferometer-route-gate-cost-model`, `direct-conv-symmetric-gate`), not to the designation. The draft rule says "route chosen by the packaged cost model" so a gate change does not reopen the designation. -- **Caveats:** C1 (every 2b RAL CPU row; quiet reruns 413268–413271 queued); C4 (JAX CPU side); C7; C9. Streaming on CPU was not measured. - -### point_source_image/image_plane (instrument `simple`; regime `standard`) - -| | `gpu_a100` | `cpu_many_core` | -|---|---|---| -| §3.3 provisional | optimal `jax_gpu_na_fp64` (§3.3 writes `jax_gpu_dense_fp64`; R1 machine reading `_na_`); secondary — | optimal `jax_cpu_na_fp64`; secondary — | -| Evidence (Solved likelihood, human ruling 2026-10-29) | single-jit 0.8472 ms (0.8334–0.9058), vmap 0.4055 [3]; 9,860 calls/s per node; parity match | single-jit 1.556 ms (1.466–1.910), vmap 1.097 [3]; 26,400 calls/s per ral node; parity match | -| **Proposed** | optimal `jax_gpu_na_fp64`; secondary [] | optimal `jax_cpu_na_fp64`; secondary [] | -| Reason | the only setup planned on the gpu node; faster per call than RAL CPU (0.8472 against 1.556 ms) | the only setup planned | -| Verdict | **confirms (uncontested)** on the per-call axis. On the per-node axis it is open: `jax_cpu_na_fp64@hpc_a100` was not planned for the image plane, and on its own ral node `jax_cpu_na_fp64` projects 26,400 calls/s against the gpu node's 9,860, so the node-CPU arm could win on a gpu node (Q2). Not separable without that row | **confirms (uncontested)** | -| Caveats | C2; C4 | C1 (load 33.4 at import; rerun 413267); C4; C7. The plain likelihood (`experiments/plain_runtime/`) is within 4 % of the solved one on every setup (2c page) | - -### point_source_source/source_plane (instrument `simple`; regime `standard`) - -| | `gpu_a100` | `cpu_many_core` | -|---|---|---| -| §3.3 provisional | optimal `jax_cpu_na_fp64` ("cheap; GPU warm-up dominates"); secondary `jax_gpu_na_fp64` | optimal `jax_cpu_na_fp64`; secondary `jax_gpu_na_fp64` (host-agnostic Secondary column; a GPU setup on a GPU-less host, D2 / #481) | -| Evidence | node CPU `jax_cpu_na_fp64` single-jit 0.2653 ms (0.2377–0.3155), vmap 0.1107 [3], **136,000 calls/s per node (15 workers × 8 cores)**; GPU `jax_gpu_na_fp64` 0.2617 ms (0.2531–0.2827), vmap 0.1087 [3], **36,800 (4 GPUs)**; breakdown fused solved 0.261 vs 0.250 ms (2c page); parity match ×2 | `jax_cpu_na_fp64` single-jit 0.1557 ms (0.1356–0.2076), vmap 0.06085 [3]; 476,000 calls/s per ral node; parity match | -| **Proposed** | optimal `jax_cpu_na_fp64`; secondary [`jax_gpu_na_fp64`] | optimal `jax_cpu_na_fp64`; secondary [] | -| Reason | per call the two **do not separate** (1.4 % apart, inside each other's p10–p90; GPU ahead by ≤ 4 % in both scripts); per node the CPU cores project 3.7× the GPUs | the only setup runnable on the host | -| Verdict | **confirms §3.3 on the per-node axis only**; on the per-call axis the evidence does not separate them (the 2c page verdict) | **confirms the optimal; overturns the secondary** (no GPU on the host; #481 already stopped planning it) | -| Caveats | C2; C4; C9 (15 JAX workers on a 124-core node at η = 1, `n_batch` not modelled); the A100 GPU per call rose 12 % against 2026.10.17.1 (0.233 → 0.262 ms), not investigated (2c page). The proposal depends on Q1 (axis) and Q2 (GPU node's CPU cores counted) | C1 (load 33.4; rerun 413267); C4; C7 | - -## Summary - -| Likelihood | Regime | `gpu_a100` proposed optimal / secondary | vs §3.3 | `cpu_many_core` proposed optimal / secondary | vs §3.3 | -|---|---|---|---|---|---| -| imaging/mge | standard | `jax_gpu_dense_fp64` / — | confirms (uncontested) | `jax_cpu_dense_fp64` / — | confirms (uncontested) | -| imaging/rectangular | standard | `jax_gpu_dense_fp64` / `jax_gpu_sparse_fp64`, `jax_cpu_sparse_fp64` | confirms | `numba_cpu_sparse_fp64` / `jax_cpu_sparse_fp64` | confirms | -| imaging/delaunay | standard | same as rectangular | confirms | same as rectangular | confirms (per-call tie at euclid) | -| imaging/delaunay_nn | standard (hst) | same as rectangular | confirms | same as rectangular | confirms | -| interferometer/mge | n_vis_lt_1e5 (sma) | `jax_gpu_dense_fp64_nufft` / — | confirms NUFFT; DFT untested | `jax_cpu_dense_fp64_nufft` / — | confirms NUFFT; DFT untested | -| interferometer/{rectangular, delaunay} | n_vis_lt_1e5 (sma) | `jax_gpu_sparse_fp64_wtilde` / `jax_gpu_dense_fp64_nufft` | confirms | `numba_cpu_sparse_fp64_wtilde` / `jax_cpu_sparse_fp64_wtilde`, `jax_cpu_dense_fp64_nufft` | confirms | -| interferometer/{rectangular, delaunay} | n_vis_1e5_1e7 (alma, alma_high) | `jax_gpu_sparse_fp64_wtilde` / — | confirms optimal; overturns secondary (dense cannot run) | `numba_cpu_sparse_fp64_wtilde` / `jax_cpu_sparse_fp64_wtilde` | confirms per node (per call splits) | -| interferometer/rectangular | n_vis_ge_1e7 (jvla) | `jax_gpu_sparse_fp64_wtilde` / — | streaming untested (Q10) | `numba_cpu_sparse_fp64_wtilde` / `jax_cpu_sparse_fp64_wtilde` | confirms per node | -| interferometer/delaunay | n_vis_ge_1e7 (jvla) | `jax_gpu_sparse_fp64_wtilde` / — | streaming untested (Q10) | **does not separate** (numba 1.06 vs JAX 0.848 calls/s) | hold | -| point_source_image/image_plane | standard | `jax_gpu_na_fp64` / — | confirms per call; per node open (Q2) | `jax_cpu_na_fp64` / — | confirms (uncontested) | -| point_source_source/source_plane | standard | `jax_cpu_na_fp64` / `jax_gpu_na_fp64` | confirms per node; per call does not separate | `jax_cpu_na_fp64` / — | confirms optimal; overturns secondary | - -26 proposals (Appendix A): 25 with a proposed optimal, 1 hold. None overturns a §3.3 **optimal** on measured evidence. The departures are three dropped secondaries that cannot run (dense interferometer above sma ×2 likelihoods; GPU on a GPU-less host) and §3.3 branches that were never measured (interferometer DFT, GPU streaming at n_vis ≥ 1e7, every laptop cell). - -## Human rulings (2026-10-30, chat, after the "campaigns complete" gate) - -- **Q1 + Q3 — adopted as recommended:** rank by projected calls/s per node within each hardware class, per call as secondary evidence; record a designation only where setups separate beyond the recorded spread (or the arm-to-arm noise), otherwise keep the §3.3 provisional label with no decision. -- **Q2 — A100s only:** `gpu_a100` designations are GPU setups; the node's CPU stays a measured secondary where it exists. No node-CPU rows are added. -- **Q7 — re-measure the 2a–2c JAX rows:** day zero is one environment (jax/jaxlib 0.11.2, `--xla_cpu_multi_thread_eigen=false` on CPU legs). Every 2a/2b/2c JAX row (CPU and GPU) is re-measured; numba rows are carried. The 2b/2c quiet reruns (RAL 413319–413323, on 0.11.2 with the flag) already cover the 2b/2c RAL CPU legs; the remainder is every 2a JAX leg and the 2b/2c A100 JAX legs. -- **Q8 — freeze on 2026.10.25.1:** every row is on it; no carry. -- **Q9 — settled by the human's 2026-10-30 ruling on loaded RAL nodes** ("ignore loaded node stuff for now"): the 2a RAL CPU rows are accepted. -- Q4, Q5, Q6, Q10, Q11: the recommended handling in this file stands unless the human says otherwise ((a) `basis: projected` in the decision prose; designate interferometer by `standard` with an instrument-keyed rule unless the producer emits n_vis regimes; laptop undesignated; untested branches named in the rule; GPU-class secondaries GPU-only per Q2). - -## Questions for the human - -- **Q1 — Axis.** The report amendment (2026-10-25) pre-registered per-node projected throughput within each hardware class, with per call as secondary evidence. Confirm it for the records. It decides four proposals: interferometer pixelized alma_high and jvla on RAL (numba per node, JAX CPU per call), euclid Delaunay imaging on RAL (per-call tie), and the source-plane A100 node (per-call tie, CPU cores 3.7× per node). -- **Q2 — What a GPU node's budget includes.** Does `gpu_a100` mean "use the A100s" or "use the gpu node": 4 GPUs plus 124 cores? Source plane measured the node CPU (D2) and the proposal there rests on it. Image-plane point source, imaging pixelized (numba) and interferometer were never measured on the gpu node's CPU, and on their own ral nodes those CPU setups project ahead of the gpu node on several cells (point source 26,400 vs 9,860; hst Delaunay 248 vs 114). If the node counts, those arms need rows before the GPU designations are final. Rows are not projected across machines (human 2026-10-25). -- **Q3 — Close calls.** Proposed handling: record a designation only where the setups separate on the chosen axis beyond the recorded p10–p90 (or, with no spread recorded, beyond the arm-to-arm noise seen on the same node, about 9 % for 2b numba). Otherwise record "does not separate" and keep the §3.3 provisional label without a decision. Current cases: interferometer/delaunay jvla on RAL per node (25 %; hold), source plane on the A100 node per call (1.4 %), and euclid Delaunay imaging on RAL per call (0.8 %). -- **Q4 — `basis: projected`.** The amendment says pre-phase-4 designations carry `basis: projected`. Pulse's `decisions.yaml` refuses any field outside `id, title, date, url, kind` plus the eight designation fields (`pulse/decisions.py`). Options: (a) say it in the canonical `decisions/.md` and the `rule` sentence; (b) a Pulse change adding `basis`. The appendix assumes (a). -- **Q5 — Interferometer regimes.** Every catalogue record says `regime: standard`. Designate interferometer by the n_vis regimes in `provisional_designations.json` (needs the producer to emit `regime` per record, and a decision on where alma_high at 5e6 sits), or by `standard` with an instrument-keyed rule? -- **Q6 — Laptop.** No laptop evidence can be current (R7), and a designation needs non-empty `evidence`. Leave `laptop` undesignated at day zero, or record §3.3's laptop column citing the CPU-node rows? -- **Q7 — The jax environment (C4).** The 2a/2b/2c JAX rows ran on jax/jaxlib 0.10.2, which tag 2026.10.25.1 excludes (`!=0.10.*`, Heart#274). 2d–2g will run on 0.11.2 with the D12 eigen flag. Freeze the 0.10.2 rows as day zero, or re-measure every JAX row (CPU and GPU) on 0.11.2 with the flag so day zero is one environment? Numba rows are unaffected. -- **Q8 — Which tag phase 3 freezes on.** See the next section. -- **Q9 — 2a RAL CPU rows.** They ran at load 8.6–37 and are not in the quiet rerun. Accept them, or rerun them quiet? -- **Q10 — Untested §3.3 branches.** Interferometer MGE DFT (R2: no DFT cells), GPU `streaming` at n_vis ≥ 1e7, CPU streaming. Record designations without them, with the branch named as untested in the rule, or measure first? -- **Q11 — Secondary lists.** Is `jax_cpu_sparse_fp64` (the gpu node's CPU) a useful secondary for imaging on `gpu_a100`, as §3.3's host-agnostic column implies, or should a GPU-class secondary be GPU-only? - -## Release interaction (the tag phase 3 freezes on) - -Every proposal rests on rows published at 2026.10.25.1 (imaging measured on 2026.10.23.1 and carried by `catalogue/release_revisions.json`, human ruling 2026-10-26, #466). Phase 3 must freeze on a released tag (ledger orchestration step 7). Two facts: - -1. **A release after the pin already exists:** 2026.10.26.1 (all five libraries tagged 2026-10-25/26; PyAutoNerves 2026.10.25.1 = 2026.10.26.1 = `main` = ec8b5c1). The release the human is planning now would come after it. -2. **Likelihood-path commits since 2026.10.25.1** (`git log 2026.10.25.1..origin/main`, fetched 2026-10-29; "[26.1]" = already in 2026.10.26.1): - -| Repo | Commit | What | Touches a 2a–2c cell's per-call path? | -|---|---|---|---| -| PyAutoArray | 71a3ef49 [26.1] | matrix-free interferometer route, `Settings(interferometer_route="matrix_free")`; `inversion/inversion/factory.py` gains an opt-in branch, `inversion/interferometer/matrix_free.py` new | No by default: the branch fires only when the setting is `"matrix_free"` (2b's matrix-free experiment, never current). It is an edit to the pixelized interferometer factory, so re-run the 2b parity smokes before carrying | -| PyAutoArray | 171eacca [26.1] | config leaf comments | No (comment-only; values unchanged in `general.yaml`) | -| PyAutoArray | cd26722b | introductory four-panel imaging plot | No (plotting) | -| PyAutoGalaxy | 499827fe [26.1] | `PowerLaw` JAX unit-vector transform | No: the standard cells use `Isothermal` + `ExternalShear` (`_production_config.py`; point-source scripts `Isothermal`). `PowerLaw` appears only in fixed-light and experiment scripts | -| PyAutoGalaxy | 36ec41b2 [26.1] | `MassSheet` JAX deflections | No (not in the standard cells) | -| PyAutoGalaxy | 9be12cae [26.1] | reject singular isothermal dipole multipoles (`power_law_multipole.py`) | No (not in the standard cells) | -| PyAutoGalaxy | 0fee6daf [26.1] | `SersicCoreSph` mass-to-light ratio | No | -| PyAutoGalaxy | eaf12527, ac1adc08, 6c0fac8f [26.1] | latent ("derived") parameter declarations (`convert.py`; `ExternalShear` +3 lines of declarations) | No per-call change expected (declarations for corner plots) | -| PyAutoGalaxy | acfc61ad | gNFW convergence integral tabulated instead of per-point `quad` (perf) | No for 2a–2c; a 2d–2g cell using gNFW would change (the profiling scripts reference `NFWSph`, `NFWMCRLudlowSph`, not gNFW) | -| PyAutoGalaxy | f539aca7 | `mass_integral` length-1 radius fix (Einstein radius, angular mass) | No (not called in a likelihood) | -| PyAutoGalaxy | 6879610f, abcb81b8, 22f849c9 | aperture mass, `MassBudget` (lenstwin), plots | No | -| PyAutoLens | f6800bb50, 9541c87bb | `al.twins` (lenstwin) | No (new package) | -| PyAutoLens | 8cff95d5f [26.1], a0666e7ef, 05f0a776d, 1d430dcd9 | config comments, cluster/intro plots, point-dataset tests | No | -| PyAutoFit | 00a153ceb [26.1] | config leaf comments | No | -| PyAutoNerves | — | no commits | — | - -Dependencies: no `pyproject.toml` change to jax, jaxlib or numba floors since the pin. The only change is PyAutoGalaxy's `autofit>=2026.10.23.1` floor. Non-comment config diffs in `general.yaml` / `non_linear.yaml`: none. - -**The agent's reading for the human:** a release cut from today's mains changes no per-call likelihood of a 2a–2c standard cell. The one likelihood-adjacent edit is the opt-in branch in the interferometer inversion factory. The options: - -- (a) **Freeze on 2026.10.25.1.** Valid as a released tag, but the day-zero pin is then older than the library users install. -- (b) **Carry the 2a–2c rows to the new tag** under the existing `carry_forward` rule (the #466 precedent: re-stamp, don't rerun), after the 2b parity smokes pass on the new tag. -- (c) **Re-measure on the new tag.** - -The tag diff alone does not justify (c). The environment does: C4/Q7 (the rows ran on jax 0.10.2, which the tag excludes) is independent of which tag is chosen. If the human wants one environment for 2a–2g, (c) for the JAX rows (with numba rows carried) is the consistent choice, and it could share RAL time with the 2d–2g batches. Whatever is chosen, 2d–2g should run on the tag phase 3 will freeze on, so they need no carry. - -## What phase 3 still needs (checklist) - -From 2d–2g and phase 2: - -- [ ] 2d multi_galaxy + group, 2e cluster, 2f multi_dataset + datacube, 2g weak: decision reviews, batch-0 goes, RAL batches, PR B, campaign pages with verdicts (`likelihood_lifecycle_p2{d_galaxy_group,e_cluster,f_dataset_datacube,g_weak}_runs.md`). Coverage today: 272 planned, 176 current, 96 missing (`dashboard/coverage.md`, 2026-10-29T09:46:25Z), the 96 all theirs. -- [ ] Their evidence for the "as imaging" / "as interferometer" / "as point source" inheritance in §3.3 (multi_galaxy, group, multi_dataset → imaging; datacube → interferometer per channel; cluster → point source × n_sources; weak → `jax_cpu_dense_fp64` with a GPU secondary): their designations are drafted after their campaigns, like these. -- [x] Quiet-rerun ingest — DONE 2026-10-31, autolens_profiling#494, record `complete/2026/10/likelihood-lifecycle-p2bc-quiet-ingest.md` (was RAL 413267–413271 → 413319–413323): replaces 38 2b and 2 2c RAL CPU rows. Then re-check every `cpu_many_core` interferometer and point-source proposal above, especially the interferometer/delaunay jvla hold and the alma_high per-call flip, and re-resolve evidence ids (path-hashed). -- [ ] The human's "campaigns complete" confirmation (the phase 3 gate). - -Human decisions before records (this file's questions): Q1 axis; Q2 GPU-node budget (and, if the node counts, node-CPU rows for image-plane point source, imaging pixelized numba and interferometer); Q3 close-call rule; Q4 where `basis: projected` lives; Q5 interferometer regimes; Q6 laptop; Q7 jax environment; Q8 tag; Q9 2a RAL load; Q10 untested branches; Q11 secondary lists. - -Phase 3 deliverables themselves (ledger card; report §4): - -- [ ] Pin the released tag; re-measure (or carry, by ruling) every Optimal/Secondary cell not on it; stamp `day_zero`; Pulse snapshot `day_zero`. -- [ ] The designation records: one canonical `decisions/.md` per likelihood × regime × hardware class plus its `decisions.yaml` row (human-recorded; Appendix A is the draft). Then producers re-declare `class: optimal` + `decision_id` on the cited rows, and `pyauto-pulse check` resolves them. -- [ ] `catalogue/provisional_designations.json` replaced or retired in favour of the records (it must agree with them, and phase 5's library rule table is generated from and tested against them). -- [ ] `wiki/campaigns///day_zero.md` per likelihood, with rules in dataset-property terms. -- [ ] Pulse `setup-baseline` campaign adopted and closed, its 1,044-slot manifest replaced (R10). -- [ ] Coverage shows no `not_measured` Optimal cell; the `runtime_estimates` export exists (for 5E). - -## Appendix A — draft `decisions.yaml` entries (NOT published, NOT indexed) - -Generated from `dashboard/catalogue.json` at autolens_profiling 32c0becd. Each entry was checked with `pulse.decisions._designation` (PyAutoPulse `pulse/decisions.py`, identical to `main` 4a4bdee). `evidence` lists, per instrument and setup measured on that host class, the runtime record id followed by its parity record id. `date` is a placeholder for the human's decision date, quoted as a string when recorded. The `# separation:` comment above each entry is this draft's label on the pre-registered per-node axis (see the Proposals for where the per-call axis differs), not a field. The `hold` entry must not be recorded as written. Ids follow the README template `--` in kebab case. Re-resolve every id at the freeze commit (path-hashed ids; quiet-rerun ingest). - -```yaml -# separation: uncontested -- id: imaging-mge-standard-gpu-a100 - title: 'Designation: imaging/mge standard gpu_a100' - date: YYYY-MM-DD - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/imaging-mge-standard-gpu-a100.md - kind: designation - likelihood: imaging/mge - regime: standard - hardware_class: gpu_a100 - optimal: jax_gpu_dense_fp64 - secondary: [] - evidence: [lifecycle/770dce7d7db7a1fc3b53, lifecycle/2d7064bb66242f2ca6cc, lifecycle/8a475e9abd97a8c4a1c0, lifecycle/4e93e744f3e1295b3c8d, lifecycle/0756e600e86d7ae6a462, lifecycle/a58929ead49f62c064da, lifecycle/4b514c4262172f610fee, lifecycle/eb44c9d7e6987735cdd1] - rule: Any imaging dataset fitted with a parametric (MGE) source on an A100 node uses jax_gpu_dense_fp64. - supersedes: null -# separation: uncontested -- id: imaging-mge-standard-cpu-many-core - title: 'Designation: imaging/mge standard cpu_many_core' - date: YYYY-MM-DD - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/imaging-mge-standard-cpu-many-core.md - kind: designation - likelihood: imaging/mge - regime: standard - hardware_class: cpu_many_core - optimal: jax_cpu_dense_fp64 - secondary: [] - evidence: [lifecycle/190ebc582d9aba9aaa9c, lifecycle/acf067a34aa2005d1b11, lifecycle/54979849c807d452c510, lifecycle/d2aece86956eba227ada, lifecycle/4baa9bc04c8d24a713b6, lifecycle/2cf94e6d7d8231a57c92, lifecycle/3216ffc143645fb46c72, lifecycle/a37560173314cc078894] - rule: Any imaging dataset fitted with a parametric (MGE) source on a many-core CPU node with no GPU uses jax_cpu_dense_fp64. - supersedes: null -# separation: separated -- id: imaging-rectangular-standard-gpu-a100 - title: 'Designation: imaging/rectangular standard gpu_a100' - date: YYYY-MM-DD - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/imaging-rectangular-standard-gpu-a100.md - kind: designation - likelihood: imaging/rectangular - regime: standard - hardware_class: gpu_a100 - optimal: jax_gpu_dense_fp64 - secondary: [jax_gpu_sparse_fp64, jax_cpu_sparse_fp64] - evidence: [lifecycle/9e4861d45b9802a91868, lifecycle/eb746ec4a8c1668c7a40, lifecycle/456f7d65babc5524183a, lifecycle/a429326f9f33ea12e6b8, lifecycle/bc5ed323618c58fc7682, lifecycle/688c98aeb69ac24ea6f3, lifecycle/22c24ae6e2c83dc51d89, lifecycle/0b43689b6e8f601ade78, lifecycle/42f6a707360ce63b8150, lifecycle/51cd6f8ab1edb2761cb8, lifecycle/cc3f3365b6ac65388a93, lifecycle/d1a3e06d7571bd6b5eba, lifecycle/cfba00e49ad2fb8681cb, lifecycle/72add1d2a2a70bb1304c, lifecycle/ec69a200557ea8212e5e, lifecycle/76d01fc60350dd469eed, lifecycle/bdffd9d6d157b3b66435, lifecycle/df1e242101ab32dea573, lifecycle/3617cdce4ec7d5357c4f, lifecycle/48ae4d8138f5bb99846a, lifecycle/d570569f32c953038fde, lifecycle/32ca51df82e1724685ab, lifecycle/46db4990a22e25aee123, lifecycle/67787bf45d6bb0b3aa42] - rule: Any imaging dataset with a rectangular pixelized source on an A100 node uses jax_gpu_dense_fp64, falling back to jax_gpu_sparse_fp64. - supersedes: null -# separation: separated -- id: imaging-rectangular-standard-cpu-many-core - title: 'Designation: imaging/rectangular standard cpu_many_core' - date: YYYY-MM-DD - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/imaging-rectangular-standard-cpu-many-core.md - kind: designation - likelihood: imaging/rectangular - regime: standard - hardware_class: cpu_many_core - optimal: numba_cpu_sparse_fp64 - secondary: [jax_cpu_sparse_fp64] - evidence: [lifecycle/4c53e409a27040f5d6a4, lifecycle/39a0a9b81376f2be8446, lifecycle/6060fdcfa2e5a4a0c168, lifecycle/ae663292d53c60a65c62, lifecycle/2b5e34f509175fd4d030, lifecycle/ee2df565d3603ba2bbd3, lifecycle/b62534053c00fb102bf4, lifecycle/8db1316c3491c8569223, lifecycle/9bb2e30e94491253641b, lifecycle/dd67472c35e8ed230b03, lifecycle/304ac75d242dcbc2c22f, lifecycle/0de8cf81e718d21ee2aa, lifecycle/d7020017fca2249bf32b, lifecycle/e44433f6b0bb6fbb1519, lifecycle/403420f8debaaa38956c, lifecycle/a721c437cf9355984ca5] - rule: Any imaging dataset with a rectangular pixelized source on a many-core CPU node with no GPU uses numba_cpu_sparse_fp64, one serial likelihood per core (workers capped by node memory over peak RSS). - supersedes: null -# separation: separated -- id: imaging-delaunay-standard-gpu-a100 - title: 'Designation: imaging/delaunay standard gpu_a100' - date: YYYY-MM-DD - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/imaging-delaunay-standard-gpu-a100.md - kind: designation - likelihood: imaging/delaunay - regime: standard - hardware_class: gpu_a100 - optimal: jax_gpu_dense_fp64 - secondary: [jax_gpu_sparse_fp64, jax_cpu_sparse_fp64] - evidence: [lifecycle/a9e102b324300939da14, lifecycle/1c09fadde930b03b7518, lifecycle/c07af59a8d393975dd28, lifecycle/f706db5c42869fee8ea5, lifecycle/371f67d50254479493ee, lifecycle/b72ae27c889b5f309c7d, lifecycle/0f45aa8eb79d60157031, lifecycle/d8087ff55a7a9c1902cc, lifecycle/73c19173fcc983318b61, lifecycle/dbb5a42b977bbac7679e, lifecycle/12c678df16e04f4f9011, lifecycle/720a326dbad29c263006, lifecycle/97d2ae3cab5f9bbc9d8f, lifecycle/e0e005616c964f881ccd, lifecycle/12348bea7be2ca70cffb, lifecycle/ff61f1cb7a87d8382b9a, lifecycle/d34ebb3d52e02dfb8b16, lifecycle/5f300473b328b24bac66, lifecycle/780ad479b1fe66279696, lifecycle/afc236d86c1d2fad6db9, lifecycle/fa028d54604cd08d3555, lifecycle/9b34de15d3aca2deb34c, lifecycle/99d7c3c7623e3d43d059, lifecycle/93f7eea188801e17127a] - rule: Any imaging dataset with a Delaunay pixelized source on an A100 node uses jax_gpu_dense_fp64, falling back to jax_gpu_sparse_fp64. - supersedes: null -# separation: separated -- id: imaging-delaunay-standard-cpu-many-core - title: 'Designation: imaging/delaunay standard cpu_many_core' - date: YYYY-MM-DD - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/imaging-delaunay-standard-cpu-many-core.md - kind: designation - likelihood: imaging/delaunay - regime: standard - hardware_class: cpu_many_core - optimal: numba_cpu_sparse_fp64 - secondary: [jax_cpu_sparse_fp64] - evidence: [lifecycle/b202eb6f7da58a38882f, lifecycle/095071358666d6efbc20, lifecycle/5556ca430bc180c2d536, lifecycle/99cf9f43e4608fb548ea, lifecycle/06a9dad80c65ecd81c6c, lifecycle/51b8245cf58b86533327, lifecycle/321ec1f6f2a5955a9a20, lifecycle/3c0e90f2b30d48843af2, lifecycle/b5b87c504713b9831857, lifecycle/489bebc145a525eab14d, lifecycle/d93b4dad29e8a0f77987, lifecycle/e3b1cad17937b4c1f9dc, lifecycle/e08b7a6ff7b9daea8790, lifecycle/e77729fc4ba5d235e1b0, lifecycle/1f22a4a5fcd73276ec53, lifecycle/572824ce3cc75acae94b] - rule: Any imaging dataset with a Delaunay pixelized source on a many-core CPU node with no GPU uses numba_cpu_sparse_fp64, one serial likelihood per core (workers capped by node memory over peak RSS). - supersedes: null -# separation: separated -- id: imaging-delaunay-nn-standard-gpu-a100 - title: 'Designation: imaging/delaunay_nn standard gpu_a100' - date: YYYY-MM-DD - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/imaging-delaunay-nn-standard-gpu-a100.md - kind: designation - likelihood: imaging/delaunay_nn - regime: standard - hardware_class: gpu_a100 - optimal: jax_gpu_dense_fp64 - secondary: [jax_gpu_sparse_fp64, jax_cpu_sparse_fp64] - evidence: [lifecycle/cbc5540f3214caf61aba, lifecycle/5033bab3983481d5c826, lifecycle/c661098ad46c65fa59b2, lifecycle/2461a4934062a3be2dc9, lifecycle/70bcae3ab1c4777651f0, lifecycle/5082531d009e61e07a7d] - rule: Any imaging dataset with a Delaunay natural-neighbour source on an A100 node uses jax_gpu_dense_fp64. - supersedes: null -# separation: separated -- id: imaging-delaunay-nn-standard-cpu-many-core - title: 'Designation: imaging/delaunay_nn standard cpu_many_core' - date: YYYY-MM-DD - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/imaging-delaunay-nn-standard-cpu-many-core.md - kind: designation - likelihood: imaging/delaunay_nn - regime: standard - hardware_class: cpu_many_core - optimal: numba_cpu_sparse_fp64 - secondary: [jax_cpu_sparse_fp64] - evidence: [lifecycle/1ae46b0872f10459a7c4, lifecycle/2e8ae296db66eeaf44a7, lifecycle/05dde64a0eb7fdd0c4a1, lifecycle/22e86297033ff62cf19e] - rule: Any imaging dataset with a Delaunay natural-neighbour source on a many-core CPU node with no GPU uses numba_cpu_sparse_fp64, one serial likelihood per core. - supersedes: null -# separation: uncontested -- id: interferometer-mge-n-vis-lt-1e5-gpu-a100 - title: 'Designation: interferometer/mge n_vis_lt_1e5 gpu_a100' - date: YYYY-MM-DD - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/interferometer-mge-n-vis-lt-1e5-gpu-a100.md - kind: designation - likelihood: interferometer/mge - regime: n_vis_lt_1e5 - hardware_class: gpu_a100 - optimal: jax_gpu_dense_fp64_nufft - secondary: [] - evidence: [lifecycle/4c9e3b4239cc98b8a7ff, lifecycle/6cfb178c7acab8b84e63] - rule: An interferometer dataset with fewer than 1e5 visibilities and a parametric (MGE) source on an A100 node uses jax_gpu_dense_fp64_nufft. - supersedes: null -# separation: uncontested -- id: interferometer-mge-n-vis-lt-1e5-cpu-many-core - title: 'Designation: interferometer/mge n_vis_lt_1e5 cpu_many_core' - date: YYYY-MM-DD - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/interferometer-mge-n-vis-lt-1e5-cpu-many-core.md - kind: designation - likelihood: interferometer/mge - regime: n_vis_lt_1e5 - hardware_class: cpu_many_core - optimal: jax_cpu_dense_fp64_nufft - secondary: [] - evidence: [lifecycle/02e5496a9c9da3407d87, lifecycle/9a3e014c9053e1d98114] - rule: An interferometer dataset with fewer than 1e5 visibilities and a parametric (MGE) source on a many-core CPU node with no GPU uses jax_cpu_dense_fp64_nufft. - supersedes: null -# separation: separated -- id: interferometer-rectangular-n-vis-lt-1e5-gpu-a100 - title: 'Designation: interferometer/rectangular n_vis_lt_1e5 gpu_a100' - date: YYYY-MM-DD - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/interferometer-rectangular-n-vis-lt-1e5-gpu-a100.md - kind: designation - likelihood: interferometer/rectangular - regime: n_vis_lt_1e5 - hardware_class: gpu_a100 - optimal: jax_gpu_sparse_fp64_wtilde - secondary: [jax_gpu_dense_fp64_nufft] - evidence: [lifecycle/e44acbf15a2387706fa1, lifecycle/18947283f540e425ae11, lifecycle/a39d6114339d546f6bd6, lifecycle/e98a8f4000e25e6d9f35] - rule: An interferometer dataset with fewer than 1e5 visibilities and a rectangular pixelized source on an A100 node uses jax_gpu_sparse_fp64_wtilde, falling back to jax_gpu_dense_fp64_nufft. - supersedes: null -# separation: uncontested -- id: interferometer-rectangular-n-vis-1e5-1e7-gpu-a100 - title: 'Designation: interferometer/rectangular n_vis_1e5_1e7 gpu_a100' - date: YYYY-MM-DD - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/interferometer-rectangular-n-vis-1e5-1e7-gpu-a100.md - kind: designation - likelihood: interferometer/rectangular - regime: n_vis_1e5_1e7 - hardware_class: gpu_a100 - optimal: jax_gpu_sparse_fp64_wtilde - secondary: [] - evidence: [lifecycle/fe32c3ee13ad9afc455c, lifecycle/94c8f316ca657a6536ad, lifecycle/2ab9504c46bb8170ba54, lifecycle/1aafc8c30c529ae51479] - rule: An interferometer dataset with 1e5 to 1e7 visibilities and a rectangular pixelized source on an A100 node uses jax_gpu_sparse_fp64_wtilde (the dense route cannot form its mapping matrix above 1e5 visibilities). - supersedes: null -# separation: uncontested -- id: interferometer-rectangular-n-vis-ge-1e7-gpu-a100 - title: 'Designation: interferometer/rectangular n_vis_ge_1e7 gpu_a100' - date: YYYY-MM-DD - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/interferometer-rectangular-n-vis-ge-1e7-gpu-a100.md - kind: designation - likelihood: interferometer/rectangular - regime: n_vis_ge_1e7 - hardware_class: gpu_a100 - optimal: jax_gpu_sparse_fp64_wtilde - secondary: [] - evidence: [lifecycle/220d076d8421130e83cf, lifecycle/7aad4d80e0298f32687c] - rule: An interferometer dataset with at least 1e7 visibilities and a rectangular pixelized source on an A100 node uses jax_gpu_sparse_fp64_wtilde (streaming not measured). - supersedes: null -# separation: separated -- id: interferometer-rectangular-n-vis-lt-1e5-cpu-many-core - title: 'Designation: interferometer/rectangular n_vis_lt_1e5 cpu_many_core' - date: YYYY-MM-DD - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/interferometer-rectangular-n-vis-lt-1e5-cpu-many-core.md - kind: designation - likelihood: interferometer/rectangular - regime: n_vis_lt_1e5 - hardware_class: cpu_many_core - optimal: numba_cpu_sparse_fp64_wtilde - secondary: [jax_cpu_sparse_fp64_wtilde, jax_cpu_dense_fp64_nufft] - evidence: [lifecycle/0cec032ed12d6d948802, lifecycle/ad305d23a04bd7700b82, lifecycle/29d350ddd936276d4121, lifecycle/f90468fb8090019a8659, lifecycle/0e27b1175ce084dff51e, lifecycle/f8de59681124b4e117d2] - rule: An interferometer dataset with fewer than 1e5 visibilities and a rectangular pixelized source on a many-core CPU node with no GPU uses numba_cpu_sparse_fp64_wtilde, one serial likelihood per core, with the curvature route chosen by the packaged cost model. - supersedes: null -# separation: separated -- id: interferometer-rectangular-n-vis-1e5-1e7-cpu-many-core - title: 'Designation: interferometer/rectangular n_vis_1e5_1e7 cpu_many_core' - date: YYYY-MM-DD - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/interferometer-rectangular-n-vis-1e5-1e7-cpu-many-core.md - kind: designation - likelihood: interferometer/rectangular - regime: n_vis_1e5_1e7 - hardware_class: cpu_many_core - optimal: numba_cpu_sparse_fp64_wtilde - secondary: [jax_cpu_sparse_fp64_wtilde] - evidence: [lifecycle/41fd14e1f19bad947f24, lifecycle/5772383ee5a1c474afff, lifecycle/4663f221c8c3ce49b76f, lifecycle/85d104c103a554b56afa, lifecycle/fe0f252f68dcc26d7d13, lifecycle/7f44ae97f7ce3ccc7864, lifecycle/d79f1b94f4b03452d745, lifecycle/af1beefd41024500ad13] - rule: An interferometer dataset with 1e5 to 1e7 visibilities and a rectangular pixelized source on a many-core CPU node with no GPU uses numba_cpu_sparse_fp64_wtilde, one serial likelihood per core, with the curvature route chosen by the packaged cost model. - supersedes: null -# separation: separated -- id: interferometer-rectangular-n-vis-ge-1e7-cpu-many-core - title: 'Designation: interferometer/rectangular n_vis_ge_1e7 cpu_many_core' - date: YYYY-MM-DD - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/interferometer-rectangular-n-vis-ge-1e7-cpu-many-core.md - kind: designation - likelihood: interferometer/rectangular - regime: n_vis_ge_1e7 - hardware_class: cpu_many_core - optimal: numba_cpu_sparse_fp64_wtilde - secondary: [jax_cpu_sparse_fp64_wtilde] - evidence: [lifecycle/99c70939e335d08c4cff, lifecycle/8aeeeff35ca0d5d5b855, lifecycle/15aded078686cdf03ff5, lifecycle/598903fd79ec17f4328f] - rule: An interferometer dataset with at least 1e7 visibilities and a rectangular pixelized source on a many-core CPU node with no GPU uses numba_cpu_sparse_fp64_wtilde, with workers capped by node memory over peak RSS. - supersedes: null -# separation: separated -- id: interferometer-delaunay-n-vis-lt-1e5-gpu-a100 - title: 'Designation: interferometer/delaunay n_vis_lt_1e5 gpu_a100' - date: YYYY-MM-DD - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/interferometer-delaunay-n-vis-lt-1e5-gpu-a100.md - kind: designation - likelihood: interferometer/delaunay - regime: n_vis_lt_1e5 - hardware_class: gpu_a100 - optimal: jax_gpu_sparse_fp64_wtilde - secondary: [jax_gpu_dense_fp64_nufft] - evidence: [lifecycle/ff5c53947f845ee5f2d8, lifecycle/7babc936c9e3d3d61400, lifecycle/742eaf1292ed737e591e, lifecycle/f0257d6c38e984e02a27] - rule: An interferometer dataset with fewer than 1e5 visibilities and a delaunay pixelized source on an A100 node uses jax_gpu_sparse_fp64_wtilde, falling back to jax_gpu_dense_fp64_nufft. - supersedes: null -# separation: uncontested -- id: interferometer-delaunay-n-vis-1e5-1e7-gpu-a100 - title: 'Designation: interferometer/delaunay n_vis_1e5_1e7 gpu_a100' - date: YYYY-MM-DD - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/interferometer-delaunay-n-vis-1e5-1e7-gpu-a100.md - kind: designation - likelihood: interferometer/delaunay - regime: n_vis_1e5_1e7 - hardware_class: gpu_a100 - optimal: jax_gpu_sparse_fp64_wtilde - secondary: [] - evidence: [lifecycle/8dada4df3a4ed30d1721, lifecycle/3604b6b6097ea2ead0a3, lifecycle/ba12584bdfe8c2e16f30, lifecycle/d1bef0d03e8078e165cf] - rule: An interferometer dataset with 1e5 to 1e7 visibilities and a delaunay pixelized source on an A100 node uses jax_gpu_sparse_fp64_wtilde (the dense route cannot form its mapping matrix above 1e5 visibilities). - supersedes: null -# separation: uncontested -- id: interferometer-delaunay-n-vis-ge-1e7-gpu-a100 - title: 'Designation: interferometer/delaunay n_vis_ge_1e7 gpu_a100' - date: YYYY-MM-DD - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/interferometer-delaunay-n-vis-ge-1e7-gpu-a100.md - kind: designation - likelihood: interferometer/delaunay - regime: n_vis_ge_1e7 - hardware_class: gpu_a100 - optimal: jax_gpu_sparse_fp64_wtilde - secondary: [] - evidence: [lifecycle/3c33efbabefe647c901b, lifecycle/20d0956c95b461dbae98] - rule: An interferometer dataset with at least 1e7 visibilities and a delaunay pixelized source on an A100 node uses jax_gpu_sparse_fp64_wtilde (streaming not measured). - supersedes: null -# separation: separated -- id: interferometer-delaunay-n-vis-lt-1e5-cpu-many-core - title: 'Designation: interferometer/delaunay n_vis_lt_1e5 cpu_many_core' - date: YYYY-MM-DD - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/interferometer-delaunay-n-vis-lt-1e5-cpu-many-core.md - kind: designation - likelihood: interferometer/delaunay - regime: n_vis_lt_1e5 - hardware_class: cpu_many_core - optimal: numba_cpu_sparse_fp64_wtilde - secondary: [jax_cpu_sparse_fp64_wtilde, jax_cpu_dense_fp64_nufft] - evidence: [lifecycle/284efdc05b70e06e060a, lifecycle/56f48185c11f75209119, lifecycle/00838694b2c3c955a644, lifecycle/a152a69dfb443926581d, lifecycle/b2d01ef74bf71e49d774, lifecycle/ea2702adb920859138bf] - rule: An interferometer dataset with fewer than 1e5 visibilities and a delaunay pixelized source on a many-core CPU node with no GPU uses numba_cpu_sparse_fp64_wtilde, one serial likelihood per core, with the curvature route chosen by the packaged cost model. - supersedes: null -# separation: separated -- id: interferometer-delaunay-n-vis-1e5-1e7-cpu-many-core - title: 'Designation: interferometer/delaunay n_vis_1e5_1e7 cpu_many_core' - date: YYYY-MM-DD - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/interferometer-delaunay-n-vis-1e5-1e7-cpu-many-core.md - kind: designation - likelihood: interferometer/delaunay - regime: n_vis_1e5_1e7 - hardware_class: cpu_many_core - optimal: numba_cpu_sparse_fp64_wtilde - secondary: [jax_cpu_sparse_fp64_wtilde] - evidence: [lifecycle/60747d6f7a1867da50c9, lifecycle/72fa1f4145e1b837daad, lifecycle/5e9d64046821795b4651, lifecycle/52f7465981114aecc98d, lifecycle/d54c6814c51c381564cf, lifecycle/ebd642f6c596e964cea9, lifecycle/bfe464d85eab437c56be, lifecycle/2790184b43d78bf4da78] - rule: An interferometer dataset with 1e5 to 1e7 visibilities and a delaunay pixelized source on a many-core CPU node with no GPU uses numba_cpu_sparse_fp64_wtilde, one serial likelihood per core, with the curvature route chosen by the packaged cost model. - supersedes: null -# separation: HOLD - does not separate; do not record as written -- id: interferometer-delaunay-n-vis-ge-1e7-cpu-many-core - title: 'Designation: interferometer/delaunay n_vis_ge_1e7 cpu_many_core' - date: YYYY-MM-DD - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/interferometer-delaunay-n-vis-ge-1e7-cpu-many-core.md - kind: designation - likelihood: interferometer/delaunay - regime: n_vis_ge_1e7 - hardware_class: cpu_many_core - optimal: numba_cpu_sparse_fp64_wtilde - secondary: [jax_cpu_sparse_fp64_wtilde] - evidence: [lifecycle/757d2c2d7167cdef0457, lifecycle/b9bd70be62ec18cf0a02, lifecycle/e63a97d451e1633c91aa, lifecycle/bb2f3d9734b53f7fca77] - rule: An interferometer dataset with at least 1e7 visibilities and a delaunay pixelized source on a many-core CPU node with no GPU uses numba_cpu_sparse_fp64_wtilde, with workers capped by node memory over peak RSS. - supersedes: null -# separation: uncontested -- id: point-source-image-image-plane-standard-gpu-a100 - title: 'Designation: point_source_image/image_plane standard gpu_a100' - date: YYYY-MM-DD - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/point-source-image-image-plane-standard-gpu-a100.md - kind: designation - likelihood: point_source_image/image_plane - regime: standard - hardware_class: gpu_a100 - optimal: jax_gpu_na_fp64 - secondary: [] - evidence: [lifecycle/6282556b81be530f7bce, lifecycle/f4dfadf54484b22e9f69] - rule: A galaxy-scale point-source dataset fitted in the image plane on an A100 node uses jax_gpu_na_fp64. - supersedes: null -# separation: uncontested -- id: point-source-image-image-plane-standard-cpu-many-core - title: 'Designation: point_source_image/image_plane standard cpu_many_core' - date: YYYY-MM-DD - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/point-source-image-image-plane-standard-cpu-many-core.md - kind: designation - likelihood: point_source_image/image_plane - regime: standard - hardware_class: cpu_many_core - optimal: jax_cpu_na_fp64 - secondary: [] - evidence: [lifecycle/6cbf08c848ae6cdb820f, lifecycle/a884951a80a697791744] - rule: A galaxy-scale point-source dataset fitted in the image plane on a many-core CPU node with no GPU uses jax_cpu_na_fp64. - supersedes: null -# separation: per-node only -- id: point-source-source-source-plane-standard-gpu-a100 - title: 'Designation: point_source_source/source_plane standard gpu_a100' - date: YYYY-MM-DD - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/point-source-source-source-plane-standard-gpu-a100.md - kind: designation - likelihood: point_source_source/source_plane - regime: standard - hardware_class: gpu_a100 - optimal: jax_cpu_na_fp64 - secondary: [jax_gpu_na_fp64] - evidence: [lifecycle/c2bfeea342f97959dc7c, lifecycle/5e68a4c3f41437c52c70, lifecycle/fcb319f0f24b8cc9fd37, lifecycle/403a31905c1445a750ba] - rule: A galaxy-scale point-source dataset fitted in the source plane on an A100 node uses jax_cpu_na_fp64 on the node CPU cores, not the GPUs. - supersedes: null -# separation: uncontested -- id: point-source-source-source-plane-standard-cpu-many-core - title: 'Designation: point_source_source/source_plane standard cpu_many_core' - date: YYYY-MM-DD - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/point-source-source-source-plane-standard-cpu-many-core.md - kind: designation - likelihood: point_source_source/source_plane - regime: standard - hardware_class: cpu_many_core - optimal: jax_cpu_na_fp64 - secondary: [] - evidence: [lifecycle/61082dc032d7280b3bd1, lifecycle/fa18efad842f4cc9fa73] - rule: A galaxy-scale point-source dataset fitted in the source plane on a many-core CPU node with no GPU uses jax_cpu_na_fp64. - supersedes: null -``` - -## Appendix B — re-derived 2026-10-31 on the day-zero catalogue (PR #496 head c218a428; NOT published) - -```yaml -# separation: uncontested -- id: cluster-image-plane-standard-cpu-many-core - title: 'Designation: cluster/image_plane standard cpu_many_core' - date: 'YYYY-MM-DD' - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/cluster-image-plane-standard-cpu-many-core.md - kind: designation - likelihood: cluster/image_plane - regime: standard - hardware_class: cpu_many_core - optimal: jax_cpu_na_fp64 - secondary: [] - evidence: [lifecycle/86d6277f36e3c8ec1d2f, lifecycle/0533eec58c25ebd8637b] - rule: 'A cluster-scale point-source dataset fitted in the image plane on a many-core CPU node with no GPU uses jax_cpu_na_fp64.' - supersedes: null -# separation: uncontested -- id: cluster-image-plane-standard-gpu-a100 - title: 'Designation: cluster/image_plane standard gpu_a100' - date: 'YYYY-MM-DD' - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/cluster-image-plane-standard-gpu-a100.md - kind: designation - likelihood: cluster/image_plane - regime: standard - hardware_class: gpu_a100 - optimal: jax_gpu_na_fp64 - secondary: [] - evidence: [lifecycle/d92190013ae10eaa21f6, lifecycle/7e5edbcfcccee90b11b5] - rule: 'A cluster-scale point-source dataset fitted in the image plane on an A100 node uses jax_gpu_na_fp64.' - supersedes: null -# separation: uncontested -- id: cluster-source-plane-standard-cpu-many-core - title: 'Designation: cluster/source_plane standard cpu_many_core' - date: 'YYYY-MM-DD' - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/cluster-source-plane-standard-cpu-many-core.md - kind: designation - likelihood: cluster/source_plane - regime: standard - hardware_class: cpu_many_core - optimal: jax_cpu_na_fp64 - secondary: [] - evidence: [lifecycle/004001caf29a727421e0, lifecycle/8909566077ecf0ba922a] - rule: 'A cluster-scale point-source dataset fitted in the source plane on a many-core CPU node with no GPU uses jax_cpu_na_fp64.' - supersedes: null -# separation: uncontested -- id: cluster-source-plane-standard-gpu-a100 - title: 'Designation: cluster/source_plane standard gpu_a100' - date: 'YYYY-MM-DD' - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/cluster-source-plane-standard-gpu-a100.md - kind: designation - likelihood: cluster/source_plane - regime: standard - hardware_class: gpu_a100 - optimal: jax_gpu_na_fp64 - secondary: [] - evidence: [lifecycle/02df871c3e8378b505ca, lifecycle/34d551d02bba3ac253a1] - rule: 'A cluster-scale point-source dataset fitted in the source plane on an A100 node uses jax_gpu_na_fp64.' - supersedes: null -# separation: separated -- id: datacube-delaunay-standard-cpu-many-core - title: 'Designation: datacube/delaunay standard cpu_many_core' - date: 'YYYY-MM-DD' - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/datacube-delaunay-standard-cpu-many-core.md - kind: designation - likelihood: datacube/delaunay - regime: standard - hardware_class: cpu_many_core - optimal: numba_cpu_sparse_fp64_wtilde - secondary: [jax_cpu_sparse_fp64_wtilde] - evidence: [lifecycle/8e374ab509e7626573da, lifecycle/b767269193c94e381a30, lifecycle/5800a501664b981824d4, lifecycle/821bc78b048e1ae58e0a, lifecycle/6669e2835516e93361f1, lifecycle/3339ddf063b8cf824048, lifecycle/3ea56488a996d6f0ffd1, lifecycle/ffa08d2b2e0136acbb7d, lifecycle/84cc85952546c05eabe2, lifecycle/803151df21c7de55861a, lifecycle/649dfad640b1afce5631, lifecycle/8f9413a9807f794ae36e, lifecycle/5b411896dcf5b1cc5853, lifecycle/cdcbd9feaefdff4aba33] - rule: 'A datacube (interferometer channels fitted together) with a Delaunay pixelized source on a many-core CPU node with no GPU uses numba_cpu_sparse_fp64_wtilde, one serial likelihood per core (workers capped by node memory over peak RSS), falling back to jax_cpu_sparse_fp64_wtilde.' - supersedes: null -# separation: does not separate — HOLD: does not separate; do not record as written -- id: datacube-delaunay-standard-gpu-a100 - title: 'Designation: datacube/delaunay standard gpu_a100' - date: 'YYYY-MM-DD' - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/datacube-delaunay-standard-gpu-a100.md - kind: designation - likelihood: datacube/delaunay - regime: standard - hardware_class: gpu_a100 - optimal: jax_gpu_sparse_fp64_wtilde - secondary: [jax_gpu_dense_fp64_nufft] - evidence: [lifecycle/c3ed1c5a8847d28eb792, lifecycle/7c22bd05b2e6a332c05f, lifecycle/5ddc372d7a91e6f979a8, lifecycle/9779431a4492758cb70b, lifecycle/b62555fd25c854bfdf3d, lifecycle/bb703db94dff9a1c1ff7, lifecycle/5a76ad3529beab044b72, lifecycle/2dd892f07fead03714bf] - rule: 'A datacube (interferometer channels fitted together) with a Delaunay pixelized source on an A100 node uses jax_gpu_sparse_fp64_wtilde, falling back to jax_gpu_dense_fp64_nufft.' - supersedes: null -# separation: separated -- id: group-delaunay-standard-cpu-many-core - title: 'Designation: group/delaunay standard cpu_many_core' - date: 'YYYY-MM-DD' - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/group-delaunay-standard-cpu-many-core.md - kind: designation - likelihood: group/delaunay - regime: standard - hardware_class: cpu_many_core - optimal: numba_cpu_sparse_fp64 - secondary: [jax_cpu_sparse_fp64] - evidence: [lifecycle/f4474b23fc3ee5d4b43f, lifecycle/3312f41b04546c2ef2b6, lifecycle/22696238c7226a6971dd, lifecycle/15ff2e809477e969c467] - rule: 'A group-scale imaging dataset with a Delaunay pixelized source on a many-core CPU node with no GPU uses numba_cpu_sparse_fp64, one serial likelihood per core (workers capped by node memory over peak RSS), falling back to jax_cpu_sparse_fp64.' - supersedes: null -# separation: separated -- id: group-delaunay-standard-gpu-a100 - title: 'Designation: group/delaunay standard gpu_a100' - date: 'YYYY-MM-DD' - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/group-delaunay-standard-gpu-a100.md - kind: designation - likelihood: group/delaunay - regime: standard - hardware_class: gpu_a100 - optimal: jax_gpu_dense_fp64 - secondary: [jax_gpu_sparse_fp64] - evidence: [lifecycle/826e517e5786c2398767, lifecycle/4d43ba6e6f51755c0a00, lifecycle/af408d3bf87b7b904f2d, lifecycle/a99fbbd0cb8f8eaedcc4] - rule: 'A group-scale imaging dataset with a Delaunay pixelized source on an A100 node uses jax_gpu_dense_fp64, falling back to jax_gpu_sparse_fp64.' - supersedes: null -# separation: uncontested -- id: group-mge-standard-cpu-many-core - title: 'Designation: group/mge standard cpu_many_core' - date: 'YYYY-MM-DD' - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/group-mge-standard-cpu-many-core.md - kind: designation - likelihood: group/mge - regime: standard - hardware_class: cpu_many_core - optimal: jax_cpu_dense_fp64 - secondary: [] - evidence: [lifecycle/eb438402eb57e940aa63, lifecycle/5637649f49871e13e428] - rule: 'A group-scale imaging dataset with a parametric (MGE) source on a many-core CPU node with no GPU uses jax_cpu_dense_fp64.' - supersedes: null -# separation: uncontested -- id: group-mge-standard-gpu-a100 - title: 'Designation: group/mge standard gpu_a100' - date: 'YYYY-MM-DD' - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/group-mge-standard-gpu-a100.md - kind: designation - likelihood: group/mge - regime: standard - hardware_class: gpu_a100 - optimal: jax_gpu_dense_fp64 - secondary: [] - evidence: [lifecycle/c631285eca889fc2c2c4, lifecycle/883d959ca124d30992b1] - rule: 'A group-scale imaging dataset with a parametric (MGE) source on an A100 node uses jax_gpu_dense_fp64.' - supersedes: null -# separation: separated -- id: group-rectangular-standard-cpu-many-core - title: 'Designation: group/rectangular standard cpu_many_core' - date: 'YYYY-MM-DD' - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/group-rectangular-standard-cpu-many-core.md - kind: designation - likelihood: group/rectangular - regime: standard - hardware_class: cpu_many_core - optimal: numba_cpu_sparse_fp64 - secondary: [jax_cpu_sparse_fp64] - evidence: [lifecycle/acba8d20547d37e8f89c, lifecycle/6e8c2db0c3afbfa0112f, lifecycle/a393fa2e139fd0560564, lifecycle/d1eb8e9cc712b7a123b0] - rule: 'A group-scale imaging dataset with a rectangular pixelized source on a many-core CPU node with no GPU uses numba_cpu_sparse_fp64, one serial likelihood per core (workers capped by node memory over peak RSS), falling back to jax_cpu_sparse_fp64.' - supersedes: null -# separation: separated -- id: group-rectangular-standard-gpu-a100 - title: 'Designation: group/rectangular standard gpu_a100' - date: 'YYYY-MM-DD' - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/group-rectangular-standard-gpu-a100.md - kind: designation - likelihood: group/rectangular - regime: standard - hardware_class: gpu_a100 - optimal: jax_gpu_dense_fp64 - secondary: [jax_gpu_sparse_fp64] - evidence: [lifecycle/506bcbce87ad6c020945, lifecycle/e69558ac3425ca0f7c32, lifecycle/34335ddd284ac5077dc2, lifecycle/1fd3b971b77882c2ec7f] - rule: 'A group-scale imaging dataset with a rectangular pixelized source on an A100 node uses jax_gpu_dense_fp64, falling back to jax_gpu_sparse_fp64.' - supersedes: null -# separation: separated -- id: imaging-delaunay-standard-cpu-many-core - title: 'Designation: imaging/delaunay standard cpu_many_core' - date: 'YYYY-MM-DD' - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/imaging-delaunay-standard-cpu-many-core.md - kind: designation - likelihood: imaging/delaunay - regime: standard - hardware_class: cpu_many_core - optimal: numba_cpu_sparse_fp64 - secondary: [jax_cpu_sparse_fp64] - evidence: [lifecycle/e08b7a6ff7b9daea8790, lifecycle/e77729fc4ba5d235e1b0, lifecycle/1f22a4a5fcd73276ec53, lifecycle/572824ce3cc75acae94b, lifecycle/b202eb6f7da58a38882f, lifecycle/095071358666d6efbc20, lifecycle/5556ca430bc180c2d536, lifecycle/99cf9f43e4608fb548ea, lifecycle/06a9dad80c65ecd81c6c, lifecycle/51b8245cf58b86533327, lifecycle/321ec1f6f2a5955a9a20, lifecycle/3c0e90f2b30d48843af2, lifecycle/b5b87c504713b9831857, lifecycle/489bebc145a525eab14d, lifecycle/d93b4dad29e8a0f77987, lifecycle/e3b1cad17937b4c1f9dc] - rule: 'Any imaging dataset with a Delaunay pixelized source on a many-core CPU node with no GPU uses numba_cpu_sparse_fp64, one serial likelihood per core (workers capped by node memory over peak RSS).' - supersedes: null -# separation: separated -- id: imaging-delaunay-standard-gpu-a100 - title: 'Designation: imaging/delaunay standard gpu_a100' - date: 'YYYY-MM-DD' - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/imaging-delaunay-standard-gpu-a100.md - kind: designation - likelihood: imaging/delaunay - regime: standard - hardware_class: gpu_a100 - optimal: jax_gpu_dense_fp64 - secondary: [jax_gpu_sparse_fp64] - evidence: [lifecycle/fa028d54604cd08d3555, lifecycle/9b34de15d3aca2deb34c, lifecycle/99d7c3c7623e3d43d059, lifecycle/93f7eea188801e17127a, lifecycle/c07af59a8d393975dd28, lifecycle/f706db5c42869fee8ea5, lifecycle/371f67d50254479493ee, lifecycle/b72ae27c889b5f309c7d, lifecycle/73c19173fcc983318b61, lifecycle/dbb5a42b977bbac7679e, lifecycle/12c678df16e04f4f9011, lifecycle/720a326dbad29c263006, lifecycle/12348bea7be2ca70cffb, lifecycle/ff61f1cb7a87d8382b9a, lifecycle/d34ebb3d52e02dfb8b16, lifecycle/5f300473b328b24bac66] - rule: 'Any imaging dataset with a Delaunay pixelized source on an A100 node uses jax_gpu_dense_fp64, falling back to jax_gpu_sparse_fp64.' - supersedes: null -# separation: separated -- id: imaging-delaunay-nn-standard-cpu-many-core - title: 'Designation: imaging/delaunay_nn standard cpu_many_core' - date: 'YYYY-MM-DD' - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/imaging-delaunay-nn-standard-cpu-many-core.md - kind: designation - likelihood: imaging/delaunay_nn - regime: standard - hardware_class: cpu_many_core - optimal: numba_cpu_sparse_fp64 - secondary: [jax_cpu_sparse_fp64] - evidence: [lifecycle/1ae46b0872f10459a7c4, lifecycle/2e8ae296db66eeaf44a7, lifecycle/05dde64a0eb7fdd0c4a1, lifecycle/22e86297033ff62cf19e] - rule: 'Any imaging dataset with a Delaunay natural-neighbour source on a many-core CPU node with no GPU uses numba_cpu_sparse_fp64, one serial likelihood per core.' - supersedes: null -# separation: separated -- id: imaging-delaunay-nn-standard-gpu-a100 - title: 'Designation: imaging/delaunay_nn standard gpu_a100' - date: 'YYYY-MM-DD' - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/imaging-delaunay-nn-standard-gpu-a100.md - kind: designation - likelihood: imaging/delaunay_nn - regime: standard - hardware_class: gpu_a100 - optimal: jax_gpu_dense_fp64 - secondary: [jax_gpu_sparse_fp64] - evidence: [lifecycle/c661098ad46c65fa59b2, lifecycle/2461a4934062a3be2dc9, lifecycle/70bcae3ab1c4777651f0, lifecycle/5082531d009e61e07a7d] - rule: 'Any imaging dataset with a Delaunay natural-neighbour source on an A100 node uses jax_gpu_dense_fp64.' - supersedes: null -# separation: uncontested -- id: imaging-mge-standard-cpu-many-core - title: 'Designation: imaging/mge standard cpu_many_core' - date: 'YYYY-MM-DD' - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/imaging-mge-standard-cpu-many-core.md - kind: designation - likelihood: imaging/mge - regime: standard - hardware_class: cpu_many_core - optimal: jax_cpu_dense_fp64 - secondary: [] - evidence: [lifecycle/3216ffc143645fb46c72, lifecycle/a37560173314cc078894, lifecycle/190ebc582d9aba9aaa9c, lifecycle/acf067a34aa2005d1b11, lifecycle/54979849c807d452c510, lifecycle/d2aece86956eba227ada, lifecycle/4baa9bc04c8d24a713b6, lifecycle/2cf94e6d7d8231a57c92] - rule: 'Any imaging dataset fitted with a parametric (MGE) source on a many-core CPU node with no GPU uses jax_cpu_dense_fp64.' - supersedes: null -# separation: uncontested -- id: imaging-mge-standard-gpu-a100 - title: 'Designation: imaging/mge standard gpu_a100' - date: 'YYYY-MM-DD' - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/imaging-mge-standard-gpu-a100.md - kind: designation - likelihood: imaging/mge - regime: standard - hardware_class: gpu_a100 - optimal: jax_gpu_dense_fp64 - secondary: [] - evidence: [lifecycle/4b514c4262172f610fee, lifecycle/eb44c9d7e6987735cdd1, lifecycle/770dce7d7db7a1fc3b53, lifecycle/2d7064bb66242f2ca6cc, lifecycle/8a475e9abd97a8c4a1c0, lifecycle/4e93e744f3e1295b3c8d, lifecycle/0756e600e86d7ae6a462, lifecycle/a58929ead49f62c064da] - rule: 'Any imaging dataset fitted with a parametric (MGE) source on an A100 node uses jax_gpu_dense_fp64.' - supersedes: null -# separation: separated -- id: imaging-rectangular-standard-cpu-many-core - title: 'Designation: imaging/rectangular standard cpu_many_core' - date: 'YYYY-MM-DD' - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/imaging-rectangular-standard-cpu-many-core.md - kind: designation - likelihood: imaging/rectangular - regime: standard - hardware_class: cpu_many_core - optimal: numba_cpu_sparse_fp64 - secondary: [jax_cpu_sparse_fp64] - evidence: [lifecycle/d7020017fca2249bf32b, lifecycle/e44433f6b0bb6fbb1519, lifecycle/403420f8debaaa38956c, lifecycle/a721c437cf9355984ca5, lifecycle/4c53e409a27040f5d6a4, lifecycle/39a0a9b81376f2be8446, lifecycle/6060fdcfa2e5a4a0c168, lifecycle/ae663292d53c60a65c62, lifecycle/2b5e34f509175fd4d030, lifecycle/ee2df565d3603ba2bbd3, lifecycle/b62534053c00fb102bf4, lifecycle/9e90c7a031fd6370f9af, lifecycle/9bb2e30e94491253641b, lifecycle/dd67472c35e8ed230b03, lifecycle/304ac75d242dcbc2c22f, lifecycle/0de8cf81e718d21ee2aa] - rule: 'Any imaging dataset with a rectangular pixelized source on a many-core CPU node with no GPU uses numba_cpu_sparse_fp64, one serial likelihood per core (workers capped by node memory over peak RSS).' - supersedes: null -# separation: separated -- id: imaging-rectangular-standard-gpu-a100 - title: 'Designation: imaging/rectangular standard gpu_a100' - date: 'YYYY-MM-DD' - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/imaging-rectangular-standard-gpu-a100.md - kind: designation - likelihood: imaging/rectangular - regime: standard - hardware_class: gpu_a100 - optimal: jax_gpu_dense_fp64 - secondary: [jax_gpu_sparse_fp64] - evidence: [lifecycle/d570569f32c953038fde, lifecycle/32ca51df82e1724685ab, lifecycle/46db4990a22e25aee123, lifecycle/67787bf45d6bb0b3aa42, lifecycle/456f7d65babc5524183a, lifecycle/a429326f9f33ea12e6b8, lifecycle/bc5ed323618c58fc7682, lifecycle/688c98aeb69ac24ea6f3, lifecycle/42f6a707360ce63b8150, lifecycle/9bbfceb21916e4329a0a, lifecycle/cc3f3365b6ac65388a93, lifecycle/27f711205e5a76c127cb, lifecycle/ec69a200557ea8212e5e, lifecycle/76d01fc60350dd469eed, lifecycle/bdffd9d6d157b3b66435, lifecycle/df1e242101ab32dea573] - rule: 'Any imaging dataset with a rectangular pixelized source on an A100 node uses jax_gpu_dense_fp64, falling back to jax_gpu_sparse_fp64.' - supersedes: null -# separation: separated -- id: interferometer-delaunay-standard-cpu-many-core - title: 'Designation: interferometer/delaunay standard cpu_many_core' - date: 'YYYY-MM-DD' - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/interferometer-delaunay-standard-cpu-many-core.md - kind: designation - likelihood: interferometer/delaunay - regime: standard - hardware_class: cpu_many_core - optimal: numba_cpu_sparse_fp64_wtilde - secondary: [jax_cpu_sparse_fp64_wtilde] - evidence: [lifecycle/60747d6f7a1867da50c9, lifecycle/72fa1f4145e1b837daad, lifecycle/5e9d64046821795b4651, lifecycle/52f7465981114aecc98d, lifecycle/d54c6814c51c381564cf, lifecycle/ebd642f6c596e964cea9, lifecycle/bfe464d85eab437c56be, lifecycle/2790184b43d78bf4da78, lifecycle/757d2c2d7167cdef0457, lifecycle/b9bd70be62ec18cf0a02, lifecycle/e63a97d451e1633c91aa, lifecycle/bb2f3d9734b53f7fca77, lifecycle/284efdc05b70e06e060a, lifecycle/56f48185c11f75209119, lifecycle/00838694b2c3c955a644, lifecycle/a152a69dfb443926581d, lifecycle/b2d01ef74bf71e49d774, lifecycle/ea2702adb920859138bf] - rule: 'Any interferometer dataset with a Delaunay pixelized source on a many-core CPU node with no GPU uses numba_cpu_sparse_fp64_wtilde, one serial likelihood per core (workers capped by node memory over peak RSS), falling back to jax_cpu_sparse_fp64_wtilde. Untested: CPU streaming and the MGE DFT route.' - supersedes: null -# separation: separated -- id: interferometer-delaunay-standard-gpu-a100 - title: 'Designation: interferometer/delaunay standard gpu_a100' - date: 'YYYY-MM-DD' - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/interferometer-delaunay-standard-gpu-a100.md - kind: designation - likelihood: interferometer/delaunay - regime: standard - hardware_class: gpu_a100 - optimal: jax_gpu_sparse_fp64_wtilde - secondary: [jax_gpu_dense_fp64_nufft] - evidence: [lifecycle/8dada4df3a4ed30d1721, lifecycle/3604b6b6097ea2ead0a3, lifecycle/ba12584bdfe8c2e16f30, lifecycle/d1bef0d03e8078e165cf, lifecycle/3c33efbabefe647c901b, lifecycle/20d0956c95b461dbae98, lifecycle/ff5c53947f845ee5f2d8, lifecycle/7babc936c9e3d3d61400, lifecycle/742eaf1292ed737e591e, lifecycle/f0257d6c38e984e02a27] - rule: 'Any interferometer dataset with a Delaunay pixelized source on an A100 node uses jax_gpu_sparse_fp64_wtilde, falling back to jax_gpu_dense_fp64_nufft. Untested: the GPU streaming route (measured up to jvla, 2.5e7 visibilities, on W~ sparse).' - supersedes: null -# separation: uncontested -- id: interferometer-mge-standard-cpu-many-core - title: 'Designation: interferometer/mge standard cpu_many_core' - date: 'YYYY-MM-DD' - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/interferometer-mge-standard-cpu-many-core.md - kind: designation - likelihood: interferometer/mge - regime: standard - hardware_class: cpu_many_core - optimal: jax_cpu_dense_fp64_nufft - secondary: [] - evidence: [lifecycle/02e5496a9c9da3407d87, lifecycle/9a3e014c9053e1d98114] - rule: 'Any interferometer dataset with a parametric (MGE) source on a many-core CPU node with no GPU uses jax_cpu_dense_fp64_nufft. Untested: CPU streaming and the MGE DFT route.' - supersedes: null -# separation: uncontested -- id: interferometer-mge-standard-gpu-a100 - title: 'Designation: interferometer/mge standard gpu_a100' - date: 'YYYY-MM-DD' - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/interferometer-mge-standard-gpu-a100.md - kind: designation - likelihood: interferometer/mge - regime: standard - hardware_class: gpu_a100 - optimal: jax_gpu_dense_fp64_nufft - secondary: [] - evidence: [lifecycle/4c9e3b4239cc98b8a7ff, lifecycle/6cfb178c7acab8b84e63] - rule: 'Any interferometer dataset with a parametric (MGE) source on an A100 node uses jax_gpu_dense_fp64_nufft. Untested: the GPU streaming route (measured up to jvla, 2.5e7 visibilities, on W~ sparse).' - supersedes: null -# separation: separated -- id: interferometer-rectangular-standard-cpu-many-core - title: 'Designation: interferometer/rectangular standard cpu_many_core' - date: 'YYYY-MM-DD' - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/interferometer-rectangular-standard-cpu-many-core.md - kind: designation - likelihood: interferometer/rectangular - regime: standard - hardware_class: cpu_many_core - optimal: numba_cpu_sparse_fp64_wtilde - secondary: [jax_cpu_sparse_fp64_wtilde] - evidence: [lifecycle/41fd14e1f19bad947f24, lifecycle/5772383ee5a1c474afff, lifecycle/4663f221c8c3ce49b76f, lifecycle/85d104c103a554b56afa, lifecycle/fe0f252f68dcc26d7d13, lifecycle/7f44ae97f7ce3ccc7864, lifecycle/d79f1b94f4b03452d745, lifecycle/af1beefd41024500ad13, lifecycle/99c70939e335d08c4cff, lifecycle/8aeeeff35ca0d5d5b855, lifecycle/15aded078686cdf03ff5, lifecycle/598903fd79ec17f4328f, lifecycle/0cec032ed12d6d948802, lifecycle/ad305d23a04bd7700b82, lifecycle/29d350ddd936276d4121, lifecycle/f90468fb8090019a8659, lifecycle/0e27b1175ce084dff51e, lifecycle/f8de59681124b4e117d2] - rule: 'Any interferometer dataset with a rectangular pixelized source on a many-core CPU node with no GPU uses numba_cpu_sparse_fp64_wtilde, one serial likelihood per core (workers capped by node memory over peak RSS), falling back to jax_cpu_sparse_fp64_wtilde. Untested: CPU streaming and the MGE DFT route.' - supersedes: null -# separation: separated -- id: interferometer-rectangular-standard-gpu-a100 - title: 'Designation: interferometer/rectangular standard gpu_a100' - date: 'YYYY-MM-DD' - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/interferometer-rectangular-standard-gpu-a100.md - kind: designation - likelihood: interferometer/rectangular - regime: standard - hardware_class: gpu_a100 - optimal: jax_gpu_sparse_fp64_wtilde - secondary: [jax_gpu_dense_fp64_nufft] - evidence: [lifecycle/fe32c3ee13ad9afc455c, lifecycle/94c8f316ca657a6536ad, lifecycle/2ab9504c46bb8170ba54, lifecycle/1aafc8c30c529ae51479, lifecycle/220d076d8421130e83cf, lifecycle/7aad4d80e0298f32687c, lifecycle/e44acbf15a2387706fa1, lifecycle/18947283f540e425ae11, lifecycle/a39d6114339d546f6bd6, lifecycle/e98a8f4000e25e6d9f35] - rule: 'Any interferometer dataset with a rectangular pixelized source on an A100 node uses jax_gpu_sparse_fp64_wtilde, falling back to jax_gpu_dense_fp64_nufft. Untested: the GPU streaming route (measured up to jvla, 2.5e7 visibilities, on W~ sparse).' - supersedes: null -# separation: separated -- id: multi-dataset-delaunay-standard-cpu-many-core - title: 'Designation: multi_dataset/delaunay standard cpu_many_core' - date: 'YYYY-MM-DD' - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/multi-dataset-delaunay-standard-cpu-many-core.md - kind: designation - likelihood: multi_dataset/delaunay - regime: standard - hardware_class: cpu_many_core - optimal: numba_cpu_sparse_fp64 - secondary: [jax_cpu_sparse_fp64] - evidence: [lifecycle/f1dc379c56f5c2c7f32d, lifecycle/41ebc7e42114bbb5173a, lifecycle/f57f23fc63823bcdf1bc, lifecycle/d0be4a7b3506be7b53e9] - rule: 'A multi-dataset imaging fit (several datasets fitted together) with a Delaunay pixelized source on a many-core CPU node with no GPU uses numba_cpu_sparse_fp64, one serial likelihood per core (workers capped by node memory over peak RSS), falling back to jax_cpu_sparse_fp64.' - supersedes: null -# separation: separated -- id: multi-dataset-delaunay-standard-gpu-a100 - title: 'Designation: multi_dataset/delaunay standard gpu_a100' - date: 'YYYY-MM-DD' - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/multi-dataset-delaunay-standard-gpu-a100.md - kind: designation - likelihood: multi_dataset/delaunay - regime: standard - hardware_class: gpu_a100 - optimal: jax_gpu_dense_fp64 - secondary: [jax_gpu_sparse_fp64] - evidence: [lifecycle/b5dea27fcaf8b14ec9bb, lifecycle/0a0078bdc1dee2e7f555, lifecycle/b14372bc431d168fa7ff, lifecycle/74d94bd622ecce0679fe] - rule: 'A multi-dataset imaging fit (several datasets fitted together) with a Delaunay pixelized source on an A100 node uses jax_gpu_dense_fp64, falling back to jax_gpu_sparse_fp64.' - supersedes: null -# separation: separated -- id: multi-galaxy-delaunay-standard-cpu-many-core - title: 'Designation: multi_galaxy/delaunay standard cpu_many_core' - date: 'YYYY-MM-DD' - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/multi-galaxy-delaunay-standard-cpu-many-core.md - kind: designation - likelihood: multi_galaxy/delaunay - regime: standard - hardware_class: cpu_many_core - optimal: numba_cpu_sparse_fp64 - secondary: [jax_cpu_sparse_fp64] - evidence: [lifecycle/d3102456687aef830651, lifecycle/844f80aec856dd9e86ff, lifecycle/fc2096cb1c848e64b674, lifecycle/ba7ba9f1625678852fd7] - rule: 'A multi-galaxy imaging dataset with a Delaunay pixelized source on a many-core CPU node with no GPU uses numba_cpu_sparse_fp64, one serial likelihood per core (workers capped by node memory over peak RSS), falling back to jax_cpu_sparse_fp64.' - supersedes: null -# separation: separated -- id: multi-galaxy-delaunay-standard-gpu-a100 - title: 'Designation: multi_galaxy/delaunay standard gpu_a100' - date: 'YYYY-MM-DD' - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/multi-galaxy-delaunay-standard-gpu-a100.md - kind: designation - likelihood: multi_galaxy/delaunay - regime: standard - hardware_class: gpu_a100 - optimal: jax_gpu_dense_fp64 - secondary: [jax_gpu_sparse_fp64] - evidence: [lifecycle/5a510cca4fff0c0d5b58, lifecycle/dfd272620e2836754417, lifecycle/ec0a8fbc9c4e2d8b587e, lifecycle/633b3471528047682453] - rule: 'A multi-galaxy imaging dataset with a Delaunay pixelized source on an A100 node uses jax_gpu_dense_fp64, falling back to jax_gpu_sparse_fp64.' - supersedes: null -# separation: uncontested -- id: multi-galaxy-mge-standard-cpu-many-core - title: 'Designation: multi_galaxy/mge standard cpu_many_core' - date: 'YYYY-MM-DD' - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/multi-galaxy-mge-standard-cpu-many-core.md - kind: designation - likelihood: multi_galaxy/mge - regime: standard - hardware_class: cpu_many_core - optimal: jax_cpu_dense_fp64 - secondary: [] - evidence: [lifecycle/2ee75bc51ab781c2df4e, lifecycle/9edfaee55c6a1193e6f4] - rule: 'A multi-galaxy imaging dataset with a parametric (MGE) source on a many-core CPU node with no GPU uses jax_cpu_dense_fp64.' - supersedes: null -# separation: uncontested -- id: multi-galaxy-mge-standard-gpu-a100 - title: 'Designation: multi_galaxy/mge standard gpu_a100' - date: 'YYYY-MM-DD' - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/multi-galaxy-mge-standard-gpu-a100.md - kind: designation - likelihood: multi_galaxy/mge - regime: standard - hardware_class: gpu_a100 - optimal: jax_gpu_dense_fp64 - secondary: [] - evidence: [lifecycle/ad7e6ff9cd88a460649a, lifecycle/9068d8507411cfbcf803] - rule: 'A multi-galaxy imaging dataset with a parametric (MGE) source on an A100 node uses jax_gpu_dense_fp64.' - supersedes: null -# separation: separated -- id: multi-galaxy-rectangular-standard-cpu-many-core - title: 'Designation: multi_galaxy/rectangular standard cpu_many_core' - date: 'YYYY-MM-DD' - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/multi-galaxy-rectangular-standard-cpu-many-core.md - kind: designation - likelihood: multi_galaxy/rectangular - regime: standard - hardware_class: cpu_many_core - optimal: numba_cpu_sparse_fp64 - secondary: [jax_cpu_sparse_fp64] - evidence: [lifecycle/51f5d0ecf49223f09154, lifecycle/d7185e051ab18a8d35e1, lifecycle/a3ef052bb150d3365992, lifecycle/b7ba7f751e33237bf6a3] - rule: 'A multi-galaxy imaging dataset with a rectangular pixelized source on a many-core CPU node with no GPU uses numba_cpu_sparse_fp64, one serial likelihood per core (workers capped by node memory over peak RSS), falling back to jax_cpu_sparse_fp64.' - supersedes: null -# separation: separated -- id: multi-galaxy-rectangular-standard-gpu-a100 - title: 'Designation: multi_galaxy/rectangular standard gpu_a100' - date: 'YYYY-MM-DD' - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/multi-galaxy-rectangular-standard-gpu-a100.md - kind: designation - likelihood: multi_galaxy/rectangular - regime: standard - hardware_class: gpu_a100 - optimal: jax_gpu_dense_fp64 - secondary: [jax_gpu_sparse_fp64] - evidence: [lifecycle/6d59cdcd3eb1e4abf967, lifecycle/e291f6a166388b23e52f, lifecycle/f6d5339ad2b2bd8b790b, lifecycle/dd733151c3847dd9349f] - rule: 'A multi-galaxy imaging dataset with a rectangular pixelized source on an A100 node uses jax_gpu_dense_fp64, falling back to jax_gpu_sparse_fp64.' - supersedes: null -# separation: uncontested -- id: point-source-image-image-plane-standard-cpu-many-core - title: 'Designation: point_source_image/image_plane standard cpu_many_core' - date: 'YYYY-MM-DD' - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/point-source-image-image-plane-standard-cpu-many-core.md - kind: designation - likelihood: point_source_image/image_plane - regime: standard - hardware_class: cpu_many_core - optimal: jax_cpu_na_fp64 - secondary: [] - evidence: [lifecycle/6cbf08c848ae6cdb820f, lifecycle/a884951a80a697791744] - rule: 'A galaxy-scale point-source dataset fitted in the image plane on a many-core CPU node with no GPU uses jax_cpu_na_fp64.' - supersedes: null -# separation: uncontested -- id: point-source-image-image-plane-standard-gpu-a100 - title: 'Designation: point_source_image/image_plane standard gpu_a100' - date: 'YYYY-MM-DD' - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/point-source-image-image-plane-standard-gpu-a100.md - kind: designation - likelihood: point_source_image/image_plane - regime: standard - hardware_class: gpu_a100 - optimal: jax_gpu_na_fp64 - secondary: [] - evidence: [lifecycle/6282556b81be530f7bce, lifecycle/f4dfadf54484b22e9f69] - rule: 'A galaxy-scale point-source dataset fitted in the image plane on an A100 node uses jax_gpu_na_fp64.' - supersedes: null -# separation: uncontested -- id: point-source-source-source-plane-standard-cpu-many-core - title: 'Designation: point_source_source/source_plane standard cpu_many_core' - date: 'YYYY-MM-DD' - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/point-source-source-source-plane-standard-cpu-many-core.md - kind: designation - likelihood: point_source_source/source_plane - regime: standard - hardware_class: cpu_many_core - optimal: jax_cpu_na_fp64 - secondary: [] - evidence: [lifecycle/61082dc032d7280b3bd1, lifecycle/fa18efad842f4cc9fa73] - rule: 'A galaxy-scale point-source dataset fitted in the source plane on a many-core CPU node with no GPU uses jax_cpu_na_fp64.' - supersedes: null -# separation: uncontested — CHANGED from 2026-10-29 (was jax_cpu_na_fp64) -- id: point-source-source-source-plane-standard-gpu-a100 - title: 'Designation: point_source_source/source_plane standard gpu_a100' - date: 'YYYY-MM-DD' - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/point-source-source-source-plane-standard-gpu-a100.md - kind: designation - likelihood: point_source_source/source_plane - regime: standard - hardware_class: gpu_a100 - optimal: jax_gpu_na_fp64 - secondary: [] - evidence: [lifecycle/fcb319f0f24b8cc9fd37, lifecycle/403a31905c1445a750ba] - rule: 'A galaxy-scale point-source dataset fitted in the source plane on an A100 node uses jax_gpu_na_fp64.' - supersedes: null -# separation: uncontested -- id: weak-isothermal-standard-cpu-many-core - title: 'Designation: weak/isothermal standard cpu_many_core' - date: 'YYYY-MM-DD' - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/weak-isothermal-standard-cpu-many-core.md - kind: designation - likelihood: weak/isothermal - regime: standard - hardware_class: cpu_many_core - optimal: jax_cpu_dense_fp64 - secondary: [] - evidence: [lifecycle/03601d3a29aca4f5c389, lifecycle/7f6973aafe0b068ba1ab] - rule: 'A weak-lensing shear dataset with an isothermal lens on a many-core CPU node with no GPU uses jax_cpu_dense_fp64.' - supersedes: null -# separation: uncontested -- id: weak-isothermal-standard-gpu-a100 - title: 'Designation: weak/isothermal standard gpu_a100' - date: 'YYYY-MM-DD' - url: https://github.com/PyAutoLabs/PyAutoPulse/blob/main/decisions/weak-isothermal-standard-gpu-a100.md - kind: designation - likelihood: weak/isothermal - regime: standard - hardware_class: gpu_a100 - optimal: jax_gpu_dense_fp64 - secondary: [] - evidence: [lifecycle/fbd315b1a0e03f308c76, lifecycle/bfd2db209cd80e6a6354] - rule: 'A weak-lensing shear dataset with an isothermal lens on an A100 node uses jax_gpu_dense_fp64.' - supersedes: null -``` diff --git a/draft/research/autolens_profiling/matrix_free_interferometer_phase5.md b/draft/research/autolens_profiling/matrix_free_interferometer_phase5.md index 71e21db53..02ba65ddf 100644 --- a/draft/research/autolens_profiling/matrix_free_interferometer_phase5.md +++ b/draft/research/autolens_profiling/matrix_free_interferometer_phase5.md @@ -54,3 +54,10 @@ What to measure (dense `"fft"` route vs `"matrix_free"`, unconstrained and posit Diagnostics on the inversion: `inversion.operator` (sparse `M`, `curvature_matvec`), `regularization_matrix_sparse`, `positive_result`. The dense route cannot run above ~100²; a matrix-free-only row there is expected, not a failure. Decision rule the note should produce for the assistant: the mesh size (and visibility count) above which `matrix_free` beats `fft` on time and memory, and whether the SLQ evidence error is below the sampler's resolution there. Workspace example (5c) is **dropped until this verdict**; the Settings docs in `autoarray/settings.py` are the only user-facing text. + +## Re-scoped 2026-11-05 — what is left (draft-queue sweep) + +- **Done:** 5a: record `complete/2026/10/matrix-free-interferometer-wiring.md`. 5b measurements ran as RAL 413191 inside p2b: autolens_profiling#483 (merged 2026-10-29), 6 of 7 matrix-free rows (35² on 4 instruments + alma 64²/128²); alma 192² timed out and was dropped by human ruling (record `likelihood-lifecycle-p2b-interferometer.md`). +- **Remaining:** A 5b results note with a verdict / decision rules, and the real-dataset table. 5c stays dropped. + +_Evidence from the 2026-11-05 read-only sweep (Mind ledger + GitHub search); remaining items are the live scope of this prompt._ diff --git a/draft/research/euclid/euclid_dr1_positions_gate_remodel_run.md b/draft/research/euclid/euclid_dr1_positions_gate_remodel_run.md index 83d2a7c6d..e35f0e861 100644 --- a/draft/research/euclid/euclid_dr1_positions_gate_remodel_run.md +++ b/draft/research/euclid/euclid_dr1_positions_gate_remodel_run.md @@ -16,3 +16,10 @@ Unblocked 2026-09-25: phase 1 gate shipped (`complete/2026/09/euclid-dr1-positio Witness: positions_meta.json sidecars exist for every dataset/dr1_sep1_rest tile, positions_review.csv lists the review tiles (~280 expected), and the resubmitted locked set's vis_lp fits no longer end on the penalty plateau (f_live < 1, N_eff > 1) for >= 85% of the 736 previously locked tiles. Phase 3 of the positions work (phase 1: #103 gate; phase 2: finder SNR floor). Science/Cortex task in the euclid_dr1 clone (/mnt/c/Users/Jammy/Science/euclid_dr1): port the gate, run it over the 14,032 tiles (~12 CPU-h, RAL array), hold back review tiles, then resubmit the remodel set: 736 locked + 294 unlocked-central + 5 unlocked failing + 85 unfinished, and gate pending tiles before submission. Record the census and outcome in the euclid_dr1 Cortex ledger. Expected: 11,639 keep, 2,043 drop one image, 282 review; T at the 0.3" floor for 96%. + +## Re-scoped 2026-11-05 — what is left (draft-queue sweep) + +- **Done:** Gate run and resubmission: Cortex `projects/euclid_dr1.md` (2026-09-25) — rewrite_positions over all DR1, positions_meta.json sidecars (14,029 rest tiles; 133 + 27 marked for review); remodel arrays on finder-2.1 positions 350804, 375700–375703, 366938. +- **Remaining:** The Witness: record whether ≥85% of the 736 locked tiles left the penalty plateau. + +_Evidence from the 2026-11-05 read-only sweep (Mind ledger + GitHub search); remaining items are the live scope of this prompt._ diff --git a/draft/test/workspaces/mesh_magnification_correctness.md b/draft/test/workspaces/mesh_magnification_correctness.md index e95241b8c..094faf110 100644 --- a/draft/test/workspaces/mesh_magnification_correctness.md +++ b/draft/test/workspaces/mesh_magnification_correctness.md @@ -88,3 +88,10 @@ The Delaunay defect the same audit *did* establish was fixed separately — PR #525 merged 2026-09-05): `areas_for_magnification` now returns barycentric dual areas. + +## Re-scoped 2026-11-05 — what is left (draft-queue sweep) + +- **Done:** 4a/4b/4e: records `complete/2026/10/mesh-magnification-areas.md`, `mesh-magnification-knn-areas.md`, `pixelization-mesh-mag-docs.md`. +- **Remaining:** 4c flux-ratio μ and 4d recovery sweep. + +_Evidence from the 2026-11-05 read-only sweep (Mind ledger + GitHub search); remaining items are the live scope of this prompt._ diff --git a/state.json b/state.json index 2df5691b4..7186d0b8e 100644 --- a/state.json +++ b/state.json @@ -4,7 +4,7 @@ "repo": "PyAutoMind", "status": "yellow", "headline": "YELLOW \u2014 24 picks \u00b7 8 in flight", - "updated": "2026-11-05T19:18:55Z", + "updated": "2026-11-05T19:42:17Z", "pages_url": "https://pyautolabs.github.io/PyAutoMind/", "items": [ { From 6a26897b622e4b23f06ccbbb3e2011748fde383c Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 5 Nov 2026 21:20:31 +0000 Subject: [PATCH 7/9] =?UTF-8?q?intake:=20close-out=20guard=20=E2=80=94=20f?= =?UTF-8?q?lag=20shipped=20work=20whose=20draft=20was=20never=20closed,=20?= =?UTF-8?q?whatever=20path=20the=20merge=20took?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_016nhQ8MZyNga1wamBmFdfAK --- dashboard.html | 31 +++++---- dashboard.md | 32 +++++---- ...lose_out_guard_catch_shipped_work_whose.md | 69 +++++++++++++++++++ state.json | 8 +-- 4 files changed, 109 insertions(+), 31 deletions(-) create mode 100644 draft/feature/pyautobrain/close_out_guard_catch_shipped_work_whose.md diff --git a/dashboard.html b/dashboard.html index 6464693b8..c60f719fc 100644 --- a/dashboard.html +++ b/dashboard.html @@ -327,12 +327,12 @@ Keep track of decisions and outstanding questions throughout this conversation. After changes, report what was recorded, where it lives and what remains to do. Work on GitHub: -- Open Mind repository: https://github.com/PyAutoLabs/PyAutoMind
Last updated 2026-11-05 19:42:17 UTC
↻ Update

- +- Open Mind repository: https://github.com/PyAutoLabs/PyAutoMind
Last updated 2026-11-05 21:20:29 UTC
↻ Update

+
Batch 2026-11-05-am — 0 in progress · 0 awaiting review

Nothing to review yet.

Start here

24
-

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

+

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

@@ -344,8 +344,8 @@

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

Fix Sibson interpolation at internal edges🐛 bugautoarraylargesupervisedhigh

-

Deep research: Can we speed up Delaunay in PyAutoArray?🔬 researchautoarraytoo-largesupervisedhigh

-

Fits a slot (ready to run unattended, cheapest to review first) — showing 12 of 80

+ +

Fits a slot (ready to run unattended, cheapest to review first) — showing 12 of 81

Guard every workspace script against untimed network downloads🧪 testautolens_workspacesmallsafemedium

@@ -525,8 +525,8 @@

Fits a slot (ready to run unattended, cheapest to revie

interferometer-primary-beam-persistence-mirror — filed 2026-10-21 — ready — PyAutoLens claim released 2026-10-21 (point-dataset-positions-panel shipped…

point-plots-yaml-keys-assistant — filed 2026-10-22 — unblocked 2026-10-23 — cosmos-web-ring-notebook merged (autolens_assistant#161, complete/2026/10/cosmos-web-ring-notebook.md)…

-

Backlog

241
-

Lanes: any 233 · local-dev 6

+

Backlog

242
+

Lanes: any 234 · local-dev 6

Human review — 2

autolens_workspace point_source/plot.py crashes: residual_map (4,2) vs (5,2) broadcast; the model solves 5…🐛 bugautolenshuman-required

-feature — 34 +feature — 35 + @@ -782,6 +783,12 @@

Fits a slot (ready to run unattended, cheapest to revie +2026-11-05 +filed +Close-out guard: catch shipped work whose Mind draft was never… + + + 2026-11-04 issued Autonomous orchestrators phase 4c: run the Dev orchestrator pilot… @@ -811,7 +818,7 @@

Fits a slot (ready to run unattended, cheapest to revie Imaging sparse-operator path gives a very different log L from dense… - + 2026-11-02 issued Gradient-correctness sweep: triage and investigate every open… @@ -1051,12 +1058,6 @@

Fits a slot (ready to run unattended, cheapest to revie multi_dataset/jax_likelihood/delaunay.py asserts the wrong likelihood… - -2026-09-18 -filed -autolens_workspace: __Model__ bullets whose profiles or parameter… - -

Pending release

2
diff --git a/dashboard.md b/dashboard.md index 7d67b1ab7..688607cb2 100644 --- a/dashboard.md +++ b/dashboard.md @@ -12,7 +12,7 @@ | [Epics](#epics) | 21 | | [In flight](#in-flight) | 8 | | [Planned](#planned) | 9 | -| [Backlog](#backlog) | 241 | +| [Backlog](#backlog) | 242 | | [Recent](#recent) | 50 | | [Pending release](#pending-release) | 2 | @@ -23,7 +23,7 @@ ## Start here -**Highest priority** (filed as `high`) — showing 12 of 18 +**Highest priority** (filed as `high`) — showing 12 of 19
📋 autolens_assistant leg of the PyAutoLabs AI-options page (deferred from #87) — autolens_assistant · small · supervised · high @@ -113,15 +113,15 @@ Use the start-dev skill. draft/research/euclid/euclid_dr1_positions_gate_remodel
-
📋 Deep research: Can we speed up Delaunay in PyAutoArray? — autoarray · too-large · supervised · high +
📋 Close-out guard: catch shipped work whose Mind draft was never closed, whatever… — pyautobrain · large · supervised · high ``` -Use the start-dev skill. draft/research/autoarray/delaunay_research.md +Use the start-dev skill. draft/feature/pyautobrain/close_out_guard_catch_shipped_work_whose.md ```
-**Fits a slot** (ready to run unattended, cheapest to review first) — showing 12 of 80 +**Fits a slot** (ready to run unattended, cheapest to review first) — showing 12 of 81
📋 Guard every workspace script against untimed network downloads — autolens_workspace · small · safe · medium @@ -1155,7 +1155,7 @@ Use the start-dev skill. draft/docs/autolens_assistant/point_plots_yaml_keys.md ## Backlog -Lanes: any 233 · local-dev 6 +Lanes: any 234 · local-dev 6
@@ -1643,7 +1643,7 @@ Use the start-dev skill. draft/bug/autolens/point_source_plot_script_residual_sh
-feature — 34 +feature — 35
📋 Eyes cluster visualization group: render every cluster/point-source figure for PyAutoEyes — autolens_visualization · large · supervised · high @@ -1653,6 +1653,14 @@ Use the start-dev skill. draft/feature/autolens_visualization/eyes_cluster_visua
+
📋 Close-out guard: catch shipped work whose Mind draft was never closed, whatever… — pyautobrain · large · supervised · high + +``` +Use the start-dev skill. draft/feature/pyautobrain/close_out_guard_catch_shipped_work_whose.md +``` + +
+
📋 Inversion.source_clumps_from needs a robust scale — thresholding against the raw maximum finds… — autoarray · small · supervised · medium ``` @@ -2618,17 +2626,18 @@ Use the start-dev skill. draft/triage/autolens/jit_fit_from_is_vacuous.md | 2026-11-05 | issued | Filed: 2026-11-05… | | 2026-11-05 | filed | Filed: 2026-11-05 (phase 2 of autolens_profiling#519; Pulse task… | | 2026-11-05 | filed | Filed: 2026-11-05 (found by the autolens_profiling#519 worker-route… | +| 2026-11-05 | filed | Close-out guard: catch shipped work whose Mind draft was never… | | 2026-11-04 | issued | Autonomous orchestrators phase 4c: run the Dev orchestrator pilot… | | 2026-11-02 | filed | Unexplained autodiff-vs-FD gaps in the phase-6 gradient records… | | 2026-11-02 | issued | Magnification maps 8d: wire into fit subplots and make them pretty | | 2026-11-02 | issued | Issued: 2026-11-02 | | 2026-11-02 | filed | Imaging sparse-operator path gives a very different log L from dense… | -| 2026-11-02 | issued | Gradient-correctness sweep: triage and investigate every open… |
… 10 more (40 left) | Date | Event | Task | |------|-------|------| +| 2026-11-02 | issued | Gradient-correctness sweep: triage and investigate every open… | | 2026-10-31 | issued | Sky orientation (north/east): euclid_dr1 catalogue, paper and… | | 2026-10-30 | filed | Should PyAutoArray flip FITS rows at load so +y is north | | 2026-10-29 | issued | ECLIPSE site: serve R2 lens files through a Pages Function behind… | @@ -2638,12 +2647,12 @@ Use the start-dev skill. draft/triage/autolens/jit_fit_from_is_vacuous.md | 2026-10-23 | filed | autolens_assistant leg of the PyAutoLabs AI-options page (deferred… | | 2026-10-23 | filed | @autolens_profiling stale auto-simulated dataset/cluster/simple… | | 2026-10-23 | filed | A dedicated Documentation conductor in PyAutoBrain | -| 2026-10-22 | filed | point-plots-yaml-keys-assistant |
… 10 more (30 left) | Date | Event | Task | |------|-------|------| +| 2026-10-22 | filed | point-plots-yaml-keys-assistant | | 2026-10-21 | filed | interferometer-primary-beam-persistence-mirror | | 2026-10-21 | filed | PyAutoLens mirror of the interferometer primary-beam persistence… | | 2026-10-21 | filed | Note in autolens_profiling that plain source-plane lane values… | @@ -2653,12 +2662,12 @@ Use the start-dev skill. draft/triage/autolens/jit_fit_from_is_vacuous.md | 2026-10-21 | filed | Cluster likelihood scripts: image-plane manual check disagrees with… | | 2026-10-16 | filed | Re-measure the shapelets/modeling.py SLOW park (#586) under the… | | 2026-10-14 | filed | @autofit_workspace six searches/ scripts fail on main at… | -| 2026-10-14 | filed | Cortex output summaries — phase 2 |
… 10 more (20 left) | Date | Event | Task | |------|-------|------| +| 2026-10-14 | filed | Cortex output summaries — phase 2 | | 2026-10-09 | filed | Profiling conductor compile drift compares one point against one point | | 2026-10-08 | filed | JAX_ENABLE_X64=False is overridden to True, so the fp32 inference… | | 2026-10-07 | filed | Upstream the DR1 final-catalogue tooling to the pipeline, with a… | @@ -2668,12 +2677,12 @@ Use the start-dev skill. draft/triage/autolens/jit_fit_from_is_vacuous.md | 2026-10-02 | filed | Fix KNN neighbor search for a partial final point block | | 2026-10-01 | filed | Sparse interferometer terms: NUFFT ignores the mask origin and… | | 2026-10-01 | filed | Interferometer log_evidence fails (LinAlgError / NaN) at large… | -| 2026-10-01 | filed | Interferometer galaxy_image_dict drops a mixed galaxy's ordinary… |
… 10 more (10 left) | Date | Event | Task | |------|-------|------| +| 2026-10-01 | filed | Interferometer galaxy_image_dict drops a mixed galaxy's ordinary… | | 2026-09-29 | filed | PlotterEllipse.fit_ellipse writes every variant to… | | 2026-09-27 | filed | Sparse interferometer inversion: jax.grad of the log-evidence terms… | | 2026-09-27 | filed | Same-class q-clamp and bare-sqrt ellipticity gradient sites… | @@ -2683,7 +2692,6 @@ Use the start-dev skill. draft/triage/autolens/jit_fit_from_is_vacuous.md | 2026-09-25 | filed | test_latent_euclid_variables_traces_under_jax_jit went red on main… | | 2026-09-24 | filed | euclid_dr1: run the positions gate over DR1 and submit the remodel set | | 2026-09-23 | filed | multi_dataset/jax_likelihood/delaunay.py asserts the wrong likelihood… | -| 2026-09-18 | filed | autolens_workspace: __Model__ bullets whose profiles or parameter… |
diff --git a/draft/feature/pyautobrain/close_out_guard_catch_shipped_work_whose.md b/draft/feature/pyautobrain/close_out_guard_catch_shipped_work_whose.md new file mode 100644 index 000000000..7ab6d022b --- /dev/null +++ b/draft/feature/pyautobrain/close_out_guard_catch_shipped_work_whose.md @@ -0,0 +1,69 @@ +# Close-out guard: catch shipped work whose Mind draft was never closed, whatever… + +Type: feature +Target: PyAutoBrain +Repos: +- PyAutoBrain +- PyAutoMind +Themes: +- mind-workflow +- dashboard +Difficulty: large +Autonomy: supervised +Priority: high +Status: formalised +Filed: 2026-11-05 +Consequence: judge +Witness: a fixture Mind + fixture commit/PR history where (i) a draft's Witness test name now exists in its target repo, (ii) a merged PR body or commit message names the draft's path or slug, and (iii) a completion record's `## Original prompt` duplicates an open draft — the guard flags all three as `looks-shipped` with the evidence cited, flags none of a control set (shared vocabulary only), writes nothing under draft/, and the batch planner drops flagged drafts from its proposals; `pytest PyAutoBrain/tests -q` and the Mind suite green. +Review-minutes: 15 +Unattended: ready + +## Why (measured 2026-11-05) + +A queue check-in picked five tasks and found four already shipped. A full sweep of all 280 +drafts then closed **27 shipped/superseded drafts** and re-scoped 24 partly-done ones +(PyAutoMind#539). This morning's batch (`batches/2026-11-05-am.md`) had proposed two of the +shipped ones. Every case bypassed `/prm`, whose close-out already runs a folder-scoped +`intake reconcile` (`skills/prm/reference.md` §4): + +- fixed directly on main with no issue or PR (Mind 679b1319f, 4d8290555); +- merged by a session that never ran the close-out (PyAutoBrain#564 shipped + `rtd_organism_currency` and `board_without_gh_phase2_legs`; PyAutoMemory#143); +- re-filed as a duplicate — several completion records carry an open draft's twin as their + `## Original prompt` (e.g. `workspace-freshness-stamp`, `autocti-viz-render-from-mains`), and + `ell_comps_joint_disk_constraint` was filed four days after its work merged. + +`intake reconcile` exists but is read-only, opt-in and vocabulary-based (2026-08-25: 24 suspects +of 138, mostly weak), so nothing runs it across the whole backlog with strong evidence. + +## Ask + +Add a detector that runs outside `/prm` and only *flags* (retiring stays human, as now): + +1. **Strong evidence signals** in `intake reconcile` (or a sibling mode), graded above the + existing vocabulary signals: + - the draft's Witness names a test/function that now exists in the target repo + (search API or the checked-out organs); + - a merged PR body / commit message on an organism `main` since `Filed:` names the draft's + path, filename or slug; + - a `complete/` record's `## Original prompt` duplicates an open draft (title or body + near-match). +2. **Schedule it**: a daily Mind workflow (beside `registry_reconcile.yml`, odd minute) that + writes the strong-evidence suspects into a dashboard **"Looks shipped — confirm"** section + (state.json too), each with its evidence line and a one-line close command. +3. **Batch backpressure**: the Batch Agent excludes `looks-shipped` drafts from proposals until + a human confirms or dismisses them. +4. Optional, decide in the plan: a merge-time hook (`ship_*` / `prm`'s tiered path already + close out; the gap is merges outside them) — e.g. warn in the PR when a branch's commits + name a draft that the PR does not retire. + +## Not in scope + +Auto-closing anything; the 34 sweep `UNCLEAR` drafts (runtime/CI checks, separate work). + +## Original request (chat 2026-11-05) + +"/prm and file the close out guard" — following the recommendation: "make `/prm` or the merge +workflow refuse to finish while the task's draft is still in `draft/`". + + diff --git a/state.json b/state.json index 7186d0b8e..d329488a9 100644 --- a/state.json +++ b/state.json @@ -4,7 +4,7 @@ "repo": "PyAutoMind", "status": "yellow", "headline": "YELLOW \u2014 24 picks \u00b7 8 in flight", - "updated": "2026-11-05T19:42:17Z", + "updated": "2026-11-05T21:20:30Z", "pages_url": "https://pyautolabs.github.io/PyAutoMind/", "items": [ { @@ -111,9 +111,9 @@ }, { "severity": "info", - "text": "pick: Deep research: Can we speed up Delaunay in PyAutoArray?", - "url": "https://github.com/PyAutoLabs/PyAutoMind/blob/main/draft/research/autoarray/delaunay_research.md", - "prompt": "Use the start-dev skill. draft/research/autoarray/delaunay_research.md" + "text": "pick: Close-out guard: catch shipped work whose Mind draft was never closed, whatever\u2026", + "url": "https://github.com/PyAutoLabs/PyAutoMind/blob/main/draft/feature/pyautobrain/close_out_guard_catch_shipped_work_whose.md", + "prompt": "Use the start-dev skill. draft/feature/pyautobrain/close_out_guard_catch_shipped_work_whose.md" }, { "severity": "info", From 4e219d4a03811327afa23f4a052855ae956c5da4 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 5 Nov 2026 21:26:43 +0000 Subject: [PATCH 8/9] prm: close compile-drift-single-sample (PyAutoBrain#588) and repos-sync-optin-block (this PR) Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_016nhQ8MZyNga1wamBmFdfAK --- .../2026/11/compile-drift-single-sample.md | 7 + .../2026/11/repos-sync-optin-block.md | 6 + complete/index.md | 4 +- dashboard.html | 102 +++-- dashboard.md | 393 +++++++++--------- state.json | 2 +- 6 files changed, 255 insertions(+), 259 deletions(-) rename draft/bug/pyautobrain/profiling_compile_drift_point_vs_point.md => complete/2026/11/compile-drift-single-sample.md (65%) rename draft/refactor/pyautomind/repos_sync_check_dedup.md => complete/2026/11/repos-sync-optin-block.md (68%) diff --git a/draft/bug/pyautobrain/profiling_compile_drift_point_vs_point.md b/complete/2026/11/compile-drift-single-sample.md similarity index 65% rename from draft/bug/pyautobrain/profiling_compile_drift_point_vs_point.md rename to complete/2026/11/compile-drift-single-sample.md index 54d4e071b..c392b16b4 100644 --- a/draft/bug/pyautobrain/profiling_compile_drift_point_vs_point.md +++ b/complete/2026/11/compile-drift-single-sample.md @@ -1,3 +1,10 @@ +- summary: shipped in PyAutoBrain#588 (merge e822697, 2026-11-05), commit ed0782c. Decision: option (a), taken by the agent as decide-and-flag and accepted by the human on 2026-11-05. The 2x `COMPILE_DRIFT_RATIO` band and the 1 s floor stay as a gross flag. Each drifted row from `ingest --axis compile` now carries `comparison` (`single-sample` / `repeat-summarised`), `pinned_repeats`, `observed_repeats` and `caveat` (`SINGLE_SAMPLE_CAVEAT`: "single-sample endpoint(s): a gross 2x-band flag from one pinned timing vs one observed timing, not a measured change"). `triage --axis compile` passes these through. A row counts as repeat-summarised only when both endpoints carry `compile_repeats` >= 2 (P7's rule). Compile cost only. +- witness: `test_compile_drift_is_reported_as_a_single_sample_comparison` (synthetic: 4.0 s → 10.0 s drifts with the caveat, 4.0 s → 6.0 s does not) and `test_compile_drift_reports_repeat_counts_when_the_data_carries_them`. Brain suite 1578 passed, 1 skipped. CI pytest 3.12/3.13 green at 0f82a07. +- follow-up (not filed): no producer writes `compile_repeats` yet, so every real drift reports single-sample. autolens_profiling's `jax_compile` tooling could write it. +- also in #588: the intake `census()` epic-companion skip (dashboard 286 → 239 prompts) and the organ-target Memory-gate spelling test (record `intake-memory-line-organ-targets`). + +## Original prompt + # Profiling conductor compile drift compares one point against one point Type: bug diff --git a/draft/refactor/pyautomind/repos_sync_check_dedup.md b/complete/2026/11/repos-sync-optin-block.md similarity index 68% rename from draft/refactor/pyautomind/repos_sync_check_dedup.md rename to complete/2026/11/repos-sync-optin-block.md index 33d709919..504614b05 100644 --- a/draft/refactor/pyautomind/repos_sync_check_dedup.md +++ b/complete/2026/11/repos-sync-optin-block.md @@ -1,3 +1,9 @@ +- summary: shipped in PyAutoMind#539 (commit dc471e1d6), narrowed scope: option (a) of the 2026-11-05 re-size, chosen by the human. A single `OptInBlock` dataclass (`noun`, `begin`, `end`, `organs_only`) drives both the drift check and `--write` for the three opt-in AGENTS.md blocks: map, history and remote. `check_map_blocks` / `check_history_blocks` / `check_remote_blocks` stay as thin wrappers. The deliverable, filing and standards blocks, the hooks and the mode-gated writers stay explicit, because their contracts differ. +- witness: byte-identical before/after for `--check` on the live workspace, `--write` on a scratch copy of the workspace, the follow-up `--check`, and the files `--write` produced. New `tests/test_repos_sync_opt_in_blocks.py` pins the shared contract per block. Mind suite 725 passed; 1 failure that also fails without this change (`test_the_hook_survives_an_unwritable_tools_dir`, root in the container). +- not done: the full one-declaration-per-surface collapse (option b). Re-file it only if a new generated surface makes it worth it. + +## Original prompt + # Deduplicate repos_sync.py's check/write pairs Type: refactor diff --git a/complete/index.md b/complete/index.md index 8a4e9b344..99fa71e22 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. -2167 records across 11 buckets. +2169 records across 11 buckets. ## Highlights @@ -139,6 +139,7 @@ markers; everything below GENERATED is rebuilt. - [brain-hygiene-cleanup-bugs](2026/11/brain-hygiene-cleanup-bugs.md) - [chapter2-continuation](2026/11/chapter2-continuation.md) — All continuation scope merged: Tutorials 5 and 6, optional speed and runnable model_centred prior passing, sum… - [cloud-validation-rehearsal-clock-skew](2026/11/cloud-validation-rehearsal-clock-skew.md) +- [compile-drift-single-sample](2026/11/compile-drift-single-sample.md) — shipped in PyAutoBrain#588 (merge e822697, 2026-11-05), commit ed0782c. Decision: option (a), taken by the age… - [cortex-projects-dashboard-parent](2026/11/cortex-projects-dashboard-parent.md) — parent closed. Phase 1, the presentation change, shipped in PyAutoBrain#526 (merge 92de427, 2026-10-15; record… - [cti-database-examples-drift](2026/11/cti-database-examples-drift.md) - [cti-fits-fit-output-dir](2026/11/cti-fits-fit-output-dir.md) @@ -195,6 +196,7 @@ markers; everything below GENERATED is rebuilt. - [rectangular-gradient-rtu-sparse](2026/11/rectangular-gradient-rtu-sparse.md) — the filed symptom (|g| ~2e9 on the imaging/rectangular/hst fiducial, RTU all backends, Bilinear CPU sparse) sp… - [rectangular-mapper-bilinear-row-weights](2026/11/rectangular-mapper-bilinear-row-weights.md) — - **Retired as already-fixed** by the gradient-correctness sweep (autolens_profiling#517, item 12). The draft … - [registry-reconcile-app-token](2026/11/registry-reconcile-app-token.md) +- [repos-sync-optin-block](2026/11/repos-sync-optin-block.md) — shipped in PyAutoMind#539 (commit dc471e1d6), narrowed scope: option (a) of the 2026-11-05 re-size, chosen by … - [repos-sync-test-keys-on-dir-name](2026/11/repos-sync-test-keys-on-dir-name.md) — already shipped — closed as stale draft. Commit 679b1319f (2026-10-16, "test: Mind suite green on main — shado… - [results-library-p2-completeness](2026/11/results-library-p2-completeness.md) — phase 2; ledger draft/feature/autofit/results_library_epic.md - [results-library-p3-exports](2026/11/results-library-p3-exports.md) — phase 3; ledger draft/feature/autofit/results_library_epic.md diff --git a/dashboard.html b/dashboard.html index 0549f4b22..2575bc8e5 100644 --- a/dashboard.html +++ b/dashboard.html @@ -327,8 +327,8 @@ Keep track of decisions and outstanding questions throughout this conversation. After changes, report what was recorded, where it lives and what remains to do. Work on GitHub: -- Open Mind repository: https://github.com/PyAutoLabs/PyAutoMind
Last updated 2026-11-05 21:22:47 UTC
↻ Update

- +- Open Mind repository: https://github.com/PyAutoLabs/PyAutoMind
Last updated 2026-11-05 21:26:42 UTC
↻ Update

+
Batch 2026-11-05-pm — 0 in progress · 0 awaiting review

Nothing to review yet.

Start here

24
@@ -526,8 +526,8 @@

Fits a slot (ready to run unattended, cheapest to revie

interferometer-primary-beam-persistence-mirror — filed 2026-10-21 — ready — PyAutoLens claim released 2026-10-21 (point-dataset-positions-panel shipped…

point-plots-yaml-keys-assistant — filed 2026-10-22 — unblocked 2026-10-23 — cosmos-web-ring-notebook merged (autolens_assistant#161, complete/2026/10/cosmos-web-ring-notebook.md)…

-

Backlog

242
-

Lanes: any 234 · local-dev 6

+

Backlog

240
+

Lanes: any 232 · local-dev 6

Human review — 2

Human review: the scaling_relation slam parks (imaging un-parked, multi_galaxy kept)👀 human_reviewautolens_workspacenormal — flagged for review 2026-08-29

-bug — 54 +feature — 35 + + + + + + +

COOLEST: export MGE lens light and pixelized sources as pixel grids✨ featureautolensmediumsupervisedmedium

+

A dedicated Documentation conductor in PyAutoBrain✨ featurepyautobrainmediumsupervisedmedium

+

Nightly run of one HowTo tutorial per chapter at real settings✨ featurepyautoheartmediumsupervisedmedium

+

Brain board follow-ups: what real mornings surface✨ featurepyautobrainsmallsupervisednormal

+

bump_colab_urls.sh: cover autolens_assistant Colab links✨ featurepyautohandssmallsafenormal

+

Can create a list of InversionMatrix objects for each dataset✨ featureautoarraymediumsupervisednormal

+

Tune cluster-scale JOSS benchmarks toward their 5-minute targets✨ featureautolens_workspacemediumsafenormal

+ +

batch slice — the decomposition pass for needs-slicing prompts✨ featurepyautobrainmediumsupervisednormal

+ + +

EP analytic updates — implement the four planned work packages✨ featureautofitlargesupervisednormal

+ +

Remote-MCP deployment tiers (2 + 3) for the results-inspector server✨ featureautofit_assistantlargehuman-requirednormal

+

Multi-plane time delays✨ featureautolenslargesupervisednormal

+

Adopt oversampled PSFs in the start-here dataset chain (option a)✨ featureautolens_workspacelargesupervisednormal

+

Restore lensing-of-lens in the multiple_sources workspace example✨ featureworkspaceslargesupervisednormal

+

Follow-up to rectangular_adapt_cdf.md (issue #322) and Path A✨ featureautoarraytoo-largesupervisednormal

+

PIEMass.potential_2d_from: implement the missing lensing potential✨ featureautogalaxytoo-largesupervisednormal

+

Context: PyAutoLens issue #542 follow-up (Gap 1, deferred during the✨ featurejax_substructuretoo-largesupervisednormal

+

Context: PyAutoLens issue #542 follow-up (Gap 2, deferred during the✨ featurejax_substructuretoo-largesupervisednormal

+

dPIE: optional central-dispersion (sigma_0) parameterization✨ featureautogalaxysmallsupervisedlow

+ +

Release board: local run_logs enrichment✨ featurepyautohandssmallsupervisedlow

+ +

Animated logos for PyAutoGalaxy and PyAutoFit✨ featurepyautoscientistmediumsafelow

+

Deferred: make the *Power adapt classes the defaults (breaking)✨ featureautoarraylargehuman-requiredlow

+ +

Simplify reading-queue token management✨ featurepyautomemory

+
+
+bug — 53

Fix KNN neighbor search for a partial final point block🐛 bugautoarraymediumsupervisedhigh

@@ -574,7 +612,6 @@

Fits a slot (ready to run unattended, cheapest to revie - @@ -617,44 +654,6 @@

Fits a slot (ready to run unattended, cheapest to revie

-feature — 35 - - - - - - -

COOLEST: export MGE lens light and pixelized sources as pixel grids✨ featureautolensmediumsupervisedmedium

-

A dedicated Documentation conductor in PyAutoBrain✨ featurepyautobrainmediumsupervisedmedium

-

Nightly run of one HowTo tutorial per chapter at real settings✨ featurepyautoheartmediumsupervisedmedium

-

Brain board follow-ups: what real mornings surface✨ featurepyautobrainsmallsupervisednormal

-

bump_colab_urls.sh: cover autolens_assistant Colab links✨ featurepyautohandssmallsafenormal

-

Can create a list of InversionMatrix objects for each dataset✨ featureautoarraymediumsupervisednormal

-

Tune cluster-scale JOSS benchmarks toward their 5-minute targets✨ featureautolens_workspacemediumsafenormal

- -

batch slice — the decomposition pass for needs-slicing prompts✨ featurepyautobrainmediumsupervisednormal

- - -

EP analytic updates — implement the four planned work packages✨ featureautofitlargesupervisednormal

- -

Remote-MCP deployment tiers (2 + 3) for the results-inspector server✨ featureautofit_assistantlargehuman-requirednormal

-

Multi-plane time delays✨ featureautolenslargesupervisednormal

-

Adopt oversampled PSFs in the start-here dataset chain (option a)✨ featureautolens_workspacelargesupervisednormal

-

Restore lensing-of-lens in the multiple_sources workspace example✨ featureworkspaceslargesupervisednormal

-

Follow-up to rectangular_adapt_cdf.md (issue #322) and Path A✨ featureautoarraytoo-largesupervisednormal

-

PIEMass.potential_2d_from: implement the missing lensing potential✨ featureautogalaxytoo-largesupervisednormal

-

Context: PyAutoLens issue #542 follow-up (Gap 1, deferred during the✨ featurejax_substructuretoo-largesupervisednormal

-

Context: PyAutoLens issue #542 follow-up (Gap 2, deferred during the✨ featurejax_substructuretoo-largesupervisednormal

-

dPIE: optional central-dispersion (sigma_0) parameterization✨ featureautogalaxysmallsupervisedlow

- -

Release board: local run_logs enrichment✨ featurepyautohandssmallsupervisedlow

- -

Animated logos for PyAutoGalaxy and PyAutoFit✨ featurepyautoscientistmediumsafelow

-

Deferred: make the *Power adapt classes the defaults (breaking)✨ featureautoarraylargehuman-requiredlow

- -

Simplify reading-queue token management✨ featurepyautomemory

-
-
research — 20 @@ -723,7 +722,7 @@

Fits a slot (ready to run unattended, cheapest to revie

-refactor — 13 +refactor — 12

Example Analysis should reduce with xp.sum not builtin sum♻️ refactorautofitsmallsafenormal

@@ -735,7 +734,6 @@

Fits a slot (ready to run unattended, cheapest to revie

Repo cleanup: retire the Abell 1201 worktree and local raw data♻️ refactorworkspacessmallhuman-requiredlow

Trim autogalaxy_assistant skills toward their autolens size♻️ refactorautogalaxy_assistantmediumsupervisedlow

-

Deduplicate repos_sync.py's check/write pairs♻️ refactorpyautomindlargesupervisedlow

@@ -952,12 +950,6 @@

Fits a slot (ready to run unattended, cheapest to revie -2026-10-09 -filed -Profiling conductor compile drift compares one point against one point - - - 2026-10-08 filed JAX_ENABLE_X64=False is overridden to True, so the fp32 inference… @@ -1059,6 +1051,12 @@

Fits a slot (ready to run unattended, cheapest to revie euclid_dr1: run the positions gate over DR1 and submit the remodel set + +2026-09-23 +filed +multi_dataset/jax_likelihood/delaunay.py asserts the wrong likelihood… + +

Pending release

2
diff --git a/dashboard.md b/dashboard.md index 862aa19e6..75ba178f4 100644 --- a/dashboard.md +++ b/dashboard.md @@ -12,7 +12,7 @@ | [Epics](#epics) | 21 | | [In flight](#in-flight) | 9 | | [Planned](#planned) | 9 | -| [Backlog](#backlog) | 242 | +| [Backlog](#backlog) | 240 | | [Recent](#recent) | 50 | | [Pending release](#pending-release) | 2 | @@ -1163,7 +1163,7 @@ Use the start-dev skill. draft/docs/autolens_assistant/point_plots_yaml_keys.md ## Backlog -Lanes: any 234 · local-dev 6 +Lanes: any 232 · local-dev 6
@@ -1214,721 +1214,713 @@ regenerate the dashboard. If I do not sign it off, file the follow-up with
-bug — 54 +feature — 35 -
📋 test_latent_euclid_variables_traces_under_jax_jit went red on main: total_source_flux differs by 6% between jax.jit… — euclid · small · supervised · high +
📋 Eyes cluster visualization group: render every cluster/point-source figure for PyAutoEyes — autolens_visualization · large · supervised · high ``` -Use the start-dev skill. draft/bug/euclid/latent_total_source_flux_jax_vs_numpy_regression.md +Use the start-dev skill. draft/feature/autolens_visualization/eyes_cluster_visualization_group_render_every_cl.md ```
-
📋 SED chain waveband fit can spin forever in Nautilus exploration… — euclid · small · supervised · high +
📋 Close-out guard: catch shipped work whose Mind draft was never closed, whatever… — pyautobrain · large · supervised · high ``` -Use the start-dev skill. draft/bug/euclid/sed_chain_waveband_fit_can_spin_forever.md +Use the start-dev skill. draft/feature/pyautobrain/close_out_guard_catch_shipped_work_whose.md ```
-
📋 Fix KNN neighbor search for a partial final point block — autoarray · medium · supervised · high +
📋 Inversion.source_clumps_from needs a robust scale — thresholding against the raw maximum finds… — autoarray · small · supervised · medium ``` -Use the start-dev skill. draft/bug/autoarray/fix_knn_neighbor_search_for_a_partial.md +Use the start-dev skill. draft/feature/autoarray/source_clumps_robust_scale.md ```
-
📋 Sparse (w-tilde) inversion fits the unsubtracted image when a regular light profile… — autoarray · medium · supervised · high +
📋 autofit_assistant: a skill that owns loading the user's data and its selection… — autofit_assistant · small · safe · medium ``` -Use the start-dev skill. draft/bug/autoarray/sparse_inversion_ignores_profile_subtracted_image.md +Use the start-dev skill. draft/feature/autofit_assistant/data_loading_and_selection_cuts_skill.md ```
-
📋 Fix Sibson interpolation at internal edges — autoarray · large · supervised · high +
📋 Filed: 2026-11-05 (phase 2 of autolens_profiling#519; Pulse task PyAutoPulse/tasks/numba_num_threads_pin_and_delaunay_nn_remeasure.md steps 2-4) — autolens_profiling · small · medium ``` -Use the start-dev skill. draft/bug/autoarray/fix_sibson_interpolation_at_internal_edges.md +Use the start-dev skill. draft/feature/autolens_profiling/delaunay_nn_numba_optimal_remeasure_after_677.md ```
-
📋 Investigate Euclid Einstein-radius latent uncertainty collapse — autofit · too-large · supervised · high +
📋 Which other searches need prior-support handling — coverage audit after Prodigy — autofit · medium · safe · medium ``` -Use the start-dev skill. draft/bug/autofit/investigate_euclid_einstein_radius_latent_uncert.md +Use the start-dev skill. draft/feature/autofit/prior_exit_sampler_coverage.md ```
-
📋 Fix release result/sample parameter-path regressions — health_fixes · too-large · supervised · high +
📋 COOLEST: export MGE lens light and pixelized sources as pixel grids — autolens · medium · supervised · medium ``` -Use the start-dev skill. draft/bug/health_fixes/samples_parameter_paths.md +Use the start-dev skill. draft/feature/autolens/coolest_pixel_grid_export.md ```
-
📋 Filed: 2026-11-05 (found by the autolens_profiling#519 worker-route witness) — autoarray · small · medium +
📋 A dedicated Documentation conductor in PyAutoBrain — pyautobrain · medium · supervised · medium ``` -Use the start-dev skill. draft/bug/autoarray/sibson_serial_kernel_loses_allocation_hoisting.md +Use the start-dev skill. draft/feature/pyautobrain/docs_conductor.md ```
-
📋 Interferometer galaxy_image_dict drops a mixed galaxy's ordinary light (dict merge overwrites) — autogalaxy · small · supervised · medium +
📋 Nightly run of one HowTo tutorial per chapter at real settings — pyautoheart · medium · supervised · medium ``` -Use the start-dev skill. draft/bug/autogalaxy/galaxy_image_dict_mixed_galaxy_overwrites_ordinary_light.md +Use the start-dev skill. draft/feature/pyautoheart/howto_real_settings_nightly.md ```
-
📋 Reverse-mode jax.grad of MGE deflections returns NaN when the profile centre lands… — autogalaxy · small · supervised · medium +
📋 Brain board follow-ups: what real mornings surface — pyautobrain · small · supervised · normal ``` -Use the start-dev skill. draft/bug/autogalaxy/mge_deflections_reverse_mode_nan_at_grid_centre.md +Use the start-dev skill. draft/feature/pyautobrain/brain_board_follow_ups.md ```
-
📋 imaging/features/pixelization/delaunay.py sits on the 300 s smoke cap… — autolens_workspace · small · safe · medium +
📋 bump_colab_urls.sh: cover autolens_assistant Colab links — pyautohands · small · safe · normal ``` -Use the start-dev skill. draft/bug/autolens_workspace/delaunay_smoke_300s_cap.md +Use the start-dev skill. draft/feature/pyautohands/bump_colab_urls_autolens_assistant.md ```
-
📋 subhalo/sensitivity/slam_source_pixelized.py fails on main: al.MapperValued no longer exists — autolens_workspace · small · supervised · medium +
📋 Can create a list of InversionMatrix objects for each dataset — autoarray · medium · supervised · normal ``` -Use the start-dev skill. draft/bug/autolens_workspace/sensitivity_slam_source_pixelized_mappervalued.md +Use the start-dev skill. draft/feature/autoarray/multiwavelength_inversion.md ```
-
📋 vis_lp passes batch_size=50 to af.Nautilus, which has no such parameter — euclid · small · supervised · medium +
📋 Tune cluster-scale JOSS benchmarks toward their 5-minute targets — autolens_workspace · medium · safe · normal ``` -Use the start-dev skill. draft/bug/euclid/vis_lp_batch_size_kwarg_silently_ignored.md +Use the start-dev skill. draft/feature/autolens_workspace/joss_cluster_benchmark_tuning.md ```
-
📋 Profiling conductor compile drift compares one point against one point — pyautobrain · small · supervised · medium +
📋 Upstream the DR1 final-catalogue tooling to the pipeline, with a vis_lp-only appendix… — euclid · medium · supervised · normal ``` -Use the start-dev skill. draft/bug/pyautobrain/profiling_compile_drift_point_vs_point.md +Use the start-dev skill. draft/feature/euclid/upstream_dr1_final_catalogue_tooling.md ```
-
📋 Adaptive Delaunay mesh places two mesh pixels 0.001" apart — a degenerate… — autoarray · medium · supervised · medium +
📋 batch slice — the decomposition pass for needs-slicing prompts — pyautobrain · medium · supervised · normal ``` -Use the start-dev skill. draft/bug/autoarray/adaptive_mesh_degenerate_pixel_pair.md +Use the start-dev skill. draft/feature/pyautobrain/batch_slice.md ```
-
📋 Interferometer log_evidence fails (LinAlgError / NaN) at large regularization coefficients the jitted… — autoarray · medium · supervised · medium +
📋 The imaging features/advanced/los_halos example needs improving and padding out before — workspaces · medium · safe · normal ``` -Use the start-dev skill. draft/bug/autoarray/interferometer_log_evidence_large_regularization_coefficient_cholesky.md +Use the start-dev skill. draft/feature/workspaces/group_los_halos.md ```
-
📋 Sparse interferometer terms: NUFFT ignores the mask origin and provenance cannot see… — autoarray · medium · supervised · medium +
📋 The imaging features/advanced/subhalo/sensitivity example needs improving and padding out before — workspaces · medium · safe · normal ``` -Use the start-dev skill. draft/bug/autoarray/sparse_terms_nufft_origin_and_mask_compatibility.md +Use the start-dev skill. draft/feature/workspaces/group_subhalo_sensitivity.md ```
-
📋 Imaging sparse-operator path gives a very different log L from dense… — autoarray · medium · supervised · medium +
📋 EP analytic updates — implement the four planned work packages — autofit · large · supervised · normal ``` -Use the start-dev skill. draft/bug/autoarray/sparse_vs_dense_log_likelihood_mismatch_nonlinear_lens_light.md +Use the start-dev skill. draft/feature/autofit/ep_analytic_updates.md ```
-
📋 Cluster likelihood scripts: image-plane manual check disagrees with the library; point_0 truth… — autolens_workspace · medium · supervised · medium +
📋 Skip the likelihood for assertion-violating samples on the JAX path — autofit · large · supervised · normal ``` -Use the start-dev skill. draft/bug/autolens_workspace/cluster_likelihood_scripts_preexisting_mismatches.md +Use the start-dev skill. draft/feature/autofit/skip_the_likelihood_for_assertion_violating_samp.md ```
-
📋 imaging/start_here: 26-minute XLA compile of the 48-start Prodigy multi-start on CPU — autolens_workspace · medium · supervised · medium +
📋 Remote-MCP deployment tiers (2 + 3) for the results-inspector server — autofit_assistant · large · human-required · normal ``` -Use the start-dev skill. draft/bug/autolens_workspace/start_here_multistart_compile_time.md +Use the start-dev skill. draft/feature/autofit_assistant/remote_mcp_deployment_tiers.md ```
-
📋 Visualization warm-up swallowed for ellipse and point-source analyses — autofit · large · supervised · medium +
📋 Multi-plane time delays — autolens · large · supervised · normal ``` -Use the start-dev skill. draft/bug/autofit/visualization_warmup_swallowed_exception.md +Use the start-dev skill. draft/feature/autolens/multi_plane_time_delays.md ```
-
📋 SimulatorImaging draws Poisson noise before checking add_poisson_noise_to_data — autoarray · low · safe · medium +
📋 Adopt oversampled PSFs in the start-here dataset chain (option a) — autolens_workspace · large · supervised · normal ``` -Use the start-dev skill. draft/bug/autoarray/simulator_imaging_poisson_drawn_before_flag_check.md +Use the start-dev skill. draft/feature/autolens_workspace/oversampled_psf_dataset_adoption.md ```
-
📋 rectangular.py parity contract: absolute-nats bound, and import autogalaxy before jax — workspaces · easy · supervised · medium +
📋 Restore lensing-of-lens in the multiple_sources workspace example — workspaces · large · supervised · normal ``` -Use the start-dev skill. draft/bug/workspaces/rectangular_parity_absolute_bound_and_x64_import_order.md +Use the start-dev skill. draft/feature/workspaces/restore_multiple_sources_lensing_of_lens.md ```
-
📋 Building a JAX Fitness then calling register_tracer_classes raises "Duplicate custom PyTreeDef type… — autoarray · small · supervised · normal +
📋 Follow-up to rectangular_adapt_cdf.md (issue #322) and Path A — autoarray · too-large · supervised · normal ``` -Use the start-dev skill. draft/bug/autoarray/galaxy_duplicate_pytree_registration_after_jax_fitness.md +Use the start-dev skill. draft/feature/autoarray/rectangular_multi_submesh.md ```
-
📋 DatasetModel with a free grid_offset cannot round-trip autofit.jax.register_model — autofit · small · safe · normal +
📋 PIEMass.potential_2d_from: implement the missing lensing potential — autogalaxy · too-large · supervised · normal ``` -Use the start-dev skill. draft/bug/autofit/dataset_model_free_grid_offset_pytree_roundtrip.md +Use the start-dev skill. draft/feature/autogalaxy/piemass_potential.md ```
-
📋 autofit: Samples.with_paths / without_paths break on factor-graph fits with shared priors — autofit · small · supervised · normal +
📋 Context: PyAutoLens issue #542 follow-up (Gap 1, deferred during the — jax_substructure · too-large · supervised · normal ``` -Use the start-dev skill. draft/bug/autofit/samples_with_paths_shared_prior_factor_graph.md +Use the start-dev skill. draft/feature/jax_substructure/5_prng_key_vmap_noise.md ```
-
📋 Stale enable_pytrees register_model advice in NUTS and SMC errors and searches docs — autofit · small · safe · normal +
📋 Context: PyAutoLens issue #542 follow-up (Gap 2, deferred during the — jax_substructure · too-large · supervised · normal ``` -Use the start-dev skill. draft/bug/autofit/stale_enable_pytrees_register_model_advice_in.md +Use the start-dev skill. draft/feature/jax_substructure/6_deflection_equivalence_test.md ```
-
📋 PlotterEllipse.fit_ellipse writes every variant to ellipse_fit.png, so only the last survives — autogalaxy · small · normal +
📋 dPIE: optional central-dispersion (sigma_0) parameterization — autogalaxy · small · supervised · low ``` -Use the start-dev skill. draft/bug/autogalaxy/ellipse_plotter_fit_ellipse_overwrites.md +Use the start-dev skill. draft/feature/autogalaxy/dpie_sigma0_parameterization.md ```
-
📋 Move the positions_threshold test fixture off the symmetry axis — autolens · small · safe · normal +
📋 PyAutoLens mirror of the interferometer primary-beam persistence (docstring + round-trip test) — autolens · small · safe · low ``` -Use the start-dev skill. draft/bug/autolens/positions_threshold_fixture_off_axis.md +Use the start-dev skill. draft/feature/autolens/interferometer_primary_beam_persistence_mirror.md ```
-
📋 SLaM simultaneous subhalo grid search fits last band only — autolens_workspace · small · safe · normal +
📋 Release board: local run_logs enrichment — pyautohands · small · supervised · low ``` -Use the start-dev skill. draft/bug/autolens_workspace/slam_simultaneous_subhalo_grid_search_fits_last.md +Use the start-dev skill. draft/feature/pyautohands/release_board_run_logs_enrichment.md ```
-
📋 JAX_ENABLE_X64=False is overridden to True, so the fp32 inference leg runs fp64… — autonerves · small · supervised · normal +
📋 Gallery runner: add visualization_upper + decide the modeling_visualization_jit tier — workspaces · small · safe · low ``` -Use the start-dev skill. draft/bug/autonerves/jax_enable_x64_env_ignored_and_fp32_leg_runs_fp64.md +Use the start-dev skill. draft/feature/workspaces/gallery_runner_missing_tiers.md ```
-
📋 Convolver "No blurring_image provided" warning in canonical workspace scripts — workspaces · small · safe · normal +
📋 Animated logos for PyAutoGalaxy and PyAutoFit — pyautoscientist · medium · safe · low ``` -Use the start-dev skill. draft/bug/workspaces/convolver_blurring_image_warning.md +Use the start-dev skill. draft/feature/pyautoscientist/animated_logos_for_pyautogalaxy_and_pyautofit.md ```
-
📋 A non-uniform over_sample_size costs several times more JAX compile than a uniform… — autoarray · medium · supervised · normal +
📋 Deferred: make the *Power adapt classes the defaults (breaking) — autoarray · large · human-required · low ``` -Use the start-dev skill. draft/bug/autoarray/non_uniform_over_sample_jax_compile_cost.md +Use the start-dev skill. draft/feature/autoarray/adapt_linear_default_flip.md ```
-
📋 vmap(jit) likelihood recompiles once per distinct Nautilus batch length — autofit · medium · supervised · normal +
📋 Cortex output summaries — phase 2 — cortex ``` -Use the start-dev skill. draft/bug/autofit/vmap_jit_recompiles_per_nautilus_batch_length.md +Use the start-dev skill. draft/feature/cortex/output_summary.md ```
-
📋 LensCalc tangential caustic on a masked grid differs ~27 % in ellipticity… — autogalaxy · medium · supervised · normal +
📋 Simplify reading-queue token management — pyautomemory ``` -Use the start-dev skill. draft/bug/autogalaxy/lenscalc_masked_grid_caustic_differs_from_unmasked.md +Use the start-dev skill. draft/feature/pyautomemory/reading-queue-token-management.md ```
-
📋 JIT cache not hit in modeling_visualization delaunay/rectangular scripts — autolens · medium · safe · normal - -``` -Use the start-dev skill. draft/bug/autolens/jit_cache_not_hit_modeling_visualization.md -``` -
-
📋 Profile multi_galaxy/start_here.py's release cost and retire its 3600s override — autolens_workspace · medium · supervised · normal +
+bug — 53 + +
📋 test_latent_euclid_variables_traces_under_jax_jit went red on main: total_source_flux differs by 6% between jax.jit… — euclid · small · supervised · high ``` -Use the start-dev skill. draft/bug/autolens_workspace/multi_galaxy_start_here_release_cost.md +Use the start-dev skill. draft/bug/euclid/latent_total_source_flux_jax_vs_numpy_regression.md ```
-
📋 multi_dataset/jax_likelihood/delaunay.py asserts the wrong likelihood on main (−72070 vs 1995) — autolens_workspace_test · medium · supervised · normal +
📋 SED chain waveband fit can spin forever in Nautilus exploration… — euclid · small · supervised · high ``` -Use the start-dev skill. draft/bug/autolens_workspace_test/multi_dataset_jax_likelihood_delaunay_wrong_likelihood.md +Use the start-dev skill. draft/bug/euclid/sed_chain_waveband_fit_can_spin_forever.md ```
-
📋 CI timing must compare equivalent executed job coverage — health_fixes · medium · supervised · normal +
📋 Fix KNN neighbor search for a partial final point block — autoarray · medium · supervised · high ``` -Use the start-dev skill. draft/bug/health_fixes/ci_timing_execution_coverage.md +Use the start-dev skill. draft/bug/autoarray/fix_knn_neighbor_search_for_a_partial.md ```
-
📋 Heart Health rerun cannot publish after main advances — health_fixes · medium · supervised · normal +
📋 Sparse (w-tilde) inversion fits the unsubtracted image when a regular light profile… — autoarray · medium · supervised · high ``` -Use the start-dev skill. draft/bug/health_fixes/heart_health_rerun_stale_push.md +Use the start-dev skill. draft/bug/autoarray/sparse_inversion_ignores_profile_subtracted_image.md ```
-
📋 @PyAutoFit TransformedMessage.logpdf/pdf omit the transform Jacobian — priors · medium · supervised · normal +
📋 Fix Sibson interpolation at internal edges — autoarray · large · supervised · high ``` -Use the start-dev skill. draft/bug/priors/15_transformed_message_logpdf_jacobian.md +Use the start-dev skill. draft/bug/autoarray/fix_sibson_interpolation_at_internal_edges.md ```
-
📋 Resolve release-profile timeout scripts deliberately — health_fixes · too-large · supervised · normal +
📋 Investigate Euclid Einstein-radius latent uncertainty collapse — autofit · too-large · supervised · high ``` -Use the start-dev skill. draft/bug/health_fixes/release_timeout_policy.md +Use the start-dev skill. draft/bug/autofit/investigate_euclid_einstein_radius_latent_uncert.md ```
-
📋 @PyAutoFit Refactor: each density should live in one place, not three — priors · too-large · supervised · normal +
📋 Fix release result/sample parameter-path regressions — health_fixes · too-large · supervised · high ``` -Use the start-dev skill. draft/bug/priors/12_single_source_density_refactor.md +Use the start-dev skill. draft/bug/health_fixes/samples_parameter_paths.md ```
-
📋 @PyAutoFit Refactor: collapse the Prior / Message two-layer hierarchy — priors · too-large · supervised · normal +
📋 Filed: 2026-11-05 (found by the autolens_profiling#519 worker-route witness) — autoarray · small · medium ``` -Use the start-dev skill. draft/bug/priors/13_collapse_prior_and_message.md +Use the start-dev skill. draft/bug/autoarray/sibson_serial_kernel_loses_allocation_hoisting.md ```
-
📋 @PyAutoFit Refactor: replace hand-rolled AbstractDensityTransform with tfp.bijectors / numpyro.distributions.transforms — priors · too-large · supervised · normal +
📋 Interferometer galaxy_image_dict drops a mixed galaxy's ordinary light (dict merge overwrites) — autogalaxy · small · supervised · medium ``` -Use the start-dev skill. draft/bug/priors/14_replace_transform_stack_with_bijectors.md +Use the start-dev skill. draft/bug/autogalaxy/galaxy_image_dict_mixed_galaxy_overwrites_ordinary_light.md ```
-
📋 Priors & Messages cleanup — tracker — priors · too-large · supervised · normal +
📋 Reverse-mode jax.grad of MGE deflections returns NaN when the profile centre lands… — autogalaxy · small · supervised · medium ``` -Use the start-dev skill. draft/bug/priors/z_features.md +Use the start-dev skill. draft/bug/autogalaxy/mge_deflections_reverse_mode_nan_at_grid_centre.md ```
-
📋 sub_slim_indexes_for_pix_index appends -1 row padding to the last pixel's list — autoarray · small · supervised · low +
📋 imaging/features/pixelization/delaunay.py sits on the 300 s smoke cap… — autolens_workspace · small · safe · medium ``` -Use the start-dev skill. draft/bug/autoarray/sub_slim_indexes_for_pix_index_padding.md +Use the start-dev skill. draft/bug/autolens_workspace/delaunay_smoke_300s_cap.md ```
-
📋 Aggregator reload of an in-memory sparse-operator interferometer fit silently falls back… — autogalaxy · small · supervised · low +
📋 subhalo/sensitivity/slam_source_pixelized.py fails on main: al.MapperValued no longer exists — autolens_workspace · small · supervised · medium ``` -Use the start-dev skill. draft/bug/autogalaxy/aggregator_reload_drops_sparse_operator.md +Use the start-dev skill. draft/bug/autolens_workspace/sensitivity_slam_source_pixelized_mappervalued.md ```
-
📋 Database-path searches cannot reload dataset.fits (written to disk, never registered via save_fits) — autogalaxy · small · supervised · low +
📋 vis_lp passes batch_size=50 to af.Nautilus, which has no such parameter — euclid · small · supervised · medium ``` -Use the start-dev skill. draft/bug/autogalaxy/database_paths_dataset_fits_not_registered.md +Use the start-dev skill. draft/bug/euclid/vis_lp_batch_size_kwarg_silently_ignored.md ```
-
📋 @autolens_profiling stale auto-simulated dataset/cluster/simple is never regenerated — autolens_profiling · small · supervised · low +
📋 Adaptive Delaunay mesh places two mesh pixels 0.001" apart — a degenerate… — autoarray · medium · supervised · medium ``` -Use the start-dev skill. draft/bug/autolens_profiling/stale_auto_simulated_cluster_dataset.md +Use the start-dev skill. draft/bug/autoarray/adaptive_mesh_degenerate_pixel_pair.md ```
-
📋 The reconstruction noise map is not the truncated posterior the NNLS solve… — autoarray · medium · human-required · low +
📋 Interferometer log_evidence fails (LinAlgError / NaN) at large regularization coefficients the jitted… — autoarray · medium · supervised · medium ``` -Use the start-dev skill. draft/bug/autoarray/reconstruction_noise_map_truncated_posterior.md +Use the start-dev skill. draft/bug/autoarray/interferometer_log_evidence_large_regularization_coefficient_cholesky.md ```
-
📋 Point-source JSON datasets record no resolution regime — pyautolens · medium · supervised · low +
📋 Sparse interferometer terms: NUFFT ignores the mask origin and provenance cannot see… — autoarray · medium · supervised · medium ``` -Use the start-dev skill. draft/bug/pyautolens/point_source_json_datasets_record_no_regime.md +Use the start-dev skill. draft/bug/autoarray/sparse_terms_nufft_origin_and_mask_compatibility.md ```
-
📋 Same-class q-clamp and bare-sqrt ellipticity gradient sites (follow-up to PyAutoGalaxy#631) — autogalaxy +
📋 Imaging sparse-operator path gives a very different log L from dense… — autoarray · medium · supervised · medium ``` -Use the start-dev skill. draft/bug/autogalaxy/q_clamp_and_bare_sqrt_ellipticity_grad_sweep.md +Use the start-dev skill. draft/bug/autoarray/sparse_vs_dense_log_likelihood_mismatch_nonlinear_lens_light.md ```
-
📋 autolens_workspace point_source/plot.py crashes: residual_map (4,2) vs (5,2) broadcast; the model solves 5… — autolens · human-required +
📋 Cluster likelihood scripts: image-plane manual check disagrees with the library; point_0 truth… — autolens_workspace · medium · supervised · medium ``` -Use the start-dev skill. draft/bug/autolens/point_source_plot_script_residual_shape_mismatch.md +Use the start-dev skill. draft/bug/autolens_workspace/cluster_likelihood_scripts_preexisting_mismatches.md ```
-
- -
-feature — 35 - -
📋 Eyes cluster visualization group: render every cluster/point-source figure for PyAutoEyes — autolens_visualization · large · supervised · high +
📋 imaging/start_here: 26-minute XLA compile of the 48-start Prodigy multi-start on CPU — autolens_workspace · medium · supervised · medium ``` -Use the start-dev skill. draft/feature/autolens_visualization/eyes_cluster_visualization_group_render_every_cl.md +Use the start-dev skill. draft/bug/autolens_workspace/start_here_multistart_compile_time.md ```
-
📋 Close-out guard: catch shipped work whose Mind draft was never closed, whatever… — pyautobrain · large · supervised · high +
📋 Visualization warm-up swallowed for ellipse and point-source analyses — autofit · large · supervised · medium ``` -Use the start-dev skill. draft/feature/pyautobrain/close_out_guard_catch_shipped_work_whose.md +Use the start-dev skill. draft/bug/autofit/visualization_warmup_swallowed_exception.md ```
-
📋 Inversion.source_clumps_from needs a robust scale — thresholding against the raw maximum finds… — autoarray · small · supervised · medium +
📋 SimulatorImaging draws Poisson noise before checking add_poisson_noise_to_data — autoarray · low · safe · medium ``` -Use the start-dev skill. draft/feature/autoarray/source_clumps_robust_scale.md +Use the start-dev skill. draft/bug/autoarray/simulator_imaging_poisson_drawn_before_flag_check.md ```
-
📋 autofit_assistant: a skill that owns loading the user's data and its selection… — autofit_assistant · small · safe · medium +
📋 rectangular.py parity contract: absolute-nats bound, and import autogalaxy before jax — workspaces · easy · supervised · medium ``` -Use the start-dev skill. draft/feature/autofit_assistant/data_loading_and_selection_cuts_skill.md +Use the start-dev skill. draft/bug/workspaces/rectangular_parity_absolute_bound_and_x64_import_order.md ```
-
📋 Filed: 2026-11-05 (phase 2 of autolens_profiling#519; Pulse task PyAutoPulse/tasks/numba_num_threads_pin_and_delaunay_nn_remeasure.md steps 2-4) — autolens_profiling · small · medium +
📋 Building a JAX Fitness then calling register_tracer_classes raises "Duplicate custom PyTreeDef type… — autoarray · small · supervised · normal ``` -Use the start-dev skill. draft/feature/autolens_profiling/delaunay_nn_numba_optimal_remeasure_after_677.md +Use the start-dev skill. draft/bug/autoarray/galaxy_duplicate_pytree_registration_after_jax_fitness.md ```
-
📋 Which other searches need prior-support handling — coverage audit after Prodigy — autofit · medium · safe · medium +
📋 DatasetModel with a free grid_offset cannot round-trip autofit.jax.register_model — autofit · small · safe · normal ``` -Use the start-dev skill. draft/feature/autofit/prior_exit_sampler_coverage.md +Use the start-dev skill. draft/bug/autofit/dataset_model_free_grid_offset_pytree_roundtrip.md ```
-
📋 COOLEST: export MGE lens light and pixelized sources as pixel grids — autolens · medium · supervised · medium +
📋 autofit: Samples.with_paths / without_paths break on factor-graph fits with shared priors — autofit · small · supervised · normal ``` -Use the start-dev skill. draft/feature/autolens/coolest_pixel_grid_export.md +Use the start-dev skill. draft/bug/autofit/samples_with_paths_shared_prior_factor_graph.md ```
-
📋 A dedicated Documentation conductor in PyAutoBrain — pyautobrain · medium · supervised · medium +
📋 Stale enable_pytrees register_model advice in NUTS and SMC errors and searches docs — autofit · small · safe · normal ``` -Use the start-dev skill. draft/feature/pyautobrain/docs_conductor.md +Use the start-dev skill. draft/bug/autofit/stale_enable_pytrees_register_model_advice_in.md ```
-
📋 Nightly run of one HowTo tutorial per chapter at real settings — pyautoheart · medium · supervised · medium +
📋 PlotterEllipse.fit_ellipse writes every variant to ellipse_fit.png, so only the last survives — autogalaxy · small · normal ``` -Use the start-dev skill. draft/feature/pyautoheart/howto_real_settings_nightly.md +Use the start-dev skill. draft/bug/autogalaxy/ellipse_plotter_fit_ellipse_overwrites.md ```
-
📋 Brain board follow-ups: what real mornings surface — pyautobrain · small · supervised · normal +
📋 Move the positions_threshold test fixture off the symmetry axis — autolens · small · safe · normal ``` -Use the start-dev skill. draft/feature/pyautobrain/brain_board_follow_ups.md +Use the start-dev skill. draft/bug/autolens/positions_threshold_fixture_off_axis.md ```
-
📋 bump_colab_urls.sh: cover autolens_assistant Colab links — pyautohands · small · safe · normal +
📋 SLaM simultaneous subhalo grid search fits last band only — autolens_workspace · small · safe · normal ``` -Use the start-dev skill. draft/feature/pyautohands/bump_colab_urls_autolens_assistant.md +Use the start-dev skill. draft/bug/autolens_workspace/slam_simultaneous_subhalo_grid_search_fits_last.md ```
-
📋 Can create a list of InversionMatrix objects for each dataset — autoarray · medium · supervised · normal +
📋 JAX_ENABLE_X64=False is overridden to True, so the fp32 inference leg runs fp64… — autonerves · small · supervised · normal ``` -Use the start-dev skill. draft/feature/autoarray/multiwavelength_inversion.md +Use the start-dev skill. draft/bug/autonerves/jax_enable_x64_env_ignored_and_fp32_leg_runs_fp64.md ```
-
📋 Tune cluster-scale JOSS benchmarks toward their 5-minute targets — autolens_workspace · medium · safe · normal +
📋 Convolver "No blurring_image provided" warning in canonical workspace scripts — workspaces · small · safe · normal ``` -Use the start-dev skill. draft/feature/autolens_workspace/joss_cluster_benchmark_tuning.md +Use the start-dev skill. draft/bug/workspaces/convolver_blurring_image_warning.md ```
-
📋 Upstream the DR1 final-catalogue tooling to the pipeline, with a vis_lp-only appendix… — euclid · medium · supervised · normal +
📋 A non-uniform over_sample_size costs several times more JAX compile than a uniform… — autoarray · medium · supervised · normal ``` -Use the start-dev skill. draft/feature/euclid/upstream_dr1_final_catalogue_tooling.md +Use the start-dev skill. draft/bug/autoarray/non_uniform_over_sample_jax_compile_cost.md ```
-
📋 batch slice — the decomposition pass for needs-slicing prompts — pyautobrain · medium · supervised · normal +
📋 vmap(jit) likelihood recompiles once per distinct Nautilus batch length — autofit · medium · supervised · normal ``` -Use the start-dev skill. draft/feature/pyautobrain/batch_slice.md +Use the start-dev skill. draft/bug/autofit/vmap_jit_recompiles_per_nautilus_batch_length.md ```
-
📋 The imaging features/advanced/los_halos example needs improving and padding out before — workspaces · medium · safe · normal +
📋 LensCalc tangential caustic on a masked grid differs ~27 % in ellipticity… — autogalaxy · medium · supervised · normal ``` -Use the start-dev skill. draft/feature/workspaces/group_los_halos.md +Use the start-dev skill. draft/bug/autogalaxy/lenscalc_masked_grid_caustic_differs_from_unmasked.md ```
-
📋 The imaging features/advanced/subhalo/sensitivity example needs improving and padding out before — workspaces · medium · safe · normal +
📋 JIT cache not hit in modeling_visualization delaunay/rectangular scripts — autolens · medium · safe · normal ``` -Use the start-dev skill. draft/feature/workspaces/group_subhalo_sensitivity.md +Use the start-dev skill. draft/bug/autolens/jit_cache_not_hit_modeling_visualization.md ```
-
📋 EP analytic updates — implement the four planned work packages — autofit · large · supervised · normal +
📋 Profile multi_galaxy/start_here.py's release cost and retire its 3600s override — autolens_workspace · medium · supervised · normal ``` -Use the start-dev skill. draft/feature/autofit/ep_analytic_updates.md +Use the start-dev skill. draft/bug/autolens_workspace/multi_galaxy_start_here_release_cost.md ```
-
📋 Skip the likelihood for assertion-violating samples on the JAX path — autofit · large · supervised · normal +
📋 multi_dataset/jax_likelihood/delaunay.py asserts the wrong likelihood on main (−72070 vs 1995) — autolens_workspace_test · medium · supervised · normal ``` -Use the start-dev skill. draft/feature/autofit/skip_the_likelihood_for_assertion_violating_samp.md +Use the start-dev skill. draft/bug/autolens_workspace_test/multi_dataset_jax_likelihood_delaunay_wrong_likelihood.md ```
-
📋 Remote-MCP deployment tiers (2 + 3) for the results-inspector server — autofit_assistant · large · human-required · normal +
📋 CI timing must compare equivalent executed job coverage — health_fixes · medium · supervised · normal ``` -Use the start-dev skill. draft/feature/autofit_assistant/remote_mcp_deployment_tiers.md +Use the start-dev skill. draft/bug/health_fixes/ci_timing_execution_coverage.md ```
-
📋 Multi-plane time delays — autolens · large · supervised · normal +
📋 Heart Health rerun cannot publish after main advances — health_fixes · medium · supervised · normal ``` -Use the start-dev skill. draft/feature/autolens/multi_plane_time_delays.md +Use the start-dev skill. draft/bug/health_fixes/heart_health_rerun_stale_push.md ```
-
📋 Adopt oversampled PSFs in the start-here dataset chain (option a) — autolens_workspace · large · supervised · normal +
📋 @PyAutoFit TransformedMessage.logpdf/pdf omit the transform Jacobian — priors · medium · supervised · normal ``` -Use the start-dev skill. draft/feature/autolens_workspace/oversampled_psf_dataset_adoption.md +Use the start-dev skill. draft/bug/priors/15_transformed_message_logpdf_jacobian.md ```
-
📋 Restore lensing-of-lens in the multiple_sources workspace example — workspaces · large · supervised · normal +
📋 Resolve release-profile timeout scripts deliberately — health_fixes · too-large · supervised · normal ``` -Use the start-dev skill. draft/feature/workspaces/restore_multiple_sources_lensing_of_lens.md +Use the start-dev skill. draft/bug/health_fixes/release_timeout_policy.md ```
-
📋 Follow-up to rectangular_adapt_cdf.md (issue #322) and Path A — autoarray · too-large · supervised · normal +
📋 @PyAutoFit Refactor: each density should live in one place, not three — priors · too-large · supervised · normal ``` -Use the start-dev skill. draft/feature/autoarray/rectangular_multi_submesh.md +Use the start-dev skill. draft/bug/priors/12_single_source_density_refactor.md ```
-
📋 PIEMass.potential_2d_from: implement the missing lensing potential — autogalaxy · too-large · supervised · normal +
📋 @PyAutoFit Refactor: collapse the Prior / Message two-layer hierarchy — priors · too-large · supervised · normal ``` -Use the start-dev skill. draft/feature/autogalaxy/piemass_potential.md +Use the start-dev skill. draft/bug/priors/13_collapse_prior_and_message.md ```
-
📋 Context: PyAutoLens issue #542 follow-up (Gap 1, deferred during the — jax_substructure · too-large · supervised · normal +
📋 @PyAutoFit Refactor: replace hand-rolled AbstractDensityTransform with tfp.bijectors / numpyro.distributions.transforms — priors · too-large · supervised · normal ``` -Use the start-dev skill. draft/feature/jax_substructure/5_prng_key_vmap_noise.md +Use the start-dev skill. draft/bug/priors/14_replace_transform_stack_with_bijectors.md ```
-
📋 Context: PyAutoLens issue #542 follow-up (Gap 2, deferred during the — jax_substructure · too-large · supervised · normal +
📋 Priors & Messages cleanup — tracker — priors · too-large · supervised · normal ``` -Use the start-dev skill. draft/feature/jax_substructure/6_deflection_equivalence_test.md +Use the start-dev skill. draft/bug/priors/z_features.md ```
-
📋 dPIE: optional central-dispersion (sigma_0) parameterization — autogalaxy · small · supervised · low +
📋 sub_slim_indexes_for_pix_index appends -1 row padding to the last pixel's list — autoarray · small · supervised · low ``` -Use the start-dev skill. draft/feature/autogalaxy/dpie_sigma0_parameterization.md +Use the start-dev skill. draft/bug/autoarray/sub_slim_indexes_for_pix_index_padding.md ```
-
📋 PyAutoLens mirror of the interferometer primary-beam persistence (docstring + round-trip test) — autolens · small · safe · low +
📋 Aggregator reload of an in-memory sparse-operator interferometer fit silently falls back… — autogalaxy · small · supervised · low ``` -Use the start-dev skill. draft/feature/autolens/interferometer_primary_beam_persistence_mirror.md +Use the start-dev skill. draft/bug/autogalaxy/aggregator_reload_drops_sparse_operator.md ```
-
📋 Release board: local run_logs enrichment — pyautohands · small · supervised · low +
📋 Database-path searches cannot reload dataset.fits (written to disk, never registered via save_fits) — autogalaxy · small · supervised · low ``` -Use the start-dev skill. draft/feature/pyautohands/release_board_run_logs_enrichment.md +Use the start-dev skill. draft/bug/autogalaxy/database_paths_dataset_fits_not_registered.md ```
-
📋 Gallery runner: add visualization_upper + decide the modeling_visualization_jit tier — workspaces · small · safe · low +
📋 @autolens_profiling stale auto-simulated dataset/cluster/simple is never regenerated — autolens_profiling · small · supervised · low ``` -Use the start-dev skill. draft/feature/workspaces/gallery_runner_missing_tiers.md +Use the start-dev skill. draft/bug/autolens_profiling/stale_auto_simulated_cluster_dataset.md ```
-
📋 Animated logos for PyAutoGalaxy and PyAutoFit — pyautoscientist · medium · safe · low +
📋 The reconstruction noise map is not the truncated posterior the NNLS solve… — autoarray · medium · human-required · low ``` -Use the start-dev skill. draft/feature/pyautoscientist/animated_logos_for_pyautogalaxy_and_pyautofit.md +Use the start-dev skill. draft/bug/autoarray/reconstruction_noise_map_truncated_posterior.md ```
-
📋 Deferred: make the *Power adapt classes the defaults (breaking) — autoarray · large · human-required · low +
📋 Point-source JSON datasets record no resolution regime — pyautolens · medium · supervised · low ``` -Use the start-dev skill. draft/feature/autoarray/adapt_linear_default_flip.md +Use the start-dev skill. draft/bug/pyautolens/point_source_json_datasets_record_no_regime.md ```
-
📋 Cortex output summaries — phase 2 — cortex +
📋 Same-class q-clamp and bare-sqrt ellipticity gradient sites (follow-up to PyAutoGalaxy#631) — autogalaxy ``` -Use the start-dev skill. draft/feature/cortex/output_summary.md +Use the start-dev skill. draft/bug/autogalaxy/q_clamp_and_bare_sqrt_ellipticity_grad_sweep.md ```
-
📋 Simplify reading-queue token management — pyautomemory +
📋 autolens_workspace point_source/plot.py crashes: residual_map (4,2) vs (5,2) broadcast; the model solves 5… — autolens · human-required ``` -Use the start-dev skill. draft/feature/pyautomemory/reading-queue-token-management.md +Use the start-dev skill. draft/bug/autolens/point_source_plot_script_residual_shape_mismatch.md ```
@@ -2423,7 +2415,7 @@ Use the start-dev skill. draft/maintenance/euclid/skip_fit_output_no_longer_gate
-refactor — 13 +refactor — 12
📋 Cache autonerves config parsing — 308 YAML files parsed per script run — autonerves · medium · safe · medium @@ -2513,14 +2505,6 @@ Use the start-dev skill. draft/refactor/autolens/witt_wynne_solver_library_home.
-
📋 Deduplicate repos_sync.py's check/write pairs — pyautomind · large · supervised · low - -``` -Use the start-dev skill. draft/refactor/pyautomind/repos_sync_check_dedup.md -``` - -
-
📋 Sparse CPU operator: shrink the 172 MB per-dataset payload… — autoarray · supervised ``` @@ -2677,7 +2661,6 @@ Use the start-dev skill. draft/triage/autolens/jit_fit_from_is_vacuous.md |------|-------|------| | 2026-10-14 | filed | @autofit_workspace six searches/ scripts fail on main at… | | 2026-10-14 | filed | Cortex output summaries — phase 2 | -| 2026-10-09 | filed | Profiling conductor compile drift compares one point against one point | | 2026-10-08 | filed | JAX_ENABLE_X64=False is overridden to True, so the fp32 inference… | | 2026-10-07 | filed | Upstream the DR1 final-catalogue tooling to the pipeline, with a… | | 2026-10-02 | filed | sibson-internal-edge-continuity | @@ -2685,12 +2668,12 @@ Use the start-dev skill. draft/triage/autolens/jit_fit_from_is_vacuous.md | 2026-10-02 | filed | Fix Sibson interpolation at internal edges | | 2026-10-02 | filed | Fix KNN neighbor search for a partial final point block | | 2026-10-01 | filed | Sparse interferometer terms: NUFFT ignores the mask origin and… | +| 2026-10-01 | filed | Interferometer log_evidence fails (LinAlgError / NaN) at large… |
… 10 more (10 left) | Date | Event | Task | |------|-------|------| -| 2026-10-01 | filed | Interferometer log_evidence fails (LinAlgError / NaN) at large… | | 2026-10-01 | filed | Interferometer galaxy_image_dict drops a mixed galaxy's ordinary… | | 2026-09-29 | filed | PlotterEllipse.fit_ellipse writes every variant to… | | 2026-09-27 | filed | Sparse interferometer inversion: jax.grad of the log-evidence terms… | @@ -2700,6 +2683,7 @@ Use the start-dev skill. draft/triage/autolens/jit_fit_from_is_vacuous.md | 2026-09-26 | filed | Repo cleanup: retire the Abell 1201 worktree and local raw data | | 2026-09-25 | filed | test_latent_euclid_variables_traces_under_jax_jit went red on main… | | 2026-09-24 | filed | euclid_dr1: run the positions gate over DR1 and submit the remodel set | +| 2026-09-23 | filed | multi_dataset/jax_likelihood/delaunay.py asserts the wrong likelihood… |
@@ -2726,7 +2710,7 @@ _Dates come from each task's registry entry — `lifecycle.py dates` reports any
-92 prompt(s) with no `Witness:` — the machine-checkable claim that would make the work reviewable in minutes. Absent, a prompt grades `judge` (a PI's quarter-hour) whatever its size, which is the intended default and not a bug. Nothing derives or backfills a witness — an invented one is plausible prose with nothing behind it — so this is a human writing one, a prompt at a time. +91 prompt(s) with no `Witness:` — the machine-checkable claim that would make the work reviewable in minutes. Absent, a prompt grades `judge` (a PI's quarter-hour) whatever its size, which is the intended default and not a bug. Nothing derives or backfills a witness — an invented one is plausible prose with nothing behind it — so this is a human writing one, a prompt at a time.
Prompts with no witness @@ -2771,11 +2755,11 @@ _Dates come from each task's registry entry — `lifecycle.py dates` reports any - `draft/bug/autolens/point_source_plot_script_residual_shape_mismatch.md` - `draft/bug/autolens/runtime_single_jit_median_reach_and_a100_witness.md` - `draft/bug/autolens_workspace/cluster_likelihood_scripts_preexisting_mismatches.md` -- _… and 52 more_ +- _… and 51 more_
-61 prompt(s) with unknown theme keyword(s) — not in [`themes.md`](themes.md), so they group loudly rather than silently. Correct the prompt, or add the keyword to the vocabulary. +60 prompt(s) with unknown theme keyword(s) — not in [`themes.md`](themes.md), so they group loudly rather than silently. Correct the prompt, or add the keyword to the vocabulary.
Unknown theme keywords @@ -2822,7 +2806,6 @@ _Dates come from each task's registry entry — `lifecycle.py dates` reports any - `draft/bug/euclid/latent_total_source_flux_jax_vs_numpy_regression.md — unknown theme keyword(s): euclid, jax, latent` - `draft/bug/euclid/sed_chain_waveband_fit_can_spin_forever.md — unknown theme keyword(s): euclid, hpc, catalogue` - `draft/bug/euclid/vis_lp_batch_size_kwarg_silently_ignored.md — unknown theme keyword(s): euclid` -- `draft/bug/pyautobrain/profiling_compile_drift_point_vs_point.md — unknown theme keyword(s): measurement-tools` - `draft/bug/pyautoheart/ral_venv_dependency_floor_drift.md — unknown theme keyword(s): hpc, dependencies, reproducibility` - `draft/refactor/autofit/ep_analysis_level_compile_cache.md — unknown theme keyword(s): jax` - `draft/refactor/autolens/cache_readers_fall_back_to_zip_member.md — unknown theme keyword(s): aggregator, paths` diff --git a/state.json b/state.json index 7f25af753..13a1fd6e7 100644 --- a/state.json +++ b/state.json @@ -4,7 +4,7 @@ "repo": "PyAutoMind", "status": "yellow", "headline": "YELLOW \u2014 24 picks \u00b7 9 in flight", - "updated": "2026-11-05T21:22:47Z", + "updated": "2026-11-05T21:26:42Z", "pages_url": "https://pyautolabs.github.io/PyAutoMind/", "items": [ { From 405f68e57c4f611107f29822d7ef75c337aa8a75 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 5 Nov 2026 21:38:46 +0000 Subject: [PATCH 9/9] lifecycle: regenerate complete/index.md (the conflict resolution kept main's copy) Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_016nhQ8MZyNga1wamBmFdfAK --- complete/index.md | 31 ++++++++++++++++++++++++++++++- dashboard.html | 2 +- state.json | 2 +- 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/complete/index.md b/complete/index.md index 27ca71010..6c0f6c7c8 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. -2141 records across 11 buckets. +2170 records across 11 buckets. ## Highlights @@ -123,6 +123,9 @@ markers; everything below GENERATED is rebuilt. - [alw-optdeps-escapes](2026/11/alw-optdeps-escapes.md) - [arcticpy-lazy-import](2026/11/arcticpy-lazy-import.md) +- [arxiv-edge-refuses-stdlib-urllib](2026/11/arxiv-edge-refuses-stdlib-urllib.md) — superseded by a different fix — closed. Commit 4d8290555 (2026-09-20, "fix: fall back to curl when arXiv rejec… +- [arxiv-refs-api-errors](2026/11/arxiv-refs-api-errors.md) — already shipped — closed as stale draft. PyAutoMemory#143 (merged 2026-11-03, merge 1f22de7; commits 0c3e2dc, … +- [autocti-render-yml-blocked-dup](2026/11/autocti-render-yml-blocked-dup.md) — superseded/shipped — autocti_visualization#8 (2026-10-23), record `complete/2026/10/autocti-viz-render-from-ma… - [autonomous-orchestrators-p1](2026/11/autonomous-orchestrators-p1.md) — phase 1 of 7; epic draft/feature/pyautobrain/autonomous_orchestrators_epic.md - [autonomous-orchestrators-p2](2026/11/autonomous-orchestrators-p2.md) — phase 2 of 7; epic draft/feature/pyautobrain/autonomous_orchestrators_epic.md - [autonomous-orchestrators-p3a](2026/11/autonomous-orchestrators-p3a.md) — phase 3a of 3a–3d; epic draft/feature/pyautobrain/autonomous_orchestrators_epic.md @@ -132,26 +135,39 @@ markers; everything below GENERATED is rebuilt. - [autonomous-orchestrators-p4a](2026/11/autonomous-orchestrators-p4a.md) — phase 4a of 4a–4c; epic draft/feature/pyautobrain/autonomous_orchestrators_epic.md - [autonomous-orchestrators-p4b](2026/11/autonomous-orchestrators-p4b.md) — phase 4b of 4a–4c; epic draft/feature/pyautobrain/autonomous_orchestrators_epic.md - [batch-watch-live-view](2026/11/batch-watch-live-view.md) — pilot 4c follow-up; issue PyAutoBrain#575 +- [board-without-gh-phase2-legs](2026/11/board-without-gh-phase2-legs.md) — already shipped, closed as a stale draft. PyAutoBrain 15317af (merged via #564, 2026-11-03) "phase 2 — the rem… - [brain-hygiene-cleanup-bugs](2026/11/brain-hygiene-cleanup-bugs.md) - [chapter2-continuation](2026/11/chapter2-continuation.md) — All continuation scope merged: Tutorials 5 and 6, optional speed and runnable model_centred prior passing, sum… - [cloud-validation-rehearsal-clock-skew](2026/11/cloud-validation-rehearsal-clock-skew.md) +- [compile-drift-single-sample](2026/11/compile-drift-single-sample.md) — shipped in PyAutoBrain#588 (merge e822697, 2026-11-05), commit ed0782c. Decision: option (a), taken by the age… +- [cortex-projects-dashboard-parent](2026/11/cortex-projects-dashboard-parent.md) — parent closed. Phase 1, the presentation change, shipped in PyAutoBrain#526 (merge 92de427, 2026-10-15; record… - [cti-database-examples-drift](2026/11/cti-database-examples-drift.md) - [cti-fits-fit-output-dir](2026/11/cti-fits-fit-output-dir.md) - [cti-likelihood-pins](2026/11/cti-likelihood-pins.md) — cti-upkeep phase 0b - [cti-release-train-wiring](2026/11/cti-release-train-wiring.md) +- [dr1-rgb-flip-superseded](2026/11/dr1-rgb-flip-superseded.md) — superseded by the human 2026-10-30 (the draft's own banner); `complete/2026/10/sky-orientation-dr1-p1.md` reco… +- [ell-comps-disk-constraint-dup](2026/11/ell-comps-disk-constraint-dup.md) — already shipped before it was filed — PyAutoFit#1538 (96dad519) + PyAutoGalaxy#589 (merge 0fbe863d, 2026-08-28… +- [eyes-group-cluster-gallery](2026/11/eyes-group-cluster-gallery.md) — superseded by human decision — autolens_visualization#5 and #14, record `complete/2026/10/viz-all-dataset-type… +- [eyes-multi-galaxy-gallery](2026/11/eyes-multi-galaxy-gallery.md) — superseded by human decision — autolens_visualization#5 (+ 465fc508 datasets), record `complete/2026/10/viz-al… - [generate-converter-preflight](2026/11/generate-converter-preflight.md) +- [glance-shadow-window-reached](2026/11/glance-shadow-window-reached.md) — already shipped — closed as stale draft. Item 1 (code): commit 679b1319f (2026-10-16) made `shadow_count_line(… - [glance-tier-ruling](2026/11/glance-tier-ruling.md) — prerequisite for phase 4 unattended merges; epic draft/feature/pyautobrain/autonomous_orchestrators_epic.md - [gradient-campaign-impact](2026/11/gradient-campaign-impact.md) — human-requested assessment of whether the two PyAutoArray#671 defects affected the likelihood-lifecycle phase-… +- [gradient-json-point-label](2026/11/gradient-json-point-label.md) — already shipped — autolens_profiling#518 (9d2ee2d3d, merged 2026-11-02 22:38, filed 16:18 the same day) record… - [howto-chapter2-format](2026/11/howto-chapter2-format.md) — Restored descriptive contents for Lens lessons 1–4 and complete ordered contents for Galaxy lessons 1–6, corre… - [howto-prose-format](2026/11/howto-prose-format.md) - [howtogalaxy-ch3-parity](2026/11/howtogalaxy-ch3-parity.md) — Ported the approved HowToLens Chapter 3 teaching improvements to directly observed galaxies: Goldilocks/log-ev… - [howtolens-ch2-explanations](2026/11/howtolens-ch2-explanations.md) — Completed the approved Chapter 2 rewrite, including explicit parameter-space explanations, delayed linear-prof… - [howtolens-ch3-approved](2026/11/howtolens-ch3-approved.md) — Implemented all 66 approved Chapter 3 prose blocks, restored Fit Problems and introductory positivity/mapping-… - [howtolens-chapter2](2026/11/howtolens-chapter2.md) — Applied approved tutorials 1–4, optional Prodigy introduction, notebook generation and navigation. Later Chapt… +- [hpc-cache-off-home-euclid](2026/11/hpc-cache-off-home-euclid.md) — already shipped — euclid_strong_lens_modeling_pipeline 37034f22 (2026-09-25, default branch) "activate.sh: kee… - [hpc-campaign-p5a-assistant](2026/11/hpc-campaign-p5a-assistant.md) — phase 5a; ledger draft/research/autofit/hpc_campaign_epic.md - [hygiene-extras-tomllib](2026/11/hygiene-extras-tomllib.md) - [hygiene-refs-false-positives](2026/11/hygiene-refs-false-positives.md) +- [intake-memory-line-organ-targets](2026/11/intake-memory-line-organ-targets.md) — already shipped — closed as stale draft. The `_with_memory` gate in `agents/conductors/intake/_intake.py` land… +- [jax-joss-benchmark-repo](2026/11/jax-joss-benchmark-repo.md) — already shipped — PyAutoLabs/autolens_jax_joss: 9c66b020 (birth, 10 benchmark scripts), 64204f69 (A100 sweep o… - [latest-per-test-tie](2026/11/latest-per-test-tie.md) — test_autofit/results/test_identity.py::test_latest_per_keeps_the_latest_sibling flaked (main red at 963ff296a, +- [lifecycle-p3-designation-proposals](2026/11/lifecycle-p3-designation-proposals.md) — decided and shipped — the human approved all 39 designations (datacube/delaunay gpu_a100 held provisional); Py… - [likelihood-lifecycle-p3-day-zero-pages](2026/11/likelihood-lifecycle-p3-day-zero-pages.md) - [likelihood-lifecycle-p3-day-zero-stamp](2026/11/likelihood-lifecycle-p3-day-zero-stamp.md) - [likelihood-lifecycle-p3-setup-baseline-close](2026/11/likelihood-lifecycle-p3-setup-baseline-close.md) @@ -167,18 +183,31 @@ markers; everything below GENERATED is rebuilt. - [magnification-maps-image-plane](2026/11/magnification-maps-image-plane.md) - [magnification-maps-source-plane](2026/11/magnification-maps-source-plane.md) - [magnification-maps-uncertainty](2026/11/magnification-maps-uncertainty.md) +- [multistart-gradient-quick-update](2026/11/multistart-gradient-quick-update.md) — already shipped — PyAutoFit#1556 (merged 2026-09-01) wires iterations_per_quick_update into the MultiStart gra… - [multistart-resume-cadence](2026/11/multistart-resume-cadence.md) — 2 → 100 +- [nautilus-ep-use-jax-guard](2026/11/nautilus-ep-use-jax-guard.md) — superseded — PyAutoFit 196abf39a (2026-10-08) "Analysis.is_jax as the single JAX probe": Nautilus reads `analy… +- [nautilus-pin-tracks-autofit](2026/11/nautilus-pin-tracks-autofit.md) — already shipped — PyAutoNerves#169 (merge 8eca4b3, 2026-09-15), record `complete/2026/09/colab-bootstrap-lazy-… +- [nerves-false-workspace-stale](2026/11/nerves-false-workspace-stale.md) — already shipped — PyAutoNerves#203 (issue #202, merged 2026-10-17), record `complete/2026/10/workspace-freshne… - [nightly-token-refresh](2026/11/nightly-token-refresh.md) - [numba-fork-safe-threading](2026/11/numba-fork-safe-threading.md) +- [numba-gate-retune-superseded](2026/11/numba-gate-retune-superseded.md) — superseded — PyAutoArray#632 (17caf228), records `complete/2026/10/interferometer-numba-route-gate.md` and `de… - [numba-num-threads-pin-delaunay-nn](2026/11/numba-num-threads-pin-delaunay-nn.md) - [one-line-auto-simulate-helper](2026/11/one-line-auto-simulate-helper.md) +- [point-magnification-api](2026/11/point-magnification-api.md) — already shipped — PyAutoLens#798 (f791ac77) + autolens_workspace#598 (0f8b4db5), records `complete/2026/10/poi… - [rectangular-gradient-rtu-sparse](2026/11/rectangular-gradient-rtu-sparse.md) — the filed symptom (|g| ~2e9 on the imaging/rectangular/hst fiducial, RTU all backends, Bilinear CPU sparse) sp… - [rectangular-mapper-bilinear-row-weights](2026/11/rectangular-mapper-bilinear-row-weights.md) — - **Retired as already-fixed** by the gradient-correctness sweep (autolens_profiling#517, item 12). The draft … - [registry-reconcile-app-token](2026/11/registry-reconcile-app-token.md) +- [repos-sync-optin-block](2026/11/repos-sync-optin-block.md) — shipped in PyAutoMind#539 (commit dc471e1d6), narrowed scope: option (a) of the 2026-11-05 re-size, chosen by … +- [repos-sync-test-keys-on-dir-name](2026/11/repos-sync-test-keys-on-dir-name.md) — already shipped — closed as stale draft. Commit 679b1319f (2026-10-16, "test: Mind suite green on main — shado… - [results-library-p2-completeness](2026/11/results-library-p2-completeness.md) — phase 2; ledger draft/feature/autofit/results_library_epic.md - [results-library-p3-exports](2026/11/results-library-p3-exports.md) — phase 3; ledger draft/feature/autofit/results_library_epic.md - [results-library-p4-package](2026/11/results-library-p4-package.md) — phase 4; ledger draft/feature/autofit/results_library_epic.md - [results-library-p5b-cortex](2026/11/results-library-p5b-cortex.md) — phase 5b; ledger draft/feature/autofit/results_library_epic.md +- [rtd-organism-currency](2026/11/rtd-organism-currency.md) — already shipped, closed as a stale draft. PyAutoBrain 1aa2ed4 (#563) renamed `docs/organs/build` to `organs/ha… +- [scientist-minimal-starter](2026/11/scientist-minimal-starter.md) — already shipped — Mind#502 / PR #503, record `complete/2026/10/scientist-starter-acceptance.md`; slices PyAuto… +- [search-seed-reproducibility](2026/11/search-seed-reproducibility.md) — already shipped — PyAutoFit#1686 (5bf057f2, 2026-10-14; search-ext A4b), record `complete/2026/10/search-ext-a… +- [sersic-products-read-sed-output-dir](2026/11/sersic-products-read-sed-output-dir.md) — already shipped — euclid_strong_lens_modeling_pipeline 126167b00 (2026-10-05) "catalogue: read Sersic fits fro… +- [session-start-hook-copies-regen](2026/11/session-start-hook-copies-regen.md) — shipped, closed. The 2026-09-29 sweep PRs landed. On HEAD of all 27 swept repos, `.claude/hooks/session-start.… - [shift-digest-readable-picks](2026/11/shift-digest-readable-picks.md) — pilot 4c follow-up; issue PyAutoBrain#579 - [simulate-if-needed-workspace-sweep](2026/11/simulate-if-needed-workspace-sweep.md) - [tutorial-link-sweep](2026/11/tutorial-link-sweep.md) diff --git a/dashboard.html b/dashboard.html index 317cc31e4..fb5e968a3 100644 --- a/dashboard.html +++ b/dashboard.html @@ -327,7 +327,7 @@ Keep track of decisions and outstanding questions throughout this conversation. After changes, report what was recorded, where it lives and what remains to do. Work on GitHub: -- Open Mind repository: https://github.com/PyAutoLabs/PyAutoMind
Last updated 2026-11-05 21:32:45 UTC
↻ Update

+- Open Mind repository: https://github.com/PyAutoLabs/PyAutoMind
Last updated 2026-11-05 21:37:47 UTC
↻ Update

Batch 2026-11-05-pm — 0 in progress · 0 awaiting review

Nothing to review yet.

diff --git a/state.json b/state.json index 085a06136..be18681f5 100644 --- a/state.json +++ b/state.json @@ -4,7 +4,7 @@ "repo": "PyAutoMind", "status": "yellow", "headline": "YELLOW \u2014 24 picks \u00b7 8 in flight", - "updated": "2026-11-05T21:32:46Z", + "updated": "2026-11-05T21:37:48Z", "pages_url": "https://pyautolabs.github.io/PyAutoMind/", "items": [ {