diff --git a/complete/2026/08/smoke-install-stale-jax-pin.md b/complete/2026/08/smoke-install-stale-jax-pin.md new file mode 100644 index 00000000..19c394c6 --- /dev/null +++ b/complete/2026/08/smoke-install-stale-jax-pin.md @@ -0,0 +1,168 @@ +## smoke-install-stale-jax-pin +- issue: https://github.com/PyAutoLabs/autolens_workspace_test/issues/266 +- completed: 2026-08-23 +- workspace-pr: https://github.com/PyAutoLabs/autolens_workspace_test/pull/268 (merged a97f052) +- sibling-pr: autogalaxy_workspace_test — companion PR, identical change; its smoke_install.sh on main carries the same JAXCHECK block +- summary: Dropped the vestigial `jax<0.7 jaxlib<0.7` pin from smoke_install.sh. Added in #82 solely to keep tensorflow-probability==0.25.0 importable; #184 removed that dependency for tfp-nightly and left the pin behind. Not inert: jax is a base dep of autonerves (>=0.7.0,<0.12.0), so the pin downgraded a conforming install to 0.6.2 and only the following `[optional]` re-resolution pulled it back to 0.10.2 — CI green by line ordering, not by constraint. Replaced with a #82→#184 trail comment plus a JAXCHECK heredoc asserting the resolved version in [0.7.0, 0.12.0). +- mind-drift: shipped without touching Mind state; retired to complete/ on 2026-08-27 after the still-live dashboard chip caused a re-pick. See the close-out note below. + +`autolens_workspace_test/.github/scripts/smoke_install.sh` pinned +`jax<0.7 jaxlib<0.7`. The pin was added in #82 for exactly one reason, stated in +its own commit message: keeping `tensorflow-probability==0.25.0` importable, +since `tfp.substrates.jax` referenced `jax.interpreters.xla.pytype_aval_mappings`, +removed in JAX 0.7.0. #184 then deleted `pip install tensorflow-probability==0.25.0` +when the stack moved to `tfp-nightly` (pinned by `PyAutoArray[optional]`, whose +own comment documents the nightly as the `jax>=0.7`-compatible one). The pin +outlived the dependency it protected. + +The framing that made it worth fixing rather than shrugging at: it was **not +inert**. `jax` is a *base* dependency of `autonerves` (`jax>=0.7.0,<0.12.0`, +PyAutoLens#702), so the preceding line already installed a conforming jax; the +pin then downgraded it to 0.6.2 — a configuration the stack does not claim to +support — and only the *following* `[optional]` re-resolution pulled it back to +0.10.2. CI was green by **line ordering, not by constraint**. Reordering those +two lines, or a change in what the extras resolve, would have dropped the whole +smoke suite onto jax 0.6.2 silently, surfacing as unexplained smoke breakage +rather than as an install error. + +## PRs + +- autolens_workspace_test#268 → `a97f052` (issue autolens_workspace_test#266 closed), + branch `feature/smoke-install-stale-jax-pin`, merged 2026-08-23. +23/−1, one file. +- `autogalaxy_workspace_test` carried the identical line and was fixed in a + companion PR; its `smoke_install.sh` on `main` now carries the same `JAXCHECK` + block. + +## The fix + +Delete the pin and let `autonerves`' base requirement govern. In its place: + +1. A comment recording the #82 → #184 trail, so the pin is not reintroduced by + someone reading the file cold. +2. A `JAXCHECK` heredoc appended after the final + `pip install --force-reinstall --no-deps ./PyAutoNerves`, asserting + `(0, 7) <= (major, minor) < (0, 12)` on the resolved `jax.__version__` and + printing it to the CI log. With `set -e` at the top, a violation aborts the + install step. + +The `tfp-nightly` NOTE block and the trailing `--force-reinstall --no-deps +./PyAutoNerves` were preserved verbatim — both remain accurate. + +Two decisions worth not "simplifying" later: + +- **Deleted, not rewritten as an honest `jax>=0.7,<0.12`.** A second copy of the + constraint drifts, and this one already had: the range was `<0.11` when the + defect was filed and `<0.12` by the time it was fixed. The assertion checks the + range without owning it. +- **The guard compares a major/minor tuple, not `packaging.version`.** It runs + inside the install epilogue, where an undeclared import would fail the install + rather than fail softly. `import jax` is deliberately unguarded: the workflow + runs on `ubuntu-latest`, where `autonerves`' platform marker always installs + jax, so an absent jax is itself worth catching. That would need softening only + if this workflow ever ran on Intel macOS. + +## Verification + +The PR's own Smoke Tests run **is** the from-scratch install replay the prompt +asked for; the guard is what turns it from an inference into a check. Before +that: `bash -n` clean; the guard executed as a real bash heredoc against a stub +`jax` (`0.10.2` prints and exits 0; `0.6.2` and `0.12.0` exit 1 with the +explanatory message); boundary cases `0.7.0`/`0.9.0`/`0.10.2`/`0.11.4` pass and +`0.6.2`/`0.12.0`/`1.0.0` fail. + +## Sibling sweep (the prompt's scope item 4) + +`autocti_workspace_test` and `autofit_workspace_test` were checked at fix time +and carry no jax pin. Re-confirmed at close-out: an org-wide code search for +`jaxlib<0.7` across PyAutoLabs returns **no live script** — only this prompt's +own text in PyAutoMind and one prose mention in +`complete/2026/08/jax-grad-local-vs-ci-assertions.md`. + +## Close-out note: this record is late, and why + +The task shipped on 2026-08-23 without ever touching Mind state — no `active.md` +entry, no `active/` move, no record. The prompt sat in +`draft/maintenance/ci/` and kept rendering on `dashboard.md` as pickable +backlog with a live `/start_dev` chip, which is how it came to be picked again on +2026-08-27. Nothing downstream could tell the difference: as `AGENTS.md` notes, +a shipped-but-unretired prompt renders faithfully and no workflow detects it. +`lifecycle.py check` did not catch it either — its invariant is that no +`active.md` slug has a record, and this task was in neither place. + +The re-pick cost only a verification pass, because the prompt named the file and +the file's current contents were the answer. The generalisable check for the next +one: before opening an issue, read the prompt's own target file on `main`. If the +defect it describes is not there, look for the merged PR before doing anything +else. + +## Original prompt + +# smoke_install.sh's stale `jax<0.7` pin — CI is on the right jax by accident + +Type: maintenance +Target: ci +Repos: +- @autolens_workspace_test +Difficulty: low +Autonomy: supervised +Priority: medium +Status: formalised +Filed: 2026-08-22 (backfilled from git) + +Found 2026-08-22 while building a CI-equivalent environment to reproduce +autolens_workspace_test#260. Latent — CI is green today — but it is green for the +wrong reason. + +## The defect + +`autolens_workspace_test/.github/scripts/smoke_install.sh:9`: + +```bash +pip install "jax<0.7" "jaxlib<0.7" +``` + +Replaying the install script verbatim, that line **downgrades jax to 0.6.2** and +raises a resolver conflict against autonerves' own requirement: + +``` +autonerves 9999.0.0.dev0 requires jax<0.11.0,>=0.7.0; ... but you have jax 0.6.2 +which is incompatible. +Successfully installed jax-0.6.2 jaxlib-0.6.2 +``` + +The install only ends up on the intended **0.10.2** because the *next* line's +`[optional]` extras happen to pull it back up: + +```bash +pip install "./PyAutoArray[optional]" "./PyAutoGalaxy[optional]" "./PyAutoLens[optional]" +``` + +## Why it matters + +The pin no longer expresses the intent it was written for, and the correct +outcome now depends on line ordering rather than on the constraint. Any +reordering of those two lines, or a change to what the `[optional]` extras +resolve, would silently drop the entire smoke suite onto jax 0.6.2 — and because +`autonerves` declares `jax>=0.7`, that is a configuration the stack does not +claim to support. The failure would surface as unexplained smoke breakage, not as +an install error. + +The comment block immediately below that line (about `tfp-nightly` vs +`tensorflow-probability`) is still accurate and should be preserved. + +## Suggested scope + +1. Establish what the `jax<0.7` pin was originally protecting against, and whether + that reason still holds — do not simply delete it because it looks stale. +2. Either remove it (letting `autonerves`' `jax<0.11.0,>=0.7.0` govern) or replace + it with a pin that states the real intended range. +3. Verify by replaying the install from scratch and asserting the resolved jax + version, rather than inferring it from a green run. +4. Check whether sibling workspaces' install epilogues carry the same stale pin. + + + + diff --git a/complete/index.md b/complete/index.md index 840b5f1f..8d06832e 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. -1168 records across 7 buckets. +1169 records across 7 buckets. ## Highlights @@ -253,6 +253,7 @@ _(curate hard-won records here — survives regeneration.)_ - [small-datasets-loader-pixel-scales](2026/08/small-datasets-loader-pixel-scales.md) - [small-datasets-regime-stamp](2026/08/small-datasets-regime-stamp.md) - [small-datasets-rmtree-committed-data](2026/08/small-datasets-rmtree-committed-data.md) +- [smoke-install-stale-jax-pin](2026/08/smoke-install-stale-jax-pin.md) — Dropped the vestigial `jax<0.7 jaxlib<0.7` pin from smoke_install.sh. Added in #82 solely to keep tensorflow-p… - [smoke-runner-delegation](2026/08/smoke-runner-delegation.md) - [smoke-runner-jupyter-guard](2026/08/smoke-runner-jupyter-guard.md) - [smoke-surface-retime-sweep](2026/08/smoke-surface-retime-sweep.md) diff --git a/dashboard.html b/dashboard.html index 63741c99..d116c46b 100644 --- a/dashboard.html +++ b/dashboard.html @@ -272,12 +272,13 @@
134 filed prompts, not started — sorted most-pickable first (priority, then size). 24 of them belong to an epic and are listed only under Epics below.
Cluster-scale gradient-search benchmark (Prodigy vs Nautilus, point-source)
intake reconcile cannot see a prompt that shipped with no Mind-side…jax<0.7 pin — CI is on the right jax…intake reconcile cannot see a prompt that shipped with no Mind-side trace — pyautobrain · medium · supervised · mediumjax<0.7 pin — CI is on the right jax… — ci · low · supervised · mediumintake reconcile should score prompts against each other, not only… |
+| 2026-08-27 | filed | intake reconcile cannot see a prompt that shipped with no Mind-side… |
| 2026-08-27 | issued | Why does XLA CPU's Eigen thread pool wedge on the multi_dataset vmap… |
| 2026-08-27 | filed | Two organs are missing this session's fixes, and the hook still ships… |
| 2026-08-27 | filed | Should TransformedMessage carry its own support, rather than the… |
@@ -1203,12 +1204,12 @@ The 50 newest things to happen to the work in hand, newest first — issued, par
| 2026-08-27 | filed | Multi-plane time delays |
| 2026-08-27 | filed | LensCalc NumPy Hessian step is too coarse for multi-plane tracers |
| 2026-08-27 | filed | Cross-validate multi-plane ray tracing |
-| 2026-08-27 | filed | Board phase 2: the remaining four legs onto the seam |
gh |
| 2026-08-24 | filed | wiki-currency's --check-version gate rots on every library main merge |
@@ -1218,13 +1219,12 @@ The 50 newest things to happen to the work in hand, newest first — issued, par
| 2026-08-24 | filed | Heart's local smoke runner cannot run any CTI workspace — no autocti… |
| 2026-08-23 | filed | pynufft removal: unswept downstream residue (1 hard break + stale… |
| 2026-08-23 | filed | Phase 3: stop installing pynufft in Hands/Heart CI and PyAutoCTI… |
-| 2026-08-23 | filed | Brain board follow-ups: what real mornings surface |
jax<0.7 pin — CI is on the right jax… |
+| 2026-08-23 | filed | Brain board follow-ups: what real mornings surface |
| 2026-08-22 | filed | The reconstruction noise map describes a different estimator than the… |
| 2026-08-22 | filed | Point-source JSON datasets record no resolution regime |
| 2026-08-22 | filed | Is Intel macOS a supported platform, and what is the numpy-only… |
diff --git a/draft/feature/pyautobrain/intake_reconcile_absence_signal.md b/draft/feature/pyautobrain/intake_reconcile_absence_signal.md
new file mode 100644
index 00000000..0041fdd6
--- /dev/null
+++ b/draft/feature/pyautobrain/intake_reconcile_absence_signal.md
@@ -0,0 +1,84 @@
+# `intake reconcile` cannot see a prompt that shipped with no Mind-side trace
+
+Type: feature
+Target: pyautobrain
+Repos:
+- @PyAutoBrain
+Difficulty: medium
+Autonomy: supervised
+Priority: medium
+Status: formalised
+Filed: 2026-08-27
+
+Add the inverted signal: a prompt quoting a literal line that is GONE upstream.
+
+Found 2026-08-27 by re-picking draft/maintenance/ci/smoke_install_stale_jax_pin.md
+via /start_dev. The prompt had shipped four days earlier
+(autolens_workspace_test#266, closed by PR #268, a97f052, merged 2026-08-23) and
+had never been retired: no active.md entry, no active/ move, no complete/ record.
+It kept rendering on dashboard.md as pickable backlog with a live /start_dev chip,
+which is exactly how it got picked again.
+
+Nothing detects this class today. Two guards were checked directly against the
+restored prompt:
+
+1. `lifecycle.py check` — its invariant is that no active.md slug has a record.
+ A task that skips Mind state entirely is in NEITHER place, so the check passes.
+2. `pyauto-brain intake reconcile` — every signal it emits (`referenced`,
+ `record-says-shipped`, `shared-identifiers`, `rare-topic-overlap`,
+ `stale-status`) needs a Mind-side trace. With the prompt restored,
+ `intake reconcile maintenance/ci` did not flag it. Neither did
+ `intake reconcile maintenance/ci --repo autolens_workspace_test`, pointed
+ straight at the right repo reading its live source: **0 suspects of 132
+ scanned**.
+
+## Why --repo missed it
+
+`--repo` tests PRESENCE: "the prompt NAMES things that exist upstream". This
+prompt names `smoke_install.sh`, which does still exist — so presence tells you
+nothing.
+
+The defect this prompt described was an ABSENCE. It quoted a literal line:
+
+```bash
+pip install "jax<0.7" "jaxlib<0.7"
+```
+
+That line is gone from upstream. A backlog prompt quoting a literal code line
+that no longer exists in the file it names is close to a proof the work shipped —
+far stronger than the presence signal already implemented, and it fires precisely
+in the no-Mind-side-trace case the existing signals are blind to.
+
+## Suggested scope
+
+1. Add an absence signal to `intake reconcile --repo`: for each fenced code block
+ or backticked line in the prompt that looks like source (not prose), check
+ whether it still occurs in the file the prompt names. Quoted-and-now-absent
+ ranks higher than any current signal.
+2. Keep it in the existing `needs-review` band and keep retirement human — the
+ same guard rail reconcile already states. A quoted line can vanish for reasons
+ other than the prompt shipping (an unrelated refactor, a reworded quote), so
+ this ranks for review, it does not retire.
+3. Consider whether the prompt's `Repos:` header should drive the upstream target
+ automatically. Here the target FOLDER was `ci` (not a repo, so `--repo` is
+ refused and must be passed by hand) while the header named
+ `@autolens_workspace_test`. The header had the answer the flag had to be told.
+4. Decide whether anything should run this on a schedule. Today reconcile is
+ on-demand and read-only, so the drift persists silently until someone re-picks
+ the prompt — which is a working detector, just an expensive one.
+
+Not in scope: closing the loop by having the ship skills record Mind state. That
+is the upstream cause and deserves its own prompt if it is worth chasing; this one
+is about detecting the drift that already exists.
+
+
+
+
diff --git a/draft/maintenance/ci/smoke_install_stale_jax_pin.md b/draft/maintenance/ci/smoke_install_stale_jax_pin.md
deleted file mode 100644
index 0431db40..00000000
--- a/draft/maintenance/ci/smoke_install_stale_jax_pin.md
+++ /dev/null
@@ -1,69 +0,0 @@
-# smoke_install.sh's stale `jax<0.7` pin — CI is on the right jax by accident
-
-Type: maintenance
-Target: ci
-Repos:
-- @autolens_workspace_test
-Difficulty: low
-Autonomy: supervised
-Priority: medium
-Status: formalised
-Filed: 2026-08-22 (backfilled from git)
-
-Found 2026-08-22 while building a CI-equivalent environment to reproduce
-autolens_workspace_test#260. Latent — CI is green today — but it is green for the
-wrong reason.
-
-## The defect
-
-`autolens_workspace_test/.github/scripts/smoke_install.sh:9`:
-
-```bash
-pip install "jax<0.7" "jaxlib<0.7"
-```
-
-Replaying the install script verbatim, that line **downgrades jax to 0.6.2** and
-raises a resolver conflict against autonerves' own requirement:
-
-```
-autonerves 9999.0.0.dev0 requires jax<0.11.0,>=0.7.0; ... but you have jax 0.6.2
-which is incompatible.
-Successfully installed jax-0.6.2 jaxlib-0.6.2
-```
-
-The install only ends up on the intended **0.10.2** because the *next* line's
-`[optional]` extras happen to pull it back up:
-
-```bash
-pip install "./PyAutoArray[optional]" "./PyAutoGalaxy[optional]" "./PyAutoLens[optional]"
-```
-
-## Why it matters
-
-The pin no longer expresses the intent it was written for, and the correct
-outcome now depends on line ordering rather than on the constraint. Any
-reordering of those two lines, or a change to what the `[optional]` extras
-resolve, would silently drop the entire smoke suite onto jax 0.6.2 — and because
-`autonerves` declares `jax>=0.7`, that is a configuration the stack does not
-claim to support. The failure would surface as unexplained smoke breakage, not as
-an install error.
-
-The comment block immediately below that line (about `tfp-nightly` vs
-`tensorflow-probability`) is still accurate and should be preserved.
-
-## Suggested scope
-
-1. Establish what the `jax<0.7` pin was originally protecting against, and whether
- that reason still holds — do not simply delete it because it looks stale.
-2. Either remove it (letting `autonerves`' `jax<0.11.0,>=0.7.0` govern) or replace
- it with a pin that states the real intended range.
-3. Verify by replaying the install from scratch and asserting the resolved jax
- version, rather than inferring it from a green run.
-4. Check whether sibling workspaces' install epilogues carry the same stale pin.
-
-
-
-