From f10f8f51c5967d9cb67735addbfeabf8e0b8cf48 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 8 Aug 2026 19:54:54 +0000 Subject: [PATCH] mind: triage every orphaned active/ prompt, make `orphans` a gate Closes the follow-up filed in #159. All 8 unclaimed active/ prompts are disposed of, `lifecycle.py orphans` reports none, and the condition is now graded by `check` -- the report-only carve-out and its --check opt-in are gone. Shipped, recorded, each dated from the actual commit rather than guessed: workspace_version.md -> complete/2026/07/workspace-version.md autolens_workspace 21702119 adopted minimum_library_version: 2026.7.9.1 in config/general.yaml, with workspace_version_check as the documented escape hatch for main-branch clones. A floor, not an exact pin -- which was the open design question in the prompt. fix_workspace_start_here_colab_links.md -> complete/2026/07/fix-workspace-...md autolens_workspace 897465a6 "docs: link Colab introduction to workspace start". README's introductory links now resolve to the root start_here.ipynb; the topic-specific listing is correctly untouched. Not shipped, parked with the evidence rather than a guess: matplotlib_inline_standalones.md VERIFIED INCOMPLETE -- two of the five standalone comments survive on autolens_workspace main. benchmark_calibration_runs.md VERIFIED NOT STARTED -- benchmarks/runs/ on autolens_assistant main still holds only .gitkeep. In flight all along: research_profiling_experiment_in_the_autolens_pr.md is the group4 work (autolens_profiling#82/#83). Its parked entry existed but never named its prompt; added the prompt: field. Unverifiable from a cloud session, and parked saying so: euclid_eceb_editorial_revision.md and pyautoreduce_slacs1430_acs_comparison.md both work against local paths under /mnt/c/Users/Jammy/Science/. Re-check from the laptop -- parked because nobody could look is not the same as parked on purpose. Also records the two meta-prompts that shipped during this work, since leaving shipped prompts in draft/ is the same rot being fixed. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01GW2wFpSkZtXr8VzM5w8MpX --- .../fix_workspace_start_here_colab_links.md | 34 -------- active/workspace_version.md | 8 -- .../fix-workspace-start-here-colab-links.md | 83 +++++++++++++++++++ complete/2026/07/workspace-version.md | 51 ++++++++++++ .../2026/08/active-prompt-orphan-triage.md | 55 ++++++++++++ .../2026/08/registry-integrity-check.md | 57 +++++++++++++ complete/index.md | 6 +- parked.md | 42 ++++++++++ scripts/lifecycle.py | 23 ++--- 9 files changed, 306 insertions(+), 53 deletions(-) delete mode 100644 active/fix_workspace_start_here_colab_links.md delete mode 100644 active/workspace_version.md create mode 100644 complete/2026/07/fix-workspace-start-here-colab-links.md create mode 100644 complete/2026/07/workspace-version.md rename draft/maintenance/pyautomind/active_prompt_orphan_triage.md => complete/2026/08/active-prompt-orphan-triage.md (63%) rename draft/maintenance/pyautomind/registry_integrity_check.md => complete/2026/08/registry-integrity-check.md (76%) diff --git a/active/fix_workspace_start_here_colab_links.md b/active/fix_workspace_start_here_colab_links.md deleted file mode 100644 index 1c0b5de3..00000000 --- a/active/fix_workspace_start_here_colab_links.md +++ /dev/null @@ -1,34 +0,0 @@ -# Fix workspace-level `start_here.py` Colab links - -Type: docs -Target: workspaces -Repos: -- PyAutoLens -- PyAutoGalaxy -- autolens_workspace -- autogalaxy_workspace -- euclid_strong_lens_modeling_pipeline -Difficulty: small -Autonomy: supervised -Priority: normal -Status: formalised - -Correct Google Colab URLs described as the introductory PyAutoLens or -PyAutoGalaxy Jupyter Notebook so that they open each workspace's root -`start_here.ipynb`, generated from the overall workspace `start_here.py`, not -the topic-specific `notebooks/imaging/start_here.ipynb`. Scan other `README.md` -and documentation files for the same incorrect target and update matching -introductory links, while preserving links that explicitly describe the -imaging-specific tutorial. - -Verify that both root `start_here.py` sources use the correct product-specific -`setup_colab` call and that the corresponding generated `start_here.ipynb` -notebooks contain the same setup before routing users to them. - -## Original request - -> The URL to this should not be imaging/start_here.py but the overall workspace start_here.py, The introduction Jupyter Notebook on Google Colab: try PyAutoLens in a web browser (without installation)., update it and scan other README.md and docs for the same issue - -> make sure the examples we are routing to has the right setup_colab - -> this is prob requied for PyautoGalaxy too diff --git a/active/workspace_version.md b/active/workspace_version.md deleted file mode 100644 index 7d3526fa..00000000 --- a/active/workspace_version.md +++ /dev/null @@ -1,8 +0,0 @@ -A common problem is users pair a workspace with a different version to their installed software, leaidng to API -inconsistencies and config mismatches. - -What do you think we can do about this? One option would be if they are running inside a workspace, it has its -version stored somewhere which is compared to their source code on import. However, you could still end up -with users doing work outside their workspace and copy and pasting old code and API and whatnot. This version number -could be put in configs to be a bit more secure (e.g. even in their own drive they probably need a config) -but not clear cut. \ No newline at end of file diff --git a/complete/2026/07/fix-workspace-start-here-colab-links.md b/complete/2026/07/fix-workspace-start-here-colab-links.md new file mode 100644 index 00000000..e8518b4f --- /dev/null +++ b/complete/2026/07/fix-workspace-start-here-colab-links.md @@ -0,0 +1,83 @@ +# fix-workspace-start-here-colab-links + +- shipped: 2026-07-24 +- commit: autolens_workspace `897465a6` — "docs: link Colab introduction to workspace start" +- repos: + - autolens_workspace (verified) + - autogalaxy_workspace / PyAutoLens / PyAutoGalaxy / euclid_strong_lens_modeling_pipeline (in the prompt's scope, NOT verified here — see below) + +## Summary + +The "try PyAutoLens in a web browser without installing it" Colab links pointed +at the topic-specific `notebooks/imaging/start_here.ipynb` rather than the +workspace's own root `start_here.ipynb`, dropping new users into the imaging +tutorial instead of the overall introduction. + +Verified on `autolens_workspace` `main`, `README.md`: + +``` +- [PyAutoLens on Google Colab](https://colab.research.google.com/github/PyAutoLabs/autolens_workspace/blob//start_here.ipynb): try PyAutoLens in a web browser without installing it. +``` + +and the "New Users" section link below it, both now resolving to the root +notebook. The tag component is kept current by the release job's +"bump Colab URL tag refs" step. + +The topic-specific links in `start_here.py` (`imaging/start_here.ipynb`, +`interferometer/`, `point_source/`, `group/`, `cluster/`) are **correctly left +pointing at their own notebooks** — the prompt explicitly asked to preserve +links that describe the imaging-specific tutorial, and those are a deliberate +directory listing. + +## Scope caveat — do not read this as fully verified + +The prompt named five repos. Only `autolens_workspace` was checked when this +record was reconstructed. The PyAutoGalaxy side was called out in the original +request ("this is prob required for PyAutoGalaxy too") and has **not** been +confirmed here. If a stale introductory Colab link turns up in +`autogalaxy_workspace`, the PyAutoLens/PyAutoGalaxy docs, or +`euclid_strong_lens_modeling_pipeline`, treat it as unfinished scope of this +task rather than a new bug. + +## Bookkeeping note + +Reconstructed 2026-08-08 during the orphaned-prompt triage +(`draft/maintenance/pyautomind/active_prompt_orphan_triage.md`). Dated from the +fixing commit; no ship-time record exists. + +## Original prompt + +# Fix workspace-level `start_here.py` Colab links + +Type: docs +Target: workspaces +Repos: +- PyAutoLens +- PyAutoGalaxy +- autolens_workspace +- autogalaxy_workspace +- euclid_strong_lens_modeling_pipeline +Difficulty: small +Autonomy: supervised +Priority: normal +Status: formalised + +Correct Google Colab URLs described as the introductory PyAutoLens or +PyAutoGalaxy Jupyter Notebook so that they open each workspace's root +`start_here.ipynb`, generated from the overall workspace `start_here.py`, not +the topic-specific `notebooks/imaging/start_here.ipynb`. Scan other `README.md` +and documentation files for the same incorrect target and update matching +introductory links, while preserving links that explicitly describe the +imaging-specific tutorial. + +Verify that both root `start_here.py` sources use the correct product-specific +`setup_colab` call and that the corresponding generated `start_here.ipynb` +notebooks contain the same setup before routing users to them. + +## Original request + +> The URL to this should not be imaging/start_here.py but the overall workspace start_here.py, The introduction Jupyter Notebook on Google Colab: try PyAutoLens in a web browser (without installation)., update it and scan other README.md and docs for the same issue + +> make sure the examples we are routing to has the right setup_colab + +> this is prob requied for PyautoGalaxy too diff --git a/complete/2026/07/workspace-version.md b/complete/2026/07/workspace-version.md new file mode 100644 index 00000000..a6f9a80c --- /dev/null +++ b/complete/2026/07/workspace-version.md @@ -0,0 +1,51 @@ +# workspace-version + +- shipped: 2026-07-17 +- commit: autolens_workspace `21702119` — "config: adopt version.minimum_library_version floor (2026.7.9.1)" +- repos: + - autolens_workspace (verified); the sibling workspaces adopt the same key + +## Summary + +Users pairing a workspace checkout with a differently-versioned library +installation hit API inconsistencies and config mismatches with no clear signal +about the cause. The prompt asked what could be done; the answer that shipped is +a **version floor declared in workspace config**, checked on import. + +`autolens_workspace/config/general.yaml`: + +```yaml + minimum_library_version: 2026.7.9.1 + workspace_version_check: True # If False, bypass the workspace/library version check. +``` + +The config comment records that this key is "Preferred over `workspace_version`" +— i.e. a **floor** rather than an exact pin, which was the open design question +in the prompt. `workspace_version_check` gives the documented escape hatch for +`main`-branch clones, where mismatches are expected and not actionable because +`main` moves faster than releases. + +## Bookkeeping note + +Reconstructed 2026-08-08 during the orphaned-prompt triage +(`draft/maintenance/pyautomind/active_prompt_orphan_triage.md`). The prompt sat +in `active/` unclaimed by any registry entry, so no ship-time record exists. +Dated from the adopting commit, not from a merge record. + +## Related, still open + +`draft/feature/workspaces/minimum_library_version_adoption.md` covers adopting +the same key across the remaining workspace configs. Only `autolens_workspace` +was verified here — that draft should be re-checked against each workspace +before being treated as pending. + +## Original prompt + +A common problem is users pair a workspace with a different version to their installed software, leaidng to API +inconsistencies and config mismatches. + +What do you think we can do about this? One option would be if they are running inside a workspace, it has its +version stored somewhere which is compared to their source code on import. However, you could still end up +with users doing work outside their workspace and copy and pasting old code and API and whatnot. This version number +could be put in configs to be a bit more secure (e.g. even in their own drive they probably need a config) +but not clear cut. \ No newline at end of file diff --git a/draft/maintenance/pyautomind/active_prompt_orphan_triage.md b/complete/2026/08/active-prompt-orphan-triage.md similarity index 63% rename from draft/maintenance/pyautomind/active_prompt_orphan_triage.md rename to complete/2026/08/active-prompt-orphan-triage.md index 3bfe7560..c76ed5f9 100644 --- a/draft/maintenance/pyautomind/active_prompt_orphan_triage.md +++ b/complete/2026/08/active-prompt-orphan-triage.md @@ -1,3 +1,58 @@ +# active-prompt-orphan-triage + +- shipped: 2026-08-08 +- repos: + - PyAutoMind +- follows: `complete/2026/08/registry-integrity-check.md` + +## Summary + +Triaged the 8 `active/` prompts that no registry entry claimed, disposed of +every one, and turned `lifecycle.py orphans` from a report into a gate — it is +now graded by `check`, and the `--check` opt-in flag is gone. + +`lifecycle.py orphans` reports **none**. + +## Disposals + +**Shipped — recorded, dated from the actual commit:** + +| Prompt | Record | Evidence | +|---|---|---| +| `ep_optimise_expose_updater_delta.md` | `complete/2026/08/ep-optimise-updater.md` | PyAutoFit#1457 `3b960609`, autofit_workspace#136 `cf8b4077` | +| `workspace_version.md` | `complete/2026/07/workspace-version.md` | autolens_workspace `21702119` — `minimum_library_version: 2026.7.9.1` in `config/general.yaml` | +| `fix_workspace_start_here_colab_links.md` | `complete/2026/07/fix-workspace-start-here-colab-links.md` | autolens_workspace `897465a6` — README Colab links now resolve to the root `start_here.ipynb` | + +**Not shipped — parked with the evidence:** + +- `matplotlib_inline_standalones.md` — VERIFIED INCOMPLETE. At least two of the + five standalone `# %matplotlib inline` comments survive on autolens_workspace + main (both `potential_correction/start_here.py`). +- `benchmark_calibration_runs.md` — VERIFIED NOT STARTED. `benchmarks/runs/` on + autolens_assistant main still holds only `.gitkeep`; harness and prompt cards + are in place, only the campaign is missing. + +**In flight — claimed by an entry that lacked a `prompt:` field:** + +- `research_profiling_experiment_in_the_autolens_pr.md` is the + `group4-mge-search-benchmark` work (autolens_profiling#82/#83). The parked + entry existed all along; it just never named its prompt. + +**Unverifiable from a cloud session — parked, flagged as such:** + +- `euclid_eceb_editorial_revision.md` and + `pyautoreduce_slacs1430_acs_comparison.md` both work against local paths under + `/mnt/c/Users/Jammy/Science/`. Their state can only be confirmed from the + laptop, and the parked entries say so rather than guessing. + +## Note on the two unverifiable entries + +Parking them clears the orphan condition without asserting anything false, but +it is the weakest disposal here — a task parked because nobody could look is not +the same as a task parked on purpose. Re-check both from the laptop. + +## Original prompt + # Triage the 8 orphaned active/ prompts, then make `orphans` a gate Type: maintenance diff --git a/draft/maintenance/pyautomind/registry_integrity_check.md b/complete/2026/08/registry-integrity-check.md similarity index 76% rename from draft/maintenance/pyautomind/registry_integrity_check.md rename to complete/2026/08/registry-integrity-check.md index 1257d0de..e5bf3b52 100644 --- a/draft/maintenance/pyautomind/registry_integrity_check.md +++ b/complete/2026/08/registry-integrity-check.md @@ -1,3 +1,60 @@ +# registry-integrity-check + +- shipped: 2026-08-08 +- prs: PyAutoMind#158 (`ab80c4fb`), #159 (`edbfd379`), #160 (`7a85821e`), #161 (`86c97981`), #162 (`62cd9ffe`) +- repos: + - PyAutoMind + +## Summary + +`lifecycle.py check` reported OK over a `planned.md` in which 9 of 13 entries +were wrong: `cmd_check` never opened `planned.md` or `parked.md` and never +resolved a `prompt:` path. It now validates the registry files — path +resolution (exact, not via the legacy fallback), state contradictions, slug +uniqueness across registries, and unclaimed `active/` prompts — plus an online +`issues` leg cross-checking tracking issues against GitHub. + +`lifecycle.py` had no test at all before this; it now has 109. + +## The finding that motivated it + +Six of the thirteen `planned.md` entries were work that had **already shipped**, +including the entire M0–M3 release-validation milestone chain (`heart-ci-linkage`, +`build-testpypi-rehearsal-mode`, `heart-release-validation`, +`heart-release-profile-wheel-integration`) plus both auto-simulate entries. Not +one had been retired. A task-selection pass spent most of a session discovering +two of them the hard way, which is what triggered the audit. + +## The lesson worth keeping + +**The trackers were accurate the whole time; only the Mind was stale.** Every +shipped entry had correct upstream state available — a closed issue, a merged +PR, a capability live on `main` — and none of it ever reached `planned.md`. The +drift is not GitHub going out of date, it is the Mind never reading back. That +is why the online `issues` leg exists despite `check` staying hermetic. + +## Traps found while building it + +- **`parked.md` takes prompts in BOTH `draft/` and `active/`.** It holds merely- + scoped tasks *and* started-then-parked ones. Grading it like `planned.md` + flags every genuinely parked task. Caught only because a real entry failed. +- **`- prompt:` values carry trailing prose** (`... .md (carries the phase table)`). + The path is the first token. +- **Nested two-space bullets are values, not fields.** Reading ` - SomeRepo: + some-branch` under `repos:` as a field invents keys out of branch names. +- **A first parser reported 207 false mismatches** in the autolens_workspace + guard audit by assuming `Path("a","b")` and missing the `Path("a") / b / c` + idiom. The corrected pass found 236 resolvable guards and 0 mismatches. + +## Deliberately not done + +Requiring a `prompt:` field on every `active.md` entry. Slug-matching exists +only because entries predate the convention, and it is the weaker claim — +`ep-optimise-updater` was a real entry whose real prompt failed to match on name +alone. Worth doing; not done here. + +## Original prompt + # Teach `lifecycle.py check` to validate the registry files Type: maintenance diff --git a/complete/index.md b/complete/index.md index 89fa3226..f08fc0cc 100644 --- a/complete/index.md +++ b/complete/index.md @@ -6,7 +6,7 @@ Token-light navigation over the finished-work records (schema: only then grep a dated bucket. Curators: edit the band between the CURATED markers; everything below GENERATED is rebuilt. -942 records across 7 buckets. +946 records across 7 buckets. ## Highlights @@ -18,6 +18,7 @@ _(curate hard-won records here — survives regeneration.)_ ## 2026/08 +- [active-prompt-orphan-triage](2026/08/active-prompt-orphan-triage.md) - [astropy-cap-bump](2026/08/astropy-cap-bump.md) — closed manually post-merge — "Part of" in the PR bodies does not auto-close - [autocti-util-dataset-export](2026/08/autocti-util-dataset-export.md) — no GitHub issue — worked directly from the draft prompt in a cloud session on explicit human instruction; the … - [autogalaxy-assistant](2026/08/autogalaxy-assistant.md) — epic; human to close @@ -62,6 +63,7 @@ _(curate hard-won records here — survives regeneration.)_ - [pyautobrain-pr-test-ci](2026/08/pyautobrain-pr-test-ci.md) — auto-closed by the merge - [pyautofit_plot_rst_dead_plotters](2026/08/pyautofit_plot_rst_dead_plotters.md) - [pyautogalaxy-mge-sigma-test](2026/08/pyautogalaxy-mge-sigma-test.md) +- [registry-integrity-check](2026/08/registry-integrity-check.md) - [script-title-underline-off-by-one](2026/08/script-title-underline-off-by-one.md) - [simulator-util-to-af-ex](2026/08/simulator-util-to-af-ex.md) — moved the four 1D-Gaussian simulator helpers out of the duplicated - [small-datasets-loader-pixel-scales](2026/08/small-datasets-loader-pixel-scales.md) @@ -227,6 +229,7 @@ _(curate hard-won records here — survives regeneration.)_ - [eyes-paper-critique](2026/07/eyes-paper-critique.md) — epic #117 CLOSED - [factor-graph-viz-dispatch](2026/07/factor-graph-viz-dispatch.md) - [fitness-nan-guard-contract](2026/07/fitness-nan-guard-contract.md) +- [fix-workspace-start-here-colab-links](2026/07/fix-workspace-start-here-colab-links.md) - [floors-adoption](2026/07/floors-adoption.md) — Phase 4 task 1 — adopt version.minimum_library_version floor (2026.7.9.1) across all 7 workspace config/genera… - [frame-products](2026/07/frame-products.md) — opt-in per-exposure frame products live — TargetSpec.frame_products packages every calibrated _flc/_flt SCI ch… - [frame-registration](2026/07/frame-registration.md) — inter-exposure registration quantified + extracted — frames/manifest.json per-frame registration block (WCS so… @@ -567,6 +570,7 @@ _(curate hard-won records here — survives regeneration.)_ - [wire-verify-install-leg](2026/07/wire-verify-install-leg.md) - [workspace-readme-drift](2026/07/workspace-readme-drift.md) - [workspace-start-here-colab-links](2026/07/workspace-start-here-colab-links.md) — Generic PyAutoLens and PyAutoGalaxy introduction links now open each workspace-root start_here.ipynb rather th… +- [workspace-version](2026/07/workspace-version.md) - [workspace_examples_agent](2026/07/workspace_examples_agent.md) - [worktree-drift-fixes](2026/07/worktree-drift-fixes.md) diff --git a/parked.md b/parked.md index 567c9c6e..88dda799 100644 --- a/parked.md +++ b/parked.md @@ -18,7 +18,49 @@ write the dated `complete///.md` record instead. ## group4-mge-search-benchmark - issue: https://github.com/PyAutoLabs/autolens_profiling/issues/82 +- prompt: active/research_profiling_experiment_in_the_autolens_pr.md - parked: 2026-07-24 — code + first GPU results MERGED (PR #83); worktree/claim RELEASED - remaining: gradient-family sweep (prodigy/lion/adabelief/prodigy_autoconv) + Nautilus anchor on laptop GPU (~/venv/PyAutoGPU, JAX_PLATFORM_NAME=cuda JAX_PLATFORMS=cuda,cpu XLA_PYTHON_CLIENT_MEM_FRACTION=0.5, --config-name local_gpu_fp64), then recovery/walltime aggregation. Warm output preserved in main checkout output/searches/. - note: NEW PATHS (scripts/// restructure LANDED, autolens_profiling#84) — group4 cells now live at scripts/cluster/searches//mge.py (samplers: multi_start_prodigy, multi_start_lion, multi_start_adabelief, multi_start_prodigy_autoconv, nautilus); run them via the sweep driver scripts/misc/searches/sweep.py (e.g. `--only /group/mge` — sweep still keys the group cell class internally, mapping it to scripts/cluster/ on disk). If compile still too heavy: dial _GROUP4_MGE_TOTAL_GAUSSIANS 10->6 and/or _MULTI_START_N_STARTS 64->32. +## matplotlib-inline-standalones +- prompt: active/matplotlib_inline_standalones.md +- parked: 2026-08-08 — surfaced by the orphaned-prompt triage; VERIFIED INCOMPLETE, not shipped +- classification: refactor (autolens_workspace + autogalaxy_workspace) +- remaining: the prompt calls for removing five standalone `# %matplotlib inline` comments. + At least TWO survive on autolens_workspace main — + `scripts/interferometer/features/advanced/potential_correction/start_here.py:36` and + `scripts/imaging/features/advanced/potential_correction/start_here.py:56`. + The autogalaxy_workspace half was not counted; do that first to confirm how many of the + five are left. +- note: do NOT broaden into the old `pyprojroot` bootstrap sweep — the prompt is explicit + that the dependent AutoCTI follow-up owns that. + +## benchmark-calibration-runs +- prompt: active/benchmark_calibration_runs.md +- parked: 2026-08-08 — surfaced by the orphaned-prompt triage; VERIFIED NOT STARTED +- parent-issue: https://github.com/PyAutoLabs/autolens_assistant/issues/57 (the benchmark package itself) +- classification: research (autolens_assistant) +- evidence: `benchmarks/runs/` on autolens_assistant main still contains only `.gitkeep`, exactly + the state the prompt describes. The four frozen prompt cards (`benchmarks/prompts/`) and the + harness (`autoassistant/benchmark.py`) are in place; only the campaign is missing. +- note: needs real model runs, so it is a cost decision rather than a coding task. + +## euclid-eceb-editorial-revision +- prompt: active/euclid_eceb_editorial_revision.md +- parked: 2026-08-08 — surfaced by the orphaned-prompt triage; STATE UNVERIFIED +- classification: docs (euclid_assistant / ECLIPSE-C paper) +- why unverified: the work lives against a local paper checkout + (`/mnt/c/Users/Jammy/Science/euclid`), not a repo this session can read. Whether the ECEB + editorial comments were addressed can only be confirmed from the laptop. +- resume: the prompt carries the board's comments verbatim, incl. the structural request to + move most systems (esp. the multi-page Fig.3) to an appendix and keep only discussed + systems in the main text. Deliverable is the revision plus a response letter and change log. + +## pyautoreduce-slacs1430-acs-comparison +- prompt: active/pyautoreduce_slacs1430_acs_comparison.md +- parked: 2026-08-08 — surfaced by the orphaned-prompt triage; STATE UNVERIFIED +- classification: test (PyAutoReduce + autolens_assistant) +- why unverified: the comparison targets a collaborator dataset at + `/mnt/c/Users/Jammy/Science/subhalo/dataset/slacs/slacs1430+4105`, which this session cannot + see. Confirm from the laptop whether the reduction and parity fits were ever run. diff --git a/scripts/lifecycle.py b/scripts/lifecycle.py index c9a79155..d023daad 100644 --- a/scripts/lifecycle.py +++ b/scripts/lifecycle.py @@ -36,11 +36,12 @@ * every registry `prompt:` path resolves, exactly rather than by fallback, and into the state folder its registry implies * no slug is listed in two registries at once + * no active/ prompt is left unclaimed by every registry Wire into /health and CI. - orphans [--check] - The mirror of `check`: active/ prompts that no registry entry claims. - Report-only by default (see cmd_orphans for why it is not yet a gate). + orphans + The focused view of `check`'s last leg: active/ prompts that no registry + entry claims. `check` grades this too — this lists only them. issues The ONLINE leg (needs `gh` + network, so deliberately not part of @@ -378,10 +379,10 @@ def orphan_prompts(root: Path) -> "list[Path]": def cmd_orphans(args) -> int: """Report active/ prompts no registry claims. - Report-only by default and deliberately NOT wired into `check`: the 2026-08-08 - audit found 8 of 10 active/ prompts unclaimed, and each needs individual - triage (shipped? in flight? abandoned?) against its upstream repo before the - condition can be a hard gate. Pass --check once that backlog is cleared. + This condition is now part of `check` (it became a gate on 2026-08-08, once + the 8-prompt backlog the audit found was triaged to zero). The subcommand + stays as the focused view — `check` reports orphans alongside everything + else, this lists only them. """ orphans = orphan_prompts(ROOT) if not orphans: @@ -390,7 +391,7 @@ def cmd_orphans(args) -> int: print(f"lifecycle orphans: {len(orphans)} active/ prompt(s) no registry claims") for f in orphans: print(f" - {f.relative_to(ROOT)}") - return 1 if getattr(args, "check", False) else 0 + return 1 def _prune_ledger_section(path: Path, slug: str) -> bool: @@ -705,6 +706,10 @@ def cmd_check(args) -> int: problems.append(f"file in both active/ and complete/: {f.name}") problems.extend(registry_problems(ROOT)) + problems.extend( + f"active/ prompt no registry entry claims: {f.relative_to(ROOT)}" + for f in orphan_prompts(ROOT) + ) if problems: print("lifecycle check: DRIFT") @@ -748,8 +753,6 @@ def main() -> int: iss.set_defaults(func=cmd_issues) o = sub.add_parser("orphans", help="report active/ prompts no registry claims") - o.add_argument("--check", action="store_true", - help="exit non-zero if any orphan exists (once the backlog is cleared)") o.set_defaults(func=cmd_orphans) args = p.parse_args()