|
| 1 | +# The delaunay NaN probe injected above the boundary the validator guards |
| 2 | + |
| 3 | +autolens_workspace_test#277 (`995f0c9`), shipped 2026-08-24 — the first of the |
| 4 | +two bugs the smoke-surface retime sweep (#274, |
| 5 | +`complete/2026/08/smoke-surface-retime-sweep.md`) found hiding behind SLOW |
| 6 | +markers. Never issued as a GitHub issue: filed as a draft bug prompt at 18:0x |
| 7 | +and fixed the same evening. |
| 8 | + |
| 9 | +## What shipped |
| 10 | + |
| 11 | +`scripts/interferometer/jax_likelihood/delaunay.py`'s NaN-poisoning probe |
| 12 | +built an instance from an all-NaN vector via `instance_from_vector`, dying at |
| 13 | +autogalaxy `validate_ell_comps` (`ModelParameterException`) before testing the |
| 14 | +JAX NaN-lane isolation it exists to test — deterministic exit 1 on both |
| 15 | +Python legs, 5/5 (run 32741371308). The probe now builds the instance from |
| 16 | +prior medians and poisons a single downstream leaf |
| 17 | +(`mass.einstein_radius = np.nan`) by attribute assignment, below the |
| 18 | +constructor guard — a like-for-like port of the shipped imaging sibling probe |
| 19 | +against the identical model, assertion unchanged. `no_run.yaml`'s NEEDS_FIX |
| 20 | +entry removed, restoring mega-run coverage. |
| 21 | + |
| 22 | +Validated in CI before the PR: retime dispatch 32759921650 on the fix branch — |
| 23 | +NEITHER on both legs (42.0 s / 43.6 s at 14–15 % of cap), with the |
| 24 | +previously-unreachable tail passing ("invalid Delaunay mesh reaches the raw |
| 25 | +interferometer likelihood as NaN", TransformerNUFFT cross-check). |
| 26 | + |
| 27 | +## Key traps / findings |
| 28 | + |
| 29 | +- **The validator was right.** NaN rejection in `validate_ell_comps` is a |
| 30 | + deliberate contract: present from the validator's birth (autogalaxy |
| 31 | + `a366f771`, with NaN/inf parametrized as rejected across the guard family) |
| 32 | + and deliberately softened to a resampling `FitException` in `be61b8d0`. The |
| 33 | + probe-side fix was the only correct side. |
| 34 | +- **A probe that constructs pathological inputs through the public |
| 35 | + construction path inherits the public path's validation.** Poison below the |
| 36 | + boundary (post-construction attribute assignment) — the imaging sibling had |
| 37 | + already made this move; interferometer was the straggler. |
| 38 | +- The local container could not run the stack (Python 3.11 vs the libraries' |
| 39 | + `>=3.12` pin), so validation ran as a retime dispatch on the branch before |
| 40 | + the PR — the harness this same day's work repaired. |
| 41 | + |
| 42 | +## Follow-ups |
| 43 | + |
| 44 | +None of its own. The sibling bug found by the same sweep — |
| 45 | +`gradient_eager_jit_divergence_py313.md`, root-caused to an NNLS |
| 46 | +`while_loop` branch flip — remains in `draft/` with its fix direction |
| 47 | +recorded (pin `nnls_solver_tol`/`max_iter`). |
| 48 | + |
| 49 | +## Original prompt |
| 50 | + |
1 | 51 | # The delaunay.py NaN-poisoning probe dies in ell_comps validation before it can probe anything |
2 | 52 |
|
3 | 53 | Type: bug |
|
0 commit comments