Found while designing #350. Synthetic only, not rig-confirmed.
What happens. In analyse_tau_leg (ac-daemon/src/handlers/calibrate/tau/measure.rs), #368 put the SNR gate in front of the edge-margin check. Take a τ arrival that lands more than about 50 samples past the far edge of the window (96 kHz, calibrate's own ESS, 50 ms half-window). Its in-window skirt reads a pre-impulse SNR of 17–23.6 dB, so LowSnrRefusal fires first. The operator then reads "the deconvolution did not find a peak distinguishable from noise". The actual situation is a clean cable whose arrival lies outside the window. EdgeRefusal exists to say exactly that, but it is never reached.
Evidence (synthetic). Calibrate's stimulus (tau_sweep_params(96000)) was delayed by d samples, amplitude 0.03, with white noise from none up to −20 dBFS, run through the same inverse_sweep → deconvolve_full → extract_irs(…, 1, 9600) → ir_peak → pre_impulse_snr_db chain:
- d = 4799–4850 (arrival 0–50 samples past the edge): the peak pins at the last sample with SNR 24.6–28.5 dB, so
EdgeRefusal fires.
- d ≥ 4860: SNR is 23.6 dB or lower, so
LowSnrRefusal fires.
- d = 4880–4890: the peak lands 148–218 samples inside the edge with SNR 20–22.8 dB.
LowSnrRefusal fires. The margin would have caught these too.
The 2026-08-22 rig pass 3 (work/rig/rig-2026-08-22-tau-window-350-results.md) saw EdgeRefusal on hardware, but it ran before #368 existed. Nobody has run an out-of-window arrival on hardware since the gate was added.
Why it matters. Per "name what to check, not why": the refusal text asserts a cause, noise, when the likelier cause is the window. No wrong number is returned, because both paths refuse. The fault is the reason the operator reads.
Out of scope for #350. #350's acceptance criteria say that no refusal text or ordering changes. Any fix here changes what the operator sees, so it needs UX.
Found while designing #350. Synthetic only, not rig-confirmed.
What happens. In
analyse_tau_leg(ac-daemon/src/handlers/calibrate/tau/measure.rs), #368 put the SNR gate in front of the edge-margin check. Take a τ arrival that lands more than about 50 samples past the far edge of the window (96 kHz, calibrate's own ESS, 50 ms half-window). Its in-window skirt reads a pre-impulse SNR of 17–23.6 dB, soLowSnrRefusalfires first. The operator then reads "the deconvolution did not find a peak distinguishable from noise". The actual situation is a clean cable whose arrival lies outside the window.EdgeRefusalexists to say exactly that, but it is never reached.Evidence (synthetic). Calibrate's stimulus (
tau_sweep_params(96000)) was delayed by d samples, amplitude 0.03, with white noise from none up to −20 dBFS, run through the sameinverse_sweep→deconvolve_full→extract_irs(…, 1, 9600)→ir_peak→pre_impulse_snr_dbchain:EdgeRefusalfires.LowSnrRefusalfires.LowSnrRefusalfires. The margin would have caught these too.The 2026-08-22 rig pass 3 (
work/rig/rig-2026-08-22-tau-window-350-results.md) sawEdgeRefusalon hardware, but it ran before #368 existed. Nobody has run an out-of-window arrival on hardware since the gate was added.Why it matters. Per "name what to check, not why": the refusal text asserts a cause, noise, when the likelier cause is the window. No wrong number is returned, because both paths refuse. The fault is the reason the operator reads.
Out of scope for #350. #350's acceptance criteria say that no refusal text or ordering changes. Any fix here changes what the operator sees, so it needs UX.