You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
fix(snr): LTS glitch guard — skip meter update when same-frame noise >= signal (synced frame at sub-0 dB = measurement fault; rig F237 meter collapse to -9.2 at dial 20)
Copy file name to clipboardExpand all lines: docs/CHANGELOG.md
+20Lines changed: 20 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -10,6 +10,26 @@ This log tracks all bug fixes and behavioral changes to prevent re-doing work du
10
10
11
11
---
12
12
13
+
## 2026-07-13 — fix(snr): LTS glitch guard — a synced frame at sub-0 dB is a measurement fault, not channel state (rig F237: meter collapsed to −9.2 at a 20 dB channel)
14
+
15
+
The 07-10 estimation-noise debias floored at 0.01× when a glitched LTS pair
16
+
(rig timing jitter on fading) pushed the noise estimate above the signal —
17
+
one glitch frame injected a −19.5 dB reading into the meter EMA; two or three
18
+
collapsed it to −9.2 at MPG@20 → authority demote churn, ACK-staircase
19
+
flapping, ring spread ±13.5 (the pre-fix guard-biased code had masked the same
20
+
glitches as spikes UP). Physics: a frame that achieved LTS sync has
21
+
processing-gain-proven signal presence — same-frame noise ≥ signal is a fault;
22
+
SKIP the meter update (both estimator paths). A genuine deep fade never syncs
23
+
and thus never lies either way. Sim gates passed pre-fix because sim timing is
24
+
clean — the rig is the glitch amplifier (fidelity lesson: single-seed sim
25
+
gates under-sample LTS-glitch behavior).
26
+
27
+
Verified: OFDMSnrCalibration full matrix unchanged; good@20 PASS 1650 bps with
28
+
ZERO negative lts readings; ctest 85/85 (one TNC straggler artifact, clean on
if [[ "$EXPECT_MOD"=="any"||"$EXPECT_MOD"=="coherent" \
269
278
||"${ULTRA_LOCK_RATE:-0}"=="0" ]];then
270
279
alpha_unexpected_modes=0
271
280
bravo_unexpected_modes=0
281
+
alpha_unexpected_rates=0
282
+
bravo_unexpected_rates=0
272
283
fi
273
284
file_crc_ok="$(count_pattern "\\[FILE\\] Received .*\\(${FILE_BYTES} bytes, CRC ok|FileTransfer: Received OK \\(${FILE_BYTES} bytes|Received OK .*${FILE_BYTES} bytes.*CRC""$BRAVO_LOG")"
274
285
alpha_file_done="$(count_pattern '\[FILE\] Transfer complete|FileTransfer: Transfer complete'"$ALPHA_LOG")"
@@ -317,19 +328,20 @@ scenario_passed() {
317
328
# PASS = the file delivered CRC-clean (BRAVO verified the file + ALPHA finalized the
318
329
# transfer). DELIVERY is the verdict.
319
330
#
320
-
#We do NOT require the run to have hit the EXACT expected (mod, rate). The old gate
331
+
#Adaptive runs do not have to hit the exact expected (mod, rate). The old gate
321
332
# `alpha_mode_count>0 && bravo_mode_count>0` counted the literal string
322
333
# "configured for <EXPECT_MOD> <EXPECT_RATE>" and so FALSE-FAILED any delivered transfer
323
334
# whose negotiated rate differed from --expect-rate. That is common and correct on a
324
335
# fading channel: at `good --snr-db 16` the MEASURED fading varies seed-to-seed and many
325
336
# seeds land in the Moderate class (>=0.65), where the ladder rightly picks QPSK R1/4 —
326
337
# not the R2/3 a caller guessed. Those runs delivered CRC-clean but were stamped FAIL
327
338
# (REASON=process_exit_before_pass), corrupting reliability sweeps. The actual negotiated
328
-
# mode is recorded as ACTUAL_DATA_MODE in summary.env for diagnostics; EXPECT_RATE is
329
-
# only used to size the timeout budget, not to gate PASS.
339
+
# mode is recorded as ACTUAL_DATA_MODE in summary.env for diagnostics. Locked probes
340
+
# are different: every reported data-mode rate must match EXPECT_RATE, and the
341
+
# modulation watchdog below enforces EXPECT_MOD.
330
342
#
331
-
# We still reject drift to an UNEXPECTED MODULATION (e.g. QAM16 when probing QPSK) — that
332
-
#is a real "wrong rung" signal, distinct from a benign rate change within the same mod.
343
+
# We reject drift to an unexpected modulation on locked probes (e.g. QAM16 when
344
+
#probing QPSK); rate changes are rejected by the unexpected-rate counters.
333
345
#
334
346
# We intentionally do NOT gate on disconnect bookkeeping: the disconnect INITIATOR (ALPHA,
335
347
# on the payload-drained auto-disconnect) quits during teardown and never logs a
@@ -338,13 +350,16 @@ scenario_passed() {
338
350
# verdict; close cleanliness is tracked separately.)
0 commit comments