Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .claude/hooks/validate_pyauto_code.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@
# kernel_2d module path. Mirrors ALIAS_TO_MODULE in autoassistant/audit_skill_apis.py.
_ALIASES = (
"aplt",
"autoconf",
"autonerves",
"autoarray",
"autofit",
"autogalaxy",
Expand Down
2 changes: 1 addition & 1 deletion .claude/skills/_bootstrap_skill.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ touch. Common patterns:
- New profile / model object β†’ `PyAutoGalaxy` + `PyAutoCTI`.
- New non-linear search / inference feature β†’ `PyAutoFit`.
- New data structure (grid, mask, geometry) β†’ `PyAutoArray`.
- New configuration option β†’ `PyAutoConf` + the package whose config you're touching.
- New configuration option β†’ `PyAutoNerves` + the package whose config you're touching.

If the new skill needs a repo not in `sources.yaml`, add it there first (with a `name`,
`import`, `role`, and `git` URL) and tell the user what you added.
Expand Down
2 changes: 1 addition & 1 deletion .claude/skills/start-new-project.md
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ Create `<NEW_PROJECT>/` and populate it. **Do not `rsync` the assistant.** Copy
reproducible-science subset; generate the thin assistant layer; refer back for everything else.

**Copy from the assistant into the project** (the science needs these to run):
- `config/` (PyAutoConf YAML β€” required: pipelines `conf.instance.push(config, output)`)
- `config/` (PyAutoNerves YAML β€” required: pipelines `conf.instance.push(config, output)`)
- `activate.sh` (sourced locally and by HPC batch scripts)
- `scripts/` (the chosen pipeline(s), or empty + `/init-slam` later)
- datasets (Step 3) into `dataset/<sample>/...` β€” **`dataset/`, not `data/`** (workspace
Expand Down
14 changes: 7 additions & 7 deletions .github/workflows/wiki-currency.yml
Original file line number Diff line number Diff line change
Expand Up @@ -71,12 +71,12 @@ jobs:
# its cited surface (scripts/ + root catalogues) to skip the dataset blobs.
#
# PyAutoGalaxy is deliberately NOT cloned: it is not part of the CTI stack
# (autocti depends on autoconf/autoarray/autofit only). See the autogalaxy
# (autocti depends on autonerves/autoarray/autofit only). See the autogalaxy
# note in autoassistant/audit_skill_apis.py.
- name: Clone cited source trees (citation + install ground truth)
run: |
mkdir -p sources
for repo in PyAutoConf PyAutoArray PyAutoFit PyAutoCTI; do
for repo in PyAutoNerves PyAutoArray PyAutoFit PyAutoCTI; do
git clone --quiet --depth 1 "https://github.com/PyAutoLabs/$repo" "sources/$repo"
done
git clone --quiet --depth 1 --filter=blob:none --sparse \
Expand Down Expand Up @@ -107,15 +107,15 @@ jobs:

VER="${{ inputs.stack_version }}"
if [ -n "$VER" ]; then
echo "Installing pinned release autocti==$VER (pulls autoconf/autoarray/autofit)."
echo "Installing pinned release autocti==$VER (pulls autonerves/autoarray/autofit)."
pip install "autocti==$VER"
else
echo "Installing the CTI stack from the main source clones."
pip install ./sources/PyAutoConf ./sources/PyAutoFit ./sources/PyAutoArray ./sources/PyAutoCTI
pip install ./sources/PyAutoNerves ./sources/PyAutoFit ./sources/PyAutoArray ./sources/PyAutoCTI
pip install "./sources/PyAutoArray[optional]"
# Re-resolution above can pull a stale autoconf from PyPI; pin the
# local source last so recent autoconf APIs stay importable.
pip install --force-reinstall --no-deps ./sources/PyAutoConf
# Re-resolution above can pull a stale autonerves from PyPI; pin the
# local source last so recent autonerves APIs stay importable.
pip install --force-reinstall --no-deps ./sources/PyAutoNerves
fi

- name: Run wiki-currency checks
Expand Down
2 changes: 1 addition & 1 deletion PENDING.md
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@ wiki page or dataset, in the reference's shape.
- [ ] `wiki/core/operations/installation.md` β€” regenerate for this domain (reference: `wiki/core/operations/installation.md`)
- [ ] `wiki/core/operations/sandbox.md` β€” regenerate for this domain (reference: `wiki/core/operations/sandbox.md`)
- [ ] `wiki/core/stack/autoarray.md` β€” regenerate for this domain (reference: `wiki/core/stack/autoarray.md`)
- [ ] `wiki/core/stack/autoconf.md` β€” regenerate for this domain (reference: `wiki/core/stack/autoconf.md`)
- [ ] `wiki/core/stack/autonerves.md` β€” regenerate for this domain (reference: `wiki/core/stack/autonerves.md`)
- [ ] `wiki/core/stack/autofit.md` β€” regenerate for this domain (reference: `wiki/core/stack/autofit.md`)
- [ ] `wiki/core/stack/autogalaxy.md` β€” regenerate for this domain (reference: `wiki/core/stack/autogalaxy.md`)
- [ ] `wiki/core/stack/autocti.md` β€” regenerate for this domain (reference: `wiki/core/stack/autolens.md`)
Expand Down
4 changes: 2 additions & 2 deletions activate.sh
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ elif [ -n "${PYAUTO_HPC_BASE:-}" ] && [ -f "$PYAUTO_HPC_BASE/PyAuto/bin/activate
BASE="$PYAUTO_HPC_BASE"
source "$BASE/PyAuto/bin/activate"
export PYTHONPATH=$BASE:\
$BASE/PyAutoConf:\
$BASE/PyAutoNerves:\
$BASE/PyAutoFit:\
$BASE/PyAutoArray:\
$BASE/PyAutoGalaxy:\
Expand All @@ -33,7 +33,7 @@ fi
#
# SRC=~/Code/PyAutoLabs
# export PYTHONPATH=$SRC:\
# $SRC/PyAutoConf:\
# $SRC/PyAutoNerves:\
# $SRC/PyAutoFit:\
# $SRC/PyAutoArray:\
# $SRC/PyAutoGalaxy:\
Expand Down
16 changes: 8 additions & 8 deletions autoassistant/audit_skill_apis.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@

try:
import yaml
except ImportError: # pragma: no cover - yaml ships with the stack (autoconf dep)
except ImportError: # pragma: no cover - yaml ships with the stack (autonerves dep)
yaml = None

# ---------------------------------------------------------------------------
Expand All @@ -58,19 +58,19 @@
# Modules whose public surface we hash. The five library roots carry
# `__version__`; `autocti.plot` is hashed too (it is where the plot API lives)
# but inherits the autocti version.
# The CTI stack is autoconf/autoarray/autofit/autocti (autocti's declared deps;
# The CTI stack is autonerves/autoarray/autofit/autocti (autocti's declared deps;
# autogalaxy is NOT one β€” autolens sits on autogalaxy, autocti does not). Probing
# autogalaxy here would make --check-version exit `not_installed` for a correctly
# configured CTI user at session start.
BASELINE_MODULES: tuple[str, ...] = (
"autoconf",
"autonerves",
"autoarray",
"autofit",
"autocti",
"autocti.plot",
)
VERSIONED_MODULES: tuple[str, ...] = (
"autoconf",
"autonerves",
"autoarray",
"autofit",
"autocti",
Expand All @@ -90,7 +90,7 @@
"af": "autofit",
"ag": "autogalaxy",
"aa": "autoarray",
"autoconf": "autoconf",
"autonerves": "autonerves",
"autoarray": "autoarray",
"autofit": "autofit",
"autogalaxy": "autogalaxy",
Expand Down Expand Up @@ -390,7 +390,7 @@ def _cross_module_candidates(leaf: str) -> list[str]:
if leaf in _cross_cache:
return _cross_cache[leaf]
hits: list[str] = []
for mod_name in ("autoconf", "autoarray", "autofit", "autocti"):
for mod_name in ("autonerves", "autoarray", "autofit", "autocti"):
root = _module_cache.get(mod_name)
if root is None:
try:
Expand Down Expand Up @@ -596,7 +596,7 @@ def render_report(
# ---------------------------------------------------------------------------
def gather_versions() -> dict[str, str]:
out: dict[str, str] = {}
for name in ("autoconf", "autoarray", "autofit", "autocti"):
for name in ("autonerves", "autoarray", "autofit", "autocti"):
try:
mod = importlib.import_module(name)
except Exception as e: # noqa: BLE001
Expand Down Expand Up @@ -885,7 +885,7 @@ def check_version(root: Path) -> int:
# `main`-pinned pages that predate the discipline.
# ---------------------------------------------------------------------------
PROJECT_IMPORT: dict[str, str] = {
"PyAutoConf": "autoconf",
"PyAutoNerves": "autonerves",
"PyAutoArray": "autoarray",
"PyAutoFit": "autofit",
"PyAutoGalaxy": "autogalaxy",
Expand Down
2 changes: 1 addition & 1 deletion autoassistant/benchmark.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
RUNS_DIRNAME = "runs"
BENCHMARKS_DIRNAME = "benchmarks"

STACK_PACKAGES = ("autocti", "autofit", "autoarray", "autoconf")
STACK_PACKAGES = ("autocti", "autofit", "autoarray", "autonerves")

FRONTMATTER = re.compile(r"\A---\n(.*?)\n---\n", re.DOTALL)
RUBRIC_ROW = re.compile(r"^\|\s*(M\d+|J\d+)\s*\|\s*(.+?)\s*\|\s*(\d+)\s*\|\s*$")
Expand Down
2 changes: 1 addition & 1 deletion autoassistant/mcp/tools.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
import sys
from pathlib import Path

from autoconf.dictable import to_dict
from autonerves.dictable import to_dict

import autofit as af

Expand Down
2 changes: 1 addition & 1 deletion autoassistant/refresh_api_docs.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@


MODULES = (
("autoconf", "autoconf"),
("autonerves", "autonerves"),
("autoarray", "autoarray"),
("autofit", "autofit"),
("autogalaxy", "autogalaxy"),
Expand Down
4 changes: 2 additions & 2 deletions autoassistant/tests/test_api_gate.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@

GOOD = "import autocti.plot as aplt; aplt.subplot_fit_imaging(fit=fit)"
GOOD_SUBMODULE = "import autofit.jax.pytrees as pytrees"
GOOD_AUTOCONF_SUBMODULE = "import autoconf.dictable"
GOOD_AUTOCONF_SUBMODULE = "import autonerves.dictable"
STALE_PLOTTER = "import autocti as al; al.FitImagingPlotter(fit=fit).subplot_fit()"
STALE_KERNEL = "from autoarray.structures.arrays.kernel_2d import Kernel2D"

Expand Down Expand Up @@ -90,7 +90,7 @@ def test_validator_passes_current_submodule_import():
assert _run_validator("--code", GOOD_SUBMODULE).returncode == 0


def test_validator_passes_autoconf_submodule_import():
def test_validator_passes_autonerves_submodule_import():
assert _run_validator("--code", GOOD_AUTOCONF_SUBMODULE).returncode == 0


Expand Down
2 changes: 1 addition & 1 deletion autoassistant/tests/test_install_preflight.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ def test_install_preflight_distinguishes_absent_stack():


def test_install_preflight_distinguishes_broken_import(tmp_path):
for package in ("autoconf", "autoarray", "autofit", "autogalaxy", "autocti"):
for package in ("autonerves", "autoarray", "autofit", "autogalaxy", "autocti"):
package_path = tmp_path / package
package_path.mkdir()
body = (
Expand Down
2 changes: 1 addition & 1 deletion autoassistant/tests/test_mcp_tools.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@

import autofit as af
import autocti as al
from autoconf import conf
from autonerves import conf
from autofit.aggregator.summary.aggregate_images import subplot_filename

from autoassistant.mcp import lens_tools, tools
Expand Down
2 changes: 1 addition & 1 deletion config/general.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,6 @@ test:
lh_timeout_seconds: # If a float is input, the log_likelihood_function call is timed out after this many seconds, to diagnose infinite loops. Default is None, meaning no timeout.
disable_positions_lh_inversion_check: true
version:
python_version_check: True # If False, bypass the PyAutoConf Python 3.12+ recommendation (3.9/3.10/3.11 technically work but are not officially supported).
python_version_check: True # If False, bypass the PyAutoNerves Python 3.12+ recommendation (3.9/3.10/3.11 technically work but are not officially supported).
workspace_version: 2026.7.9.1
workspace_version_check: True # If False, bypass the workspace/library version check. Set to False on `main`-branch clones β€” `main` updates faster than releases, so mismatches are expected and not actionable.
2 changes: 1 addition & 1 deletion skills/_bootstrap_skill.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ touch. Common patterns:
- New profile / model object β†’ `PyAutoGalaxy` + `PyAutoCTI`.
- New non-linear search / inference feature β†’ `PyAutoFit`.
- New data structure (grid, mask, geometry) β†’ `PyAutoArray`.
- New configuration option β†’ `PyAutoConf` + the package whose config you're touching.
- New configuration option β†’ `PyAutoNerves` + the package whose config you're touching.

If the new skill needs a repo not in `sources.yaml`, add it there first (with a `name`,
`import`, `role`, and `git` URL) and tell the user what you added.
Expand Down
10 changes: 5 additions & 5 deletions skills/ac_setup_environment.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ description: Install and verify the PyAutoCTI stack, including arcticpy β€” the
# Setting up the PyAutoCTI environment

Before any simulate/fit/correct work runs, the interpreter needs a working CTI
stack: `autoconf`, `autoarray`, `autofit`, `autocti`, and β€” the part that trips
stack: `autonerves`, `autoarray`, `autofit`, `autocti`, and β€” the part that trips
almost everyone β€” **arcticpy**, the C++ *arctic* clocking code that `Clocker1D`
and `Clocker2D` wrap. `import autocti` fails without it, yet `pip install
autocti` does **not** pull it. This skill is how you get past that cleanly.
Expand Down Expand Up @@ -90,15 +90,15 @@ installing)".
Running against the `main` source checkouts instead of a PyPI release (what
`activate.sh`'s developer block and the `wiki-currency` CI do): install the
same arctic prefix (steps 1–3), then the local repos in dependency order, and
pin autoconf last so a re-resolution can't replace it with a stale wheel:
pin autonerves last so a re-resolution can't replace it with a stale wheel:

```bash
pip install ./PyAutoConf ./PyAutoFit ./PyAutoArray ./PyAutoCTI
pip install ./PyAutoNerves ./PyAutoFit ./PyAutoArray ./PyAutoCTI
pip install "./PyAutoArray[optional]"
pip install --force-reinstall --no-deps ./PyAutoConf
pip install --force-reinstall --no-deps ./PyAutoNerves
```

Note the CTI stack is **autoconf/autoarray/autofit/autocti** β€” it does *not*
Note the CTI stack is **autonerves/autoarray/autofit/autocti** β€” it does *not*
include autogalaxy (that is the lensing stack). Don't install or expect it.

## Verify
Expand Down
2 changes: 1 addition & 1 deletion skills/start-new-project.md
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ Create `<NEW_PROJECT>/` and populate it. **Do not `rsync` the assistant.** Copy
reproducible-science subset; generate the thin assistant layer; refer back for everything else.

**Copy from the assistant into the project** (the science needs these to run):
- `config/` (PyAutoConf YAML β€” required: pipelines `conf.instance.push(config, output)`)
- `config/` (PyAutoNerves YAML β€” required: pipelines `conf.instance.push(config, output)`)
- `activate.sh` (sourced locally and by HPC batch scripts)
- `scripts/` (the chosen pipeline(s), or empty + `/init-slam` later)
- datasets (Step 3) into `dataset/<sample>/...` β€” **`dataset/`, not `data/`** (workspace
Expand Down
8 changes: 4 additions & 4 deletions sources.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@
# the reference branch.

projects:
- name: PyAutoConf
import: autoconf
- name: PyAutoNerves
import: autonerves
role: config # YAML config loading, prior resolution
git: https://github.com/PyAutoLabs/PyAutoConf
git: https://github.com/PyAutoLabs/PyAutoNerves

- name: PyAutoArray
import: autoarray
Expand Down Expand Up @@ -57,7 +57,7 @@ projects:
# Dependency chain (top-to-bottom). Skills target the top; lower layers
# surface in the wiki when the user needs to understand them.
dependency_chain:
- PyAutoConf
- PyAutoNerves
- PyAutoArray
- PyAutoFit
- PyAutoGalaxy
Expand Down
18 changes: 9 additions & 9 deletions wiki/core/api_audit_baseline.json
Original file line number Diff line number Diff line change
@@ -1,28 +1,28 @@
{
"_comment": "API baseline for autocti_assistant - see autoassistant/audit_skill_apis.py and skills/ac_audit_skill_apis.md. Regenerate with --write-baseline.",
"generated": "2026-07-17",
"generated": "2026-07-19",
"versions": {
"autoconf": "2026.7.9.1",
"autonerves": "2026.7.9.1",
"autoarray": "2026.7.9.1",
"autofit": "2026.7.9.1",
"autocti": "2024.11.13.2"
},
"api_surface": {
"autoconf": {
"autonerves": {
"hash": "7bd5c3b0830f6a87158e90563cd2b65d3484482df75c125376506c160ce1074e",
"n_symbols": 32
},
"autoarray": {
"hash": "dfd1365821a3df8bd3c94b225378a2bef399ae0f18c11c6cd286e990fd416216",
"n_symbols": 107
"hash": "c5ff43af7c8505687f9bcb0b45aff32f05996f777b19321c8b14bc382e379ba5",
"n_symbols": 121
},
"autofit": {
"hash": "141cb9b8a13b9074957c5570086b761e033aa7993609a55a3bcd21cc77ea3d64",
"n_symbols": 128
"hash": "1d9f01f2162cfd268d225f4e1caad80ab0c8d874036a401eba93fcffdee8a896",
"n_symbols": 147
},
"autocti": {
"hash": "0ef66b5833a4bb1ae96653546dcac3a6bae4a2f16312012f485ba65f7480ef28",
"n_symbols": 87
"hash": "32d9b246f2472e3a479cb2e5728e91e877c2cf472a9888cfd6632fc9947f8b7d",
"n_symbols": 103
},
"autocti.plot": {
"hash": "a589671b0d00039c63e4dcb6fb00465857bf090e5d86a2f142fe6ab3a188f0e4",
Expand Down
2 changes: 1 addition & 1 deletion wiki/core/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ missions, and the software β€” see the [literature wiki](../literature/index.md)
## The stack

PyAutoCTI is built on the shared PyAuto\* libraries. The dependency chain is
**autoconf** (config) β†’ **autoarray** (data structures) β†’ **autofit** (model
**autonerves** (config) β†’ **autoarray** (data structures) β†’ **autofit** (model
fitting) β†’ **autocti** (CTI). It does *not* depend on autogalaxy β€” that is the
lensing stack.

Expand Down
Loading