From 94cc2c2a7a008ee1d8cbf26c3f093a97695a9b67 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 23 Aug 2026 15:24:33 +0000 Subject: [PATCH 1/4] intake: two prompts from the workspace smoke-gate slowdown investigation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Investigation found the PyAuto smoke gates roughly tripled between mid-July and late August 2026, and that the cause is the smoke *lists*, not the libraries β€” library import time went the other way (autolens 4.07s -> ~1.25s on 2026-08-19). Measured, py3.12 leg (the critical path), from the CI job logs: autolens_workspace_test run 32605025472 23 entries 553.0s autolens_workspace run 32608556415 37 entries 351.0s Both reconcile to their step wall-clock, so the scripts are the whole cost. The two repos are slow for opposite reasons and get one prompt each: - draft/test/workspaces/slowest_smoke_gate_scripts.md β€” _test is three scripts (subhalo_recovery 120.7s, database/scrape 63.4s, point_source/jax_likelihood/point 47.7s = 42%); speed up or demote. - draft/test/pyautoheart/smoke_relevance_gate.md β€” the workspace has no slow scripts at all (max 23.2s, median 9.4s), so the only lever is running the gate less often. Extend Heart's docs-only gate in smoke-tests.yml into a relevance gate. Constraints recorded in both prompts rather than left to be rediscovered: the vacuous-assertion hazard (three prior instances in this repo), and that Heart's readiness reads Smoke Tests on main HEAD with `cancelled` counting as failure β€” so PR-side narrowing is free but the main-push run is not. Dashboard regenerated (152 prompts). Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_015Mw2KC1M1HKrvTqe5zcEZn --- dashboard.html | 8 +- dashboard.md | 22 +++- .../test/pyautoheart/smoke_relevance_gate.md | 103 ++++++++++++++++++ .../workspaces/slowest_smoke_gate_scripts.md | 93 ++++++++++++++++ 4 files changed, 220 insertions(+), 6 deletions(-) create mode 100644 draft/test/pyautoheart/smoke_relevance_gate.md create mode 100644 draft/test/workspaces/slowest_smoke_gate_scripts.md diff --git a/dashboard.html b/dashboard.html index fa5f2627..a09544c7 100644 --- a/dashboard.html +++ b/dashboard.html @@ -38,7 +38,7 @@

πŸ“‹ PyAutoMind Dashboard

Every task the Mind is holding. Tap a task's πŸ“‹ and its /start_dev command is on your clipboard β€” paste it into a Claude Code chat to route Claude straight to that task.

-

In flight 1 Β· Parked 3 Β· Planned 6 Β· Backlog 150 Β· markdown version

+

In flight 1 Β· Parked 3 Β· Planned 6 Β· Backlog 152 Β· markdown version

Start here

Highest priority (filed as high) β€” showing 12 of 17

TRIAGE: needs manual review before routing β€” medium Β· safe Β· high

@@ -77,7 +77,7 @@

Planned

latent-nan-guard-honest-run

Backlog markdown version

-

150 filed prompts, not started β€” sorted most-pickable first (priority, then size). 23 of them belong to an epic and are listed only under Epics below.

+

152 filed prompts, not started β€” sorted most-pickable first (priority, then size). 23 of them belong to an epic and are listed only under Epics below.

bug β€” 34

Fix release JAX runtime compatibility and likelihood parity β€” health_fixes Β· too-large Β· supervised Β· high

@@ -216,9 +216,11 @@

Backlog

Deduplicate repos_sync.py's check/write pairs β€” pyautomind Β· medium Β· safe Β· low

-test β€” 3 +test β€” 5

Re-baseline the MGE imaging JIT profiling regression value β€” autolens_workspace_developer Β· too-large Β· supervised Β· high

Restore absolute NumPy likelihood regression baselines in the _workspace_test β€” workspaces Β· too-large Β· supervised Β· high

+

Relevance-gate the reusable smoke workflow so a PR only runs β€” pyautoheart Β· medium Β· supervised Β· normal

+

Speed up the three slowest autolens_workspace_test smoke-gate scripts β€” workspaces Β· medium Β· supervised Β· normal

The new workspace smoke-test GitHub Actions (added via feature/smoke-test-ci) surfaced β€” workspaces Β· too-large Β· supervised Β· normal

