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(arq): cross-frame burst interleave DEFAULT-OFF for all mods (was >=16QAM-ON) — rig-measured harmful on fading
burstCrossFrameInterleaveOn(mod) now returns false by default for every
modulation (was isCoherentModulation && bits>=4, i.e. ON for >=16QAM). Interleave
OFF => per-frame SR-ARQ SACK (resend only dead frames); ON => whole-group ACK.
ULTRA_BURST_INTERLEAVE=1 re-enables (A/B / restore the Good@20 case), =0 forces off.
Behavior change to main (not byte-identical): 16QAM file transfers now use per-frame SACK.
WHY. Cross-frame TIME interleave spreads each LDPC codeword's bits across ALL N
frames of the burst. The prior default turned it ON for dense mods on the theory
that a frozen FREQUENCY null smeared across frames becomes a recoverable ~1/N nick
(GUI/offline +47% on 16QAM R2/3 Good@20, 2026-06-14). But the HF fade the rig
delivers is TIME-localized (a Watterson deep fade hits one stretch of the burst):
interleaving then puts ~1/N corruption into EVERY codeword at once, and when that
exceeds the LDPC budget (it does at MPG@20) ALL codewords fail together — a
whole-group 0/N crater instead of one dead frame.
MEASURED (forced-16QAM-R1/2 interleaved A/B, IONOS rig, MPG@20, F440-449,
RX-authority+adaptive disabled so only interleave varies):
interleave ON (old default): delivered 4/5, mean 1.13 kbps, 62 full / 13 partial craters
interleave OFF (per-frame SACK): delivered 5/5, mean 1.55 kbps (+37%), 12 full / 41 partial
OFF won 4/5 pairs, delivered every transfer, 5x fewer full craters — failures stay
LOCAL (partials the SACK resends cheaply) instead of coupling to the burst's worst
instant. The crater SHAPE is the proof: ON fails WHOLE, OFF fails LOCAL.
RECONCILIATION. MPG@20 IS a "Multipath GOOD" channel, so this directly CONTRADICTS
the 2026-06-14 Good@20 +47% — that was a calmer epoch / R2/3 / possibly-sim
realization; the newer faithful hardware measurement wins. AWGN has no nulls to
smear, so interleave buys nothing there either. No channel where it clearly earns
its keep on the real rig. maxValidatedCoherentRate comment flagged: the 16QAM R2/3
cap's interleave-dependent margin is now unre-measured — re-A/B R2/3 vs R1/2 with
per-frame SACK before trusting R2/3 as the 16QAM cap.
ORIGIN. Operator observation ("we ACK, sender resends, we ACK over the resend") ->
traced whole-group-resend to interleave -> forced A/B. Also kills that airtime waste.
Verification: ctest -j4 full suite green (UltraTncSimAudio's lone fail was a
parallel-load timeout at 265s, passes standalone in 57s). Rig A/B above.
Natural-ladder auto-path A/B pending.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019btwFxDt7D19SZSqPYvZnk
|**BurstInterleaver** (cross-frame N-group byte permute) |`burst_interleaver.*`; TX `streaming_encoder.cpp:530`, RX `streaming_burst_interleave.cpp:496`|🟢**default-ON for dense coherent mods (≥16QAM)** via `burstCrossFrameInterleaveOn(mod)` (2026-06-14); OFF (per-frame SR-ARQ) for QPSK/8PSK. TIME diversity → +47% 16QAM R2/3 Good@20. `ULTRA_BURST_INTERLEAVE` overrides. |
137
+
|**BurstInterleaver** (cross-frame N-group byte permute) |`burst_interleaver.*`; TX `streaming_encoder.cpp:530`, RX `streaming_burst_interleave.cpp:496`|🟡**DEFAULT-OFF for ALL mods** via `burstCrossFrameInterleaveOn(mod)` (2026-07-21, flipped from ≥16QAM-ON). Interleave couples time-localized deep fades across all codewords → whole-group craters; rig A/B MPG@20 (F440-449) interleave-OFF +37% goodput, 5/5 vs 4/5, 5× fewer full craters. Contradicts the 2026-06-14 Good@20 +47% (calmer epoch). Now per-frame SR-ARQ SACK everywhere. `ULTRA_BURST_INTERLEAVE=1` re-enables (A/B the Good@20 claim). Mechanism preserved, only the default flipped. |
(`connection_policy.hpp:94`, default **false**) is the SINGLE source of truth deriving (a) TX
@@ -216,7 +216,7 @@ Buckets per the env-knobs→runtime-derivation workstream: **[FEAT]** in-flight
216
216
|------|--------|---------|----------|--------|
217
217
|~~`ULTRA_BURST_TRANSPORT`~~|**REMOVED 2026-06-02** — burst transport is now unconditional (THE OFDM file path); the `=0` opt-out was deleted, no env read remains. RX default `burst_transport_rx_` flipped `false→true`. | (gone) | (removed from `connection.cpp`/`app.cpp`/`modem_engine.hpp`) | — |
218
218
|`ULTRA_ADAPTIVE_RATE`| per-block decode-headroom quality-feedback computation (GUI "Adapt:" bars + diagnostics); `=0` also disables the rate-CHANGE path below (`adaptive_rate_enabled_` gate). (Map previously said OFF — stale; the code default has been ON since 2026-06-07 "visibility" change.) |**ON** (opt-out `=0`) |`connection.cpp` ctor (`ULTRA_ADAPTIVE_RATE` read) | FEAT |
219
-
|`ULTRA_BURST_INTERLEAVE`| force cross-frame interleave ON→whole-group ACK / OFF→SR masks (overrides the mod-gated default). 2026-06-14: default is now **mod-gated** — ON for dense coherent ≥16QAM (TIME diversity, +47% 16QAM R2/3 Good@20), OFF for QPSK/8PSK | mod-gated (16QAM ON)|`connection_policy.hpp``burstCrossFrameInterleaveOn(Modulation)`| FEAT |
219
+
|`ULTRA_BURST_INTERLEAVE`| force cross-frame interleave ON→whole-group ACK / OFF→SR masks (overrides the default). **2026-07-21: default flipped to OFF for ALL mods** (was ≥16QAM-ON) — rig A/B MPG@20 (F440-449) showed interleave couples time-localized fades → whole-group craters; OFF (+37% goodput, 5× fewer full craters) via per-frame SACK. `=1` re-enables (A/B the 2026-06-14 Good@20 +47% claim, now contradicted); `=0` = default |**default OFF**|`connection_policy.hpp``burstCrossFrameInterleaveOn(Modulation)`| FEAT |
220
220
|`ULTRA_BURST_GROUP_FRAMES`| burst group size, clamp [2,32]| code **6** (`kBurstInterleaveGroupFrames``:64`, reconciled 16→6 on 2026-05-30 — mask-width-matched to the 6-bit SACK frame_mask; the old 16 was un-SR-addressable on the default interleave-OFF path) |`connection_policy.hpp:74`| FEAT |
221
221
|`ULTRA_MAX_BURST_AIRTIME_MS`| per-key-down burst airtime ceiling → group size (frame count DERIVED from live per-frame airtime), clamp [5000,12000]| code **8600** (= **5 frames** at QPSK R2/3; 7000→8600 codified 2026-06-07 after a 20-seed Good@16 sweep tied groups 5/6 on goodput, 5 wins on key-down/SACK margin) |`connection.cpp``burstAirtimeBudgetFrames`| FEAT |
222
222
|`ULTRA_COHERENT_WINDOW`| 🟢 ACTIVE (**DEFAULT-ON 16 since 2026-07-03**) — wide coherent ARQ window: SR-ARQ in-flight window for **coherent** wideband OFDM rungs (QPSK/8PSK/16QAM via `isCoherentModulation`) at rate ≥ R2/3 (was `kWideOFDMWindowFrames` 8 — the window-16 predicate was a differential-only fossil). Differential DQPSK/D8PSK keep their own high-throughput predicate; rates < R2/3 keep 8. Enabled by the tone-burst SACK `frame_mask` 8→16-bit widen (**WIRE-BREAKING** — payload 32→40 bits, burst 27→34 symbols, 675→850 ms baseline ACK; lockstep builds) + `kToneBurstAckWindowCapFrames` 8→16. A/B 2026-07-03 (all CRC-clean): Good@20 +18/+57/+26% (seeds 42/43/7), AWGN@20 3370→**3520 record**. Env: unset→16, `=8` legacy window, `=0` disable; clamp [0,16], read ONCE. PA-duty airtime budget still mins the real burst size. |**16 (on)**|`connection_policy.hpp``coherentOFDMWindowOverride()` + `ofdmWindowSize()`; cap `kToneBurstAckWindowCapFrames`| FEAT |
0 commit comments