| autofit_workspace/config/general.yaml |
hpc.live_visual_update, hpc.quick_update_background |
DELETE |
PyAutoFit reads updates.* (abstract_search.py:240-251), not hpc.* |
| autofit_workspace/config/general.yaml |
test.check_preloads, test.preloads_check_threshold |
DELETE |
preloads check removed; nothing reads them |
| autofit_workspace/config/general.yaml |
version.minimum_library_version, version.workspace_version_check |
KEEP-WS |
read by autonerves (workspace.py / init.py); board allow-list |
| autofit_workspace/config/visualize/plots_search.yaml |
mle.corner_cornerpy |
DELETE |
not read |
| autogalaxy_workspace/config/general.yaml |
hpc.live_visual_update, hpc.quick_update_background |
DELETE |
read from updates.* |
| autogalaxy_workspace/config/general.yaml |
test.disable_positions_lh_inversion_check |
DELETE |
only PyAutoLens reads it |
| autogalaxy_workspace/config/general.yaml |
version.minimum_library_version, version.workspace_version_check |
KEEP-WS |
autonerves; allow-list |
| autogalaxy_workspace/config/notation.yaml |
label.contribution_factor, label_format.contribution_factor |
DELETE |
param no longer exists |
| autogalaxy_workspace/config/visualize/general.yaml |
subplot_shape.{1,2,4,6,9,12,16,20,36,49,64,81,100} (13) |
DELETE |
table not read |
| autogalaxy_workspace/config/visualize/general.yaml |
subplot_shape_to_figsize_factor |
FIX (delete) |
top level is never read; PyAutoArray reads mat_plot.figure.*, which equals the library default |
| autogalaxy_workspace/config/visualize/plots.yaml:30 |
fit_imaging {}: |
FIX |
malformed key → fit_imaging: {} |
| autolens_workspace/config/general.yaml |
hpc.live_visual_update, hpc.quick_update_background |
DELETE |
read from updates.* |
| autolens_workspace/config/general.yaml |
version.minimum_library_version, version.python_version_check, version.workspace_version_check |
KEEP-WS |
autonerves; allow-list |
| autolens_workspace/config/notation.yaml |
label.contribution_factor, label_format.contribution_factor, label.sigma_scale |
DELETE |
params no longer exist |
| autolens_workspace/config/notation.yaml |
superscript.hyperbackgroundnoise, hypergalaxy, hyperimagesky |
DELETE |
hyper classes removed |
| autolens_workspace/config/notation.yaml |
label.ra, label.rs, label_format.ra, label_format.rs |
PROMOTE |
dPIE params read by the library; add to PyAutoGalaxy notation.yaml, then delete here |
| autolens_workspace/config/priors/mesh/delaunay.yaml |
Delaunay.areas_factor |
PROMOTE |
the PyAutoGalaxy prior file is a bare Delaunay:, so "areas_factor Prior Missing" |
| autolens_workspace/config/visualize/general.yaml |
subplot_shape.* (13) |
DELETE |
not read |
| autolens_workspace/config/visualize/general.yaml |
subplot_shape_to_figsize_factor |
FIX (delete) |
as above |
| autocti_workspace/config/general.yaml |
analysis.n_cores, analysis.preload_attempts, profiling.should_profile, test.check_preloads, test.disable_positions_lh_inversion_check, test.preloads_check_threshold |
DELETE |
not read by PyAutoCTI |
| autocti_workspace/config/visualize/general.yaml |
general.subplot_ascending_fpr, general.symmetric_cmap_value |
FIX (board) |
false positive: PyAutoCTI ships a single visualize.yaml and autonerves merges the directory form |
| autocti_workspace/config/visualize/plots.yaml |
combined_only, dataset.{data,data_binned,data_logy,fpr_non_uniformity,subplot_dataset_regions}, fit.{data_logy,fits_fit,residual_map_logy,subplot_fit_regions}, subplot_format (11) |
FIX (board) |
same false positive |
| autocti_workspace/config/visualize/plots_search.yaml |
mle.corner_cornerpy |
DELETE |
not read |
Overview
The Nerves board (PyAutoNerves#175) marks 14 workspace config files YELLOW for 79 "orphan" keys. An orphan is a key a workspace sets that no library's default YAML defines, which is not the same as a key nothing reads. A per-key classification, with the reading code checked, splits them into DELETE 51 / KEEP-WS 7 / PROMOTE 5 / FIX 16. The approved approach is library-first: fix the board (directory/file equivalence plus an autonerves allow-list), promote the 5 keys into PyAutoGalaxy, then delete the dead workspace keys. Target: 0 orphans.
Plan
scripts/board.py: when a library shipsX.yamland the workspace uses anX/directory (or the reverse), compare section by section, the same way autonerves merges them. This clears the 13 CTI false positives. Add aNERVES_OWNEDallow-list for theversion.*keys that autonerves itself reads, which clears the 7 KEEP-WS keys.ra/rsnotation label and label_format entries, and addareas_factor: Constant 0.5topriors/mesh/delaunay.yaml. The second change fixes "areas_factor Prior Missing" foraf.Model(al.mesh.Delaunay). Unit tests are included.subplot_shape_to_figsize_factor.fit_imaging {}:in autogalaxy_workspace.python3 scripts/board.py --jsonreports 0 orphan files, and each workspace's start_here/smoke scripts still load their config.Detailed implementation plan
Affected Repositories
Branch Survey
Suggested branch:
feature/workspace-config-cleanup, worktree~/Code/PyAutoLabs-wt/workspace-config-cleanup/.Parallel claim: PyAutoNerves is also claimed by
eyes-organ-order(PyAutoMind#439). Its Nerves diff is onlyAGENTS.md, so it does not overlap withscripts/board.py. The human approved a parallel worktree on 2026-09-27.Implementation Steps
scripts/board.py:build_snapshot/diff_against_stack, handle file↔directory equivalence: a libraryX.yamlsection<f>corresponds to the workspace fileX/<f>.yaml, and the reverse. The semantics mirror autonervesRecursiveConfig.NERVES_OWNEDallow-list forgeneral.yamlversion.{workspace_version, minimum_library_version, workspace_version_check, python_version_check}. These are excluded from orphans and noted "owned by autonerves".autogalaxy/config/notation.yaml: addlabel.ra/rsandlabel_format.ra/rs, using the autolens_workspace values.autogalaxy/config/priors/mesh/delaunay.yaml: addareas_factoras a Constant 0.5, which matches theDelaunay(areas_factor=0.5)default.ralabel is not the first-letter fallback./ship_library).subplot_shape_to_figsize_factor(it equals the library default ofmat_plot.figure.*) and the PROMOTE keys in autolens_workspace.fit_imaging: {}./ship_workspace), then/prm, then dispatchnerves_board.ymland re-check the published board.Per-key verdicts (79)
updates.*(abstract_search.py:240-251), nothpc.*updates.*mat_plot.figure.*, which equals the library defaultfit_imaging {}:fit_imaging: {}updates.*Delaunay:, so "areas_factor Prior Missing"visualize.yamland autonerves merges the directory formTotals: DELETE 51, KEEP-WS 7, PROMOTE 5, FIX 16 (13 CTI board false positives, 2 ×
subplot_shape_to_figsize_factor, 1fit_imagingtypo).Out of scope: library-side unused keys (human-review-gated, NOT removed here)
config/non_linear.yaml: the dead 57-keynest.DynestyStatic/nest.DynestyDynamicblock.general.yaml:output.fit_dill.general.yaml:output.log_level,output.log_to_file,output.log_file,output.search_internalandprofiling.repeats. These may be read dynamically.non_linear/GridSearch.yaml:parallel,parallel.number_of_coresandparallel.step_size.general.yaml:numba.use_numba.general.yaml:adapt.adapt_noise_limit.general.yaml:fits.flip_for_ds9,hpc.iterations_per_update,model.ignore_prior_limits,output.log_file,output.log_levelandoutput.log_to_file.Remove any of these only on explicit human confirmation, as a separate library prompt.
Key Files
PyAutoNerves/scripts/board.py: board snapshot, stack diff, orphansPyAutoNerves/autonerves/directory_config.py,autonerves/conf.py: the merge semantics to mirrorPyAutoGalaxy/autogalaxy/config/notation.yaml,autogalaxy/config/priors/mesh/delaunay.yamlconfig/trees listed in the tableOriginal Prompt
Click to expand starting prompt
Workspace config cleanup: remove orphan config keys the Nerves board flags
Type: maintenance
Target: workspaces
Repos:
Difficulty: small
Autonomy: supervised
Priority: normal
Status: formalised
Consequence: glance
Witness: after the change, a local Nerves board render (
python3 scripts/board.py --jsonin PyAutoNerves) reports 0 workspace files with orphan keys (down from 14 files / 79 keys), except any key this task keeps with a recorded reason; each touched workspace's start_here/smoke scripts still load their config with no config-key error.Review-minutes: 3
Unattended: ready
Filed: 2026-09-27
Epic: organ-cockpit
Lane: local-dev
Why
The Nerves board (PyAutoNerves#175, shipped 2026-09-27 in the cockpit-followups bundle) now lists
workspace config keys that no library in the stack defines. On the 2026-09-27 render
(https://pyautolabs.github.io/PyAutoNerves/) the board is YELLOW with 14 workspace config files
carrying 79 orphan keys. They are dead settings that mislead users who edit them expecting an effect.
The orphan keys (workspace side — in scope)
Before deleting each key, grep the workspace itself (scripts, notebooks,
start_here.py, anyworkspace-local helper) for a reader: the board only checks library code, so a key read by the
workspace's own code (possibly the
version.*keys via the version handshake in autonerves, orsubplot_shape.*read by an integer lookup) is not an orphan. Keep any such key and record why.Mirror the removals into the matching notebooks/markdown only if they carry config snippets.
The typo
autogalaxy_workspace/config/visualize/plots.yaml:30hasfit_imaging {}:— a malformed key (the{}looks like a leftover flow-mapping), so thefit_imagingsection it was meant to open is notread. Fix it to the intended
fit_imaging:section (compare with autolens_workspace's plots.yaml),not just delete it.
Separate, human-review-gated: library-side unused keys (NOT in scope to remove without review)
The same scan flags library config keys no library code reads. These need a human to confirm
before removal, because a key may be read dynamically (string-built lookups the scan cannot see):
config/non_linear.yaml: a dead 57-keynest.DynestyStatic/nest.DynestyDynamicblock (Dynesty searches live in PyAutoFit's config; PyAutoLens's copy is not read).
general.yaml:output.fit_dill.general.yaml:output.log_level,output.log_to_file,output.log_file,output.search_internal,profiling.repeats(may be read dynamically — needs review);non_linear/GridSearch.yaml:parallel,parallel.number_of_cores,parallel.step_size.general.yaml:numba.use_numba; PyAutoGalaxygeneral.yaml:adapt.adapt_noise_limit.general.yaml:fits.flip_for_ds9,hpc.iterations_per_update,model.ignore_prior_limits,output.log_file,output.log_level,output.log_to_file.Present this list to the human; remove only what they confirm, as a library change shipped before
the workspace edits (library-first), or re-file it as its own library prompt.
Related prompts
draft/maintenance/workspaces/config_key_mirror_drift.md— the opposite direction (library keysmissing from workspace configs); do both in one pass if picked up together, and do not re-add a
key this task removes.
draft/maintenance/workspaces/sync_remaining_workspace_config_priors_copies.md.