What's new
Carrier-follow spectral tiling (the sweep, upgraded). The receiver window now moves with every lock-shift step, so the field-stepped sweep is no longer limited by the ±3.45 kHz acquisition band: up to 15 steps spanning ±25 ppm of B₀, each still verified by measurement. Re-lock jumps are capped at a gamma-scaled safe hop (autolock capture is a field quantity — a "4 kHz" hop on a ¹³C axis would be a ~16 kHz field jump), with multi-hop instructions for ladder entry and return. The pulse-pair estimator's sign convention is now resolved deterministically at baseline by an automatic carrier-displacement 1D (expno 29, role sweep_signcal) instead of being inferred from the operator's first step.
Autostep (Tier 2, opt-in). xpy spin_noise_run sweep autostep lets the script actuate the lock-shift steps itself through the documented edlock-table + lopo/lock chain: it clones the session solvent's row, detects the table's shift column once per console (edlock GUI as oracle, cached with a layout fingerprint), and walks the ladder in safe hops with lock-off automation via documented AU macros — operator-verified once at setup. The facility's lock table is snapshotted and restored on every path, including a crash-handler cleanup and recovery from a previous run's leftovers. Every failure falls back to the v0.5 operator dialogs for that step; measured-not-target is unchanged. First live use per console family is gated by docs/autostep_bench_checklist.md — the actuation chain is documented Bruker behavior but not yet hardware-verified by us.
¹⁹F / X-nucleus sessions. The orchestrator inherits the observed nucleus and carrier from the operator's template, records observe_nucleus/observe_freq_mhz with h1_freq_mhz as the ¹H-equivalent field coordinate (one consistent IUPAC-ratio gamma table), and gamma-scales the field-unit arithmetic. docs/f19_pilot.md is the site checklist — a C₆F₆ tube on any F-capable probe adds proton-coupling mass points essentially for free.
Lock-channel metadata. LOCNUC/BF2/SFO2 recorded per session; per-step lock-shift ppm, carrier, local deviation, actuation basis, and lock state recorded in field_sweep.
Analysis riders (facility_report). A persistent-line catalog classifies every narrow feature across carrier shifts as spin line / window-fixed (receiver spur) / absolute-fixed (RFI, clock spur — or candidate) — the groundwork for the dark-photon line search and the spur catalog. A native-resolution sub-virial pass ships as infrastructure (it states its own no-chirp-templates caveat). Every report now carries the axion-mass coordinate and the axial-vector conversion factor. Carrier-follow bundles are fitted in the correct local frame, sign-unresolved substituted targets are labeled target_confirmed_unsigned with an honesty line, and v0.5-shape bundles analyze exactly as before.
Contract and schema
Schema stays 2.0 — all additions are optional keys, documented in place, including the one sanctioned exception to the measured-never-target rule (sign-unresolved steps within 30 Hz). Role enums gain sweep_signcal. Old bundles remain valid; the uploader selftest passes v0.5 and v0.6 shapes.
Reviewed and tested
Two adversarial review passes (feature review: 24 findings fixed before commit; release review: autostep hop discipline, crash-safe table handling, honest lock states, safe dialog defaults). Static checks gained a Jython-2.2 grammar guard (AST-level — a single stray conditional expression would brick TopSpin 2.x consoles) and an IUPAC gamma-ratio consistency check. Full battery green: harness ×3 (including an autostep mock-fallback variant), sweep-report tests for both bundle generations, upload integration, pack round-trip.
Status, stated plainly: desk-tested against synthetic and archival data; the carrier-follow sweep and autostep have not yet run a live acquisition — first on-instrument pilots are the next milestone, and autostep additionally requires the bench checklist per console family.