Files
HaloKeymind/sf10_rollback_failure_validation/index.html
T
2026-09-15 05:34:40 +00:00

3506 lines
61 KiB
HTML

<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="Documentation for the open source MeshCore firmware">
<link rel="canonical" href="https://mikecarper.github.io/MeshCore/sf10_rollback_failure_validation/">
<link rel="prev" href="../sf10_nrf52_double_write_settling_validation/">
<link rel="next" href="../sf125_settling_limits_validation/">
<link rel="icon" href="../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.7">
<title>SF10/125 rollback and wider-spacing failure isolation - MeshCore Docs</title>
<link rel="stylesheet" href="../assets/stylesheets/main.ec1eaa64.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
<link rel="stylesheet" href="../_stylesheets/extra.css">
<link rel="stylesheet" href="../_stylesheets/firmware_picker.css">
<link rel="stylesheet" href="../_stylesheets/telemetry_decoder.css">
<link rel="stylesheet" href="../_stylesheets/filter_tool.css">
<script>__md_scope=new URL("..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
</head>
<body dir="ltr">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#sf10125-rollback-and-wider-spacing-failure-isolation" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header md-header--shadow" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href=".." title="MeshCore Docs" class="md-header__button md-logo" aria-label="MeshCore Docs" data-md-component="logo">
<img src="../_assets/meshcore.svg" alt="logo">
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
MeshCore Docs
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
SF10/125 rollback and wider-spacing failure isolation
</span>
</div>
</div>
</div>
<script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
</button>
</nav>
<div class="md-search__suggest" data-md-component="search-suggest"></div>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://github.com/mikecarper/MeshCore/" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
</div>
<div class="md-source__repository">
mikecarper/MeshCore
</div>
</a>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href=".." title="MeshCore Docs" class="md-nav__button md-logo" aria-label="MeshCore Docs" data-md-component="logo">
<img src="../_assets/meshcore.svg" alt="logo">
</a>
MeshCore Docs
</label>
<div class="md-nav__source">
<a href="https://github.com/mikecarper/MeshCore/" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
</div>
<div class="md-source__repository">
mikecarper/MeshCore
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href=".." class="md-nav__link">
<span class="md-ellipsis">
Introduction
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../WiFi/" class="md-nav__link">
<span class="md-ellipsis">
WiFi and MQTT by Firmware Type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../cad_scan_validation/" class="md-nav__link">
<span class="md-ellipsis">
SX1262 channel-scanning hardware results
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../carrier_wave/" class="md-nav__link">
<span class="md-ellipsis">
Carrier-wave RF checks
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../carrier_wave_validation/" class="md-nav__link">
<span class="md-ellipsis">
CW and CW2 validation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../cli_build_matrix/" class="md-nav__link">
<span class="md-ellipsis">
CLI Availability by Firmware Build
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../cli_command_availability/" class="md-nav__link">
<span class="md-ellipsis">
CLI Command Availability Matrix
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../cli_commands/" class="md-nav__link">
<span class="md-ellipsis">
CLI Commands
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../cli_settings_audit/" class="md-nav__link">
<span class="md-ellipsis">
CLI setting dispatch audit
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../companion_contact_cache/" class="md-nav__link">
<span class="md-ellipsis">
Full Companion contact caches
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../companion_contact_cache_results/" class="md-nav__link">
<span class="md-ellipsis">
Contact-cache and NimBLE RAM qualification
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../companion_offline_queue/" class="md-nav__link">
<span class="md-ellipsis">
Companion Offline Message Queue
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../companion_protocol/" class="md-nav__link">
<span class="md-ellipsis">
Companion Protocol
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../companion_radio_full/" class="md-nav__link">
<span class="md-ellipsis">
Full Companion
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../companion_usb_ascii_validation/" class="md-nav__link">
<span class="md-ellipsis">
USB Companion ASCII default validation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../companion_usb_client_validation/" class="md-nav__link">
<span class="md-ellipsis">
USB Companion client compatibility
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../docs/" class="md-nav__link">
<span class="md-ellipsis">
Local Documentation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../double_frequency_v4_validation/" class="md-nav__link">
<span class="md-ellipsis">
Double center-frequency write: V4 transmitter / XIAO receiver
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../esp32_memory_budget/" class="md-nav__link">
<span class="md-ellipsis">
Classic ESP32 image memory budget
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../espnow_bridge_setup/" class="md-nav__link">
<span class="md-ellipsis">
ESP-NOW bridge: simple setup
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../faq/" class="md-nav__link">
<span class="md-ellipsis">
Frequently Asked Questions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../filter_tool/" class="md-nav__link">
<span class="md-ellipsis">
Filter policy playground
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../firmware_memory_budget/" class="md-nav__link">
<span class="md-ellipsis">
Firmware memory checks
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../firmware_picker/" class="md-nav__link">
<span class="md-ellipsis">
Firmware picker
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../flood_filtering/" class="md-nav__link">
<span class="md-ellipsis">
Flood Filtering and Moderation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../four_fixed_tx_dwell_validation/" class="md-nav__link">
<span class="md-ellipsis">
Four fixed transmitters: longer dwell repeats
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../four_fixed_tx_single_pass_validation/" class="md-nav__link">
<span class="md-ellipsis">
Four fixed transmitters / fast single-pass receiver
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../full_companion_features/" class="md-nav__link">
<span class="md-ellipsis">
Full Companion: turn features on and off
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../full_companion_usb_switcher/" class="md-nav__link">
<span class="md-ellipsis">
Companion USB CLI and binary switcher
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../full_usb_logging_validation/" class="md-nav__link">
<span class="md-ellipsis">
Full USB logging repair — 1.17.1.6
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../gps_tracking/" class="md-nav__link">
<span class="md-ellipsis">
GPS Tracking
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../halo_keymind_settings/" class="md-nav__link">
<span class="md-ellipsis">
Halo and Keymind Branch Settings
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../hardware_validation_bluetooth_stealth_2026-09-07/" class="md-nav__link">
<span class="md-ellipsis">
XIAO Bluetooth stealth hardware validation - 2026-09-07
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../hardware_validation_checklist/" class="md-nav__link">
<span class="md-ellipsis">
Hardware validation checklist
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../home_text_spacing/" class="md-nav__link">
<span class="md-ellipsis">
Home-screen text spacing
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../host_cli_service/" class="md-nav__link">
<span class="md-ellipsis">
LoRa CLI Host Service
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../kiss_modem_protocol/" class="md-nav__link">
<span class="md-ellipsis">
MeshCore KISS Modem Protocol
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../lora_ota_automation/" class="md-nav__link">
<span class="md-ellipsis">
Scripted LoRa OTA from start to finish
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../mbedtls-tls-footprint/" class="md-nav__link">
<span class="md-ellipsis">
Shrinking the per-connection TLS footprint on non-PSRAM observers
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../mixed_scan_validation/" class="md-nav__link">
<span class="md-ellipsis">
Mixed-bandwidth two-channel reception test
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../mixed_sf_bw_validation/" class="md-nav__link">
<span class="md-ellipsis">
Equal-symbol-time mixed SF/BW, four-channel test
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../nimble_companion_trial/" class="md-nav__link">
<span class="md-ellipsis">
ESP32-S3 NimBLE Full Companion trial
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../nimble_companion_trial_results/" class="md-nav__link">
<span class="md-ellipsis">
ESP32-S3 NimBLE trial results, 2026-09-08
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../nrf52-usb-ready-fix/" class="md-nav__link">
<span class="md-ellipsis">
nRF52 USB READY hang
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../nrf52_companion_storage_recovery/" class="md-nav__link">
<span class="md-ellipsis">
nRF52 Companion automatic ExtraFS recovery
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../nrf52_power_management/" class="md-nav__link">
<span class="md-ellipsis">
nRF52 Power Management
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../number_allocations/" class="md-nav__link">
<span class="md-ellipsis">
Number Allocations
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../ota_easy/" class="md-nav__link">
<span class="md-ellipsis">
Easy firmware updates over LoRa
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../ota_meshtower_v2_sdcard/" class="md-nav__link">
<span class="md-ellipsis">
MeshTower V2 microSD LoRa OTA
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../ota_nrf52_bootloader_update/" class="md-nav__link">
<span class="md-ellipsis">
nRF52 bootloader updates over LoRa
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../ota_nrf52_qspi/" class="md-nav__link">
<span class="md-ellipsis">
nRF52 repeater LoRa OTA with external QSPI
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../ota_protocol/" class="md-nav__link">
<span class="md-ellipsis">
MeshCore OTA - .mota container &amp; LoRa protocol
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../ota_user_guide/" class="md-nav__link">
<span class="md-ellipsis">
Updating your node over the air (OTA) - user guide
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../packet_format/" class="md-nav__link">
<span class="md-ellipsis">
Packet Format
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../pair_4p6_300us_validation/" class="md-nav__link">
<span class="md-ellipsis">
SF7/62.5 + SF8/500: 4.6 slow chirps, 0.3 ms reserve
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../pair_preamble32_validation/" class="md-nav__link">
<span class="md-ellipsis">
SF7/62.5 + SF8/500, fast switching and preamble 32
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../payloads/" class="md-nav__link">
<span class="md-ellipsis">
Payload Format
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../pr7_review_validation/" class="md-nav__link">
<span class="md-ellipsis">
PR #7 review and validation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../preamble_detection_investigation/" class="md-nav__link">
<span class="md-ellipsis">
Off-channel preamble investigation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../qr_codes/" class="md-nav__link">
<span class="md-ellipsis">
QR Codes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../radio_chirp_math_validation/" class="md-nav__link">
<span class="md-ellipsis">
Shared radio/radio2 chirp timing and preamble warnings
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../radio_dwell_policy_validation/" class="md-nav__link">
<span class="md-ellipsis">
Automatic dwell policy: 4.6 chirps on both profiles
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../radio_profile_switch_validation/" class="md-nav__link">
<span class="md-ellipsis">
SX1262 profile-switch validation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../radio_profiles/" class="md-nav__link">
<span class="md-ellipsis">
Two LoRa profiles on one radio
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../radio_profiles_validation/" class="md-nav__link">
<span class="md-ellipsis">
Dual-profile receive validation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../radio_receive_calibration/" class="md-nav__link">
<span class="md-ellipsis">
Radio receive calibration and recovery
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../rak3401_mota_chain/" class="md-nav__link">
<span class="md-ellipsis">
RAK3401 1W repeater compact LoRa update chain
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../role_feature_switches/" class="md-nav__link">
<span class="md-ellipsis">
Feature switches by role — 1.17.1.5 USA Cascade
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../s3_memory_soak_validation/" class="md-nav__link">
<span class="md-ellipsis">
ESP32-S3 OTA memory experiment
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../separated_radio_modulation_cache_validation/" class="md-nav__link">
<span class="md-ellipsis">
Separated radios, normal XIAO RX gain, and unchanged-modulation timing
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../sf10_10_vs_100hz_full_sample_validation/" class="md-nav__link">
<span class="md-ellipsis">
SF10/125 full samples: 10 Hz versus 100 Hz first-pass detour
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../sf10_10hz_cr_detour_validation/" class="md-nav__link">
<span class="md-ellipsis">
SF10/125: tiny first-pass frequency offset and coding-rate detour
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../sf10_full_retune_twice_validation/" class="md-nav__link">
<span class="md-ellipsis">
SF10/125: apply the full radio settings twice per hop
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../sf10_nrf52_double_write_settling_validation/" class="md-nav__link">
<span class="md-ellipsis">
SF10 / 125 kHz, XIAO nRF52 TX, double write, 1 ms delay grid
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
SF10/125 rollback and wider-spacing failure isolation
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
SF10/125 rollback and wider-spacing failure isolation
</span>
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#fixture-and-requested-controls" class="md-nav__link">
<span class="md-ellipsis">
Fixture and requested controls
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#maximum-practical-settling-control" class="md-nav__link">
<span class="md-ellipsis">
Maximum practical settling control
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#250-khz-spacing-eleven-rollback-cases" class="md-nav__link">
<span class="md-ellipsis">
250 kHz spacing: eleven rollback cases
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fixed-frequency-controls-off-channel-responses-without-switching" class="md-nav__link">
<span class="md-ellipsis">
Fixed-frequency controls: off-channel responses without switching
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#a-traced-real-timeout-at-250-khz-spacing" class="md-nav__link">
<span class="md-ellipsis">
A traced real timeout at 250 kHz spacing
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#1-mhz-spacing-strict-results-versus-payload-delivery" class="md-nav__link">
<span class="md-ellipsis">
1 MHz spacing: strict results versus payload delivery
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#changes-and-verification" class="md-nav__link">
<span class="md-ellipsis">
Changes and verification
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#evidence-provenance-sha-256" class="md-nav__link">
<span class="md-ellipsis">
Evidence provenance (SHA-256)
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../sf125_settling_limits_validation/" class="md-nav__link">
<span class="md-ellipsis">
Descending SF10..SF5 / 125 kHz settling limits
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../sf5_250_dwell_validation/" class="md-nav__link">
<span class="md-ellipsis">
SF5 / 250 kHz: four-channel dwell sweep
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../sf6_125_settling_validation/" class="md-nav__link">
<span class="md-ellipsis">
SF6/125 four-channel post-switch settling sweep
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../sf6_5p1_trace_validation/" class="md-nav__link">
<span class="md-ellipsis">
SF6 / 125 kHz: four channels at 5.1 chirps
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../sf6_channel_scan_validation/" class="md-nav__link">
<span class="md-ellipsis">
SF6 / 125 kHz channel-count test
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../sf8_5p1_trace_validation/" class="md-nav__link">
<span class="md-ellipsis">
SF8 / 125 kHz: four-channel comparison at 5.1 chirps
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../spiffs_regular_file_reads/" class="md-nav__link">
<span class="md-ellipsis">
SPIFFS regular-file reads and login replay state
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../stats_binary_frames/" class="md-nav__link">
<span class="md-ellipsis">
Stats Binary Frame Structures
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../telemetry_decoder/" class="md-nav__link">
<span class="md-ellipsis">
Telemetry decoder
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../terminal_chat_cli/" class="md-nav__link">
<span class="md-ellipsis">
Terminal Chat CLI
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../usb_serial_backpressure/" class="md-nav__link">
<span class="md-ellipsis">
Native USB backpressure and radio liveness
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../v4_pixel5_font_trial/" class="md-nav__link">
<span class="md-ellipsis">
Small-screen message fonts
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_88" >
<label class="md-nav__link" for="__nav_88" id="__nav_88_label" tabindex="0">
<span class="md-ellipsis">
Releases
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_88_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_88">
<span class="md-nav__icon md-icon"></span>
Releases
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../releases/1.17.1.5-doc-audit/" class="md-nav__link">
<span class="md-ellipsis">
Markdown audit — 1.17.1.5 USA Cascade
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../releases/1.17.1.5/" class="md-nav__link">
<span class="md-ellipsis">
MeshCore 1.17.1.5 Dev - USA Cascade
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../releases/1.17.1.6/" class="md-nav__link">
<span class="md-ellipsis">
MeshCore 1.17.1.6 Dev - USA Cascade
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#fixture-and-requested-controls" class="md-nav__link">
<span class="md-ellipsis">
Fixture and requested controls
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#maximum-practical-settling-control" class="md-nav__link">
<span class="md-ellipsis">
Maximum practical settling control
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#250-khz-spacing-eleven-rollback-cases" class="md-nav__link">
<span class="md-ellipsis">
250 kHz spacing: eleven rollback cases
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fixed-frequency-controls-off-channel-responses-without-switching" class="md-nav__link">
<span class="md-ellipsis">
Fixed-frequency controls: off-channel responses without switching
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#a-traced-real-timeout-at-250-khz-spacing" class="md-nav__link">
<span class="md-ellipsis">
A traced real timeout at 250 kHz spacing
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#1-mhz-spacing-strict-results-versus-payload-delivery" class="md-nav__link">
<span class="md-ellipsis">
1 MHz spacing: strict results versus payload delivery
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#changes-and-verification" class="md-nav__link">
<span class="md-ellipsis">
Changes and verification
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#evidence-provenance-sha-256" class="md-nav__link">
<span class="md-ellipsis">
Evidence provenance (SHA-256)
</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<a href="https://github.com/mikecarper/MeshCore/edit/keymindCascade/docs/sf10_rollback_failure_validation.md" title="Edit this page" class="md-content__button md-icon" rel="edit">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M10 20H6V4h7v5h5v3.1l2-2V8l-6-6H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h4zm10.2-7c.1 0 .3.1.4.2l1.3 1.3c.2.2.2.6 0 .8l-1 1-2.1-2.1 1-1c.1-.1.2-.2.4-.2m0 3.9L14.1 23H12v-2.1l6.1-6.1z"/></svg>
</a>
<h1 id="sf10125-rollback-and-wider-spacing-failure-isolation">SF10/125 rollback and wider-spacing failure isolation</h1>
<p>2026-09-14. <strong>No strict four-channel 400/400 pass. Reverting the switching
optimizations did not remove failures. Off-channel reception also occurs with
a fixed, fully initialized receiver, without any channel switching.</strong> A traced
timeout shows an off-channel preamble holding the scanner away from the
intended channel until after its transmit preamble. Wider spacing did not
eliminate either wrong-channel delivery or actual missing packets.</p>
<p>This isolates a concrete scanner failure mechanism, not the underlying
physical RF cause. Commanded frequency words are observed, but actual emitted
spectrum, antenna-port power, image responses and overload have not been
independently measured. Do not claim front-end saturation or a specific spur
as proven. Do not treat these first-failure-censored samples as unbiased PER.</p>
<h2 id="fixture-and-requested-controls">Fixture and requested controls</h2>
<ul>
<li>RX: XIAO ESP32-S3 / Wio SX1262, COM31, MAC 28:84:85:B4:09:80; normal RX gain
register 0x94 throughout (boosted gain off).</li>
<li>TX: XIAO nRF52840 / Wio SX1262, COM15, serial B35E71C1C3726CE7.</li>
<li>SF10, 125 kHz BW, CR4/5, 32-symbol preamble, 16-byte sequenced CHS1 probes,
-9 dBm chip request, four channels, 5.1-symbol post-settle listening visits.</li>
<li>Original centers: 909.5, 909.75, 910.0, 910.25 MHz. User-requested wider
centers: 909.5, 910.5, 911.5, 912.5 MHz (1 MHz spacing).</li>
<li>Existing fixed-channel positive control was 100/100; see
<code>sf10_nrf52_double_write_settling_validation.md</code>. No failed packets retried.</li>
<li>Unrelated RAK COM29 was not opened. New nRF52 upload was application-only,
using normal SoftDevice ID 0x0123 validation; no bootloader/SoftDevice erase.</li>
</ul>
<p>Rollback modes are runtime HIL controls on the same current source, not
historical firmware checkouts. No production default or receive safety guard
was changed during this investigation. Tests preserve ownership, packet-in-
progress, BUSY and command-result checks. Existing unrelated working-tree
changes were left intact. No commit or push was requested this turn.</p>
<h2 id="maximum-practical-settling-control">Maximum practical settling control</h2>
<p>At SF10/125, a symbol is 8,192 us, the programmed preamble is 262,144 us,
and each 5.1-symbol post-settle visit is 41,780 us. For each rollback mode:</p>
<ol>
<li>Measure six seconds of RX-only switching without added delay.</li>
<li>Choose the largest 100 us delay step satisfying
<code>4 * (41780 + observed_max_switch_us + added_delay_us + 500) &lt;= 262144</code>.</li>
<li>Measure another six seconds; require at least eight full idle cycles and
maximum observed idle cycle below the preamble before allowing TX.</li>
</ol>
<p>The 500 us per-hop reserve covers some observed scheduling variation, not
all possible jitter. RX is active during added settling. Near-ceiling cycle
timing is not itself a guarantee of acquisition for every arrival phase,
especially when an IRQ causes an extended packet hold. Idle-cycle statistics
exclude guard/packet-held visits; those are measured separately.</p>
<h2 id="250-khz-spacing-eleven-rollback-cases">250 kHz spacing: eleven rollback cases</h2>
<p>Each case stopped on its <strong>first probe</strong>, TX channel 3, with a real timeout.
No strict 400/400 pass, TX fault, RX mode/cache failure, or hardware error.
The first nine cases used the checkout's existing 1,600 us TCXO setting;
the final two explicitly restored 6,000 us. Production timing was not edited.</p>
<table>
<thead>
<tr>
<th>Case</th>
<th style="text-align: right;">Added delay (us)</th>
<th style="text-align: right;">Zero-delay mean switch (us)</th>
<th style="text-align: right;">Max settled idle cycle (us)</th>
</tr>
</thead>
<tbody>
<tr>
<td>Fast, cached modulation, double frequency write</td>
<td style="text-align: right;">22500</td>
<td style="text-align: right;">535.88</td>
<td style="text-align: right;">259297</td>
</tr>
<tr>
<td>Always write modulation</td>
<td style="text-align: right;">22500</td>
<td style="text-align: right;">625.50</td>
<td style="text-align: right;">259682</td>
</tr>
<tr>
<td>Individual SF/BW/CR writes</td>
<td style="text-align: right;">22200</td>
<td style="text-align: right;">840.97</td>
<td style="text-align: right;">259346</td>
</tr>
<tr>
<td>Full normal RX restart</td>
<td style="text-align: right;">22200</td>
<td style="text-align: right;">896.89</td>
<td style="text-align: right;">259577</td>
</tr>
<tr>
<td>Full RX + individual modulation</td>
<td style="text-align: right;">22000</td>
<td style="text-align: right;">1113.95</td>
<td style="text-align: right;">259623</td>
</tr>
<tr>
<td>Above + byte-wise SPI, warm XOSC</td>
<td style="text-align: right;">21800</td>
<td style="text-align: right;">1215.79</td>
<td style="text-align: right;">259220</td>
</tr>
<tr>
<td>Above + RC standby, 1.6 ms TCXO</td>
<td style="text-align: right;">20100</td>
<td style="text-align: right;">2942.50</td>
<td style="text-align: right;">259339</td>
</tr>
<tr>
<td>Fast, cached modulation, single frequency write</td>
<td style="text-align: right;">22600</td>
<td style="text-align: right;">450.25</td>
<td style="text-align: right;">259341</td>
</tr>
<tr>
<td>RC/full RX/individual/byte-wise, single write, 1.6 ms TCXO</td>
<td style="text-align: right;">20200</td>
<td style="text-align: right;">2837.50</td>
<td style="text-align: right;">259329</td>
</tr>
<tr>
<td>RC/full RX/individual/byte-wise, double write, 6 ms TCXO</td>
<td style="text-align: right;">15800</td>
<td style="text-align: right;">7293.25</td>
<td style="text-align: right;">259550</td>
</tr>
<tr>
<td>RC/full RX/individual/byte-wise, single write, 6 ms TCXO</td>
<td style="text-align: right;">15800</td>
<td style="text-align: right;">7190.31</td>
<td style="text-align: right;">259139</td>
</tr>
</tbody>
</table>
<p>Actual frequency/modulation command counts and fast-RX counts verified each
policy. Slower modes received less added delay to preserve the total sweep
budget. These are eleven probes with eleven timeouts, <strong>not eleven complete
400-packet runs</strong>. Packet arrival pauses use the same seeded scheduling
method but not hardware-synchronized identical RF phases across modes.</p>
<h2 id="fixed-frequency-controls-off-channel-responses-without-switching">Fixed-frequency controls: off-channel responses without switching</h2>
<p>Each pair received three independent probes after full normal initialization.
Positive controls were interleaved. The receiver remained at one frequency:
zero observed frequency commands after setup, no hopping or cache shortcut.
Payload success requires the exact expected sequence/channel/body, length 16
and clean CRC. It does not require RX center to equal TX center in this
explicit offset diagnostic. Offset below means programmed RX minus TX.</p>
<table>
<thead>
<tr>
<th>Spacing</th>
<th style="text-align: right;">RX-TX offset (kHz)</th>
<th style="text-align: right;">Probes</th>
<th style="text-align: right;">Intact expected payloads</th>
<th style="text-align: right;">Preamble IRQ seen</th>
</tr>
</thead>
<tbody>
<tr>
<td>250 kHz</td>
<td style="text-align: right;">0</td>
<td style="text-align: right;">6</td>
<td style="text-align: right;">6</td>
<td style="text-align: right;">6</td>
</tr>
<tr>
<td>250 kHz</td>
<td style="text-align: right;">-250</td>
<td style="text-align: right;">3</td>
<td style="text-align: right;">2</td>
<td style="text-align: right;">3</td>
</tr>
<tr>
<td>250 kHz</td>
<td style="text-align: right;">-500</td>
<td style="text-align: right;">3</td>
<td style="text-align: right;">0</td>
<td style="text-align: right;">3</td>
</tr>
<tr>
<td>250 kHz</td>
<td style="text-align: right;">-750</td>
<td style="text-align: right;">3</td>
<td style="text-align: right;">0</td>
<td style="text-align: right;">3</td>
</tr>
<tr>
<td>250 kHz</td>
<td style="text-align: right;">+250</td>
<td style="text-align: right;">3</td>
<td style="text-align: right;">0</td>
<td style="text-align: right;">2</td>
</tr>
<tr>
<td>1 MHz</td>
<td style="text-align: right;">0</td>
<td style="text-align: right;">6</td>
<td style="text-align: right;">6</td>
<td style="text-align: right;">6</td>
</tr>
<tr>
<td>1 MHz</td>
<td style="text-align: right;">-1000</td>
<td style="text-align: right;">3</td>
<td style="text-align: right;">2</td>
<td style="text-align: right;">3</td>
</tr>
<tr>
<td>1 MHz</td>
<td style="text-align: right;">-2000</td>
<td style="text-align: right;">3</td>
<td style="text-align: right;">0</td>
<td style="text-align: right;">0</td>
</tr>
<tr>
<td>1 MHz</td>
<td style="text-align: right;">-3000</td>
<td style="text-align: right;">3</td>
<td style="text-align: right;">3</td>
<td style="text-align: right;">3</td>
</tr>
<tr>
<td>1 MHz</td>
<td style="text-align: right;">+1000</td>
<td style="text-align: right;">3</td>
<td style="text-align: right;">3</td>
<td style="text-align: right;">3</td>
</tr>
</tbody>
</table>
<p>At 250 kHz spacing, the two valid -250 kHz-offset packets reported RSSI
-91/-90 dBm and SNR -12.8/-10.8 dB. At 1 MHz spacing, valid off-channel
packets reported RSSI -102..-109 dBm and SNR -11.5..-15.8 dB. Wider on-channel
controls were all -33 dBm, SNR +8.0..+8.8 dB. These are radio-reported values,
not calibrated measurements of transmitted spurs or receiver rejection.</p>
<p>The non-monotonic offset pattern means that increasing spacing alone cannot
be assumed to remove this response. These fixed-frequency tests rule out a
channel-hop shortcut as a necessary condition for the observed off-channel
packets; they do not establish which physical component produces them.</p>
<h2 id="a-traced-real-timeout-at-250-khz-spacing">A traced real timeout at 250 kHz spacing</h2>
<p>Fast/double-write RX, +22,500 us settling. One channel-3 probe timed out with
TX rc=0, RX mode=1 and device errors=0. The trace contains 454 events, overflow
0. Trace adds 64 us IRQ polling; use it for ordering, not an unperturbed timing
A/B comparison. Times below are relative to receiver expectation arming.</p>
<table>
<thead>
<tr>
<th style="text-align: right;">RX time (ms)</th>
<th>Evidence</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: right;">169.190</td>
<td>Frequency command for channel 3, 910.25 MHz</td>
</tr>
<tr>
<td style="text-align: right;">234.032</td>
<td>Leaves channel 3 for channel 0</td>
</tr>
<tr>
<td style="text-align: right;">298.869</td>
<td>Frequency command for channel 1, 909.75 MHz</td>
</tr>
<tr>
<td style="text-align: right;">330.030</td>
<td>PREAMBLE_DETECTED (0x0004) while on channel 1</td>
</tr>
<tr>
<td style="text-align: right;">363.632</td>
<td>Requested next hop is held by receive-in-progress guard</td>
</tr>
<tr>
<td style="text-align: right;">726.734</td>
<td>Guard clears the lingering preamble IRQ</td>
</tr>
<tr>
<td style="text-align: right;">726.826</td>
<td>Frequency command for channel 2</td>
</tr>
<tr>
<td style="text-align: right;">791.654</td>
<td>Finally commands intended channel 3 again</td>
</tr>
<tr>
<td style="text-align: right;">814.586</td>
<td>Channel-3 hop/settling completes</td>
</tr>
</tbody>
</table>
<p>TX setup was 86,914 us and its transmit call 529,297 us. Host/firmware timing
places TX RF start approximately 287..289 ms after RX arming and the end of
its programmed preamble around 550 ms. This estimate is not a synchronized
RF measurement, but the receiver's several-hundred-millisecond absence from
the intended channel is much larger than USB timestamp uncertainty.</p>
<p>The held channel-1 visit measured <strong>427,395 us</strong>, versus normal idle four-
channel cycle maximum <strong>259,358 us</strong>. The guard timeout is consistent with
<code>RadioLibWrapper::calcMaxPacketMillis</code>: <code>(32 + 8 + 4.25) * 8192 = 362496 us</code>,
rounded to 363 ms. <code>CustomSX1262::isReceiving()</code> starts that timer when the
guard first observes the preamble, here later than the diagnostic IRQ poll.</p>
<p>Thus an off-channel preamble can monopolize the scanner long enough to miss
the real channel. Do not simply remove or shorten this safety guard as a
production fix: it also protects legitimate weak or long-preamble reception.</p>
<h2 id="1-mhz-spacing-strict-results-versus-payload-delivery">1 MHz spacing: strict results versus payload delivery</h2>
<p>Three strict rollback cases (fast double, fast single, fully rolled back
single/6 ms) each stopped at their first probe. All three actually decoded
the intact channel-3 payload while programmed for channel 2: RX 911.5 MHz,
TX 912.5 MHz, RF word at read 955777024. They are <strong>channel mismatches, not
lost payloads</strong>. RSSI was -102/-101/-101 dBm; SNR -11.5/-11.5/-11.2 dB.</p>
<p>An explicitly separate payload-delivery diagnostic then continued through
such packets while retaining strict validity in raw evidence:</p>
<table>
<thead>
<tr>
<th>Mode</th>
<th style="text-align: right;">Added delay</th>
<th style="text-align: right;">Delivered before stop</th>
<th style="text-align: right;">Strict same-channel</th>
<th>Stop</th>
<th style="text-align: right;">Mean switch</th>
<th style="text-align: right;">Max idle cycle</th>
</tr>
</thead>
<tbody>
<tr>
<td>Fast, cached, double write</td>
<td style="text-align: right;">22.5 ms</td>
<td style="text-align: right;">3 of 4 probes</td>
<td style="text-align: right;">0</td>
<td>TX channel 0 timed out</td>
<td style="text-align: right;">557.721 us</td>
<td style="text-align: right;">259381 us</td>
</tr>
<tr>
<td>RC/full RX/individual/byte-wise, single write, 6 ms TCXO</td>
<td style="text-align: right;">15.8 ms</td>
<td style="text-align: right;">2 of 3 probes</td>
<td style="text-align: right;">0</td>
<td>TX channel 1 timed out</td>
<td style="text-align: right;">7310.510 us</td>
<td style="text-align: right;">259643 us</td>
</tr>
</tbody>
</table>
<p>Every delivered packet in these two runs arrived one programmed channel below
its transmitter. Both runs had zero mode/cache/RX/device errors and actual
switch-policy counts matched. Neither is a 400/400 pass, even under the relaxed
delivery-only criterion. The true timeout in the fully rolled-back path also
shows the problem is not limited to the accelerated RX restart or 0x8B cache.
No traces were enabled for these two runs, so do not assign their individual
timeouts the exact IRQ timeline from the earlier traced probe.</p>
<h2 id="changes-and-verification">Changes and verification</h2>
<ul>
<li>HIL-only rollback, explicit TCXO timing, selectable 250/1000 kHz spacing,
frequency-command trace events and fixed-frequency offset controls.</li>
<li>Separate opt-in payload-delivery test; strict wire validity remains intact.
Host/device counters distinguish strict from off-channel deliveries;
settling sweeps reject delivery-only captures, including reused evidence.</li>
<li>16 native profile tests and 46 HIL host tests passed. Receiver and nRF52
builds/uploads succeeded with normal verification. Receiver reported
94,844 bytes RAM / 366,777 bytes flash; nRF52 18,220 / 95,572 bytes.</li>
<li><code>git diff --check</code> passed; unrelated pre-existing CRLF warnings only.</li>
<li>Temporary PlatformIO overlay removed. Controllers stopped, both boards
rebooted idle with HIL firmware retained. No autonomous TX or restoration.</li>
</ul>
<p>Next useful isolation is the physical off-channel response (controlled RF
attenuation or reversed radio roles), followed by safe acquisition/hold-policy
experiments. More settling delay alone does not address the demonstrated
false-hold mechanism. No claim of an identified silicon defect or verified
production fix is made here.</p>
<h2 id="evidence-provenance-sha-256">Evidence provenance (SHA-256)</h2>
<p>Raw JSON files below are under <code>tools/hil/</code>; prior captures were not rewritten.
Matrix manifests include per-case paths and timing controls. All listed new
experiments completed under their stated stopping policies without fixture or
cleanup errors. Completed first-failure runs still have incomplete 400-packet
levels by design.</p>
<table>
<thead>
<tr>
<th>Capture</th>
<th>SHA-256</th>
</tr>
</thead>
<tbody>
<tr>
<td>profile_switch_sf10_rollback_results.json</td>
<td><code>e87c504b3c89fbafe90c18fcd0ab37df34a6aeb51d95b5c69f58d60f70de185a</code></td>
</tr>
<tr>
<td>profile_stationary_sf10_offset_results.json</td>
<td><code>d3d87315513a70fc3f00cc7f17369043328f53ee3028d499087b21e767370ab7</code></td>
</tr>
<tr>
<td>profile_switch_sf10_rollback_fast_trace_results.json</td>
<td><code>8ac9db50f0f06eb7511d7d233957119618df62afdc7112dd83eb68d292fcd725</code></td>
</tr>
<tr>
<td>profile_switch_sf10_rollback_6ms_results.json</td>
<td><code>74e7bfeb23bc569a5786e2322b5e3b1753cba9f628e2969bf4f5c4296ca5817a</code></td>
</tr>
<tr>
<td>profile_switch_sf10_wide_rollback_results.json</td>
<td><code>d79096fbe3e15e0375457b487fd40be3418789e798a978efb79d8298c880eea2</code></td>
</tr>
<tr>
<td>profile_switch_sf10_wide_payload_results.json</td>
<td><code>1316a2c2f32a8c0773fc56587c4220ee8f6f6cdf4ab9b87e00fd361fc9395257</code></td>
</tr>
<tr>
<td>profile_switch_sf10_wide_legacy_payload_results.json</td>
<td><code>fcf2123270634e2f27800787e20b9b8b7ae63bcfb03e17d26a4a4f6f4e23d32f</code></td>
</tr>
<tr>
<td>profile_stationary_sf10_wide_offset_results.json</td>
<td><code>4c494a59fa793d274b0366185cfe3230b6c9fce7a57dfaa61f9f29c36465bbd3</code></td>
</tr>
</tbody>
</table>
<p>RX firmware images used, in chronological order:</p>
<table>
<thead>
<tr>
<th>Stage</th>
<th>firmware.bin SHA-256</th>
</tr>
</thead>
<tbody>
<tr>
<td>Initial nine-mode rollback</td>
<td><code>5f8dbf9c4584e0de94a7aebda5a20e961b644a880ecb6a34ab5871621958696f</code></td>
</tr>
<tr>
<td>Fixed 250 kHz offsets and traced timeout</td>
<td><code>cd839caa33c869dd448cc55e9c8b959e39d105f80a2ac4a8029393698b993fd3</code></td>
</tr>
<tr>
<td>Explicit 6 ms TCXO rollback</td>
<td><code>0ba044035c4986749c9ad4f50c702dc8c57e8e0fecf9d46fc11515cad5678166</code></td>
</tr>
<tr>
<td>Wider strict rollback</td>
<td><code>5fc919c80438635b4a96021b39fae2ada9e767508d7bb73854e4e108f0d4920f</code></td>
</tr>
<tr>
<td>Wider delivery diagnostics and fixed offsets; final installed</td>
<td><code>7b313a0f8f1eb04f6fc12197af5e9481ad43154b981ab7627e50167d2a97d8c2</code></td>
</tr>
</tbody>
</table>
<p>The 250 kHz tests used the prior nRF52 TX ZIP hash
<code>7466625ef5e7bcc8f7dd16db2b843db29b4312a33b0d32bc0b1e1193d6aee03a</code>.
All wider tests used the new selectable-spacing application:</p>
<ul>
<li>TX ZIP: <code>c474b7598a2c0b6c529ead897f3fc7aab8caf4b7581c73d7acac6ffae081377d</code></li>
<li>TX HEX: <code>b400fc53c496f4a956f88ccee5cda83b5f6679b8e2b59bfcb4b8155ea9e1e5e9</code></li>
</ul>
<p>Build artifacts are generated and may be replaced by a subsequent build;
hashes identify the images used, not a promise that every historical binary
remains in <code>.pio/build</code>. Source starts from keymindCascade commit
<code>0e5955f889788a4317863e731b38ffe09e3d5441</code> with the existing dirty changes and
these uncommitted HIL additions; this is not a clean-release comparison.</p>
</article>
</div>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
</main>
<footer class="md-footer">
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"annotate": null, "base": "..", "features": ["content.action.edit", "content.code.copy", "search.highlight", "search.suggest"], "search": "../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script src="../assets/javascripts/bundle.d7400e89.min.js"></script>
<script src="../_javascript/firmware_picker.js"></script>
<script src="../_javascript/telemetry_decoder.js"></script>
<script src="../_javascript/filter_tool.js"></script>
</body>
</html>