A patch release. Nothing in the shipping prescription or the generated values changed — dataset v5.0.0 is untouched, and the engine's output is bit-identical to what 1.0.0 produced (checked with bitident_snapshot.jl on both prescriptions).
What is in it is verification and contract work.
⚠ If you use tools/temari_contract.py, read this
Two changes affect callers:
f_at()now returns three values,(F, bound, region), where it previously returned two.regionistabulated,unrecordedorimpossible— the last being a request aboves_kin = 1/λ(E₀), where no such beam pair exists on the Ewald sphere and the bound is thereforeNaNrather thaneps.- The golden vector moved at off-node E₀. The loader's E₀ interpolation disagreed with the shipping consumer in three ways: the coordinate (raw E₀ over raw F, instead of
ln(u−1)withlog Fwhere the column is positive), the endpoint slopes (a one-sided difference instead of the three-point formula), and out-of-range behaviour (clamping instead of extrapolating on the end cubic). Over 4.58 M points the worst disagreement was 2.9e-03, and 175 % where the sign flips. Corrected, and cross-checked against the Julia implementation to 4.5e-15.
Fe K at 137 kV, s = 2.50 now reads +3.8749841608e-01 (was +3.8749427661e-01). Values at E₀ nodes are unchanged.
Verification
- The E₀ interpolation error was measured directly, by recomputing rows inside the intervals rather than inferring from leave-one-out. Over a stratified sample of 50 channels and 450 points the worst is 3.0e-03. C6 does not bound it — in the risky stratum it falls below the truth in 20 of 25 channels, because its leave-one-out drops only interior nodes and never examines the interval next to the threshold. Widening it does not help either: the widened figure comes in low in 4 of 50, with the ratio spanning a factor of 48.
check_tablesreports it, and does not gate on it. - The error in F was pushed through to the ALCHEMI observable. Since F enters only through μ and the Bloch solution does not depend on F, two runs differing only in the shape isolate it exactly. The observable responds only below about 2 Å⁻¹ — a perturbation at 4–6 Å⁻¹ moves it by 1.5e-09, above 10 Å⁻¹ by nothing. The interpolation error sits at 6.7–11.6 Å⁻¹, so it does not reach the observable: at most 1.2e-04 on the site ratio.
- The small-component fraction now has an external check, and is gated in CI. All six values, three elements in both spin states, fall inside the interval that rounds to the one-significant-digit figures in the literature.
- Beyond
s_certthe contract now distinguishes two regions rather than treating them alike. No format change:s_kindepends only on E₀, so it is computed rather than stored — putting it in the JSON would create a second source of truth.schema_versionstays at 2.
Other
- Julia 1.12.6 produces bit-identical output (both snapshots differ only in the version header). The long fleet run is still unevaluated.
- The watchdog now treats a frozen CPU with a stalled log as wedged after three minutes, instead of waiting fifteen; if CPU cannot be read it falls back to the old rule rather than risk killing a healthy lane.
- The sample output in the documentation had been showing v2-era numbers and is regenerated from a real run.
The data
Distributed separately, under CC-BY-4.0: dataset-v5.0.0. The software remains MIT.