From e9f2f8b12159a8403e6e26d432d25ba095bd8364 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 18 Jul 2026 17:46:29 +0000 Subject: [PATCH 1/3] =?UTF-8?q?refactor:=20rename=20PyAutoBuild=20?= =?UTF-8?q?=E2=86=92=20PyAutoHands=20(Brain=20resolvers,=20slugs,=20docs)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Part of the PyAutoBuild → PyAutoHands repository rename. Updates PyAutoBrain's references now that the repo (and a fresh clone's sibling directory) is PyAutoHands: - agents/_common.sh resolve_autobuild → `PyAutoHands/bin/autobuild` (the `autobuild` binary name is unchanged — only the directory prefix). - release nightly/rehearse `BUILD_REPO`/`BRAIN_REPO` slugs → PyAutoLabs/PyAutoHands; build.sh; bin/install.sh (BUILD_SKILLS_DIR path, ORGAN_REPOS, DISCOVERY_REPOS); overnight_status.sh; hygiene.sh; _clone.py clone_seed path. - intake/bug target-map VALUES "PyAutoBuild" → "PyAutoHands" (lowercase alias keys pyautobuild/autobuild kept for back-compat). - ORGANISM.md Hands row + the rename note; docs/organs, agent AGENTS.md prose, the generated verb-table `build` row (synced to bin/pyauto-brain), skills. - tests: sizing/commit-guard/activity-gate path + assertion strings. Kept: the "Build" organ shorthand and `Brain → Heart (gate) → Build (execute)` call chain; `PyAutoBuild#NNN` issue links; policy.yaml lowercase package aliases. Generated organism-map + verb-table surfaces verified (repos_sync --check, install.sh --check-agents-surface). Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01JsYpZBw74w5g1kAqpWEAiE --- .github/workflows/nightly-release.yml | 4 +-- AGENTS.md | 8 +++--- AUTONOMY.md | 2 +- CONTRIBUTING.md | 2 +- ORGANISM.md | 10 ++++--- README.md | 2 +- agents/_common.sh | 2 +- agents/conductors/bug/AGENTS.md | 6 ++--- agents/conductors/bug/BUG_TAXONOMY.md | 4 +-- agents/conductors/bug/_bug.py | 2 +- agents/conductors/build/AGENTS.md | 26 +++++++++---------- agents/conductors/build/BUILD_CAPABILITIES.md | 26 +++++++++---------- agents/conductors/build/build.sh | 10 +++---- agents/conductors/clone/AGENTS.md | 2 +- agents/conductors/clone/DESIGN.md | 10 +++---- agents/conductors/clone/_clone.py | 4 +-- agents/conductors/feature/AGENTS.md | 2 +- agents/conductors/feature/MIND_TAXONOMY.md | 2 +- agents/conductors/hygiene/AGENTS.md | 2 +- agents/conductors/hygiene/hygiene.sh | 2 +- agents/conductors/intake/_intake.py | 4 +-- agents/conductors/release/AGENTS.md | 4 +-- agents/conductors/release/activity_gate.py | 2 +- agents/conductors/release/nightly.sh | 8 +++--- agents/conductors/release/rehearse.sh | 2 +- agents/conductors/release/release.sh | 2 +- agents/conductors/workspace/AGENTS.md | 2 +- agents/conductors/workspace/_workspace.py | 4 +-- agents/faculties/vitals/AGENTS.md | 4 +-- agents/faculties/vitals/HEART_CAPABILITIES.md | 8 +++--- bin/README.md | 2 +- bin/check_skill_line_counts.sh | 2 +- bin/install.sh | 12 ++++----- bin/mind_commit_guard.py | 4 +-- bin/overnight_status.sh | 2 +- bin/pyauto-brain | 4 +-- docs/concepts/organism.md | 2 +- docs/organs/build.md | 4 +-- skills/COMMANDS.md | 2 +- skills/WORKFLOW.md | 2 +- skills/build/SKILL.md | 2 +- skills/build/build.md | 4 +-- skills/health/health.md | 2 +- skills/repo_cleanup/SKILL.md | 4 +-- skills/ship_library/reference.md | 2 +- tests/test_activity_gate.py | 2 +- tests/test_mind_commit_guard.py | 10 +++---- tests/test_sizing_paths.py | 20 +++++++------- 48 files changed, 126 insertions(+), 124 deletions(-) diff --git a/.github/workflows/nightly-release.yml b/.github/workflows/nightly-release.yml index 92eb7fb..8826204 100644 --- a/.github/workflows/nightly-release.yml +++ b/.github/workflows/nightly-release.yml @@ -1,13 +1,13 @@ name: Nightly Release -# The scheduled-nightly release driver (PyAutoBuild/docs/nightly_release_design.md +# The scheduled-nightly release driver (PyAutoHands/docs/nightly_release_design.md # §3) — the ONLY path authorised to ship a live PyPI release without a # per-release human, under PyAutoBrain/AUTONOMY.md's standing grant (2026-07-09). # # This workflow is a scheduler, nothing more: all sequencing, gating and # notification logic lives in agents/conductors/release/nightly.sh (testable # locally via `pyauto-brain release nightly`). Scheduling authority moved HERE -# from PyAutoBuild's release.yml (whose cron was removed in the same change) — +# from PyAutoHands's release.yml (whose cron was removed in the same change) — # Build executes releases, it does not decide when. # # Arming (design §9, all human acts, in order): diff --git a/AGENTS.md b/AGENTS.md index ae6b392..418f1bd 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -3,7 +3,7 @@ This file is for AI coding agents (Claude Code, Codex, Cursor, etc.) and humans discovering this repository. It is the canonical description of PyAutoBrain — the **reasoning layer** of the PyAuto organism — and of the Brain / Heart / Build -boundary; PyAutoBuild and PyAutoHeart point back here. +boundary; PyAutoHands and PyAutoHeart point back here. ## The organism map @@ -18,7 +18,7 @@ Canonical boundaries live in `PyAutoBrain/ORGANISM.md`; the full body map |-------|------|------| | **Mind** | PyAutoMind | Intent, goals, priorities, workflow state; every task starts as a markdown prompt here. | | **Brain** | PyAutoBrain | Reasoning/orchestration layer; how work is decomposed and routed; the specialist agents. | -| **Hands** | PyAutoBuild | Packaging, tagging, notebook generation, PyPI release execution. | +| **Hands** | PyAutoHands | Packaging, tagging, notebook generation, PyPI release execution. | | **Heart** | PyAutoHeart | Health/readiness — the authoritative "is it safe to release?" verdict. | | **Memory** | PyAutoMemory | Long-term scientific/software/project knowledge (see science pointer below). | | **Gut** | PyAutoGut | Owns the lifecycle of condemned self-material (stale branches, stashes, dead code/tests): holds it as durable, recoverable git refs through a transit window and voids it on a sweep. The storage mirror of Memory (retention vs release). | @@ -40,7 +40,7 @@ the right points. PyAutoBrain owns **no state, no health checks, and no execution mechanics**. It only *reasons* and *delegates*: it asks PyAutoHeart whether the organism is -healthy, decides whether and how to proceed, and tells PyAutoBuild to execute +healthy, decides whether and how to proceed, and tells PyAutoHands to execute when it should. ## The organism @@ -141,7 +141,7 @@ the `/` slash commands. | `profiling` | The proprioceptive function — the organism's sense of its own effort: campaign/ingest/triage plans over the autolens_profiling workspace — ProfilingDecision | `bin/pyauto-brain profiling` | | `hygiene` | The maintenance function — the organism's sense of its own upkeep: code-quality debt (dev-loop cost + tidiness), delegating fixes — HygieneDecision | `bin/pyauto-brain hygiene` | | `clone` | The Mitosis Agent: partition the reference assistant, analyze the domain, emit the CloneDecision; --apply --mode lightweight-seed delegates the seed birth to Build | `bin/pyauto-brain clone` | -| `build` | Coordinate execution: consult the vitals faculty, then delegate to PyAutoBuild | `bin/pyauto-brain build` | +| `build` | Coordinate execution: consult the vitals faculty, then delegate to PyAutoHands | `bin/pyauto-brain build` | | `release` | Release door → the Build Agent release mode (single gate); 'release rehearse'/'release validate' drive release validation; 'release nightly' is the scheduled-nightly driver | `bin/pyauto-brain release` | | `health` | The organism's clinician: run the health loop with a human, dispatch by dispatch, toward green | `bin/pyauto-brain health` | diff --git a/AUTONOMY.md b/AUTONOMY.md index 6a27a9e..79e3b3b 100644 --- a/AUTONOMY.md +++ b/AUTONOMY.md @@ -80,7 +80,7 @@ exception to the release cap above — not a weakening of it. **Scope — the grant attaches to the schedule, not to the pipeline:** - It covers exactly the scheduled nightly driver defined in - `PyAutoBuild/docs/nightly_release_design.md`: activity-gated (quiet nights + `PyAutoHands/docs/nightly_release_design.md`: activity-gated (quiet nights skip, loudly), Heart-GREEN-gated (STALE/YELLOW/RED stop the run — on this path YELLOW is never acknowledged by anyone; there is no force input), and kill-switchable (the `NIGHTLY_RELEASES` repo var). diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 796028a..8fa288e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,7 +1,7 @@ # Contributing The PyAutoScientist organs (PyAutoBrain, PyAutoMind, PyAutoHeart, -PyAutoBuild, PyAutoMemory) are a **living reference implementation** — the +PyAutoHands, PyAutoMemory) are a **living reference implementation** — the maintainer's daily working system, not a stable library. What that means in practice: diff --git a/ORGANISM.md b/ORGANISM.md index 9f64e2e..9424f47 100644 --- a/ORGANISM.md +++ b/ORGANISM.md @@ -15,15 +15,17 @@ organs plan, build, test and release it, and you make every judgment call. | **Mind** | PyAutoMind | Decides *what* — intent, goals, priorities, workflow state, the prompt registry and taxonomy. Also holds the body map (`repos.yaml`, the single source of repo identity). | | **Brain** | PyAutoBrain | Figures out *how* — reasoning, planning, decomposition, routing; hosts the specialist agents. Owns **no state, no health checks, no execution mechanics**. | | **Heart** | PyAutoHeart | Determines whether the organism is healthy. `pyauto-heart readiness` is the **authoritative** GREEN/YELLOW/RED "is it safe to release?" gate. An observer: never writes into other repos, never triggers Build. | -| **Hands** | PyAutoBuild | Builds and releases — packaging, tagging, notebook generation, PyPI via `release.yml`. A pure executor: runs no readiness checks and never re-derives a gate decision. | +| **Hands** | PyAutoHands | Builds and releases — packaging, tagging, notebook generation, PyPI via `release.yml`. A pure executor: runs no readiness checks and never re-derives a gate decision. | | **Memory** | PyAutoMemory | Long-term knowledge — *what the science says* (literature wikis, concepts, bibliographies). Operational history — *what the organism did* — lives in Mind (the `complete/` records, issues), not here. | | **Gut** | PyAutoGut | Owns the lifecycle of *condemned self-material* — stale branches, stashes, dead code/tests. Holds each as a durable, recoverable git ref through a transit window and **voids** it on a sweep. The storage mirror of Memory (retention ↔ release); the hygiene conductor drives it, as vitals reads Heart. | | **Nerves** | PyAutoConf | The configuration/serialization layer (`autoconf`) — layered config with overrides, the workspace↔library version handshake, `test_mode`, FITS/JSON I/O. Connects the organism's conventions to every library; the base layer the scientific libraries all import. The seventh organ. | -*Hands* and *Build* name the **same organ** (PyAutoBuild) throughout this +*Hands* and *Build* name the **same organ** (PyAutoHands) throughout this document: the organ is the **Hands**, and *Build* is the call-chain step it -performs. (The repo is still named `PyAutoBuild`; likewise `PyAutoConf` for the -Nerves — the repo renames are a later, mechanical follow-up.) +performs. (The Hands repo was renamed PyAutoBuild → PyAutoHands; the *Build* +call-chain shorthand and the `autobuild` package/CLI keep their names. +`PyAutoConf` likewise remains the Nerves repo's name, aligned with its +`autoconf` package.) The scientific libraries (PyAutoFit, PyAutoArray, PyAutoGalaxy, PyAutoLens) and the workspaces are **capabilities the organism uses, not organs**. The full diff --git a/README.md b/README.md index c8cbe7d..6394118 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ version: | Mind | PyAutoMind | what to do — intent, priorities, workflow state | | Brain | PyAutoBrain (this repo) | how to do it — reasoning, planning, routing | | Heart | PyAutoHeart | is it healthy — the release-readiness verdict | -| Hands | PyAutoBuild | do it — packaging, tagging, PyPI releases | +| Hands | PyAutoHands | do it — packaging, tagging, PyPI releases | | Memory | PyAutoMemory | what we know — long-term scientific knowledge | | Gut | PyAutoGut | what we shed — condemned branches, stashes and dead code, held recoverably then voided | diff --git a/agents/_common.sh b/agents/_common.sh index bac9b38..44d4e56 100755 --- a/agents/_common.sh +++ b/agents/_common.sh @@ -32,7 +32,7 @@ resolve_heart() { } resolve_autobuild() { - _resolve_bin autobuild "$PYAUTO_ROOT/PyAutoBuild/bin/autobuild" + _resolve_bin autobuild "$PYAUTO_ROOT/PyAutoHands/bin/autobuild" } # _resolve_dir — echo the path to a sibling PyAuto diff --git a/agents/conductors/bug/AGENTS.md b/agents/conductors/bug/AGENTS.md index 3a37fa9..bb936b8 100644 --- a/agents/conductors/bug/AGENTS.md +++ b/agents/conductors/bug/AGENTS.md @@ -32,7 +32,7 @@ decision. See [`BUG_TAXONOMY.md`](./BUG_TAXONOMY.md) for the full fix-locus rule ## It reasons; it does not build The Bug Agent never edits source, opens PRs, or runs builds — that is the existing -`start_dev` / `ship_*` workflow (and PyAutoBuild at release). It never *runs* tests or +`start_dev` / `ship_*` workflow (and PyAutoHands at release). It never *runs* tests or health checks either: reproduction means **identifying** the repro command or the Heart check, and validation is delegated to the vitals faculty. It emits a `BugDecision`; the workflow acts on it. @@ -63,7 +63,7 @@ so (`rehome_suggestion`) instead of planning a fix. The bug can come from PyAutoHeart. `bug.sh health` gathers both signals and hands them to `_bug.py`, which emits a first-pass **category hint** per finding (real-bug / config / flaky / expected) that the reasoning layer confirms before deciding whether the fix -belongs in the affected repo, PyAutoHeart, PyAutoBuild or PyAutoBrain: +belongs in the affected repo, PyAutoHeart, PyAutoHands or PyAutoBrain: 1. the **live vitals verdict** — via the vitals faculty (never Heart directly); 2. the **filed PyAutoHeart issues** — `gh issue list --repo PyAutoLabs/PyAutoHeart` @@ -121,7 +121,7 @@ clean seam, exactly as Release stayed a mode of Build. See ## What this agent must never do -- Edit source, open PRs, or run builds — that is `start_dev` / `ship_*` / PyAutoBuild. +- Edit source, open PRs, or run builds — that is `start_dev` / `ship_*` / PyAutoHands. - Run tests or health checks, or re-implement a PyAutoHeart check — consult the vitals faculty (`--check-health`) and let Heart measure. - Query PyAutoHeart directly — only the vitals faculty talks to the Heart organ. diff --git a/agents/conductors/bug/BUG_TAXONOMY.md b/agents/conductors/bug/BUG_TAXONOMY.md index b155b1e..8a434ea 100644 --- a/agents/conductors/bug/BUG_TAXONOMY.md +++ b/agents/conductors/bug/BUG_TAXONOMY.md @@ -78,7 +78,7 @@ re-implement a Heart check. `bug.sh health` reads two complementary signals: For each finding `_bug.py` emits a first-pass **category hint** (real-bug / config / flaky / expected, from the issue title + labels); the reasoning layer confirms it and -decides where the fix belongs (affected repo, PyAutoHeart, PyAutoBuild, PyAutoBrain). +decides where the fix belongs (affected repo, PyAutoHeart, PyAutoHands, PyAutoBrain). Confirmed real defects become `PyAutoMind/bug/health_fixes/.md` prompts and enter the normal workflow; flaky / expected findings are left to the Health conductor's loop. Validation after patching is always the vitals faculty (`pyauto-heart readiness` GREEN, @@ -109,7 +109,7 @@ intent → PyAutoMind (bug/* prompts, bug/health_fixes/, active/planned s reasoning → PyAutoBrain (Bug Agent — this; reuses the Feature core) knowledge → PyAutoMemory (recurring failures / prior fixes / flaky tests; cited, not invented) health → PyAutoHeart (via the vitals faculty + filed Heart issues; never re-implemented) -execution → PyAutoBuild (via start_dev / ship_* — never run by this agent) +execution → PyAutoHands (via start_dev / ship_* — never run by this agent) ``` No execution, health-checking, or knowledge-authoring logic lives in the Bug Agent. It diff --git a/agents/conductors/bug/_bug.py b/agents/conductors/bug/_bug.py index 38a8b91..fab2c7b 100755 --- a/agents/conductors/bug/_bug.py +++ b/agents/conductors/bug/_bug.py @@ -35,7 +35,7 @@ # (the organs themselves), not library-source or workspace work. INFRA_TARGETS = { "pyautobrain": "PyAutoBrain", "pyautoheart": "PyAutoHeart", - "pyautobuild": "PyAutoBuild", "autobuild": "PyAutoBuild", + "pyautobuild": "PyAutoHands", "autobuild": "PyAutoHands", "pyautomind": "PyAutoMind", "pyautomemory": "PyAutoMemory", } diff --git a/agents/conductors/build/AGENTS.md b/agents/conductors/build/AGENTS.md index 207dcb9..895ae50 100644 --- a/agents/conductors/build/AGENTS.md +++ b/agents/conductors/build/AGENTS.md @@ -1,25 +1,25 @@ # Build agent > **Tier: conductor** — a front-door agent you *drive*. It decides *whether/what* -> to build and drives execution, delegating the *building* to PyAutoBuild and the +> to build and drives execution, delegating the *building* to PyAutoHands and the > *health decision* to the read-only vitals faculty. It acts; it does not measure. The second canonical **PyAutoBrain** reasoning agent, and the reference example of how the Brain coordinates *multiple* organs. It is the executive function for execution work: it owns the build *workflow* but delegates the *building* to -PyAutoBuild and the *health decision* to the vitals faculty. +PyAutoHands and the *health decision* to the vitals faculty. ``` Mind → Build Agent → vitals faculty → Heart → GREEN/YELLOW/RED - → Build Agent → PyAutoBuild (execute) + → Build Agent → PyAutoHands (execute) ``` ## Fundamental principle -**The Build Agent does not build software itself — PyAutoBuild does.** The Build +**The Build Agent does not build software itself — PyAutoHands does.** The Build Agent decides *whether* building should happen, *what* to build, *which* -PyAutoBuild capability to invoke, and *whether to proceed or stop*. It reasons; -PyAutoBuild executes. It must never duplicate PyAutoBuild functionality. +PyAutoHands capability to invoke, and *whether to proceed or stop*. It reasons; +PyAutoHands executes. It must never duplicate PyAutoHands functionality. ## Brain agents consult one another @@ -32,12 +32,12 @@ tree is fit for a refactor; a Release Agent asking the Build Agent to package. ## Modes (one agent now, clean seam for a Release Agent later) -Release is in scope today because PyAutoBuild currently owns release/build/deploy +Release is in scope today because PyAutoHands currently owns release/build/deploy execution. It is isolated as its own **mode** so release-specific reasoning never bleeds into generic build execution, and can split into a dedicated Release Agent later with no churn to build mode. -| Mode | Default action | Gate policy | Routes to (PyAutoBuild) | +| Mode | Default action | Gate policy | Routes to (PyAutoHands) | |------|----------------|-------------|--------------------------| | `build` | `run_all` | lenient — GREEN/YELLOW proceed, RED aborts | `generate`, `run`, `run_python`, `run_all`, `script_matrix`, `aggregate_results`, `slow_skip_check`, `repro_command`, `bump_colab_urls` | | `deploy` | `generate` | cautious — GREEN proceeds, YELLOW needs `--force`, RED aborts | `generate`, `bump_colab_urls` | @@ -55,7 +55,7 @@ An **unknown** verdict collapses to YELLOW — never silently GREEN. 3. Consult the vitals faculty for the readiness verdict. 4. Interpret it: **GREEN** proceed · **YELLOW** caution (proceed in build mode, else `--force`) · **RED** abort with blockers. -5. Invoke the appropriate PyAutoBuild capability. +5. Invoke the appropriate PyAutoHands capability. 6. Emit a structured `BuildDecision`. ## Run @@ -69,7 +69,7 @@ bin/pyauto-brain build --mode deploy --force generate bin/pyauto-brain build --mode release -- 2 # release mode; forward minor_version 2 to pre_build ``` -Anything after `--` is forwarded verbatim to the PyAutoBuild subcommand. +Anything after `--` is forwarded verbatim to the PyAutoHands subcommand. Exit codes: `0` proceeded/delegated (or dry-run) · `2` yellow blocked (use `--force`) · `3` red blocked · `4` unknown/could-not-consult · `5` invalid @@ -83,7 +83,7 @@ mode/action. { "agent": "build", "mode": "build|deploy|release", - "requested_action": "", + "requested_action": "", "health_status": "green|yellow|red|unknown", "decision": "proceed|proceed-with-caution|abort", "execution_plan": ["autobuild "], @@ -99,7 +99,7 @@ A future Python `BuildAgent().execute(...)` wrapper can return this same shape. ## What this agent must never do -- Build, package, tag, or publish anything itself — that is PyAutoBuild's job. +- Build, package, tag, or publish anything itself — that is PyAutoHands's job. - Query PyAutoHeart directly or re-derive a readiness verdict — consult the vitals faculty. - Re-own a health-shim command (`verify_install`, `url_check`, `watch`, `status`, @@ -108,4 +108,4 @@ A future Python `BuildAgent().execute(...)` wrapper can return this same shape. release mode. See [`BUILD_CAPABILITIES.md`](./BUILD_CAPABILITIES.md) for the audit of every -PyAutoBuild capability the agent calls, and the execution/health boundary. +PyAutoHands capability the agent calls, and the execution/health boundary. diff --git a/agents/conductors/build/BUILD_CAPABILITIES.md b/agents/conductors/build/BUILD_CAPABILITIES.md index 740bd9a..32a31d3 100644 --- a/agents/conductors/build/BUILD_CAPABILITIES.md +++ b/agents/conductors/build/BUILD_CAPABILITIES.md @@ -1,9 +1,9 @@ -# PyAutoBuild capabilities known to the Build Agent +# PyAutoHands capabilities known to the Build Agent This audit records the execution surface the PyAutoBrain Build Agent reasons over -and **calls**. The agent must treat every item here as a PyAutoBuild capability, +and **calls**. The agent must treat every item here as a PyAutoHands capability, not as logic to reimplement inside Brain. Source of truth: the `autobuild` -dispatcher (`PyAutoBuild/bin/autobuild`) and `PyAutoBuild/CLAUDE.md`. +dispatcher (`PyAutoHands/bin/autobuild`) and `PyAutoHands/CLAUDE.md`. ## Execution capabilities (the Build Agent calls these) @@ -32,7 +32,7 @@ capabilities still *exist* and match the `autobuild` dispatcher and the `build.sh` allowlists exactly; the *Mode* column remains accurate as the allowlist of record. What changed is the driver. The workspace full-run → report → issue flow moved **out of `release.yml` into PyAutoHeart's -`workspace-validation.yml`** (see `PyAutoBuild/docs/internals.md` and the +`workspace-validation.yml`** (see `PyAutoHands/docs/internals.md` and the `release.yml` comment recording the removed `run_scripts` / `run_notebooks` / `analyze_results` jobs). Heart checks these primitives out from Build and reuses them directly — calling `run.py` / `run_python.py` / `script_matrix.py` / @@ -50,8 +50,8 @@ per-workspace `config/build/{no_run,env_vars,copy_files,visualise_notebooks}.yam ## Boundary audit — execution vs. health -PyAutoBuild is meant to be a **pure executor**: it runs no readiness checks of -its own. Confirmed against `PyAutoBuild/CLAUDE.md` ("PyAutoBuild is the executor +PyAutoHands is meant to be a **pure executor**: it runs no readiness checks of +its own. Confirmed against `PyAutoHands/CLAUDE.md` ("PyAutoHands is the executor … it runs **no** release-readiness checks of its own"). It does, however, still expose **health-shim commands** that delegate to the @@ -65,32 +65,32 @@ health authority (PyAutoHeart): **refuses to route them** and points the caller at `pyauto-brain vitals ` instead. They belong to PyAutoHeart and are reached through the vitals faculty — never re-owned by the Build Agent, and never duplicated in Brain. No non-trivial -readiness logic was found living *inside* PyAutoBuild itself (the shims only +readiness logic was found living *inside* PyAutoHands itself (the shims only delegate); if any ever appears, migrate it to PyAutoHeart and leave only -delegation in PyAutoBuild. +delegation in PyAutoHands. This keeps the architecture clean: ``` reasoning → PyAutoBrain (Build Agent, vitals faculty) health → PyAutoHeart (via the vitals faculty) -execution → PyAutoBuild (via the Build Agent) +execution → PyAutoHands (via the Build Agent) ``` ## Naming resilience -PyAutoBuild has been renamed onto the canonical **PyAutoHeart** / **PyAutoBrain** +PyAutoHands has been renamed onto the canonical **PyAutoHeart** / **PyAutoBrain** names (the earlier **PyAutoPulse** / **PyAutoAgent** usages are gone). Regardless, the Build Agent reasons about *categories of capability* (execution vs. health), -not fixed names, so any future rename in PyAutoBuild does not break it. When -PyAutoBuild gains or renames an execution subcommand, update the table above; do +not fixed names, so any future rename in PyAutoHands does not break it. When +PyAutoHands gains or renames an execution subcommand, update the table above; do not encode the list anywhere the agent must re-derive at runtime beyond the per-mode allowlists in `build.sh`. ## Build Agent decision policy (recap) -- **GREEN** — proceed; invoke the requested PyAutoBuild capability. +- **GREEN** — proceed; invoke the requested PyAutoHands capability. - **YELLOW** — build mode proceeds with a warning; deploy/release require `--force`. An unknown verdict is treated as YELLOW. - **RED** — abort; surface Heart's blockers (via the vitals faculty) and do not diff --git a/agents/conductors/build/build.sh b/agents/conductors/build/build.sh index a45f4f2..b0e9b8a 100755 --- a/agents/conductors/build/build.sh +++ b/agents/conductors/build/build.sh @@ -2,14 +2,14 @@ # agents/build/build.sh — the build agent (the 2nd canonical PyAutoBrain agent). # # The Build Agent is the executive / orchestration layer for execution work. It -# does NOT build software itself — PyAutoBuild does. The Build Agent decides -# whether building should happen, what to build, which PyAutoBuild capability to -# invoke, and whether to proceed or stop. It reasons; PyAutoBuild executes. +# does NOT build software itself — PyAutoHands does. The Build Agent decides +# whether building should happen, what to build, which PyAutoHands capability to +# invoke, and whether to proceed or stop. It reasons; PyAutoHands executes. # # Call chain (the Brain coordinating multiple organs): # # Mind -> Build Agent -> vitals faculty -> Heart -> GREEN/YELLOW/RED -# -> Build Agent -> PyAutoBuild (execute) +# -> Build Agent -> PyAutoHands (execute) # # Note the consult step goes through the *sibling vitals faculty*, not Heart # directly: Brain agents consult one another (a society of reasoning agents), @@ -42,7 +42,7 @@ HERE="$(cd "$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" && pwd)" source "$HERE/../../_common.sh" # ----- mode -> allowed actions, default action, gate strictness ----- -# Actions are PyAutoBuild capabilities. The Build Agent calls them; it never +# Actions are PyAutoHands capabilities. The Build Agent calls them; it never # reimplements them. Health-shim commands (verify_install, url_check, watch, # status, tick, fix) are deliberately NOT routable here — those are Heart's # surface, reached through the vitals faculty, never re-owned by Build. diff --git a/agents/conductors/clone/AGENTS.md b/agents/conductors/clone/AGENTS.md index 0f77869..d886ecd 100644 --- a/agents/conductors/clone/AGENTS.md +++ b/agents/conductors/clone/AGENTS.md @@ -1,7 +1,7 @@ # Clone Agent (the Mitosis Agent) > **Tier: conductor** — a front-door agent you *drive*. It decides **and** -> delegates execution to PyAutoBuild. Bare `clone` is decision only: it emits +> delegates execution to PyAutoHands. Bare `clone` is decision only: it emits > a CloneDecision and writes nothing. **`--apply --mode lightweight-seed` is > live** — it hands a generation plan to Build's `clone_seed.py`, which gives > birth; `exact-clone` and `differentiated-sibling` remain v2 and are refused. diff --git a/agents/conductors/clone/DESIGN.md b/agents/conductors/clone/DESIGN.md index d47b705..b800675 100644 --- a/agents/conductors/clone/DESIGN.md +++ b/agents/conductors/clone/DESIGN.md @@ -24,7 +24,7 @@ the reference. ``` library + workspace [+ HowTo] + reference assistant → Clone Agent → CloneDecision (dry run, always first) - → --apply → PyAutoBuild executes repo creation + file generation + → --apply → PyAutoHands executes repo creation + file generation → PyAutoHeart validates the newborn assistant ``` @@ -32,7 +32,7 @@ library + workspace [+ HowTo] + reference assistant **The Clone Agent reasons about reproduction; it never gives birth itself.** It inspects, partitions, and plans — emitting a `CloneDecision` — and on -`--apply` hands the generation plan to PyAutoBuild. It writes no repo, no +`--apply` hands the generation plan to PyAutoHands. It writes no repo, no file, no GitHub state of its own. A clone is never an unreviewed act: the human answers the clone-mode question before anything is generated. @@ -42,7 +42,7 @@ human answers the clone-mode question before anything is generated. |-------|-----------------| | **PyAutoMind** | stores the *intent* — the prompt that asks for the new assistant | | **PyAutoBrain** (this agent) | inspects the domain, partitions template vs domain content, plans — the `CloneDecision` | -| **PyAutoBuild** (the Hands) | executes: repo creation, file generation, initial commit/push | +| **PyAutoHands** (the Hands) | executes: repo creation, file generation, initial commit/push | | **PyAutoHeart** | validates the result — the newborn's own symbol audit, link sweep, wiki-currency, chat-surface smoke | | **PyAutoMemory** | supplies reusable architectural knowledge (assistant anatomy, prior CloneDecisions) — cited in the Decision, **never** copied into the public assistant (the privacy seam) | @@ -108,7 +108,7 @@ What the partition means per set, for every clone mode: | Mode | Command | What it does | |------|---------|--------------| | **analyze** (default) | `clone --workspace [--howto ] [--reference ]` | full dry run: domain analysis + partition + plan → CloneDecision; writes nothing | -| **apply** | `clone --apply …` | after the human confirms the clone mode: hand the generation plan to PyAutoBuild, post the CloneDecision to the tracking issue | +| **apply** | `clone --apply …` | after the human confirms the clone mode: hand the generation plan to PyAutoHands, post the CloneDecision to the tracking issue | | **audit** | `clone audit ` | re-partition an *existing* assistant against the current reference — drift report for already-born siblings | Writes only under `--apply`, and even then only via Build. Exit codes follow @@ -121,7 +121,7 @@ bad usage). partition, generation plan, CloneDecision. No writer at all. Proves the reasoning on `PyAutoFit → autofit_assistant` as the dry-run case study. 2. **v1 — seed births. SHIPPED.** `--apply` for **lightweight-seed** via a - PyAutoBuild primitive (`autobuild/clone_seed.py`: repo creation + generic-set + PyAutoHands primitive (`autobuild/clone_seed.py`: repo creation + generic-set copy + scaffolds + the `PENDING.md` growth queue). Heart gained the newborn-validation checklist (`PyAutoHeart/docs/newborn_validation.md`). 3. **v2 — differentiated siblings.** Skill/wiki regeneration from the domain diff --git a/agents/conductors/clone/_clone.py b/agents/conductors/clone/_clone.py index 40a3da1..56f0dd1 100644 --- a/agents/conductors/clone/_clone.py +++ b/agents/conductors/clone/_clone.py @@ -3,7 +3,7 @@ analyze (default) is decision only. v1 adds `--apply --mode lightweight-seed`: the agent writes its generation plan as JSON and hands -execution to PyAutoBuild's `clone_seed.py` primitive (repo creation +execution to PyAutoHands's `clone_seed.py` primitive (repo creation PRIVATE-first; the newborn's publish gate is Heart's newborn-validation checklist). The agent itself still writes no repo and no GitHub state — the mandatory clone-mode question is answered by the human typing `--mode`. @@ -425,7 +425,7 @@ def apply_seed(args, decision): plan_path = Path(tempfile.mkstemp(prefix="clone_plan_", suffix=".json")[1]) plan_path.write_text(json.dumps(plan, indent=2)) - seed_script = PYAUTO_ROOT / "PyAutoBuild" / "autobuild" / "clone_seed.py" + seed_script = PYAUTO_ROOT / "PyAutoHands" / "autobuild" / "clone_seed.py" if not seed_script.exists(): fail(4, f"Build primitive not found: {seed_script}") cmd = [sys.executable, str(seed_script), str(plan_path)] diff --git a/agents/conductors/feature/AGENTS.md b/agents/conductors/feature/AGENTS.md index 10b13ea..bfca4b1 100644 --- a/agents/conductors/feature/AGENTS.md +++ b/agents/conductors/feature/AGENTS.md @@ -107,7 +107,7 @@ body, not the folder (per PyAutoMind `ROUTING.md`). ## What this agent must never do - Edit source, open PRs, or run builds itself — that is the Build Agent / - PyAutoBuild via `start_dev` / `ship_*`. + PyAutoHands via `start_dev` / `ship_*`. - Query PyAutoHeart directly — consult the vitals faculty (`--check-health`). - Invent scientific or architectural context when PyAutoMemory has material — cite the sub-wiki instead. diff --git a/agents/conductors/feature/MIND_TAXONOMY.md b/agents/conductors/feature/MIND_TAXONOMY.md index 16d4b62..3f8fca9 100644 --- a/agents/conductors/feature/MIND_TAXONOMY.md +++ b/agents/conductors/feature/MIND_TAXONOMY.md @@ -106,7 +106,7 @@ intent → PyAutoMind (feature/* prompts, active/planned/queue state) reasoning → PyAutoBrain (Feature Agent — this) knowledge → PyAutoMemory (via direct file reads; cited, never invented) health → PyAutoHeart (via the vitals faculty, never queried directly) -execution → PyAutoBuild (via start_dev / ship_* — never run by this agent) +execution → PyAutoHands (via start_dev / ship_* — never run by this agent) ``` No execution, health-checking, or knowledge-authoring logic lives in the Feature diff --git a/agents/conductors/hygiene/AGENTS.md b/agents/conductors/hygiene/AGENTS.md index 16c7d92..3867315 100644 --- a/agents/conductors/hygiene/AGENTS.md +++ b/agents/conductors/hygiene/AGENTS.md @@ -113,7 +113,7 @@ on-demand only (never the default scan, never a Heart tick). Consults the vitals faculty; never issues a health verdict. - **vs bug / refactor** — hygiene finds and prioritises debt and *delegates* the fix to them; they own the repair. -- **vs build** — hygiene is upkeep, not release; it never touches PyAutoBuild. +- **vs build** — hygiene is upkeep, not release; it never touches PyAutoHands. - **vs Gut (PyAutoGut)** — the `tidy`/`sweep` modes are the **hygiene → PyAutoGut drive seam**, mirroring the **Heart ↔ vitals** template: the organ *holds and voids*, this conductor *decides what to condemn and when to sweep* and owns none diff --git a/agents/conductors/hygiene/hygiene.sh b/agents/conductors/hygiene/hygiene.sh index 588d7e9..3150656 100755 --- a/agents/conductors/hygiene/hygiene.sh +++ b/agents/conductors/hygiene/hygiene.sh @@ -53,7 +53,7 @@ source "$HERE/../../_common.sh" # canonical checkouts there, never the worktree symlinks. ROOT="${PYAUTO_ROOT:-$HOME/Code/PyAutoLabs}" LIB_REPOS=(PyAutoConf PyAutoFit PyAutoArray PyAutoGalaxy PyAutoLens) -ORG_REPOS=(PyAutoBrain PyAutoBuild PyAutoHeart PyAutoMind) +ORG_REPOS=(PyAutoBrain PyAutoHands PyAutoHeart PyAutoMind) DOC_REPOS=(PyAutoFit PyAutoGalaxy PyAutoLens) # PyAutoGut drive seam (tidy/sweep). The conductor DECIDES and emits a plan; the diff --git a/agents/conductors/intake/_intake.py b/agents/conductors/intake/_intake.py index 4089628..0e04520 100755 --- a/agents/conductors/intake/_intake.py +++ b/agents/conductors/intake/_intake.py @@ -84,8 +84,8 @@ "autoconf": "PyAutoConf", "autofit": "PyAutoFit", "autoarray": "PyAutoArray", "autogalaxy": "PyAutoGalaxy", "autolens": "PyAutoLens", "pyautomind": "PyAutoMind", "pyautobrain": "PyAutoBrain", - "pyautoheart": "PyAutoHeart", "pyautobuild": "PyAutoBuild", - "pyautomemory": "PyAutoMemory", "autobuild": "PyAutoBuild", + "pyautoheart": "PyAutoHeart", "pyautobuild": "PyAutoHands", + "pyautomemory": "PyAutoMemory", "autobuild": "PyAutoHands", "workspaces": "workspaces", } PRIORITY_HIGH = ["urgent", "asap", "blocker", "blocking", "critical", "important", diff --git a/agents/conductors/release/AGENTS.md b/agents/conductors/release/AGENTS.md index 1602e60..b66a8e0 100644 --- a/agents/conductors/release/AGENTS.md +++ b/agents/conductors/release/AGENTS.md @@ -64,7 +64,7 @@ bin/pyauto-brain release rehearse --ingest --force # accept a YELLOW ``` Phase 1 emits the steps: `mcp__github__actions_run_trigger` on -`PyAutoLabs/PyAutoBuild` `release.yml` with `{rehearsal: true}` (M1 mode) → +`PyAutoLabs/PyAutoHands` `release.yml` with `{rehearsal: true}` (M1 mode) → poll `mcp__github__actions_get` to completion → download the `testpypi-rehearsal-version` artifact → `mcp__github__get_commit` each library's `main` HEAD into `commit_shas.json`. Phase 2 hands the artifacts to @@ -142,7 +142,7 @@ but both originate from Stage 2, which stays authoritative by construction. - Re-derive or second-guess the readiness verdict (that is Heart's / the vitals faculty's job). - Run any packaging/tagging/publish step itself (that is Build's job). -- Write into PyAutoHeart or PyAutoBuild repos. +- Write into PyAutoHeart or PyAutoHands repos. ## What only this agent does (not the vitals faculty) diff --git a/agents/conductors/release/activity_gate.py b/agents/conductors/release/activity_gate.py index 9fa6e98..f05d7c1 100644 --- a/agents/conductors/release/activity_gate.py +++ b/agents/conductors/release/activity_gate.py @@ -1,7 +1,7 @@ """agents/conductors/release/activity_gate.py — the nightly activity gate. Pure decision logic for the scheduled-nightly release driver (nightly.sh), -implementing design §4 of ``PyAutoBuild/docs/nightly_release_design.md``: +implementing design §4 of ``PyAutoHands/docs/nightly_release_design.md``: qualifying activity = at least one commit on ``main``, in any of the release-relevant repos, since the last nightly outcome, that is not a diff --git a/agents/conductors/release/nightly.sh b/agents/conductors/release/nightly.sh index 807cfb4..f79f57b 100644 --- a/agents/conductors/release/nightly.sh +++ b/agents/conductors/release/nightly.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash # agents/conductors/release/nightly.sh — the scheduled-nightly release driver. # -# Implements the nightly sequence of PyAutoBuild/docs/nightly_release_design.md +# Implements the nightly sequence of PyAutoHands/docs/nightly_release_design.md # (§3, steps 0-7): the ONLY path authorised to ship a live PyPI release without # a per-release human, under the AUTONOMY.md standing grant of 2026-07-09 # (activity-gated, Heart-GREEN-gated, kill-switchable, loud on every outcome). @@ -55,17 +55,17 @@ set -uo pipefail HERE="$(cd "$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" && pwd)" source "$HERE/../../_common.sh" -BRAIN_REPO="PyAutoLabs/PyAutoBuild" # where release-blocker labels are curated first +BRAIN_REPO="PyAutoLabs/PyAutoHands" # where release-blocker labels are curated first ANCHOR_REPO="PyAutoLabs/PyAutoBrain" ANCHOR_VAR="NIGHTLY_LAST_WINDOW_END" # Release tags land on every library; one suffices. Which one is release # POLICY — read from config/policy.yaml (the declared config surface). TAG_REPO="$(python3 -c "import yaml, pathlib; print(yaml.safe_load((pathlib.Path('$HERE').parents[2] / 'config' / 'policy.yaml').read_text())['release']['tag_repo'])")" -BUILD_REPO="PyAutoLabs/PyAutoBuild" +BUILD_REPO="PyAutoLabs/PyAutoHands" RELEASE_WORKFLOW="release.yml" # Repos whose open `release-blocker` issues stop the night (the release-relevant # set from activity_gate.py plus the release/health organs). -BLOCKER_EXTRA_REPOS=(PyAutoBuild PyAutoHeart) +BLOCKER_EXTRA_REPOS=(PyAutoHands PyAutoHeart) DRY_RUN="${DRY_RUN:-true}" no_dispatch=0 diff --git a/agents/conductors/release/rehearse.sh b/agents/conductors/release/rehearse.sh index 50fde16..3ffb2e6 100755 --- a/agents/conductors/release/rehearse.sh +++ b/agents/conductors/release/rehearse.sh @@ -43,7 +43,7 @@ HERE="$(cd "$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" && pwd)" source "$HERE/../../_common.sh" # The Build repo + workflow the rehearsal is dispatched against (M1). -BUILD_REPO="PyAutoLabs/PyAutoBuild" +BUILD_REPO="PyAutoLabs/PyAutoHands" RELEASE_WORKFLOW="release.yml" REHEARSAL_ARTIFACT="testpypi-rehearsal-version" # The 5 libraries whose main HEADs the rehearsal is built from; readiness diff --git a/agents/conductors/release/release.sh b/agents/conductors/release/release.sh index e75d91c..1a700b5 100755 --- a/agents/conductors/release/release.sh +++ b/agents/conductors/release/release.sh @@ -38,7 +38,7 @@ fi # `release nightly ...` is the scheduled-nightly driver — the activity-gated, # Heart-GREEN-gated unattended live-release path (design: -# PyAutoBuild/docs/nightly_release_design.md; standing grant: ../../AUTONOMY.md). +# PyAutoHands/docs/nightly_release_design.md; standing grant: ../../AUTONOMY.md). # Local runs default to dry-run; the cron lives in # .github/workflows/nightly-release.yml. if [[ "${1:-}" == "nightly" ]]; then diff --git a/agents/conductors/workspace/AGENTS.md b/agents/conductors/workspace/AGENTS.md index 17ef842..b2d1b2c 100644 --- a/agents/conductors/workspace/AGENTS.md +++ b/agents/conductors/workspace/AGENTS.md @@ -64,7 +64,7 @@ rather than duplicating it: - the **sibling example script** the decision names — structure is copied from a living example, never invented; -- **PyAutoBuild's notebook generation** — every top-level docstring becomes a +- **PyAutoHands's notebook generation** — every top-level docstring becomes a markdown cell, which is what makes the docstring format load-bearing; - **`skills/WORKFLOW.md` tutorial-prose split** — example/howto prose is judgment-tier (the docstrings are the product); `*_workspace_test` scripts diff --git a/agents/conductors/workspace/_workspace.py b/agents/conductors/workspace/_workspace.py index f777654..067b000 100644 --- a/agents/conductors/workspace/_workspace.py +++ b/agents/conductors/workspace/_workspace.py @@ -14,7 +14,7 @@ howto narrative teaching for first-time learners (HowTo* repos) The format spec is never restated here — the decision points at the canonical -sources (the sibling example script it names, PyAutoBuild's notebook +sources (the sibling example script it names, PyAutoHands's notebook generation, WORKFLOW.md's tutorial-prose split). Stdlib-only. Exit codes: 0 decision · 4 inputs unresolvable · 5 bad usage. @@ -208,7 +208,7 @@ def build_decision(args): "format_checklist": CHECKLIST_SHARED + CHECKLIST_REGISTER[register], "format_grounding": [ "the sibling example script (structure is copied, never invented)", - "PyAutoBuild notebook generation (docstring cells -> .ipynb)", + "PyAutoHands notebook generation (docstring cells -> .ipynb)", "PyAutoBrain/skills/WORKFLOW.md — tutorial-prose split", ], "notes": notes, diff --git a/agents/faculties/vitals/AGENTS.md b/agents/faculties/vitals/AGENTS.md index 40ecfea..2863c91 100644 --- a/agents/faculties/vitals/AGENTS.md +++ b/agents/faculties/vitals/AGENTS.md @@ -176,7 +176,7 @@ always adopted from Heart verbatim. ## Gate semantics (what the caller does next) -- **GREEN** — the organism is healthy. PyAutoBuild/Hands may proceed +- **GREEN** — the organism is healthy. PyAutoHands/Hands may proceed automatically. - **YELLOW** — mostly healthy. Work may proceed, but **human review is recommended** before release-grade actions. @@ -184,7 +184,7 @@ always adopted from Heart verbatim. blocking issues are resolved. The faculty only ever returns the decision and its reasoning. Execution belongs to -Hands/PyAutoBuild, which acts **only after** receiving this GREEN/YELLOW/RED +Hands/PyAutoHands, which acts **only after** receiving this GREEN/YELLOW/RED decision — it never re-runs the checks or re-derives the gate. ## Hard boundaries diff --git a/agents/faculties/vitals/HEART_CAPABILITIES.md b/agents/faculties/vitals/HEART_CAPABILITIES.md index d01ead8..05c027b 100644 --- a/agents/faculties/vitals/HEART_CAPABILITIES.md +++ b/agents/faculties/vitals/HEART_CAPABILITIES.md @@ -27,7 +27,7 @@ reimplement inside Brain. - Worktree drift: `~/Code/PyAutoLabs-wt/` directories versus PyAutoMind `active.md` claims. - Script timing: per-script duration regressions against rolling baselines. -- Test run: latest PyAutoBuild release-run report under +- Test run: latest PyAutoHands release-run report under `test_results/latest/report.json`. - Version skew: workspace pinned versions versus installed libraries. - Generated/noise classification: dirty source files versus generated artifacts. @@ -88,16 +88,16 @@ reimplement inside Brain. - Tests: `tests/`, expected to run quickly with stdlib + PyYAML only. - Docs / agent guidance: `README.md`, `AGENTS.md`, `CLAUDE.md`. -## PyAutoBuild delegation audit +## PyAutoHands delegation audit -PyAutoBuild has been fully renamed onto the Heart/Brain names (no PyAutoPulse or +PyAutoHands has been fully renamed onto the Heart/Brain names (no PyAutoPulse or PyAutoAgent references remain) and exposes health-shim commands such as `autobuild verify_install`, `autobuild url_check`, and `autobuild watch|status|tick|fix`. These delegate to the health authority rather than owning readiness logic. Decision: GREEN — the docs are renamed and the shims delegate only. Do not duplicate those checks in Brain. If any shim ever gains non-trivial readiness -logic, migrate that logic to PyAutoHeart and leave only delegation in PyAutoBuild. +logic, migrate that logic to PyAutoHeart and leave only delegation in PyAutoHands. ## vitals faculty decision policy diff --git a/bin/README.md b/bin/README.md index 8ad3696..bc97985 100644 --- a/bin/README.md +++ b/bin/README.md @@ -27,7 +27,7 @@ harness home: `review_release`, `audit_docs`, `cli_noise_clean`), plus the reference-only `/health` legs `health_sweep/`, `pyauto-status/`, `pyauto-status-full/` (driven by the Brain's `/health` door, not installed as standalone commands). -- **`PyAutoBuild/skills/`** — release-execution skills **only** (`pre_build`). +- **`PyAutoHands/skills/`** — release-execution skills **only** (`pre_build`). Build owns no dev-workflow skills; `ship_*` (Brain) only *call* its release step. - **`autolens_profiling/skills/`** — science-profiling skills (`profile_likelihood`). - **`admin_jammy/skills/`** — vestigial: hosts no skills; scanned only so an old diff --git a/bin/check_skill_line_counts.sh b/bin/check_skill_line_counts.sh index b879fde..ed84495 100755 --- a/bin/check_skill_line_counts.sh +++ b/bin/check_skill_line_counts.sh @@ -23,7 +23,7 @@ ROOTS=( "$PYAUTO_ROOT/PyAutoMind/skills" "$PYAUTO_ROOT/PyAutoBrain/skills" "$PYAUTO_ROOT/PyAutoHeart/skills" - "$PYAUTO_ROOT/PyAutoBuild/skills" + "$PYAUTO_ROOT/PyAutoHands/skills" "$PYAUTO_ROOT/autolens_profiling/skills" ) diff --git a/bin/install.sh b/bin/install.sh index 34b13c4..4d0996b 100755 --- a/bin/install.sh +++ b/bin/install.sh @@ -14,10 +14,10 @@ # - PyAutoMind/skills/ — registry-coupled skills (create_issue, handoff) # - PyAutoBrain/skills/ — development-workflow skills (start_*/ship_*/…) # - PyAutoHeart/skills/ — status / readiness / diagnostic skills -# - PyAutoBuild/skills/ — release-execution skills ONLY (pre_build) +# - PyAutoHands/skills/ — release-execution skills ONLY (pre_build) # - autolens_profiling/skills/ — science-profiling skills (profile_likelihood) # -# (PyAutoBuild's root is for its own release/packaging-execution skills only — it +# (PyAutoHands's root is for its own release/packaging-execution skills only — it # owns NO dev-workflow skills; the ship_* skills merely call its release step.) # # Auto-discovers surfaces in each root independently: @@ -53,7 +53,7 @@ ADMIN_SKILLS_DIR="$PYAUTO_ROOT/admin_jammy/skills" MIND_SKILLS_DIR="$PYAUTO_ROOT/PyAutoMind/skills" BRAIN_SKILLS_DIR="$PYAUTO_ROOT/PyAutoBrain/skills" HEART_SKILLS_DIR="$PYAUTO_ROOT/PyAutoHeart/skills" -BUILD_SKILLS_DIR="$PYAUTO_ROOT/PyAutoBuild/skills" +BUILD_SKILLS_DIR="$PYAUTO_ROOT/PyAutoHands/skills" PROFILING_SKILLS_DIR="$PYAUTO_ROOT/autolens_profiling/skills" CLAUDE_HOME="${CLAUDE_HOME:-$HOME/.claude}" CODEX_HOME="${CODEX_HOME:-$HOME/.codex}" @@ -67,7 +67,7 @@ CODEX_HOME="${CODEX_HOME:-$HOME/.codex}" # are skipped, so this runs in a partial/web checkout. COMMANDS_BEGIN="" COMMANDS_END="" -ORGAN_REPOS=(PyAutoMind PyAutoBrain PyAutoHeart PyAutoBuild PyAutoMemory) +ORGAN_REPOS=(PyAutoMind PyAutoBrain PyAutoHeart PyAutoHands PyAutoMemory) # Emit the canonical command-surface block (identical in every organ) to stdout, # sourced from the agent registry in bin/pyauto-brain — the single source of @@ -185,7 +185,7 @@ check_agents_surface() { # is checked out. The AGENTS.md command surface (above) still advertises the full # verb set + hosting organ. Generated + drift-checked — do not hand-edit these # dirs. Symlinks (single source = skills/), matching the user-level install. -DISCOVERY_REPOS=(PyAutoMind PyAutoBrain PyAutoHeart PyAutoBuild autolens_profiling) +DISCOVERY_REPOS=(PyAutoMind PyAutoBrain PyAutoHeart PyAutoHands autolens_profiling) DISCOVERY_DIRS=(.claude/commands .claude/skills .codex/skills) # Emit the (linktarget) pairs a repo's committed discovery should contain, @@ -385,7 +385,7 @@ install_from_dir "$ADMIN_SKILLS_DIR" "admin_jammy/skills/ — vestigial (hosts n install_from_dir "$MIND_SKILLS_DIR" "PyAutoMind/skills/ — registry-coupled skills (Mind)" install_from_dir "$BRAIN_SKILLS_DIR" "PyAutoBrain/skills/ — development-workflow skills (Brain)" install_from_dir "$HEART_SKILLS_DIR" "PyAutoHeart/skills/ — status / readiness skills (Heart)" -install_from_dir "$BUILD_SKILLS_DIR" "PyAutoBuild/skills/ — release-execution skills (Hands)" +install_from_dir "$BUILD_SKILLS_DIR" "PyAutoHands/skills/ — release-execution skills (Hands)" install_from_dir "$PROFILING_SKILLS_DIR" "autolens_profiling/skills/ — science-profiling skills" # ---------- Summary ---------- diff --git a/bin/mind_commit_guard.py b/bin/mind_commit_guard.py index 3ff64fc..0a27894 100644 --- a/bin/mind_commit_guard.py +++ b/bin/mind_commit_guard.py @@ -96,7 +96,7 @@ def _cd_target(tokens: list[str], cur: Path | None) -> Path | None: """New effective cwd after a ``cd`` clause, or ``cur`` if not a plain cd. Honouring a leading ``cd`` is what fixes the v1.1 false positive: a command - that ``cd``s into PyAutoBuild before committing is NOT a Mind commit, even + that ``cd``s into PyAutoHands before committing is NOT a Mind commit, even when the session's ambient cwd (what the hook is handed) is PyAutoMind. """ if not tokens or tokens[0] != "cd": @@ -144,7 +144,7 @@ def check_command(command: str, cwd: str = "") -> str | None: target_dir = cpath if cpath.is_absolute() or effective_cwd is None else effective_cwd / cpath mind_root = _under_mind(target_dir) if target_dir else None if mind_root is None: - continue # not a PyAutoMind commit — e.g. a PyAutoBuild worktree + continue # not a PyAutoMind commit — e.g. a PyAutoHands worktree root = mind_root if "--" not in tokens: return ( diff --git a/bin/overnight_status.sh b/bin/overnight_status.sh index dd0d986..ae08228 100755 --- a/bin/overnight_status.sh +++ b/bin/overnight_status.sh @@ -16,7 +16,7 @@ JOBS=( "PyAutoBrain:nightly-release.yml" "PyAutoHeart:heart-health.yml" "PyAutoHeart:workspace-validation.yml" - "PyAutoBuild:python_matrix.yml" + "PyAutoHands:python_matrix.yml" "PyAutoMind:arxiv_papers.yml" "PyAutoMind:spawn_drift.yml" "autolens_assistant:wiki-currency.yml" diff --git a/bin/pyauto-brain b/bin/pyauto-brain index 0712949..5ed5e12 100755 --- a/bin/pyauto-brain +++ b/bin/pyauto-brain @@ -3,7 +3,7 @@ # # PyAutoBrain is the reasoning layer of the PyAuto organism: it figures out HOW # work should be done and coordinates the organs that do it. The subcommand -# pattern mirrors PyAutoBuild/bin/autobuild and PyAutoHeart/bin/pyauto-heart so +# pattern mirrors PyAutoHands/bin/autobuild and PyAutoHeart/bin/pyauto-heart so # the CLIs feel the same. Agents live in two tiers under agents/: # # agents/conductors// — front-door agents a human DRIVES (they decide @@ -80,7 +80,7 @@ declare -A AGENT_DESC=( [profiling]="The proprioceptive function — the organism's sense of its own effort: campaign/ingest/triage plans over the autolens_profiling workspace — ProfilingDecision" [hygiene]="The maintenance function — the organism's sense of its own upkeep: code-quality debt (dev-loop cost + tidiness), delegating fixes — HygieneDecision" [clone]="The Mitosis Agent: partition the reference assistant, analyze the domain, emit the CloneDecision; --apply --mode lightweight-seed delegates the seed birth to Build" - [build]="Coordinate execution: consult the vitals faculty, then delegate to PyAutoBuild" + [build]="Coordinate execution: consult the vitals faculty, then delegate to PyAutoHands" [release]="Release door → the Build Agent release mode (single gate); 'release rehearse'/'release validate' drive release validation; 'release nightly' is the scheduled-nightly driver" [health]="The organism's clinician: run the health loop with a human, dispatch by dispatch, toward green" [vitals]="Read-only: read the Heart's pulse — the PyAutoHeart readiness verdict (consulted by the conductors)" diff --git a/docs/concepts/organism.md b/docs/concepts/organism.md index 1c84419..6e613d5 100644 --- a/docs/concepts/organism.md +++ b/docs/concepts/organism.md @@ -12,7 +12,7 @@ it and adds the framework/instance distinction an adopter needs. | **Mind** | PyAutoMind | Decides *what* — intent, goals, priorities, workflow state, the prompt registry, and the body map (`repos.yaml`). | | **Brain** | PyAutoBrain | Figures out *how* — reasoning, planning, routing; hosts the specialist agents. Owns no state, no health checks, no execution mechanics. | | **Heart** | PyAutoHeart | Decides whether the organism is *healthy*. `pyauto-heart readiness` is the authoritative GREEN/YELLOW/RED release gate. An observer: never writes into other repos, never triggers a build. | -| **Hands** | PyAutoBuild | *Does* — packaging, tagging, notebook generation, PyPI releases. A pure executor: never re-derives a gate decision. | +| **Hands** | PyAutoHands | *Does* — packaging, tagging, notebook generation, PyPI releases. A pure executor: never re-derives a gate decision. | | **Memory** | PyAutoMemory | *Knows* — long-term domain knowledge: literature wikis, concepts, bibliographies. Pull-only; consulted, never load-bearing at runtime. | | **Gut** | PyAutoGut | *Sheds* — the lifecycle of condemned self-material (stale branches, stashes, dead code/tests): holds each as a durable, recoverable git ref through a transit window, then **voids** it on a sweep. The storage mirror of Memory (retention ↔ release); the hygiene conductor drives it, as vitals reads Heart. | diff --git a/docs/organs/build.md b/docs/organs/build.md index b122922..82ad1da 100644 --- a/docs/organs/build.md +++ b/docs/organs/build.md @@ -1,11 +1,11 @@ -# Hands — PyAutoBuild +# Hands — PyAutoHands **What it owns:** execution of the release pipeline. Packaging, tagging, notebook generation from example scripts, workspace validation runs, and PyPI publication via `release.yml` — nightly, when there is new activity to ship. -**Repo:** [PyAutoLabs/PyAutoBuild](https://github.com/PyAutoLabs/PyAutoBuild) +**Repo:** [PyAutoLabs/PyAutoHands](https://github.com/PyAutoLabs/PyAutoHands) ## The boundary that matters diff --git a/skills/COMMANDS.md b/skills/COMMANDS.md index 82d4a96..d1160ff 100644 --- a/skills/COMMANDS.md +++ b/skills/COMMANDS.md @@ -38,7 +38,7 @@ readiness gate, or execution — those belong to the organs. | `/eyes` | Eyes Agent | `bin/pyauto-brain eyes` → survey/review a visualization workspace's figures; render via its `gallery_run.sh`; accepted critiques → `/intake` → `start_dev` | | `/profiling` | Profiling Agent | `bin/pyauto-brain profiling` → campaign/ingest/triage plans over the autolens_profiling workspace | | `/hygiene` | Hygiene Agent | `bin/pyauto-brain hygiene` → perf/tidy/noise/deps/docs upkeep plans; delegates fixes to refactor/bug/feature (modes staged) | -| `/build` | Build Agent | `bin/pyauto-brain build` → vitals faculty → Heart → PyAutoBuild | +| `/build` | Build Agent | `bin/pyauto-brain build` → vitals faculty → Heart → PyAutoHands | | `/health` | Health Agent | `bin/pyauto-brain health` loop → vitals faculty → Heart → GREEN | **2. Work-type entries** — no dedicated conductor exists **yet**, so these route diff --git a/skills/WORKFLOW.md b/skills/WORKFLOW.md index a5e4828..6b16633 100644 --- a/skills/WORKFLOW.md +++ b/skills/WORKFLOW.md @@ -27,7 +27,7 @@ skill never re-implements another organ's job. start_dev → Brain Feature Agent → Mind task + Memory context → plan → start_library/start_workspace ship_library → Brain dev-workflow → Brain vitals faculty → Heart (GREEN/YELLOW/RED) → commit / push / feature-PR ship_workspace → Brain dev-workflow → Brain vitals faculty → Heart → commit / push / feature-PR -release (later)→ Brain Build/Release Agent → Brain vitals faculty → Heart → PyAutoBuild (tag / notebooks / PyPI) +release (later)→ Brain Build/Release Agent → Brain vitals faculty → Heart → PyAutoHands (tag / notebooks / PyPI) ``` `ship_*` is **feature-development** work: the commit/push/feature-PR is the dev diff --git a/skills/build/SKILL.md b/skills/build/SKILL.md index f73b7a4..6516393 100644 --- a/skills/build/SKILL.md +++ b/skills/build/SKILL.md @@ -1,6 +1,6 @@ --- name: build -description: Coordinate PyAuto build, deploy, or release execution through the PyAutoBrain Build Agent, including its vitals consultation and PyAutoBuild delegation. Use when the user asks to build, publish, deploy, or release. +description: Coordinate PyAuto build, deploy, or release execution through the PyAutoBrain Build Agent, including its vitals consultation and PyAutoHands delegation. Use when the user asks to build, publish, deploy, or release. --- # Build diff --git a/skills/build/build.md b/skills/build/build.md index f67c62c..6bb666b 100644 --- a/skills/build/build.md +++ b/skills/build/build.md @@ -2,7 +2,7 @@ Route execution work through PyAutoBrain's **Build Agent**: it consults the read-only vitals faculty (→ Heart) and, only on a healthy verdict, delegates the -building to PyAutoBuild. It decides *whether / what* to build; it does not build. +building to PyAutoHands. It decides *whether / what* to build; it does not build. Shared routing context: `PyAutoBrain/skills/COMMANDS.md`. @@ -14,5 +14,5 @@ Shared routing context: `PyAutoBrain/skills/COMMANDS.md`. - Surface the vitals verdict: **GREEN** → proceed; **YELLOW** → proceed only with explicit user acknowledgement; **RED** → stop and report. -The Brain decides and PyAutoBuild executes — never re-derive the readiness gate +The Brain decides and PyAutoHands executes — never re-derive the readiness gate here (that is Heart's, read via the vitals faculty). diff --git a/skills/health/health.md b/skills/health/health.md index 462e624..c4fc946 100644 --- a/skills/health/health.md +++ b/skills/health/health.md @@ -12,7 +12,7 @@ Shared routing context: `PyAutoBrain/skills/COMMANDS.md`. | `/health` | The Brain **Health conductor** loop with you: assess (vitals → Heart) → triage → dispatch a validation leg → re-judge, until GREEN. | `bin/pyauto-brain health` | | `/health check` | One-shot **green-light sweep**: sync each repo's `main`, run library pytest + workspace smoke, report a pass/fail matrix. | `PyAutoHeart/skills/health_sweep/reference.md` | | `/health status` | **Active-work dashboard**: what's in flight across the repos (reads `active.md` / `planned.md` / the `complete/` records), conflicts, idle repos. | `PyAutoHeart/skills/pyauto-status/reference.md` | -| `/health full` | **Release-run dashboard**: what the last PyAutoBuild release-prep run produced (per-workspace pass/fail/timing, slowest scripts, failure tracebacks). | `PyAutoHeart/skills/pyauto-status-full/reference.md` | +| `/health full` | **Release-run dashboard**: what the last PyAutoHands release-prep run produced (per-workspace pass/fail/timing, slowest scripts, failure tracebacks). | `PyAutoHeart/skills/pyauto-status-full/reference.md` | | `/health worktrees` | **Worktree/task dashboard**: every task worktree under `~/Code/PyAutoLabs-wt/`, cross-referenced with `active.md` — which parallel tasks are in flight and which repos each holds. | `PyAutoHeart/skills/worktree_status/reference.md` | ## Do diff --git a/skills/repo_cleanup/SKILL.md b/skills/repo_cleanup/SKILL.md index bd11763..452328b 100644 --- a/skills/repo_cleanup/SKILL.md +++ b/skills/repo_cleanup/SKILL.md @@ -18,7 +18,7 @@ dirty state — see "protection sets"), Brain *decides* what is safe to remove a *executes* the cleanup. That is why this is a Brain skill, not a Heart one — Heart is an observer that never mutates other repos, whereas removing branches/stashes is dev-workflow git execution (the same kind `ship_*` does). -Cleanup is not release work, so it never touches PyAutoBuild. It reads the +Cleanup is not release work, so it never touches PyAutoHands. It reads the PyAutoMind registry (`active.md`) to know what's claimed. Organ boundary + execution-environment model: [`../WORKFLOW.md`](../WORKFLOW.md). @@ -55,7 +55,7 @@ this covers residue when that flow is skipped); the start_dev branch survey ## Scope **Always swept:** library canonical checkouts under `$PYAUTO_MAIN` (PyAutoConf, -PyAutoFit, PyAutoArray, PyAutoGalaxy, PyAutoLens, PyAutoBuild); workspaces incl. +PyAutoFit, PyAutoArray, PyAutoGalaxy, PyAutoLens, PyAutoHands); workspaces incl. `_test`/`_developer` variants (autofit/autogalaxy/autolens families, HowToLens); and worktree roots under `$PYAUTO_WT_ROOT`. diff --git a/skills/ship_library/reference.md b/skills/ship_library/reference.md index e8a0d72..209ab01 100644 --- a/skills/ship_library/reference.md +++ b/skills/ship_library/reference.md @@ -112,7 +112,7 @@ grep -rn "" \ euclid_strong_lens_modeling_pipeline/scripts/ HowToLens/scripts/ ``` -Also check `PyAutoBuild/autobuild/config/no_run.yaml` — a changed symbol used by +Also check `PyAutoHands/autobuild/config/no_run.yaml` — a changed symbol used by a script listed there is a **hidden risk** (its release-pipeline integration test is disabled). Present a data-driven recommendation: diff --git a/tests/test_activity_gate.py b/tests/test_activity_gate.py index d632757..7a32844 100644 --- a/tests/test_activity_gate.py +++ b/tests/test_activity_gate.py @@ -1,7 +1,7 @@ """tests/test_activity_gate.py — the nightly activity gate's decision logic. Pins the pipeline self-commit contract (design §4 of -PyAutoBuild/docs/nightly_release_design.md): both exclusion signals are +PyAutoHands/docs/nightly_release_design.md): both exclusion signals are pipeline-controlled, so a drift in release.yml's git identity or commit message prefix fails here instead of silently re-counting releases as activity. diff --git a/tests/test_mind_commit_guard.py b/tests/test_mind_commit_guard.py index 3fadc21..3eba87c 100644 --- a/tests/test_mind_commit_guard.py +++ b/tests/test_mind_commit_guard.py @@ -113,13 +113,13 @@ def test_bare_commit_still_denied_in_compound_with_quotes(tmp_path): assert check_command(cmd) is not None -# --- v1.2: honour a `cd` away from Mind (false positive on a PyAutoBuild commit) --- +# --- v1.2: honour a `cd` away from Mind (false positive on a PyAutoHands commit) --- def test_cd_to_other_repo_before_commit_is_allowed(): # The 2026-07-17 false positive: session cwd was PyAutoMind (what the hook - # is handed) but the command cd's to a PyAutoBuild worktree first. That is + # is handed) but the command cd's to a PyAutoHands worktree first. That is # NOT a Mind commit — a bare `git commit` there is fine. r = check_command( - 'cd /home/x/wt/PyAutoBuild && git add a && git commit -m "m"', + 'cd /home/x/wt/PyAutoHands && git add a && git commit -m "m"', cwd="/home/x/PyAutoMind", ) assert r is None @@ -127,7 +127,7 @@ def test_cd_to_other_repo_before_commit_is_allowed(): def test_git_dash_C_to_other_repo_from_mind_cwd_is_allowed(): r = check_command( - 'git -C /home/x/wt/PyAutoBuild commit -m "m"', cwd="/home/x/PyAutoMind" + 'git -C /home/x/wt/PyAutoHands commit -m "m"', cwd="/home/x/PyAutoMind" ) assert r is None @@ -141,6 +141,6 @@ def test_cd_into_mind_then_bare_commit_still_denied(): def test_git_dash_C_into_mind_from_other_cwd_still_denied(): r = check_command( - 'git -C /home/x/PyAutoMind commit -m "m"', cwd="/home/x/wt/PyAutoBuild" + 'git -C /home/x/PyAutoMind commit -m "m"', cwd="/home/x/wt/PyAutoHands" ) assert r is not None diff --git a/tests/test_sizing_paths.py b/tests/test_sizing_paths.py index 99dc5c5..dd842bc 100644 --- a/tests/test_sizing_paths.py +++ b/tests/test_sizing_paths.py @@ -17,15 +17,15 @@ HEADER = """# A task Type: bug -Target: PyAutoBuild +Target: PyAutoHands Repos: -- PyAutoBuild +- PyAutoHands Difficulty: small Autonomy: supervised Priority: normal Status: formalised -Body mentioning @PyAutoBuild. +Body mentioning @PyAutoHands. """ @@ -37,29 +37,29 @@ def _write(mind: Path, rel: str) -> Path: def test_draft_path_strips_state_folder(tmp_path): - p = _write(tmp_path, "draft/bug/pyautobuild/some_task.md") + p = _write(tmp_path, "draft/bug/pyautohands/some_task.md") out = parse_prompt(p, tmp_path) assert out["work_type"] == "bug" - assert out["target"] == "pyautobuild" + assert out["target"] == "pyautohands" def test_active_flat_path_falls_back_to_headers(tmp_path): p = _write(tmp_path, "active/some_task.md") out = parse_prompt(p, tmp_path) assert out["work_type"] == "bug" # from Type: header - assert out["target"] == "pyautobuild" # from Target: header - assert "pyautobuild" in out["repos"] + assert out["target"] == "pyautohands" # from Target: header + assert "pyautohands" in out["repos"] def test_legacy_flat_taxonomy_path_still_resolves(tmp_path): - p = _write(tmp_path, "bug/pyautobuild/some_task.md") + p = _write(tmp_path, "bug/pyautohands/some_task.md") out = parse_prompt(p, tmp_path) assert out["work_type"] == "bug" - assert out["target"] == "pyautobuild" + assert out["target"] == "pyautohands" def test_header_never_overrides_a_valid_path_taxonomy(tmp_path): - # Path says refactor/workspaces; header says bug/PyAutoBuild — the path's + # Path says refactor/workspaces; header says bug/PyAutoHands — the path's # valid taxonomy wins (header is a fallback, not an override). p = _write(tmp_path, "draft/refactor/workspaces/some_task.md") out = parse_prompt(p, tmp_path) From ecb23827ece6fab673e3df572b02af291bf28616 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 18 Jul 2026 18:42:11 +0000 Subject: [PATCH 2/3] =?UTF-8?q?refactor:=20alias=20pyautobuild=20=E2=86=92?= =?UTF-8?q?=20pyautohands=20in=20sizing=20policy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Back-compat so an @PyAutoBuild mention in a prompt still resolves to the Hands organ (renamed PyAutoBuild → PyAutoHands) in the Brain sizing heuristic. Co-Authored-By: Claude Opus 4.8 --- config/policy.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/config/policy.yaml b/config/policy.yaml index 4d7e607..96ef666 100644 --- a/config/policy.yaml +++ b/config/policy.yaml @@ -14,6 +14,7 @@ repo_aliases: pyautoconf: autoconf pyautogalaxy: autogalaxy pyautolens: autolens + pyautobuild: pyautohands # back-compat: the Hands repo was renamed PyAutoBuild → PyAutoHands # Which body-map categories mean "library-flow" / "workspace-flow" / # "organism-infrastructure" to the sizing faculty; extra literal targets From 88e4c6e9de256193e4f2276cf1411c86821737c0 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 18 Jul 2026 20:28:09 +0000 Subject: [PATCH 3/3] docs: include agent_failure_modes in a hidden toctree MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Clears the pre-existing Sphinx warning "agent_failure_modes.md: document isn't included in any toctree" (the doc existed but was unlinked on main; unrelated to the PyAutoBuild→PyAutoHands rename). A :hidden: toctree includes it in the doc tree without changing the visible sidebar nav, so the zero-warning docs gate passes. Co-Authored-By: Claude Opus 4.8 --- docs/index.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/index.md b/docs/index.md index 18da8c0..cd164cb 100644 --- a/docs/index.md +++ b/docs/index.md @@ -69,3 +69,9 @@ adoption/guide adoption/config_surfaces example ``` + +```{toctree} +:hidden: + +agent_failure_modes +```