diff --git a/complete/2026/08/aplt-output-drift-remaining-repos.md b/complete/2026/08/aplt-output-drift-remaining-repos.md
new file mode 100644
index 00000000..1c9e2ddf
--- /dev/null
+++ b/complete/2026/08/aplt-output-drift-remaining-repos.md
@@ -0,0 +1,184 @@
+Repaired the `aplt.Output` stale-API drift in the last two repos the
+2026-08-04 `plot-array-stale-kwargs` task deliberately stopped short of — and
+found that the drift's real shape was not what the prompt described.
+
+## Outcome
+
+| Repo | PR | Merged |
+|---|---|---|
+| PyAutoGalaxy | [#586](https://github.com/PyAutoLabs/PyAutoGalaxy/pull/586) | `d68a8f6` |
+| euclid_strong_lens_modeling_pipeline | [#39](https://github.com/PyAutoLabs/euclid_strong_lens_modeling_pipeline/pull/39) | `62b2fd4` |
+
+Classification changed during planning from workspace-only to **library +
+workspace**, which is why a PyAutoGalaxy PR exists at all.
+
+## The prompt was wrong in three ways, each found by verifying rather than trusting
+
+**1. `autocti_workspace_test` is out of scope — the hedge resolved, then the
+scope collapsed.** The prompt flagged 27 files as "UNVERIFIED — check first",
+suspecting PyAutoCTI might still export `Output`. It does not:
+`autocti/plot/__init__.py` is 49 lines of flat functions. So those files are
+genuinely broken — but an alias-aware scan found **31**, not 27, and:
+
+- **18 are under `legacy/`**, which `autocti_workspace_test/AGENTS.md:52`
+ forbids editing ("preserved Euclid VIS history"). Its README says outright
+ that they target the removed Plotter object stack and are not runnable.
+- **13 are top-level `imaging_ci/`** — undocumented in AGENTS.md's structure
+ block, absent from `smoke_tests.txt`, substantive history **2023-02**, the
+ same era as `legacy/` (created 2026-07-17 by "CTI resurrection Phase 5").
+ Its only 2026 commits are repo-wide mechanical sweeps that also hit `legacy/`.
+
+Following the prompt literally would have modernised dead code *and* violated
+the repo's own hard rule. Filed as
+`draft/maintenance/autocti_workspace_test/imaging_ci_heritage_sweep.md` for a
+human decision against the CTI resurrection epic (PyAutoCTI#82).
+
+**2. The drift was never really about `Output`.** The whole plotter-object stack
+is gone from every public namespace — `MatPlot2D`, `MatPlot1D`, `Cmap`,
+`Array2DPlotter`, `Visuals2D`, `MassProfileCentresScatter`, the `*Plotter`
+family. `Output` was 6 of 13 missing symbols in autocti, 2 of 6 in euclid.
+
+**3. Two library defects the prompt never mentioned.** `Cmap` is exported by
+**no** public plot namespace, yet:
+
+- `Scribbler.__init__` required a `Cmap`-shaped object for `cmap=`, so callers
+ had no public way to colour the GUI.
+- `Clicker.start()` built `aplt.Cmap(...)` on `autoarray.plot`
+ *unconditionally* — reproduced on the installed stack as
+ `AttributeError: module 'autoarray.plot' has no attribute 'Cmap'`. That GUI
+ was dead for every caller.
+
+Fixed library-side because the only workspace alternative was a private-path
+import — the "autoimmune reaction" the Bug Agent's fix-locus rule warns against.
+
+## The plan's worst assumption, caught before it shipped
+
+The approved plan said euclid's explicit `mask=` could simply drop out, since
+`plot_array` auto-derives the outline. It cannot. `data` there comes from
+`Array2D.from_fits` and is **unmasked**, so `auto_mask_edge(data)` returns
+`None` — verified directly. Worse, the mask being drawn is a *separately
+constructed* circular one whose radius is grown at line 160 to enclose the
+clicked galaxies, so it is the entire subject of the figure.
+
+A literal reading would have silently deleted the mask radius from the PNG that
+exists to show it, and nothing would have failed. Fixing it needed a second
+library change: autogalaxy's `plot_array` wrapper delegates to autoarray's but
+was dropping its `mask=` parameter.
+
+## Verification
+
+- PyAutoGalaxy CI green on **every leg**: `unittest (3.12)`, `unittest (3.13)`,
+ `unittest-nojax`, Docs. 1129 tests, 16 new across two files (`test_autogalaxy/gui/`
+ did not previously exist).
+- Alias-aware AST re-scan — aliases resolved from each file's own imports, the
+ correction carried forward from HowToGalaxy#56 — **0 residual stale symbols**
+ in both repos.
+- All 10 changed `aplt.*`/`al.*` calls bound against real signatures: 10 ok, 0 failures.
+- Mask passthrough verified by **rendering**: 2436 pixels differ vs. the same
+ call without `mask=`, confirmed by pixel diff rather than file size.
+- `compileall` clean; CRLF preserved uniformly (see below).
+
+## Not verified, stated plainly
+
+- **The two euclid GUIs were never run end-to-end.** They need TkAgg and FITS
+ data absent from the repo, and euclid has **no CI workflows at all**. The
+ merge was made with that stated and acknowledged.
+- **`Scribbler.__init__` has no direct test** — `matplotlib.use("TkAgg")` and
+ `wm_geometry` cannot run headless. The extracted `norm_from` helper carries
+ the logic and is fully tested; the constructor is covered only by binding.
+
+## Behaviour change accepted
+
+Extra-galaxy centre markers were cyan via `MassProfileCentresScatter(c="cy")`
+and are now the `plot_array` default. `autoarray/plot/array.py:258-262`
+hardcodes the overlay colour cycle, and `line_colors` (265-273) applies to
+`lines`, not `positions` — an early misreading of mine, corrected before it
+reached the code. Restoring the colour needs a PyAutoArray change; markers
+remain visible and distinguishable from the mask outline by size and z-order.
+
+## Process note
+
+An intermediate "suite green" reading was wrong twice and caught both times:
+pytest had exited 4 on an unrecognised `--timeout` flag without running, and a
+later run was corrupted when a `git stash` reverted the tree mid-run. Reported
+results come from clean runs on the final tree. Separately, a stop-hook flagged
+the PyAutoGalaxy branch as unpushed: the commit *was* on GitHub, but the
+`--depth 1` clone's single-branch refspec meant no remote-tracking ref existed,
+so `@{u}` could not resolve — repaired by widening the refspec.
+
+## Follow-ups filed, not fixed
+
+- `draft/maintenance/autocti_workspace_test/imaging_ci_heritage_sweep.md` — the
+ 13 heritage files the `legacy/` sweep missed.
+- `autoarray` duplicates this normalisation inline in `plot/array.py` and
+ `plot/inversion.py`; a shared helper there is the real fix. This task added
+ one copy in autogalaxy serving both GUIs rather than a third inline copy.
+- euclid's three `tools/` files are **100% CRLF on `main`**, contradicting its
+ own AGENTS.md ("CRLF will break shell scripts on the HPC"). Preserved rather
+ than converted, to avoid whole-file diffs that would not fix the repo-wide
+ problem.
+
+## Original prompt
+
+# `aplt.Output` stale-API drift in the remaining workspace repos
+
+Type: bug
+Target: workspaces
+Repos:
+- autocti_workspace_test
+- euclid_strong_lens_modeling_pipeline
+Difficulty: small
+Autonomy: supervised
+Priority: normal
+Status: formalised
+Filed: 2026-08-04 (backfilled from git)
+Issued: 2026-08-24
+
+Split out of `plot-array-stale-kwargs` (HowToGalaxy#56, 2026-08-04), which
+repaired this same drift in `autolens_workspace_developer` but deliberately
+stopped at that repo's boundary.
+
+## The drift
+
+`aplt.Output` no longer exists on the **autolens / autogalaxy** plot namespace —
+verified: `hasattr(autolens.plot, "Output") == False`. It survives only as
+`autoarray.plot.Output`. The removal was deliberate and is already documented in
+`autolens_assistant/AGENTS.md:218` ("the `aplt.MatPlot2D` / `aplt.Output` objects
+have been removed — do not use them").
+
+Callers must move to the flat convention. Note the accepted kwargs differ per
+callee — check each signature rather than blanket-renaming:
+
+```python
+# plot_array takes all three
+aplt.plot_array(array=..., output_path=P, output_filename=F, output_format="png")
+# subplot_* take only path + format (no output_filename)
+aplt.subplot_tracer(tracer=..., grid=..., output_path=P, output_format="png")
+```
+
+## Sites
+
+| Repo | Files | Status |
+|------|-------|--------|
+| `autocti_workspace_test` | 27 | **UNVERIFIED — check first** |
+| `euclid_strong_lens_modeling_pipeline/tools/` | 2 (`psf_size.py`, `extra_galaxies_centres_gui.py`) | confirmed broken |
+
+**Do not assume the autocti files are broken.** Those import
+`import autocti.plot as aplt` — a *different* library's plot namespace.
+`autocti` was not installed in the 2026-08-04 session so it could not be
+checked. PyAutoCTI may still export `Output`, in which case those 27 files are
+correct as written and must be left alone. Verify with
+`hasattr(autocti.plot, "Output")` before touching anything.
+
+Confirmed **not** bugs, do not "fix" them:
+- `PyAutoArray/test_autoarray/plot/test_output.py` — there `aplt` *is*
+ `autoarray.plot`, which does export `Output`.
+- `autolens_assistant` markdown — documents the removal.
+
+## Verification
+
+Re-run an alias-aware AST scan after the fix (the 2026-08-04 session's first
+sweep hardcoded the alias `aplt` and **missed** a call site written as `aaplt`;
+resolve aliases from each file's own imports). Then bind each changed call's
+kwargs against the real callee signature via `inspect.signature`, since these
+repos have little or no CI to catch a wrong kwarg name.
diff --git a/complete/index.md b/complete/index.md
index b0a02eff..8a687dae 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.
-1125 records across 7 buckets.
+1126 records across 7 buckets.
## Highlights
@@ -20,6 +20,7 @@ _(curate hard-won records here — survives regeneration.)_
- [actionable-health-board](2026/08/actionable-health-board.md) — closed on ship
- [active-prompt-orphan-triage](2026/08/active-prompt-orphan-triage.md)
+- [aplt-output-drift-remaining-repos](2026/08/aplt-output-drift-remaining-repos.md)
- [arcticpy-install-standardisation](2026/08/arcticpy-install-standardisation.md)
- [arxiv-inbox-tier](2026/08/arxiv-inbox-tier.md) — the nightly strong-lensing digest no longer ends in a Slack paste-block the
- [astropy-cap-bump](2026/08/astropy-cap-bump.md) — closed manually post-merge — "Part of" in the PR bodies does not auto-close
diff --git a/dashboard.html b/dashboard.html
index 2faad401..b3b4d314 100644
--- a/dashboard.html
+++ b/dashboard.html
@@ -185,7 +185,7 @@
PyAutoMindDashboard
Intent. Priority. Flow.
Every task the Mind is holding. Tap a task's 📋 and its /start_dev command is on your clipboard — paste it into a Claude Code chat to route Claude straight to that task. Recent is the same work by date — what has been happening rather than what to do next.
-
1In flight
3Parked
5Planned
139Backlog
+
1In flight
3Parked
5Planned
141Backlog
Last updated 2026-08-24. This page is generated from active/, draft/ and the registry files, so it is only as current as they are. dashboard_refresh.yml re-renders it on every push to main — that heals a stale page, but not a stale prompt: a task that shipped without its prompt advancing to complete/ keeps rendering here as pickable backlog. Reconciling those is the refresh below.
diff --git a/dashboard.md b/dashboard.md
index 65abe1c7..f2102e6d 100644
--- a/dashboard.md
+++ b/dashboard.md
@@ -45,7 +45,7 @@ anything you could not verify.
| [In flight](#in-flight) (`active/`) | 1 |
| [Parked](#parked) (`parked.md`) | 3 |
| [Planned](#planned) (`planned.md`) | 5 |
-| [Backlog](#backlog) (`draft/`) | 139 |
+| [Backlog](#backlog) (`draft/`) | 141 |
## Start here
@@ -261,7 +261,7 @@ Scoped but not started; some are not yet prompt files. Full detail in [`planned.
## Backlog
-**139** filed prompts, not started. Each section is sorted most-pickable first (priority, then size). **25** of them belong to an epic and are listed only under [Epics](#epics) below.
+**141** filed prompts, not started. Each section is sorted most-pickable first (priority, then size). **25** of them belong to an epic and are listed only under [Epics](#epics) below.
feature — 27
@@ -485,7 +485,7 @@ Scoped but not started; some are not yet prompt files. Full detail in [`planned.
-bug — 23
+bug — 22📋 Fix release JAX runtime compatibility and likelihood parity — health_fixes · too-large · supervised · high
@@ -551,14 +551,6 @@ Scoped but not started; some are not yet prompt files. Full detail in [`planned.
-📋 aplt.Output stale-API drift in the remaining workspace repos — workspaces · small · supervised · normal
-
-```
-/start_dev draft/bug/workspaces/aplt_output_drift_remaining_repos.md
-```
-
-
-
📋 Three jax_likelihood pins are stale by ~1.24e-4 and fail the smoke gate… — workspaces · small · supervised · normal
```
@@ -674,7 +666,7 @@ Scoped but not started; some are not yet prompt files. Full detail in [`planned.
-maintenance — 23
+maintenance — 25📋 autocti_workspace has no Navigator Check, so its CI can never roll… — ci · medium · supervised · high
@@ -724,6 +716,14 @@ Scoped but not started; some are not yet prompt files. Full detail in [`planned.
+📋 euclid: CRLF has reached the HPC submit scripts AGENTS.md warns about — workspaces · small · supervised · normal
+
+```
+/start_dev draft/maintenance/workspaces/euclid_crlf_line_endings.md
+```
+
+
+
📋 Un-park imaging/features/scaling_relation/slam once PyAutoArray#431 merges — workspaces · small · supervised · normal
```
@@ -828,6 +828,14 @@ Scoped but not started; some are not yet prompt files. Full detail in [`planned.
+📋 Top-level imaging_ci/ is pre-resurrection heritage the legacy sweep missed — autocti_workspace_test · small · supervised · low
+
+```
+/start_dev draft/maintenance/autocti_workspace_test/imaging_ci_heritage_sweep.md
+```
+
+
+
📋 dataset/imaging/jwst_lw is untracked because the gitignore was never extended for it — autolens_profiling · small · supervised · low
```
@@ -1081,7 +1089,7 @@ Scoped but not started; some are not yet prompt files. Full detail in [`planned.
-refactor — 5
+refactor — 6📋 einstein_radius_jit_from: replace static init_guess with a JAX-native seed finder — autogalaxy · too-large · supervised · high
@@ -1099,6 +1107,14 @@ Scoped but not started; some are not yet prompt files. Full detail in [`planned.
+📋 One shared colour-norm helper — the three copies have already diverged — autoarray · small · supervised · normal
+
+```
+/start_dev draft/refactor/autoarray/shared_log_norm_helper.md
+```
+
+
+
📋 Split Fitness.batch_size into lh_batch_size and latent_batch_size — autofit · small · supervised · normal
```
@@ -1228,19 +1244,22 @@ The 50 newest things to happen to the work in hand, newest first — issued, par
|------|-------|------|
| 2026-08-24 | filed | wiki-currency's --check-version gate rots on every library main merge |
| 2026-08-24 | filed | interferometer/jax_grad/gradient.py: eager and jitted likelihoods… |
+| 2026-08-24 | filed | euclid: CRLF has reached the HPC submit scripts AGENTS.md warns about |
| 2026-08-24 | filed | autocti_workspace has no Navigator Check, so its CI can never roll… |
| 2026-08-24 | filed | Un-park multi_galaxy/features/scaling_relation/slam once a capped run… |
+| 2026-08-24 | filed | Top-level imaging_ci/ is pre-resurrection heritage the legacy sweep… |
| 2026-08-24 | filed | The weekly smoke run's timings land in results-* under no… |
| 2026-08-24 | filed | Organ repo spellings split across two normalised keys |
+| 2026-08-24 | filed | One shared colour-norm helper — the three copies have already diverged |
| 2026-08-24 | filed | Heart's local smoke runner cannot run any CTI workspace — no autocti… |
-| 2026-08-23 | filed | pynufft removal: unswept downstream residue (1 hard break + stale… |
-| 2026-08-23 | filed | Phase 3: stop installing pynufft in Hands/Heart CI and PyAutoCTI… |
-| 2026-08-23 | filed | Brain board follow-ups: what real mornings surface |
… 10 more (40 left)
| Date | Event | Task |
|------|-------|------|
+| 2026-08-23 | filed | pynufft removal: unswept downstream residue (1 hard break + stale… |
+| 2026-08-23 | filed | Phase 3: stop installing pynufft in Hands/Heart CI and PyAutoCTI… |
+| 2026-08-23 | filed | Brain board follow-ups: what real mornings surface |
| 2026-08-22 | filed | smoke_install.sh's stale jax<0.7 pin — CI is on the right jax… |
| 2026-08-22 | filed | Untrack the generated FITS test artifacts in autoarray |
| 2026-08-22 | filed | The reconstruction noise map describes a different estimator than the… |
@@ -1248,14 +1267,14 @@ The 50 newest things to happen to the work in hand, newest first — issued, par
| 2026-08-22 | filed | Is Intel macOS a supported platform, and what is the numpy-only… |
| 2026-08-22 | filed | Defer the eager scipy.sparse import in derivative_util (~0.10 s of… |
| 2026-08-21 | filed | Rectangular mesh split: Bilinear (fast CPU default) vs RTU… |
-| 2026-08-20 | filed | Numba CPU likelihood phase 2: kernel-CDF numba fast path (the 49-88%… |
-| 2026-08-20 | filed | Numba CPU likelihood phase 1: batched MGE convolution +… |
-| 2026-08-19 | filed | status.sh --repos sources a file that no longer exists |
… 10 more (30 left)
| Date | Event | Task |
|------|-------|------|
+| 2026-08-20 | filed | Numba CPU likelihood phase 2: kernel-CDF numba fast path (the 49-88%… |
+| 2026-08-20 | filed | Numba CPU likelihood phase 1: batched MGE convolution +… |
+| 2026-08-19 | filed | status.sh --repos sources a file that no longer exists |
| 2026-08-19 | filed | jax 0.11 breaks beta/gamma message log_partition under jit… |
| 2026-08-19 | filed | autolens_workspace_test jax_likelihood pins: 4 scripts fail smoke on… |
| 2026-08-19 | filed | autofit_profiling: bootstrap the repo + general PyAutoFit profiling… |
@@ -1263,14 +1282,14 @@ The 50 newest things to happen to the work in hand, newest first — issued, par
| 2026-08-19 | issued | @PyAutoFitTransformedMessage.factor_gradient crashes on first… |
| 2026-08-19 | filed | Release board: local run_logs enrichment |
| 2026-08-19 | filed | RTD organism docs currency: Nerves page, organ-count drift, hands.md… |
-| 2026-08-19 | filed | Deduplicate repos_sync.py's check/write pairs |
-| 2026-08-19 | filed | Bug in autocti_workspace: the dataset_1d results/database example… |
-| 2026-08-18 | parked | single-source-density-design |
… 10 more (20 left)
| Date | Event | Task |
|------|-------|------|
+| 2026-08-19 | filed | Deduplicate repos_sync.py's check/write pairs |
+| 2026-08-19 | filed | Bug in autocti_workspace: the dataset_1d results/database example… |
+| 2026-08-18 | parked | single-source-density-design |
| 2026-08-18 | parked | prior-message-collapse-design |
| 2026-08-18 | filed | @PyAutoFitTransformedMessage.logpdf/pdf omit the transform… |
| 2026-08-17 | filed | Which other searches need prior-support handling — coverage audit… |
@@ -1278,14 +1297,14 @@ The 50 newest things to happen to the work in hand, newest first — issued, par
| 2026-08-16 | filed | LogGaussianPrior misreports its own support as (-inf, inf) |
| 2026-08-14 | filed | Three jax_likelihood pins are stale by ~1.24e-4 and fail the smoke… |
| 2026-08-09 | found | isothermal-ell-sph-oversampling-at-the-cusp |
-| 2026-08-08 | parked | pyautoreduce-slacs1430-acs-comparison |
-| 2026-08-08 | filed | Regenerate autolens_workspace markdown/ so the MGE pages show… |
-| 2026-08-07 | filed | Regenerate setup_notebook-drifted notebooks in… |
… 10 more (10 left)
| Date | Event | Task |
|------|-------|------|
+| 2026-08-08 | parked | pyautoreduce-slacs1430-acs-comparison |
+| 2026-08-08 | filed | Regenerate autolens_workspace markdown/ so the MGE pages show… |
+| 2026-08-07 | filed | Regenerate setup_notebook-drifted notebooks in… |
| 2026-08-06 | filed | Triage: Convolver "No blurring_image provided" warning in canonical… |
| 2026-08-06 | filed | Rewrite PyAutoCTI docs/api — 55 of 89 autosummary entries are dead |
| 2026-08-06 | filed | Dependency-cap refresh 2026-08: safe bumps, astropy 8 decision, two… |
@@ -1293,9 +1312,6 @@ The 50 newest things to happen to the work in hand, newest first — issued, par
| 2026-08-04 | filed | dataset/imaging/jwst_lw is untracked because the gitignore was never… |
| 2026-08-04 | filed | cosmos_web_ring stores boolean masks as float64, wasting ~3.4 MB of… |
| 2026-08-04 | filed | autolens_workspace_developer: broad stale-API rot (56 symbols, no CI) |
-| 2026-08-04 | filed | aplt.Output stale-API drift in the remaining workspace repos |
-| 2026-08-04 | filed | Nightly release has been blocked 8 nights running — triage the streak |
-| 2026-08-04 | filed | HowToLens ch4 tutorial 3: mask overlay is never actually drawn |
diff --git a/draft/bug/workspaces/aplt_output_drift_remaining_repos.md b/draft/bug/workspaces/aplt_output_drift_remaining_repos.md
deleted file mode 100644
index 3f52eb86..00000000
--- a/draft/bug/workspaces/aplt_output_drift_remaining_repos.md
+++ /dev/null
@@ -1,61 +0,0 @@
-# `aplt.Output` stale-API drift in the remaining workspace repos
-
-Type: bug
-Target: workspaces
-Repos:
-- autocti_workspace_test
-- euclid_strong_lens_modeling_pipeline
-Difficulty: small
-Autonomy: supervised
-Priority: normal
-Status: formalised
-Filed: 2026-08-04 (backfilled from git)
-
-Split out of `plot-array-stale-kwargs` (HowToGalaxy#56, 2026-08-04), which
-repaired this same drift in `autolens_workspace_developer` but deliberately
-stopped at that repo's boundary.
-
-## The drift
-
-`aplt.Output` no longer exists on the **autolens / autogalaxy** plot namespace —
-verified: `hasattr(autolens.plot, "Output") == False`. It survives only as
-`autoarray.plot.Output`. The removal was deliberate and is already documented in
-`autolens_assistant/AGENTS.md:218` ("the `aplt.MatPlot2D` / `aplt.Output` objects
-have been removed — do not use them").
-
-Callers must move to the flat convention. Note the accepted kwargs differ per
-callee — check each signature rather than blanket-renaming:
-
-```python
-# plot_array takes all three
-aplt.plot_array(array=..., output_path=P, output_filename=F, output_format="png")
-# subplot_* take only path + format (no output_filename)
-aplt.subplot_tracer(tracer=..., grid=..., output_path=P, output_format="png")
-```
-
-## Sites
-
-| Repo | Files | Status |
-|------|-------|--------|
-| `autocti_workspace_test` | 27 | **UNVERIFIED — check first** |
-| `euclid_strong_lens_modeling_pipeline/tools/` | 2 (`psf_size.py`, `extra_galaxies_centres_gui.py`) | confirmed broken |
-
-**Do not assume the autocti files are broken.** Those import
-`import autocti.plot as aplt` — a *different* library's plot namespace.
-`autocti` was not installed in the 2026-08-04 session so it could not be
-checked. PyAutoCTI may still export `Output`, in which case those 27 files are
-correct as written and must be left alone. Verify with
-`hasattr(autocti.plot, "Output")` before touching anything.
-
-Confirmed **not** bugs, do not "fix" them:
-- `PyAutoArray/test_autoarray/plot/test_output.py` — there `aplt` *is*
- `autoarray.plot`, which does export `Output`.
-- `autolens_assistant` markdown — documents the removal.
-
-## Verification
-
-Re-run an alias-aware AST scan after the fix (the 2026-08-04 session's first
-sweep hardcoded the alias `aplt` and **missed** a call site written as `aaplt`;
-resolve aliases from each file's own imports). Then bind each changed call's
-kwargs against the real callee signature via `inspect.signature`, since these
-repos have little or no CI to catch a wrong kwarg name.
diff --git a/draft/maintenance/autocti_workspace_test/imaging_ci_heritage_sweep.md b/draft/maintenance/autocti_workspace_test/imaging_ci_heritage_sweep.md
new file mode 100644
index 00000000..5e21532c
--- /dev/null
+++ b/draft/maintenance/autocti_workspace_test/imaging_ci_heritage_sweep.md
@@ -0,0 +1,88 @@
+# Top-level `imaging_ci/` is pre-resurrection heritage the legacy sweep missed
+
+Type: maintenance
+Target: autocti_workspace_test
+Repos:
+- autocti_workspace_test
+Difficulty: small
+Autonomy: supervised
+Priority: low
+Status: formalised
+Filed: 2026-08-24
+
+Split out of `aplt-output-drift-remaining-repos` (PyAutoGalaxy#585, 2026-08-24),
+which scoped `autocti_workspace_test` out rather than modernising code that
+looks dead.
+
+## The observation
+
+`autocti_workspace_test` has a top-level `imaging_ci/` directory — 41 Python
+files — that behaves in every observable way like the `legacy/` tree beside it,
+but is not in it:
+
+- **Not documented.** AGENTS.md's "Repository Structure" block lists `scripts/`,
+ `legacy/`, `config/` and `smoke_tests.txt`. Top-level `imaging_ci/` appears
+ nowhere in it.
+- **Not exercised.** `smoke_tests.txt` lists three scripts
+ (`dataset_1d/model_fit.py`, `imaging_ci/model_fit.py`, `plot/subplots.py`) —
+ all of them under `scripts/`, none under top-level `imaging_ci/`. Nothing in
+ CI touches it.
+- **Not maintained since 2023.** Its substantive history is `2023-02-07 add all
+ files` and `2023-02-13 temporal fit now runs`. Its only 2026 commits are
+ repo-wide mechanical sweeps (`remove the Finished./Finish. notebook-generation
+ crutch`, `remove legacy notebook bootstrap`) that also touched `legacy/`.
+- **Broken against the current stack, in exactly the `legacy/` way.** 13 of its
+ files call the removed plotter-object API — `ImagingCIPlotter`, `MatPlot2D`,
+ `MatPlot1D`, `Output`, `Array2DPlotter`, `Cmap`, `Title`, `Axis` — none of
+ which `autocti.plot` exports (its `__init__.py` is 49 lines of flat functions).
+ `legacy/README.md` describes its own contents in the same terms: *"target the
+ pre-2025 PyAutoCTI API (the removed Plotter object stack, analysis summing,
+ etc.) and are not runnable against the current stack."*
+
+`legacy/` was created on 2026-07-17 by *"CTI resurrection Phase 5: rebuild as a
+modern integration-test suite (#1)"*, which swept the pre-resurrection contents
+into it. The reading this prompt proposes: `imaging_ci/` is part of that same
+heritage and the sweep simply missed it.
+
+## Why it matters
+
+`AGENTS.md:52` says *"Never edit `legacy/` — it is preserved Euclid VIS
+history."* That rule protects the tree it names. Because `imaging_ci/` sits
+outside it, an API-drift sweep reads those 13 files as live breakage and
+"fixes" them — modernising dead code against no CI and no dataset. That is the
+mistake PyAutoGalaxy#585 stopped one step short of making.
+
+## What to decide
+
+Confirm the reading before acting — the point of this prompt is the question,
+not a foregone move. Check `imaging_ci/` against the CTI resurrection epic
+(PyAutoCTI#82): is any of it slated for modernisation, or is it all superseded
+by `scripts/`?
+
+Then one of:
+
+1. **`git mv imaging_ci/ legacy/imaging_ci/`** and extend `legacy/README.md` +
+ AGENTS.md's structure block to cover it. Preserves the history, and puts it
+ behind the never-edit rule where a future sweep will leave it alone.
+2. **Condemn it** via the Gut's transit-and-void lifecycle (see PyAutoGut), if
+ `legacy/` is meant to hold only the Euclid VIS material specifically and this
+ is something else.
+3. **Keep and modernise** — only if the epic actually wants these 13 files
+ working. Then it is a real dev task, not maintenance, and wants its own
+ prompt with a plan for validating them (no CI, no committed dataset).
+
+Note `imaging_ci/profiling/` (17 files) and `imaging_ci/temporal/` are in the
+directory too and are *not* part of the 13 broken ones — they need the same
+decision but on their own evidence, not by association.
+
+## Evidence to re-derive
+
+```bash
+git -C autocti_workspace_test log --format="%ad %s" --date=short -- imaging_ci | head
+git -C autocti_workspace_test log --diff-filter=A --format="%ad %s" --date=short -- legacy/README.md
+```
+
+Alias-aware AST scan (resolve the plot alias from each file's own imports, then
+diff attribute use against `autocti/plot/__init__.py`'s real export list) —
+the scan written for PyAutoGalaxy#585 reports 31 broken files repo-wide,
+18 under `legacy/` and 13 under top-level `imaging_ci/`.
diff --git a/draft/maintenance/workspaces/euclid_crlf_line_endings.md b/draft/maintenance/workspaces/euclid_crlf_line_endings.md
new file mode 100644
index 00000000..521b7e95
--- /dev/null
+++ b/draft/maintenance/workspaces/euclid_crlf_line_endings.md
@@ -0,0 +1,76 @@
+# euclid: CRLF has reached the HPC submit scripts AGENTS.md warns about
+
+Type: maintenance
+Target: workspaces
+Repos:
+- euclid_strong_lens_modeling_pipeline
+Difficulty: small
+Autonomy: supervised
+Priority: normal
+Status: formalised
+Filed: 2026-08-24
+
+Noticed during `aplt-output-drift-remaining-repos` (PyAutoGalaxy#585,
+2026-08-24), which preserved CRLF in the three files it edited rather than
+bury a real fix inside whole-file diffs.
+
+## The state
+
+`euclid_strong_lens_modeling_pipeline/AGENTS.md` says:
+
+> All files must use Unix line endings (`\n`). CRLF will break shell scripts on
+> the HPC.
+
+Measured on `main`: **20 of 126 tracked text files carry CRLF** — mixed, not
+uniform, so this is drift rather than a deliberate convention.
+
+| Extension | CRLF / total |
+|---|---|
+| `.py` | 11 / 29 |
+| `.yaml` | 8 / 79 |
+| `.sh` | 1 / 1 |
+
+## Why this is not cosmetic
+
+The CRLF has reached exactly the files the rule exists to protect, **including
+their shebang lines**:
+
+```
+hpc/sync #!/usr/bin/env bash^M
+hpc/batch_gpu/submit_start_here #!/bin/bash -l^M
+hpc/batch_cpu/submit_start_here #!/bin/bash -l^M
+activate.sh BASE=/mnt/ral/jnightin/PyAuto^M
+```
+
+A trailing `\r` becomes part of the interpreter path, which is the documented
+`bad interpreter` failure. Also affected: `hpc/batch_gpu/submit_full_model`,
+`hpc/batch_cpu/template`, `hpc/sync.conf.example`, `hpc/.gitignore`.
+
+**Do not assume these are currently broken.** They are evidently in use for real
+GPU runs, so either they are invoked in a way that tolerates it (`bash hpc/sync`
+ignores the shebang), or SLURM is forgiving, or the CRLF is recent. **Establish
+which before writing the PR** — `git log` the affected files to see when CRLF
+appeared, and say plainly in the PR whether this was a live break or a latent
+one. That distinction is the whole value of the task.
+
+`activate.sh` is the interesting case: it is `source`d, not executed, so its
+`\r` lands inside a variable — `BASE` gains a trailing carriage return and every
+path built from it is subtly wrong. That fails differently and more quietly than
+a bad shebang.
+
+## Shape of the fix
+
+1. Convert all tracked text files to LF in one mechanical pass.
+2. **Add a `.gitattributes`** — the repo has none, which is why this recurred.
+ Without it nothing stops the next contributor on Windows reintroducing it.
+ `* text=auto eol=lf`, with explicit entries for the `hpc/` scripts that carry
+ no extension.
+3. Verify: no tracked text file contains `\r`; the `hpc/` scripts still parse
+ (`bash -n`); Python files still compile.
+
+## Scope note
+
+This is a whole-repo whitespace commit and will touch 20 files with no logical
+change — that is the point, and it is why it was kept out of PyAutoGalaxy#585.
+Land it on its own so the diff stays reviewable as "line endings only", and land
+it when no other euclid branch is open, since it will conflict with everything.
diff --git a/draft/refactor/autoarray/shared_log_norm_helper.md b/draft/refactor/autoarray/shared_log_norm_helper.md
new file mode 100644
index 00000000..c8f41541
--- /dev/null
+++ b/draft/refactor/autoarray/shared_log_norm_helper.md
@@ -0,0 +1,80 @@
+# One shared colour-norm helper — the three copies have already diverged
+
+Type: refactor
+Target: autoarray
+Repos:
+- PyAutoArray
+- PyAutoGalaxy
+Difficulty: small
+Autonomy: supervised
+Priority: normal
+Status: formalised
+Filed: 2026-08-24
+
+Split out of `aplt-output-drift-remaining-repos` (PyAutoGalaxy#585, 2026-08-24),
+which added the third copy rather than widen that task into a third repo.
+
+## The duplication
+
+Building the matplotlib colour norm from `use_log10` / `vmin` / `vmax` is written
+out three times:
+
+| Where | Notes |
+|---|---|
+| `autoarray/plot/array.py:164-188` | the reference implementation |
+| `autoarray/plot/inversion.py:92-107` | **already divergent — see below** |
+| `autogalaxy/util/plot_utils.py::norm_from` | added by PyAutoGalaxy#586, faithful to `array.py` |
+
+## This is not a tidiness task — the copies disagree
+
+`array.py` reads the configured floor:
+
+```python
+log10_min = _conf.instance["visualize"]["general"]["general"]["log10_min_value"] # fallback 1.0e-4
+clipped = np.clip(array, log10_min, None)
+```
+
+`inversion.py` **hardcodes `1e-4`** and never consults `autonerves` config, and
+does not clip. So a user who changes `log10_min_value` gets it honoured on array
+plots and silently ignored on inversion plots. That is a live behaviour bug, not
+a style issue, and it is the thing to fix first — the deduplication is how you
+stop it recurring.
+
+They differ in a second way worth preserving deliberately rather than by
+accident: `array.py` derives `vmax` from the clipped array, `inversion.py` from
+`pixel_values` and falls back to `vmin_log * 10.0` when there are none. And
+`inversion.py`'s `vmax_log <= vmin_log` guard sits inside its `elif pixel_values`
+branch, so an explicitly-passed degenerate `vmax` is *not* widened there but *is*
+in `array.py`.
+
+**Decide which behaviour is correct for each difference before merging them** —
+do not assume `array.py` wins on all three. Write the decision into the helper's
+docstring.
+
+## Shape of the fix
+
+1. Add one helper in **PyAutoArray** — the lowest repo that owns this logic;
+ `autoarray/plot/utils.py` sits alongside `auto_mask_edge` and the other
+ shared plot helpers. Give it the `array`/`use_log10`/`vmin`/`vmax` signature
+ plus whatever parameter reconciles the `pixel_values` difference.
+2. Call it from `array.py` and `inversion.py`.
+3. Make `autogalaxy.util.plot_utils.norm_from` **delegate** to it rather than
+ reimplement — autogalaxy may import autoarray (dependency direction is fine;
+ the reverse is not). Keep `norm_from` as the autogalaxy-facing name so the
+ `Clicker`/`Scribbler` callers added in PyAutoGalaxy#586 keep working.
+
+## Constraints
+
+- **Behaviour-preserving except where you deliberately fix a divergence**, and
+ each such fix is named in the PR body. This is a plotting path with thin test
+ coverage, so an unnoticed change ships silently.
+- Library-first: PyAutoArray merges before PyAutoGalaxy.
+- `test_autogalaxy/gui/test_plot_norm.py` (added by #586) already pins the
+ autogalaxy behaviour — it must stay green, or its change must be justified.
+
+## Verification
+
+Add tests in PyAutoArray covering the config-floor path (`log10_min_value` set to
+something other than `1e-4`, asserting *both* call sites honour it), the
+explicit-limits path, the derived-`vmax` path, and the degenerate `vmax <= vmin`
+case. Then the full suites in both repos, on 3.12 and 3.13.
diff --git a/queue.md b/queue.md
index e0c20bd7..0020f64e 100644
--- a/queue.md
+++ b/queue.md
@@ -2,5 +2,14 @@
Ordered input for `/register_and_iterate --queue`: one prompt path per line,
processed top to bottom. Done entries are prepended with `# DONE ` rather
-than deleted, preserving order history. Currently empty — the pytree-variant
-queue that lived here was fully consumed on 2026-04-19 (see git history).
+than deleted, preserving order history.
+
+## aplt-output-drift follow-ups (queued 2026-08-24)
+
+The three items `aplt-output-drift-remaining-repos` (PyAutoGalaxy#585) filed
+rather than fixed. Independent of each other — different repos, different work
+types — so they are three prompts and three PRs, ordered cheapest-risk first.
+
+draft/maintenance/autocti_workspace_test/imaging_ci_heritage_sweep.md
+draft/refactor/autoarray/shared_log_norm_helper.md
+draft/maintenance/workspaces/euclid_crlf_line_endings.md