diff --git a/dashboard.md b/dashboard.md index 5b605caf..0e491e2f 100644 --- a/dashboard.md +++ b/dashboard.md @@ -11,7 +11,7 @@ Every task the Mind is holding, on one page: what is in flight, what is parked, | [In flight](#in-flight) (`active/`) | 1 | | [Parked](#parked) (`parked.md`) | 3 | | [Planned](#planned) (`planned.md`) | 6 | -| [Backlog](#backlog) (`draft/`) | 150 | +| [Backlog](#backlog) (`draft/`) | 152 | ## Start here @@ -235,7 +235,7 @@ Scoped but not started; some are not yet prompt files. Full detail in [`planned. ## Backlog -**150** filed prompts, not started. Each section is sorted most-pickable first (priority, then size). **23** of them belong to an epic and are listed only under [Epics](#epics) below. +**152** filed prompts, not started. Each section is sorted most-pickable first (priority, then size). **23** of them belong to an epic and are listed only under [Epics](#epics) below.
bug β€” 34 @@ -1220,7 +1220,7 @@ Scoped but not started; some are not yet prompt files. Full detail in [`planned.
-test β€” 3 +test β€” 5
πŸ“‹ Re-baseline the MGE imaging JIT profiling regression value β€” autolens_workspace_developer Β· too-large Β· supervised Β· high @@ -1238,6 +1238,22 @@ Scoped but not started; some are not yet prompt files. Full detail in [`planned.
+
πŸ“‹ Relevance-gate the reusable smoke workflow so a PR only runs β€” pyautoheart Β· medium Β· supervised Β· normal + +``` +/start_dev draft/test/pyautoheart/smoke_relevance_gate.md +``` + +
+ +
πŸ“‹ Speed up the three slowest autolens_workspace_test smoke-gate scripts β€” workspaces Β· medium Β· supervised Β· normal + +``` +/start_dev draft/test/workspaces/slowest_smoke_gate_scripts.md +``` + +
+
πŸ“‹ The new workspace smoke-test GitHub Actions (added via feature/smoke-test-ci) surfaced β€” workspaces Β· too-large Β· supervised Β· normal ``` diff --git a/draft/test/pyautoheart/smoke_relevance_gate.md b/draft/test/pyautoheart/smoke_relevance_gate.md new file mode 100644 index 00000000..da4bd069 --- /dev/null +++ b/draft/test/pyautoheart/smoke_relevance_gate.md @@ -0,0 +1,103 @@ +# Relevance-gate the reusable smoke workflow so a PR only runs what its diff can affect + +Type: test +Target: PyAutoHeart +Repos: +- PyAutoHeart +- autolens_workspace_test +- autolens_workspace +Difficulty: medium +Autonomy: supervised +Priority: normal +Status: formalised + +`PyAutoHeart/.github/workflows/smoke-tests.yml` β€” the reusable workflow every +workspace's `smoke_tests.yml` is a thin caller of β€” has exactly one skip +condition: a docs-only gate that skips the matrix when every changed file +matches `*.md`, `docs/`, `LICENSE` or `runtime.txt`. Anything else runs the +full curated smoke list, whatever it touched. + +This prompt cuts how *often* the gate runs. Making the slow entries cheaper is +the sibling prompt `draft/test/workspaces/slowest_smoke_gate_scripts.md`; they +compound but are separate changes in separate repos. + +## Why + +- `autolens_workspace_test` smoke costs ~11m20s and fires on every PR event + plus every push to `main`. Run numbers put it at roughly 17 runs/week + (#555 on 2026-07-28 β†’ #616 on 2026-08-22; approximate, since superseded PR + runs are cancelled). +- `autolens_workspace` costs ~8m40s over 37 entries, 5.8 runs/day in the week + to 2026-08-23. +- The failure mode is already recorded in the repo. `smoke_tests.txt`, on the + 2026-08-22 disable of `multi_dataset/jax_likelihood/mge.py`: *"Hit 4/4 jobs + (3.12 and 3.13, twice each) on autolens_workspace_test#261, whose diff + touches no script this gate runs."* +- The two extremes already exist and are 80x apart: a docs-only PR finishes in + **8 seconds** (autolens_workspace_test run #605, autogalaxy_workspace #545); + a one-character change to any non-markdown file costs the full run. + +## Task + +Two tiers, shippable independently. Tier 1 alone is most of the win. + +1. **Skip when no script can be affected.** Extend the existing `changes` job's + classification: if the diff touches nothing under `scripts/`, `config/`, + `smoke_tests.txt`, `smoke_notebooks.txt` or `.github/`, skip the matrix the + same way the docs-only path does. Same fail-closed shape, same + `docs_only`-style output, one more reason to skip. +2. **Narrow the entry list to the packages the diff touches, plus a fixed + core.** The smoke entries cluster cleanly by top-level package, so a + directory-level mapping is enough β€” no dependency analysis needed: + + | package | autolens_workspace_test | autolens_workspace | + |---|---:|---:| + | `imaging/` | 232.8s (42%) | 63.6s (18%) | + | `misc/` | 154.6s (28%) | β€” | + | `interferometer/` | 92.1s (17%) | 54.6s (16%) | + | `point_source/` | 47.7s (9%) | 15.7s (4%) | + | `multi_galaxy/` | 25.8s (5%) | 166.4s (47%) | + | `group/` | β€” | 22.9s (7%) | + | `guides/` | β€” | 14.3s (4%) | + | `multi_dataset/` | β€” | 13.5s (4%) | + + A PR touching only `scripts/misc/` would run 155s instead of 553s; one + touching only `multi_galaxy/` in `_test` would run 26s. Tier 2 needs the + selected set passed down to `run_smoke.py` as an input, so it also touches + each workspace's vendored runner β€” scope it deliberately or defer it. + +## Hard constraints + +- **Do not implement this with `on.pull_request.paths`.** A job skipped by a + path filter never reports a conclusion, so a required status check sits + pending forever and blocks the merge. The in-workflow `changes` job emits a + real `skipped`, which satisfies required-check semantics β€” the workflow's own + comment already says so. Keep the skip inside the workflow. +- **Fail closed**, matching the docs-only gate exactly: no base SHA, unfetchable + base, empty diff, or a single unclassifiable path β‡’ run everything. Only an + explicit every-file-matches verdict may skip. Keep the two-dot diff against + the base *tip* so upstream drift shows up as extra files. +- **Do not touch the push-to-`main` run.** `PyAutoHeart/config/repos.yaml` lists + `workspaces_test: ["Smoke Tests"]` and `workspaces: ["Smoke Tests", + "Navigator Check"]` under `required_workflows`; `ci_status` reads their + conclusion on the `main` HEAD commit and `readiness` gates RED on failure. + `cancelled` is in Heart's `FAILURE_CONCLUSIONS`, which is why the callers' + concurrency block only cancels non-`main` refs. Narrowing PR-side runs is + free β€” Heart never reads them β€” but a skipped or cancelled `main` run breaks + the readiness gate. If tier 1 would skip on a `main` push, gate it to + `pull_request` events only. +- The change is Heart-owned and lands once for every caller (both `_workspace` + and `_workspace_test` families, plus the HowTo repos). Verify against at + least one caller of each shape before merging. + +## Acceptance + +- A PR touching only `scripts/misc/` in `autolens_workspace_test` runs + materially less than the full 553s (tier 2), or a PR touching only + `README.md` + a config sidecar still skips (tier 1). +- A PR with an unresolvable base still runs the full matrix. +- The `Smoke Tests` check reports `skipped`, not pending, on every skip path. +- `main`-push runs are unchanged and Heart's `ci_status` still reads a real + conclusion. + + diff --git a/draft/test/workspaces/slowest_smoke_gate_scripts.md b/draft/test/workspaces/slowest_smoke_gate_scripts.md new file mode 100644 index 00000000..6bf885d6 --- /dev/null +++ b/draft/test/workspaces/slowest_smoke_gate_scripts.md @@ -0,0 +1,93 @@ +# Speed up the three slowest autolens_workspace_test smoke-gate scripts + +Type: test +Target: workspaces +Repos: +- autolens_workspace_test +Difficulty: medium +Autonomy: supervised +Priority: normal +Status: formalised + +The per-PR smoke gate in `autolens_workspace_test` costs ~11m20s wall-clock, of +which ~9m13s is script execution. Three entries are 42% of that. This prompt is +the *make them cheaper* half; cutting how often the gate runs at all is the +sibling prompt `draft/test/pyautoheart/smoke_relevance_gate.md`. Do not merge +the two β€” one edits scripts, the other edits a workflow, and they land in +different repos. + +## Measured + +CI run 32605025472 (2026-08-22, `main`), py3.12 leg (the critical path; py3.13 +is ~6% faster). 23 entries, 23/23 pass, **553.0s** total β€” which reconciles to +the step wall-clock exactly, so the runner adds no measurable overhead and the +scripts *are* the cost. + +| py3.12 | share | script | +|-------:|------:|--------| +| 120.7s | 21.8% | `imaging/subhalo_recovery.py` | +| 63.4s | 11.5% | `misc/database/scrape/general.py` | +| 47.7s | 8.6% | `point_source/jax_likelihood/point.py` | +| 33.9s | 6.1% | `imaging/jax_likelihood/rectangular.py` | +| 31.5s | 5.7% | `misc/jax_assertions/delaunay_nn.py` | +| 30.2s | 5.5% | `imaging/jax_likelihood/mge.py` | + +The remaining 17 entries are 4.5–29.2s each and are not in scope. Reproduce +with `gh api` on the job log and grep the runner's `[PASS] β€” s` +lines; the runner prints one per entry. + +Note the tail is short: after these three the curve flattens, so this prompt +can win ~4 minutes and no more. Do not chase entries below ~30s. + +## Task + +Per script, either make it materially faster or demote it β€” both are +acceptable outcomes, and the choice is per script, not global. + +1. **`imaging/subhalo_recovery.py` (120.7s).** Already the subject of one + speed-up pass: `complete/2026/08/potential-correction-validation.md` leg 1 + recorded it at 232s/224s against the 300s cap, and it now runs at 120.7s, so + half the work is done and the *why* is documented there β€” read it before + re-deriving. It asserts end-to-end `dkappa` recovery of a simulated 1e10 + Msun subhalo for both the one-shot and iterative engines. Ask whether the + PR gate needs both engines or whether one belongs on the weekly channel. +2. **`misc/database/scrape/general.py` (63.4s).** Un-parked on 2026-07-21 + (`chore(no_run): un-park database/scrape/general`, autolens_workspace_test#192). + A database-scrape regression is the least likely of the three to be broken + by a typical lens-modelling PR, so it is the strongest demotion candidate β€” + check what it uniquely covers before deciding. +3. **`point_source/jax_likelihood/point.py` (47.7s).** Check whether the cost + is `PointSolver` iterations or JAX compile time; if compile-dominated, the + lever is problem size, not sample count. + +## Constraints + +- **A faster script that no longer tests anything is a regression, not a win.** + This repo has three recorded instances of exactly that failure mode: the + vacuous JAX assertions (`complete/2026/07/vacuous-jax-assertions.md`), the + NUFFT parity legs that compared nufftax against itself and reported + `max |Ξ”| = 0.0000e+00`, and `latent/latent_nan_robustness` passing vacuously + under the smoke profile (see `planned.md`). For every reduction, state what + the assertion still discriminates against and show it failing when the thing + it guards is broken. +- Coverage given up is not coverage lost. Heart's weekly `workspace-smoke.yml` + (Mondays 03:00 UTC) already runs *every* script in this repo against library + `main` under the same `profile_smoke.yaml`, and `release-integrate` re-runs + the matrix at `PYAUTO_TEST_MODE=0`, full resolution. The curated PR list is a + strict subset of both. Demotion = removing the entry from `smoke_tests.txt` + with a comment saying which channel still covers it. +- Do not raise `BUILD_SCRIPT_TIMEOUT` for these. The 300s smoke cap is a + runaway detector; three entries sitting under it is the problem, not the cap. +- Keep the entries that stay inside the cap with real margin β€” 120.7s against + 300s already flaked into timeout historically under sweep-load contention + (`planned.md` records 252s uncontended vs a 300s timeout under load). + +## Acceptance + +- Smoke step wall-clock for the py3.12 leg drops below ~6 minutes. +- 23/23 still pass, and every touched script has a stated, demonstrated + discriminating assertion. +- Any demoted entry is commented in `smoke_tests.txt` naming the channel that + still runs it. + + From 224d6207830dccdc61cd1cd20cd13405c31971f3 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 23 Aug 2026 15:29:07 +0000 Subject: [PATCH 2/4] intake: fold the cross-workspace sweep into the relevance-gate prompt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Swept every repo that calls Heart's reusable smoke workflow. One finding changes the prompt: autogalaxy_workspace_test is a second ~11-minute gate (557.1s / 37 entries, run 32533004337) that nobody had measured. It matters because it is the mirror image of autolens_workspace_test β€” slowest entry 40.0s, median 13.5s, top-3 only 21% β€” so the speed-up prompt has nothing to bite on there and this gate is its only lever. 25 of its 37 entries are a {imaging, interferometer, multi_dataset} x jax_{likelihood,grad} x {lp, mge, mge_group, rectangular, rectangular_mge, delaunay, delaunay_mge} cross-product, which tier 2's package narrowing maps onto directly. Recorded a negative result too: its six jax_grad/ entries were the obvious suspect (Heart budgets that class at 1800s for running full-resolution) and measured 86.4s total, 15.5%. The expensive jax_grad scripts are autolens's and are in no smoke list. Package table extended to three repos; Repos: gains autogalaxy_workspace_test. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_015Mw2KC1M1HKrvTqe5zcEZn --- .../test/pyautoheart/smoke_relevance_gate.md | 47 +++++++++++++++---- 1 file changed, 37 insertions(+), 10 deletions(-) diff --git a/draft/test/pyautoheart/smoke_relevance_gate.md b/draft/test/pyautoheart/smoke_relevance_gate.md index da4bd069..781443c1 100644 --- a/draft/test/pyautoheart/smoke_relevance_gate.md +++ b/draft/test/pyautoheart/smoke_relevance_gate.md @@ -5,6 +5,7 @@ Target: PyAutoHeart Repos: - PyAutoHeart - autolens_workspace_test +- autogalaxy_workspace_test - autolens_workspace Difficulty: medium Autonomy: supervised @@ -50,22 +51,48 @@ Two tiers, shippable independently. Tier 1 alone is most of the win. core.** The smoke entries cluster cleanly by top-level package, so a directory-level mapping is enough β€” no dependency analysis needed: - | package | autolens_workspace_test | autolens_workspace | - |---|---:|---:| - | `imaging/` | 232.8s (42%) | 63.6s (18%) | - | `misc/` | 154.6s (28%) | β€” | - | `interferometer/` | 92.1s (17%) | 54.6s (16%) | - | `point_source/` | 47.7s (9%) | 15.7s (4%) | - | `multi_galaxy/` | 25.8s (5%) | 166.4s (47%) | - | `group/` | β€” | 22.9s (7%) | - | `guides/` | β€” | 14.3s (4%) | - | `multi_dataset/` | β€” | 13.5s (4%) | + | package | autolens_ws_test | autogalaxy_ws_test | autolens_workspace | + |---|---:|---:|---:| + | `imaging/` | 232.8s (42%) | 175.8s (32%) | 63.6s (18%) | + | `multi_dataset/` | β€” | 177.1s (32%) | 13.5s (4%) | + | `misc/` | 154.6s (28%) | 37.6s (7%) | β€” | + | `interferometer/` | 92.1s (17%) | 150.6s (27%) | 54.6s (16%) | + | `point_source/` | 47.7s (9%) | β€” | 15.7s (4%) | + | `multi_galaxy/` | 25.8s (5%) | 11.8s (2%) | 166.4s (47%) | + | `group/` | β€” | β€” | 22.9s (7%) | + | `guides/` | β€” | β€” | 14.3s (4%) | + | `cluster/` | β€” | 4.2s (1%) | β€” | A PR touching only `scripts/misc/` would run 155s instead of 553s; one touching only `multi_galaxy/` in `_test` would run 26s. Tier 2 needs the selected set passed down to `run_smoke.py` as an input, so it also touches each workspace's vendored runner β€” scope it deliberately or defer it. +## autogalaxy_workspace_test is the same size and has no other lever + +Measured after this prompt was first filed (run 32533004337, 2026-08-21, py3.12, +**557.1s across 37 entries** β€” within 4s of autolens_workspace_test's 553.0s, +and again reconciling exactly to the step wall-clock). + +Unlike its autolens sibling it has **no hot spot at all**: slowest entry 40.0s, +median 13.5s, and the top three are only 21% of the run. There is nothing to +speed up, so the sibling prompt does not apply and this gate is the *only* +lever for that repo. + +What it does have is a combinatorial matrix: 25 of its 37 entries are +`{imaging, interferometer, multi_dataset}/jax_{likelihood,grad}/{lp, mge, +mge_group, rectangular, rectangular_mge, delaunay, delaunay_mge}`, i.e. the +same handful of meshes crossed with three dataset types. Tier 2's +package-level narrowing maps onto that cleanly. A representative-subset +policy for the PR gate (full cross-product weekly) is worth considering +alongside it, but is a separate decision and belongs to that repo, not here. + +Checked and NOT a factor: its six `jax_grad/` entries were the obvious +suspect, since Heart budgets that class at 1800s for running at full +resolution. Measured they are 86.4s total (15.5%), 10.8–21.8s each. The +expensive jax_grad scripts are the autolens ones, and those are not in any +smoke list. + ## Hard constraints - **Do not implement this with `on.pull_request.paths`.** A job skipped by a From 06500a9bc32efb5d2d6c819ef6588ff0d3bffda6 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 23 Aug 2026 15:38:27 +0000 Subject: [PATCH 3/4] intake: record why the smoke cap does not apply to the slow _test entries MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Checked whether the env profile is actually being applied, since "smoke" that takes 11 minutes suggests a misconfiguration. It is not one. autolens_workspace is correct: every entry that reports a mask ran at 80-208 pixels, and its profile additionally sets SKIP_FIT_OUTPUT / SKIP_VISUALIZATION / SKIP_CHECKS. Its two `ENV: full_datasets` smoke entries are guides/galaxies and guides/modeling/cookbook, the two CHEAPEST in the suite at 3.6s and 3.1s. autolens_workspace_test has had PYAUTO_SMALL_DATASETS in its defaults since the profile was created on 2026-04-08. What grew is the exemptions: 10 profile overrides (2026-04-30) -> 23 (05-28) -> 27 (07-23), then migrated in-file by PyAutoHands#187. Today 16 of 23 live entries declare `ENV: [jax] full_datasets` and a 17th is exempted by the surviving override β€” 516.5s of 553.0s, 93% of the gate, uncapped. Measured masks: subhalo_recovery 5858px, database/scrape 2828px, jax_likelihood 716-952px, vs the workspace's 80-208px. The exemptions are load-bearing, not drift: the jax_likelihood scripts assert hardcoded full-resolution likelihood literals at rtol 1e-4, so capping the dataset fails the assertion (recorded in sph-transform-name-check.md and mge-sigma-min-workspace-sweep.md). So the prompt's real question is not "why is the cap off" but "should the per-PR gate run full-resolution parity assertions at all", with the re-pinning cost named (autolens_workspace_test#257 had to regenerate those literals once already, blocking a nightly release). Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_015Mw2KC1M1HKrvTqe5zcEZn --- .../workspaces/slowest_smoke_gate_scripts.md | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/draft/test/workspaces/slowest_smoke_gate_scripts.md b/draft/test/workspaces/slowest_smoke_gate_scripts.md index 6bf885d6..7bf6e55a 100644 --- a/draft/test/workspaces/slowest_smoke_gate_scripts.md +++ b/draft/test/workspaces/slowest_smoke_gate_scripts.md @@ -60,6 +60,57 @@ acceptable outcomes, and the choice is per script, not global. is `PointSolver` iterations or JAX compile time; if compile-dominated, the lever is problem size, not sample count. +## The cap does not apply to these scripts, and cannot be made to + +Read this before proposing "just turn PYAUTO_SMALL_DATASETS on". + +`config/build/profile_smoke.yaml` has set `PYAUTO_SMALL_DATASETS: "1"` in its +defaults since the file was created (2026-04-08, then spelled +`PYAUTO_WORKSPACE_SMALL_DATASETS`; renamed 2026-04-30). It has never been +missing. What has grown is the set of entries exempted from it: + +| date | entries exempted from the cap | +|---|---| +| 2026-04-30 | 10 profile overrides | +| 2026-05-28 | 23 | +| 2026-07-23 | 27 β€” then migrated into in-file `ENV:` declarations (PyAutoHands#187), leaving 1 override | +| today | 90 `ENV: … full_datasets` declarations repo-wide | + +Of the 23 live smoke entries, **16 declare `ENV: [jax] full_datasets`** and a +17th (`misc/database/scrape/general.py`) is exempted by the one surviving +profile override. That is **516.5s of the 553.0s β€” 93% of the gate β€” running +uncapped.** Only six entries actually run capped (3 aggregator + 2 latent at +9-pixel masks, `multi_galaxy/model_fit.py` at 80), totalling 36.5s. + +Measured mask sizes from the same CI run, against autolens_workspace's +80–208 pixels: + +| entry | mask | +|---|---:| +| `imaging/subhalo_recovery.py` | 5858 px | +| `misc/database/scrape/general.py` | 2828 px | +| `multi_galaxy/jax_likelihood/lp.py` | 2828 px | +| `imaging/jax_likelihood/potential_correction.py` | 1466 px | +| `imaging/jax_likelihood/{rectangular,mge}.py` | 952 px | +| `imaging/jax_likelihood/{lp,smbh}.py` | 716 px | + +The exemptions are deliberate and load-bearing: the `jax_likelihood` scripts +assert hardcoded full-resolution likelihood literals at rtol 1e-4, so a capped +dataset changes the likelihood and the assertion fails. That failure has been +hit and recorded β€” see `complete/2026/08/sph-transform-name-check.md` +("ran with capped datasets against full-resolution reference assertions and +failed") and `complete/2026/08/mge-sigma-min-workspace-sweep.md`. + +So the real question this prompt has to answer is not "why is the cap off" +but **"should the per-PR gate be running full-resolution parity assertions at +all?"** For each of the three scripts, the options are: re-derive the literals +at a capped size (buys the cap but re-pins every literal, and those pins have +already had to be regenerated once β€” autolens_workspace_test#257, "repin vmap +literals halved by the PositionsLH penalty fix", which blocked the nightly +release at Stage 3 on 08-18/08-19), shrink the problem some other way, or +demote to the weekly channel that is meant for full-fidelity work. Choose per +script and say which. + ## Constraints - **A faster script that no longer tests anything is a regression, not a win.** From 78dc0b6b3e2c9cd024f32dd36ef94fb392546e2a Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 23 Aug 2026 15:47:26 +0000 Subject: [PATCH 4/4] mind: regenerate the dashboard with the current generator MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The merge commit regenerated dashboard.md/.html from a PyAutoBrain checkout that was 5 commits behind origin/main, three of which changed the dashboard generator (#249/#250/#251 β€” the Recent-feed work that PyAutoMind #270/#271/#272 landed). That reverted the paged Recent feed: dashboard.html lost 119 lines. PyAutoBrain updated to ad927eb and both files regenerated. The diff against main is now +24/-6 β€” the two new prompts entering the backlog, and nothing else. `intake dashboard --check` reports current. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_015Mw2KC1M1HKrvTqe5zcEZn --- dashboard.html | 111 ++++++++++++++++++++++++++++++++++++++++++++----- dashboard.md | 41 +++++++++++++----- 2 files changed, 130 insertions(+), 22 deletions(-) diff --git a/dashboard.html b/dashboard.html index a09544c7..c2f3edd7 100644 --- a/dashboard.html +++ b/dashboard.html @@ -33,11 +33,24 @@ button.copy.ok{color:var(--ok);border-color:var(--ok)} details{margin:.5rem 0} summary{cursor:pointer;font-weight:600;padding:.4rem 0} +table.recent{width:100%;border-collapse:collapse;font-size:.95em} +table.recent td{border-bottom:1px solid var(--line);padding:.45rem .4rem .45rem 0; + vertical-align:top;overflow-wrap:anywhere} +table.recent td.when{white-space:nowrap;color:var(--muted);font-variant-numeric: + tabular-nums} +table.recent td.what{white-space:nowrap;color:var(--muted);font-size:.85em; + padding-top:.58rem} +table.recent td.pick{width:2.6rem;padding-right:0} +table.recent button.copy{width:2.2rem;height:2.2rem;font-size:.95rem} +button.more{display:block;width:100%;margin:.6rem 0;padding:.5rem; + border:1px solid var(--line);border-radius:8px;background:var(--btn); + color:var(--muted);cursor:pointer;font:inherit;font-size:.9em} +button.more:hover{color:var(--fg)}

πŸ“‹ PyAutoMind Dashboard

-

Every task the Mind is holding. Tap a task's πŸ“‹ and its /start_dev command is on your clipboard β€” paste it into a Claude Code chat to route Claude straight to that task.

+

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

In flight 1 Β· Parked 3 Β· Planned 6 Β· Backlog 152 Β· markdown version

Start here

Highest priority (filed as high) β€” showing 12 of 17

@@ -58,23 +71,23 @@

Quick wins (small enough, and safe enough to run unatte

Bug: fix the tracer.fits existence guard in autolens_workspace imaging modeling.py β€” workspaces Β· small Β· safe Β· normal

In flight markdown version

Issued β€” each has an open GitHub issue and usually a branch.

-

@PyAutoFit TransformedMessage.factor_gradient crashes on first call β€” issue #1501 β€” HOLD β€” do not start dev. Fix-or-delete hangs off the PyAutoFit#1498 logpdf-contract

+

@PyAutoFit TransformedMessage.factor_gradient crashes on first call β€” issue #1501 β€” issued 2026-08-19 β€” HOLD β€” do not start dev. Fix-or-delete hangs off the PyAutoFit#1498 logpdf-contract

Parked markdown version

3 task(s) -

single-source-density-design β€” issue #1500

-

prior-message-collapse-design β€” issue #1500

-

pyautoreduce-slacs1430-acs-comparison

+

single-source-density-design β€” issue #1500 β€” parked 2026-08-18

+

prior-message-collapse-design β€” issue #1500 β€” parked 2026-08-18

+

pyautoreduce-slacs1430-acs-comparison β€” parked 2026-08-08

Planned markdown version

6 task(s) -

isothermal-ell-sph-oversampling-at-the-cusp β€” planned β€” NOT yet a prompt file; file one via /intake before starting

-

remote-mcp-deployment-tiers β€” issue #20 β€” DESIGN-COMPLETE, build BLOCKED-ON-DEMAND β€” issue #20 holds the full auth/transport/hosting design + Richard/PyAutoMCP…

-

samples-parameter-paths β€” issue #1327 β€” parked

-

jax-point-source-point-smoke-sentinel β€” planned

-

piemass-potential β€” planned

-

latent-nan-guard-honest-run

+

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

+

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

+

samples-parameter-paths β€” issue #1327 β€” filed 2026-07-08 β€” parked

+

jax-point-source-point-smoke-sentinel β€” filed 2026-05-21 β€” planned

+

piemass-potential β€” filed 2026-06-05 β€” planned

+

latent-nan-guard-honest-run β€” planned 2026-07-22

Backlog markdown version

152 filed prompts, not started β€” sorted most-pickable first (priority, then size). 23 of them belong to an epic and are listed only under Epics below.

@@ -234,6 +247,70 @@

Backlog

CTI release-train wiring β€” first modern autocti release β€” autocti Β· medium Β· human-required Β· normal

+

Recent markdown version

+

The 10 newest things to happen to the work in hand, newest first β€” issued, parked, filed. Every other section on this page is laid out by state, which is exactly why none of them can answer β€œwhat has been happening?”. Shipped work is not here: it is read from complete/index.md, and a thousand records deep it would crowd out everything anyone can still act on.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
2026-08-19issued@PyAutoFit TransformedMessage.factor_gradient crashes on first…
2026-08-18parkedsingle-source-density-design
2026-08-18parkedprior-message-collapse-design
2026-08-09foundisothermal-ell-sph-oversampling-at-the-cusp
2026-08-08parkedpyautoreduce-slacs1430-acs-comparison
2026-07-22plannedlatent-nan-guard-honest-run
2026-07-21filedremote-mcp-deployment-tiers
2026-07-08filedsamples-parameter-paths
2026-06-05filedpiemass-potential
2026-05-21filedjax-point-source-point-smoke-sentinel

Epics markdown version

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.

JAX profiling β€” inference programme β€” ledger: autolens_profiling/results/notes/inference/PROGRAMME.md

@@ -278,6 +355,18 @@

Epics { const b=e.target.closest("button.copy");if(b)copyCmd(b);}); +// Recent shows one page and reveals the next on each tap of the … button, +// which retires itself once the feed is exhausted. Every row is already in the +// DOM, so this never re-renders or re-sorts anything. +document.addEventListener("click",e=>{ + const b=e.target.closest("button.more");if(!b)return; + const t=document.querySelector("table.recent");if(!t)return; + const hidden=[...t.querySelectorAll("tr[hidden]")]; + const page=Number(b.dataset.page)||10; + hidden.slice(0,page).forEach(r=>r.removeAttribute("hidden")); + const left=hidden.length-Math.min(page,hidden.length); + if(left<=0){b.remove();return;} + b.textContent="… "+Math.min(page,left)+" more ("+left+" left)";}); diff --git a/dashboard.md b/dashboard.md index 0e491e2f..4fc03c1e 100644 --- a/dashboard.md +++ b/dashboard.md @@ -4,7 +4,7 @@ This is the markdown version of the [PyAutoMind Dashboard](https://pyautolabs.github.io/PyAutoMind/), which puts a task's command on your clipboard with a single tap of πŸ“‹. -Every task the Mind is holding, on one page: what is in flight, what is parked, and the whole backlog to pick from. Pick a task and run its `/start_dev` command in a Claude Code chat to start it. +Every task the Mind is holding, on one page: what is in flight, what is parked, and the whole backlog to pick from. Pick a task and run its `/start_dev` command in a Claude Code chat to start it. [Recent](#recent) is the same work by date β€” what has been happening rather than what to do next. | Where | Count | |-------|------:| @@ -135,7 +135,7 @@ Every task the Mind is holding, on one page: what is in flight, what is parked, Issued β€” each has an open GitHub issue and usually a branch. The full record for each is in [`active.md`](active.md). -
πŸ“‹ @PyAutoFit TransformedMessage.factor_gradient crashes on first call β€” issue #1501 β€” HOLD β€” do not start dev. Fix-or-delete hangs off the PyAutoFit#1498 logpdf-contract +
πŸ“‹ @PyAutoFit TransformedMessage.factor_gradient crashes on first call β€” issue #1501 β€” issued 2026-08-19 β€” HOLD β€” do not start dev. Fix-or-delete hangs off the PyAutoFit#1498 logpdf-contract ``` /start_dev active/16_transformed_message_factor_gradient_unpack.md @@ -150,7 +150,7 @@ Started or scoped, not currently in flight β€” resume by moving the row back to
3 task(s) -
πŸ“‹ single-source-density-design β€” issue #1500 +
πŸ“‹ single-source-density-design β€” issue #1500 β€” parked 2026-08-18 ``` /start_dev active/12_single_source_density_refactor.md @@ -158,7 +158,7 @@ Started or scoped, not currently in flight β€” resume by moving the row back to
-
πŸ“‹ prior-message-collapse-design β€” issue #1500 +
πŸ“‹ prior-message-collapse-design β€” issue #1500 β€” parked 2026-08-18 ``` /start_dev active/13_collapse_prior_and_message.md @@ -166,7 +166,7 @@ Started or scoped, not currently in flight β€” resume by moving the row back to
-
πŸ“‹ pyautoreduce-slacs1430-acs-comparison +
πŸ“‹ pyautoreduce-slacs1430-acs-comparison β€” parked 2026-08-08 ``` /start_dev active/pyautoreduce_slacs1430_acs_comparison.md @@ -183,7 +183,7 @@ Scoped but not started; some are not yet prompt files. Full detail in [`planned.
6 task(s) -
πŸ“‹ isothermal-ell-sph-oversampling-at-the-cusp β€” planned β€” NOT yet a prompt file; file one via /intake before starting +
πŸ“‹ isothermal-ell-sph-oversampling-at-the-cusp β€” found 2026-08-09 β€” planned β€” NOT yet a prompt file; file one via /intake before starting ``` /route start the planned PyAutoMind task isothermal-ell-sph-oversampling-at-the-cusp β€” its record is in planned.md @@ -191,7 +191,7 @@ Scoped but not started; some are not yet prompt files. Full detail in [`planned.
-
πŸ“‹ remote-mcp-deployment-tiers β€” issue #20 β€” DESIGN-COMPLETE, build BLOCKED-ON-DEMAND β€” issue #20 holds the full auth/transport/hosting design + Richard/PyAutoMCP… +
πŸ“‹ remote-mcp-deployment-tiers β€” issue #20 β€” filed 2026-07-21 β€” DESIGN-COMPLETE, build BLOCKED-ON-DEMAND β€” issue #20 holds the full auth/transport/hosting design + Richard/PyAutoMCP… ``` /start_dev draft/feature/autofit_assistant/remote_mcp_deployment_tiers.md @@ -199,7 +199,7 @@ Scoped but not started; some are not yet prompt files. Full detail in [`planned.
-
πŸ“‹ samples-parameter-paths β€” issue #1327 β€” parked +
πŸ“‹ samples-parameter-paths β€” issue #1327 β€” filed 2026-07-08 β€” parked ``` /start_dev draft/bug/health_fixes/samples_parameter_paths.md @@ -207,7 +207,7 @@ Scoped but not started; some are not yet prompt files. Full detail in [`planned.
-
πŸ“‹ jax-point-source-point-smoke-sentinel β€” planned +
πŸ“‹ jax-point-source-point-smoke-sentinel β€” filed 2026-05-21 β€” planned ``` /start_dev draft/bug/autolens/jax_point_source_point_smoke_sentinel.md @@ -215,7 +215,7 @@ Scoped but not started; some are not yet prompt files. Full detail in [`planned.
-
πŸ“‹ piemass-potential β€” planned +
πŸ“‹ piemass-potential β€” filed 2026-06-05 β€” planned ``` /start_dev draft/feature/autogalaxy/piemass_potential.md @@ -223,7 +223,7 @@ Scoped but not started; some are not yet prompt files. Full detail in [`planned.
-
πŸ“‹ latent-nan-guard-honest-run +
πŸ“‹ latent-nan-guard-honest-run β€” planned 2026-07-22 ``` /route start the planned PyAutoMind task latent-nan-guard-honest-run β€” its record is in planned.md @@ -1314,6 +1314,25 @@ Scoped but not started; some are not yet prompt files. Full detail in [`planned.
+## Recent + +The 10 newest things to happen to the work in hand, newest first β€” issued, parked, filed. Every other section on this page is laid out by state, which is exactly why none of them can answer β€œwhat has been happening?”. Shipped work is not here: it is read from `complete/index.md`, and a thousand records deep it would crowd out everything anyone can still act on. + +| Date | Event | Task | +|------|-------|------| +| 2026-08-19 | issued | @PyAutoFit TransformedMessage.factor_gradient crashes on first… | +| 2026-08-18 | parked | single-source-density-design | +| 2026-08-18 | parked | prior-message-collapse-design | +| 2026-08-09 | found | isothermal-ell-sph-oversampling-at-the-cusp | +| 2026-08-08 | parked | pyautoreduce-slacs1430-acs-comparison | +| 2026-07-22 | planned | latent-nan-guard-honest-run | +| 2026-07-21 | filed | remote-mcp-deployment-tiers | +| 2026-07-08 | filed | samples-parameter-paths | +| 2026-06-05 | filed | piemass-potential | +| 2026-05-21 | filed | jax-point-source-point-smoke-sentinel | + +_Dates come from each task's registry entry β€” `lifecycle.py dates` reports anything undated._ + ## Epics Long-running multi-phase programmes. Each epic's πŸ“‹ prompt has Claude 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).