diff --git a/build_legacy.sh b/build_legacy.sh index 721bf08ab..347824014 100755 --- a/build_legacy.sh +++ b/build_legacy.sh @@ -121,7 +121,7 @@ Commands: list|-l: List firmwares available to build. build-firmware : Build the firmware for the given build target. build-firmwares: Build canonical firmwares for all targets. Runtime-setting aliases and Terminal Chat targets replaced by Full Companion remain available as explicit builds. - build-firmwares-logging-matrix: Build canonical standard artifacts with merged runtime USB logging plus unified FULL ESP32 USB+WiFi and FULL fallback profiles, logging each target under out/build-logs/ and continuing after failures. MQTT observers and ESP-NOW bridges always use FULL. KISS, BLE-only Companion, and constrained LoRa-OTA repeater/room-server contracts do not gain plaintext USB logging. + build-firmwares-logging-matrix: Build canonical Full ESP32 images plus other platforms' qualified profiles with runtime USB logging, logging each target under out/build-logs/ and continuing after failures. MQTT observers and ESP-NOW bridges always use FULL. KISS and other platforms' constrained transport contracts do not gain plaintext USB logging. ESP32 expansion/recovery tools are separate from ordinary firmware. build-companion-firmwares-logging-matrix: Build canonical Companion targets with merged runtime USB logging where the transport is safe, plus applicable MQTT and expanded FULL profiles. Full Companion replaces separate USB, BLE, WiFi, Terminal Chat, and USB-logging artifacts where an exact combined recipe exists. build-full-esp32-firmwares: Build feature-complete ESP32 profiles with up to 254 neighbors, USB packet logging, WiFi MQTT plus ESP-NOW where a matching MQTT recipe exists, LoRa OTA, and expanded dual-OTA partitions. build-full-esp32-logging-firmwares: Build only the FULL USB-logging fallback for targets without a matching WiFi MQTT environment. @@ -140,7 +140,7 @@ Options: --firmware-version : Firmware version to embed. --radio-preset : Override the USA Cascadia radio default. Stable names are usa-cascadia and target; legacy menu numbers remain accepted. --profile : Override runtime settings embedded in the firmware (not its feature set). - --build-profile : Select feature/partition policy. Every non-Companion nRF52 repeater, room server and sensor builds both Full sensors + LoRa OTA and Reduced sensors + LoRa OTA, in its exact existing storage/layout contract. Both must pass qualification; an oversized full image is an error, not a successful reduced-only fallback. Other platforms retain their existing auto/standard/full policy. + --build-profile : Select feature/partition policy. Every non-Companion nRF52 repeater, room server and sensor builds both Full sensors + LoRa OTA and Reduced sensors + LoRa OTA, in its exact existing storage/layout contract. Both must pass qualification; an oversized full image is an error, not a successful reduced-only fallback. ESP32 bulk releases use Full only; explicit direct standard builds remain recovery tools. Other platforms retain their existing auto/standard/full policy. --auto|--standard|--full: Short forms of --build-profile. --full-exact: Build one expanded ESP32 release image under the requested target's own LoRa OTA identity. --skip-kiss|--include-kiss: Exclude (default) or include KISS modem targets in bulk builds. @@ -2494,6 +2494,13 @@ get_exact_identity_full_pio_env() { local env_name=$1 local candidate="" + # Many Full Companions are generated logical targets whose combined recipe + # compiles an exact USB/BLE/WiFi environment. Preserve that registered base. + if is_companion_radio_full_target "$env_name"; then + get_pio_build_env "$env_name" + return 0 + fi + is_esp32_canonical_full_release_target "$env_name" || { printf '%s\n' "$env_name" return 0 @@ -3253,6 +3260,16 @@ supports_esp32_full_build() { && ! is_lora_ota_only_target "$env_name" } +# Ordinary ESP32 releases use the complete profile regardless of the old app +# layout. Expansion/recovery utilities are packaged separately; an explicit +# direct standard build remains available for those workflows. Keep the +# older same-partition allowlist below separate: it also guards wire-compatible +# observer-to-normal OTA identity transitions. +is_esp32_full_release_build_target() { + [ "${PIO_ENV_PLATFORM_BY_NAME[$1]:-}" = "ESP32_PLATFORM" ] || return 1 + is_companion_radio_full_target "$1" || supports_esp32_full_build "$1" +} + # These ESP32 targets keep their exact partition table when the FULL overlay is # applied. In bulk release builds the portable artifact is therefore redundant: # publish FULL under the same mOTA identity. This inventory is derived from the @@ -3302,13 +3319,11 @@ is_esp32_full_only_bulk_target() { return 1 } -# These normal role identities still ship a portable legacy image for installed -# nodes, but also need a canonical FULL artifact for the one-time layout -# migration. They are deliberately separate from the FULL-only list above: -# some deployed 0x140000 slots differ from the expanded table, so LoRa mOTA -# must not try to cross this boundary. An exact-target Wi-Fi bridge and Full -# application are packaged separately; after migration, later normal-target -# FULL packages use the same logical mOTA identity. +# These identities have historical installed layouts that require expansion +# before their Full app can be installed. Retain this metadata separately from +# same-partition identity transitions: mOTA must not cross a layout boundary. +# Exact migration tools and Full applications are packaged separately from +# ordinary releases; future Full updates retain the normal target identity. is_esp32_partition_migration_full_target() { local env_name=${1,,} @@ -3334,7 +3349,7 @@ is_esp32_partition_migration_full_target() { } is_esp32_canonical_full_release_target() { - is_esp32_full_only_bulk_target "$1" \ + is_esp32_full_release_build_target "$1" \ || is_esp32_partition_migration_full_target "$1" } @@ -4896,15 +4911,16 @@ build_firmware_one_profile() { echo "Sensor OTA profile uses feature-rich base environment ${pio_env_name} with stable target identity ${env_name}." fi - # Canonical bulk releases omit the redundant portable image for targets - # whose exact environment identity has been approved for FULL-only output. - # Keep an explicit standard request untouched so maintainers retain a - # portable recovery build when diagnosing field devices. + # Every ordinary ESP32 bulk image uses Full. Changing an installed app + # layout still requires its reviewed expander/merged image first; it never + # authorizes app-only OTA across partition boundaries. Explicit direct + # standard requests remain installation/recovery developer tools. if [ "$ESP32_FULL_BUILD" != "1" ] \ && [ "$BUILD_PROFILE_FOR_TARGET" = "standard" ] \ && [ "${BATCH_BUILD_MODE:-0}" = "1" ] \ && [ "${BUILD_PROFILE_EXPLICIT:-0}" != "1" ] \ - && is_esp32_full_only_bulk_target "$env_name"; then + && ! is_companion_radio_full_target "$env_name" \ + && is_esp32_full_release_build_target "$env_name"; then ESP32_FULL_BUILD=1 if ! is_companion_radio_full_target "$env_name"; then MESHDEBUG_OVERRIDE="off" @@ -5596,11 +5612,19 @@ is_redundant_bulk_build_target() { # Bench fixtures and migration utilities use their dedicated PlatformIO # recipes; they are not node firmware for the release/OTA packaging matrix. case "${1,,}" in - profile_switch_*|*partition_migrator*|*partition_expander*|*_partition_legacy_seed|\ + profile_switch_*|profile_fixed_*|profile_four_tx_v4_rx|*partition_migrator*|*partition_expander*|*_partition_legacy_seed|\ *_legacy_partition_test|*_sim) return 0 ;; esac + # Expanded Full is the everyday ESP32 image. Keep compact OTA identities + # directly buildable for installation/recovery, but never publish them as a + # second ordinary firmware choice. Other platforms retain their capacity + # and deployed-target compatibility policies. + if [ "${PIO_ENV_PLATFORM_BY_NAME[$1]:-}" = "ESP32_PLATFORM" ] \ + && is_lora_ota_no_external_sensors_target "$1"; then + return 0 + fi # Keep every legacy name available to `build-firmware` and # `build-matching-firmwares`, but do not republish binaries that differ only # by a saved/default setting, or roles already supplied by Full Companion. @@ -5667,11 +5691,21 @@ resolve_repeater_firmwares() { } resolve_room_server_firmwares() { - get_pio_envs_for_variant_role room_server + local env_name + while IFS= read -r env_name; do + if ! is_redundant_bulk_build_target "$env_name"; then + printf '%s\n' "$env_name" + fi + done < <(get_pio_envs_for_variant_role room_server) } resolve_sensor_firmwares() { - get_pio_envs_for_variant_role sensor + local env_name + while IFS= read -r env_name; do + if ! is_redundant_bulk_build_target "$env_name"; then + printf '%s\n' "$env_name" + fi + done < <(get_pio_envs_for_variant_role sensor) } resolve_kiss_radio_firmwares() { @@ -6519,7 +6553,7 @@ run_full_esp32_profile() { if { [ "${PARTITION_MIGRATION_FULL_PROFILE_ACTIVE:-0}" = 1 ] \ && is_ordinary_partition_migration_full_target "$full_profile_target"; } \ || { [ "${FULL_ONLY_EXACT_PROFILE_ACTIVE:-0}" = 1 ] \ - && is_esp32_full_only_bulk_target "$full_profile_target"; }; then + && is_esp32_full_release_build_target "$full_profile_target"; }; then continue fi # Use the same exact-board choice as single-target auto builds, including @@ -6662,7 +6696,7 @@ run_partition_migration_full_esp32_profile() { fi echo "Partition-migration FULL pass: building ${#migration_targets[@]} canonical ESP32 target(s)." - echo "Each normal-target FULL artifact keeps its mOTA identity after its matching merged image is flashed once; legacy 1.25 MiB artifacts remain published during the transition." + echo "Each normal-target FULL artifact keeps its mOTA identity; install its reviewed expansion package or merged image before updating an older partition layout." MESHDEBUG_OVERRIDE=off PACKET_LOGGING_OVERRIDE=on MQTT_BRIDGE_OVERRIDE=off @@ -6720,7 +6754,7 @@ run_full_esp32_build_targets() { else if [ "${SINGLE_TARGET_FULL_BUILD:-0}" != 1 ]; then for target in "${ordinary_full_targets[@]}"; do - if is_esp32_full_only_bulk_target "$target"; then + if is_esp32_full_release_build_target "$target"; then full_only_targets+=("$target") fi done @@ -6728,10 +6762,6 @@ run_full_esp32_build_targets() { pass_status=$? if [ "$pass_status" -eq 130 ]; then return 130; fi if [ "$pass_status" -ne 0 ]; then build_status=1; fi - run_partition_migration_full_esp32_profile "${ordinary_full_targets[@]}" - pass_status=$? - if [ "$pass_status" -eq 130 ]; then return 130; fi - if [ "$pass_status" -ne 0 ]; then build_status=1; fi FULL_ONLY_EXACT_PROFILE_ACTIVE=1 PARTITION_MIGRATION_FULL_PROFILE_ACTIVE=1 fi @@ -6796,7 +6826,7 @@ run_logging_matrix_build_targets() { echo "Option 3 PlatformIO policy: one target build at a time, ${OPTION3_PIO_JOBS} compiler job(s) inside that process." for target in "${targets[@]}"; do - if is_esp32_full_only_bulk_target "$target"; then + if is_esp32_full_release_build_target "$target"; then # Full companion environments already select their complete profile in # build_firmware, so keep them in the ordinary pass to preserve their # established companion-specific recipe. @@ -6822,7 +6852,7 @@ run_logging_matrix_build_targets() { done for target in "${ordinary_full_targets[@]}"; do - if is_esp32_full_only_bulk_target "$target" \ + if is_esp32_full_release_build_target "$target" \ && ! is_companion_radio_full_target "$target"; then full_only_targets+=("$target") full_only_exact_count=$((full_only_exact_count + 1)) @@ -6837,16 +6867,9 @@ run_logging_matrix_build_targets() { echo "Deferring ${full_only_standard_skip_count} ESP32 ESP-NOW target(s) to their FULL logging fallback; its persistent USB gate also provides normal output-off operation." fi if [ "$full_only_exact_count" -gt 0 ]; then - echo "Publishing ${full_only_exact_count} audited ESP32 target(s) as their exact-identity FULL release only; explicit --standard remains available for recovery." - fi - for target in "${ordinary_full_targets[@]}"; do - if is_ordinary_partition_migration_full_target "$target"; then - partition_migration_full_count=$((partition_migration_full_count + 1)) - fi - done - if [ "$partition_migration_full_count" -gt 0 ]; then - echo "Publishing ${partition_migration_full_count} canonical ESP32 FULL migration target(s) alongside their legacy portable artifacts; flash each matching merged image once before mOTA can use FULL." + echo "Publishing ${full_only_exact_count} ESP32 target(s) as their exact-identity FULL release only; explicit --standard remains available for recovery." fi + echo "ESP32 ordinary releases contain only Full node images; expansion/recovery tools are packaged separately." ESP32_FULL_BUILD=0 MESHDEBUG_OVERRIDE="" PACKET_LOGGING_OVERRIDE="" @@ -6866,10 +6889,6 @@ run_logging_matrix_build_targets() { if [ "$pass_status" -eq 130 ]; then return 130; fi if [ "$pass_status" -ne 0 ]; then build_status=1; fi - run_partition_migration_full_esp32_profile "${ordinary_full_targets[@]}" - pass_status=$? - if [ "$pass_status" -eq 130 ]; then return 130; fi - if [ "$pass_status" -ne 0 ]; then build_status=1; fi PARTITION_MIGRATION_FULL_PROFILE_ACTIVE=1 FULL_ONLY_EXACT_PROFILE_ACTIVE=1 diff --git a/docs/esp32_wifi_partition_migration.md b/docs/esp32_wifi_partition_migration.md index b59b5283f..57e23b7e0 100644 --- a/docs/esp32_wifi_partition_migration.md +++ b/docs/esp32_wifi_partition_migration.md @@ -3,9 +3,10 @@ The partition-migration bridge lets a supported ESP32 node move from a small dual-OTA layout to a verified larger dual-OTA layout without cable flashing or a full-chip erase. It fits a legacy 1.25 MiB slot. The Wi-Fi version exposes an -updater for the full image after migration. The LoRa version retains the old -OTA-capable repeater in the other expanded slot and returns to it after -restoring identity, so it can fetch the full image over LoRa. +updater for the Full image after migration. The LoRa version preserves a +verified old OTA receiver so it can fetch the Full image into the expanded +inactive slot. On 8/16 MiB flash the bridge restores identity before handing +off; the 4 MiB route keeps identity staged until the Full image's first boot. It has explicit, byte-for-byte generated target plans for the 4 MiB MeshCore dual-OTA Full table and Arduino ESP32 `default_8MB.csv` and @@ -19,6 +20,37 @@ table-prefix test; the bridge core is otherwise shared. | 8 MiB | `default_8MB.csv` | 0x330000 / 0x330000 | Seeed XIAO ESP32-S3, Heltec V3 | | 16 MiB | `default_16MB.csv` | 0x640000 / 0x640000 | Heltec V4 / V4.3, Station G2 | +These are the supported migration plans. The 8/16 MiB tables retain more +filesystem storage and a coredump partition; their application slots are not +the absolute maximum permitted by the physical flash capacity. + +## Ordinary Full releases and installation + +Ordinary ESP32 node releases use Full for each exact board and firmware role. +The existing RAM and application-size guards still apply: a failed Full +qualification fails that release target rather than publishing a smaller +ordinary image. Direct `--standard` builds and reduced identities remain +compatibility/development tools outside the ordinary release selection. + +An app-only update cannot change the installed partition table. If a device +already has the required layout, use the matching Full application through a +supported updater. If its layout needs expansion, use a verified migration +ZIP for its exact entry in `--list-boards` and an updater supported by the old +image. Otherwise, install the exact board/role's Full `-merged.bin` through +USB/serial using that board's flashing procedure; the merged image contains +the bootloader, partition table, and application. Never upload a merged image +through an app-only browser or LoRa updater. + +The new Full defaults outside the migration catalog, including ESP32-C6 +boards and boards introduced with `min_spiffs.csv`, have no reviewed wireless +expansion package in this recipe. If their Full app fits the unchanged live +layout and update identity, an ordinary app update can suffice. A table change +requires USB/serial until a matching migration package is reviewed. A Full +image fitting physical flash does not by itself prove it can be installed +through an old updater. Full Companion images with a single app slot likewise +need USB/serial for local firmware replacement; their host-backed LoRa sending +role does not provide a second local update slot. + ## Repeatable ESP32 build recipe From a clean commit, run the shell menu in WSL/Linux: @@ -75,22 +107,26 @@ now built with expanded tables. This includes ESP32-S3, original ESP32, and ESP32-C3 boards with an evidenced old default layout. `--list-boards` is the authoritative list of exact targets; specialty ESP-NOW/observer aliases are separate identities and are not packaged under their old IDs. With Wi-Fi OTA -they can migrate to the -same physical board's canonical role image; their feature settings may need -to be recreated. The LoRa route still requires an exact old target ID. The +they can migrate to the same physical board's canonical role image. The Wi-Fi +bridge verifies and restores its supported saved settings; other settings may +need to be recreated. The LoRa route still requires an exact old target ID. The catalog omits boards with no evidenced legacy default-layout build, such as boards introduced with `min_spiffs.csv` or another non-1.25 MiB layout. Some listed boards use larger slots today but had historical default-layout builds. -A listed package is usable only when the installed old image has a working -Wi-Fi updater and the bridge verifies its live source table. Menu inclusion -does **not** override either check. The only LoRa -bridge packages currently available are the exact-target Heltec V4 and XIAO -S3 WIO repeater packages. On 4 MiB flash the expanded app1 overlaps old app1, -so the currently safe LoRa receiver-copy method cannot be offered there. A -4 MiB Full build offers 1,984 KiB slots, not 4 MiB per slot. A Wi-Fi-only ZIP -can omit `full-application.mota` when its application exceeds the current -2 KiB x 1024-block LoRa serving limit; `full-application.bin` remains the -verified Wi-Fi update image. +A listed package is usable only when the installed old image supports the +selected updater and the bridge verifies its live source table. Menu +inclusion does **not** override either check. + +Every listed board/role has Wi-Fi and LoRa bridge recipes. Heltec V4 and XIAO +S3 WIO repeaters retain their board-specific bridge names; the other entries +use matching original-ESP32, ESP32-S3, or ESP32-C3 chip-family bridges. LoRa +still requires a verified same-target old receiver, and 4 MiB boards require +the slot-B-only sequence below. A 4 MiB Full build offers 1,984 KiB per slot. +The packager verifies both the Full application's slot fit and its mOTA +staging overhead. It supports at most 4096 blocks of 2 KiB for the Full +transfer, and records the seeder proof-scratch requirement in the manifest. +Older 4 KiB-scratch seeders are limited to 1024 blocks. A package fails if +its required Full LoRa transfer cannot fit the supported staging/block limits. Other ESP32 boards need a reviewed source updater, chip/flash-size bridge, verified Full image, and board entry before they can be added. The LoRa route @@ -102,15 +138,23 @@ Matching flash capacity alone is not enough to claim a package is safe. Before it touches the partition table, the bridge reads the historical `/identity/_main.id` SPIFFS file. It requires all 96 bytes (32-byte public key followed by its 64-byte private key), stages them in an NVS namespace that is -unchanged by both target layouts, then changes the table. On the first boot -with the expanded layout it writes the staged value into SPIFFS, reads it back -byte-for-byte, and only then clears the NVS staging record and offers the final -uploader. +unchanged by the source and target layouts, then changes the table. The Wi-Fi +bridge and 8/16 MiB LoRa bridge restore the staged value into expanded SPIFFS, +read it back byte-for-byte, and only then clear the NVS staging record. On the +4 MiB LoRa route, the Full application's first boot performs this restoration. -The private identity is the guaranteed preservation boundary. The old SPIFFS -image is deliberately not raw-copied into an expanded partition: SPIFFS is not -safe to resize that way. Other SPIFFS-backed settings can be recreated after -the full image boots. +The Wi-Fi bridge also stages and verifies its supported saved configuration: +node name and preferences, radio profiles, ACL and login replay state, region +keys, and selected network/OTA, filtering, display, and telemetry settings. +It refuses migration if the saved files cannot fit or verify in NVS. The older +LoRa handoff route preserves only the private identity, so saved settings may +reset. The two board-specific Partition Expander routes preserve their +supported configuration and automatically fetch the exact-target Full image; +follow the package README for those routes. + +The old SPIFFS image is deliberately not raw-copied into an expanded partition: +SPIFFS is not safe to resize that way. Files outside the supported preservation +set, including logs and temporary radio sessions, are not preserved. Migration does erase the 4 KiB partition-table sector and the destination app sectors. Expanded SPIFFS can be reformatted. It never issues a full-chip erase. @@ -129,8 +173,9 @@ This means the source app-slot and SPIFFS sizes can vary; the bridge validates the live geometry instead of carrying board-name rules. It also ensures it is running from one source OTA slot. If it arrived in B, it CRC-copies itself to the future A address, selects A in OTA metadata, writes the table, and -restarts. It therefore works whether the browser OTA updater placed the bridge -in legacy A or B. +restarts. The Wi-Fi route therefore works whether the browser OTA updater +placed the bridge in legacy A or B. Single-app source layouts cannot use this +route. Keep power stable while the bridge is replacing the 4 KiB table sector. A loss of power before that point leaves the old table and source intact. After that @@ -154,26 +199,43 @@ bootloader and table offsets for cable flashing, not browser OTA. `xiao_s3_partition_legacy_seed` is a disposable-hardware test image only. It models the legacy table and an identity file; it is not a deployable repeater. -## LoRa-only migration of a repeater +## LoRa-only migration of a listed role -The exact old repeater must already support MeshCore LoRa mOTA and have a valid +The exact old board/role must already support MeshCore LoRa mOTA and have a valid EndF image identity. The LoRa bridge checks the old app's target ID and body hash before any partition-table write; an unsupported or damaged receiver is -refused. It works from either legacy A or B. It copies legacy B to the future -B address, boots the bridge once to restore the private key in expanded -SPIFFS, then boots the preserved old repeater. That repeater can receive the -full image into its now-expanded inactive slot. +refused. Keep a capable seeder on the old receiver's compiled default radio +profile before starting: this route may reset saved radio settings. Verify +that the seeder lists the Full image and has the manifest's required proof +scratch before installing the first-stage bridge. + +On 8/16 MiB flash the bridge can run from either legacy A or B. It copies +legacy B to the future B address, boots the bridge once to restore the private +key in expanded SPIFFS, then boots the preserved old receiver. That receiver +can fetch the Full image into its now-expanded inactive slot. + +On 4 MiB flash the expanded app1 overlaps old app1, so that copy cannot be +used. A verified old same-target receiver must remain in old A and the bridge +must be installed in old B; a bridge in A refuses migration. If the old node +is running B, first install and boot a working same-target old receiver in A, +then install the bridge in B. After expansion the old receiver in A may use a +temporary identity. The original key stays staged in NVS until the Full image +restores it on first boot. Complete the second update before treating that +device as the migrated node. The board-specific LoRa bridges are `heltec_v4_partition_migrator_lora_repeater` -and `xiao_s3_partition_migrator_lora_repeater`. Build the final repeater with +and `xiao_s3_partition_migrator_lora_repeater`; the other listed roles use their +configured chip-family LoRa bridges. Build the final application with `bash build.sh build-firmware --full-exact` so its mOTA target ID -still matches the old repeater. `scripts/package_esp32_partition_migration.py` +still matches the old role. The repeatable recipe already uses this selector. +`scripts/package_esp32_partition_migration.py` checks the images, partition tables, hashes and mOTA containers and creates -separate Wi-Fi/LoRa migration ZIPs for those two boards. The ZIP README gives +one Wi-Fi/LoRa migration ZIP for each selected exact board/role. The ZIP README gives the exact `ota ls`, `ota pull flash`, `ota install` sequence. -A stock repeater without LoRa mOTA cannot use the LoRa-only route. The -Wi-Fi bridge remains the route for that device. +An old image without LoRa mOTA cannot use the LoRa-only route. Use its working +Wi-Fi updater with a listed package, or USB/serial if no supported updater or +package is available. ## Heltec V4 / V4.3 diff --git a/docs/firmware_picker.md b/docs/firmware_picker.md index 3e9505d7d..8f0d7329c 100644 --- a/docs/firmware_picker.md +++ b/docs/firmware_picker.md @@ -30,8 +30,9 @@ from the published firmware assets.

For a new installation, choose the exact board and role, prefer a FULL / complete profile when it is available, and select - Full install / layout migration (merged .bin). Narrower profiles - remain available when their reduced transport or feature set is intentional. + Full install / layout migration (merged .bin). Current ESP32 + releases combine the supported features in Full; use runtime settings to + choose the active transports. Other chip families retain their qualified profiles.

Upgrading an existing ESP32 infrastructure node from a smaller partition @@ -255,13 +256,16 @@ settings** button creates a public website link that other people can open. ## FULL versus standard -For a new installation, use the FULL / complete profile when it exists and the -board has enough flash. FULL profiles keep the complete supported feature set -and CLI. Standard profiles remain useful for boards without a FULL build, for -an intentionally narrower transport, or when retaining an existing compatible -partition layout. +Current ESP32 ordinary releases use one Full / complete image per exact board +and role. Full keeps the supported feature set and CLI; runtime switches select +USB, Bluetooth, Wi-Fi, logging, and other qualified features. Separate portable, +minimal, and single-transport ESP32 images are installation/recovery recipes, +not additional ordinary release choices. The documented T-LoRa UART/MQTT RAM +split remains two Full images. Other chip families retain their qualified +capacity and sensor-profile choices. -Changing between standard and FULL ESP32 layouts requires a partition migration. +Moving an older ESP32 installation to an expanded Full layout requires a +partition migration. Use the exact-board merged image over USB, or a supported exact board and role staged migration ZIP from the [utility release](https://github.com/mikecarper/MeshCore/releases/tag/utility-v1.17.1.8-halo-keymind-cascade-dev-9053038f). Read that ZIP's README before choosing the Wi-Fi or LoRa route. Do not send a diff --git a/docs/research/esp32_full_build_audit_2026-10-06.md b/docs/research/esp32_full_build_audit_2026-10-06.md new file mode 100644 index 000000000..1337bb61a --- /dev/null +++ b/docs/research/esp32_full_build_audit_2026-10-06.md @@ -0,0 +1,318 @@ +# Why ESP32 builds still have options besides Full + +Audit date: 2026-10-06. Source baseline: `2ee62b981435df7dc4bcd79de39e61a4d5e98652` on `keymindCascade`. + +## Implemented consolidation + +After the audit, the ordinary ESP32 release policy was changed to publish Full +only. The exact selector replay goes from **317 planned images to 172**, +removing all 145 standard/reduced slots. All 172 previous Full target +identities, compiled PlatformIO environments, and Full overlay flags remain +identical; no new Full compilation recipe or capacity requirement is introduced. +The baseline findings below describe the policy before this change. + +The ordinary board/role resolvers omit ESP32 reduced aliases. Every selected +infrastructure Full image is built once, using its existing exact recipe and +identity. Generated Full Companion keeps its registered USB/BLE/WiFi source +environment. Resume packaging removes stale standard, minimal, transport, +runtime-setting, and development artifacts instead of reintroducing them. +Unverified ordinary Full images fail qualification. Other chip families keep +their existing profile policies, and KISS remains a distinct host-modem role. + +The measured T-LoRa UART/MQTT transport split and capacities within Full are +preserved. Direct explicit recovery recipes and reviewed partition-migration +packages remain available separately. The existing same-partition identity +allowlist is deliberately retained for OTA compatibility checks; broadening +release selection does not authorize an app-only update across layouts. + +Not every board has a reviewed wireless expansion package. Targets outside +the migration catalog require USB/serial for a partition-table change. The +[updated migration guide](../esp32_wifi_partition_migration.md) explains this +distinction and the supported cable-free routes. + +The [complete baseline inventory](esp32_full_build_inventory_baseline_2026-10-06.csv) +contains all 636 primary logical names and four optional local HIL names, +including their exact Full mappings. The [post-change selector comparison](esp32_full_release_selection_2026-10-06.json) +records zero standard/reduced slots, zero duplicate identities, and no change +to any previous Full source recipe. + +## Decision being audited + +Prefer one Full image for each exact board and firmware role. A smaller image +needs a demonstrated RAM limit or a demonstrated failure to fit the largest +safe application layout for that board and role. An image failing an old, +small OTA slot does not establish either condition. + +This audit examines the resolved PlatformIO recipes and the release builder's +generated aliases and routing. It distinguishes options a user can explicitly +build from artifacts that the normal release matrix actually publishes. +Existing measurements are identified by their original revision; they are not +presented as fresh builds of the audit baseline. This is a source and evidence +audit followed by release-policy consolidation and focused validation, not a +rebuild or hardware qualification of every ESP32 target. + +## What Full means + +Full is a feature profile within a firmware role. A Full Companion combines +the board's qualified app transports and text terminal. A Full Repeater, +Room Server, or Sensor keeps the supported infrastructure features, logging, +and OTA support. These roles have different jobs and remain separate images. +Different radios, pin maps, displays, and expansion hardware also remain +separate exact board recipes. + +Full does not mean every board has identical contact counts, queue lengths, +or routing-table capacities. Reducing a table to meet a measured RAM budget +can preserve the Full feature set. Nor does a compiled feature have to run all +the time: runtime settings can turn off WiFi, logging, or other supported +services without installing a different image. + +There are two implementations with confusingly similar names. Named +`*_companion_radio_full` targets are Full Companion even when the infrastructure +`ESP32_FULL_BUILD` overlay is not set. Counting only that overlay would +incorrectly call these images non-Full. + +## Why the other options exist + +### Genuine RAM constraints + +The T-LoRa V2.1-1.6 combined UART, MQTT, and ESP-NOW image has a retained +linked measurement of 190,488 available internal bytes against 196,984 required +bytes: a 6,496-byte shortfall. It therefore retains separate UART/ESP-NOW and +MQTT/ESP-NOW Full images. This is evidence for a transport-combination +exception, not for dropping Full on the entire board. See +[the firmware RAM policy](firmware_memory_budget.md). + +Other constrained boards already run Full with board-specific capacities. +The [2026-10-02 Companion audit](../test-results/heltec_v3_preview3_ram.md) +records passing ordinary Full builds for Heltec V2/V3, Wireless Tracker, +Tracker V2, CT62, XIAO C3, Generic ESP-NOW, T-Beam, and T-LoRa. Some margins +are small: Generic ESP-NOW had 1,536 bytes and Tracker V2 had 2,254 bytes +above the unchanged linked runtime allowance. A pass establishes that exact +image's budget, not sustained runtime or room for future feature growth. + +PSRAM does not eliminate all RAM limits. Bluetooth, WiFi, DMA buffers, and +some allocations still require internal RAM. The guards exclude PSRAM from +the internal budget; classic ESP32 additionally has a static DRAM-placement +limit. See [the classic ESP32 budget](esp32_memory_budget.md). + +### Older installed partitions and update identities + +Portable standard and `*_lora_ota_no_external_sensors` images can fit a +historical 1.25 MiB OTA slot. On qualified targets, Full fits after expansion, but +ordinary app-only OTA cannot rewrite its partition table. LoRa OTA also +checks the exact target identity and layout; merely renaming a Full image +does not make it a valid update for an old installation. + +This explains recovery and migration artifacts. It does **not** establish a +hardware capacity exception. Once a supported device has migrated, its +ordinary role image should be Full. A small migration bridge remains useful +as a tool, rather than as a second everyday firmware choice. The +[migration guide](../esp32_wifi_partition_migration.md) describes the supported +layouts, preservation checks, and current limitations of cable-free migration. + +### Legacy transport and settings recipes + +Many USB-only, BLE-only, WiFi-only, Terminal Chat, power-saving, and FEM-default +recipes still exist so an exact old name can be built. Where an exact Full +replacement exists, the normal release matrix already suppresses many of +these duplicates. Their presence in PlatformIO is not proof that they must +appear in the firmware picker or that Full cannot fit. + +The release builder also retains explicit `--standard` and explicit reduced +OTA requests. These selectors intentionally override automatic Full selection. +That is a compatibility/developer policy, not a measured RAM or maximum-flash +finding. + +### Different roles and development tools + +KISS modem firmware exposes a raw modem protocol; it is not the Companion +application protocol or a MeshCore Repeater. Its existence is a role decision, +not an argument that the board cannot support Full. Partition migrators, +expanders, legacy-layout seeds, and simulation fixtures likewise have a +specific test or installation job. The normal release matrix excludes those +development tools. They should be considered separately from everyday +non-Full node images. + +### Eligibility rules and missing qualification + +The infrastructure Full selector uses recipe metadata, including admin, +MQTT, and ESP-NOW markers. Companion Full qualification also needs an exact +combined recipe or a qualified replacement. These rules can exclude an +option without measuring its RAM or largest safe flash layout. + +An absent Full recipe, an eligibility-list omission, or an old compile failure +is an **unproven exception**. It requires qualification or an explicit product +decision; it must not be described as a demonstrated capacity failure. + +## What counts as the maximum partition + +Flash is divided among boot metadata, applications, and persistent data. +Infrastructure self-update requires two application slots; it cannot use +the entire chip as one app slot. Companion Full can be a host-backed LoRa +OTA sender without being a LoRa self-update destination, so some Companion +layouts intentionally use one larger application slot and require USB for +self-updates. + +T-Beam 1W Full Companion keeps LilyGo's factory-compatible single 3 MiB app +slot even though the board has 16 MiB flash. This is a boot/layout and +source-role contract, rather than a failure of Full to fit its physical flash. + +| Physical flash | Normal expanded infrastructure slot | Upper dual-slot ceiling with only 64 KiB data storage | +| --- | ---: | ---: | +| 4 MiB | 2,031,616 B (`0x1F0000`) | 2,031,616 B (`0x1F0000`) | +| 8 MiB | 3,342,336 B (`0x330000`) | 4,128,768 B (`0x3F0000`) | +| 16 MiB | 6,553,600 B (`0x640000`) | 8,323,072 B (`0x7F0000`) | + +The upper ceilings assume 64 KiB before the first application, equal +64 KiB-aligned application slots, and 64 KiB of filesystem storage, with no +additional coredump or mandatory data region. They are arithmetic bounds, +not qualified partition plans. Required data, preserved offsets, or a larger +minimum filesystem can lower the safe bound. The existing 8/16 MiB layouts +retain substantially more storage and a coredump partition; their current +slot sizes are therefore not the absolute physical maximum. + +SenseCAP Indicator's 8 MiB preserved-data Full layout is a further exception: +it keeps 2,621,440-byte (`0x280000`) OTA slots and the old filesystem/coredump +addresses. Its first slot ends at the preserved filesystem boundary, so both +usable OTA slots have that limit despite the larger chip. This is a data-layout +constraint; it must be distinguished from an absolute flash-capacity limit. + +A Full size failure against the legacy 1.25 MiB ceiling, or against an +existing 8/16 MiB default slot alone, is insufficient evidence for a permanent +minimal image. The audit must first establish the board's actual flash size, +the role's update requirements, and its minimum safe persistent-data layout. + +## Baseline audit inventory and outstanding qualification + +The primary repository configuration contains **500 concrete ESP32 +environments and 136 builder-generated aliases: 636 logical target names**. +They are recipes and identities, not 636 separate everyday images. The +canonical resolver keeps 374 names, including 43 KISS modems; the default +non-KISS node selection contains 331 names. + +Evaluating the real release-matrix selectors and the per-build Full promotion +rules gives **317 planned ESP32 node artifact slots: 172 Full and 145 +non-Full**. These are pre-build selections, not an assertion that 317 current +binaries were produced. Size-driven fallback, failed qualification, and the +final package's capability-based consolidation can change the final output. + +| Planned non-Full group | Count | Why selected | Finding under the requested capacity-only exception rule | +| --- | ---: | --- | --- | +| `*_lora_ota_no_external_sensors` | 99 | Generated reduced OTA identity explicitly selects standard | Compatibility/profile policy; no per-target RAM or maximum-layout failure is required before selecting it | +| Legacy images in the partition-migration inventory | 24 | Builder deliberately retains portable output during transition to expanded Full | Old installed-layout compatibility, rather than maximum hardware capacity | +| Other complete standard images with a supported Full route | 22 | Their names are outside the curated Full-only and migration promotion lists | Missing policy promotion/partition qualification; not demonstrated capacity exclusions | + +**Every primary canonical node target has a supported Full route**, after +mapping a reduced identity to its feature-rich base. That establishes routing, +not that every current Full image has passed a fresh RAM/flash build or +hardware validation. No retained current-baseline failure establishes that +all 145 non-Full selections are necessary because Full cannot fit RAM or the +largest safe partition. + +The 22 complete standard choices outside the migration list are: + +- Generic ESP-NOW: Repeater and Room Server. +- GEPRC Linkflow 900: Repeater. +- T-Beam SX1262 and SX1276: Repeater and Room Server for each radio. +- LilyGo T-LoRa C6 and T-LoRa V2.1-1.6: Repeater and Room Server for each board. +- M5Stack Unit C6L: Repeater and Room Server. +- Meshadventurer SX1262 and SX1268: Repeater and Room Server for each radio. +- Station G3 ESP32 revision 2: Repeater and Room Server. +- XIAO C6, Meshimi, and WHY2025 Badge: Repeater. + +These are candidates for exact Full/layout qualification, rather than an +approved instruction to relabel their old binaries. The T-LoRa transport +combination exception above still applies. + +All **52 canonical ESP32 Companion selections are already named Full**; +there are zero canonical non-Full Companions. All 21 standalone ESP32 +Terminal Chat names map to exact Full Companion replacements. Most surviving +old transport recipes are therefore direct-build compatibility choices rather +than current release duplication. + +This PC's ignored local configuration additionally loads four ESP32 radio +bench fixtures. Three are excluded by the utility-name filter. The fourth, +`profile_four_tx_v4_rx`, escapes that filter and adds one standard selection +when the bench configuration is loaded. It is a local release-leakage risk, +not a clean primary-configuration node option; it is excluded from the counts +above and listed separately in the inventory. + +The [capacity evidence snapshot](esp32_full_build_capacity_evidence_2026-10-06.json) +retains 38 historical linked reports for 14 ESP32 target identities, together +with original failures, repairs, app sizes, and partition tables. All 38 +reports pass their recorded budgets. Every bound artifact still present in +this checkout matches its saved hash; eight referenced files are absent, so +their saved reports cannot be fully rebound here. These results are historical +evidence, not complete current-source qualification. + +### Method and policy locations + +PlatformIO resolved the configuration once. The builder was then sourced with +that cached configuration and a failing `pio` stub; the audit evaluated its +actual selectors and intercepted build calls without compiling or flashing. +The local configuration only adds HIL include files, so those 11 optional +environments (four ESP32) were removed from the cached primary inventory +without changing ordinary resolved options. A second selector replay confirmed +the primary counts. Independent policy and memory reviews checked the results. + +Relevant source locations at the audited baseline are: + +- `build_legacy.sh:245`: environment metadata and generated identities. +- `build_legacy.sh:3244`: infrastructure Full eligibility. +- `build_legacy.sh:3263`: curated Full-only bulk promotion list. +- `build_legacy.sh:3312`: partition-migration legacy/Full list (25 identities; + 24 contribute standard slots in this matrix). +- `build_legacy.sh:4901`: actual per-build profile promotion. +- `build_legacy.sh:5306`, `5400`, and `5595`: exact Companion/Terminal Chat + replacement and redundant-artifact filtering. +- `build_legacy.sh:6626`: separate Full migration pass. +- `build_legacy.sh:6980`: reduced auto fallback follows selected-slot size + overflow; it does not prove a maximum-layout failure. +- `scripts/build_local_release.py:105`: final Full/capability consolidation; + standard records otherwise pass through. +- `scripts/build_local_release.py:407`: normal release explicitly skips KISS. +- `scripts/esp32_full_partition.py`: expanded, preserved-data, and single-slot + Full partition choices. + +The audit itself did not flash a device. The resulting consolidation changes +ordinary release routing and resume selection; existing firmware recipes and +capacity guards are retained. + +## Fresh validation of the consolidation + +| Exact Full target | Final app size / slot | Linked internal available / required | Result | +| --- | ---: | ---: | --- | +| `LilyGo_Tlora_C6_repeater_` | 2,010,024 / 2,031,616 B | 283,088 / 139,200 B | Passed; 21,592 B flash margin | +| `Heltec_v2_companion_radio_full` | 2,275,368 / 3,342,336 B | 184,680 / 173,840 B | Passed; 10,840 B linked RAM margin | + +These sequential embedded builds use the audit baseline plus the release-rule +changes, version `v1.17.1.9-halo-keymind-cascade-dev-fullaudit`. The C6 uses +its supported expanded 4 MiB dual-OTA layout. The generated V2 Full Companion +correctly compiles `Heltec_v2_companion_radio_wifi`; its named Full identity is +preserved. Both produced verified capability manifests and firmware-bound RAM +reports. No physical flashing or runtime qualification is claimed. + +Focused release/profile regressions cover the real matrix scheduler, exact +Companion recipe mapping, stale-artifact selection, preserved T-LoRa transport +split, direct recovery access, and unchanged non-ESP32 choices. The complete +`test/test_build_profiles.sh` suite passed, as did 69 Python tests covering +selection, partitions, RAM, and packaging. The 58 selection/partition/RAM cases +ran on native Linux; the 11 packaging cases ran on Windows Python 3.13 because +Linux Python 3.10 lacks the packaging code's pre-existing `hashlib.file_digest` +API. The [selector evidence](esp32_full_release_selection_2026-10-06.json) +records these results and the fresh builds' bound artifact hashes. + +## Recommended release rule + +Use Full as the everyday choice per exact board and role wherever it passes +the existing RAM guards and the largest safe, supported partition layout. +Retain capacity-tuned Full recipes when they preserve the board's features. +Keep genuinely incompatible transport combinations separate, with their +measured reason documented. Present migration/recovery tools separately from +ordinary firmware and retain old names as compatibility aliases where useful. + +Require a passing ELF-bound RAM report and the exact application/partition +sizes for every capacity exception. Do not allow an unexplained name-based +exception to masquerade as a hardware limit. Runtime startup, reconnect, +service-toggle, OTA, and sustained heap checks remain necessary for Full +qualification; build success alone does not cover them. diff --git a/docs/research/esp32_full_build_capacity_evidence_2026-10-06.json b/docs/research/esp32_full_build_capacity_evidence_2026-10-06.json new file mode 100644 index 000000000..fa4c97988 --- /dev/null +++ b/docs/research/esp32_full_build_capacity_evidence_2026-10-06.json @@ -0,0 +1,2201 @@ +{ + "schema_version": 1, + "date": "2026-10-06", + "source_baseline": "2ee62b981435df7dc4bcd79de39e61a4d5e98652", + "scope": "Historical capacity reports and bound artifact hash/size audit. No new ELF qualification is implied by these retained reports.", + "limitations": [ + "No current all-ESP32 Full capacity failure report was found in retained local records.", + "Historical repaired failure or portable1.25MiB overflow does not justify current non-Full.", + "Default8/16MiB slot overflow is not proof of exceeding theoretical maxsafe slot.", + "PSRAM does not satisfy internal8-bit allocator/staticDRAM limits; retained largest-block and total-internal budgets both matter.", + "The runtime and8KiB static reserves are engineering policies, distinct from physical address/flash overflow." + ], + "historical_failures_and_repairs": [ + { + "target": "Generic_ESPNOW_companion_radio_full", + "evidence": "docs/old-releases/1.17.1.5.md:62", + "kind": "historical_linked_runtime_budget_failure", + "original_available_bytes": 101920, + "required_bytes": 136192, + "shortfall_bytes": 34272, + "replacement_available_bytes": 139456, + "replacement_margin_bytes": 3264, + "resolution": "Retained Full transports; contact capacity/queue storage tuned. No current non-Full exclusion follows." + }, + { + "target": "Heltec_Wireless_Paper_companion_radio_full", + "evidence": "docs/old-releases/1.17.1.5.md:62", + "kind": "historical_linked_runtime_budget_failure", + "original_available_bytes": 150144, + "required_bytes": 152576, + "shortfall_bytes": 2432, + "replacement_available_bytes": 161336, + "replacement_margin_bytes": 8760, + "resolution": "Retained Full transports; contact capacity/queue storage tuned. No current non-Full exclusion follows." + }, + { + "target": "Heltec_Wireless_Tracker_companion_radio_full", + "evidence": "docs/old-releases/1.17.1.5.md:62", + "kind": "historical_linked_runtime_budget_failure", + "original_available_bytes": 148496, + "required_bytes": 169986, + "shortfall_bytes": 21490, + "replacement_available_bytes": 186032, + "replacement_margin_bytes": 16046, + "resolution": "Retained Full transports; contact capacity/queue storage tuned. No current non-Full exclusion follows." + }, + { + "target": "Heltec_ct62_companion_radio_full", + "evidence": "docs/old-releases/1.17.1.5.md:62", + "kind": "historical_linked_runtime_budget_failure", + "original_available_bytes": 99104, + "required_bytes": 136192, + "shortfall_bytes": 37088, + "replacement_available_bytes": 136640, + "replacement_margin_bytes": 448, + "resolution": "Retained Full transports; contact capacity/queue storage tuned. No current non-Full exclusion follows." + }, + { + "target": "Heltec_v3_companion_radio_full", + "evidence": "docs/old-releases/1.17.1.5.md:62", + "kind": "historical_linked_runtime_budget_failure", + "original_available_bytes": 143840, + "required_bytes": 173056, + "shortfall_bytes": 29216, + "replacement_available_bytes": 181376, + "replacement_margin_bytes": 8320, + "resolution": "Retained Full transports; contact capacity/queue storage tuned. No current non-Full exclusion follows." + }, + { + "target": "Xiao_C3_companion_radio_full", + "evidence": "docs/old-releases/1.17.1.5.md:62", + "kind": "historical_linked_runtime_budget_failure", + "original_available_bytes": 98880, + "required_bytes": 136192, + "shortfall_bytes": 37312, + "replacement_available_bytes": 136416, + "replacement_margin_bytes": 224, + "resolution": "Retained Full transports; contact capacity/queue storage tuned. No current non-Full exclusion follows." + }, + { + "target": "heltec_tracker_v2_companion_radio_full_femon", + "evidence": "docs/old-releases/1.17.1.5.md:62", + "kind": "historical_linked_runtime_budget_failure", + "original_available_bytes": 133136, + "required_bytes": 169986, + "shortfall_bytes": 36850, + "replacement_available_bytes": 170672, + "replacement_margin_bytes": 686, + "resolution": "Retained Full transports; contact capacity/queue storage tuned. No current non-Full exclusion follows." + }, + { + "target": "heltec_tracker_v2_repeater_observer_mqtt", + "evidence": "docs/old-releases/1.17.1.6.md:127", + "kind": "historical_linked_runtime_budget_failure", + "original_available_bytes": 184640, + "required_bytes": 190386, + "shortfall_bytes": 5746, + "replacement_available_bytes": 222992, + "resolution": "Keep 50 board-defined neighbors; Full display/MQTT/OTA retained. Tracker v1.1 repaired similarly, exact original numbers not present here." + }, + { + "target": "LilyGo_TLora_V2_1_1_6_repeater all-three-transports trial", + "evidence": "docs/research/firmware_memory_budget.md:33", + "kind": "historical_linked_runtime_budget_failure", + "original_available_bytes": 190488, + "required_bytes": 196984, + "shortfall_bytes": 6496, + "resolution": "Separate qualified Full UART+ESP-NOW and MQTT+ESP-NOW siblings; no blanket Full exclusion." + }, + { + "target": "Heltec_v2_repeater shared-default scope trial", + "evidence": "docs/research/esp32_memory_budget.md:39", + "kind": "historical_static_project_reserve_failure", + "static_span_bytes": 124020, + "static_region_bytes": 124580, + "static_free_bytes": 560, + "required_static_reserve_bytes": 8192, + "reserve_shortfall_bytes": 7632, + "resolution": "31 scope slots gives108308B static span/16272B free; normal board already used31. This is below project margin, not hardware address overflow." + }, + { + "target": "five constrained ESP32 Full Companions and two PSRAM Indicator LoRa Full images", + "evidence": "docs/releases/1.17.1.8.md:30", + "kind": "historical_documented_matrix_failure_then_repair", + "exact_original_byte_counts": null, + "resolution": "100 contacts and224/256 queues; Indicator320x320 internal canvas retains350 contacts/512 PSRAM queue. Full transports retained." + }, + { + "target": "Generic_ESPNOW_companion_radio_full 256-frame current-policy trial", + "evidence": "build_legacy.sh:4281", + "kind": "source_comment_measured_claim_not_rebuilt_by_this_audit", + "original_available_bytes": 141376, + "required_bytes": 142336, + "shortfall_bytes": 960, + "resolution": "Current Full recipe uses100 contacts/224 frames. Rebuild exact current recipe before claiming current failure." + } + ], + "documented_selected_passes": [ + { + "source": "docs/test-results/heltec_v3_preview3_ram.md:10", + "date": "2026-10-02", + "scope": "Thirteen selected ordinary Full profiles all pass linked budget; not a complete matrix rebuild.", + "smallest_esp32_margins": { + "Generic_ESPNOW": 1536, + "TrackerV2_FEMon": 2254, + "HeltecV3": 3016, + "XiaoC3": 3712, + "HeltecCT62": 3904, + "WirelessTracker": 5358 + } + }, + { + "source": "docs/test-results/companion_contact_cache_results.md:20", + "date": "2026-09-08", + "scope": "All six optional350-contact40-channel256-frame NimBLE/cache trials pass; alternatives are experimental and not current default recipes.", + "final_margins": { + "HeltecV3": 23112, + "WirelessTracker": 30838, + "TrackerV2_FEMon": 15470, + "HeltecCT62": 15152, + "XiaoC3": 14960, + "GenericESPNOW": 15872 + } + } + ], + "retained_report_count": 38, + "retained_distinct_targets": 14, + "historical_linked_memory_reports": [ + { + "report": ".releases/esp32-migration-audit-4mb/builds/Generic_E22_sx1262_repeater-full-logging-ota-v1.17.1.7-halo-keymind-cascade-dev-af73d05f.memory.json", + "report_sha256": "ae8dec1949a5a7580136737bd791d5629f79bde40a021a2d317aee5f7e8cb470", + "target": "Generic_E22_sx1262_repeater", + "artifact_target": "Generic_E22_sx1262_repeater", + "pio_environment": "Generic_E22_sx1262_repeater", + "mcu": "esp32", + "elf_sha256": "228febf212b971f48fddbaa33d1d97c584d7af4101c880ca1bb91d00beddcaee", + "passed": true, + "available_internal_bytes": 202128, + "required_heap_bytes": 154560, + "largest_internal_region_bytes": 113840, + "required_contiguous_bytes": 16400, + "heap_budget_margin_bytes": 47568, + "contiguous_budget_margin_bytes": 97440, + "scope_of_audit": "Historical report and available artifact hash/length verification; no current-head rebuild or ELF requalification.", + "artifacts": [ + { + "name": "Generic_E22_sx1262_repeater-full-logging-ota-v1.17.1.7-halo-keymind-cascade-dev-af73d05f.bin", + "expected_sha256": "ee1f64814d1a77f1afd12a9e5cfa3e83a1b8f48ff828f1d65da2edcec0129177", + "present": true, + "actual_sha256": "ee1f64814d1a77f1afd12a9e5cfa3e83a1b8f48ff828f1d65da2edcec0129177", + "sha256_matches": true, + "bytes": 1606776 + }, + { + "name": "Generic_E22_sx1262_repeater-full-logging-ota-v1.17.1.7-halo-keymind-cascade-dev-af73d05f-merged.bin", + "expected_sha256": "615afac1c83442dec359bcd15eeaf8f309825fdf3453d6c37e7fb860501e027f", + "present": true, + "actual_sha256": "615afac1c83442dec359bcd15eeaf8f309825fdf3453d6c37e7fb860501e027f", + "sha256_matches": true, + "bytes": 1672312 + }, + { + "name": "Generic_E22_sx1262_repeater-full-logging-ota-v1.17.1.7-halo-keymind-cascade-dev-af73d05f.capabilities.json", + "expected_sha256": "bb3d4cf8d4987b24a92a5e01b54344a77b45fed447fb16eaf010676b7037a268", + "present": true, + "actual_sha256": "bb3d4cf8d4987b24a92a5e01b54344a77b45fed447fb16eaf010676b7037a268", + "sha256_matches": true, + "bytes": 2039 + } + ] + }, + { + "report": ".releases/esp32-migration-audit-4mb/builds/Heltec_ct62_sensor-full-logging-ota-v1.17.1.7-halo-keymind-cascade-dev-af73d05f.memory.json", + "report_sha256": "156ee75d9dbbeb042c6e820f4a9d19700a92f8996fea7c9e2ebd6ff7ec72b3d7", + "target": "Heltec_ct62_sensor", + "artifact_target": "Heltec_ct62_sensor", + "pio_environment": "Heltec_ct62_sensor", + "mcu": "esp32c3", + "elf_sha256": "8cb51a2c814c5aaf21eb27f97d4efb8807532bec7c918940897bf0babcbdb13e", + "passed": true, + "available_internal_bytes": 230816, + "required_heap_bytes": 125544, + "largest_internal_region_bytes": 230816, + "required_contiguous_bytes": 10256, + "heap_budget_margin_bytes": 105272, + "contiguous_budget_margin_bytes": 220560, + "scope_of_audit": "Historical report and available artifact hash/length verification; no current-head rebuild or ELF requalification.", + "artifacts": [ + { + "name": "Heltec_ct62_sensor-full-logging-ota-v1.17.1.7-halo-keymind-cascade-dev-af73d05f.bin", + "expected_sha256": "e748e373a3c2bef56d44e4982db4a62ac48e3bcc617a1825309891c55a090e6d", + "present": true, + "actual_sha256": "e748e373a3c2bef56d44e4982db4a62ac48e3bcc617a1825309891c55a090e6d", + "sha256_matches": true, + "bytes": 1499240 + }, + { + "name": "Heltec_ct62_sensor-full-logging-ota-v1.17.1.7-halo-keymind-cascade-dev-af73d05f-merged.bin", + "expected_sha256": "96a48c7c09af428490aa05d668f0c2424a78adfe66e6e66d4639e427d62c8a80", + "present": true, + "actual_sha256": "96a48c7c09af428490aa05d668f0c2424a78adfe66e6e66d4639e427d62c8a80", + "sha256_matches": true, + "bytes": 1564776 + }, + { + "name": "Heltec_ct62_sensor-full-logging-ota-v1.17.1.7-halo-keymind-cascade-dev-af73d05f.capabilities.json", + "expected_sha256": "1d0b3b1aac561474907bd7076ae7cf190cd31a2e153276fc0126a52192c359b0", + "present": true, + "actual_sha256": "1d0b3b1aac561474907bd7076ae7cf190cd31a2e153276fc0126a52192c359b0", + "sha256_matches": true, + "bytes": 1605 + } + ] + }, + { + "report": ".releases/esp32-migration-audit-4mb/builds/Station_G2_logging_repeater-full-logging-ota-v1.17.1.7-halo-keymind-cascade-dev-af73d05f.memory.json", + "report_sha256": "a54cf3a08cc7774becd31335f6d8731f1200152ae2a2292cb02d63f266422f84", + "target": "Station_G2_logging_repeater", + "artifact_target": "Station_G2_logging_repeater", + "pio_environment": "Station_G2_logging_repeater", + "mcu": "esp32s3", + "elf_sha256": "6209de425c991a4d1f5af05caad8ce92333d1831ddc97c5d5fbf53a88b787195", + "passed": true, + "available_internal_bytes": 220400, + "required_heap_bytes": 140208, + "largest_internal_region_bytes": 187632, + "required_contiguous_bytes": 12616, + "heap_budget_margin_bytes": 80192, + "contiguous_budget_margin_bytes": 175016, + "scope_of_audit": "Historical report and available artifact hash/length verification; no current-head rebuild or ELF requalification.", + "artifacts": [ + { + "name": "Station_G2_logging_repeater-full-logging-ota-v1.17.1.7-halo-keymind-cascade-dev-af73d05f.bin", + "expected_sha256": "cf56ffa702dc4dadb786dfa7d374f6b6d8c23ac5783d879c2c7904fb24047431", + "present": true, + "actual_sha256": "cf56ffa702dc4dadb786dfa7d374f6b6d8c23ac5783d879c2c7904fb24047431", + "sha256_matches": true, + "bytes": 1557384 + }, + { + "name": "Station_G2_logging_repeater-full-logging-ota-v1.17.1.7-halo-keymind-cascade-dev-af73d05f-merged.bin", + "expected_sha256": "8733885c77ceae35f3c9f0741a0e3588fc96475986eb1bf2ad2bdc6e21aba5b8", + "present": true, + "actual_sha256": "8733885c77ceae35f3c9f0741a0e3588fc96475986eb1bf2ad2bdc6e21aba5b8", + "sha256_matches": true, + "bytes": 1622920 + }, + { + "name": "Station_G2_logging_repeater-full-logging-ota-v1.17.1.7-halo-keymind-cascade-dev-af73d05f.capabilities.json", + "expected_sha256": "d117052d3f549b134dd16b00109efd484bf1450454dfaa6f5c6ff5a6a4efbfc5", + "present": true, + "actual_sha256": "d117052d3f549b134dd16b00109efd484bf1450454dfaa6f5c6ff5a6a4efbfc5", + "sha256_matches": true, + "bytes": 1970 + } + ] + }, + { + "report": ".releases/esp32-lora-audit/ThinkNode_M2_Repeater-full-logging-ota-v1.17.1.7-test-9e48f516.memory.json", + "report_sha256": "0ed9e60c182c27016e6ed1fbdc9a81ee8aa15cca1e9ee83c7c2a83e7c86dca4c", + "target": "ThinkNode_M2_Repeater", + "artifact_target": "ThinkNode_M2_Repeater", + "pio_environment": "ThinkNode_M2_Repeater", + "mcu": "esp32s3", + "elf_sha256": "fdef2f7d5f4e42284a0692aa069fc9c7c2aef127b9a4a5ca1f41bbcd1eedf26a", + "passed": true, + "available_internal_bytes": 245208, + "required_heap_bytes": 144304, + "largest_internal_region_bytes": 212440, + "required_contiguous_bytes": 12616, + "heap_budget_margin_bytes": 100904, + "contiguous_budget_margin_bytes": 199824, + "scope_of_audit": "Historical report and available artifact hash/length verification; no current-head rebuild or ELF requalification.", + "artifacts": [ + { + "name": "ThinkNode_M2_Repeater-full-logging-ota-v1.17.1.7-test-9e48f516.bin", + "expected_sha256": "f5ebb18cfca31bb19cb5d557e69eeadabfaee8fdea740dfe79b2e98c54c4f9bc", + "present": true, + "actual_sha256": "f5ebb18cfca31bb19cb5d557e69eeadabfaee8fdea740dfe79b2e98c54c4f9bc", + "sha256_matches": true, + "bytes": 1579720 + }, + { + "name": "ThinkNode_M2_Repeater-full-logging-ota-v1.17.1.7-test-9e48f516-merged.bin", + "expected_sha256": "e39067e27202ce2ad10833438a91f72a78668f198817bf06084f2b1b1466e023", + "present": true, + "actual_sha256": "e39067e27202ce2ad10833438a91f72a78668f198817bf06084f2b1b1466e023", + "sha256_matches": true, + "bytes": 1645256 + }, + { + "name": "ThinkNode_M2_Repeater-full-logging-ota-v1.17.1.7-test-9e48f516.capabilities.json", + "expected_sha256": "cf5b8834f40c58c893eeb8f66f0ea7c3ce775b4ee96652608400c459d4485b50", + "present": true, + "actual_sha256": "cf5b8834f40c58c893eeb8f66f0ea7c3ce775b4ee96652608400c459d4485b50", + "sha256_matches": true, + "bytes": 1952 + } + ] + }, + { + "report": ".releases/esp32-migration-audit-4mb/builds/ThinkNode_M2_Repeater-full-logging-ota-v1.17.1.7-halo-keymind-cascade-dev-af73d05f.memory.json", + "report_sha256": "9082d248292c4541d1d14adc950e4f420117ee938ef1e4e71a3f4ad422159334", + "target": "ThinkNode_M2_Repeater", + "artifact_target": "ThinkNode_M2_Repeater", + "pio_environment": "ThinkNode_M2_Repeater", + "mcu": "esp32s3", + "elf_sha256": "ce967eb1a670165b2ec9e1b24782a3e923354bcc4aefc940d00366e1d858b72c", + "passed": true, + "available_internal_bytes": 245208, + "required_heap_bytes": 144304, + "largest_internal_region_bytes": 212440, + "required_contiguous_bytes": 12616, + "heap_budget_margin_bytes": 100904, + "contiguous_budget_margin_bytes": 199824, + "scope_of_audit": "Historical report and available artifact hash/length verification; no current-head rebuild or ELF requalification.", + "artifacts": [ + { + "name": "ThinkNode_M2_Repeater-full-logging-ota-v1.17.1.7-halo-keymind-cascade-dev-af73d05f.bin", + "expected_sha256": "7e02994e6002ca4e8f635580a1e867e756b01192dce02607d8c0d227c7089b18", + "present": true, + "actual_sha256": "7e02994e6002ca4e8f635580a1e867e756b01192dce02607d8c0d227c7089b18", + "sha256_matches": true, + "bytes": 1578248 + }, + { + "name": "ThinkNode_M2_Repeater-full-logging-ota-v1.17.1.7-halo-keymind-cascade-dev-af73d05f-merged.bin", + "expected_sha256": "2ba17ea99d62db95b2ee31756cc3fbad1c67906695d5d9616a7a8e32fdce78e5", + "present": true, + "actual_sha256": "2ba17ea99d62db95b2ee31756cc3fbad1c67906695d5d9616a7a8e32fdce78e5", + "sha256_matches": true, + "bytes": 1643784 + }, + { + "name": "ThinkNode_M2_Repeater-full-logging-ota-v1.17.1.7-halo-keymind-cascade-dev-af73d05f.capabilities.json", + "expected_sha256": "83f1d85ee7ebeba76da2a12db1675488de2e77830386a91c809daaf5395a01be", + "present": true, + "actual_sha256": "83f1d85ee7ebeba76da2a12db1675488de2e77830386a91c809daaf5395a01be", + "sha256_matches": true, + "bytes": 1952 + } + ] + }, + { + "report": ".releases/esp32-migration-audit-4mb/builds/ThinkNode_M2_room_server-full-logging-ota-v1.17.1.7-halo-keymind-cascade-dev-af73d05f.memory.json", + "report_sha256": "197bd43bf108464c6eebac249958286a06ca889424dbda59a72c94fc6c1e4381", + "target": "ThinkNode_M2_room_server", + "artifact_target": "ThinkNode_M2_room_server", + "pio_environment": "ThinkNode_M2_room_server", + "mcu": "esp32s3", + "elf_sha256": "d84887c59af7501d1a2a2ddb41beb6bfdc0f2fae196a966e45cac79ac24cca0e", + "passed": true, + "available_internal_bytes": 272432, + "required_heap_bytes": 137904, + "largest_internal_region_bytes": 239664, + "required_contiguous_bytes": 10256, + "heap_budget_margin_bytes": 134528, + "contiguous_budget_margin_bytes": 229408, + "scope_of_audit": "Historical report and available artifact hash/length verification; no current-head rebuild or ELF requalification.", + "artifacts": [ + { + "name": "ThinkNode_M2_room_server-full-logging-ota-v1.17.1.7-halo-keymind-cascade-dev-af73d05f.bin", + "expected_sha256": "0ed0b34bc8f5c5e6ffe24b731ee771d8d4421a8ad91f7e1004cddc996c1c43d1", + "present": true, + "actual_sha256": "0ed0b34bc8f5c5e6ffe24b731ee771d8d4421a8ad91f7e1004cddc996c1c43d1", + "sha256_matches": true, + "bytes": 1516312 + }, + { + "name": "ThinkNode_M2_room_server-full-logging-ota-v1.17.1.7-halo-keymind-cascade-dev-af73d05f-merged.bin", + "expected_sha256": "bac9c825d5d49c14ba8f62c4eb11abe9a1e89b92c739561b0da0db8c83a183ee", + "present": true, + "actual_sha256": "bac9c825d5d49c14ba8f62c4eb11abe9a1e89b92c739561b0da0db8c83a183ee", + "sha256_matches": true, + "bytes": 1581848 + }, + { + "name": "ThinkNode_M2_room_server-full-logging-ota-v1.17.1.7-halo-keymind-cascade-dev-af73d05f.capabilities.json", + "expected_sha256": "ea8e5276116687b891d41a3b46e790a3a282eafdf9b83cc38ad4fff9a09fcd37", + "present": true, + "actual_sha256": "ea8e5276116687b891d41a3b46e790a3a282eafdf9b83cc38ad4fff9a09fcd37", + "sha256_matches": true, + "bytes": 2136 + } + ] + }, + { + "report": ".releases/esp32-expanded-6976877f/builds/Xiao_S3_WIO_repeater-full-usb-wifi-ota-v1.17.1.7-halo-keymind-cascade-dev-6976877f.memory.json", + "report_sha256": "d69e3da2c5ea7825056b3c3c279cc29d1f1fb707aa90e4fe1a81f6b52d72324b", + "target": "Xiao_S3_WIO_repeater", + "artifact_target": "Xiao_S3_WIO_repeater", + "pio_environment": "Xiao_S3_WIO_repeater_observer_mqtt", + "mcu": "esp32s3", + "elf_sha256": "7c3f82f36e0e71d066ff2aca3209f4a217aa677bf4d80fc1c886b086c603eff4", + "passed": true, + "available_internal_bytes": 189088, + "required_heap_bytes": 158640, + "largest_internal_region_bytes": 156320, + "required_contiguous_bytes": 12616, + "heap_budget_margin_bytes": 30448, + "contiguous_budget_margin_bytes": 143704, + "scope_of_audit": "Historical report and available artifact hash/length verification; no current-head rebuild or ELF requalification.", + "artifacts": [ + { + "name": "Xiao_S3_WIO_repeater-full-usb-wifi-ota-v1.17.1.7-halo-keymind-cascade-dev-6976877f.bin", + "expected_sha256": "55f5e27c83fb85d533e641d826772a5d1107d4fae5e2af465f2b90a462991662", + "present": true, + "actual_sha256": "55f5e27c83fb85d533e641d826772a5d1107d4fae5e2af465f2b90a462991662", + "sha256_matches": true, + "bytes": 1963256 + }, + { + "name": "Xiao_S3_WIO_repeater-full-usb-wifi-ota-v1.17.1.7-halo-keymind-cascade-dev-6976877f-merged.bin", + "expected_sha256": "5406983c44852e48b8dd7b60211d746cef1c917aa1f65051d191bc89cc69ac43", + "present": true, + "actual_sha256": "5406983c44852e48b8dd7b60211d746cef1c917aa1f65051d191bc89cc69ac43", + "sha256_matches": true, + "bytes": 2028792 + }, + { + "name": "Xiao_S3_WIO_repeater-full-usb-wifi-ota-v1.17.1.7-halo-keymind-cascade-dev-6976877f.capabilities.json", + "expected_sha256": "91342f3180dc5c04abc3f36a3227352b9c0e004f23363fe11dc8de1d339943d3", + "present": true, + "actual_sha256": "91342f3180dc5c04abc3f36a3227352b9c0e004f23363fe11dc8de1d339943d3", + "sha256_matches": true, + "bytes": 2180 + } + ] + }, + { + "report": ".releases/esp32-expanded-9f3977bc/builds/Xiao_S3_WIO_repeater-full-usb-wifi-ota-v1.17.1.7-halo-keymind-cascade-dev-9f3977bc.memory.json", + "report_sha256": "9f60d0fb90043dbf6ccb8c6f4cd3551799795821b8eaa41532a512f6e6f25b48", + "target": "Xiao_S3_WIO_repeater", + "artifact_target": "Xiao_S3_WIO_repeater", + "pio_environment": "Xiao_S3_WIO_repeater_observer_mqtt", + "mcu": "esp32s3", + "elf_sha256": "4db271985ebcdc4d41b338cdb2f5255d9fa5d344d6663506d0d2ab91d273f3b2", + "passed": true, + "available_internal_bytes": 189088, + "required_heap_bytes": 158640, + "largest_internal_region_bytes": 156320, + "required_contiguous_bytes": 12616, + "heap_budget_margin_bytes": 30448, + "contiguous_budget_margin_bytes": 143704, + "scope_of_audit": "Historical report and available artifact hash/length verification; no current-head rebuild or ELF requalification.", + "artifacts": [ + { + "name": "Xiao_S3_WIO_repeater-full-usb-wifi-ota-v1.17.1.7-halo-keymind-cascade-dev-9f3977bc.bin", + "expected_sha256": "0935f7b396ab37ee109ee51afc46106cb4e3f511168c2411355aae2dc2c3f454", + "present": true, + "actual_sha256": "0935f7b396ab37ee109ee51afc46106cb4e3f511168c2411355aae2dc2c3f454", + "sha256_matches": true, + "bytes": 1963256 + }, + { + "name": "Xiao_S3_WIO_repeater-full-usb-wifi-ota-v1.17.1.7-halo-keymind-cascade-dev-9f3977bc-merged.bin", + "expected_sha256": "69b1242e6839f5c620b6ca2ee3361cdf253f9f2e5b0c767e60c113c68e378bf5", + "present": true, + "actual_sha256": "69b1242e6839f5c620b6ca2ee3361cdf253f9f2e5b0c767e60c113c68e378bf5", + "sha256_matches": true, + "bytes": 2028792 + }, + { + "name": "Xiao_S3_WIO_repeater-full-usb-wifi-ota-v1.17.1.7-halo-keymind-cascade-dev-9f3977bc.capabilities.json", + "expected_sha256": "91342f3180dc5c04abc3f36a3227352b9c0e004f23363fe11dc8de1d339943d3", + "present": true, + "actual_sha256": "91342f3180dc5c04abc3f36a3227352b9c0e004f23363fe11dc8de1d339943d3", + "sha256_matches": true, + "bytes": 2180 + } + ] + }, + { + "report": ".releases/esp32-expanded-af73d05f/builds/Xiao_S3_WIO_repeater-full-usb-wifi-ota-v1.17.1.7-halo-keymind-cascade-dev-af73d05f.memory.json", + "report_sha256": "1ebf9313706f234929ecc425b7ff9ed7ce75c6c4d2891d8eadd490a08b527705", + "target": "Xiao_S3_WIO_repeater", + "artifact_target": "Xiao_S3_WIO_repeater", + "pio_environment": "Xiao_S3_WIO_repeater_observer_mqtt", + "mcu": "esp32s3", + "elf_sha256": "233d8a7dde371e6a4dc0bfda949dfd8545c4a509794dd8b478d2f88fd284e4ab", + "passed": true, + "available_internal_bytes": 189088, + "required_heap_bytes": 158640, + "largest_internal_region_bytes": 156320, + "required_contiguous_bytes": 12616, + "heap_budget_margin_bytes": 30448, + "contiguous_budget_margin_bytes": 143704, + "scope_of_audit": "Historical report and available artifact hash/length verification; no current-head rebuild or ELF requalification.", + "artifacts": [ + { + "name": "Xiao_S3_WIO_repeater-full-usb-wifi-ota-v1.17.1.7-halo-keymind-cascade-dev-af73d05f.bin", + "expected_sha256": "ce16a673607bb0b2969775eddea93d25361e40883d112b4b14a35bbc58508e5a", + "present": true, + "actual_sha256": "ce16a673607bb0b2969775eddea93d25361e40883d112b4b14a35bbc58508e5a", + "sha256_matches": true, + "bytes": 1963256 + }, + { + "name": "Xiao_S3_WIO_repeater-full-usb-wifi-ota-v1.17.1.7-halo-keymind-cascade-dev-af73d05f-merged.bin", + "expected_sha256": "596744a77568baf688ad88bf7534ab1409c4a54e3edbd5c0ccbbac62b4b437e4", + "present": true, + "actual_sha256": "596744a77568baf688ad88bf7534ab1409c4a54e3edbd5c0ccbbac62b4b437e4", + "sha256_matches": true, + "bytes": 2028792 + }, + { + "name": "Xiao_S3_WIO_repeater-full-usb-wifi-ota-v1.17.1.7-halo-keymind-cascade-dev-af73d05f.capabilities.json", + "expected_sha256": "91342f3180dc5c04abc3f36a3227352b9c0e004f23363fe11dc8de1d339943d3", + "present": true, + "actual_sha256": "91342f3180dc5c04abc3f36a3227352b9c0e004f23363fe11dc8de1d339943d3", + "sha256_matches": true, + "bytes": 2180 + } + ] + }, + { + "report": ".releases/esp32-migration-audit-4mb/builds/Xiao_S3_WIO_sensor-full-logging-ota-v1.17.1.7-halo-keymind-cascade-dev-af73d05f.memory.json", + "report_sha256": "3ddc47318f3835e9580f2e540163e2d28684cf1359f0de1cb11b6392defb560e", + "target": "Xiao_S3_WIO_sensor", + "artifact_target": "Xiao_S3_WIO_sensor", + "pio_environment": "Xiao_S3_WIO_sensor", + "mcu": "esp32s3", + "elf_sha256": "7a461320d74e3d39324fa76af4ebd688eba88dda739d0316cb80bb0122d1f397", + "passed": true, + "available_internal_bytes": 278184, + "required_heap_bytes": 121448, + "largest_internal_region_bytes": 245416, + "required_contiguous_bytes": 10256, + "heap_budget_margin_bytes": 156736, + "contiguous_budget_margin_bytes": 235160, + "scope_of_audit": "Historical report and available artifact hash/length verification; no current-head rebuild or ELF requalification.", + "artifacts": [ + { + "name": "Xiao_S3_WIO_sensor-full-logging-ota-v1.17.1.7-halo-keymind-cascade-dev-af73d05f.bin", + "expected_sha256": "1cdb3e467b3a08213a6d6fc8d8467e309c938aac1661bcd42fd2d5a55673c630", + "present": true, + "actual_sha256": "1cdb3e467b3a08213a6d6fc8d8467e309c938aac1661bcd42fd2d5a55673c630", + "sha256_matches": true, + "bytes": 1405544 + }, + { + "name": "Xiao_S3_WIO_sensor-full-logging-ota-v1.17.1.7-halo-keymind-cascade-dev-af73d05f-merged.bin", + "expected_sha256": "e2a449ae3ffab393a572119bd3b8d9c4715c10e84548a5a2f3217aaafcc4ed72", + "present": true, + "actual_sha256": "e2a449ae3ffab393a572119bd3b8d9c4715c10e84548a5a2f3217aaafcc4ed72", + "sha256_matches": true, + "bytes": 1471080 + }, + { + "name": "Xiao_S3_WIO_sensor-full-logging-ota-v1.17.1.7-halo-keymind-cascade-dev-af73d05f.capabilities.json", + "expected_sha256": "3876ae700febc34890c3bc56587865b259c4bbc094e2704dff0e72072d4a6b89", + "present": true, + "actual_sha256": "3876ae700febc34890c3bc56587865b259c4bbc094e2704dff0e72072d4a6b89", + "sha256_matches": true, + "bytes": 1606 + } + ] + }, + { + "report": "docs/test-results/preview-1.17.1.8/heltec_v4_2_v4_3_companion_radio_full_femon-v1.17.1.8-halo-keymind-cascade-preview1-cab781f9a.memory.json", + "report_sha256": "b97ded0122941479a46929e5ae14c11c4b3bdda63f1119e3ba6d4c859df38c26", + "target": "heltec_v4_2_v4_3_companion_radio_full_femon", + "artifact_target": "heltec_v4_2_v4_3_companion_radio_full_femon", + "pio_environment": "heltec_v4_2_v4_3_companion_radio_full_femon", + "mcu": "esp32s3", + "elf_sha256": "225a3d11b2be308a3a8730f6d5e2599f8a31d9f653b6fca866a3b7e2c79719c7", + "passed": true, + "available_internal_bytes": 237048, + "required_heap_bytes": 177920, + "largest_internal_region_bytes": 204280, + "required_contiguous_bytes": 11008, + "heap_budget_margin_bytes": 59128, + "contiguous_budget_margin_bytes": 193272, + "scope_of_audit": "Historical report and available artifact hash/length verification; no current-head rebuild or ELF requalification.", + "artifacts": [ + { + "name": "heltec_v4_2_v4_3_companion_radio_full_femon-v1.17.1.8-halo-keymind-cascade-preview1-cab781f9a.bin", + "expected_sha256": "dcbdbeec7b369c8eabaaadb6072851d04cf30417ffe1ead5f4bea5e57c1ba950", + "present": false + }, + { + "name": "heltec_v4_2_v4_3_companion_radio_full_femon-v1.17.1.8-halo-keymind-cascade-preview1-cab781f9a-merged.bin", + "expected_sha256": "877884505324e32f5ac732c1cc346c5a4139204962560b9b413963e5402ee85c", + "present": false + }, + { + "name": "heltec_v4_2_v4_3_companion_radio_full_femon-v1.17.1.8-halo-keymind-cascade-preview1-cab781f9a.capabilities.json", + "expected_sha256": "d3cfdb5c8a98364e874354401ecfc3ec0a3900566c78051a24ab1e38e74d4cba", + "present": true, + "actual_sha256": "d3cfdb5c8a98364e874354401ecfc3ec0a3900566c78051a24ab1e38e74d4cba", + "sha256_matches": true, + "bytes": 4950 + } + ] + }, + { + "report": ".releases/esp32-expanded-6976877f/builds/heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.7-halo-keymind-cascade-dev-6976877f.memory.json", + "report_sha256": "1e9586410c2d9833ce26281169ba7ee994f5c6b1a4cc4fd3be53d38763d457cb", + "target": "heltec_v4_repeater", + "artifact_target": "heltec_v4_repeater", + "pio_environment": "heltec_v4_repeater_observer_mqtt", + "mcu": "esp32s3", + "elf_sha256": "be7ee977402b0701b78592cae8ab52bede208280e92b04a60b24c049b854fdbc", + "passed": true, + "available_internal_bytes": 188040, + "required_heap_bytes": 164784, + "largest_internal_region_bytes": 155272, + "required_contiguous_bytes": 12616, + "heap_budget_margin_bytes": 23256, + "contiguous_budget_margin_bytes": 142656, + "scope_of_audit": "Historical report and available artifact hash/length verification; no current-head rebuild or ELF requalification.", + "artifacts": [ + { + "name": "heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.7-halo-keymind-cascade-dev-6976877f.bin", + "expected_sha256": "006eeab0f73cac73542779de55575252907791e73afc2f2a1278a2e5c1817388", + "present": true, + "actual_sha256": "006eeab0f73cac73542779de55575252907791e73afc2f2a1278a2e5c1817388", + "sha256_matches": true, + "bytes": 2049976 + }, + { + "name": "heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.7-halo-keymind-cascade-dev-6976877f-merged.bin", + "expected_sha256": "19867a53a3f1d4b007c4bba672685487622d041d78d2bea4ff040981d5ae509b", + "present": true, + "actual_sha256": "19867a53a3f1d4b007c4bba672685487622d041d78d2bea4ff040981d5ae509b", + "sha256_matches": true, + "bytes": 2115512 + }, + { + "name": "heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.7-halo-keymind-cascade-dev-6976877f.capabilities.json", + "expected_sha256": "113223333763da5a9fef4070680dd1f5ec369776e8559fcedd3ff7802f515740", + "present": true, + "actual_sha256": "113223333763da5a9fef4070680dd1f5ec369776e8559fcedd3ff7802f515740", + "sha256_matches": true, + "bytes": 2174 + } + ] + }, + { + "report": ".releases/esp32-expanded-9f3977bc/builds/heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.7-halo-keymind-cascade-dev-9f3977bc.memory.json", + "report_sha256": "80e8146dd2309c4d3eeb855fe2f40641175fba7176b34ad6b90c6c8592a9fb0f", + "target": "heltec_v4_repeater", + "artifact_target": "heltec_v4_repeater", + "pio_environment": "heltec_v4_repeater_observer_mqtt", + "mcu": "esp32s3", + "elf_sha256": "ab5099ccbcfc7c4eefddeb4d9bf665641157df0fab96722deb7ec201880cd408", + "passed": true, + "available_internal_bytes": 188040, + "required_heap_bytes": 164784, + "largest_internal_region_bytes": 155272, + "required_contiguous_bytes": 12616, + "heap_budget_margin_bytes": 23256, + "contiguous_budget_margin_bytes": 142656, + "scope_of_audit": "Historical report and available artifact hash/length verification; no current-head rebuild or ELF requalification.", + "artifacts": [ + { + "name": "heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.7-halo-keymind-cascade-dev-9f3977bc.bin", + "expected_sha256": "9b0d7972eb50d9e27f81237157d6b62438fcd120ef1af78a67a4dd6c693b6c72", + "present": true, + "actual_sha256": "9b0d7972eb50d9e27f81237157d6b62438fcd120ef1af78a67a4dd6c693b6c72", + "sha256_matches": true, + "bytes": 2049976 + }, + { + "name": "heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.7-halo-keymind-cascade-dev-9f3977bc-merged.bin", + "expected_sha256": "d336dc2293fd9ab601ee9cda6349244de6956e531b9f5ad88839283580dff4e0", + "present": true, + "actual_sha256": "d336dc2293fd9ab601ee9cda6349244de6956e531b9f5ad88839283580dff4e0", + "sha256_matches": true, + "bytes": 2115512 + }, + { + "name": "heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.7-halo-keymind-cascade-dev-9f3977bc.capabilities.json", + "expected_sha256": "113223333763da5a9fef4070680dd1f5ec369776e8559fcedd3ff7802f515740", + "present": true, + "actual_sha256": "113223333763da5a9fef4070680dd1f5ec369776e8559fcedd3ff7802f515740", + "sha256_matches": true, + "bytes": 2174 + } + ] + }, + { + "report": ".releases/esp32-expanded-af73d05f/builds/heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.7-halo-keymind-cascade-dev-af73d05f.memory.json", + "report_sha256": "52a559df74dc3d74f7b287f41a81e8fd746a31213d1c69e8eb36cfac6790522b", + "target": "heltec_v4_repeater", + "artifact_target": "heltec_v4_repeater", + "pio_environment": "heltec_v4_repeater_observer_mqtt", + "mcu": "esp32s3", + "elf_sha256": "908b682beb349ac6582c15d1e394d1bffab84151033ac60d5efd784a43ebc20f", + "passed": true, + "available_internal_bytes": 188040, + "required_heap_bytes": 164784, + "largest_internal_region_bytes": 155272, + "required_contiguous_bytes": 12616, + "heap_budget_margin_bytes": 23256, + "contiguous_budget_margin_bytes": 142656, + "scope_of_audit": "Historical report and available artifact hash/length verification; no current-head rebuild or ELF requalification.", + "artifacts": [ + { + "name": "heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.7-halo-keymind-cascade-dev-af73d05f.bin", + "expected_sha256": "bf30ee8eb694fdd09d3df9e7056c5e9f6ac3706a566323ca83d738dd2266647f", + "present": true, + "actual_sha256": "bf30ee8eb694fdd09d3df9e7056c5e9f6ac3706a566323ca83d738dd2266647f", + "sha256_matches": true, + "bytes": 2049976 + }, + { + "name": "heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.7-halo-keymind-cascade-dev-af73d05f-merged.bin", + "expected_sha256": "4339e3cab0eb52788212acc414a5dc2964047bf87e8f0726a793927530b3ed57", + "present": true, + "actual_sha256": "4339e3cab0eb52788212acc414a5dc2964047bf87e8f0726a793927530b3ed57", + "sha256_matches": true, + "bytes": 2115512 + }, + { + "name": "heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.7-halo-keymind-cascade-dev-af73d05f.capabilities.json", + "expected_sha256": "113223333763da5a9fef4070680dd1f5ec369776e8559fcedd3ff7802f515740", + "present": true, + "actual_sha256": "113223333763da5a9fef4070680dd1f5ec369776e8559fcedd3ff7802f515740", + "sha256_matches": true, + "bytes": 2174 + } + ] + }, + { + "report": ".releases/esp32-expanded-f8a1e2ff/builds/heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.7-halo-keymind-cascade-dev-f8a1e2ff.memory.json", + "report_sha256": "eb2156bcdc2e38f62b6c33a876318ec72c6d6a20af3662385190eb73f83a6114", + "target": "heltec_v4_repeater", + "artifact_target": "heltec_v4_repeater", + "pio_environment": "heltec_v4_repeater_observer_mqtt", + "mcu": "esp32s3", + "elf_sha256": "b6d0e3400cf87ad006571090ac7bd95262e9245aff17ef2c7be38ef9aed3817f", + "passed": true, + "available_internal_bytes": 188040, + "required_heap_bytes": 164784, + "largest_internal_region_bytes": 155272, + "required_contiguous_bytes": 12616, + "heap_budget_margin_bytes": 23256, + "contiguous_budget_margin_bytes": 142656, + "scope_of_audit": "Historical report and available artifact hash/length verification; no current-head rebuild or ELF requalification.", + "artifacts": [ + { + "name": "heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.7-halo-keymind-cascade-dev-f8a1e2ff.bin", + "expected_sha256": "8961423804be296ed77a9d03a58df95b7d1df6bec72acd285e578fb930072f06", + "present": true, + "actual_sha256": "8961423804be296ed77a9d03a58df95b7d1df6bec72acd285e578fb930072f06", + "sha256_matches": true, + "bytes": 2049976 + }, + { + "name": "heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.7-halo-keymind-cascade-dev-f8a1e2ff-merged.bin", + "expected_sha256": "c8f5f4149c01630d823d9ec8827b896b9f2dac16e893b9b47fa9174d95d45808", + "present": true, + "actual_sha256": "c8f5f4149c01630d823d9ec8827b896b9f2dac16e893b9b47fa9174d95d45808", + "sha256_matches": true, + "bytes": 2115512 + }, + { + "name": "heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.7-halo-keymind-cascade-dev-f8a1e2ff.capabilities.json", + "expected_sha256": "113223333763da5a9fef4070680dd1f5ec369776e8559fcedd3ff7802f515740", + "present": true, + "actual_sha256": "113223333763da5a9fef4070680dd1f5ec369776e8559fcedd3ff7802f515740", + "sha256_matches": true, + "bytes": 2174 + } + ] + }, + { + "report": "docs/test-results/preview-1.17.1.8/heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.8-halo-keymind-cascade-preview1-cab781f9a.memory.json", + "report_sha256": "f056f551ebbfdc257ce61e58469f975b5eb801ebb6d6c0e243035b5720609c4a", + "target": "heltec_v4_repeater", + "artifact_target": "heltec_v4_repeater", + "pio_environment": "heltec_v4_repeater_observer_mqtt", + "mcu": "esp32s3", + "elf_sha256": "1c1b461e95b447d2b00287825618743cc33dd1e44ee332d2d343f9c14fd51697", + "passed": true, + "available_internal_bytes": 187728, + "required_heap_bytes": 164784, + "largest_internal_region_bytes": 154960, + "required_contiguous_bytes": 12616, + "heap_budget_margin_bytes": 22944, + "contiguous_budget_margin_bytes": 142344, + "scope_of_audit": "Historical report and available artifact hash/length verification; no current-head rebuild or ELF requalification.", + "artifacts": [ + { + "name": "heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.8-halo-keymind-cascade-preview1-cab781f9a.bin", + "expected_sha256": "11ed65664aceaac41086f76b4086ca78d97be96634be3fcdfe37f11ce8d60534", + "present": false + }, + { + "name": "heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.8-halo-keymind-cascade-preview1-cab781f9a-merged.bin", + "expected_sha256": "f9b1d9096ba637d06f9dda11dd586934e609b600a85913234e0dcfce406d9993", + "present": false + }, + { + "name": "heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.8-halo-keymind-cascade-preview1-cab781f9a.capabilities.json", + "expected_sha256": "113223333763da5a9fef4070680dd1f5ec369776e8559fcedd3ff7802f515740", + "present": true, + "actual_sha256": "113223333763da5a9fef4070680dd1f5ec369776e8559fcedd3ff7802f515740", + "sha256_matches": true, + "bytes": 2174 + } + ] + }, + { + "report": "out/v4-fix-2026-10-06-final-full/heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix2-8d31b393.memory.json", + "report_sha256": "d17f4ee32cc7cbd4b92eba9f44cfeb2796af1bcd12bed8514f24c6f97089e5a7", + "target": "heltec_v4_repeater", + "artifact_target": "heltec_v4_repeater", + "pio_environment": "heltec_v4_repeater_observer_mqtt", + "mcu": "esp32s3", + "elf_sha256": "05923168be7bc18a0595c521250cdc385d2671667491d5c86c1c2d83e9e2e3ab", + "passed": true, + "available_internal_bytes": 186696, + "required_heap_bytes": 165824, + "largest_internal_region_bytes": 153928, + "required_contiguous_bytes": 12616, + "heap_budget_margin_bytes": 20872, + "contiguous_budget_margin_bytes": 141312, + "scope_of_audit": "Historical report and available artifact hash/length verification; no current-head rebuild or ELF requalification.", + "artifacts": [ + { + "name": "heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix2-8d31b393.bin", + "expected_sha256": "e490c47cc573dcb60e0c80e314095af94ed834267fd0f20a475f680935cfee75", + "present": true, + "actual_sha256": "e490c47cc573dcb60e0c80e314095af94ed834267fd0f20a475f680935cfee75", + "sha256_matches": true, + "bytes": 2098184 + }, + { + "name": "heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix2-8d31b393-merged.bin", + "expected_sha256": "e6e2cd149ebe4888aa1f9ec98d7477c29e1f787c48f616a5460879c32499821c", + "present": true, + "actual_sha256": "e6e2cd149ebe4888aa1f9ec98d7477c29e1f787c48f616a5460879c32499821c", + "sha256_matches": true, + "bytes": 2163720 + }, + { + "name": "heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix2-8d31b393.capabilities.json", + "expected_sha256": "c35a0b5a26ae764ef56710746a6629e3905284b12815172234d91cfec1ab451b", + "present": true, + "actual_sha256": "c35a0b5a26ae764ef56710746a6629e3905284b12815172234d91cfec1ab451b", + "sha256_matches": true, + "bytes": 2456 + } + ] + }, + { + "report": "out/v4-fix-2026-10-06-full/heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix-8d31b393.memory.json", + "report_sha256": "00c04cd48b7a06808083d360cac3253709737b318cb27cc52a61f06b0a0d7f6f", + "target": "heltec_v4_repeater", + "artifact_target": "heltec_v4_repeater", + "pio_environment": "heltec_v4_repeater_observer_mqtt", + "mcu": "esp32s3", + "elf_sha256": "4929cfaecacfecb59c3e2b9938a217137dba86ce4b4afbaa629d01b8538a4c94", + "passed": true, + "available_internal_bytes": 186696, + "required_heap_bytes": 165824, + "largest_internal_region_bytes": 153928, + "required_contiguous_bytes": 12616, + "heap_budget_margin_bytes": 20872, + "contiguous_budget_margin_bytes": 141312, + "scope_of_audit": "Historical report and available artifact hash/length verification; no current-head rebuild or ELF requalification.", + "artifacts": [ + { + "name": "heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix-8d31b393.bin", + "expected_sha256": "c305b7bb575b0505d9bf83a636b88ed351b6464dd7abd41ad60999afc7c7ffef", + "present": true, + "actual_sha256": "c305b7bb575b0505d9bf83a636b88ed351b6464dd7abd41ad60999afc7c7ffef", + "sha256_matches": true, + "bytes": 2098136 + }, + { + "name": "heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix-8d31b393-merged.bin", + "expected_sha256": "2344bc3befe87a81609ddaa14535e2aeca30aaa160c66749538d2eadd93f62f2", + "present": true, + "actual_sha256": "2344bc3befe87a81609ddaa14535e2aeca30aaa160c66749538d2eadd93f62f2", + "sha256_matches": true, + "bytes": 2163672 + }, + { + "name": "heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix-8d31b393.capabilities.json", + "expected_sha256": "473dff28e4e0de80e475d2fc82b91c5f090dd6293fe0855d7166ba4b2b9645cf", + "present": true, + "actual_sha256": "473dff28e4e0de80e475d2fc82b91c5f090dd6293fe0855d7166ba4b2b9645cf", + "sha256_matches": true, + "bytes": 2456 + } + ] + }, + { + "report": "out/v4-fix-2026-10-06-scan-final-full/heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix6-8d31b393.memory.json", + "report_sha256": "1715957c1da274a86e6a29510c86cac52bfbc4c2aa6f284fc383d82b5214dcbb", + "target": "heltec_v4_repeater", + "artifact_target": "heltec_v4_repeater", + "pio_environment": "heltec_v4_repeater_observer_mqtt", + "mcu": "esp32s3", + "elf_sha256": "a7a9676b07092cdc5395bd6d15af44f77be0f8456426a4f91f31bceb938f1151", + "passed": true, + "available_internal_bytes": 186696, + "required_heap_bytes": 165824, + "largest_internal_region_bytes": 153928, + "required_contiguous_bytes": 12616, + "heap_budget_margin_bytes": 20872, + "contiguous_budget_margin_bytes": 141312, + "scope_of_audit": "Historical report and available artifact hash/length verification; no current-head rebuild or ELF requalification.", + "artifacts": [ + { + "name": "heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix6-8d31b393.bin", + "expected_sha256": "4f6ef749999863de8fd3016fa9bf5f4f8bf5d9891af9926cc4822a1d38ebd2d2", + "present": true, + "actual_sha256": "4f6ef749999863de8fd3016fa9bf5f4f8bf5d9891af9926cc4822a1d38ebd2d2", + "sha256_matches": true, + "bytes": 2098616 + }, + { + "name": "heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix6-8d31b393-merged.bin", + "expected_sha256": "868a1f243fafc9db949b1ae4f63ae83c740fefd93dc676ba1a0255896efe2c64", + "present": true, + "actual_sha256": "868a1f243fafc9db949b1ae4f63ae83c740fefd93dc676ba1a0255896efe2c64", + "sha256_matches": true, + "bytes": 2164152 + }, + { + "name": "heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix6-8d31b393.capabilities.json", + "expected_sha256": "e2e46d16342ba927f1c01bc3b4a8ab547d6c8afb3981175a0279cb26404edb6c", + "present": true, + "actual_sha256": "e2e46d16342ba927f1c01bc3b4a8ab547d6c8afb3981175a0279cb26404edb6c", + "sha256_matches": true, + "bytes": 2456 + } + ] + }, + { + "report": "out/v4-fix-2026-10-06-scan-first-full/heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix4-8d31b393.memory.json", + "report_sha256": "71530ba06dbf74cc5a4253dffd71c28a3559962e8f603804f9ffa2246f89db8d", + "target": "heltec_v4_repeater", + "artifact_target": "heltec_v4_repeater", + "pio_environment": "heltec_v4_repeater_observer_mqtt", + "mcu": "esp32s3", + "elf_sha256": "b702e40f97a682ab9dc81d606d32687b9ff6d673774b059532744e6a05de6b0f", + "passed": true, + "available_internal_bytes": 186696, + "required_heap_bytes": 165824, + "largest_internal_region_bytes": 153928, + "required_contiguous_bytes": 12616, + "heap_budget_margin_bytes": 20872, + "contiguous_budget_margin_bytes": 141312, + "scope_of_audit": "Historical report and available artifact hash/length verification; no current-head rebuild or ELF requalification.", + "artifacts": [ + { + "name": "heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix4-8d31b393.bin", + "expected_sha256": "961eaa63d027b90c08a27418af572e7e88e9e4ccadec120d0f053ecc482977e4", + "present": true, + "actual_sha256": "961eaa63d027b90c08a27418af572e7e88e9e4ccadec120d0f053ecc482977e4", + "sha256_matches": true, + "bytes": 2098456 + }, + { + "name": "heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix4-8d31b393-merged.bin", + "expected_sha256": "fde28850719b6717e95d573c42da92bf9e3adf16bdd3c959fe3d6d4c9ecb968e", + "present": true, + "actual_sha256": "fde28850719b6717e95d573c42da92bf9e3adf16bdd3c959fe3d6d4c9ecb968e", + "sha256_matches": true, + "bytes": 2163992 + }, + { + "name": "heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix4-8d31b393.capabilities.json", + "expected_sha256": "40973030165a12f8d3469159a199ccc030ab7f1558cc90921a46f984bcce299c", + "present": true, + "actual_sha256": "40973030165a12f8d3469159a199ccc030ab7f1558cc90921a46f984bcce299c", + "sha256_matches": true, + "bytes": 2456 + } + ] + }, + { + "report": "out/v4-fix-2026-10-06-scan-fixed-full/heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix8-8d31b393.memory.json", + "report_sha256": "acb2e89b22814e10c379e71ba544a064640f63e65783e022a3f4309ba6db3309", + "target": "heltec_v4_repeater", + "artifact_target": "heltec_v4_repeater", + "pio_environment": "heltec_v4_repeater_observer_mqtt", + "mcu": "esp32s3", + "elf_sha256": "0d1e76f7d25f4c6eb452dc1c520054e144a5b2c52badbe46895626ef132f0b83", + "passed": true, + "available_internal_bytes": 186696, + "required_heap_bytes": 165824, + "largest_internal_region_bytes": 153928, + "required_contiguous_bytes": 12616, + "heap_budget_margin_bytes": 20872, + "contiguous_budget_margin_bytes": 141312, + "scope_of_audit": "Historical report and available artifact hash/length verification; no current-head rebuild or ELF requalification.", + "artifacts": [ + { + "name": "heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix8-8d31b393.bin", + "expected_sha256": "d534c9d79796886fb84690c784ae985bfef6d808d5e7879409f139e9463f126d", + "present": true, + "actual_sha256": "d534c9d79796886fb84690c784ae985bfef6d808d5e7879409f139e9463f126d", + "sha256_matches": true, + "bytes": 2098744 + }, + { + "name": "heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix8-8d31b393-merged.bin", + "expected_sha256": "67cf1980e8cdba4bf7e8938d13d572e984ab903d100bbef85d0cfc96b35f175b", + "present": true, + "actual_sha256": "67cf1980e8cdba4bf7e8938d13d572e984ab903d100bbef85d0cfc96b35f175b", + "sha256_matches": true, + "bytes": 2164280 + }, + { + "name": "heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix8-8d31b393.capabilities.json", + "expected_sha256": "755fbe3ba5b4a72d1704f0a4ef4599bb86ff5bd645e53293988537f4aceac701", + "present": true, + "actual_sha256": "755fbe3ba5b4a72d1704f0a4ef4599bb86ff5bd645e53293988537f4aceac701", + "sha256_matches": true, + "bytes": 2456 + } + ] + }, + { + "report": "out/v4-fix-2026-10-06-scan-observed-full/heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix7-8d31b393.memory.json", + "report_sha256": "c29d9d4fe36f2aa29ec7783119ee9607d60851db0552f240427db226a04e5aab", + "target": "heltec_v4_repeater", + "artifact_target": "heltec_v4_repeater", + "pio_environment": "heltec_v4_repeater_observer_mqtt", + "mcu": "esp32s3", + "elf_sha256": "8fbc0dc151216e569a51a33791b32e1a71b56ca258f32fff7edd6f9702bbf525", + "passed": true, + "available_internal_bytes": 186696, + "required_heap_bytes": 165824, + "largest_internal_region_bytes": 153928, + "required_contiguous_bytes": 12616, + "heap_budget_margin_bytes": 20872, + "contiguous_budget_margin_bytes": 141312, + "scope_of_audit": "Historical report and available artifact hash/length verification; no current-head rebuild or ELF requalification.", + "artifacts": [ + { + "name": "heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix7-8d31b393.bin", + "expected_sha256": "b049d115fc5c7686d59583d8980a03715bc986b114088f4d9d4e3d88659cb16f", + "present": true, + "actual_sha256": "b049d115fc5c7686d59583d8980a03715bc986b114088f4d9d4e3d88659cb16f", + "sha256_matches": true, + "bytes": 2098728 + }, + { + "name": "heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix7-8d31b393-merged.bin", + "expected_sha256": "eb74c9c0c079db3b20cb1d3f5eeabf434f2c1ebfad6ff4c6f53b65602919713a", + "present": true, + "actual_sha256": "eb74c9c0c079db3b20cb1d3f5eeabf434f2c1ebfad6ff4c6f53b65602919713a", + "sha256_matches": true, + "bytes": 2164264 + }, + { + "name": "heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix7-8d31b393.capabilities.json", + "expected_sha256": "eaeb3c9e9a4c15526bf653f8eb6d40a867f174e3de131eec092b2a60dd31d683", + "present": true, + "actual_sha256": "eaeb3c9e9a4c15526bf653f8eb6d40a867f174e3de131eec092b2a60dd31d683", + "sha256_matches": true, + "bytes": 2456 + } + ] + }, + { + "report": "out/v4-fix-2026-10-06-scan-ready-full/heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix5-8d31b393.memory.json", + "report_sha256": "e6842c230fa6cef9de82d0fbef7a4a4b68dbe45fe0484c675ac9a6061976bea5", + "target": "heltec_v4_repeater", + "artifact_target": "heltec_v4_repeater", + "pio_environment": "heltec_v4_repeater_observer_mqtt", + "mcu": "esp32s3", + "elf_sha256": "e8a1332e14eb946c4f9adfaac9eeda2f477d5c4643cfa9bd99d8640cbb0c7c1b", + "passed": true, + "available_internal_bytes": 186696, + "required_heap_bytes": 165824, + "largest_internal_region_bytes": 153928, + "required_contiguous_bytes": 12616, + "heap_budget_margin_bytes": 20872, + "contiguous_budget_margin_bytes": 141312, + "scope_of_audit": "Historical report and available artifact hash/length verification; no current-head rebuild or ELF requalification.", + "artifacts": [ + { + "name": "heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix5-8d31b393.bin", + "expected_sha256": "3a46a231ff41c3d515b0f78e5c33271f517729272e135cfd24d0588807d98cdd", + "present": true, + "actual_sha256": "3a46a231ff41c3d515b0f78e5c33271f517729272e135cfd24d0588807d98cdd", + "sha256_matches": true, + "bytes": 2098488 + }, + { + "name": "heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix5-8d31b393-merged.bin", + "expected_sha256": "fe867829aabae24c1f5cfd75ce3fe301f27d0864b3b027763b7a2c6202a73ed0", + "present": true, + "actual_sha256": "fe867829aabae24c1f5cfd75ce3fe301f27d0864b3b027763b7a2c6202a73ed0", + "sha256_matches": true, + "bytes": 2164024 + }, + { + "name": "heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix5-8d31b393.capabilities.json", + "expected_sha256": "a96c79b53bd95e8f0c0273df6d81d659123bf7da399562353695e56c445e82fa", + "present": true, + "actual_sha256": "a96c79b53bd95e8f0c0273df6d81d659123bf7da399562353695e56c445e82fa", + "sha256_matches": true, + "bytes": 2456 + } + ] + }, + { + "report": "out/v4-fix-2026-10-06-verified-full/heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix3-8d31b393.memory.json", + "report_sha256": "e43a497cb9b7f317ed3ffaa44f0b6b043a6b4206a05aa05995d83e1ef1cf5806", + "target": "heltec_v4_repeater", + "artifact_target": "heltec_v4_repeater", + "pio_environment": "heltec_v4_repeater_observer_mqtt", + "mcu": "esp32s3", + "elf_sha256": "9c8a3d0728faa4b876fa9cd71e89410b28ae0f0607ef6be17b218f82bc418874", + "passed": true, + "available_internal_bytes": 186696, + "required_heap_bytes": 165824, + "largest_internal_region_bytes": 153928, + "required_contiguous_bytes": 12616, + "heap_budget_margin_bytes": 20872, + "contiguous_budget_margin_bytes": 141312, + "scope_of_audit": "Historical report and available artifact hash/length verification; no current-head rebuild or ELF requalification.", + "artifacts": [ + { + "name": "heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix3-8d31b393.bin", + "expected_sha256": "aaa85e049c49373d849f0ef3383e394d545f19badd9c377f2ed0bbec991160a0", + "present": true, + "actual_sha256": "aaa85e049c49373d849f0ef3383e394d545f19badd9c377f2ed0bbec991160a0", + "sha256_matches": true, + "bytes": 2098136 + }, + { + "name": "heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix3-8d31b393-merged.bin", + "expected_sha256": "d05f2833c4a197f1d82f2205ed9925028fee182c7e1d43ee2f4fe3c67dca0c16", + "present": true, + "actual_sha256": "d05f2833c4a197f1d82f2205ed9925028fee182c7e1d43ee2f4fe3c67dca0c16", + "sha256_matches": true, + "bytes": 2163672 + }, + { + "name": "heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix3-8d31b393.capabilities.json", + "expected_sha256": "9f091ed32fb88bde2a99fa289499ac9398a39cd78d5e8c7efebc4079c1164983", + "present": true, + "actual_sha256": "9f091ed32fb88bde2a99fa289499ac9398a39cd78d5e8c7efebc4079c1164983", + "sha256_matches": true, + "bytes": 2456 + } + ] + }, + { + "report": "out/v4-preview5/heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.9-preview5-efed592f.memory.json", + "report_sha256": "d8249c3f6fda5d44e709f76fa66f33fd4b1d41c8d58f1f65d6f6c8e266d8430f", + "target": "heltec_v4_repeater", + "artifact_target": "heltec_v4_repeater", + "pio_environment": "heltec_v4_repeater_observer_mqtt", + "mcu": "esp32s3", + "elf_sha256": "8349dfa0b4628ad49ea5cedbd3b6b1fcc8e4d87a25e1e55181a30ff7f52ef030", + "passed": true, + "available_internal_bytes": 186792, + "required_heap_bytes": 165824, + "largest_internal_region_bytes": 154024, + "required_contiguous_bytes": 12616, + "heap_budget_margin_bytes": 20968, + "contiguous_budget_margin_bytes": 141408, + "scope_of_audit": "Historical report and available artifact hash/length verification; no current-head rebuild or ELF requalification.", + "artifacts": [ + { + "name": "heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.9-preview5-efed592f.bin", + "expected_sha256": "f2ade654867695ce0df30d4c71193ac506b62c202a68f226ce5c17bdafe008e2", + "present": true, + "actual_sha256": "f2ade654867695ce0df30d4c71193ac506b62c202a68f226ce5c17bdafe008e2", + "sha256_matches": true, + "bytes": 2090840 + }, + { + "name": "heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.9-preview5-efed592f-merged.bin", + "expected_sha256": "eb2074428e2f456d40439bd68878bdf8c4970ff2164355792b5df0ae7f6132b2", + "present": true, + "actual_sha256": "eb2074428e2f456d40439bd68878bdf8c4970ff2164355792b5df0ae7f6132b2", + "sha256_matches": true, + "bytes": 2156376 + }, + { + "name": "heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.9-preview5-efed592f.capabilities.json", + "expected_sha256": "247f85f3031b7ab8220bbaf27fcce4a4e9781634deae179b5a8b583c61e0e572", + "present": true, + "actual_sha256": "247f85f3031b7ab8220bbaf27fcce4a4e9781634deae179b5a8b583c61e0e572", + "sha256_matches": true, + "bytes": 2305 + } + ] + }, + { + "report": "out/v4-regression-2026-10-06-full/heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.9-halo-keymind-cascade-dev-8d31b393.memory.json", + "report_sha256": "83846fccbf2bb3c36f1622fc9513717e069e1f4b3cf2d34aa5668b488576a6ca", + "target": "heltec_v4_repeater", + "artifact_target": "heltec_v4_repeater", + "pio_environment": "heltec_v4_repeater_observer_mqtt", + "mcu": "esp32s3", + "elf_sha256": "0da1b0450e1acd0f13cb0b68494b459bf7b869ff79cef6861454b65682bf11d1", + "passed": true, + "available_internal_bytes": 186696, + "required_heap_bytes": 165824, + "largest_internal_region_bytes": 153928, + "required_contiguous_bytes": 12616, + "heap_budget_margin_bytes": 20872, + "contiguous_budget_margin_bytes": 141312, + "scope_of_audit": "Historical report and available artifact hash/length verification; no current-head rebuild or ELF requalification.", + "artifacts": [ + { + "name": "heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.9-halo-keymind-cascade-dev-8d31b393.bin", + "expected_sha256": "ad2489805d1390f7bfb7a97fc3408fd41333f84fe0bef14f4abe0e2524d5030d", + "present": true, + "actual_sha256": "ad2489805d1390f7bfb7a97fc3408fd41333f84fe0bef14f4abe0e2524d5030d", + "sha256_matches": true, + "bytes": 2097672 + }, + { + "name": "heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.9-halo-keymind-cascade-dev-8d31b393-merged.bin", + "expected_sha256": "d8b03b0601d8e1fe941377059b93bec880eb90946936954dd852efae708311e0", + "present": true, + "actual_sha256": "d8b03b0601d8e1fe941377059b93bec880eb90946936954dd852efae708311e0", + "sha256_matches": true, + "bytes": 2163208 + }, + { + "name": "heltec_v4_repeater-full-usb-wifi-ota-v1.17.1.9-halo-keymind-cascade-dev-8d31b393.capabilities.json", + "expected_sha256": "22aa6b834e01b091b03522fc844ddfd16b756498e8954a7866005fb4fd96d09d", + "present": true, + "actual_sha256": "22aa6b834e01b091b03522fc844ddfd16b756498e8954a7866005fb4fd96d09d", + "sha256_matches": true, + "bytes": 2456 + } + ] + }, + { + "report": "out/v4-fix-2026-10-06-final-minimal/heltec_v4_repeater_lora_ota_no_external_sensors-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix2-8d31b393.memory.json", + "report_sha256": "a45ca6c67eb4a88a106b24c87224661eeceb9d02351966f2e6b18b038dc7dfd5", + "target": "heltec_v4_repeater_lora_ota_no_external_sensors", + "artifact_target": "heltec_v4_repeater_lora_ota_no_external_sensors", + "pio_environment": "heltec_v4_repeater", + "mcu": "esp32s3", + "elf_sha256": "cd920a89d0f1b8478b073786ca372ef2dea64d1234a4d1dee9423c0682405d51", + "passed": true, + "available_internal_bytes": 241848, + "required_heap_bytes": 90048, + "largest_internal_region_bytes": 209080, + "required_contiguous_bytes": 12616, + "heap_budget_margin_bytes": 151800, + "contiguous_budget_margin_bytes": 196464, + "scope_of_audit": "Historical report and available artifact hash/length verification; no current-head rebuild or ELF requalification.", + "artifacts": [ + { + "name": "heltec_v4_repeater_lora_ota_no_external_sensors-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix2-8d31b393.bin", + "expected_sha256": "726f9853208ce99c0c00ee249d573a5b231c8e8d794d55dbd2646b3a69de9f00", + "present": true, + "actual_sha256": "726f9853208ce99c0c00ee249d573a5b231c8e8d794d55dbd2646b3a69de9f00", + "sha256_matches": true, + "bytes": 1281576 + }, + { + "name": "heltec_v4_repeater_lora_ota_no_external_sensors-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix2-8d31b393-merged.bin", + "expected_sha256": "9197bf95d5297ff9990ecb3745fea96db66f54bcffbdda27e81b6c7e7215b4d6", + "present": true, + "actual_sha256": "9197bf95d5297ff9990ecb3745fea96db66f54bcffbdda27e81b6c7e7215b4d6", + "sha256_matches": true, + "bytes": 1347112 + }, + { + "name": "heltec_v4_repeater_lora_ota_no_external_sensors-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix2-8d31b393.capabilities.json", + "expected_sha256": "e004e777d486999754a7eecb01f6269fc62398e4b64bfa14eef2caff9f06b530", + "present": true, + "actual_sha256": "e004e777d486999754a7eecb01f6269fc62398e4b64bfa14eef2caff9f06b530", + "sha256_matches": true, + "bytes": 1937 + } + ] + }, + { + "report": "out/v4-fix-2026-10-06-minimal/heltec_v4_repeater_lora_ota_no_external_sensors-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix-8d31b393.memory.json", + "report_sha256": "2f8d75c05206559fbb95dd2869c2d000a6cd58b9f1649ebc081e9e71ca2e1282", + "target": "heltec_v4_repeater_lora_ota_no_external_sensors", + "artifact_target": "heltec_v4_repeater_lora_ota_no_external_sensors", + "pio_environment": "heltec_v4_repeater", + "mcu": "esp32s3", + "elf_sha256": "1b842bb75411c1e9fac8e0e3ae69579baf5bdb5cfff2bea1b8621018093a31ea", + "passed": true, + "available_internal_bytes": 241848, + "required_heap_bytes": 90048, + "largest_internal_region_bytes": 209080, + "required_contiguous_bytes": 12616, + "heap_budget_margin_bytes": 151800, + "contiguous_budget_margin_bytes": 196464, + "scope_of_audit": "Historical report and available artifact hash/length verification; no current-head rebuild or ELF requalification.", + "artifacts": [ + { + "name": "heltec_v4_repeater_lora_ota_no_external_sensors-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix-8d31b393.bin", + "expected_sha256": "7a388cab4b17bfdd71039ece5f81950b5b0333d75852e33a6f94ea4311103de3", + "present": true, + "actual_sha256": "7a388cab4b17bfdd71039ece5f81950b5b0333d75852e33a6f94ea4311103de3", + "sha256_matches": true, + "bytes": 1281576 + }, + { + "name": "heltec_v4_repeater_lora_ota_no_external_sensors-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix-8d31b393-merged.bin", + "expected_sha256": "10f3e6d7643989983584d25b9f0e5aa2805fcf9e6544a15253b1bd46f20dec16", + "present": true, + "actual_sha256": "10f3e6d7643989983584d25b9f0e5aa2805fcf9e6544a15253b1bd46f20dec16", + "sha256_matches": true, + "bytes": 1347112 + }, + { + "name": "heltec_v4_repeater_lora_ota_no_external_sensors-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix-8d31b393.capabilities.json", + "expected_sha256": "1a01f35f0da1b02c2072ebd1c7a38bf2eb51f5385962d3aa627d351ea495b6b7", + "present": true, + "actual_sha256": "1a01f35f0da1b02c2072ebd1c7a38bf2eb51f5385962d3aa627d351ea495b6b7", + "sha256_matches": true, + "bytes": 1937 + } + ] + }, + { + "report": "out/v4-fix-2026-10-06-scan-final-minimal/heltec_v4_repeater_lora_ota_no_external_sensors-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix6-8d31b393.memory.json", + "report_sha256": "d3d1cdaf74d6b9ac7e3199923142ff2568da98fde279455fbf3b26a328c78c5e", + "target": "heltec_v4_repeater_lora_ota_no_external_sensors", + "artifact_target": "heltec_v4_repeater_lora_ota_no_external_sensors", + "pio_environment": "heltec_v4_repeater", + "mcu": "esp32s3", + "elf_sha256": "674799fee074cf11cf5bcdd9cf0040df0473251abfa188bd84461609b12057b2", + "passed": true, + "available_internal_bytes": 241848, + "required_heap_bytes": 90048, + "largest_internal_region_bytes": 209080, + "required_contiguous_bytes": 12616, + "heap_budget_margin_bytes": 151800, + "contiguous_budget_margin_bytes": 196464, + "scope_of_audit": "Historical report and available artifact hash/length verification; no current-head rebuild or ELF requalification.", + "artifacts": [ + { + "name": "heltec_v4_repeater_lora_ota_no_external_sensors-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix6-8d31b393.bin", + "expected_sha256": "361a3dcd5e9db3382816844fcbb3d5a029fa6a3825e826858957d15dc484947e", + "present": true, + "actual_sha256": "361a3dcd5e9db3382816844fcbb3d5a029fa6a3825e826858957d15dc484947e", + "sha256_matches": true, + "bytes": 1281576 + }, + { + "name": "heltec_v4_repeater_lora_ota_no_external_sensors-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix6-8d31b393-merged.bin", + "expected_sha256": "b52677e2515edeeaafc8379c9e9758ec382f31a5d8f4c59b5995ef5ae4910591", + "present": true, + "actual_sha256": "b52677e2515edeeaafc8379c9e9758ec382f31a5d8f4c59b5995ef5ae4910591", + "sha256_matches": true, + "bytes": 1347112 + }, + { + "name": "heltec_v4_repeater_lora_ota_no_external_sensors-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix6-8d31b393.capabilities.json", + "expected_sha256": "8f325a6fb0d1a661d316df765aac5351e1284d6c4a8ec035aee9445cfec1b739", + "present": true, + "actual_sha256": "8f325a6fb0d1a661d316df765aac5351e1284d6c4a8ec035aee9445cfec1b739", + "sha256_matches": true, + "bytes": 1937 + } + ] + }, + { + "report": "out/v4-fix-2026-10-06-scan-first-minimal/heltec_v4_repeater_lora_ota_no_external_sensors-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix4-8d31b393.memory.json", + "report_sha256": "4124eaa1855eae281ab116b297a2a16b49484961d2d3a5ba0d419d71c22e9fda", + "target": "heltec_v4_repeater_lora_ota_no_external_sensors", + "artifact_target": "heltec_v4_repeater_lora_ota_no_external_sensors", + "pio_environment": "heltec_v4_repeater", + "mcu": "esp32s3", + "elf_sha256": "cc218e7a2779743c5e3b863ced889721001fb14261486f0185b5f362a306757f", + "passed": true, + "available_internal_bytes": 241848, + "required_heap_bytes": 90048, + "largest_internal_region_bytes": 209080, + "required_contiguous_bytes": 12616, + "heap_budget_margin_bytes": 151800, + "contiguous_budget_margin_bytes": 196464, + "scope_of_audit": "Historical report and available artifact hash/length verification; no current-head rebuild or ELF requalification.", + "artifacts": [ + { + "name": "heltec_v4_repeater_lora_ota_no_external_sensors-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix4-8d31b393.bin", + "expected_sha256": "a5135789506c45fd4edeb858978306c67813e0be5d2445db26fa63907bbecc00", + "present": true, + "actual_sha256": "a5135789506c45fd4edeb858978306c67813e0be5d2445db26fa63907bbecc00", + "sha256_matches": true, + "bytes": 1281576 + }, + { + "name": "heltec_v4_repeater_lora_ota_no_external_sensors-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix4-8d31b393-merged.bin", + "expected_sha256": "16a787f21c8bcc1d21b46ab0fdedae1663036ada9e0ae50df5b3b8cec312242e", + "present": true, + "actual_sha256": "16a787f21c8bcc1d21b46ab0fdedae1663036ada9e0ae50df5b3b8cec312242e", + "sha256_matches": true, + "bytes": 1347112 + }, + { + "name": "heltec_v4_repeater_lora_ota_no_external_sensors-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix4-8d31b393.capabilities.json", + "expected_sha256": "e98e93529842f976b8c5f9e2832f11b0963ca346a2f5b1afdd90063b5c1a994d", + "present": true, + "actual_sha256": "e98e93529842f976b8c5f9e2832f11b0963ca346a2f5b1afdd90063b5c1a994d", + "sha256_matches": true, + "bytes": 1937 + } + ] + }, + { + "report": "out/v4-fix-2026-10-06-scan-fixed-minimal/heltec_v4_repeater_lora_ota_no_external_sensors-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix8-8d31b393.memory.json", + "report_sha256": "4271e5358ff6b70a0cf49ac9db1fd106aa6c154598e187c4ed0ec3d1b0ac0352", + "target": "heltec_v4_repeater_lora_ota_no_external_sensors", + "artifact_target": "heltec_v4_repeater_lora_ota_no_external_sensors", + "pio_environment": "heltec_v4_repeater", + "mcu": "esp32s3", + "elf_sha256": "2ce957ab8e1fcbbf90a4c077fddcec33436032fa08df8cf3b747a2ff84318388", + "passed": true, + "available_internal_bytes": 241848, + "required_heap_bytes": 90048, + "largest_internal_region_bytes": 209080, + "required_contiguous_bytes": 12616, + "heap_budget_margin_bytes": 151800, + "contiguous_budget_margin_bytes": 196464, + "scope_of_audit": "Historical report and available artifact hash/length verification; no current-head rebuild or ELF requalification.", + "artifacts": [ + { + "name": "heltec_v4_repeater_lora_ota_no_external_sensors-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix8-8d31b393.bin", + "expected_sha256": "4f0d55aa3c0c85e76c50a2ba60738294515552dafa5e9496d6a33d73f1072e27", + "present": true, + "actual_sha256": "4f0d55aa3c0c85e76c50a2ba60738294515552dafa5e9496d6a33d73f1072e27", + "sha256_matches": true, + "bytes": 1281576 + }, + { + "name": "heltec_v4_repeater_lora_ota_no_external_sensors-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix8-8d31b393-merged.bin", + "expected_sha256": "b284da77bd27d732a4d4514ed4b19644db36137aec797109b59f5ff1b1b5a811", + "present": true, + "actual_sha256": "b284da77bd27d732a4d4514ed4b19644db36137aec797109b59f5ff1b1b5a811", + "sha256_matches": true, + "bytes": 1347112 + }, + { + "name": "heltec_v4_repeater_lora_ota_no_external_sensors-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix8-8d31b393.capabilities.json", + "expected_sha256": "059747f5d1a32917fa6deea303119d4fc8a9ba6231184f434d990371e935f1fe", + "present": true, + "actual_sha256": "059747f5d1a32917fa6deea303119d4fc8a9ba6231184f434d990371e935f1fe", + "sha256_matches": true, + "bytes": 1937 + } + ] + }, + { + "report": "out/v4-fix-2026-10-06-scan-observed-minimal/heltec_v4_repeater_lora_ota_no_external_sensors-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix7-8d31b393.memory.json", + "report_sha256": "ba01a2124a8395f4f23ac3d4c358ee3ec2f9767fc58d8d4917d02c8f5be86ccd", + "target": "heltec_v4_repeater_lora_ota_no_external_sensors", + "artifact_target": "heltec_v4_repeater_lora_ota_no_external_sensors", + "pio_environment": "heltec_v4_repeater", + "mcu": "esp32s3", + "elf_sha256": "95e0b3fb9d7197c92d39f023ec5b688a9cba73f0f910ad2f50e4ebabf52a78c8", + "passed": true, + "available_internal_bytes": 241848, + "required_heap_bytes": 90048, + "largest_internal_region_bytes": 209080, + "required_contiguous_bytes": 12616, + "heap_budget_margin_bytes": 151800, + "contiguous_budget_margin_bytes": 196464, + "scope_of_audit": "Historical report and available artifact hash/length verification; no current-head rebuild or ELF requalification.", + "artifacts": [ + { + "name": "heltec_v4_repeater_lora_ota_no_external_sensors-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix7-8d31b393.bin", + "expected_sha256": "62644e3696887a646f8febe1e33c2d91e069c8b68bdecfd6fb5f39dbe30dd368", + "present": true, + "actual_sha256": "62644e3696887a646f8febe1e33c2d91e069c8b68bdecfd6fb5f39dbe30dd368", + "sha256_matches": true, + "bytes": 1281576 + }, + { + "name": "heltec_v4_repeater_lora_ota_no_external_sensors-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix7-8d31b393-merged.bin", + "expected_sha256": "e575779b2d9231635f485320a55fdeb6e4b00494a469c54054d453a18c9fddb6", + "present": true, + "actual_sha256": "e575779b2d9231635f485320a55fdeb6e4b00494a469c54054d453a18c9fddb6", + "sha256_matches": true, + "bytes": 1347112 + }, + { + "name": "heltec_v4_repeater_lora_ota_no_external_sensors-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix7-8d31b393.capabilities.json", + "expected_sha256": "6aa6b33ae803dc1267cad3c44b9aeee1c71768e1837d794ac42137e466762600", + "present": true, + "actual_sha256": "6aa6b33ae803dc1267cad3c44b9aeee1c71768e1837d794ac42137e466762600", + "sha256_matches": true, + "bytes": 1937 + } + ] + }, + { + "report": "out/v4-fix-2026-10-06-scan-ready-minimal/heltec_v4_repeater_lora_ota_no_external_sensors-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix5-8d31b393.memory.json", + "report_sha256": "d661286a26839310353d37ecb72889d29fe2e1946281bf254616975e2cabc256", + "target": "heltec_v4_repeater_lora_ota_no_external_sensors", + "artifact_target": "heltec_v4_repeater_lora_ota_no_external_sensors", + "pio_environment": "heltec_v4_repeater", + "mcu": "esp32s3", + "elf_sha256": "5923d77af87102d4fbe2fe9bb779a6c71972644c29d0d9d0cea24de2e326e2a7", + "passed": true, + "available_internal_bytes": 241848, + "required_heap_bytes": 90048, + "largest_internal_region_bytes": 209080, + "required_contiguous_bytes": 12616, + "heap_budget_margin_bytes": 151800, + "contiguous_budget_margin_bytes": 196464, + "scope_of_audit": "Historical report and available artifact hash/length verification; no current-head rebuild or ELF requalification.", + "artifacts": [ + { + "name": "heltec_v4_repeater_lora_ota_no_external_sensors-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix5-8d31b393.bin", + "expected_sha256": "963c656cd16cee711758b770d11d2216f5cd11321bc2a5fd257c1a733237d97d", + "present": true, + "actual_sha256": "963c656cd16cee711758b770d11d2216f5cd11321bc2a5fd257c1a733237d97d", + "sha256_matches": true, + "bytes": 1281576 + }, + { + "name": "heltec_v4_repeater_lora_ota_no_external_sensors-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix5-8d31b393-merged.bin", + "expected_sha256": "5341c0e6915aa6e104965d59cc97112cbeed3f339ee3901eb855dafc32ce1a58", + "present": true, + "actual_sha256": "5341c0e6915aa6e104965d59cc97112cbeed3f339ee3901eb855dafc32ce1a58", + "sha256_matches": true, + "bytes": 1347112 + }, + { + "name": "heltec_v4_repeater_lora_ota_no_external_sensors-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix5-8d31b393.capabilities.json", + "expected_sha256": "b6095fd1b9c6b4d4829bc769ddb9d5ffb73daf7b3e5f0c2243c4f11f64904e25", + "present": true, + "actual_sha256": "b6095fd1b9c6b4d4829bc769ddb9d5ffb73daf7b3e5f0c2243c4f11f64904e25", + "sha256_matches": true, + "bytes": 1937 + } + ] + }, + { + "report": "out/v4-fix-2026-10-06-verified-minimal/heltec_v4_repeater_lora_ota_no_external_sensors-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix3-8d31b393.memory.json", + "report_sha256": "4ad5e2e85c2cb54ea5632003cad02fe051d909d69706d5c6b5130fea81ef91ce", + "target": "heltec_v4_repeater_lora_ota_no_external_sensors", + "artifact_target": "heltec_v4_repeater_lora_ota_no_external_sensors", + "pio_environment": "heltec_v4_repeater", + "mcu": "esp32s3", + "elf_sha256": "7a9340a08e47b9e88e2f7ecccaa9f23efed0775be5cb55ac53a2c65f40ef1bc7", + "passed": true, + "available_internal_bytes": 241848, + "required_heap_bytes": 90048, + "largest_internal_region_bytes": 209080, + "required_contiguous_bytes": 12616, + "heap_budget_margin_bytes": 151800, + "contiguous_budget_margin_bytes": 196464, + "scope_of_audit": "Historical report and available artifact hash/length verification; no current-head rebuild or ELF requalification.", + "artifacts": [ + { + "name": "heltec_v4_repeater_lora_ota_no_external_sensors-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix3-8d31b393.bin", + "expected_sha256": "b404c9264320305e491b19cb6879c0b5dc9161000c18039492af97b4e79ee964", + "present": true, + "actual_sha256": "b404c9264320305e491b19cb6879c0b5dc9161000c18039492af97b4e79ee964", + "sha256_matches": true, + "bytes": 1281576 + }, + { + "name": "heltec_v4_repeater_lora_ota_no_external_sensors-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix3-8d31b393-merged.bin", + "expected_sha256": "3ceea1b5ba31880317baf89c819a5feae7e4cbe78136fc7d87930a532ecabab4", + "present": true, + "actual_sha256": "3ceea1b5ba31880317baf89c819a5feae7e4cbe78136fc7d87930a532ecabab4", + "sha256_matches": true, + "bytes": 1347112 + }, + { + "name": "heltec_v4_repeater_lora_ota_no_external_sensors-ota-v1.17.1.9-halo-keymind-cascade-dev-v4fix3-8d31b393.capabilities.json", + "expected_sha256": "0d4fa1aac99e4677d06cf6411c7a43c6d2d93f67106a97e2d51b984ce4cfbbb6", + "present": true, + "actual_sha256": "0d4fa1aac99e4677d06cf6411c7a43c6d2d93f67106a97e2d51b984ce4cfbbb6", + "sha256_matches": true, + "bytes": 1937 + } + ] + }, + { + "report": ".releases/esp32-expanded-352c8aed/builds/heltec_v4_repeater_observer_mqtt-full-usb-wifi-ota-v1.17.1.7-halo-keymind-cascade-dev-352c8aed.memory.json", + "report_sha256": "2777c5daddead8e5eb81a3d55eef4b2173737197b40e33cf61a73e0186efb08c", + "target": "heltec_v4_repeater_observer_mqtt", + "artifact_target": "heltec_v4_repeater_observer_mqtt", + "pio_environment": "heltec_v4_repeater_observer_mqtt", + "mcu": "esp32s3", + "elf_sha256": "a170912d6fd39ab4418089b8b863870371f4a76d8e4820a104f692c64c3f3c82", + "passed": true, + "available_internal_bytes": 188040, + "required_heap_bytes": 164784, + "largest_internal_region_bytes": 155272, + "required_contiguous_bytes": 12616, + "heap_budget_margin_bytes": 23256, + "contiguous_budget_margin_bytes": 142656, + "scope_of_audit": "Historical report and available artifact hash/length verification; no current-head rebuild or ELF requalification.", + "artifacts": [ + { + "name": "heltec_v4_repeater_observer_mqtt-full-usb-wifi-ota-v1.17.1.7-halo-keymind-cascade-dev-352c8aed.bin", + "expected_sha256": "73ffe57dca19b6fcdff92363614fa2ba3de98aeb31b2ae9c9ed2c263ad9e5cdd", + "present": true, + "actual_sha256": "73ffe57dca19b6fcdff92363614fa2ba3de98aeb31b2ae9c9ed2c263ad9e5cdd", + "sha256_matches": true, + "bytes": 2050056 + }, + { + "name": "heltec_v4_repeater_observer_mqtt-full-usb-wifi-ota-v1.17.1.7-halo-keymind-cascade-dev-352c8aed-merged.bin", + "expected_sha256": "cf02866eda50574c2a46ec288cc9305e69cbd0875cff31e9208ae72250c05260", + "present": true, + "actual_sha256": "cf02866eda50574c2a46ec288cc9305e69cbd0875cff31e9208ae72250c05260", + "sha256_matches": true, + "bytes": 2115592 + }, + { + "name": "heltec_v4_repeater_observer_mqtt-full-usb-wifi-ota-v1.17.1.7-halo-keymind-cascade-dev-352c8aed.capabilities.json", + "expected_sha256": "0d9b6edc592ce2eda0cbca5370b86329de428208244ed52866330b955afffc72", + "present": true, + "actual_sha256": "0d9b6edc592ce2eda0cbca5370b86329de428208244ed52866330b955afffc72", + "sha256_matches": true, + "bytes": 2202 + } + ] + }, + { + "report": "docs/test-results/preview-1.17.1.8/heltec_v4_room_server-full-usb-wifi-ota-v1.17.1.8-halo-keymind-cascade-preview1-cab781f9a.memory.json", + "report_sha256": "2933ecaf9c688638df13441319270e9395fab1cd2e4ecfc49eed3935d6b2627e", + "target": "heltec_v4_room_server", + "artifact_target": "heltec_v4_room_server", + "pio_environment": "heltec_v4_room_server_observer_mqtt", + "mcu": "esp32s3", + "elf_sha256": "3eb37eb59c76023d08b6b4240390adda686272d90acce81679f9a7f8188e0d94", + "passed": true, + "available_internal_bytes": 203800, + "required_heap_bytes": 158384, + "largest_internal_region_bytes": 171032, + "required_contiguous_bytes": 10256, + "heap_budget_margin_bytes": 45416, + "contiguous_budget_margin_bytes": 160776, + "scope_of_audit": "Historical report and available artifact hash/length verification; no current-head rebuild or ELF requalification.", + "artifacts": [ + { + "name": "heltec_v4_room_server-full-usb-wifi-ota-v1.17.1.8-halo-keymind-cascade-preview1-cab781f9a.bin", + "expected_sha256": "8e3b1ba0233101446d30c716cba368cccebd7ae431ab97e51de4b8813fcd7b3b", + "present": false + }, + { + "name": "heltec_v4_room_server-full-usb-wifi-ota-v1.17.1.8-halo-keymind-cascade-preview1-cab781f9a-merged.bin", + "expected_sha256": "070c7eeaa58f9fa8cbceea96fa4a2439d8e87fb20113a1c9409dfadba092d1f3", + "present": false + }, + { + "name": "heltec_v4_room_server-full-usb-wifi-ota-v1.17.1.8-halo-keymind-cascade-preview1-cab781f9a.capabilities.json", + "expected_sha256": "98cc0e73739c8fd45fd0be2a4f744d029aebaa0bc33068f864bd63d711005ad3", + "present": true, + "actual_sha256": "98cc0e73739c8fd45fd0be2a4f744d029aebaa0bc33068f864bd63d711005ad3", + "sha256_matches": true, + "bytes": 2358 + } + ] + }, + { + "report": "docs/test-results/preview-1.17.1.8/heltec_v4_sensor-full-logging-ota-v1.17.1.8-halo-keymind-cascade-preview1-cab781f9a.memory.json", + "report_sha256": "df5f0af7180823d33035d983762110701d3799dad729f7de8eee85628bdac670", + "target": "heltec_v4_sensor", + "artifact_target": "heltec_v4_sensor", + "pio_environment": "heltec_v4_sensor", + "mcu": "esp32s3", + "elf_sha256": "bb9f260e5d757f43ac1d71192999b5d24cac674fc23f17b29a49f53a3036aa0d", + "passed": true, + "available_internal_bytes": 277256, + "required_heap_bytes": 127592, + "largest_internal_region_bytes": 244488, + "required_contiguous_bytes": 10256, + "heap_budget_margin_bytes": 149664, + "contiguous_budget_margin_bytes": 234232, + "scope_of_audit": "Historical report and available artifact hash/length verification; no current-head rebuild or ELF requalification.", + "artifacts": [ + { + "name": "heltec_v4_sensor-full-logging-ota-v1.17.1.8-halo-keymind-cascade-preview1-cab781f9a.bin", + "expected_sha256": "af430ddb17974966e6c3f10e67515e0e29526b0c1ea339f017923b17362f4b68", + "present": false + }, + { + "name": "heltec_v4_sensor-full-logging-ota-v1.17.1.8-halo-keymind-cascade-preview1-cab781f9a-merged.bin", + "expected_sha256": "82bc1735d9aeb2a5d660db982ab9822056e55419654e819f226460de8127b976", + "present": false + }, + { + "name": "heltec_v4_sensor-full-logging-ota-v1.17.1.8-halo-keymind-cascade-preview1-cab781f9a.capabilities.json", + "expected_sha256": "6ebb9ee0401cb7c011a6aa1ff4c41b2e569c6fbabcd307ee344de3c5e3a0fa60", + "present": true, + "actual_sha256": "6ebb9ee0401cb7c011a6aa1ff4c41b2e569c6fbabcd307ee344de3c5e3a0fa60", + "sha256_matches": true, + "bytes": 1600 + } + ] + }, + { + "report": ".releases/esp32-migration-audit-4mb/builds/nibble_zero_connect_repeater_-full-logging-ota-v1.17.1.7-halo-keymind-cascade-dev-af73d05f.memory.json", + "report_sha256": "60c7a8a2bb281d249cb676d48aededc586c919c227de34fb602b45a32365c337", + "target": "nibble_zero_connect_repeater_", + "artifact_target": "nibble_zero_connect_repeater_", + "pio_environment": "nibble_zero_connect_repeater_", + "mcu": "esp32s3", + "elf_sha256": "c8837cad632b972dab3c34efd6a8e18e376a848f1732825c922bc78d14fbb815", + "passed": true, + "available_internal_bytes": 241712, + "required_heap_bytes": 144304, + "largest_internal_region_bytes": 208944, + "required_contiguous_bytes": 12616, + "heap_budget_margin_bytes": 97408, + "contiguous_budget_margin_bytes": 196328, + "scope_of_audit": "Historical report and available artifact hash/length verification; no current-head rebuild or ELF requalification.", + "artifacts": [ + { + "name": "nibble_zero_connect_repeater_-full-logging-ota-v1.17.1.7-halo-keymind-cascade-dev-af73d05f.bin", + "expected_sha256": "ac66f6ecc1e7f2f8e108ce1ea5a3ed65514c1d6244780f32a037e6a539b87f2f", + "present": true, + "actual_sha256": "ac66f6ecc1e7f2f8e108ce1ea5a3ed65514c1d6244780f32a037e6a539b87f2f", + "sha256_matches": true, + "bytes": 1576584 + }, + { + "name": "nibble_zero_connect_repeater_-full-logging-ota-v1.17.1.7-halo-keymind-cascade-dev-af73d05f-merged.bin", + "expected_sha256": "43e76e96912001c4ff33ed75b1673bb0018a6d4f4a0db3e594de52c6918dc474", + "present": true, + "actual_sha256": "43e76e96912001c4ff33ed75b1673bb0018a6d4f4a0db3e594de52c6918dc474", + "sha256_matches": true, + "bytes": 1642120 + }, + { + "name": "nibble_zero_connect_repeater_-full-logging-ota-v1.17.1.7-halo-keymind-cascade-dev-af73d05f.capabilities.json", + "expected_sha256": "4f5d33ec242b9521e436d08dcb8388b96f7c859e4f834251980d0442f9918959", + "present": true, + "actual_sha256": "4f5d33ec242b9521e436d08dcb8388b96f7c859e4f834251980d0442f9918959", + "sha256_matches": true, + "bytes": 1976 + } + ] + } + ], + "partition_tables": [ + { + "path": "variants/dual_ota_full_4MB.csv", + "sha256": "8d75b223e1f78bfb1a1eae4e8ff2a523868208b93c39ed70eca402db04ee7a13", + "entries": [ + { + "name": "nvs", + "type": "data", + "subtype": "nvs", + "offset": 36864, + "size": 20480 + }, + { + "name": "otadata", + "type": "data", + "subtype": "ota", + "offset": 57344, + "size": 8192 + }, + { + "name": "app0", + "type": "app", + "subtype": "ota_0", + "offset": 65536, + "size": 2031616 + }, + { + "name": "app1", + "type": "app", + "subtype": "ota_1", + "offset": 2097152, + "size": 2031616 + }, + { + "name": "spiffs", + "type": "data", + "subtype": "spiffs", + "offset": 4128768, + "size": 65536 + } + ], + "dual_ota": true, + "minimum_ota_slot_bytes": 2031616, + "filesystem_bytes": 65536, + "coredump_bytes": 0 + }, + { + "path": "variants/dual_ota_1536k.csv", + "sha256": "87407a5c05426fb349ab05ba1a12636f66a52dd72c34f148a31ee07700ee71fc", + "entries": [ + { + "name": "nvs", + "type": "data", + "subtype": "nvs", + "offset": 36864, + "size": 20480 + }, + { + "name": "otadata", + "type": "data", + "subtype": "ota", + "offset": 57344, + "size": 8192 + }, + { + "name": "app0", + "type": "app", + "subtype": "ota_0", + "offset": 65536, + "size": 1572864 + }, + { + "name": "app1", + "type": "app", + "subtype": "ota_1", + "offset": 1638400, + "size": 1572864 + }, + { + "name": "spiffs", + "type": "data", + "subtype": "spiffs", + "offset": 3211264, + "size": 917504 + }, + { + "name": "coredump", + "type": "data", + "subtype": "coredump", + "offset": 4128768, + "size": 65536 + } + ], + "dual_ota": true, + "minimum_ota_slot_bytes": 1572864, + "filesystem_bytes": 917504, + "coredump_bytes": 65536 + }, + { + "path": "variants/sensecap_indicator-espnow/dual_ota_2560k_preserve_spiffs.csv", + "sha256": "03ea5f4583b618717d6d4cfd52b8029a297cc3757a2233783dff6d4cecf41bfd", + "entries": [ + { + "name": "nvs", + "type": "data", + "subtype": "nvs", + "offset": 36864, + "size": 20480 + }, + { + "name": "otadata", + "type": "data", + "subtype": "ota", + "offset": 57344, + "size": 8192 + }, + { + "name": "app0", + "type": "app", + "subtype": "ota_0", + "offset": 65536, + "size": 2621440 + }, + { + "name": "spiffs", + "type": "data", + "subtype": "spiffs", + "offset": 2686976, + "size": 1441792 + }, + { + "name": "coredump", + "type": "data", + "subtype": "coredump", + "offset": 4128768, + "size": 65536 + }, + { + "name": "app1", + "type": "app", + "subtype": "ota_1", + "offset": 4194304, + "size": 2621440 + } + ], + "dual_ota": true, + "minimum_ota_slot_bytes": 2621440, + "filesystem_bytes": 1441792, + "coredump_bytes": 65536 + }, + { + "path": "variants/sensecap_indicator-espnow/dual_ota_6400k_preserve_spiffs.csv", + "sha256": "9482fe1a94aca34bdad08a38e2e6d460d6c2dc2b17a95f1d4074c4be783dd386", + "entries": [ + { + "name": "nvs", + "type": "data", + "subtype": "nvs", + "offset": 36864, + "size": 20480 + }, + { + "name": "otadata", + "type": "data", + "subtype": "ota", + "offset": 57344, + "size": 8192 + }, + { + "name": "app0", + "type": "app", + "subtype": "ota_0", + "offset": 65536, + "size": 6553600 + }, + { + "name": "app1", + "type": "app", + "subtype": "ota_1", + "offset": 6619136, + "size": 6553600 + }, + { + "name": "spiffs", + "type": "data", + "subtype": "spiffs", + "offset": 13172736, + "size": 3538944 + }, + { + "name": "coredump", + "type": "data", + "subtype": "coredump", + "offset": 16711680, + "size": 65536 + } + ], + "dual_ota": true, + "minimum_ota_slot_bytes": 6553600, + "filesystem_bytes": 3538944, + "coredump_bytes": 65536 + }, + { + "path": "C:/Users/mikec/.platformio/packages/framework-arduinoespressif32/tools/partitions/default.csv", + "sha256": "3057e2f0b65ffb81f250ba592702c1512cea0ade043ed9baf869ec30987c1290", + "entries": [ + { + "name": "nvs", + "type": "data", + "subtype": "nvs", + "offset": 36864, + "size": 20480 + }, + { + "name": "otadata", + "type": "data", + "subtype": "ota", + "offset": 57344, + "size": 8192 + }, + { + "name": "app0", + "type": "app", + "subtype": "ota_0", + "offset": 65536, + "size": 1310720 + }, + { + "name": "app1", + "type": "app", + "subtype": "ota_1", + "offset": 1376256, + "size": 1310720 + }, + { + "name": "spiffs", + "type": "data", + "subtype": "spiffs", + "offset": 2686976, + "size": 1441792 + }, + { + "name": "coredump", + "type": "data", + "subtype": "coredump", + "offset": 4128768, + "size": 65536 + } + ], + "dual_ota": true, + "minimum_ota_slot_bytes": 1310720, + "filesystem_bytes": 1441792, + "coredump_bytes": 65536 + }, + { + "path": "C:/Users/mikec/.platformio/packages/framework-arduinoespressif32/tools/partitions/default_8MB.csv", + "sha256": "f55f94b245096c15612007eb2fd924e96752e234674aef218d120d4207eb3ba1", + "entries": [ + { + "name": "nvs", + "type": "data", + "subtype": "nvs", + "offset": 36864, + "size": 20480 + }, + { + "name": "otadata", + "type": "data", + "subtype": "ota", + "offset": 57344, + "size": 8192 + }, + { + "name": "app0", + "type": "app", + "subtype": "ota_0", + "offset": 65536, + "size": 3342336 + }, + { + "name": "app1", + "type": "app", + "subtype": "ota_1", + "offset": 3407872, + "size": 3342336 + }, + { + "name": "spiffs", + "type": "data", + "subtype": "spiffs", + "offset": 6750208, + "size": 1572864 + }, + { + "name": "coredump", + "type": "data", + "subtype": "coredump", + "offset": 8323072, + "size": 65536 + } + ], + "dual_ota": true, + "minimum_ota_slot_bytes": 3342336, + "filesystem_bytes": 1572864, + "coredump_bytes": 65536 + }, + { + "path": "C:/Users/mikec/.platformio/packages/framework-arduinoespressif32/tools/partitions/default_16MB.csv", + "sha256": "4a6aaf11525dab5d49a336aa52ef7e65f8e83d824c9a7a931c72943cbd40d63c", + "entries": [ + { + "name": "nvs", + "type": "data", + "subtype": "nvs", + "offset": 36864, + "size": 20480 + }, + { + "name": "otadata", + "type": "data", + "subtype": "ota", + "offset": 57344, + "size": 8192 + }, + { + "name": "app0", + "type": "app", + "subtype": "ota_0", + "offset": 65536, + "size": 6553600 + }, + { + "name": "app1", + "type": "app", + "subtype": "ota_1", + "offset": 6619136, + "size": 6553600 + }, + { + "name": "spiffs", + "type": "data", + "subtype": "spiffs", + "offset": 13172736, + "size": 3538944 + }, + { + "name": "coredump", + "type": "data", + "subtype": "coredump", + "offset": 16711680, + "size": 65536 + } + ], + "dual_ota": true, + "minimum_ota_slot_bytes": 6553600, + "filesystem_bytes": 3538944, + "coredump_bytes": 65536 + }, + { + "path": "C:/Users/mikec/.platformio/packages/framework-arduinoespressif32/tools/partitions/huge_app.csv", + "sha256": "ce78a17d73dd138c822722b9f97d1050ce34af1f21289fa43c97503b14cb42bc", + "entries": [ + { + "name": "nvs", + "type": "data", + "subtype": "nvs", + "offset": 36864, + "size": 20480 + }, + { + "name": "otadata", + "type": "data", + "subtype": "ota", + "offset": 57344, + "size": 8192 + }, + { + "name": "app0", + "type": "app", + "subtype": "ota_0", + "offset": 65536, + "size": 3145728 + }, + { + "name": "spiffs", + "type": "data", + "subtype": "spiffs", + "offset": 3211264, + "size": 917504 + }, + { + "name": "coredump", + "type": "data", + "subtype": "coredump", + "offset": 4128768, + "size": 65536 + } + ], + "dual_ota": false, + "minimum_ota_slot_bytes": null, + "filesystem_bytes": 917504, + "coredump_bytes": 65536 + } + ], + "theoretical_symmetric_dual_ota_ceiling_with_64k_prefix_and_64k_fs": [ + { + "flash_bytes": 4194304, + "ota_slot_bytes": 2031616, + "scope": "Arithmetic ceiling with64KiB prefix including metadata and64KiB FS; no coredump or other required data. Not a deployed-data-preserving layout or runtimeFS sufficiency guarantee." + }, + { + "flash_bytes": 8388608, + "ota_slot_bytes": 4128768, + "scope": "Arithmetic ceiling with64KiB prefix including metadata and64KiB FS; no coredump or other required data. Not a deployed-data-preserving layout or runtimeFS sufficiency guarantee." + }, + { + "flash_bytes": 16777216, + "ota_slot_bytes": 8323072, + "scope": "Arithmetic ceiling with64KiB prefix including metadata and64KiB FS; no coredump or other required data. Not a deployed-data-preserving layout or runtimeFS sufficiency guarantee." + } + ] +} diff --git a/docs/research/esp32_full_build_inventory_baseline_2026-10-06.csv b/docs/research/esp32_full_build_inventory_baseline_2026-10-06.csv new file mode 100644 index 000000000..143015956 --- /dev/null +++ b/docs/research/esp32_full_build_inventory_baseline_2026-10-06.csv @@ -0,0 +1,641 @@ +scope,kind,target,board,category,route,canonical_release_selected,default_non_kiss_release_selected,named_full,supports_full,full_only,migration,full_cli,runtime_alias,reduced,companion,kiss,redundant,pio_base,canonical_full_target,canonical_full_pio_env,mapping_basis,auto_route,fit_evidence +tracked_primary,raw_platformio_environment,Ebyte_EoRa-S3_Repeater,ebyte_eora-s3,node_firmware,legacy,True,True,False,True,False,True,False,False,False,False,False,False,Ebyte_EoRa-S3_Repeater,Ebyte_EoRa-S3_Repeater,Ebyte_EoRa-S3_repeater_observer_mqtt,exact ordinary Full group choice,full|Ebyte_EoRa-S3_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Ebyte_EoRa-S3_terminal_chat,ebyte_eora-s3,node_firmware,legacy,False,False,False,False,False,False,False,False,False,False,False,True,Ebyte_EoRa-S3_terminal_chat,Ebyte_EoRa-S3_companion_radio_full,Ebyte_EoRa-S3_companion_radio_ble,canonical replacement -> named Full Companion,auto|Ebyte_EoRa-S3_terminal_chat,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Ebyte_EoRa-S3_room_server,ebyte_eora-s3,node_firmware,legacy,True,True,False,True,False,True,False,False,False,False,False,False,Ebyte_EoRa-S3_room_server,Ebyte_EoRa-S3_room_server,Ebyte_EoRa-S3_room_server_observer_mqtt,exact ordinary Full group choice,full|Ebyte_EoRa-S3_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Ebyte_EoRa-S3_companion_radio_usb,ebyte_eora-s3,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,Ebyte_EoRa-S3_companion_radio_usb,Ebyte_EoRa-S3_companion_radio_full,Ebyte_EoRa-S3_companion_radio_ble,canonical replacement -> named Full Companion,auto|Ebyte_EoRa-S3_companion_radio_usb,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Ebyte_EoRa-S3_companion_radio_ble,ebyte_eora-s3,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,Ebyte_EoRa-S3_companion_radio_ble,Ebyte_EoRa-S3_companion_radio_full,Ebyte_EoRa-S3_companion_radio_ble,canonical replacement -> named Full Companion,auto|Ebyte_EoRa-S3_companion_radio_ble,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Ebyte_EoRa-S3_kiss_modem,ebyte_eora-s3,host_modem_KISS,KISS,True,False,False,False,False,False,False,False,False,False,True,False,Ebyte_EoRa-S3_kiss_modem,,,,auto|Ebyte_EoRa-S3_kiss_modem,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Ebyte_EoRa-S3_repeater_observer_mqtt,ebyte_eora-s3,node_firmware,Full,True,True,False,True,False,False,True,False,False,False,False,False,Ebyte_EoRa-S3_repeater_observer_mqtt,Ebyte_EoRa-S3_Repeater,Ebyte_EoRa-S3_repeater_observer_mqtt,exact ordinary Full group choice,full|Ebyte_EoRa-S3_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Ebyte_EoRa-S3_room_server_observer_mqtt,ebyte_eora-s3,node_firmware,Full,True,True,False,True,False,False,True,False,False,False,False,False,Ebyte_EoRa-S3_room_server_observer_mqtt,Ebyte_EoRa-S3_room_server,Ebyte_EoRa-S3_room_server_observer_mqtt,exact ordinary Full group choice,full|Ebyte_EoRa-S3_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,esp32_s3_4mb_partition_migrator,esp32-s3-devkitc-1,development_or_migration_utility,source,False,False,False,False,False,False,False,False,False,False,False,True,esp32_s3_4mb_partition_migrator,,,,auto|esp32_s3_4mb_partition_migrator,not measured by this static routing audit +tracked_primary,raw_platformio_environment,esp32_s3_16mb_partition_migrator,esp32-s3-devkitc-1,development_or_migration_utility,source,False,False,False,False,False,False,False,False,False,False,False,True,esp32_s3_16mb_partition_migrator,,,,auto|esp32_s3_16mb_partition_migrator,not measured by this static routing audit +tracked_primary,raw_platformio_environment,esp32_s3_8mb_partition_migrator,esp32-s3-devkitc-1,development_or_migration_utility,source,False,False,False,False,False,False,False,False,False,False,False,True,esp32_s3_8mb_partition_migrator,,,,auto|esp32_s3_8mb_partition_migrator,not measured by this static routing audit +tracked_primary,raw_platformio_environment,esp32_s3_4mb_partition_migrator_lora,esp32-s3-devkitc-1,development_or_migration_utility,source,False,False,False,False,False,False,False,False,False,False,False,True,esp32_s3_4mb_partition_migrator_lora,,,,auto|esp32_s3_4mb_partition_migrator_lora,not measured by this static routing audit +tracked_primary,raw_platformio_environment,esp32_s3_8mb_partition_migrator_lora,esp32-s3-devkitc-1,development_or_migration_utility,source,False,False,False,False,False,False,False,False,False,False,False,True,esp32_s3_8mb_partition_migrator_lora,,,,auto|esp32_s3_8mb_partition_migrator_lora,not measured by this static routing audit +tracked_primary,raw_platformio_environment,esp32_s3_16mb_partition_migrator_lora,esp32-s3-devkitc-1,development_or_migration_utility,source,False,False,False,False,False,False,False,False,False,False,False,True,esp32_s3_16mb_partition_migrator_lora,,,,auto|esp32_s3_16mb_partition_migrator_lora,not measured by this static routing audit +tracked_primary,raw_platformio_environment,esp32_8mb_partition_migrator,esp32dev,development_or_migration_utility,source,False,False,False,False,False,False,False,False,False,False,False,True,esp32_8mb_partition_migrator,,,,auto|esp32_8mb_partition_migrator,not measured by this static routing audit +tracked_primary,raw_platformio_environment,esp32_8mb_partition_migrator_lora,esp32dev,development_or_migration_utility,source,False,False,False,False,False,False,False,False,False,False,False,True,esp32_8mb_partition_migrator_lora,,,,auto|esp32_8mb_partition_migrator_lora,not measured by this static routing audit +tracked_primary,raw_platformio_environment,esp32_c3_4mb_partition_migrator,esp32-c3-devkitm-1,development_or_migration_utility,source,False,False,False,False,False,False,False,False,False,False,False,True,esp32_c3_4mb_partition_migrator,,,,auto|esp32_c3_4mb_partition_migrator,not measured by this static routing audit +tracked_primary,raw_platformio_environment,esp32_c3_4mb_partition_migrator_lora,esp32-c3-devkitm-1,development_or_migration_utility,source,False,False,False,False,False,False,False,False,False,False,False,True,esp32_c3_4mb_partition_migrator_lora,,,,auto|esp32_c3_4mb_partition_migrator_lora,not measured by this static routing audit +tracked_primary,raw_platformio_environment,esp32_4mb_partition_migrator,esp32dev,development_or_migration_utility,source,False,False,False,False,False,False,False,False,False,False,False,True,esp32_4mb_partition_migrator,,,,auto|esp32_4mb_partition_migrator,not measured by this static routing audit +tracked_primary,raw_platformio_environment,esp32_4mb_partition_migrator_lora,esp32dev,development_or_migration_utility,source,False,False,False,False,False,False,False,False,False,False,False,True,esp32_4mb_partition_migrator_lora,,,,auto|esp32_4mb_partition_migrator_lora,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Generic_E22_sx1262_repeater,esp32doit-devkit-v1,node_firmware,legacy,True,True,False,True,False,True,False,False,False,False,False,False,Generic_E22_sx1262_repeater,Generic_E22_sx1262_repeater,Generic_E22_sx1262_repeater,exact ordinary Full group choice,full|Generic_E22_sx1262_repeater,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Generic_E22_sx1262_repeater_bridge_espnow,esp32doit-devkit-v1,node_firmware,Full,False,False,False,True,False,False,True,False,False,False,False,True,Generic_E22_sx1262_repeater_bridge_espnow,Generic_E22_sx1262_repeater,Generic_E22_sx1262_repeater,exact ordinary Full group choice,full|Generic_E22_sx1262_repeater_bridge_espnow,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Generic_E22_kiss_modem,esp32doit-devkit-v1,host_modem_KISS,KISS,True,False,False,False,False,False,False,False,False,False,True,False,Generic_E22_kiss_modem,,,,auto|Generic_E22_kiss_modem,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Generic_E22_sx1268_repeater,esp32doit-devkit-v1,node_firmware,legacy,True,True,False,True,False,True,False,False,False,False,False,False,Generic_E22_sx1268_repeater,Generic_E22_sx1268_repeater,Generic_E22_sx1268_repeater,exact ordinary Full group choice,full|Generic_E22_sx1268_repeater,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Generic_E22_sx1268_repeater_bridge_espnow,esp32doit-devkit-v1,node_firmware,Full,False,False,False,True,False,False,True,False,False,False,False,True,Generic_E22_sx1268_repeater_bridge_espnow,Generic_E22_sx1268_repeater,Generic_E22_sx1268_repeater,exact ordinary Full group choice,full|Generic_E22_sx1268_repeater_bridge_espnow,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Generic_ESPNOW_terminal_chat,esp32-c3-devkitm-1,node_firmware,legacy,False,False,False,False,False,False,False,False,False,False,False,True,Generic_ESPNOW_terminal_chat,Generic_ESPNOW_companion_radio_full,Generic_ESPNOW_comp_radio_usb,canonical replacement -> named Full Companion,auto|Generic_ESPNOW_terminal_chat,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Generic_ESPNOW_repeatr,esp32-c3-devkitm-1,node_firmware,legacy,True,True,False,True,False,False,False,False,False,False,False,False,Generic_ESPNOW_repeatr,Generic_ESPNOW_repeatr,Generic_ESPNOW_repeatr,exact ordinary Full group choice,full|Generic_ESPNOW_repeatr,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Generic_ESPNOW_comp_radio_usb,esp32-c3-devkitm-1,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,Generic_ESPNOW_comp_radio_usb,Generic_ESPNOW_companion_radio_full,Generic_ESPNOW_comp_radio_usb,canonical replacement -> named Full Companion,auto|Generic_ESPNOW_comp_radio_usb,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Generic_ESPNOW_room_svr,esp32-c3-devkitm-1,node_firmware,legacy,True,True,False,True,False,False,False,False,False,False,False,False,Generic_ESPNOW_room_svr,Generic_ESPNOW_room_svr,Generic_ESPNOW_room_svr,exact ordinary Full group choice,full|Generic_ESPNOW_room_svr,not measured by this static routing audit +tracked_primary,raw_platformio_environment,GEPRC_Linkflow_900_repeater,esp32dev,node_firmware,legacy,True,True,False,True,False,False,False,False,False,False,False,False,GEPRC_Linkflow_900_repeater,GEPRC_Linkflow_900_repeater,GEPRC_Linkflow_900_repeater,exact ordinary Full group choice,full|GEPRC_Linkflow_900_repeater,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_ct62_repeater,esp32-c3-devkitm-1,node_firmware,legacy,True,True,False,True,False,True,False,False,False,False,False,False,Heltec_ct62_repeater,Heltec_ct62_repeater,Heltec_ct62_repeater,exact ordinary Full group choice,full|Heltec_ct62_repeater,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_ct62_repeater_bridge_espnow,esp32-c3-devkitm-1,node_firmware,Full,False,False,False,True,False,False,True,False,False,False,False,True,Heltec_ct62_repeater_bridge_espnow,Heltec_ct62_repeater,Heltec_ct62_repeater,exact ordinary Full group choice,full|Heltec_ct62_repeater_bridge_espnow,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_ct62_companion_radio_usb,esp32-c3-devkitm-1,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,Heltec_ct62_companion_radio_usb,Heltec_ct62_companion_radio_full,Heltec_ct62_companion_radio_ble,canonical replacement -> named Full Companion,auto|Heltec_ct62_companion_radio_usb,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_ct62_companion_radio_ble,esp32-c3-devkitm-1,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,Heltec_ct62_companion_radio_ble,Heltec_ct62_companion_radio_full,Heltec_ct62_companion_radio_ble,canonical replacement -> named Full Companion,auto|Heltec_ct62_companion_radio_ble,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_ct62_companion_radio_ble_ps,esp32-c3-devkitm-1,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,True,False,True,False,True,Heltec_ct62_companion_radio_ble_ps,Heltec_ct62_companion_radio_full,Heltec_ct62_companion_radio_ble,saved powersave alias -> canonical replacement -> named Full Companion,auto|Heltec_ct62_companion_radio_ble_ps,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_ct62_sensor,esp32-c3-devkitm-1,node_firmware,legacy,True,True,False,True,False,True,False,False,False,False,False,False,Heltec_ct62_sensor,Heltec_ct62_sensor,Heltec_ct62_sensor,exact ordinary Full group choice,full|Heltec_ct62_sensor,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_ct62_kiss_modem,esp32-c3-devkitm-1,host_modem_KISS,KISS,True,False,False,False,False,False,False,False,False,False,True,False,Heltec_ct62_kiss_modem,,,,auto|Heltec_ct62_kiss_modem,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_E213_companion_radio_ble,heltec_e213,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,Heltec_E213_companion_radio_ble,Heltec_E213_companion_radio_full,Heltec_E213_companion_radio_ble,canonical replacement -> named Full Companion,auto|Heltec_E213_companion_radio_ble,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_E213_companion_radio_usb,heltec_e213,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,Heltec_E213_companion_radio_usb,Heltec_E213_companion_radio_full,Heltec_E213_companion_radio_ble,canonical replacement -> named Full Companion,auto|Heltec_E213_companion_radio_usb,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_E213_repeater,heltec_e213,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,Heltec_E213_repeater,Heltec_E213_repeater,Heltec_E213_repeater_observer_mqtt,exact ordinary Full group choice,full|Heltec_E213_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_E213_repeater_bridge_espnow,heltec_e213,node_firmware,Full,False,False,False,True,True,False,True,False,False,False,False,True,Heltec_E213_repeater_bridge_espnow,Heltec_E213_repeater,Heltec_E213_repeater_observer_mqtt,exact ordinary Full group choice,full|Heltec_E213_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_E213_room_server,heltec_e213,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,Heltec_E213_room_server,Heltec_E213_room_server,Heltec_E213_room_server_observer_mqtt,exact ordinary Full group choice,full|Heltec_E213_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_E213_kiss_modem,heltec_e213,host_modem_KISS,KISS,True,False,False,False,False,False,False,False,False,False,True,False,Heltec_E213_kiss_modem,,,,auto|Heltec_E213_kiss_modem,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_E213_repeater_observer_mqtt,heltec_e213,node_firmware,Full,True,True,False,True,True,False,True,False,False,False,False,False,Heltec_E213_repeater_observer_mqtt,Heltec_E213_repeater,Heltec_E213_repeater_observer_mqtt,exact ordinary Full group choice,full|Heltec_E213_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_E213_room_server_observer_mqtt,heltec_e213,node_firmware,Full,True,True,False,True,True,False,True,False,False,False,False,False,Heltec_E213_room_server_observer_mqtt,Heltec_E213_room_server,Heltec_E213_room_server_observer_mqtt,exact ordinary Full group choice,full|Heltec_E213_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_E290_companion_ble,heltec_e290,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,Heltec_E290_companion_ble,Heltec_E290_companion_radio_full,Heltec_E290_companion_usb_ble,canonical replacement -> named Full Companion,auto|Heltec_E290_companion_ble,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_E290_companion_usb,heltec_e290,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,Heltec_E290_companion_usb,Heltec_E290_companion_radio_full,Heltec_E290_companion_usb_ble,canonical replacement -> named Full Companion,auto|Heltec_E290_companion_usb,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_E290_companion_usb_ble,heltec_e290,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,Heltec_E290_companion_usb_ble,Heltec_E290_companion_radio_full,Heltec_E290_companion_usb_ble,canonical replacement -> named Full Companion,auto|Heltec_E290_companion_usb_ble,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_E290_repeater,heltec_e290,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,Heltec_E290_repeater,Heltec_E290_repeater,Heltec_E290_repeater_observer_mqtt,exact ordinary Full group choice,full|Heltec_E290_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_E290_repeater_bridge_espnow,heltec_e290,node_firmware,Full,False,False,False,True,True,False,True,False,False,False,False,True,Heltec_E290_repeater_bridge_espnow,Heltec_E290_repeater,Heltec_E290_repeater_observer_mqtt,exact ordinary Full group choice,full|Heltec_E290_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_E290_room_server,heltec_e290,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,Heltec_E290_room_server,Heltec_E290_room_server,Heltec_E290_room_server_observer_mqtt,exact ordinary Full group choice,full|Heltec_E290_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_E290_kiss_modem,heltec_e290,host_modem_KISS,KISS,True,False,False,False,False,False,False,False,False,False,True,False,Heltec_E290_kiss_modem,,,,auto|Heltec_E290_kiss_modem,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_E290_repeater_observer_mqtt,heltec_e290,node_firmware,Full,True,True,False,True,True,False,True,False,False,False,False,False,Heltec_E290_repeater_observer_mqtt,Heltec_E290_repeater,Heltec_E290_repeater_observer_mqtt,exact ordinary Full group choice,full|Heltec_E290_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_E290_room_server_observer_mqtt,heltec_e290,node_firmware,Full,True,True,False,True,True,False,True,False,False,False,False,False,Heltec_E290_room_server_observer_mqtt,Heltec_E290_room_server,Heltec_E290_room_server_observer_mqtt,exact ordinary Full group choice,full|Heltec_E290_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_rc32_without_display_repeater,heltec-rc32,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,heltec_rc32_without_display_repeater,heltec_rc32_without_display_repeater,heltec_rc32_without_display_repeater_observer_mqtt,exact ordinary Full group choice,full|heltec_rc32_without_display_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_rc32_without_display_repeater_bridge_espnow,heltec-rc32,node_firmware,Full,False,False,False,True,True,False,True,False,False,False,False,True,heltec_rc32_without_display_repeater_bridge_espnow,heltec_rc32_without_display_repeater,heltec_rc32_without_display_repeater_observer_mqtt,exact ordinary Full group choice,full|heltec_rc32_without_display_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_rc32_without_display_room_server,heltec-rc32,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,heltec_rc32_without_display_room_server,heltec_rc32_without_display_room_server,heltec_rc32_without_display_room_server_observer_mqtt,exact ordinary Full group choice,full|heltec_rc32_without_display_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_rc32_without_display_companion_radio_usb,heltec-rc32,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,heltec_rc32_without_display_companion_radio_usb,heltec_rc32_without_display_companion_radio_full,heltec_rc32_without_display_companion_radio_full,canonical replacement -> named Full Companion,auto|heltec_rc32_without_display_companion_radio_usb,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_rc32_without_display_companion_radio_ble,heltec-rc32,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,heltec_rc32_without_display_companion_radio_ble,heltec_rc32_without_display_companion_radio_full,heltec_rc32_without_display_companion_radio_full,canonical replacement -> named Full Companion,auto|heltec_rc32_without_display_companion_radio_ble,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_rc32_without_display_companion_radio_wifi,heltec-rc32,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,heltec_rc32_without_display_companion_radio_wifi,heltec_rc32_without_display_companion_radio_full,heltec_rc32_without_display_companion_radio_full,canonical replacement -> named Full Companion,auto|heltec_rc32_without_display_companion_radio_wifi,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_rc32_without_display_companion_radio_full,heltec-rc32,named_Full_Companion,Full,True,True,True,False,False,False,False,False,False,True,False,False,heltec_rc32_without_display_companion_radio_full,heltec_rc32_without_display_companion_radio_full,heltec_rc32_without_display_companion_radio_full,named Full Companion,full|heltec_rc32_without_display_companion_radio_full,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_rc32_without_display_sensor,heltec-rc32,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,heltec_rc32_without_display_sensor,heltec_rc32_without_display_sensor,heltec_rc32_without_display_sensor,exact ordinary Full group choice,full|heltec_rc32_without_display_sensor,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_rc32_repeater,heltec-rc32,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,heltec_rc32_repeater,heltec_rc32_repeater,heltec_rc32_repeater_observer_mqtt,exact ordinary Full group choice,full|heltec_rc32_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_rc32_repeater_bridge_espnow,heltec-rc32,node_firmware,Full,False,False,False,True,True,False,True,False,False,False,False,True,heltec_rc32_repeater_bridge_espnow,heltec_rc32_repeater,heltec_rc32_repeater_observer_mqtt,exact ordinary Full group choice,full|heltec_rc32_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_rc32_room_server,heltec-rc32,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,heltec_rc32_room_server,heltec_rc32_room_server,heltec_rc32_room_server_observer_mqtt,exact ordinary Full group choice,full|heltec_rc32_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_rc32_terminal_chat,heltec-rc32,node_firmware,legacy,False,False,False,False,False,False,False,False,False,False,False,True,heltec_rc32_terminal_chat,heltec_rc32_companion_radio_full,heltec_rc32_companion_radio_full,canonical replacement -> named Full Companion,auto|heltec_rc32_terminal_chat,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_rc32_companion_radio_usb,heltec-rc32,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,heltec_rc32_companion_radio_usb,heltec_rc32_companion_radio_full,heltec_rc32_companion_radio_full,canonical replacement -> named Full Companion,auto|heltec_rc32_companion_radio_usb,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_rc32_companion_radio_ble,heltec-rc32,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,heltec_rc32_companion_radio_ble,heltec_rc32_companion_radio_full,heltec_rc32_companion_radio_full,canonical replacement -> named Full Companion,auto|heltec_rc32_companion_radio_ble,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_rc32_companion_radio_wifi,heltec-rc32,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,heltec_rc32_companion_radio_wifi,heltec_rc32_companion_radio_full,heltec_rc32_companion_radio_full,canonical replacement -> named Full Companion,auto|heltec_rc32_companion_radio_wifi,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_rc32_companion_radio_full,heltec-rc32,named_Full_Companion,Full,True,True,True,False,False,False,False,False,False,True,False,False,heltec_rc32_companion_radio_full,heltec_rc32_companion_radio_full,heltec_rc32_companion_radio_full,named Full Companion,full|heltec_rc32_companion_radio_full,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_rc32_sensor,heltec-rc32,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,heltec_rc32_sensor,heltec_rc32_sensor,heltec_rc32_sensor,exact ordinary Full group choice,full|heltec_rc32_sensor,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_rc32_kiss_modem,heltec-rc32,host_modem_KISS,KISS,True,False,False,False,False,False,False,False,False,False,True,False,heltec_rc32_kiss_modem,,,,auto|heltec_rc32_kiss_modem,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_rc32_repeater_observer_mqtt,heltec-rc32,node_firmware,Full,True,True,False,True,True,False,True,False,False,False,False,False,heltec_rc32_repeater_observer_mqtt,heltec_rc32_repeater,heltec_rc32_repeater_observer_mqtt,exact ordinary Full group choice,full|heltec_rc32_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_rc32_room_server_observer_mqtt,heltec-rc32,node_firmware,Full,True,True,False,True,True,False,True,False,False,False,False,False,heltec_rc32_room_server_observer_mqtt,heltec_rc32_room_server,heltec_rc32_room_server_observer_mqtt,exact ordinary Full group choice,full|heltec_rc32_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_rc32_without_display_repeater_observer_mqtt,heltec-rc32,node_firmware,Full,True,True,False,True,True,False,True,False,False,False,False,False,heltec_rc32_without_display_repeater_observer_mqtt,heltec_rc32_without_display_repeater,heltec_rc32_without_display_repeater_observer_mqtt,exact ordinary Full group choice,full|heltec_rc32_without_display_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_rc32_without_display_room_server_observer_mqtt,heltec-rc32,node_firmware,Full,True,True,False,True,True,False,True,False,False,False,False,False,heltec_rc32_without_display_room_server_observer_mqtt,heltec_rc32_without_display_room_server,heltec_rc32_without_display_room_server_observer_mqtt,exact ordinary Full group choice,full|heltec_rc32_without_display_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_T190_companion_radio_ble_,heltec_t190,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,Heltec_T190_companion_radio_ble_,Heltec_T190_companion_radio_full_,Heltec_T190_companion_radio_usb_ble_,canonical replacement -> named Full Companion,auto|Heltec_T190_companion_radio_ble_,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_T190_companion_radio_usb_,heltec_t190,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,Heltec_T190_companion_radio_usb_,Heltec_T190_companion_radio_full_,Heltec_T190_companion_radio_usb_ble_,canonical replacement -> named Full Companion,auto|Heltec_T190_companion_radio_usb_,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_T190_companion_radio_usb_ble_,heltec_t190,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,Heltec_T190_companion_radio_usb_ble_,Heltec_T190_companion_radio_full_,Heltec_T190_companion_radio_usb_ble_,canonical replacement -> named Full Companion,auto|Heltec_T190_companion_radio_usb_ble_,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_T190_repeater_,heltec_t190,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,Heltec_T190_repeater_,Heltec_T190_repeater_,Heltec_T190_repeater_observer_mqtt,exact ordinary Full group choice,full|Heltec_T190_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_T190_repeater_observer_mqtt,heltec_t190,node_firmware,Full,True,True,False,True,True,False,True,False,False,False,False,False,Heltec_T190_repeater_observer_mqtt,Heltec_T190_repeater_,Heltec_T190_repeater_observer_mqtt,exact ordinary Full group choice,full|Heltec_T190_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_T190_repeater_bridge_espnow_,heltec_t190,node_firmware,Full,False,False,False,True,True,False,True,False,False,False,False,True,Heltec_T190_repeater_bridge_espnow_,Heltec_T190_repeater_,Heltec_T190_repeater_observer_mqtt,exact ordinary Full group choice,full|Heltec_T190_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_T190_room_server_,heltec_t190,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,Heltec_T190_room_server_,Heltec_T190_room_server_,Heltec_T190_room_server_observer_mqtt,exact ordinary Full group choice,full|Heltec_T190_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_T190_room_server_observer_mqtt,heltec_t190,node_firmware,Full,True,True,False,True,True,False,True,False,False,False,False,False,Heltec_T190_room_server_observer_mqtt,Heltec_T190_room_server_,Heltec_T190_room_server_observer_mqtt,exact ordinary Full group choice,full|Heltec_T190_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_T190_kiss_modem,heltec_t190,host_modem_KISS,KISS,True,False,False,False,False,False,False,False,False,False,True,False,Heltec_T190_kiss_modem,,,,auto|Heltec_T190_kiss_modem,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_Wireless_Tracker_companion_radio_usb,esp32-s3-devkitc-1,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,Heltec_Wireless_Tracker_companion_radio_usb,Heltec_Wireless_Tracker_companion_radio_full,Heltec_Wireless_Tracker_companion_radio_ble,canonical replacement -> named Full Companion,auto|Heltec_Wireless_Tracker_companion_radio_usb,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_Wireless_Tracker_companion_radio_ble,esp32-s3-devkitc-1,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,Heltec_Wireless_Tracker_companion_radio_ble,Heltec_Wireless_Tracker_companion_radio_full,Heltec_Wireless_Tracker_companion_radio_ble,canonical replacement -> named Full Companion,auto|Heltec_Wireless_Tracker_companion_radio_ble,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_Wireless_Tracker_companion_radio_ble_ps,esp32-s3-devkitc-1,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,True,False,True,False,True,Heltec_Wireless_Tracker_companion_radio_ble_ps,Heltec_Wireless_Tracker_companion_radio_full,Heltec_Wireless_Tracker_companion_radio_ble,saved powersave alias -> canonical replacement -> named Full Companion,auto|Heltec_Wireless_Tracker_companion_radio_ble_ps,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_Wireless_Tracker_repeater,esp32-s3-devkitc-1,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,Heltec_Wireless_Tracker_repeater,Heltec_Wireless_Tracker_repeater,Heltec_Wireless_Tracker_repeater_observer_mqtt,exact ordinary Full group choice,full|Heltec_Wireless_Tracker_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_Wireless_Tracker_repeater_bridge_espnow,esp32-s3-devkitc-1,node_firmware,Full,False,False,False,True,True,False,True,False,False,False,False,True,Heltec_Wireless_Tracker_repeater_bridge_espnow,Heltec_Wireless_Tracker_repeater,Heltec_Wireless_Tracker_repeater_observer_mqtt,exact ordinary Full group choice,full|Heltec_Wireless_Tracker_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_Wireless_Tracker_room_server,esp32-s3-devkitc-1,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,Heltec_Wireless_Tracker_room_server,Heltec_Wireless_Tracker_room_server,Heltec_Wireless_Tracker_room_server_observer_mqtt,exact ordinary Full group choice,full|Heltec_Wireless_Tracker_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_Wireless_Tracker_kiss_modem,esp32-s3-devkitc-1,host_modem_KISS,KISS,True,False,False,False,False,False,False,False,False,False,True,False,Heltec_Wireless_Tracker_kiss_modem,,,,auto|Heltec_Wireless_Tracker_kiss_modem,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_Wireless_Tracker_repeater_observer_mqtt,esp32-s3-devkitc-1,node_firmware,Full,True,True,False,True,True,False,True,False,False,False,False,False,Heltec_Wireless_Tracker_repeater_observer_mqtt,Heltec_Wireless_Tracker_repeater,Heltec_Wireless_Tracker_repeater_observer_mqtt,exact ordinary Full group choice,full|Heltec_Wireless_Tracker_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_Wireless_Tracker_room_server_observer_mqtt,esp32-s3-devkitc-1,node_firmware,Full,True,True,False,True,True,False,True,False,False,False,False,False,Heltec_Wireless_Tracker_room_server_observer_mqtt,Heltec_Wireless_Tracker_room_server,Heltec_Wireless_Tracker_room_server_observer_mqtt,exact ordinary Full group choice,full|Heltec_Wireless_Tracker_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_tracker_v2_repeater,heltec_tracker_v2,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,heltec_tracker_v2_repeater,heltec_tracker_v2_repeater,heltec_tracker_v2_repeater_observer_mqtt,exact ordinary Full group choice,full|heltec_tracker_v2_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_tracker_v2_repeater_bridge_espnow,heltec_tracker_v2,node_firmware,Full,False,False,False,True,True,False,True,False,False,False,False,True,heltec_tracker_v2_repeater_bridge_espnow,heltec_tracker_v2_repeater,heltec_tracker_v2_repeater_observer_mqtt,exact ordinary Full group choice,full|heltec_tracker_v2_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_tracker_v2_room_server,heltec_tracker_v2,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,heltec_tracker_v2_room_server,heltec_tracker_v2_room_server,heltec_tracker_v2_room_server_observer_mqtt,exact ordinary Full group choice,full|heltec_tracker_v2_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_tracker_v1_1_repeater_observer_mqtt,heltec_tracker_v1_1,node_firmware,Full,True,True,False,True,True,False,True,False,False,False,False,False,heltec_tracker_v1_1_repeater_observer_mqtt,heltec_tracker_v1_1_repeater_observer_mqtt,heltec_tracker_v1_1_repeater_observer_mqtt,exact ordinary Full group choice,full|heltec_tracker_v1_1_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_tracker_v2_repeater_observer_mqtt,heltec_tracker_v2,node_firmware,Full,True,True,False,True,True,False,True,False,False,False,False,False,heltec_tracker_v2_repeater_observer_mqtt,heltec_tracker_v2_repeater,heltec_tracker_v2_repeater_observer_mqtt,exact ordinary Full group choice,full|heltec_tracker_v2_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_tracker_v1_1_room_server_observer_mqtt,heltec_tracker_v1_1,node_firmware,Full,True,True,False,True,True,False,True,False,False,False,False,False,heltec_tracker_v1_1_room_server_observer_mqtt,heltec_tracker_v1_1_room_server_observer_mqtt,heltec_tracker_v1_1_room_server_observer_mqtt,exact ordinary Full group choice,full|heltec_tracker_v1_1_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_tracker_v2_room_server_observer_mqtt,heltec_tracker_v2,node_firmware,Full,True,True,False,True,True,False,True,False,False,False,False,False,heltec_tracker_v2_room_server_observer_mqtt,heltec_tracker_v2_room_server,heltec_tracker_v2_room_server_observer_mqtt,exact ordinary Full group choice,full|heltec_tracker_v2_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_tracker_v2_terminal_chat,heltec_tracker_v2,node_firmware,legacy,False,False,False,False,False,False,False,False,False,False,False,True,heltec_tracker_v2_terminal_chat,heltec_tracker_v2_companion_radio_full_femon,heltec_tracker_v2_companion_radio_full_femon,canonical replacement -> named Full Companion,auto|heltec_tracker_v2_terminal_chat,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_tracker_v2_companion_radio_usb_femon,heltec_tracker_v2,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,heltec_tracker_v2_companion_radio_usb_femon,heltec_tracker_v2_companion_radio_full_femon,heltec_tracker_v2_companion_radio_full_femon,canonical replacement -> named Full Companion,auto|heltec_tracker_v2_companion_radio_usb_femon,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_tracker_v2_companion_radio_usb_femoff,heltec_tracker_v2,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,True,False,True,False,True,heltec_tracker_v2_companion_radio_usb_femoff,heltec_tracker_v2_companion_radio_full_femon,heltec_tracker_v2_companion_radio_full_femon,canonical replacement -> named Full Companion,auto|heltec_tracker_v2_companion_radio_usb_femoff,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_tracker_v2_companion_radio_ble_femon,heltec_tracker_v2,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,heltec_tracker_v2_companion_radio_ble_femon,heltec_tracker_v2_companion_radio_full_femon,heltec_tracker_v2_companion_radio_full_femon,canonical replacement -> named Full Companion,auto|heltec_tracker_v2_companion_radio_ble_femon,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_tracker_v2_companion_radio_ble_femoff,heltec_tracker_v2,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,True,False,True,False,True,heltec_tracker_v2_companion_radio_ble_femoff,heltec_tracker_v2_companion_radio_full_femon,heltec_tracker_v2_companion_radio_full_femon,canonical replacement -> named Full Companion,auto|heltec_tracker_v2_companion_radio_ble_femoff,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_tracker_v2_companion_radio_wifi_femon,heltec_tracker_v2,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,heltec_tracker_v2_companion_radio_wifi_femon,heltec_tracker_v2_companion_radio_full_femon,heltec_tracker_v2_companion_radio_full_femon,canonical replacement -> named Full Companion,auto|heltec_tracker_v2_companion_radio_wifi_femon,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_tracker_v2_companion_radio_full_femon,heltec_tracker_v2,named_Full_Companion,Full,True,True,True,False,False,False,False,False,False,True,False,False,heltec_tracker_v2_companion_radio_full_femon,heltec_tracker_v2_companion_radio_full_femon,heltec_tracker_v2_companion_radio_full_femon,named Full Companion,full|heltec_tracker_v2_companion_radio_full_femon,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_tracker_v2_companion_radio_wifi_femoff,heltec_tracker_v2,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,True,False,True,False,True,heltec_tracker_v2_companion_radio_wifi_femoff,heltec_tracker_v2_companion_radio_full_femon,heltec_tracker_v2_companion_radio_full_femon,canonical runtime FEM alias -> named Full Companion,auto|heltec_tracker_v2_companion_radio_wifi_femoff,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_tracker_v2_sensor,heltec_tracker_v2,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,heltec_tracker_v2_sensor,heltec_tracker_v2_sensor,heltec_tracker_v2_sensor,exact ordinary Full group choice,full|heltec_tracker_v2_sensor,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_tracker_v2_kiss_modem,heltec_tracker_v2,host_modem_KISS,KISS,True,False,False,False,False,False,False,False,False,False,True,False,heltec_tracker_v2_kiss_modem,,,,auto|heltec_tracker_v2_kiss_modem,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_v2_repeater,heltec_wifi_lora_32_V2,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,Heltec_v2_repeater,Heltec_v2_repeater,Heltec_v2_repeater,exact ordinary Full group choice,full|Heltec_v2_repeater,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_v2_repeater_bridge_espnow,heltec_wifi_lora_32_V2,node_firmware,Full,False,False,False,True,True,False,True,False,False,False,False,True,Heltec_v2_repeater_bridge_espnow,Heltec_v2_repeater,Heltec_v2_repeater,exact ordinary Full group choice,full|Heltec_v2_repeater_bridge_espnow,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_v2_room_server,heltec_wifi_lora_32_V2,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,Heltec_v2_room_server,Heltec_v2_room_server,Heltec_v2_room_server,exact ordinary Full group choice,full|Heltec_v2_room_server,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_v2_terminal_chat,heltec_wifi_lora_32_V2,node_firmware,legacy,False,False,False,False,False,False,False,False,False,False,False,True,Heltec_v2_terminal_chat,Heltec_v2_companion_radio_full,Heltec_v2_companion_radio_wifi,canonical replacement -> named Full Companion,auto|Heltec_v2_terminal_chat,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_v2_companion_radio_usb,heltec_wifi_lora_32_V2,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,Heltec_v2_companion_radio_usb,Heltec_v2_companion_radio_full,Heltec_v2_companion_radio_wifi,canonical replacement -> named Full Companion,auto|Heltec_v2_companion_radio_usb,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_v2_companion_radio_ble,heltec_wifi_lora_32_V2,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,Heltec_v2_companion_radio_ble,Heltec_v2_companion_radio_full,Heltec_v2_companion_radio_wifi,canonical replacement -> named Full Companion,auto|Heltec_v2_companion_radio_ble,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_v2_companion_radio_ble_ps,heltec_wifi_lora_32_V2,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,True,False,True,False,True,Heltec_v2_companion_radio_ble_ps,Heltec_v2_companion_radio_full,Heltec_v2_companion_radio_wifi,saved powersave alias -> canonical replacement -> named Full Companion,auto|Heltec_v2_companion_radio_ble_ps,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_v2_companion_radio_wifi,heltec_wifi_lora_32_V2,legacy_Companion_or_transport_alias,Full,False,False,False,True,True,False,False,False,False,True,False,True,Heltec_v2_companion_radio_wifi,Heltec_v2_companion_radio_full,Heltec_v2_companion_radio_wifi,canonical replacement -> named Full Companion,full|Heltec_v2_companion_radio_wifi,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_v2_kiss_modem,heltec_wifi_lora_32_V2,host_modem_KISS,KISS,True,False,False,False,False,False,False,False,False,False,True,False,Heltec_v2_kiss_modem,,,,auto|Heltec_v2_kiss_modem,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_v3_repeater,esp32-s3-devkitc-1,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,Heltec_v3_repeater,Heltec_v3_repeater,Heltec_v3_repeater_observer_mqtt,exact ordinary Full group choice,full|Heltec_v3_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_v3_repeater_bridge_rs232,esp32-s3-devkitc-1,node_firmware,Full,False,False,False,True,True,False,False,False,False,False,False,True,Heltec_v3_repeater_bridge_rs232,Heltec_v3_repeater,Heltec_v3_repeater_observer_mqtt,canonical replacement -> exact ordinary Full group choice,full|Heltec_v3_repeater_bridge_rs232,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_v3_repeater_bridge_espnow,esp32-s3-devkitc-1,node_firmware,Full,False,False,False,True,True,False,True,False,False,False,False,True,Heltec_v3_repeater_bridge_espnow,Heltec_v3_repeater,Heltec_v3_repeater_observer_mqtt,exact ordinary Full group choice,full|Heltec_v3_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_v3_repeater_observer_mqtt,esp32-s3-devkitc-1,node_firmware,Full,True,True,False,True,True,False,True,False,False,False,False,False,Heltec_v3_repeater_observer_mqtt,Heltec_v3_repeater,Heltec_v3_repeater_observer_mqtt,exact ordinary Full group choice,full|Heltec_v3_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_v3_repeater_observer_mqtt_sim,esp32-s3-devkitc-1,development_or_migration_utility,source,False,False,False,True,True,False,True,False,False,False,False,True,Heltec_v3_repeater_observer_mqtt_sim,,,,full|Heltec_v3_repeater_observer_mqtt_sim,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_v3_room_server,esp32-s3-devkitc-1,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,Heltec_v3_room_server,Heltec_v3_room_server,Heltec_v3_room_server_observer_mqtt,exact ordinary Full group choice,full|Heltec_v3_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_v3_room_server_observer_mqtt,esp32-s3-devkitc-1,node_firmware,Full,True,True,False,True,True,False,True,False,False,False,False,False,Heltec_v3_room_server_observer_mqtt,Heltec_v3_room_server,Heltec_v3_room_server_observer_mqtt,exact ordinary Full group choice,full|Heltec_v3_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_v3_terminal_chat,esp32-s3-devkitc-1,node_firmware,legacy,False,False,False,False,False,False,False,False,False,False,False,True,Heltec_v3_terminal_chat,Heltec_v3_companion_radio_full,Heltec_v3_companion_radio_full,canonical replacement -> named Full Companion,auto|Heltec_v3_terminal_chat,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_v3_companion_radio_usb,esp32-s3-devkitc-1,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,Heltec_v3_companion_radio_usb,Heltec_v3_companion_radio_full,Heltec_v3_companion_radio_full,canonical replacement -> named Full Companion,auto|Heltec_v3_companion_radio_usb,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_v3_companion_radio_ble,esp32-s3-devkitc-1,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,Heltec_v3_companion_radio_ble,Heltec_v3_companion_radio_full,Heltec_v3_companion_radio_full,canonical replacement -> named Full Companion,auto|Heltec_v3_companion_radio_ble,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_v3_companion_radio_ble_ps,esp32-s3-devkitc-1,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,True,False,True,False,True,Heltec_v3_companion_radio_ble_ps,Heltec_v3_companion_radio_full,Heltec_v3_companion_radio_full,saved powersave alias -> canonical replacement -> named Full Companion,auto|Heltec_v3_companion_radio_ble_ps,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_v3_companion_radio_wifi,esp32-s3-devkitc-1,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,Heltec_v3_companion_radio_wifi,Heltec_v3_companion_radio_full,Heltec_v3_companion_radio_full,canonical replacement -> named Full Companion,auto|Heltec_v3_companion_radio_wifi,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_v3_companion_radio_wifi_mqtt,esp32-s3-devkitc-1,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,Heltec_v3_companion_radio_wifi_mqtt,Heltec_v3_companion_radio_full,Heltec_v3_companion_radio_full,canonical replacement -> named Full Companion,auto|Heltec_v3_companion_radio_wifi_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_v3_companion_radio_full,esp32-s3-devkitc-1,named_Full_Companion,Full,True,True,True,False,False,False,False,False,False,True,False,False,Heltec_v3_companion_radio_full,Heltec_v3_companion_radio_full,Heltec_v3_companion_radio_full,named Full Companion,full|Heltec_v3_companion_radio_full,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_v3_sensor,esp32-s3-devkitc-1,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,Heltec_v3_sensor,Heltec_v3_sensor,Heltec_v3_sensor,exact ordinary Full group choice,full|Heltec_v3_sensor,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_WSL3_repeater,esp32-s3-devkitc-1,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,Heltec_WSL3_repeater,Heltec_WSL3_repeater,Heltec_WSL3_repeater_observer_mqtt,exact ordinary Full group choice,full|Heltec_WSL3_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_WSL3_repeater_bridge_rs232,esp32-s3-devkitc-1,node_firmware,Full,False,False,False,True,True,False,False,False,False,False,False,True,Heltec_WSL3_repeater_bridge_rs232,Heltec_WSL3_repeater,Heltec_WSL3_repeater_observer_mqtt,canonical replacement -> exact ordinary Full group choice,full|Heltec_WSL3_repeater_bridge_rs232,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_WSL3_repeater_bridge_espnow,esp32-s3-devkitc-1,node_firmware,Full,False,False,False,True,True,False,True,False,False,False,False,True,Heltec_WSL3_repeater_bridge_espnow,Heltec_WSL3_repeater,Heltec_WSL3_repeater_observer_mqtt,exact ordinary Full group choice,full|Heltec_WSL3_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_WSL3_room_server,esp32-s3-devkitc-1,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,Heltec_WSL3_room_server,Heltec_WSL3_room_server,Heltec_WSL3_room_server_observer_mqtt,exact ordinary Full group choice,full|Heltec_WSL3_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_WSL3_companion_radio_ble,esp32-s3-devkitc-1,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,Heltec_WSL3_companion_radio_ble,Heltec_WSL3_companion_radio_full,Heltec_WSL3_companion_radio_wifi,canonical replacement -> named Full Companion,auto|Heltec_WSL3_companion_radio_ble,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_WSL3_companion_radio_ble_ps,esp32-s3-devkitc-1,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,True,False,True,False,True,Heltec_WSL3_companion_radio_ble_ps,Heltec_WSL3_companion_radio_full,Heltec_WSL3_companion_radio_wifi,saved powersave alias -> canonical replacement -> named Full Companion,auto|Heltec_WSL3_companion_radio_ble_ps,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_WSL3_companion_radio_usb,esp32-s3-devkitc-1,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,Heltec_WSL3_companion_radio_usb,Heltec_WSL3_companion_radio_full,Heltec_WSL3_companion_radio_wifi,canonical replacement -> named Full Companion,auto|Heltec_WSL3_companion_radio_usb,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_WSL3_companion_radio_wifi,esp32-s3-devkitc-1,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,Heltec_WSL3_companion_radio_wifi,Heltec_WSL3_companion_radio_full,Heltec_WSL3_companion_radio_wifi,canonical replacement -> named Full Companion,auto|Heltec_WSL3_companion_radio_wifi,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_WSL3_sensor,esp32-s3-devkitc-1,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,Heltec_WSL3_sensor,Heltec_WSL3_sensor,Heltec_WSL3_sensor,exact ordinary Full group choice,full|Heltec_WSL3_sensor,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_WSL3_repeater_observer_mqtt,esp32-s3-devkitc-1,node_firmware,Full,True,True,False,True,True,False,True,False,False,False,False,False,Heltec_WSL3_repeater_observer_mqtt,Heltec_WSL3_repeater,Heltec_WSL3_repeater_observer_mqtt,exact ordinary Full group choice,full|Heltec_WSL3_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_WSL3_room_server_observer_mqtt,esp32-s3-devkitc-1,node_firmware,Full,True,True,False,True,True,False,True,False,False,False,False,False,Heltec_WSL3_room_server_observer_mqtt,Heltec_WSL3_room_server,Heltec_WSL3_room_server_observer_mqtt,exact ordinary Full group choice,full|Heltec_WSL3_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_v3_kiss_modem,esp32-s3-devkitc-1,host_modem_KISS,KISS,True,False,False,False,False,False,False,False,False,False,True,False,Heltec_v3_kiss_modem,,,,auto|Heltec_v3_kiss_modem,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_repeater,heltec_v4,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,heltec_v4_repeater,heltec_v4_repeater,heltec_v4_repeater_observer_mqtt,exact ordinary Full group choice,full|heltec_v4_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_repeater_legacy_partition_test,heltec_v4,development_or_migration_utility,source,False,False,False,True,False,False,False,False,False,False,False,True,heltec_v4_repeater_legacy_partition_test,,,,full|heltec_v4_repeater_legacy_partition_test,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_expansionkit_repeater,heltec_v4,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,heltec_v4_expansionkit_repeater,heltec_v4_expansionkit_repeater,heltec_v4_expansionkit_repeater_observer_mqtt,exact ordinary Full group choice,full|heltec_v4_expansionkit_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_repeater_bridge_espnow,heltec_v4,node_firmware,Full,False,False,False,True,True,False,True,False,False,False,False,True,heltec_v4_repeater_bridge_espnow,heltec_v4_repeater,heltec_v4_repeater_observer_mqtt,exact ordinary Full group choice,full|heltec_v4_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_repeater_observer_mqtt,heltec_v4,node_firmware,Full,True,True,False,True,True,False,True,False,False,False,False,False,heltec_v4_repeater_observer_mqtt,heltec_v4_repeater,heltec_v4_repeater_observer_mqtt,exact ordinary Full group choice,full|heltec_v4_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_expansionkit_repeater_observer_mqtt,heltec_v4,node_firmware,Full,True,True,False,True,True,False,True,False,False,False,False,False,heltec_v4_expansionkit_repeater_observer_mqtt,heltec_v4_expansionkit_repeater,heltec_v4_expansionkit_repeater_observer_mqtt,exact ordinary Full group choice,full|heltec_v4_expansionkit_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_room_server_observer_mqtt,heltec_v4,node_firmware,Full,True,True,False,True,True,False,True,False,False,False,False,False,heltec_v4_room_server_observer_mqtt,heltec_v4_room_server,heltec_v4_room_server_observer_mqtt,exact ordinary Full group choice,full|heltec_v4_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_expansionkit_room_server_observer_mqtt,heltec_v4,node_firmware,Full,True,True,False,True,True,False,True,False,False,False,False,False,heltec_v4_expansionkit_room_server_observer_mqtt,heltec_v4_expansionkit_room_server_observer_mqtt,heltec_v4_expansionkit_room_server_observer_mqtt,exact ordinary Full group choice,full|heltec_v4_expansionkit_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_room_server,heltec_v4,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,heltec_v4_room_server,heltec_v4_room_server,heltec_v4_room_server_observer_mqtt,exact ordinary Full group choice,full|heltec_v4_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_terminal_chat,heltec_v4,node_firmware,legacy,False,False,False,False,False,False,False,False,False,False,False,True,heltec_v4_terminal_chat,heltec_v4_2_v4_3_companion_radio_full_femon,heltec_v4_2_v4_3_companion_radio_full_femon,canonical replacement -> named Full Companion,auto|heltec_v4_terminal_chat,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_companion_radio_usb_femon,heltec_v4,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,True,False,True,False,True,heltec_v4_companion_radio_usb_femon,heltec_v4_2_v4_3_companion_radio_full_femon,heltec_v4_2_v4_3_companion_radio_full_femon,canonical replacement -> named Full Companion,auto|heltec_v4_companion_radio_usb_femon,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_3_companion_radio_usb_femoff,heltec_v4,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,True,False,True,False,True,heltec_v4_3_companion_radio_usb_femoff,heltec_v4_2_v4_3_companion_radio_full_femon,heltec_v4_2_v4_3_companion_radio_full_femon,canonical replacement -> named Full Companion,auto|heltec_v4_3_companion_radio_usb_femoff,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_companion_radio_usb,heltec_v4,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,heltec_v4_companion_radio_usb,heltec_v4_2_v4_3_companion_radio_full_femon,heltec_v4_2_v4_3_companion_radio_full_femon,canonical replacement -> named Full Companion,auto|heltec_v4_companion_radio_usb,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_companion_radio_usb_ps_femon,heltec_v4,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,True,False,True,False,True,heltec_v4_companion_radio_usb_ps_femon,heltec_v4_2_v4_3_companion_radio_full_femon,heltec_v4_2_v4_3_companion_radio_full_femon,canonical replacement -> named Full Companion,auto|heltec_v4_companion_radio_usb_ps_femon,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_companion_radio_usb_ps_femoff,heltec_v4,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,True,False,True,False,True,heltec_v4_companion_radio_usb_ps_femoff,heltec_v4_2_v4_3_companion_radio_full_femon,heltec_v4_2_v4_3_companion_radio_full_femon,canonical replacement -> named Full Companion,auto|heltec_v4_companion_radio_usb_ps_femoff,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_companion_radio_ble_femon,heltec_v4,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,True,False,True,False,True,heltec_v4_companion_radio_ble_femon,heltec_v4_2_v4_3_companion_radio_full_femon,heltec_v4_2_v4_3_companion_radio_full_femon,canonical replacement -> named Full Companion,auto|heltec_v4_companion_radio_ble_femon,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_3_companion_radio_ble_femoff,heltec_v4,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,True,False,True,False,True,heltec_v4_3_companion_radio_ble_femoff,heltec_v4_2_v4_3_companion_radio_full_femon,heltec_v4_2_v4_3_companion_radio_full_femon,canonical replacement -> named Full Companion,auto|heltec_v4_3_companion_radio_ble_femoff,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_companion_radio_ble,heltec_v4,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,heltec_v4_companion_radio_ble,heltec_v4_2_v4_3_companion_radio_full_femon,heltec_v4_2_v4_3_companion_radio_full_femon,canonical replacement -> named Full Companion,auto|heltec_v4_companion_radio_ble,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_companion_radio_ble_ps_femon,heltec_v4,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,True,False,True,False,True,heltec_v4_companion_radio_ble_ps_femon,heltec_v4_2_v4_3_companion_radio_full_femon,heltec_v4_2_v4_3_companion_radio_full_femon,canonical replacement -> named Full Companion,auto|heltec_v4_companion_radio_ble_ps_femon,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_3_companion_radio_ble_ps_femoff,heltec_v4,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,True,False,True,False,True,heltec_v4_3_companion_radio_ble_ps_femoff,heltec_v4_2_v4_3_companion_radio_full_femon,heltec_v4_2_v4_3_companion_radio_full_femon,canonical replacement -> named Full Companion,auto|heltec_v4_3_companion_radio_ble_ps_femoff,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_companion_radio_wifi_femon,heltec_v4,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,heltec_v4_companion_radio_wifi_femon,heltec_v4_2_v4_3_companion_radio_full_femon,heltec_v4_2_v4_3_companion_radio_full_femon,canonical replacement -> named Full Companion,auto|heltec_v4_companion_radio_wifi_femon,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_3_companion_radio_wifi_femoff,heltec_v4,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,True,False,True,False,True,heltec_v4_3_companion_radio_wifi_femoff,heltec_v4_2_v4_3_companion_radio_full_femon,heltec_v4_2_v4_3_companion_radio_full_femon,canonical replacement -> named Full Companion,auto|heltec_v4_3_companion_radio_wifi_femoff,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_companion_radio_wifi_mqtt_femon,heltec_v4,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,heltec_v4_companion_radio_wifi_mqtt_femon,heltec_v4_2_v4_3_companion_radio_full_femon,heltec_v4_2_v4_3_companion_radio_full_femon,canonical replacement -> named Full Companion,auto|heltec_v4_companion_radio_wifi_mqtt_femon,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_3_companion_radio_wifi_mqtt_femoff,heltec_v4,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,True,False,True,False,True,heltec_v4_3_companion_radio_wifi_mqtt_femoff,heltec_v4_2_v4_3_companion_radio_full_femon,heltec_v4_2_v4_3_companion_radio_full_femon,canonical replacement -> named Full Companion,auto|heltec_v4_3_companion_radio_wifi_mqtt_femoff,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_2_v4_3_companion_radio_full_femon,heltec_v4,named_Full_Companion,Full,True,True,True,False,False,False,False,False,False,True,False,False,heltec_v4_2_v4_3_companion_radio_full_femon,heltec_v4_2_v4_3_companion_radio_full_femon,heltec_v4_2_v4_3_companion_radio_full_femon,named Full Companion,full|heltec_v4_2_v4_3_companion_radio_full_femon,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_3_companion_radio_full_femoff,heltec_v4,named_Full_Companion,Full,False,False,True,False,False,False,False,True,False,True,False,True,heltec_v4_3_companion_radio_full_femoff,heltec_v4_2_v4_3_companion_radio_full_femon,heltec_v4_2_v4_3_companion_radio_full_femon,canonical runtime FEM alias -> named Full Companion,full|heltec_v4_3_companion_radio_full_femoff,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_sensor,heltec_v4,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,heltec_v4_sensor,heltec_v4_sensor,heltec_v4_sensor,exact ordinary Full group choice,full|heltec_v4_sensor,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_tft_repeater,heltec_v4,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,heltec_v4_tft_repeater,heltec_v4_tft_repeater,heltec_v4_tft_repeater,exact ordinary Full group choice,full|heltec_v4_tft_repeater,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_tft_repeater_bridge_espnow,heltec_v4,node_firmware,Full,False,False,False,True,True,False,True,False,False,False,False,True,heltec_v4_tft_repeater_bridge_espnow,heltec_v4_tft_repeater,heltec_v4_tft_repeater,exact ordinary Full group choice,full|heltec_v4_tft_repeater_bridge_espnow,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_tft_room_server,heltec_v4,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,heltec_v4_tft_room_server,heltec_v4_tft_room_server,heltec_v4_tft_room_server,exact ordinary Full group choice,full|heltec_v4_tft_room_server,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_tft_terminal_chat,heltec_v4,node_firmware,legacy,False,False,False,False,False,False,False,False,False,False,False,True,heltec_v4_tft_terminal_chat,heltec_v4_tft_companion_radio_full_femon,heltec_v4_tft_companion_radio_full_femon,canonical replacement -> named Full Companion,auto|heltec_v4_tft_terminal_chat,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_tft_companion_radio_usb_femon,heltec_v4,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,heltec_v4_tft_companion_radio_usb_femon,heltec_v4_tft_companion_radio_full_femon,heltec_v4_tft_companion_radio_full_femon,canonical replacement -> named Full Companion,auto|heltec_v4_tft_companion_radio_usb_femon,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_3_tft_companion_radio_usb_femoff,heltec_v4,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,True,False,True,False,True,heltec_v4_3_tft_companion_radio_usb_femoff,heltec_v4_tft_companion_radio_full_femon,heltec_v4_tft_companion_radio_full_femon,canonical replacement -> named Full Companion,auto|heltec_v4_3_tft_companion_radio_usb_femoff,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_tft_companion_radio_ble_femon,heltec_v4,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,heltec_v4_tft_companion_radio_ble_femon,heltec_v4_tft_companion_radio_full_femon,heltec_v4_tft_companion_radio_full_femon,canonical replacement -> named Full Companion,auto|heltec_v4_tft_companion_radio_ble_femon,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_3_tft_companion_radio_ble_femoff,heltec_v4,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,True,False,True,False,True,heltec_v4_3_tft_companion_radio_ble_femoff,heltec_v4_tft_companion_radio_full_femon,heltec_v4_tft_companion_radio_full_femon,canonical replacement -> named Full Companion,auto|heltec_v4_3_tft_companion_radio_ble_femoff,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_expansionkit_tft_companion_radio_ble_femon,heltec_v4,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,heltec_v4_expansionkit_tft_companion_radio_ble_femon,heltec_v4_expansionkit_tft_companion_radio_full_femon,heltec_v4_expansionkit_tft_companion_radio_full_femon,canonical replacement -> named Full Companion,auto|heltec_v4_expansionkit_tft_companion_radio_ble_femon,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_3_expansionkit_tft_companion_radio_ble_femoff,heltec_v4,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,True,False,True,False,True,heltec_v4_3_expansionkit_tft_companion_radio_ble_femoff,heltec_v4_expansionkit_tft_companion_radio_full_femon,heltec_v4_expansionkit_tft_companion_radio_full_femon,canonical replacement -> named Full Companion,auto|heltec_v4_3_expansionkit_tft_companion_radio_ble_femoff,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_expansionkit_tft_companion_radio_ble_ps,heltec_v4,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,True,False,True,False,True,heltec_v4_expansionkit_tft_companion_radio_ble_ps,heltec_v4_expansionkit_tft_companion_radio_full_femon,heltec_v4_expansionkit_tft_companion_radio_full_femon,canonical replacement -> named Full Companion,auto|heltec_v4_expansionkit_tft_companion_radio_ble_ps,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_expansionkit_tft_companion_radio_full_femon,heltec_v4,named_Full_Companion,Full,True,True,True,False,False,False,False,False,False,True,False,False,heltec_v4_expansionkit_tft_companion_radio_full_femon,heltec_v4_expansionkit_tft_companion_radio_full_femon,heltec_v4_expansionkit_tft_companion_radio_full_femon,named Full Companion,full|heltec_v4_expansionkit_tft_companion_radio_full_femon,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_tft_companion_radio_wifi_femon,heltec_v4,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,heltec_v4_tft_companion_radio_wifi_femon,heltec_v4_tft_companion_radio_full_femon,heltec_v4_tft_companion_radio_full_femon,canonical replacement -> named Full Companion,auto|heltec_v4_tft_companion_radio_wifi_femon,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_3_tft_companion_radio_wifi_femoff,heltec_v4,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,True,False,True,False,True,heltec_v4_3_tft_companion_radio_wifi_femoff,heltec_v4_tft_companion_radio_full_femon,heltec_v4_tft_companion_radio_full_femon,canonical replacement -> named Full Companion,auto|heltec_v4_3_tft_companion_radio_wifi_femoff,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_tft_companion_radio_full_femon,heltec_v4,named_Full_Companion,Full,True,True,True,False,False,False,False,False,False,True,False,False,heltec_v4_tft_companion_radio_full_femon,heltec_v4_tft_companion_radio_full_femon,heltec_v4_tft_companion_radio_full_femon,named Full Companion,full|heltec_v4_tft_companion_radio_full_femon,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_3_tft_companion_radio_full_femoff,heltec_v4,named_Full_Companion,Full,False,False,True,False,False,False,False,True,False,True,False,True,heltec_v4_3_tft_companion_radio_full_femoff,heltec_v4_tft_companion_radio_full_femon,heltec_v4_tft_companion_radio_full_femon,canonical runtime FEM alias -> named Full Companion,full|heltec_v4_3_tft_companion_radio_full_femoff,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_tft_sensor,heltec_v4,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,heltec_v4_tft_sensor,heltec_v4_tft_sensor,heltec_v4_tft_sensor,exact ordinary Full group choice,full|heltec_v4_tft_sensor,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_kiss_modem,heltec_v4,host_modem_KISS,KISS,True,False,False,False,False,False,False,False,False,False,True,False,heltec_v4_kiss_modem,,,,auto|heltec_v4_kiss_modem,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_partition_expander,heltec_v4_migrator,development_or_migration_utility,source,False,False,False,False,False,False,False,False,False,False,False,True,heltec_v4_partition_expander,,,,auto|heltec_v4_partition_expander,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_partition_migrator,heltec_v4_migrator,development_or_migration_utility,source,False,False,False,False,False,False,False,False,False,False,False,True,heltec_v4_partition_migrator,,,,auto|heltec_v4_partition_migrator,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_partition_migrator_lora_repeater,heltec_v4_migrator,development_or_migration_utility,source,False,False,False,False,False,False,False,False,False,False,False,True,heltec_v4_partition_migrator_lora_repeater,,,,auto|heltec_v4_partition_migrator_lora_repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_partition_migrator_test_hold,heltec_v4_migrator,development_or_migration_utility,source,False,False,False,False,False,False,False,False,False,False,False,True,heltec_v4_partition_migrator_test_hold,,,,auto|heltec_v4_partition_migrator_test_hold,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_partition_migrator_test_usb_diagnostic,heltec_v4_migrator,development_or_migration_utility,source,False,False,False,False,False,False,False,False,False,False,False,True,heltec_v4_partition_migrator_test_usb_diagnostic,,,,auto|heltec_v4_partition_migrator_test_usb_diagnostic,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_r8_repeater,heltec_v4_r8,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,heltec_v4_r8_repeater,heltec_v4_r8_repeater,heltec_v4_r8_repeater_observer_mqtt,exact ordinary Full group choice,full|heltec_v4_r8_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_r8_repeater_observer_mqtt,heltec_v4_r8,node_firmware,Full,True,True,False,True,True,False,True,False,False,False,False,False,heltec_v4_r8_repeater_observer_mqtt,heltec_v4_r8_repeater,heltec_v4_r8_repeater_observer_mqtt,exact ordinary Full group choice,full|heltec_v4_r8_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_r8_room_server,heltec_v4_r8,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,heltec_v4_r8_room_server,heltec_v4_r8_room_server,heltec_v4_r8_room_server_observer_mqtt,exact ordinary Full group choice,full|heltec_v4_r8_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_r8_room_server_observer_mqtt,heltec_v4_r8,node_firmware,Full,True,True,False,True,True,False,True,False,False,False,False,False,heltec_v4_r8_room_server_observer_mqtt,heltec_v4_r8_room_server,heltec_v4_r8_room_server_observer_mqtt,exact ordinary Full group choice,full|heltec_v4_r8_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_r8_terminal_chat,heltec_v4_r8,node_firmware,legacy,False,False,False,False,False,False,False,False,False,False,False,True,heltec_v4_r8_terminal_chat,heltec_v4_r8_companion_radio_full,heltec_v4_r8_companion_radio_full,canonical replacement -> named Full Companion,auto|heltec_v4_r8_terminal_chat,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_r8_companion_radio_usb,heltec_v4_r8,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,heltec_v4_r8_companion_radio_usb,heltec_v4_r8_companion_radio_full,heltec_v4_r8_companion_radio_full,canonical replacement -> named Full Companion,auto|heltec_v4_r8_companion_radio_usb,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_r8_companion_radio_ble,heltec_v4_r8,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,heltec_v4_r8_companion_radio_ble,heltec_v4_r8_companion_radio_full,heltec_v4_r8_companion_radio_full,canonical replacement -> named Full Companion,auto|heltec_v4_r8_companion_radio_ble,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_r8_companion_radio_ble_ps,heltec_v4_r8,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,True,False,True,False,True,heltec_v4_r8_companion_radio_ble_ps,heltec_v4_r8_companion_radio_full,heltec_v4_r8_companion_radio_full,canonical replacement -> named Full Companion,auto|heltec_v4_r8_companion_radio_ble_ps,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_r8_companion_radio_wifi,heltec_v4_r8,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,heltec_v4_r8_companion_radio_wifi,heltec_v4_r8_companion_radio_full,heltec_v4_r8_companion_radio_full,canonical replacement -> named Full Companion,auto|heltec_v4_r8_companion_radio_wifi,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_r8_companion_radio_full,heltec_v4_r8,named_Full_Companion,Full,True,True,True,False,False,False,False,False,False,True,False,False,heltec_v4_r8_companion_radio_full,heltec_v4_r8_companion_radio_full,heltec_v4_r8_companion_radio_full,named Full Companion,full|heltec_v4_r8_companion_radio_full,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_r8_sensor,heltec_v4_r8,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,heltec_v4_r8_sensor,heltec_v4_r8_sensor,heltec_v4_r8_sensor,exact ordinary Full group choice,full|heltec_v4_r8_sensor,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_r8_tft_repeater,heltec_v4_r8,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,heltec_v4_r8_tft_repeater,heltec_v4_r8_tft_repeater,heltec_v4_r8_tft_repeater_observer_mqtt,exact ordinary Full group choice,full|heltec_v4_r8_tft_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_r8_tft_repeater_observer_mqtt,heltec_v4_r8,node_firmware,Full,True,True,False,True,True,False,True,False,False,False,False,False,heltec_v4_r8_tft_repeater_observer_mqtt,heltec_v4_r8_tft_repeater,heltec_v4_r8_tft_repeater_observer_mqtt,exact ordinary Full group choice,full|heltec_v4_r8_tft_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_r8_tft_portrait_repeater_observer_mqtt,heltec_v4_r8,node_firmware,Full,True,True,False,True,True,False,True,False,False,False,False,False,heltec_v4_r8_tft_portrait_repeater_observer_mqtt,heltec_v4_r8_tft_portrait_repeater_observer_mqtt,heltec_v4_r8_tft_portrait_repeater_observer_mqtt,exact ordinary Full group choice,full|heltec_v4_r8_tft_portrait_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_r8_tft_room_server,heltec_v4_r8,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,heltec_v4_r8_tft_room_server,heltec_v4_r8_tft_room_server,heltec_v4_r8_tft_room_server_observer_mqtt,exact ordinary Full group choice,full|heltec_v4_r8_tft_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_r8_tft_room_server_observer_mqtt,heltec_v4_r8,node_firmware,Full,True,True,False,True,True,False,True,False,False,False,False,False,heltec_v4_r8_tft_room_server_observer_mqtt,heltec_v4_r8_tft_room_server,heltec_v4_r8_tft_room_server_observer_mqtt,exact ordinary Full group choice,full|heltec_v4_r8_tft_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_r8_tft_portrait_room_server_observer_mqtt,heltec_v4_r8,node_firmware,Full,True,True,False,True,True,False,True,False,False,False,False,False,heltec_v4_r8_tft_portrait_room_server_observer_mqtt,heltec_v4_r8_tft_portrait_room_server_observer_mqtt,heltec_v4_r8_tft_portrait_room_server_observer_mqtt,exact ordinary Full group choice,full|heltec_v4_r8_tft_portrait_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_r8_tft_terminal_chat,heltec_v4_r8,node_firmware,legacy,False,False,False,False,False,False,False,False,False,False,False,True,heltec_v4_r8_tft_terminal_chat,heltec_v4_r8_tft_companion_radio_full,heltec_v4_r8_tft_companion_radio_full,canonical replacement -> named Full Companion,auto|heltec_v4_r8_tft_terminal_chat,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_r8_tft_companion_radio_usb,heltec_v4_r8,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,heltec_v4_r8_tft_companion_radio_usb,heltec_v4_r8_tft_companion_radio_full,heltec_v4_r8_tft_companion_radio_full,canonical replacement -> named Full Companion,auto|heltec_v4_r8_tft_companion_radio_usb,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_r8_tft_companion_radio_ble,heltec_v4_r8,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,heltec_v4_r8_tft_companion_radio_ble,heltec_v4_r8_tft_companion_radio_full,heltec_v4_r8_tft_companion_radio_full,canonical replacement -> named Full Companion,auto|heltec_v4_r8_tft_companion_radio_ble,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_r8_tft_companion_radio_wifi,heltec_v4_r8,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,heltec_v4_r8_tft_companion_radio_wifi,heltec_v4_r8_tft_companion_radio_full,heltec_v4_r8_tft_companion_radio_full,canonical replacement -> named Full Companion,auto|heltec_v4_r8_tft_companion_radio_wifi,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_r8_tft_companion_radio_full,heltec_v4_r8,named_Full_Companion,Full,True,True,True,False,False,False,False,False,False,True,False,False,heltec_v4_r8_tft_companion_radio_full,heltec_v4_r8_tft_companion_radio_full,heltec_v4_r8_tft_companion_radio_full,named Full Companion,full|heltec_v4_r8_tft_companion_radio_full,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_r8_tft_sensor,heltec_v4_r8,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,heltec_v4_r8_tft_sensor,heltec_v4_r8_tft_sensor,heltec_v4_r8_tft_sensor,exact ordinary Full group choice,full|heltec_v4_r8_tft_sensor,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_r8_kiss_modem,heltec_v4_r8,host_modem_KISS,KISS,True,False,False,False,False,False,False,False,False,False,True,False,heltec_v4_r8_kiss_modem,,,,auto|heltec_v4_r8_kiss_modem,not measured by this static routing audit +tracked_primary,raw_platformio_environment,heltec_v4_r8_tft_kiss_modem,heltec_v4_r8,host_modem_KISS,KISS,True,False,False,False,False,False,False,False,False,False,True,False,heltec_v4_r8_tft_kiss_modem,,,,auto|heltec_v4_r8_tft_kiss_modem,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_Wireless_Paper_companion_radio_ble,esp32-s3-devkitc-1,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,Heltec_Wireless_Paper_companion_radio_ble,Heltec_Wireless_Paper_companion_radio_full,Heltec_Wireless_Paper_companion_radio_ble,canonical replacement -> named Full Companion,auto|Heltec_Wireless_Paper_companion_radio_ble,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_Wireless_Paper_companion_radio_ble_ps,esp32-s3-devkitc-1,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,True,False,True,False,True,Heltec_Wireless_Paper_companion_radio_ble_ps,Heltec_Wireless_Paper_companion_radio_full,Heltec_Wireless_Paper_companion_radio_ble,saved powersave alias -> canonical replacement -> named Full Companion,auto|Heltec_Wireless_Paper_companion_radio_ble_ps,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_Wireless_Paper_companion_radio_usb,esp32-s3-devkitc-1,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,Heltec_Wireless_Paper_companion_radio_usb,Heltec_Wireless_Paper_companion_radio_full,Heltec_Wireless_Paper_companion_radio_ble,canonical replacement -> named Full Companion,auto|Heltec_Wireless_Paper_companion_radio_usb,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_Wireless_Paper_repeater,esp32-s3-devkitc-1,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,Heltec_Wireless_Paper_repeater,Heltec_Wireless_Paper_repeater,Heltec_Wireless_Paper_repeater_observer_mqtt,exact ordinary Full group choice,full|Heltec_Wireless_Paper_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_Wireless_Paper_repeater_bridge_espnow,esp32-s3-devkitc-1,node_firmware,Full,False,False,False,True,True,False,True,False,False,False,False,True,Heltec_Wireless_Paper_repeater_bridge_espnow,Heltec_Wireless_Paper_repeater,Heltec_Wireless_Paper_repeater_observer_mqtt,exact ordinary Full group choice,full|Heltec_Wireless_Paper_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_Wireless_Paper_room_server,esp32-s3-devkitc-1,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,Heltec_Wireless_Paper_room_server,Heltec_Wireless_Paper_room_server,Heltec_Wireless_Paper_room_server_observer_mqtt,exact ordinary Full group choice,full|Heltec_Wireless_Paper_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_Wireless_Paper_kiss_modem,esp32-s3-devkitc-1,host_modem_KISS,KISS,True,False,False,False,False,False,False,False,False,False,True,False,Heltec_Wireless_Paper_kiss_modem,,,,auto|Heltec_Wireless_Paper_kiss_modem,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_Wireless_Paper_repeater_observer_mqtt,esp32-s3-devkitc-1,node_firmware,Full,True,True,False,True,True,False,True,False,False,False,False,False,Heltec_Wireless_Paper_repeater_observer_mqtt,Heltec_Wireless_Paper_repeater,Heltec_Wireless_Paper_repeater_observer_mqtt,exact ordinary Full group choice,full|Heltec_Wireless_Paper_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Heltec_Wireless_Paper_room_server_observer_mqtt,esp32-s3-devkitc-1,node_firmware,Full,True,True,False,True,True,False,True,False,False,False,False,False,Heltec_Wireless_Paper_room_server_observer_mqtt,Heltec_Wireless_Paper_room_server,Heltec_Wireless_Paper_room_server_observer_mqtt,exact ordinary Full group choice,full|Heltec_Wireless_Paper_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,LilyGo_T3S3_sx1262_repeater,t3_s3_v1_x,node_firmware,legacy,True,True,False,True,False,True,False,False,False,False,False,False,LilyGo_T3S3_sx1262_repeater,LilyGo_T3S3_sx1262_repeater,LilyGo_T3S3_sx1262_repeater_observer_mqtt,exact ordinary Full group choice,full|LilyGo_T3S3_sx1262_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,LilyGo_T3S3_sx1262_repeater_bridge_espnow,t3_s3_v1_x,node_firmware,Full,False,False,False,True,False,False,True,False,False,False,False,True,LilyGo_T3S3_sx1262_repeater_bridge_espnow,LilyGo_T3S3_sx1262_repeater,LilyGo_T3S3_sx1262_repeater_observer_mqtt,exact ordinary Full group choice,full|LilyGo_T3S3_sx1262_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,LilyGo_T3S3_sx1262_repeater_observer_mqtt,t3_s3_v1_x,node_firmware,Full,True,True,False,True,False,False,True,False,False,False,False,False,LilyGo_T3S3_sx1262_repeater_observer_mqtt,LilyGo_T3S3_sx1262_repeater,LilyGo_T3S3_sx1262_repeater_observer_mqtt,exact ordinary Full group choice,full|LilyGo_T3S3_sx1262_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,LilyGo_T3S3_sx1262_room_server_observer_mqtt,t3_s3_v1_x,node_firmware,Full,True,True,False,True,False,False,True,False,False,False,False,False,LilyGo_T3S3_sx1262_room_server_observer_mqtt,LilyGo_T3S3_sx1262_room_server,LilyGo_T3S3_sx1262_room_server_observer_mqtt,exact ordinary Full group choice,full|LilyGo_T3S3_sx1262_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,LilyGo_T3S3_sx1262_terminal_chat,t3_s3_v1_x,node_firmware,legacy,False,False,False,False,False,False,False,False,False,False,False,True,LilyGo_T3S3_sx1262_terminal_chat,LilyGo_T3S3_sx1262_companion_radio_full,LilyGo_T3S3_sx1262_companion_radio_ble,canonical replacement -> named Full Companion,auto|LilyGo_T3S3_sx1262_terminal_chat,not measured by this static routing audit +tracked_primary,raw_platformio_environment,LilyGo_T3S3_sx1262_room_server,t3_s3_v1_x,node_firmware,legacy,True,True,False,True,False,True,False,False,False,False,False,False,LilyGo_T3S3_sx1262_room_server,LilyGo_T3S3_sx1262_room_server,LilyGo_T3S3_sx1262_room_server_observer_mqtt,exact ordinary Full group choice,full|LilyGo_T3S3_sx1262_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,LilyGo_T3S3_sx1262_companion_radio_usb,t3_s3_v1_x,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,LilyGo_T3S3_sx1262_companion_radio_usb,LilyGo_T3S3_sx1262_companion_radio_full,LilyGo_T3S3_sx1262_companion_radio_ble,canonical replacement -> named Full Companion,auto|LilyGo_T3S3_sx1262_companion_radio_usb,not measured by this static routing audit +tracked_primary,raw_platformio_environment,LilyGo_T3S3_sx1262_companion_radio_ble,t3_s3_v1_x,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,LilyGo_T3S3_sx1262_companion_radio_ble,LilyGo_T3S3_sx1262_companion_radio_full,LilyGo_T3S3_sx1262_companion_radio_ble,canonical replacement -> named Full Companion,auto|LilyGo_T3S3_sx1262_companion_radio_ble,not measured by this static routing audit +tracked_primary,raw_platformio_environment,LilyGo_T3S3_sx1262_companion_radio_ble_ps,t3_s3_v1_x,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,True,False,True,False,True,LilyGo_T3S3_sx1262_companion_radio_ble_ps,LilyGo_T3S3_sx1262_companion_radio_full,LilyGo_T3S3_sx1262_companion_radio_ble,saved powersave alias -> canonical replacement -> named Full Companion,auto|LilyGo_T3S3_sx1262_companion_radio_ble_ps,not measured by this static routing audit +tracked_primary,raw_platformio_environment,LilyGo_T3S3_sx1262_kiss_modem,t3_s3_v1_x,host_modem_KISS,KISS,True,False,False,False,False,False,False,False,False,False,True,False,LilyGo_T3S3_sx1262_kiss_modem,,,,auto|LilyGo_T3S3_sx1262_kiss_modem,not measured by this static routing audit +tracked_primary,raw_platformio_environment,LilyGo_T3S3_sx1276_repeater,t3_s3_v1_x,node_firmware,legacy,True,True,False,True,False,True,False,False,False,False,False,False,LilyGo_T3S3_sx1276_repeater,LilyGo_T3S3_sx1276_repeater,LilyGo_T3S3_sx1276_repeater_observer_mqtt,exact ordinary Full group choice,full|LilyGo_T3S3_sx1276_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,LilyGo_T3S3_sx1276_repeater_bridge_espnow,t3_s3_v1_x,node_firmware,Full,False,False,False,True,False,False,True,False,False,False,False,True,LilyGo_T3S3_sx1276_repeater_bridge_espnow,LilyGo_T3S3_sx1276_repeater,LilyGo_T3S3_sx1276_repeater_observer_mqtt,exact ordinary Full group choice,full|LilyGo_T3S3_sx1276_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,LilyGo_T3S3_sx1276_terminal_chat,t3_s3_v1_x,node_firmware,legacy,False,False,False,False,False,False,False,False,False,False,False,True,LilyGo_T3S3_sx1276_terminal_chat,LilyGo_T3S3_sx1276_companion_radio_full,LilyGo_T3S3_sx1276_companion_radio_ble,canonical replacement -> named Full Companion,auto|LilyGo_T3S3_sx1276_terminal_chat,not measured by this static routing audit +tracked_primary,raw_platformio_environment,LilyGo_T3S3_sx1276_room_server,t3_s3_v1_x,node_firmware,legacy,True,True,False,True,False,True,False,False,False,False,False,False,LilyGo_T3S3_sx1276_room_server,LilyGo_T3S3_sx1276_room_server,LilyGo_T3S3_sx1276_room_server_observer_mqtt,exact ordinary Full group choice,full|LilyGo_T3S3_sx1276_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,LilyGo_T3S3_sx1276_companion_radio_usb,t3_s3_v1_x,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,LilyGo_T3S3_sx1276_companion_radio_usb,LilyGo_T3S3_sx1276_companion_radio_full,LilyGo_T3S3_sx1276_companion_radio_ble,canonical replacement -> named Full Companion,auto|LilyGo_T3S3_sx1276_companion_radio_usb,not measured by this static routing audit +tracked_primary,raw_platformio_environment,LilyGo_T3S3_sx1276_companion_radio_ble,t3_s3_v1_x,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,LilyGo_T3S3_sx1276_companion_radio_ble,LilyGo_T3S3_sx1276_companion_radio_full,LilyGo_T3S3_sx1276_companion_radio_ble,canonical replacement -> named Full Companion,auto|LilyGo_T3S3_sx1276_companion_radio_ble,not measured by this static routing audit +tracked_primary,raw_platformio_environment,LilyGo_T3S3_sx1276_kiss_modem,t3_s3_v1_x,host_modem_KISS,KISS,True,False,False,False,False,False,False,False,False,False,True,False,LilyGo_T3S3_sx1276_kiss_modem,,,,auto|LilyGo_T3S3_sx1276_kiss_modem,not measured by this static routing audit +tracked_primary,raw_platformio_environment,LilyGo_T3S3_sx1276_repeater_observer_mqtt,t3_s3_v1_x,node_firmware,Full,True,True,False,True,False,False,True,False,False,False,False,False,LilyGo_T3S3_sx1276_repeater_observer_mqtt,LilyGo_T3S3_sx1276_repeater,LilyGo_T3S3_sx1276_repeater_observer_mqtt,exact ordinary Full group choice,full|LilyGo_T3S3_sx1276_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,LilyGo_T3S3_sx1276_room_server_observer_mqtt,t3_s3_v1_x,node_firmware,Full,True,True,False,True,False,False,True,False,False,False,False,False,LilyGo_T3S3_sx1276_room_server_observer_mqtt,LilyGo_T3S3_sx1276_room_server,LilyGo_T3S3_sx1276_room_server_observer_mqtt,exact ordinary Full group choice,full|LilyGo_T3S3_sx1276_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,LilyGo_TBeam_1W_repeater,t_beam_1w,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,LilyGo_TBeam_1W_repeater,LilyGo_TBeam_1W_repeater,LilyGo_TBeam_1W_repeater_observer_mqtt,exact ordinary Full group choice,full|LilyGo_TBeam_1W_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,LilyGo_TBeam_1W_room_server,t_beam_1w,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,LilyGo_TBeam_1W_room_server,LilyGo_TBeam_1W_room_server,LilyGo_TBeam_1W_room_server_observer_mqtt,exact ordinary Full group choice,full|LilyGo_TBeam_1W_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,LilyGo_TBeam_1W_companion_radio_usb,t_beam_1w,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,LilyGo_TBeam_1W_companion_radio_usb,LilyGo_TBeam_1W_companion_radio_full,LilyGo_TBeam_1W_companion_radio_full,canonical replacement -> named Full Companion,auto|LilyGo_TBeam_1W_companion_radio_usb,not measured by this static routing audit +tracked_primary,raw_platformio_environment,LilyGo_TBeam_1W_companion_radio_ble,t_beam_1w,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,LilyGo_TBeam_1W_companion_radio_ble,LilyGo_TBeam_1W_companion_radio_full,LilyGo_TBeam_1W_companion_radio_full,canonical replacement -> named Full Companion,auto|LilyGo_TBeam_1W_companion_radio_ble,not measured by this static routing audit +tracked_primary,raw_platformio_environment,LilyGo_TBeam_1W_companion_radio_ble_ps,t_beam_1w,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,True,False,True,False,True,LilyGo_TBeam_1W_companion_radio_ble_ps,LilyGo_TBeam_1W_companion_radio_full,LilyGo_TBeam_1W_companion_radio_full,saved powersave alias -> canonical replacement -> named Full Companion,auto|LilyGo_TBeam_1W_companion_radio_ble_ps,not measured by this static routing audit +tracked_primary,raw_platformio_environment,LilyGo_TBeam_1W_companion_radio_wifi,t_beam_1w,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,LilyGo_TBeam_1W_companion_radio_wifi,LilyGo_TBeam_1W_companion_radio_full,LilyGo_TBeam_1W_companion_radio_full,canonical replacement -> named Full Companion,auto|LilyGo_TBeam_1W_companion_radio_wifi,not measured by this static routing audit +tracked_primary,raw_platformio_environment,LilyGo_TBeam_1W_companion_radio_full,t_beam_1w,named_Full_Companion,Full,True,True,True,False,False,False,False,False,False,True,False,False,LilyGo_TBeam_1W_companion_radio_full,LilyGo_TBeam_1W_companion_radio_full,LilyGo_TBeam_1W_companion_radio_full,named Full Companion,full|LilyGo_TBeam_1W_companion_radio_full,not measured by this static routing audit +tracked_primary,raw_platformio_environment,LilyGo_TBeam_1W_repeater_bridge_espnow,t_beam_1w,node_firmware,Full,False,False,False,True,True,False,True,False,False,False,False,True,LilyGo_TBeam_1W_repeater_bridge_espnow,LilyGo_TBeam_1W_repeater,LilyGo_TBeam_1W_repeater_observer_mqtt,exact ordinary Full group choice,full|LilyGo_TBeam_1W_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,LilyGo_TBeam_1W_repeater_observer_mqtt,t_beam_1w,node_firmware,Full,True,True,False,True,True,False,True,False,False,False,False,False,LilyGo_TBeam_1W_repeater_observer_mqtt,LilyGo_TBeam_1W_repeater,LilyGo_TBeam_1W_repeater_observer_mqtt,exact ordinary Full group choice,full|LilyGo_TBeam_1W_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,LilyGo_TBeam_1W_room_server_observer_mqtt,t_beam_1w,node_firmware,Full,True,True,False,True,True,False,True,False,False,False,False,False,LilyGo_TBeam_1W_room_server_observer_mqtt,LilyGo_TBeam_1W_room_server,LilyGo_TBeam_1W_room_server_observer_mqtt,exact ordinary Full group choice,full|LilyGo_TBeam_1W_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,LilyGo_TBeam_1W_kiss_modem,t_beam_1w,host_modem_KISS,KISS,True,False,False,False,False,False,False,False,False,False,True,False,LilyGo_TBeam_1W_kiss_modem,,,,auto|LilyGo_TBeam_1W_kiss_modem,not measured by this static routing audit +tracked_primary,raw_platformio_environment,T_Beam_S3_Supreme_SX1262_repeater,t_beams3_supreme,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,T_Beam_S3_Supreme_SX1262_repeater,T_Beam_S3_Supreme_SX1262_repeater,T_Beam_S3_Supreme_SX1262_repeater_observer_mqtt,exact ordinary Full group choice,full|T_Beam_S3_Supreme_SX1262_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,T_Beam_S3_Supreme_SX1262_repeater_bridge_espnow,t_beams3_supreme,node_firmware,Full,False,False,False,True,True,False,True,False,False,False,False,True,T_Beam_S3_Supreme_SX1262_repeater_bridge_espnow,T_Beam_S3_Supreme_SX1262_repeater,T_Beam_S3_Supreme_SX1262_repeater_observer_mqtt,exact ordinary Full group choice,full|T_Beam_S3_Supreme_SX1262_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,T_Beam_S3_Supreme_SX1262_repeater_observer_mqtt,t_beams3_supreme,node_firmware,Full,True,True,False,True,True,False,True,False,False,False,False,False,T_Beam_S3_Supreme_SX1262_repeater_observer_mqtt,T_Beam_S3_Supreme_SX1262_repeater,T_Beam_S3_Supreme_SX1262_repeater_observer_mqtt,exact ordinary Full group choice,full|T_Beam_S3_Supreme_SX1262_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,T_Beam_S3_Supreme_SX1262_room_server_observer_mqtt,t_beams3_supreme,node_firmware,Full,True,True,False,True,True,False,True,False,False,False,False,False,T_Beam_S3_Supreme_SX1262_room_server_observer_mqtt,T_Beam_S3_Supreme_SX1262_room_server,T_Beam_S3_Supreme_SX1262_room_server_observer_mqtt,exact ordinary Full group choice,full|T_Beam_S3_Supreme_SX1262_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,T_Beam_S3_Supreme_SX1262_room_server,t_beams3_supreme,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,T_Beam_S3_Supreme_SX1262_room_server,T_Beam_S3_Supreme_SX1262_room_server,T_Beam_S3_Supreme_SX1262_room_server_observer_mqtt,exact ordinary Full group choice,full|T_Beam_S3_Supreme_SX1262_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,T_Beam_S3_Supreme_SX1262_companion_radio_ble,t_beams3_supreme,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,T_Beam_S3_Supreme_SX1262_companion_radio_ble,T_Beam_S3_Supreme_SX1262_companion_radio_full,T_Beam_S3_Supreme_SX1262_companion_radio_ble,canonical replacement -> named Full Companion,auto|T_Beam_S3_Supreme_SX1262_companion_radio_ble,not measured by this static routing audit +tracked_primary,raw_platformio_environment,T_Beam_S3_Supreme_SX1262_companion_radio_ble_ps,t_beams3_supreme,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,True,False,True,False,True,T_Beam_S3_Supreme_SX1262_companion_radio_ble_ps,T_Beam_S3_Supreme_SX1262_companion_radio_full,T_Beam_S3_Supreme_SX1262_companion_radio_ble,saved powersave alias -> canonical replacement -> named Full Companion,auto|T_Beam_S3_Supreme_SX1262_companion_radio_ble_ps,not measured by this static routing audit +tracked_primary,raw_platformio_environment,T_Beam_S3_Supreme_SX1262_companion_radio_wifi,t_beams3_supreme,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,T_Beam_S3_Supreme_SX1262_companion_radio_wifi,T_Beam_S3_Supreme_SX1262_companion_radio_full,T_Beam_S3_Supreme_SX1262_companion_radio_ble,canonical replacement -> named Full Companion,auto|T_Beam_S3_Supreme_SX1262_companion_radio_wifi,not measured by this static routing audit +tracked_primary,raw_platformio_environment,T_Beam_S3_Supreme_SX1262_kiss_modem,t_beams3_supreme,host_modem_KISS,KISS,True,False,False,False,False,False,False,False,False,False,True,False,T_Beam_S3_Supreme_SX1262_kiss_modem,,,,auto|T_Beam_S3_Supreme_SX1262_kiss_modem,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Tbeam_SX1262_companion_radio_ble,ttgo-t-beam,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,Tbeam_SX1262_companion_radio_ble,Tbeam_SX1262_companion_radio_full,Tbeam_SX1262_companion_radio_ble,canonical replacement -> named Full Companion,auto|Tbeam_SX1262_companion_radio_ble,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Tbeam_SX1262_companion_radio_ble_ps,ttgo-t-beam,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,True,False,True,False,True,Tbeam_SX1262_companion_radio_ble_ps,Tbeam_SX1262_companion_radio_full,Tbeam_SX1262_companion_radio_ble,saved powersave alias -> canonical replacement -> named Full Companion,auto|Tbeam_SX1262_companion_radio_ble_ps,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Tbeam_SX1262_repeater,ttgo-t-beam,node_firmware,legacy,True,True,False,True,False,False,False,False,False,False,False,False,Tbeam_SX1262_repeater,Tbeam_SX1262_repeater_observer_mqtt,Tbeam_SX1262_repeater_observer_mqtt,exact ordinary Full group choice,full|Tbeam_SX1262_repeater,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Tbeam_SX1262_repeater_bridge_espnow,ttgo-t-beam,node_firmware,Full,False,False,False,True,False,False,True,False,False,False,False,True,Tbeam_SX1262_repeater_bridge_espnow,Tbeam_SX1262_repeater_observer_mqtt,Tbeam_SX1262_repeater_observer_mqtt,exact ordinary Full group choice,full|Tbeam_SX1262_repeater_bridge_espnow,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Tbeam_SX1262_room_server,ttgo-t-beam,node_firmware,legacy,True,True,False,True,False,False,False,False,False,False,False,False,Tbeam_SX1262_room_server,Tbeam_SX1262_room_server_observer_mqtt,Tbeam_SX1262_room_server_observer_mqtt,exact ordinary Full group choice,full|Tbeam_SX1262_room_server,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Tbeam_SX1262_kiss_modem,ttgo-t-beam,host_modem_KISS,KISS,True,False,False,False,False,False,False,False,False,False,True,False,Tbeam_SX1262_kiss_modem,,,,auto|Tbeam_SX1262_kiss_modem,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Tbeam_SX1262_repeater_observer_mqtt,ttgo-t-beam,node_firmware,Full,True,True,False,True,False,False,True,False,False,False,False,False,Tbeam_SX1262_repeater_observer_mqtt,Tbeam_SX1262_repeater_observer_mqtt,Tbeam_SX1262_repeater_observer_mqtt,exact ordinary Full group choice,full|Tbeam_SX1262_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Tbeam_SX1262_room_server_observer_mqtt,ttgo-t-beam,node_firmware,Full,True,True,False,True,False,False,True,False,False,False,False,False,Tbeam_SX1262_room_server_observer_mqtt,Tbeam_SX1262_room_server_observer_mqtt,Tbeam_SX1262_room_server_observer_mqtt,exact ordinary Full group choice,full|Tbeam_SX1262_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Tbeam_SX1276_companion_radio_ble,ttgo-t-beam,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,Tbeam_SX1276_companion_radio_ble,Tbeam_SX1276_companion_radio_full,Tbeam_SX1276_companion_radio_ble,canonical replacement -> named Full Companion,auto|Tbeam_SX1276_companion_radio_ble,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Tbeam_SX1276_companion_radio_ble_ps,ttgo-t-beam,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,True,False,True,False,True,Tbeam_SX1276_companion_radio_ble_ps,Tbeam_SX1276_companion_radio_full,Tbeam_SX1276_companion_radio_ble,saved powersave alias -> canonical replacement -> named Full Companion,auto|Tbeam_SX1276_companion_radio_ble_ps,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Tbeam_SX1276_repeater,ttgo-t-beam,node_firmware,legacy,True,True,False,True,False,False,False,False,False,False,False,False,Tbeam_SX1276_repeater,Tbeam_SX1276_repeater_observer_mqtt,Tbeam_SX1276_repeater_observer_mqtt,exact ordinary Full group choice,full|Tbeam_SX1276_repeater,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Tbeam_SX1276_repeater_bridge_espnow,ttgo-t-beam,node_firmware,Full,False,False,False,True,False,False,True,False,False,False,False,True,Tbeam_SX1276_repeater_bridge_espnow,Tbeam_SX1276_repeater_observer_mqtt,Tbeam_SX1276_repeater_observer_mqtt,exact ordinary Full group choice,full|Tbeam_SX1276_repeater_bridge_espnow,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Tbeam_SX1276_room_server,ttgo-t-beam,node_firmware,legacy,True,True,False,True,False,False,False,False,False,False,False,False,Tbeam_SX1276_room_server,Tbeam_SX1276_room_server_observer_mqtt,Tbeam_SX1276_room_server_observer_mqtt,exact ordinary Full group choice,full|Tbeam_SX1276_room_server,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Tbeam_SX1276_kiss_modem,ttgo-t-beam,host_modem_KISS,KISS,True,False,False,False,False,False,False,False,False,False,True,False,Tbeam_SX1276_kiss_modem,,,,auto|Tbeam_SX1276_kiss_modem,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Tbeam_SX1276_repeater_observer_mqtt,ttgo-t-beam,node_firmware,Full,True,True,False,True,False,False,True,False,False,False,False,False,Tbeam_SX1276_repeater_observer_mqtt,Tbeam_SX1276_repeater_observer_mqtt,Tbeam_SX1276_repeater_observer_mqtt,exact ordinary Full group choice,full|Tbeam_SX1276_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Tbeam_SX1276_room_server_observer_mqtt,ttgo-t-beam,node_firmware,Full,True,True,False,True,False,False,True,False,False,False,False,False,Tbeam_SX1276_room_server_observer_mqtt,Tbeam_SX1276_room_server_observer_mqtt,Tbeam_SX1276_room_server_observer_mqtt,exact ordinary Full group choice,full|Tbeam_SX1276_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,LilyGo_TDeck_companion_radio_usb,t-deck,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,LilyGo_TDeck_companion_radio_usb,LilyGo_TDeck_companion_radio_full,LilyGo_TDeck_companion_radio_ble,canonical replacement -> named Full Companion,auto|LilyGo_TDeck_companion_radio_usb,not measured by this static routing audit +tracked_primary,raw_platformio_environment,LilyGo_TDeck_companion_radio_ble,t-deck,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,LilyGo_TDeck_companion_radio_ble,LilyGo_TDeck_companion_radio_full,LilyGo_TDeck_companion_radio_ble,canonical replacement -> named Full Companion,auto|LilyGo_TDeck_companion_radio_ble,not measured by this static routing audit +tracked_primary,raw_platformio_environment,LilyGo_TDeck_repeater,t-deck,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,LilyGo_TDeck_repeater,LilyGo_TDeck_repeater,LilyGo_TDeck_repeater,exact ordinary Full group choice,full|LilyGo_TDeck_repeater,not measured by this static routing audit +tracked_primary,raw_platformio_environment,LilyGo_TDeck_kiss_modem,t-deck,host_modem_KISS,KISS,True,False,False,False,False,False,False,False,False,False,True,False,LilyGo_TDeck_kiss_modem,,,,auto|LilyGo_TDeck_kiss_modem,not measured by this static routing audit +tracked_primary,raw_platformio_environment,LilyGo_TETH_Elite_sx1262_repeater,esp32s3box,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,LilyGo_TETH_Elite_sx1262_repeater,LilyGo_TETH_Elite_sx1262_repeater,LilyGo_TETH_Elite_sx1262_repeater_observer_mqtt,exact ordinary Full group choice,full|LilyGo_TETH_Elite_sx1262_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,LilyGo_TETH_Elite_sx1262_room_server,esp32s3box,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,LilyGo_TETH_Elite_sx1262_room_server,LilyGo_TETH_Elite_sx1262_room_server,LilyGo_TETH_Elite_sx1262_room_server_observer_mqtt,exact ordinary Full group choice,full|LilyGo_TETH_Elite_sx1262_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,LilyGo_TETH_Elite_sx1262_companion_radio_usb,esp32s3box,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,LilyGo_TETH_Elite_sx1262_companion_radio_usb,LilyGo_TETH_Elite_sx1262_companion_radio_full,LilyGo_TETH_Elite_sx1262_companion_radio_ble,canonical replacement -> named Full Companion,auto|LilyGo_TETH_Elite_sx1262_companion_radio_usb,not measured by this static routing audit +tracked_primary,raw_platformio_environment,LilyGo_TETH_Elite_sx1262_companion_radio_ble,esp32s3box,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,LilyGo_TETH_Elite_sx1262_companion_radio_ble,LilyGo_TETH_Elite_sx1262_companion_radio_full,LilyGo_TETH_Elite_sx1262_companion_radio_ble,canonical replacement -> named Full Companion,auto|LilyGo_TETH_Elite_sx1262_companion_radio_ble,not measured by this static routing audit +tracked_primary,raw_platformio_environment,LilyGo_TETH_Elite_sx1262_kiss_modem,esp32s3box,host_modem_KISS,KISS,True,False,False,False,False,False,False,False,False,False,True,False,LilyGo_TETH_Elite_sx1262_kiss_modem,,,,auto|LilyGo_TETH_Elite_sx1262_kiss_modem,not measured by this static routing audit +tracked_primary,raw_platformio_environment,LilyGo_TETH_Elite_sx1262_repeater_observer_mqtt,esp32s3box,node_firmware,Full,True,True,False,True,True,False,True,False,False,False,False,False,LilyGo_TETH_Elite_sx1262_repeater_observer_mqtt,LilyGo_TETH_Elite_sx1262_repeater,LilyGo_TETH_Elite_sx1262_repeater_observer_mqtt,exact ordinary Full group choice,full|LilyGo_TETH_Elite_sx1262_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,LilyGo_TETH_Elite_sx1262_room_server_observer_mqtt,esp32s3box,node_firmware,Full,True,True,False,True,True,False,True,False,False,False,False,False,LilyGo_TETH_Elite_sx1262_room_server_observer_mqtt,LilyGo_TETH_Elite_sx1262_room_server,LilyGo_TETH_Elite_sx1262_room_server_observer_mqtt,exact ordinary Full group choice,full|LilyGo_TETH_Elite_sx1262_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,LilyGo_Tlora_C6_repeater_,esp32-c6-devkitm-1,node_firmware,legacy,True,True,False,True,False,False,False,False,False,False,False,False,LilyGo_Tlora_C6_repeater_,LilyGo_Tlora_C6_repeater_,LilyGo_Tlora_C6_repeater_,exact ordinary Full group choice,full|LilyGo_Tlora_C6_repeater_,not measured by this static routing audit +tracked_primary,raw_platformio_environment,LilyGo_Tlora_C6_room_server_,esp32-c6-devkitm-1,node_firmware,legacy,True,True,False,True,False,False,False,False,False,False,False,False,LilyGo_Tlora_C6_room_server_,LilyGo_Tlora_C6_room_server_,LilyGo_Tlora_C6_room_server_,exact ordinary Full group choice,full|LilyGo_Tlora_C6_room_server_,not measured by this static routing audit +tracked_primary,raw_platformio_environment,LilyGo_Tlora_C6_companion_radio_ble_,esp32-c6-devkitm-1,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,LilyGo_Tlora_C6_companion_radio_ble_,LilyGo_Tlora_C6_companion_radio_full_,LilyGo_Tlora_C6_companion_radio_ble_,canonical replacement -> named Full Companion,auto|LilyGo_Tlora_C6_companion_radio_ble_,not measured by this static routing audit +tracked_primary,raw_platformio_environment,LilyGo_Tlora_C6_kiss_modem,esp32-c6-devkitm-1,host_modem_KISS,KISS,True,False,False,False,False,False,False,False,False,False,True,False,LilyGo_Tlora_C6_kiss_modem,,,,auto|LilyGo_Tlora_C6_kiss_modem,not measured by this static routing audit +tracked_primary,raw_platformio_environment,LilyGo_TLora_V2_1_1_6_repeater,ttgo-lora32-v1,node_firmware,legacy,True,True,False,True,False,False,False,False,False,False,False,False,LilyGo_TLora_V2_1_1_6_repeater,LilyGo_TLora_V2_1_1_6_repeater,LilyGo_TLora_V2_1_1_6_repeater,exact ordinary Full group choice,full|LilyGo_TLora_V2_1_1_6_repeater,not measured by this static routing audit +tracked_primary,raw_platformio_environment,LilyGo_TLora_V2_1_1_6_terminal_chat,ttgo-lora32-v1,node_firmware,legacy,False,False,False,False,False,False,False,False,False,False,False,True,LilyGo_TLora_V2_1_1_6_terminal_chat,LilyGo_TLora_V2_1_1_6_companion_radio_full,LilyGo_TLora_V2_1_1_6_companion_radio_wifi,canonical replacement -> named Full Companion,auto|LilyGo_TLora_V2_1_1_6_terminal_chat,not measured by this static routing audit +tracked_primary,raw_platformio_environment,LilyGo_TLora_V2_1_1_6_companion_radio_usb,ttgo-lora32-v1,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,LilyGo_TLora_V2_1_1_6_companion_radio_usb,LilyGo_TLora_V2_1_1_6_companion_radio_full,LilyGo_TLora_V2_1_1_6_companion_radio_wifi,canonical replacement -> named Full Companion,auto|LilyGo_TLora_V2_1_1_6_companion_radio_usb,not measured by this static routing audit +tracked_primary,raw_platformio_environment,LilyGo_TLora_V2_1_1_6_companion_radio_ble,ttgo-lora32-v1,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,LilyGo_TLora_V2_1_1_6_companion_radio_ble,LilyGo_TLora_V2_1_1_6_companion_radio_full,LilyGo_TLora_V2_1_1_6_companion_radio_wifi,canonical replacement -> named Full Companion,auto|LilyGo_TLora_V2_1_1_6_companion_radio_ble,not measured by this static routing audit +tracked_primary,raw_platformio_environment,LilyGo_TLora_V2_1_1_6_companion_radio_ble_ps,ttgo-lora32-v1,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,True,False,True,False,True,LilyGo_TLora_V2_1_1_6_companion_radio_ble_ps,LilyGo_TLora_V2_1_1_6_companion_radio_full,LilyGo_TLora_V2_1_1_6_companion_radio_wifi,saved powersave alias -> canonical replacement -> named Full Companion,auto|LilyGo_TLora_V2_1_1_6_companion_radio_ble_ps,not measured by this static routing audit +tracked_primary,raw_platformio_environment,LilyGo_TLora_V2_1_1_6_room_server,ttgo-lora32-v1,node_firmware,legacy,True,True,False,True,False,False,False,False,False,False,False,False,LilyGo_TLora_V2_1_1_6_room_server,LilyGo_TLora_V2_1_1_6_room_server_observer_mqtt_,LilyGo_TLora_V2_1_1_6_room_server_observer_mqtt_,exact ordinary Full group choice,full|LilyGo_TLora_V2_1_1_6_room_server_observer_mqtt_,not measured by this static routing audit +tracked_primary,raw_platformio_environment,LilyGo_TLora_V2_1_1_6_repeater_observer_mqtt_,ttgo-lora32-v1,node_firmware,Full,True,True,False,True,False,False,True,False,False,False,False,False,LilyGo_TLora_V2_1_1_6_repeater_observer_mqtt_,LilyGo_TLora_V2_1_1_6_repeater_observer_mqtt_,LilyGo_TLora_V2_1_1_6_repeater_observer_mqtt_,exact ordinary Full group choice,full|LilyGo_TLora_V2_1_1_6_repeater_observer_mqtt_,not measured by this static routing audit +tracked_primary,raw_platformio_environment,LilyGo_TLora_V2_1_1_6_room_server_observer_mqtt_,ttgo-lora32-v1,node_firmware,Full,True,True,False,True,False,False,True,False,False,False,False,False,LilyGo_TLora_V2_1_1_6_room_server_observer_mqtt_,LilyGo_TLora_V2_1_1_6_room_server_observer_mqtt_,LilyGo_TLora_V2_1_1_6_room_server_observer_mqtt_,exact ordinary Full group choice,full|LilyGo_TLora_V2_1_1_6_room_server_observer_mqtt_,not measured by this static routing audit +tracked_primary,raw_platformio_environment,LilyGo_TLora_V2_1_1_6_companion_radio_wifi,ttgo-lora32-v1,legacy_Companion_or_transport_alias,source,False,False,False,True,False,False,False,False,False,True,False,True,LilyGo_TLora_V2_1_1_6_companion_radio_wifi,LilyGo_TLora_V2_1_1_6_companion_radio_full,LilyGo_TLora_V2_1_1_6_companion_radio_wifi,canonical replacement -> named Full Companion,full|LilyGo_TLora_V2_1_1_6_companion_radio_wifi,not measured by this static routing audit +tracked_primary,raw_platformio_environment,LilyGo_TLora_V2_1_1_6_repeater_bridge_rs232,ttgo-lora32-v1,node_firmware,legacy,False,False,False,True,False,False,False,False,False,False,False,True,LilyGo_TLora_V2_1_1_6_repeater_bridge_rs232,LilyGo_TLora_V2_1_1_6_repeater,LilyGo_TLora_V2_1_1_6_repeater,canonical replacement -> exact ordinary Full group choice,full|LilyGo_TLora_V2_1_1_6_repeater_bridge_rs232,not measured by this static routing audit +tracked_primary,raw_platformio_environment,LilyGo_TLora_V2_1_1_6_repeater_bridge_espnow,ttgo-lora32-v1,node_firmware,Full,False,False,False,True,False,False,True,False,False,False,False,True,LilyGo_TLora_V2_1_1_6_repeater_bridge_espnow,LilyGo_TLora_V2_1_1_6_repeater,LilyGo_TLora_V2_1_1_6_repeater,exact ordinary Full group choice,full|LilyGo_TLora_V2_1_1_6_repeater_bridge_espnow,not measured by this static routing audit +tracked_primary,raw_platformio_environment,LilyGo_TLora_V2_1_1_6_kiss_modem,ttgo-lora32-v1,host_modem_KISS,KISS,True,False,False,False,False,False,False,False,False,False,True,False,LilyGo_TLora_V2_1_1_6_kiss_modem,,,,auto|LilyGo_TLora_V2_1_1_6_kiss_modem,not measured by this static routing audit +tracked_primary,raw_platformio_environment,M5Stack_Unit_C6L_repeater,esp32-c6-devkitm-1,node_firmware,legacy,True,True,False,True,False,False,False,False,False,False,False,False,M5Stack_Unit_C6L_repeater,M5Stack_Unit_C6L_repeater,M5Stack_Unit_C6L_repeater,exact ordinary Full group choice,full|M5Stack_Unit_C6L_repeater,not measured by this static routing audit +tracked_primary,raw_platformio_environment,M5Stack_Unit_C6L_room_server,esp32-c6-devkitm-1,node_firmware,legacy,True,True,False,True,False,False,False,False,False,False,False,False,M5Stack_Unit_C6L_room_server,M5Stack_Unit_C6L_room_server,M5Stack_Unit_C6L_room_server,exact ordinary Full group choice,full|M5Stack_Unit_C6L_room_server,not measured by this static routing audit +tracked_primary,raw_platformio_environment,M5Stack_Unit_C6L_companion_radio_ble,esp32-c6-devkitm-1,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,M5Stack_Unit_C6L_companion_radio_ble,M5Stack_Unit_C6L_companion_radio_full,M5Stack_Unit_C6L_companion_radio_ble,canonical replacement -> named Full Companion,auto|M5Stack_Unit_C6L_companion_radio_ble,not measured by this static routing audit +tracked_primary,raw_platformio_environment,M5Stack_Unit_C6L_companion_radio_usb,esp32-c6-devkitm-1,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,M5Stack_Unit_C6L_companion_radio_usb,M5Stack_Unit_C6L_companion_radio_full,M5Stack_Unit_C6L_companion_radio_ble,canonical replacement -> named Full Companion,auto|M5Stack_Unit_C6L_companion_radio_usb,not measured by this static routing audit +tracked_primary,raw_platformio_environment,M5Stack_Unit_C6L_kiss_modem,esp32-c6-devkitm-1,host_modem_KISS,KISS,True,False,False,False,False,False,False,False,False,False,True,False,M5Stack_Unit_C6L_kiss_modem,,,,auto|M5Stack_Unit_C6L_kiss_modem,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Meshadventurer_sx1262_repeater,esp32doit-devkit-v1,node_firmware,legacy,True,True,False,True,False,False,False,False,False,False,False,False,Meshadventurer_sx1262_repeater,Meshadventurer_sx1262_repeater,Meshadventurer_sx1262_repeater,exact ordinary Full group choice,full|Meshadventurer_sx1262_repeater,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Meshadventurer_sx1262_repeater_bridge_espnow,esp32doit-devkit-v1,node_firmware,Full,False,False,False,True,False,False,True,False,False,False,False,True,Meshadventurer_sx1262_repeater_bridge_espnow,Meshadventurer_sx1262_repeater,Meshadventurer_sx1262_repeater,exact ordinary Full group choice,full|Meshadventurer_sx1262_repeater_bridge_espnow,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Meshadventurer_sx1268_repeater,esp32doit-devkit-v1,node_firmware,legacy,True,True,False,True,False,False,False,False,False,False,False,False,Meshadventurer_sx1268_repeater,Meshadventurer_sx1268_repeater,Meshadventurer_sx1268_repeater,exact ordinary Full group choice,full|Meshadventurer_sx1268_repeater,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Meshadventurer_sx1268_repeater_bridge_espnow,esp32doit-devkit-v1,node_firmware,Full,False,False,False,True,False,False,True,False,False,False,False,True,Meshadventurer_sx1268_repeater_bridge_espnow,Meshadventurer_sx1268_repeater,Meshadventurer_sx1268_repeater,exact ordinary Full group choice,full|Meshadventurer_sx1268_repeater_bridge_espnow,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Meshadventurer_sx1262_companion_radio_usb,esp32doit-devkit-v1,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,Meshadventurer_sx1262_companion_radio_usb,Meshadventurer_sx1262_companion_radio_full,Meshadventurer_sx1262_companion_radio_ble,canonical replacement -> named Full Companion,auto|Meshadventurer_sx1262_companion_radio_usb,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Meshadventurer_sx1262_companion_radio_ble,esp32doit-devkit-v1,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,Meshadventurer_sx1262_companion_radio_ble,Meshadventurer_sx1262_companion_radio_full,Meshadventurer_sx1262_companion_radio_ble,canonical replacement -> named Full Companion,auto|Meshadventurer_sx1262_companion_radio_ble,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Meshadventurer_sx1262_terminal_chat,esp32doit-devkit-v1,node_firmware,legacy,False,False,False,False,False,False,False,False,False,False,False,True,Meshadventurer_sx1262_terminal_chat,Meshadventurer_sx1262_companion_radio_full,Meshadventurer_sx1262_companion_radio_ble,canonical replacement -> named Full Companion,auto|Meshadventurer_sx1262_terminal_chat,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Meshadventurer_sx1262_room_server,esp32doit-devkit-v1,node_firmware,legacy,True,True,False,True,False,False,False,False,False,False,False,False,Meshadventurer_sx1262_room_server,Meshadventurer_sx1262_room_server,Meshadventurer_sx1262_room_server,exact ordinary Full group choice,full|Meshadventurer_sx1262_room_server,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Meshadventurer_sx1268_companion_radio_usb,esp32doit-devkit-v1,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,Meshadventurer_sx1268_companion_radio_usb,Meshadventurer_sx1268_companion_radio_full,Meshadventurer_sx1268_companion_radio_ble,canonical replacement -> named Full Companion,auto|Meshadventurer_sx1268_companion_radio_usb,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Meshadventurer_sx1268_companion_radio_ble,esp32doit-devkit-v1,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,Meshadventurer_sx1268_companion_radio_ble,Meshadventurer_sx1268_companion_radio_full,Meshadventurer_sx1268_companion_radio_ble,canonical replacement -> named Full Companion,auto|Meshadventurer_sx1268_companion_radio_ble,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Meshadventurer_sx1268_terminal_chat,esp32doit-devkit-v1,node_firmware,legacy,False,False,False,False,False,False,False,False,False,False,False,True,Meshadventurer_sx1268_terminal_chat,Meshadventurer_sx1268_companion_radio_full,Meshadventurer_sx1268_companion_radio_ble,canonical replacement -> named Full Companion,auto|Meshadventurer_sx1268_terminal_chat,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Meshadventurer_sx1268_room_server,esp32doit-devkit-v1,node_firmware,legacy,True,True,False,True,False,False,False,False,False,False,False,False,Meshadventurer_sx1268_room_server,Meshadventurer_sx1268_room_server,Meshadventurer_sx1268_room_server,exact ordinary Full group choice,full|Meshadventurer_sx1268_room_server,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Meshadventurer_sx1262_kiss_modem,esp32doit-devkit-v1,host_modem_KISS,KISS,True,False,False,False,False,False,False,False,False,False,True,False,Meshadventurer_sx1262_kiss_modem,,,,auto|Meshadventurer_sx1262_kiss_modem,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Meshadventurer_sx1268_kiss_modem,esp32doit-devkit-v1,host_modem_KISS,KISS,True,False,False,False,False,False,False,False,False,False,True,False,Meshadventurer_sx1268_kiss_modem,,,,auto|Meshadventurer_sx1268_kiss_modem,not measured by this static routing audit +tracked_primary,raw_platformio_environment,meshnology_w12_repeater,meshnology_w12,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,meshnology_w12_repeater,meshnology_w12_repeater,meshnology_w12_repeater_observer_mqtt,exact ordinary Full group choice,full|meshnology_w12_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,meshnology_w12_repeater_bridge_espnow,meshnology_w12,node_firmware,Full,False,False,False,True,True,False,True,False,False,False,False,True,meshnology_w12_repeater_bridge_espnow,meshnology_w12_repeater,meshnology_w12_repeater_observer_mqtt,exact ordinary Full group choice,full|meshnology_w12_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,meshnology_w12_room_server,meshnology_w12,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,meshnology_w12_room_server,meshnology_w12_room_server,meshnology_w12_room_server_observer_mqtt,exact ordinary Full group choice,full|meshnology_w12_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,meshnology_w12_terminal_chat,meshnology_w12,node_firmware,legacy,False,False,False,False,False,False,False,False,False,False,False,True,meshnology_w12_terminal_chat,meshnology_w12_companion_radio_full,meshnology_w12_companion_radio_full,canonical replacement -> named Full Companion,auto|meshnology_w12_terminal_chat,not measured by this static routing audit +tracked_primary,raw_platformio_environment,meshnology_w12_companion_radio_usb,meshnology_w12,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,meshnology_w12_companion_radio_usb,meshnology_w12_companion_radio_full,meshnology_w12_companion_radio_full,canonical replacement -> named Full Companion,auto|meshnology_w12_companion_radio_usb,not measured by this static routing audit +tracked_primary,raw_platformio_environment,meshnology_w12_companion_radio_ble,meshnology_w12,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,meshnology_w12_companion_radio_ble,meshnology_w12_companion_radio_full,meshnology_w12_companion_radio_full,canonical replacement -> named Full Companion,auto|meshnology_w12_companion_radio_ble,not measured by this static routing audit +tracked_primary,raw_platformio_environment,meshnology_w12_companion_radio_wifi,meshnology_w12,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,meshnology_w12_companion_radio_wifi,meshnology_w12_companion_radio_full,meshnology_w12_companion_radio_full,canonical replacement -> named Full Companion,auto|meshnology_w12_companion_radio_wifi,not measured by this static routing audit +tracked_primary,raw_platformio_environment,meshnology_w12_companion_radio_full,meshnology_w12,named_Full_Companion,Full,True,True,True,False,False,False,False,False,False,True,False,False,meshnology_w12_companion_radio_full,meshnology_w12_companion_radio_full,meshnology_w12_companion_radio_full,named Full Companion,full|meshnology_w12_companion_radio_full,not measured by this static routing audit +tracked_primary,raw_platformio_environment,meshnology_w12_sensor,meshnology_w12,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,meshnology_w12_sensor,meshnology_w12_sensor,meshnology_w12_sensor,exact ordinary Full group choice,full|meshnology_w12_sensor,not measured by this static routing audit +tracked_primary,raw_platformio_environment,meshnology_w12_kiss_modem,meshnology_w12,host_modem_KISS,KISS,True,False,False,False,False,False,False,False,False,False,True,False,meshnology_w12_kiss_modem,,,,auto|meshnology_w12_kiss_modem,not measured by this static routing audit +tracked_primary,raw_platformio_environment,meshnology_w12_repeater_observer_mqtt,meshnology_w12,node_firmware,Full,True,True,False,True,True,False,True,False,False,False,False,False,meshnology_w12_repeater_observer_mqtt,meshnology_w12_repeater,meshnology_w12_repeater_observer_mqtt,exact ordinary Full group choice,full|meshnology_w12_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,meshnology_w12_room_server_observer_mqtt,meshnology_w12,node_firmware,Full,True,True,False,True,True,False,True,False,False,False,False,False,meshnology_w12_room_server_observer_mqtt,meshnology_w12_room_server,meshnology_w12_room_server_observer_mqtt,exact ordinary Full group choice,full|meshnology_w12_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,MKE_s3_repeater,esp32-s3-devkitc-1,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,MKE_s3_repeater,MKE_s3_repeater,MKE_s3_repeater,exact ordinary Full group choice,full|MKE_s3_repeater,not measured by this static routing audit +tracked_primary,raw_platformio_environment,MKE_s3_repeater_bridge_rs232,esp32-s3-devkitc-1,node_firmware,Full,False,False,False,True,True,False,False,False,False,False,False,True,MKE_s3_repeater_bridge_rs232,MKE_s3_repeater,MKE_s3_repeater,canonical replacement -> exact ordinary Full group choice,full|MKE_s3_repeater_bridge_rs232,not measured by this static routing audit +tracked_primary,raw_platformio_environment,MKE_s3_repeater_bridge_espnow,esp32-s3-devkitc-1,node_firmware,Full,False,False,False,True,True,False,True,False,False,False,False,True,MKE_s3_repeater_bridge_espnow,MKE_s3_repeater,MKE_s3_repeater,exact ordinary Full group choice,full|MKE_s3_repeater_bridge_espnow,not measured by this static routing audit +tracked_primary,raw_platformio_environment,MKE_s3_room_server,esp32-s3-devkitc-1,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,MKE_s3_room_server,MKE_s3_room_server,MKE_s3_room_server,exact ordinary Full group choice,full|MKE_s3_room_server,not measured by this static routing audit +tracked_primary,raw_platformio_environment,MKE_s3_terminal_chat,esp32-s3-devkitc-1,node_firmware,legacy,False,False,False,False,False,False,False,False,False,False,False,True,MKE_s3_terminal_chat,MKE_s3_companion_radio_full,MKE_s3_companion_radio_wifi,canonical replacement -> named Full Companion,auto|MKE_s3_terminal_chat,not measured by this static routing audit +tracked_primary,raw_platformio_environment,MKE_s3_companion_radio_usb,esp32-s3-devkitc-1,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,MKE_s3_companion_radio_usb,MKE_s3_companion_radio_full,MKE_s3_companion_radio_wifi,canonical replacement -> named Full Companion,auto|MKE_s3_companion_radio_usb,not measured by this static routing audit +tracked_primary,raw_platformio_environment,MKE_s3_companion_radio_ble,esp32-s3-devkitc-1,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,MKE_s3_companion_radio_ble,MKE_s3_companion_radio_full,MKE_s3_companion_radio_wifi,canonical replacement -> named Full Companion,auto|MKE_s3_companion_radio_ble,not measured by this static routing audit +tracked_primary,raw_platformio_environment,MKE_s3_companion_radio_wifi,esp32-s3-devkitc-1,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,MKE_s3_companion_radio_wifi,MKE_s3_companion_radio_full,MKE_s3_companion_radio_wifi,canonical replacement -> named Full Companion,auto|MKE_s3_companion_radio_wifi,not measured by this static routing audit +tracked_primary,raw_platformio_environment,MKE_s3_sensor,esp32-s3-devkitc-1,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,MKE_s3_sensor,MKE_s3_sensor,MKE_s3_sensor,exact ordinary Full group choice,full|MKE_s3_sensor,not measured by this static routing audit +tracked_primary,raw_platformio_environment,nibble_screen_connect_repeater_,esp32-s3-zero,node_firmware,legacy,True,True,False,True,False,True,False,False,False,False,False,False,nibble_screen_connect_repeater_,nibble_screen_connect_repeater_,nibble_screen_connect_repeater_,exact ordinary Full group choice,full|nibble_screen_connect_repeater_,not measured by this static routing audit +tracked_primary,raw_platformio_environment,nibble_screen_connect_repeater_bridge_espnow_,esp32-s3-zero,node_firmware,Full,False,False,False,True,False,False,True,False,False,False,False,True,nibble_screen_connect_repeater_bridge_espnow_,nibble_screen_connect_repeater_,nibble_screen_connect_repeater_,exact ordinary Full group choice,full|nibble_screen_connect_repeater_bridge_espnow_,not measured by this static routing audit +tracked_primary,raw_platformio_environment,nibble_screen_connect_terminal_chat_,esp32-s3-zero,node_firmware,legacy,False,False,False,False,False,False,False,False,False,False,False,True,nibble_screen_connect_terminal_chat_,nibble_screen_connect_companion_radio_full_,nibble_screen_connect_companion_radio_full_,canonical replacement -> named Full Companion,auto|nibble_screen_connect_terminal_chat_,not measured by this static routing audit +tracked_primary,raw_platformio_environment,nibble_screen_connect_room_server_,esp32-s3-zero,node_firmware,legacy,True,True,False,True,False,True,False,False,False,False,False,False,nibble_screen_connect_room_server_,nibble_screen_connect_room_server_,nibble_screen_connect_room_server_,exact ordinary Full group choice,full|nibble_screen_connect_room_server_,not measured by this static routing audit +tracked_primary,raw_platformio_environment,nibble_screen_connect_companion_radio_usb_,esp32-s3-zero,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,nibble_screen_connect_companion_radio_usb_,nibble_screen_connect_companion_radio_full_,nibble_screen_connect_companion_radio_full_,canonical replacement -> named Full Companion,auto|nibble_screen_connect_companion_radio_usb_,not measured by this static routing audit +tracked_primary,raw_platformio_environment,nibble_screen_connect_companion_radio_ble_,esp32-s3-zero,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,nibble_screen_connect_companion_radio_ble_,nibble_screen_connect_companion_radio_full_,nibble_screen_connect_companion_radio_full_,canonical replacement -> named Full Companion,auto|nibble_screen_connect_companion_radio_ble_,not measured by this static routing audit +tracked_primary,raw_platformio_environment,nibble_screen_connect_companion_radio_wifi_,esp32-s3-zero,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,nibble_screen_connect_companion_radio_wifi_,nibble_screen_connect_companion_radio_full_,nibble_screen_connect_companion_radio_full_,canonical replacement -> named Full Companion,auto|nibble_screen_connect_companion_radio_wifi_,not measured by this static routing audit +tracked_primary,raw_platformio_environment,nibble_screen_connect_companion_radio_full_,esp32-s3-zero,named_Full_Companion,Full,True,True,True,False,False,False,False,False,False,True,False,False,nibble_screen_connect_companion_radio_full_,nibble_screen_connect_companion_radio_full_,nibble_screen_connect_companion_radio_full_,named Full Companion,full|nibble_screen_connect_companion_radio_full_,not measured by this static routing audit +tracked_primary,raw_platformio_environment,nibble_screen_connect_kiss_modem_,esp32-s3-zero,host_modem_KISS,KISS,True,False,False,False,False,False,False,False,False,False,True,False,nibble_screen_connect_kiss_modem_,,,,auto|nibble_screen_connect_kiss_modem_,not measured by this static routing audit +tracked_primary,raw_platformio_environment,nibble_zero_connect_repeater_,esp32-s3-zero,node_firmware,legacy,True,True,False,True,False,True,False,False,False,False,False,False,nibble_zero_connect_repeater_,nibble_zero_connect_repeater_,nibble_zero_connect_repeater_,exact ordinary Full group choice,full|nibble_zero_connect_repeater_,not measured by this static routing audit +tracked_primary,raw_platformio_environment,nibble_zero_connect_repeater_bridge_espnow_,esp32-s3-zero,node_firmware,Full,False,False,False,True,False,False,True,False,False,False,False,True,nibble_zero_connect_repeater_bridge_espnow_,nibble_zero_connect_repeater_,nibble_zero_connect_repeater_,exact ordinary Full group choice,full|nibble_zero_connect_repeater_bridge_espnow_,not measured by this static routing audit +tracked_primary,raw_platformio_environment,nibble_zero_connect_terminal_chat_,esp32-s3-zero,node_firmware,legacy,False,False,False,False,False,False,False,False,False,False,False,True,nibble_zero_connect_terminal_chat_,nibble_zero_connect_companion_radio_full_,nibble_zero_connect_companion_radio_full_,canonical replacement -> named Full Companion,auto|nibble_zero_connect_terminal_chat_,not measured by this static routing audit +tracked_primary,raw_platformio_environment,nibble_zero_connect_room_server_,esp32-s3-zero,node_firmware,legacy,True,True,False,True,False,True,False,False,False,False,False,False,nibble_zero_connect_room_server_,nibble_zero_connect_room_server_,nibble_zero_connect_room_server_,exact ordinary Full group choice,full|nibble_zero_connect_room_server_,not measured by this static routing audit +tracked_primary,raw_platformio_environment,nibble_zero_connect_companion_radio_usb_,esp32-s3-zero,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,nibble_zero_connect_companion_radio_usb_,nibble_zero_connect_companion_radio_full_,nibble_zero_connect_companion_radio_full_,canonical replacement -> named Full Companion,auto|nibble_zero_connect_companion_radio_usb_,not measured by this static routing audit +tracked_primary,raw_platformio_environment,nibble_zero_connect_companion_radio_ble_,esp32-s3-zero,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,nibble_zero_connect_companion_radio_ble_,nibble_zero_connect_companion_radio_full_,nibble_zero_connect_companion_radio_full_,canonical replacement -> named Full Companion,auto|nibble_zero_connect_companion_radio_ble_,not measured by this static routing audit +tracked_primary,raw_platformio_environment,nibble_zero_connect_companion_radio_wifi_,esp32-s3-zero,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,nibble_zero_connect_companion_radio_wifi_,nibble_zero_connect_companion_radio_full_,nibble_zero_connect_companion_radio_full_,canonical replacement -> named Full Companion,auto|nibble_zero_connect_companion_radio_wifi_,not measured by this static routing audit +tracked_primary,raw_platformio_environment,nibble_zero_connect_companion_radio_full_,esp32-s3-zero,named_Full_Companion,Full,True,True,True,False,False,False,False,False,False,True,False,False,nibble_zero_connect_companion_radio_full_,nibble_zero_connect_companion_radio_full_,nibble_zero_connect_companion_radio_full_,named Full Companion,full|nibble_zero_connect_companion_radio_full_,not measured by this static routing audit +tracked_primary,raw_platformio_environment,RAK_3112_repeater,esp32-s3-devkitc-1,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,RAK_3112_repeater,RAK_3112_repeater,RAK_3112_repeater_observer_mqtt,exact ordinary Full group choice,full|RAK_3112_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,RAK_3112_repeater_bridge_rs232,esp32-s3-devkitc-1,node_firmware,Full,False,False,False,True,True,False,False,False,False,False,False,True,RAK_3112_repeater_bridge_rs232,RAK_3112_repeater,RAK_3112_repeater_observer_mqtt,canonical replacement -> exact ordinary Full group choice,full|RAK_3112_repeater_bridge_rs232,not measured by this static routing audit +tracked_primary,raw_platformio_environment,RAK_3112_repeater_bridge_espnow,esp32-s3-devkitc-1,node_firmware,Full,False,False,False,True,True,False,True,False,False,False,False,True,RAK_3112_repeater_bridge_espnow,RAK_3112_repeater,RAK_3112_repeater_observer_mqtt,exact ordinary Full group choice,full|RAK_3112_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,RAK_3112_repeater_observer_mqtt,esp32-s3-devkitc-1,node_firmware,Full,True,True,False,True,True,False,True,False,False,False,False,False,RAK_3112_repeater_observer_mqtt,RAK_3112_repeater,RAK_3112_repeater_observer_mqtt,exact ordinary Full group choice,full|RAK_3112_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,RAK_3112_room_server,esp32-s3-devkitc-1,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,RAK_3112_room_server,RAK_3112_room_server,RAK_3112_room_server_observer_mqtt,exact ordinary Full group choice,full|RAK_3112_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,RAK_3112_room_server_observer_mqtt,esp32-s3-devkitc-1,node_firmware,Full,True,True,False,True,True,False,True,False,False,False,False,False,RAK_3112_room_server_observer_mqtt,RAK_3112_room_server,RAK_3112_room_server_observer_mqtt,exact ordinary Full group choice,full|RAK_3112_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,RAK_3112_terminal_chat,esp32-s3-devkitc-1,node_firmware,legacy,False,False,False,False,False,False,False,False,False,False,False,True,RAK_3112_terminal_chat,RAK_3112_companion_radio_full,RAK_3112_companion_radio_full,canonical replacement -> named Full Companion,auto|RAK_3112_terminal_chat,not measured by this static routing audit +tracked_primary,raw_platformio_environment,RAK_3112_companion_radio_usb,esp32-s3-devkitc-1,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,RAK_3112_companion_radio_usb,RAK_3112_companion_radio_full,RAK_3112_companion_radio_full,canonical replacement -> named Full Companion,auto|RAK_3112_companion_radio_usb,not measured by this static routing audit +tracked_primary,raw_platformio_environment,RAK_3112_companion_radio_ble,esp32-s3-devkitc-1,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,RAK_3112_companion_radio_ble,RAK_3112_companion_radio_full,RAK_3112_companion_radio_full,canonical replacement -> named Full Companion,auto|RAK_3112_companion_radio_ble,not measured by this static routing audit +tracked_primary,raw_platformio_environment,RAK_3112_companion_radio_wifi,esp32-s3-devkitc-1,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,RAK_3112_companion_radio_wifi,RAK_3112_companion_radio_full,RAK_3112_companion_radio_full,canonical replacement -> named Full Companion,auto|RAK_3112_companion_radio_wifi,not measured by this static routing audit +tracked_primary,raw_platformio_environment,RAK_3112_companion_radio_full,esp32-s3-devkitc-1,named_Full_Companion,Full,True,True,True,False,False,False,False,False,False,True,False,False,RAK_3112_companion_radio_full,RAK_3112_companion_radio_full,RAK_3112_companion_radio_full,named Full Companion,full|RAK_3112_companion_radio_full,not measured by this static routing audit +tracked_primary,raw_platformio_environment,RAK_3112_sensor,esp32-s3-devkitc-1,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,RAK_3112_sensor,RAK_3112_sensor,RAK_3112_sensor,exact ordinary Full group choice,full|RAK_3112_sensor,not measured by this static routing audit +tracked_primary,raw_platformio_environment,RAK_3112_kiss_modem,esp32-s3-devkitc-1,host_modem_KISS,KISS,True,False,False,False,False,False,False,False,False,False,True,False,RAK_3112_kiss_modem,,,,auto|RAK_3112_kiss_modem,not measured by this static routing audit +tracked_primary,raw_platformio_environment,SenseCapIndicator-ESPNow_comp_radio_usb,esp32-s3-devkitc-1,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,SenseCapIndicator-ESPNow_comp_radio_usb,SenseCapIndicator-ESPNow_companion_radio_full,SenseCapIndicator-ESPNow_comp_radio_usb,canonical replacement -> named Full Companion,auto|SenseCapIndicator-ESPNow_comp_radio_usb,not measured by this static routing audit +tracked_primary,raw_platformio_environment,SenseCapIndicator-LoRa_comp_radio_usb,esp32-s3-devkitc-1,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,SenseCapIndicator-LoRa_comp_radio_usb,SenseCapIndicator-LoRa_companion_radio_full,SenseCapIndicator-LoRa_comp_radio_usb_wifi,canonical replacement -> named Full Companion,auto|SenseCapIndicator-LoRa_comp_radio_usb,not measured by this static routing audit +tracked_primary,raw_platformio_environment,SenseCapIndicator-LoRa_comp_radio_usb_wifi,esp32-s3-devkitc-1,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,SenseCapIndicator-LoRa_comp_radio_usb_wifi,SenseCapIndicator-LoRa_companion_radio_full,SenseCapIndicator-LoRa_comp_radio_usb_wifi,canonical replacement -> named Full Companion,auto|SenseCapIndicator-LoRa_comp_radio_usb_wifi,not measured by this static routing audit +tracked_primary,raw_platformio_environment,SenseCapIndicator-LoRa-N16R2_comp_radio_usb_wifi,esp32-s3-devkitc-1,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,SenseCapIndicator-LoRa-N16R2_comp_radio_usb_wifi,SenseCapIndicator-LoRa-N16R2_companion_radio_full,SenseCapIndicator-LoRa-N16R2_comp_radio_usb_wifi,canonical replacement -> named Full Companion,auto|SenseCapIndicator-LoRa-N16R2_comp_radio_usb_wifi,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Station_G2_repeater,station-g2,node_firmware,legacy,True,True,False,True,False,True,False,False,False,False,False,False,Station_G2_repeater,Station_G2_repeater_observer_mqtt,Station_G2_repeater_observer_mqtt,exact ordinary Full group choice,full|Station_G2_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Station_G2_repeater_bridge_espnow,station-g2,node_firmware,Full,False,False,False,True,False,False,True,False,False,False,False,True,Station_G2_repeater_bridge_espnow,Station_G2_repeater_observer_mqtt,Station_G2_repeater_observer_mqtt,exact ordinary Full group choice,full|Station_G2_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Station_G2_logging_repeater,station-g2,node_firmware,legacy,False,False,False,True,False,True,False,True,False,False,False,True,Station_G2_logging_repeater,Station_G2_repeater_observer_mqtt,Station_G2_repeater_observer_mqtt,logging alias -> exact ordinary Full group choice,full|Station_G2_logging_repeater,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Station_G2_logging_repeater_bridge_espnow,station-g2,node_firmware,Full,False,False,False,True,False,False,True,True,False,False,False,True,Station_G2_logging_repeater_bridge_espnow,Station_G2_repeater_observer_mqtt,Station_G2_repeater_observer_mqtt,canonical replacement -> logging alias -> exact ordinary Full group choice,full|Station_G2_logging_repeater_bridge_espnow,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Station_G2_room_server_observer_mqtt,station-g2,node_firmware,Full,True,True,False,True,True,False,True,False,False,False,False,False,Station_G2_room_server_observer_mqtt,Station_G2_room_server_observer_mqtt,Station_G2_room_server_observer_mqtt,exact ordinary Full group choice,full|Station_G2_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Station_G2_room_server,station-g2,node_firmware,legacy,True,True,False,True,False,True,False,False,False,False,False,False,Station_G2_room_server,Station_G2_room_server_observer_mqtt,Station_G2_room_server_observer_mqtt,exact ordinary Full group choice,full|Station_G2_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Station_G2_companion_radio_usb,station-g2,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,Station_G2_companion_radio_usb,Station_G2_companion_radio_full,Station_G2_companion_radio_full,canonical replacement -> named Full Companion,auto|Station_G2_companion_radio_usb,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Station_G2_companion_radio_ble,station-g2,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,Station_G2_companion_radio_ble,Station_G2_companion_radio_full,Station_G2_companion_radio_full,canonical replacement -> named Full Companion,auto|Station_G2_companion_radio_ble,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Station_G2_companion_radio_wifi,station-g2,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,Station_G2_companion_radio_wifi,Station_G2_companion_radio_full,Station_G2_companion_radio_full,canonical replacement -> named Full Companion,auto|Station_G2_companion_radio_wifi,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Station_G2_companion_radio_full,station-g2,named_Full_Companion,Full,True,True,True,False,False,False,False,False,False,True,False,False,Station_G2_companion_radio_full,Station_G2_companion_radio_full,Station_G2_companion_radio_full,named Full Companion,full|Station_G2_companion_radio_full,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Station_G2_kiss_modem,station-g2,host_modem_KISS,KISS,True,False,False,False,False,False,False,False,False,False,True,False,Station_G2_kiss_modem,,,,auto|Station_G2_kiss_modem,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Station_G2_repeater_observer_mqtt,station-g2,node_firmware,Full,True,True,False,True,True,False,True,False,False,False,False,False,Station_G2_repeater_observer_mqtt,Station_G2_repeater_observer_mqtt,Station_G2_repeater_observer_mqtt,exact ordinary Full group choice,full|Station_G2_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Station_G3_ESP32_repeater,station-g3-esp32,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,Station_G3_ESP32_repeater,Station_G3_ESP32_repeater,Station_G3_ESP32_repeater_observer_mqtt,exact ordinary Full group choice,full|Station_G3_ESP32_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Station_G3_ESP32_logging_repeater,station-g3-esp32,node_firmware,Full,False,False,False,True,True,False,False,True,False,False,False,True,Station_G3_ESP32_logging_repeater,Station_G3_ESP32_repeater,Station_G3_ESP32_repeater_observer_mqtt,logging alias -> exact ordinary Full group choice,full|Station_G3_ESP32_logging_repeater,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Station_G3_ESP32_room_server,station-g3-esp32,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,Station_G3_ESP32_room_server,Station_G3_ESP32_room_server,Station_G3_ESP32_room_server_observer_mqtt,exact ordinary Full group choice,full|Station_G3_ESP32_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Station_G3_ESP32_companion_radio_usb,station-g3-esp32,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,Station_G3_ESP32_companion_radio_usb,Station_G3_ESP32_companion_radio_full,Station_G3_ESP32_companion_radio_full,canonical replacement -> named Full Companion,auto|Station_G3_ESP32_companion_radio_usb,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Station_G3_ESP32_companion_radio_ble,station-g3-esp32,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,Station_G3_ESP32_companion_radio_ble,Station_G3_ESP32_companion_radio_full,Station_G3_ESP32_companion_radio_full,canonical replacement -> named Full Companion,auto|Station_G3_ESP32_companion_radio_ble,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Station_G3_ESP32_companion_radio_wifi,station-g3-esp32,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,Station_G3_ESP32_companion_radio_wifi,Station_G3_ESP32_companion_radio_full,Station_G3_ESP32_companion_radio_full,canonical replacement -> named Full Companion,auto|Station_G3_ESP32_companion_radio_wifi,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Station_G3_ESP32_companion_radio_full,station-g3-esp32,named_Full_Companion,Full,True,True,True,False,False,False,False,False,False,True,False,False,Station_G3_ESP32_companion_radio_full,Station_G3_ESP32_companion_radio_full,Station_G3_ESP32_companion_radio_full,named Full Companion,full|Station_G3_ESP32_companion_radio_full,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Station_G3_ESP32_kiss_modem,station-g3-esp32,host_modem_KISS,KISS,True,False,False,False,False,False,False,False,False,False,True,False,Station_G3_ESP32_kiss_modem,,,,auto|Station_G3_ESP32_kiss_modem,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Station_G3_ESP32_repeater_observer_mqtt,station-g3-esp32,node_firmware,Full,True,True,False,True,True,False,True,False,False,False,False,False,Station_G3_ESP32_repeater_observer_mqtt,Station_G3_ESP32_repeater,Station_G3_ESP32_repeater_observer_mqtt,exact ordinary Full group choice,full|Station_G3_ESP32_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Station_G3_ESP32_room_server_observer_mqtt,station-g3-esp32,node_firmware,Full,True,True,False,True,True,False,True,False,False,False,False,False,Station_G3_ESP32_room_server_observer_mqtt,Station_G3_ESP32_room_server,Station_G3_ESP32_room_server_observer_mqtt,exact ordinary Full group choice,full|Station_G3_ESP32_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Station_G3_ESP32_r2_repeater,station-g3-esp32,node_firmware,legacy,True,True,False,True,False,False,False,False,False,False,False,False,Station_G3_ESP32_r2_repeater,Station_G3_ESP32_r2_repeater_observer_mqtt,Station_G3_ESP32_r2_repeater_observer_mqtt,exact ordinary Full group choice,full|Station_G3_ESP32_r2_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Station_G3_ESP32_r2_room_server,station-g3-esp32,node_firmware,legacy,True,True,False,True,False,False,False,False,False,False,False,False,Station_G3_ESP32_r2_room_server,Station_G3_ESP32_r2_room_server_observer_mqtt,Station_G3_ESP32_r2_room_server_observer_mqtt,exact ordinary Full group choice,full|Station_G3_ESP32_r2_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Station_G3_ESP32_r2_repeater_observer_mqtt,station-g3-esp32,node_firmware,Full,True,True,False,True,False,False,True,False,False,False,False,False,Station_G3_ESP32_r2_repeater_observer_mqtt,Station_G3_ESP32_r2_repeater_observer_mqtt,Station_G3_ESP32_r2_repeater_observer_mqtt,exact ordinary Full group choice,full|Station_G3_ESP32_r2_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Station_G3_ESP32_r2_room_server_observer_mqtt,station-g3-esp32,node_firmware,Full,True,True,False,True,False,False,True,False,False,False,False,False,Station_G3_ESP32_r2_room_server_observer_mqtt,Station_G3_ESP32_r2_room_server_observer_mqtt,Station_G3_ESP32_r2_room_server_observer_mqtt,exact ordinary Full group choice,full|Station_G3_ESP32_r2_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Tenstar_C3_sx1262_repeater,esp32-c3-devkitm-1,node_firmware,legacy,True,True,False,True,False,True,False,False,False,False,False,False,Tenstar_C3_sx1262_repeater,Tenstar_C3_sx1262_repeater,Tenstar_C3_sx1262_repeater,exact ordinary Full group choice,full|Tenstar_C3_sx1262_repeater,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Tenstar_C3_sx1262_repeater_bridge_espnow,esp32-c3-devkitm-1,node_firmware,Full,False,False,False,True,False,False,True,False,False,False,False,True,Tenstar_C3_sx1262_repeater_bridge_espnow,Tenstar_C3_sx1262_repeater,Tenstar_C3_sx1262_repeater,exact ordinary Full group choice,full|Tenstar_C3_sx1262_repeater_bridge_espnow,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Tenstar_C3_sx1268_repeater,esp32-c3-devkitm-1,node_firmware,legacy,True,True,False,True,False,True,False,False,False,False,False,False,Tenstar_C3_sx1268_repeater,Tenstar_C3_sx1268_repeater,Tenstar_C3_sx1268_repeater,exact ordinary Full group choice,full|Tenstar_C3_sx1268_repeater,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Tenstar_C3_sx1268_repeater_bridge_espnow,esp32-c3-devkitm-1,node_firmware,Full,False,False,False,True,False,False,True,False,False,False,False,True,Tenstar_C3_sx1268_repeater_bridge_espnow,Tenstar_C3_sx1268_repeater,Tenstar_C3_sx1268_repeater,exact ordinary Full group choice,full|Tenstar_C3_sx1268_repeater_bridge_espnow,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Tenstar_C3_sx1262_kiss_modem,esp32-c3-devkitm-1,host_modem_KISS,KISS,True,False,False,False,False,False,False,False,False,False,True,False,Tenstar_C3_sx1262_kiss_modem,,,,auto|Tenstar_C3_sx1262_kiss_modem,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Tenstar_C3_sx1268_kiss_modem,esp32-c3-devkitm-1,host_modem_KISS,KISS,True,False,False,False,False,False,False,False,False,False,True,False,Tenstar_C3_sx1268_kiss_modem,,,,auto|Tenstar_C3_sx1268_kiss_modem,not measured by this static routing audit +tracked_primary,raw_platformio_environment,ThinkNode_M2_Repeater,ESP32-S3-WROOM-1-N4,node_firmware,legacy,True,True,False,True,False,True,False,False,False,False,False,False,ThinkNode_M2_Repeater,ThinkNode_M2_Repeater,ThinkNode_M2_Repeater,exact ordinary Full group choice,full|ThinkNode_M2_Repeater,not measured by this static routing audit +tracked_primary,raw_platformio_environment,ThinkNode_M2_Repeater_bridge_espnow,ESP32-S3-WROOM-1-N4,node_firmware,Full,False,False,False,True,False,False,True,False,False,False,False,True,ThinkNode_M2_Repeater_bridge_espnow,ThinkNode_M2_Repeater,ThinkNode_M2_Repeater,exact ordinary Full group choice,full|ThinkNode_M2_Repeater_bridge_espnow,not measured by this static routing audit +tracked_primary,raw_platformio_environment,ThinkNode_M2_room_server,ESP32-S3-WROOM-1-N4,node_firmware,legacy,True,True,False,True,False,True,False,False,False,False,False,False,ThinkNode_M2_room_server,ThinkNode_M2_room_server,ThinkNode_M2_room_server,exact ordinary Full group choice,full|ThinkNode_M2_room_server,not measured by this static routing audit +tracked_primary,raw_platformio_environment,ThinkNode_M2_terminal_chat,ESP32-S3-WROOM-1-N4,node_firmware,legacy,False,False,False,False,False,False,False,False,False,False,False,True,ThinkNode_M2_terminal_chat,ThinkNode_M2_companion_radio_full,ThinkNode_M2_companion_radio_full,canonical replacement -> named Full Companion,auto|ThinkNode_M2_terminal_chat,not measured by this static routing audit +tracked_primary,raw_platformio_environment,ThinkNode_M2_companion_radio_ble,ESP32-S3-WROOM-1-N4,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,ThinkNode_M2_companion_radio_ble,ThinkNode_M2_companion_radio_full,ThinkNode_M2_companion_radio_full,canonical replacement -> named Full Companion,auto|ThinkNode_M2_companion_radio_ble,not measured by this static routing audit +tracked_primary,raw_platformio_environment,ThinkNode_M2_companion_radio_usb,ESP32-S3-WROOM-1-N4,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,ThinkNode_M2_companion_radio_usb,ThinkNode_M2_companion_radio_full,ThinkNode_M2_companion_radio_full,canonical replacement -> named Full Companion,auto|ThinkNode_M2_companion_radio_usb,not measured by this static routing audit +tracked_primary,raw_platformio_environment,ThinkNode_M2_companion_radio_wifi,ESP32-S3-WROOM-1-N4,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,ThinkNode_M2_companion_radio_wifi,ThinkNode_M2_companion_radio_full,ThinkNode_M2_companion_radio_full,canonical replacement -> named Full Companion,auto|ThinkNode_M2_companion_radio_wifi,not measured by this static routing audit +tracked_primary,raw_platformio_environment,ThinkNode_M2_companion_radio_serial,ESP32-S3-WROOM-1-N4,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,ThinkNode_M2_companion_radio_serial,ThinkNode_M2_companion_radio_full,ThinkNode_M2_companion_radio_full,canonical replacement -> named Full Companion,auto|ThinkNode_M2_companion_radio_serial,not measured by this static routing audit +tracked_primary,raw_platformio_environment,ThinkNode_M2_companion_radio_full,ESP32-S3-WROOM-1-N4,named_Full_Companion,Full,True,True,True,False,False,False,False,False,False,True,False,False,ThinkNode_M2_companion_radio_full,ThinkNode_M2_companion_radio_full,ThinkNode_M2_companion_radio_full,named Full Companion,full|ThinkNode_M2_companion_radio_full,not measured by this static routing audit +tracked_primary,raw_platformio_environment,ThinkNode_M2_kiss_modem,ESP32-S3-WROOM-1-N4,host_modem_KISS,KISS,True,False,False,False,False,False,False,False,False,False,True,False,ThinkNode_M2_kiss_modem,,,,auto|ThinkNode_M2_kiss_modem,not measured by this static routing audit +tracked_primary,raw_platformio_environment,ThinkNode_M5_Repeater,ESP32-S3-WROOM-1-N4,node_firmware,legacy,True,True,False,True,False,True,False,False,False,False,False,False,ThinkNode_M5_Repeater,ThinkNode_M5_Repeater,ThinkNode_M5_Repeater,exact ordinary Full group choice,full|ThinkNode_M5_Repeater,not measured by this static routing audit +tracked_primary,raw_platformio_environment,ThinkNode_M5_Repeater_bridge_espnow,ESP32-S3-WROOM-1-N4,node_firmware,Full,False,False,False,True,False,False,True,False,False,False,False,True,ThinkNode_M5_Repeater_bridge_espnow,ThinkNode_M5_Repeater,ThinkNode_M5_Repeater,exact ordinary Full group choice,full|ThinkNode_M5_Repeater_bridge_espnow,not measured by this static routing audit +tracked_primary,raw_platformio_environment,ThinkNode_M5_room_server,ESP32-S3-WROOM-1-N4,node_firmware,legacy,True,True,False,True,False,True,False,False,False,False,False,False,ThinkNode_M5_room_server,ThinkNode_M5_room_server,ThinkNode_M5_room_server,exact ordinary Full group choice,full|ThinkNode_M5_room_server,not measured by this static routing audit +tracked_primary,raw_platformio_environment,ThinkNode_M5_terminal_chat,ESP32-S3-WROOM-1-N4,node_firmware,legacy,False,False,False,False,False,False,False,False,False,False,False,True,ThinkNode_M5_terminal_chat,ThinkNode_M5_companion_radio_full,ThinkNode_M5_companion_radio_full,canonical replacement -> named Full Companion,auto|ThinkNode_M5_terminal_chat,not measured by this static routing audit +tracked_primary,raw_platformio_environment,ThinkNode_M5_companion_radio_ble,ESP32-S3-WROOM-1-N4,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,ThinkNode_M5_companion_radio_ble,ThinkNode_M5_companion_radio_full,ThinkNode_M5_companion_radio_full,canonical replacement -> named Full Companion,auto|ThinkNode_M5_companion_radio_ble,not measured by this static routing audit +tracked_primary,raw_platformio_environment,ThinkNode_M5_companion_radio_ble_ps,ESP32-S3-WROOM-1-N4,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,True,False,True,False,True,ThinkNode_M5_companion_radio_ble_ps,ThinkNode_M5_companion_radio_full,ThinkNode_M5_companion_radio_full,saved powersave alias -> canonical replacement -> named Full Companion,auto|ThinkNode_M5_companion_radio_ble_ps,not measured by this static routing audit +tracked_primary,raw_platformio_environment,ThinkNode_M5_companion_radio_usb,ESP32-S3-WROOM-1-N4,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,ThinkNode_M5_companion_radio_usb,ThinkNode_M5_companion_radio_full,ThinkNode_M5_companion_radio_full,canonical replacement -> named Full Companion,auto|ThinkNode_M5_companion_radio_usb,not measured by this static routing audit +tracked_primary,raw_platformio_environment,ThinkNode_M5_companion_radio_wifi,ESP32-S3-WROOM-1-N4,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,ThinkNode_M5_companion_radio_wifi,ThinkNode_M5_companion_radio_full,ThinkNode_M5_companion_radio_full,canonical replacement -> named Full Companion,auto|ThinkNode_M5_companion_radio_wifi,not measured by this static routing audit +tracked_primary,raw_platformio_environment,ThinkNode_M5_companion_radio_serial,ESP32-S3-WROOM-1-N4,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,ThinkNode_M5_companion_radio_serial,ThinkNode_M5_companion_radio_full,ThinkNode_M5_companion_radio_full,canonical replacement -> named Full Companion,auto|ThinkNode_M5_companion_radio_serial,not measured by this static routing audit +tracked_primary,raw_platformio_environment,ThinkNode_M5_companion_radio_full,ESP32-S3-WROOM-1-N4,named_Full_Companion,Full,True,True,True,False,False,False,False,False,False,True,False,False,ThinkNode_M5_companion_radio_full,ThinkNode_M5_companion_radio_full,ThinkNode_M5_companion_radio_full,named Full Companion,full|ThinkNode_M5_companion_radio_full,not measured by this static routing audit +tracked_primary,raw_platformio_environment,ThinkNode_M5_kiss_modem,ESP32-S3-WROOM-1-N4,host_modem_KISS,KISS,True,False,False,False,False,False,False,False,False,False,True,False,ThinkNode_M5_kiss_modem,,,,auto|ThinkNode_M5_kiss_modem,not measured by this static routing audit +tracked_primary,raw_platformio_environment,ThinkNode_M7_repeater,thinknode_m7,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,ThinkNode_M7_repeater,ThinkNode_M7_repeater,ThinkNode_M7_repeater_observer_mqtt,exact ordinary Full group choice,full|ThinkNode_M7_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,ThinkNode_M7_room_server,thinknode_m7,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,ThinkNode_M7_room_server,ThinkNode_M7_room_server,ThinkNode_M7_room_server_observer_mqtt,exact ordinary Full group choice,full|ThinkNode_M7_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,ThinkNode_M7_companion_radio_ble,thinknode_m7,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,ThinkNode_M7_companion_radio_ble,ThinkNode_M7_companion_radio_full,ThinkNode_M7_companion_radio_full,canonical replacement -> named Full Companion,auto|ThinkNode_M7_companion_radio_ble,not measured by this static routing audit +tracked_primary,raw_platformio_environment,ThinkNode_M7_companion_radio_usb,thinknode_m7,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,ThinkNode_M7_companion_radio_usb,ThinkNode_M7_companion_radio_full,ThinkNode_M7_companion_radio_full,canonical replacement -> named Full Companion,auto|ThinkNode_M7_companion_radio_usb,not measured by this static routing audit +tracked_primary,raw_platformio_environment,ThinkNode_M7_companion_radio_wifi,thinknode_m7,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,ThinkNode_M7_companion_radio_wifi,ThinkNode_M7_companion_radio_full,ThinkNode_M7_companion_radio_full,canonical replacement -> named Full Companion,auto|ThinkNode_M7_companion_radio_wifi,not measured by this static routing audit +tracked_primary,raw_platformio_environment,ThinkNode_M7_companion_radio_ethernet,thinknode_m7,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,ThinkNode_M7_companion_radio_ethernet,ThinkNode_M7_companion_radio_full,ThinkNode_M7_companion_radio_full,canonical replacement -> named Full Companion,auto|ThinkNode_M7_companion_radio_ethernet,not measured by this static routing audit +tracked_primary,raw_platformio_environment,ThinkNode_M7_companion_radio_full,thinknode_m7,named_Full_Companion,Full,True,True,True,False,False,False,False,False,False,True,False,False,ThinkNode_M7_companion_radio_full,ThinkNode_M7_companion_radio_full,ThinkNode_M7_companion_radio_full,named Full Companion,full|ThinkNode_M7_companion_radio_full,not measured by this static routing audit +tracked_primary,raw_platformio_environment,ThinkNode_M7_kiss_modem,thinknode_m7,host_modem_KISS,KISS,True,False,False,False,False,False,False,False,False,False,True,False,ThinkNode_M7_kiss_modem,,,,auto|ThinkNode_M7_kiss_modem,not measured by this static routing audit +tracked_primary,raw_platformio_environment,ThinkNode_M7_repeater_observer_mqtt,thinknode_m7,node_firmware,Full,True,True,False,True,True,False,True,False,False,False,False,False,ThinkNode_M7_repeater_observer_mqtt,ThinkNode_M7_repeater,ThinkNode_M7_repeater_observer_mqtt,exact ordinary Full group choice,full|ThinkNode_M7_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,ThinkNode_M7_room_server_observer_mqtt,thinknode_m7,node_firmware,Full,True,True,False,True,True,False,True,False,False,False,False,False,ThinkNode_M7_room_server_observer_mqtt,ThinkNode_M7_room_server,ThinkNode_M7_room_server_observer_mqtt,exact ordinary Full group choice,full|ThinkNode_M7_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,ThinkNode_M9_repeater_,thinknode_m9,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,ThinkNode_M9_repeater_,ThinkNode_M9_repeater_,ThinkNode_M9_repeater_,exact ordinary Full group choice,full|ThinkNode_M9_repeater_,not measured by this static routing audit +tracked_primary,raw_platformio_environment,ThinkNode_M9_room_server_,thinknode_m9,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,ThinkNode_M9_room_server_,ThinkNode_M9_room_server_,ThinkNode_M9_room_server_,exact ordinary Full group choice,full|ThinkNode_M9_room_server_,not measured by this static routing audit +tracked_primary,raw_platformio_environment,ThinkNode_M9_companion_radio_ble_,thinknode_m9,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,ThinkNode_M9_companion_radio_ble_,ThinkNode_M9_companion_radio_full_,ThinkNode_M9_companion_radio_wifi_,canonical replacement -> named Full Companion,auto|ThinkNode_M9_companion_radio_ble_,not measured by this static routing audit +tracked_primary,raw_platformio_environment,ThinkNode_M9_companion_radio_usb_,thinknode_m9,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,ThinkNode_M9_companion_radio_usb_,ThinkNode_M9_companion_radio_full_,ThinkNode_M9_companion_radio_wifi_,canonical replacement -> named Full Companion,auto|ThinkNode_M9_companion_radio_usb_,not measured by this static routing audit +tracked_primary,raw_platformio_environment,ThinkNode_M9_companion_radio_wifi_,thinknode_m9,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,ThinkNode_M9_companion_radio_wifi_,ThinkNode_M9_companion_radio_full_,ThinkNode_M9_companion_radio_wifi_,canonical replacement -> named Full Companion,auto|ThinkNode_M9_companion_radio_wifi_,not measured by this static routing audit +tracked_primary,raw_platformio_environment,ThinkNode_M9_kiss_modem,thinknode_m9,host_modem_KISS,KISS,True,False,False,False,False,False,False,False,False,False,True,False,ThinkNode_M9_kiss_modem,,,,auto|ThinkNode_M9_kiss_modem,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Xiao_C3_repeater,seeed_xiao_esp32c3,node_firmware,legacy,True,True,False,True,False,True,False,False,False,False,False,False,Xiao_C3_repeater,Xiao_C3_repeater,Xiao_C3_repeater,exact ordinary Full group choice,full|Xiao_C3_repeater,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Xiao_C3_room_server,seeed_xiao_esp32c3,node_firmware,legacy,True,True,False,True,False,True,False,False,False,False,False,False,Xiao_C3_room_server,Xiao_C3_room_server,Xiao_C3_room_server,exact ordinary Full group choice,full|Xiao_C3_room_server,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Xiao_C3_companion_radio_ble,seeed_xiao_esp32c3,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,Xiao_C3_companion_radio_ble,Xiao_C3_companion_radio_full,Xiao_C3_companion_radio_wifi,canonical replacement -> named Full Companion,auto|Xiao_C3_companion_radio_ble,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Xiao_C3_companion_radio_ble_ps,seeed_xiao_esp32c3,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,True,False,True,False,True,Xiao_C3_companion_radio_ble_ps,Xiao_C3_companion_radio_full,Xiao_C3_companion_radio_wifi,saved powersave alias -> canonical replacement -> named Full Companion,auto|Xiao_C3_companion_radio_ble_ps,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Xiao_C3_companion_radio_usb,seeed_xiao_esp32c3,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,Xiao_C3_companion_radio_usb,Xiao_C3_companion_radio_full,Xiao_C3_companion_radio_wifi,canonical replacement -> named Full Companion,auto|Xiao_C3_companion_radio_usb,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Xiao_C3_companion_radio_wifi,seeed_xiao_esp32c3,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,Xiao_C3_companion_radio_wifi,Xiao_C3_companion_radio_full,Xiao_C3_companion_radio_wifi,canonical replacement -> named Full Companion,auto|Xiao_C3_companion_radio_wifi,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Xiao_C3_kiss_modem,seeed_xiao_esp32c3,host_modem_KISS,KISS,True,False,False,False,False,False,False,False,False,False,True,False,Xiao_C3_kiss_modem,,,,auto|Xiao_C3_kiss_modem,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Xiao_C6_repeater_,esp32-c6-devkitm-1,node_firmware,legacy,True,True,False,True,False,False,False,False,False,False,False,False,Xiao_C6_repeater_,Xiao_C6_repeater_,Xiao_C6_repeater_,exact ordinary Full group choice,full|Xiao_C6_repeater_,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Xiao_C6_companion_radio_ble_,esp32-c6-devkitm-1,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,Xiao_C6_companion_radio_ble_,Xiao_C6_companion_radio_full_,Xiao_C6_companion_radio_ble_,canonical replacement -> named Full Companion,auto|Xiao_C6_companion_radio_ble_,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Meshimi_repeater_,esp32-c6-devkitm-1,node_firmware,legacy,True,True,False,True,False,False,False,False,False,False,False,False,Meshimi_repeater_,Meshimi_repeater_,Meshimi_repeater_,exact ordinary Full group choice,full|Meshimi_repeater_,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Meshimi_companion_radio_ble_,esp32-c6-devkitm-1,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,Meshimi_companion_radio_ble_,Meshimi_companion_radio_full_,Meshimi_companion_radio_ble_,canonical replacement -> named Full Companion,auto|Meshimi_companion_radio_ble_,not measured by this static routing audit +tracked_primary,raw_platformio_environment,WHY2025_badge_repeater_,esp32-c6-devkitm-1,node_firmware,legacy,True,True,False,True,False,False,False,False,False,False,False,False,WHY2025_badge_repeater_,WHY2025_badge_repeater_,WHY2025_badge_repeater_,exact ordinary Full group choice,full|WHY2025_badge_repeater_,not measured by this static routing audit +tracked_primary,raw_platformio_environment,WHY2025_badge_companion_radio_ble_,esp32-c6-devkitm-1,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,WHY2025_badge_companion_radio_ble_,WHY2025_badge_companion_radio_full_,WHY2025_badge_companion_radio_ble_,canonical replacement -> named Full Companion,auto|WHY2025_badge_companion_radio_ble_,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Xiao_C6_kiss_modem,esp32-c6-devkitm-1,host_modem_KISS,KISS,True,False,False,False,False,False,False,False,False,False,True,False,Xiao_C6_kiss_modem,,,,auto|Xiao_C6_kiss_modem,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Xiao_S3_repeater,seeed_xiao_esp32s3,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,Xiao_S3_repeater,Xiao_S3_repeater,Xiao_S3_repeater_observer_mqtt,exact ordinary Full group choice,full|Xiao_S3_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Xiao_S3_repeater_bridge_espnow,seeed_xiao_esp32s3,node_firmware,Full,False,False,False,True,True,False,True,False,False,False,False,True,Xiao_S3_repeater_bridge_espnow,Xiao_S3_repeater,Xiao_S3_repeater_observer_mqtt,exact ordinary Full group choice,full|Xiao_S3_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Xiao_S3_room_server,seeed_xiao_esp32s3,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,Xiao_S3_room_server,Xiao_S3_room_server,Xiao_S3_room_server_observer_mqtt,exact ordinary Full group choice,full|Xiao_S3_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Xiao_S3_companion_radio_ble,seeed_xiao_esp32s3,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,Xiao_S3_companion_radio_ble,Xiao_S3_companion_radio_full,Xiao_S3_companion_radio_ble,canonical replacement -> named Full Companion,auto|Xiao_S3_companion_radio_ble,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Xiao_S3_companion_radio_ble_ps,seeed_xiao_esp32s3,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,True,False,True,False,True,Xiao_S3_companion_radio_ble_ps,Xiao_S3_companion_radio_full,Xiao_S3_companion_radio_ble,saved powersave alias -> canonical replacement -> named Full Companion,auto|Xiao_S3_companion_radio_ble_ps,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Xiao_S3_companion_radio_usb,seeed_xiao_esp32s3,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,Xiao_S3_companion_radio_usb,Xiao_S3_companion_radio_full,Xiao_S3_companion_radio_ble,canonical replacement -> named Full Companion,auto|Xiao_S3_companion_radio_usb,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Xiao_S3_sensor,seeed_xiao_esp32s3,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,Xiao_S3_sensor,Xiao_S3_sensor,Xiao_S3_sensor,exact ordinary Full group choice,full|Xiao_S3_sensor,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Xiao_S3_kiss_modem,seeed_xiao_esp32s3,host_modem_KISS,KISS,True,False,False,False,False,False,False,False,False,False,True,False,Xiao_S3_kiss_modem,,,,auto|Xiao_S3_kiss_modem,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Xiao_S3_repeater_observer_mqtt,seeed_xiao_esp32s3,node_firmware,Full,True,True,False,True,True,False,True,False,False,False,False,False,Xiao_S3_repeater_observer_mqtt,Xiao_S3_repeater,Xiao_S3_repeater_observer_mqtt,exact ordinary Full group choice,full|Xiao_S3_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Xiao_S3_room_server_observer_mqtt,seeed_xiao_esp32s3,node_firmware,Full,True,True,False,True,True,False,True,False,False,False,False,False,Xiao_S3_room_server_observer_mqtt,Xiao_S3_room_server,Xiao_S3_room_server_observer_mqtt,exact ordinary Full group choice,full|Xiao_S3_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Xiao_S3_WIO_repeater,seeed_xiao_esp32s3,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,Xiao_S3_WIO_repeater,Xiao_S3_WIO_repeater,Xiao_S3_WIO_repeater_observer_mqtt,exact ordinary Full group choice,full|Xiao_S3_WIO_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Xiao_S3_WIO_partition_expander,seeed_xiao_esp32s3,development_or_migration_utility,source,False,False,False,False,False,False,False,False,False,False,False,True,Xiao_S3_WIO_partition_expander,,,,auto|Xiao_S3_WIO_partition_expander,not measured by this static routing audit +tracked_primary,raw_platformio_environment,xiao_s3_partition_migrator,seeed_xiao_esp32s3_migrator,development_or_migration_utility,source,False,False,False,False,False,False,False,False,False,False,False,True,xiao_s3_partition_migrator,,,,auto|xiao_s3_partition_migrator,not measured by this static routing audit +tracked_primary,raw_platformio_environment,xiao_s3_partition_migrator_lora_repeater,seeed_xiao_esp32s3_migrator,development_or_migration_utility,source,False,False,False,False,False,False,False,False,False,False,False,True,xiao_s3_partition_migrator_lora_repeater,,,,auto|xiao_s3_partition_migrator_lora_repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,raw_platformio_environment,xiao_s3_partition_legacy_seed,seeed_xiao_esp32s3,development_or_migration_utility,source,False,False,False,False,False,False,False,False,False,False,False,True,xiao_s3_partition_legacy_seed,,,,auto|xiao_s3_partition_legacy_seed,not measured by this static routing audit +tracked_primary,raw_platformio_environment,xiao_s3_partition_migrator_test_hold,seeed_xiao_esp32s3_migrator,development_or_migration_utility,source,False,False,False,False,False,False,False,False,False,False,False,True,xiao_s3_partition_migrator_test_hold,,,,auto|xiao_s3_partition_migrator_test_hold,not measured by this static routing audit +tracked_primary,raw_platformio_environment,xiao_s3_partition_migrator_test_usb_diagnostic,seeed_xiao_esp32s3_migrator,development_or_migration_utility,source,False,False,False,False,False,False,False,False,False,False,False,True,xiao_s3_partition_migrator_test_usb_diagnostic,,,,auto|xiao_s3_partition_migrator_test_usb_diagnostic,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Xiao_S3_WIO_repeater_bridge_espnow,seeed_xiao_esp32s3,node_firmware,Full,False,False,False,True,True,False,True,False,False,False,False,True,Xiao_S3_WIO_repeater_bridge_espnow,Xiao_S3_WIO_repeater,Xiao_S3_WIO_repeater_observer_mqtt,exact ordinary Full group choice,full|Xiao_S3_WIO_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Xiao_S3_WIO_repeater_observer_mqtt,seeed_xiao_esp32s3,node_firmware,Full,True,True,False,True,True,False,True,False,False,False,False,False,Xiao_S3_WIO_repeater_observer_mqtt,Xiao_S3_WIO_repeater,Xiao_S3_WIO_repeater_observer_mqtt,exact ordinary Full group choice,full|Xiao_S3_WIO_repeater_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Xiao_S3_WIO_room_server_observer_mqtt,seeed_xiao_esp32s3,node_firmware,Full,True,True,False,True,True,False,True,False,False,False,False,False,Xiao_S3_WIO_room_server_observer_mqtt,Xiao_S3_WIO_room_server,Xiao_S3_WIO_room_server_observer_mqtt,exact ordinary Full group choice,full|Xiao_S3_WIO_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Xiao_S3_WIO_room_server,seeed_xiao_esp32s3,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,Xiao_S3_WIO_room_server,Xiao_S3_WIO_room_server,Xiao_S3_WIO_room_server_observer_mqtt,exact ordinary Full group choice,full|Xiao_S3_WIO_room_server_observer_mqtt,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Xiao_S3_WIO_terminal_chat,seeed_xiao_esp32s3,node_firmware,legacy,False,False,False,False,False,False,False,False,False,False,False,True,Xiao_S3_WIO_terminal_chat,Xiao_S3_WIO_companion_radio_full,Xiao_S3_WIO_companion_radio_full,canonical replacement -> named Full Companion,auto|Xiao_S3_WIO_terminal_chat,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Xiao_S3_WIO_companion_radio_usb,seeed_xiao_esp32s3,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,Xiao_S3_WIO_companion_radio_usb,Xiao_S3_WIO_companion_radio_full,Xiao_S3_WIO_companion_radio_full,canonical replacement -> named Full Companion,auto|Xiao_S3_WIO_companion_radio_usb,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Xiao_S3_WIO_companion_radio_ble,seeed_xiao_esp32s3,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,Xiao_S3_WIO_companion_radio_ble,Xiao_S3_WIO_companion_radio_full,Xiao_S3_WIO_companion_radio_full,canonical replacement -> named Full Companion,auto|Xiao_S3_WIO_companion_radio_ble,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Xiao_S3_WIO_companion_radio_ble_ps,seeed_xiao_esp32s3,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,True,False,True,False,True,Xiao_S3_WIO_companion_radio_ble_ps,Xiao_S3_WIO_companion_radio_full,Xiao_S3_WIO_companion_radio_full,saved powersave alias -> canonical replacement -> named Full Companion,auto|Xiao_S3_WIO_companion_radio_ble_ps,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Xiao_S3_WIO_companion_radio_serial,seeed_xiao_esp32s3,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,Xiao_S3_WIO_companion_radio_serial,Xiao_S3_WIO_companion_radio_full,Xiao_S3_WIO_companion_radio_full,canonical replacement -> named Full Companion,auto|Xiao_S3_WIO_companion_radio_serial,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Xiao_S3_WIO_companion_radio_wifi,seeed_xiao_esp32s3,legacy_Companion_or_transport_alias,source,False,False,False,False,False,False,False,False,False,True,False,True,Xiao_S3_WIO_companion_radio_wifi,Xiao_S3_WIO_companion_radio_full,Xiao_S3_WIO_companion_radio_full,canonical replacement -> named Full Companion,auto|Xiao_S3_WIO_companion_radio_wifi,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Xiao_S3_WIO_companion_radio_full,seeed_xiao_esp32s3,named_Full_Companion,Full,True,True,True,False,False,False,False,False,False,True,False,False,Xiao_S3_WIO_companion_radio_full,Xiao_S3_WIO_companion_radio_full,Xiao_S3_WIO_companion_radio_full,named Full Companion,full|Xiao_S3_WIO_companion_radio_full,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Xiao_S3_WIO_sensor,seeed_xiao_esp32s3,node_firmware,Full,True,True,False,True,True,False,False,False,False,False,False,False,Xiao_S3_WIO_sensor,Xiao_S3_WIO_sensor,Xiao_S3_WIO_sensor,exact ordinary Full group choice,full|Xiao_S3_WIO_sensor,not measured by this static routing audit +tracked_primary,raw_platformio_environment,Xiao_S3_WIO_kiss_modem,seeed_xiao_esp32s3,host_modem_KISS,KISS,True,False,False,False,False,False,False,False,False,False,True,False,Xiao_S3_WIO_kiss_modem,,,,auto|Xiao_S3_WIO_kiss_modem,not measured by this static routing audit +optional_local_hil,raw_platformio_environment,profile_switch_xiao,seeed_xiao_esp32s3,optional_local_hil_fixture,source,False,False,False,False,False,False,False,False,False,False,False,True,profile_switch_xiao,,,,auto|profile_switch_xiao,not measured by this static routing audit +optional_local_hil,raw_platformio_environment,profile_switch_indicator,esp32-s3-devkitc-1,optional_local_hil_fixture,source,False,False,False,False,False,False,False,False,False,False,False,True,profile_switch_indicator,,,,auto|profile_switch_indicator,not measured by this static routing audit +optional_local_hil,raw_platformio_environment,profile_switch_heltec_v4,esp32-s3-devkitc-1,optional_local_hil_fixture,source,False,False,False,False,False,False,False,False,False,False,False,True,profile_switch_heltec_v4,,,,auto|profile_switch_heltec_v4,not measured by this static routing audit +optional_local_hil,raw_platformio_environment,profile_four_tx_v4_rx,esp32-s3-devkitc-1,optional_local_hil_fixture,source,False,False,False,False,False,False,False,False,False,False,False,False,profile_four_tx_v4_rx,,,,auto|profile_four_tx_v4_rx,not measured by this static routing audit +tracked_primary,generated_logical_alias,Ebyte_EoRa-S3_Repeater_lora_ota_no_external_sensors,ebyte_eora-s3,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,Ebyte_EoRa-S3_Repeater,Ebyte_EoRa-S3_Repeater,Ebyte_EoRa-S3_repeater_observer_mqtt,exact ordinary Full group choice,standard|Ebyte_EoRa-S3_Repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,Ebyte_EoRa-S3_room_server_lora_ota_no_external_sensors,ebyte_eora-s3,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,Ebyte_EoRa-S3_room_server,Ebyte_EoRa-S3_room_server,Ebyte_EoRa-S3_room_server_observer_mqtt,exact ordinary Full group choice,standard|Ebyte_EoRa-S3_room_server_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,Generic_E22_sx1262_repeater_lora_ota_no_external_sensors,esp32doit-devkit-v1,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,Generic_E22_sx1262_repeater,Generic_E22_sx1262_repeater,Generic_E22_sx1262_repeater,exact ordinary Full group choice,standard|Generic_E22_sx1262_repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,Generic_E22_sx1268_repeater_lora_ota_no_external_sensors,esp32doit-devkit-v1,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,Generic_E22_sx1268_repeater,Generic_E22_sx1268_repeater,Generic_E22_sx1268_repeater,exact ordinary Full group choice,standard|Generic_E22_sx1268_repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,Generic_ESPNOW_repeatr_lora_ota_no_external_sensors,esp32-c3-devkitm-1,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,Generic_ESPNOW_repeatr,Generic_ESPNOW_repeatr,Generic_ESPNOW_repeatr,exact ordinary Full group choice,standard|Generic_ESPNOW_repeatr_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,Generic_ESPNOW_room_svr_lora_ota_no_external_sensors,esp32-c3-devkitm-1,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,Generic_ESPNOW_room_svr,Generic_ESPNOW_room_svr,Generic_ESPNOW_room_svr,exact ordinary Full group choice,standard|Generic_ESPNOW_room_svr_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,GEPRC_Linkflow_900_repeater_lora_ota_no_external_sensors,esp32dev,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,GEPRC_Linkflow_900_repeater,GEPRC_Linkflow_900_repeater,GEPRC_Linkflow_900_repeater,exact ordinary Full group choice,standard|GEPRC_Linkflow_900_repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,Heltec_ct62_repeater_lora_ota_no_external_sensors,esp32-c3-devkitm-1,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,Heltec_ct62_repeater,Heltec_ct62_repeater,Heltec_ct62_repeater,exact ordinary Full group choice,standard|Heltec_ct62_repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,Heltec_E213_repeater_lora_ota_no_external_sensors,heltec_e213,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,Heltec_E213_repeater,Heltec_E213_repeater,Heltec_E213_repeater_observer_mqtt,exact ordinary Full group choice,standard|Heltec_E213_repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,Heltec_E213_room_server_lora_ota_no_external_sensors,heltec_e213,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,Heltec_E213_room_server,Heltec_E213_room_server,Heltec_E213_room_server_observer_mqtt,exact ordinary Full group choice,standard|Heltec_E213_room_server_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,Heltec_E290_repeater_lora_ota_no_external_sensors,heltec_e290,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,Heltec_E290_repeater,Heltec_E290_repeater,Heltec_E290_repeater_observer_mqtt,exact ordinary Full group choice,standard|Heltec_E290_repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,Heltec_E290_room_server_lora_ota_no_external_sensors,heltec_e290,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,Heltec_E290_room_server,Heltec_E290_room_server,Heltec_E290_room_server_observer_mqtt,exact ordinary Full group choice,standard|Heltec_E290_room_server_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,heltec_rc32_without_display_repeater_lora_ota_no_external_sensors,heltec-rc32,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,heltec_rc32_without_display_repeater,heltec_rc32_without_display_repeater,heltec_rc32_without_display_repeater_observer_mqtt,exact ordinary Full group choice,standard|heltec_rc32_without_display_repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,heltec_rc32_without_display_room_server_lora_ota_no_external_sensors,heltec-rc32,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,heltec_rc32_without_display_room_server,heltec_rc32_without_display_room_server,heltec_rc32_without_display_room_server_observer_mqtt,exact ordinary Full group choice,standard|heltec_rc32_without_display_room_server_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,heltec_rc32_repeater_lora_ota_no_external_sensors,heltec-rc32,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,heltec_rc32_repeater,heltec_rc32_repeater,heltec_rc32_repeater_observer_mqtt,exact ordinary Full group choice,standard|heltec_rc32_repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,heltec_rc32_room_server_lora_ota_no_external_sensors,heltec-rc32,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,heltec_rc32_room_server,heltec_rc32_room_server,heltec_rc32_room_server_observer_mqtt,exact ordinary Full group choice,standard|heltec_rc32_room_server_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,Heltec_T190_repeater_lora_ota_no_external_sensors,heltec_t190,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,Heltec_T190_repeater_,Heltec_T190_repeater_,Heltec_T190_repeater_observer_mqtt,exact ordinary Full group choice,standard|Heltec_T190_repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,Heltec_T190_room_server_lora_ota_no_external_sensors,heltec_t190,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,Heltec_T190_room_server_,Heltec_T190_room_server_,Heltec_T190_room_server_observer_mqtt,exact ordinary Full group choice,standard|Heltec_T190_room_server_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,Heltec_Wireless_Tracker_repeater_lora_ota_no_external_sensors,esp32-s3-devkitc-1,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,Heltec_Wireless_Tracker_repeater,Heltec_Wireless_Tracker_repeater,Heltec_Wireless_Tracker_repeater_observer_mqtt,exact ordinary Full group choice,standard|Heltec_Wireless_Tracker_repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,Heltec_Wireless_Tracker_room_server_lora_ota_no_external_sensors,esp32-s3-devkitc-1,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,Heltec_Wireless_Tracker_room_server,Heltec_Wireless_Tracker_room_server,Heltec_Wireless_Tracker_room_server_observer_mqtt,exact ordinary Full group choice,standard|Heltec_Wireless_Tracker_room_server_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,heltec_tracker_v2_repeater_lora_ota_no_external_sensors,heltec_tracker_v2,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,heltec_tracker_v2_repeater,heltec_tracker_v2_repeater,heltec_tracker_v2_repeater_observer_mqtt,exact ordinary Full group choice,standard|heltec_tracker_v2_repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,heltec_tracker_v2_room_server_lora_ota_no_external_sensors,heltec_tracker_v2,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,heltec_tracker_v2_room_server,heltec_tracker_v2_room_server,heltec_tracker_v2_room_server_observer_mqtt,exact ordinary Full group choice,standard|heltec_tracker_v2_room_server_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,Heltec_v2_repeater_lora_ota_no_external_sensors,heltec_wifi_lora_32_V2,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,Heltec_v2_repeater,Heltec_v2_repeater,Heltec_v2_repeater,exact ordinary Full group choice,standard|Heltec_v2_repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,Heltec_v2_room_server_lora_ota_no_external_sensors,heltec_wifi_lora_32_V2,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,Heltec_v2_room_server,Heltec_v2_room_server,Heltec_v2_room_server,exact ordinary Full group choice,standard|Heltec_v2_room_server_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,Heltec_v3_repeater_lora_ota_no_external_sensors,esp32-s3-devkitc-1,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,Heltec_v3_repeater,Heltec_v3_repeater,Heltec_v3_repeater_observer_mqtt,exact ordinary Full group choice,standard|Heltec_v3_repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,Heltec_v3_room_server_lora_ota_no_external_sensors,esp32-s3-devkitc-1,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,Heltec_v3_room_server,Heltec_v3_room_server,Heltec_v3_room_server_observer_mqtt,exact ordinary Full group choice,standard|Heltec_v3_room_server_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,Heltec_WSL3_repeater_lora_ota_no_external_sensors,esp32-s3-devkitc-1,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,Heltec_WSL3_repeater,Heltec_WSL3_repeater,Heltec_WSL3_repeater_observer_mqtt,exact ordinary Full group choice,standard|Heltec_WSL3_repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,Heltec_WSL3_room_server_lora_ota_no_external_sensors,esp32-s3-devkitc-1,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,Heltec_WSL3_room_server,Heltec_WSL3_room_server,Heltec_WSL3_room_server_observer_mqtt,exact ordinary Full group choice,standard|Heltec_WSL3_room_server_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,heltec_v4_repeater_lora_ota_no_external_sensors,heltec_v4,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,heltec_v4_repeater,heltec_v4_repeater,heltec_v4_repeater_observer_mqtt,exact ordinary Full group choice,standard|heltec_v4_repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,heltec_v4_expansionkit_repeater_lora_ota_no_external_sensors,heltec_v4,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,heltec_v4_expansionkit_repeater,heltec_v4_expansionkit_repeater,heltec_v4_expansionkit_repeater_observer_mqtt,exact ordinary Full group choice,standard|heltec_v4_expansionkit_repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,heltec_v4_room_server_lora_ota_no_external_sensors,heltec_v4,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,heltec_v4_room_server,heltec_v4_room_server,heltec_v4_room_server_observer_mqtt,exact ordinary Full group choice,standard|heltec_v4_room_server_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,heltec_v4_tft_repeater_lora_ota_no_external_sensors,heltec_v4,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,heltec_v4_tft_repeater,heltec_v4_tft_repeater,heltec_v4_tft_repeater,exact ordinary Full group choice,standard|heltec_v4_tft_repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,heltec_v4_tft_room_server_lora_ota_no_external_sensors,heltec_v4,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,heltec_v4_tft_room_server,heltec_v4_tft_room_server,heltec_v4_tft_room_server,exact ordinary Full group choice,standard|heltec_v4_tft_room_server_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,heltec_v4_partition_migrator_lora_repeater_lora_ota_no_external_sensors,heltec_v4_migrator,development_or_migration_utility,source,False,False,False,False,False,False,False,False,True,False,False,True,heltec_v4_partition_migrator_lora_repeater,,,,standard|heltec_v4_partition_migrator_lora_repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,heltec_v4_r8_repeater_lora_ota_no_external_sensors,heltec_v4_r8,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,heltec_v4_r8_repeater,heltec_v4_r8_repeater,heltec_v4_r8_repeater_observer_mqtt,exact ordinary Full group choice,standard|heltec_v4_r8_repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,heltec_v4_r8_room_server_lora_ota_no_external_sensors,heltec_v4_r8,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,heltec_v4_r8_room_server,heltec_v4_r8_room_server,heltec_v4_r8_room_server_observer_mqtt,exact ordinary Full group choice,standard|heltec_v4_r8_room_server_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,heltec_v4_r8_tft_repeater_lora_ota_no_external_sensors,heltec_v4_r8,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,heltec_v4_r8_tft_repeater,heltec_v4_r8_tft_repeater,heltec_v4_r8_tft_repeater_observer_mqtt,exact ordinary Full group choice,standard|heltec_v4_r8_tft_repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,heltec_v4_r8_tft_room_server_lora_ota_no_external_sensors,heltec_v4_r8,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,heltec_v4_r8_tft_room_server,heltec_v4_r8_tft_room_server,heltec_v4_r8_tft_room_server_observer_mqtt,exact ordinary Full group choice,standard|heltec_v4_r8_tft_room_server_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,Heltec_Wireless_Paper_repeater_lora_ota_no_external_sensors,esp32-s3-devkitc-1,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,Heltec_Wireless_Paper_repeater,Heltec_Wireless_Paper_repeater,Heltec_Wireless_Paper_repeater_observer_mqtt,exact ordinary Full group choice,standard|Heltec_Wireless_Paper_repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,Heltec_Wireless_Paper_room_server_lora_ota_no_external_sensors,esp32-s3-devkitc-1,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,Heltec_Wireless_Paper_room_server,Heltec_Wireless_Paper_room_server,Heltec_Wireless_Paper_room_server_observer_mqtt,exact ordinary Full group choice,standard|Heltec_Wireless_Paper_room_server_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,LilyGo_T3S3_sx1262_repeater_lora_ota_no_external_sensors,t3_s3_v1_x,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,LilyGo_T3S3_sx1262_repeater,LilyGo_T3S3_sx1262_repeater,LilyGo_T3S3_sx1262_repeater_observer_mqtt,exact ordinary Full group choice,standard|LilyGo_T3S3_sx1262_repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,LilyGo_T3S3_sx1262_room_server_lora_ota_no_external_sensors,t3_s3_v1_x,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,LilyGo_T3S3_sx1262_room_server,LilyGo_T3S3_sx1262_room_server,LilyGo_T3S3_sx1262_room_server_observer_mqtt,exact ordinary Full group choice,standard|LilyGo_T3S3_sx1262_room_server_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,LilyGo_T3S3_sx1276_repeater_lora_ota_no_external_sensors,t3_s3_v1_x,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,LilyGo_T3S3_sx1276_repeater,LilyGo_T3S3_sx1276_repeater,LilyGo_T3S3_sx1276_repeater_observer_mqtt,exact ordinary Full group choice,standard|LilyGo_T3S3_sx1276_repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,LilyGo_T3S3_sx1276_room_server_lora_ota_no_external_sensors,t3_s3_v1_x,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,LilyGo_T3S3_sx1276_room_server,LilyGo_T3S3_sx1276_room_server,LilyGo_T3S3_sx1276_room_server_observer_mqtt,exact ordinary Full group choice,standard|LilyGo_T3S3_sx1276_room_server_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,LilyGo_TBeam_1W_repeater_lora_ota_no_external_sensors,t_beam_1w,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,LilyGo_TBeam_1W_repeater,LilyGo_TBeam_1W_repeater,LilyGo_TBeam_1W_repeater_observer_mqtt,exact ordinary Full group choice,standard|LilyGo_TBeam_1W_repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,LilyGo_TBeam_1W_room_server_lora_ota_no_external_sensors,t_beam_1w,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,LilyGo_TBeam_1W_room_server,LilyGo_TBeam_1W_room_server,LilyGo_TBeam_1W_room_server_observer_mqtt,exact ordinary Full group choice,standard|LilyGo_TBeam_1W_room_server_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,T_Beam_S3_Supreme_SX1262_repeater_lora_ota_no_external_sensors,t_beams3_supreme,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,T_Beam_S3_Supreme_SX1262_repeater,T_Beam_S3_Supreme_SX1262_repeater,T_Beam_S3_Supreme_SX1262_repeater_observer_mqtt,exact ordinary Full group choice,standard|T_Beam_S3_Supreme_SX1262_repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,T_Beam_S3_Supreme_SX1262_room_server_lora_ota_no_external_sensors,t_beams3_supreme,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,T_Beam_S3_Supreme_SX1262_room_server,T_Beam_S3_Supreme_SX1262_room_server,T_Beam_S3_Supreme_SX1262_room_server_observer_mqtt,exact ordinary Full group choice,standard|T_Beam_S3_Supreme_SX1262_room_server_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,Tbeam_SX1262_repeater_lora_ota_no_external_sensors,ttgo-t-beam,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,Tbeam_SX1262_repeater,Tbeam_SX1262_repeater_observer_mqtt,Tbeam_SX1262_repeater_observer_mqtt,exact ordinary Full group choice,standard|Tbeam_SX1262_repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,Tbeam_SX1262_room_server_lora_ota_no_external_sensors,ttgo-t-beam,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,Tbeam_SX1262_room_server,Tbeam_SX1262_room_server_observer_mqtt,Tbeam_SX1262_room_server_observer_mqtt,exact ordinary Full group choice,standard|Tbeam_SX1262_room_server_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,Tbeam_SX1276_repeater_lora_ota_no_external_sensors,ttgo-t-beam,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,Tbeam_SX1276_repeater,Tbeam_SX1276_repeater_observer_mqtt,Tbeam_SX1276_repeater_observer_mqtt,exact ordinary Full group choice,standard|Tbeam_SX1276_repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,Tbeam_SX1276_room_server_lora_ota_no_external_sensors,ttgo-t-beam,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,Tbeam_SX1276_room_server,Tbeam_SX1276_room_server_observer_mqtt,Tbeam_SX1276_room_server_observer_mqtt,exact ordinary Full group choice,standard|Tbeam_SX1276_room_server_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,LilyGo_TDeck_repeater_lora_ota_no_external_sensors,t-deck,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,LilyGo_TDeck_repeater,LilyGo_TDeck_repeater,LilyGo_TDeck_repeater,exact ordinary Full group choice,standard|LilyGo_TDeck_repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,LilyGo_TETH_Elite_sx1262_repeater_lora_ota_no_external_sensors,esp32s3box,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,LilyGo_TETH_Elite_sx1262_repeater,LilyGo_TETH_Elite_sx1262_repeater,LilyGo_TETH_Elite_sx1262_repeater_observer_mqtt,exact ordinary Full group choice,standard|LilyGo_TETH_Elite_sx1262_repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,LilyGo_TETH_Elite_sx1262_room_server_lora_ota_no_external_sensors,esp32s3box,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,LilyGo_TETH_Elite_sx1262_room_server,LilyGo_TETH_Elite_sx1262_room_server,LilyGo_TETH_Elite_sx1262_room_server_observer_mqtt,exact ordinary Full group choice,standard|LilyGo_TETH_Elite_sx1262_room_server_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,LilyGo_Tlora_C6_repeater_lora_ota_no_external_sensors,esp32-c6-devkitm-1,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,LilyGo_Tlora_C6_repeater_,LilyGo_Tlora_C6_repeater_,LilyGo_Tlora_C6_repeater_,exact ordinary Full group choice,standard|LilyGo_Tlora_C6_repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,LilyGo_Tlora_C6_room_server_lora_ota_no_external_sensors,esp32-c6-devkitm-1,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,LilyGo_Tlora_C6_room_server_,LilyGo_Tlora_C6_room_server_,LilyGo_Tlora_C6_room_server_,exact ordinary Full group choice,standard|LilyGo_Tlora_C6_room_server_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,LilyGo_TLora_V2_1_1_6_repeater_lora_ota_no_external_sensors,ttgo-lora32-v1,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,LilyGo_TLora_V2_1_1_6_repeater,LilyGo_TLora_V2_1_1_6_repeater,LilyGo_TLora_V2_1_1_6_repeater,exact ordinary Full group choice,standard|LilyGo_TLora_V2_1_1_6_repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,LilyGo_TLora_V2_1_1_6_room_server_lora_ota_no_external_sensors,ttgo-lora32-v1,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,LilyGo_TLora_V2_1_1_6_room_server,LilyGo_TLora_V2_1_1_6_room_server_observer_mqtt_,LilyGo_TLora_V2_1_1_6_room_server_observer_mqtt_,exact ordinary Full group choice,standard|LilyGo_TLora_V2_1_1_6_room_server_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,M5Stack_Unit_C6L_repeater_lora_ota_no_external_sensors,esp32-c6-devkitm-1,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,M5Stack_Unit_C6L_repeater,M5Stack_Unit_C6L_repeater,M5Stack_Unit_C6L_repeater,exact ordinary Full group choice,standard|M5Stack_Unit_C6L_repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,M5Stack_Unit_C6L_room_server_lora_ota_no_external_sensors,esp32-c6-devkitm-1,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,M5Stack_Unit_C6L_room_server,M5Stack_Unit_C6L_room_server,M5Stack_Unit_C6L_room_server,exact ordinary Full group choice,standard|M5Stack_Unit_C6L_room_server_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,Meshadventurer_sx1262_repeater_lora_ota_no_external_sensors,esp32doit-devkit-v1,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,Meshadventurer_sx1262_repeater,Meshadventurer_sx1262_repeater,Meshadventurer_sx1262_repeater,exact ordinary Full group choice,standard|Meshadventurer_sx1262_repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,Meshadventurer_sx1268_repeater_lora_ota_no_external_sensors,esp32doit-devkit-v1,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,Meshadventurer_sx1268_repeater,Meshadventurer_sx1268_repeater,Meshadventurer_sx1268_repeater,exact ordinary Full group choice,standard|Meshadventurer_sx1268_repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,Meshadventurer_sx1262_room_server_lora_ota_no_external_sensors,esp32doit-devkit-v1,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,Meshadventurer_sx1262_room_server,Meshadventurer_sx1262_room_server,Meshadventurer_sx1262_room_server,exact ordinary Full group choice,standard|Meshadventurer_sx1262_room_server_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,Meshadventurer_sx1268_room_server_lora_ota_no_external_sensors,esp32doit-devkit-v1,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,Meshadventurer_sx1268_room_server,Meshadventurer_sx1268_room_server,Meshadventurer_sx1268_room_server,exact ordinary Full group choice,standard|Meshadventurer_sx1268_room_server_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,meshnology_w12_repeater_lora_ota_no_external_sensors,meshnology_w12,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,meshnology_w12_repeater,meshnology_w12_repeater,meshnology_w12_repeater_observer_mqtt,exact ordinary Full group choice,standard|meshnology_w12_repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,meshnology_w12_room_server_lora_ota_no_external_sensors,meshnology_w12,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,meshnology_w12_room_server,meshnology_w12_room_server,meshnology_w12_room_server_observer_mqtt,exact ordinary Full group choice,standard|meshnology_w12_room_server_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,MKE_s3_repeater_lora_ota_no_external_sensors,esp32-s3-devkitc-1,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,MKE_s3_repeater,MKE_s3_repeater,MKE_s3_repeater,exact ordinary Full group choice,standard|MKE_s3_repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,MKE_s3_room_server_lora_ota_no_external_sensors,esp32-s3-devkitc-1,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,MKE_s3_room_server,MKE_s3_room_server,MKE_s3_room_server,exact ordinary Full group choice,standard|MKE_s3_room_server_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,nibble_screen_connect_repeater_lora_ota_no_external_sensors,esp32-s3-zero,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,nibble_screen_connect_repeater_,nibble_screen_connect_repeater_,nibble_screen_connect_repeater_,exact ordinary Full group choice,standard|nibble_screen_connect_repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,nibble_screen_connect_room_server_lora_ota_no_external_sensors,esp32-s3-zero,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,nibble_screen_connect_room_server_,nibble_screen_connect_room_server_,nibble_screen_connect_room_server_,exact ordinary Full group choice,standard|nibble_screen_connect_room_server_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,nibble_zero_connect_repeater_lora_ota_no_external_sensors,esp32-s3-zero,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,nibble_zero_connect_repeater_,nibble_zero_connect_repeater_,nibble_zero_connect_repeater_,exact ordinary Full group choice,standard|nibble_zero_connect_repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,nibble_zero_connect_room_server_lora_ota_no_external_sensors,esp32-s3-zero,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,nibble_zero_connect_room_server_,nibble_zero_connect_room_server_,nibble_zero_connect_room_server_,exact ordinary Full group choice,standard|nibble_zero_connect_room_server_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,RAK_3112_repeater_lora_ota_no_external_sensors,esp32-s3-devkitc-1,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,RAK_3112_repeater,RAK_3112_repeater,RAK_3112_repeater_observer_mqtt,exact ordinary Full group choice,standard|RAK_3112_repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,RAK_3112_room_server_lora_ota_no_external_sensors,esp32-s3-devkitc-1,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,RAK_3112_room_server,RAK_3112_room_server,RAK_3112_room_server_observer_mqtt,exact ordinary Full group choice,standard|RAK_3112_room_server_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,Station_G2_repeater_lora_ota_no_external_sensors,station-g2,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,Station_G2_repeater,Station_G2_repeater_observer_mqtt,Station_G2_repeater_observer_mqtt,exact ordinary Full group choice,standard|Station_G2_repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,Station_G2_logging_repeater_lora_ota_no_external_sensors,station-g2,reduced_LoRa_OTA,reduced,False,False,False,False,False,False,False,True,True,False,False,True,Station_G2_logging_repeater,Station_G2_repeater_observer_mqtt,Station_G2_repeater_observer_mqtt,logging alias -> exact ordinary Full group choice,standard|Station_G2_logging_repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,Station_G2_room_server_lora_ota_no_external_sensors,station-g2,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,Station_G2_room_server,Station_G2_room_server_observer_mqtt,Station_G2_room_server_observer_mqtt,exact ordinary Full group choice,standard|Station_G2_room_server_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,Station_G3_ESP32_repeater_lora_ota_no_external_sensors,station-g3-esp32,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,Station_G3_ESP32_repeater,Station_G3_ESP32_repeater,Station_G3_ESP32_repeater_observer_mqtt,exact ordinary Full group choice,standard|Station_G3_ESP32_repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,Station_G3_ESP32_logging_repeater_lora_ota_no_external_sensors,station-g3-esp32,reduced_LoRa_OTA,reduced,False,False,False,False,False,False,False,True,True,False,False,True,Station_G3_ESP32_logging_repeater,Station_G3_ESP32_repeater,Station_G3_ESP32_repeater_observer_mqtt,logging alias -> exact ordinary Full group choice,standard|Station_G3_ESP32_logging_repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,Station_G3_ESP32_room_server_lora_ota_no_external_sensors,station-g3-esp32,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,Station_G3_ESP32_room_server,Station_G3_ESP32_room_server,Station_G3_ESP32_room_server_observer_mqtt,exact ordinary Full group choice,standard|Station_G3_ESP32_room_server_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,Station_G3_ESP32_r2_repeater_lora_ota_no_external_sensors,station-g3-esp32,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,Station_G3_ESP32_r2_repeater,Station_G3_ESP32_r2_repeater_observer_mqtt,Station_G3_ESP32_r2_repeater_observer_mqtt,exact ordinary Full group choice,standard|Station_G3_ESP32_r2_repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,Station_G3_ESP32_r2_room_server_lora_ota_no_external_sensors,station-g3-esp32,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,Station_G3_ESP32_r2_room_server,Station_G3_ESP32_r2_room_server_observer_mqtt,Station_G3_ESP32_r2_room_server_observer_mqtt,exact ordinary Full group choice,standard|Station_G3_ESP32_r2_room_server_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,Tenstar_C3_sx1262_repeater_lora_ota_no_external_sensors,esp32-c3-devkitm-1,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,Tenstar_C3_sx1262_repeater,Tenstar_C3_sx1262_repeater,Tenstar_C3_sx1262_repeater,exact ordinary Full group choice,standard|Tenstar_C3_sx1262_repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,Tenstar_C3_sx1268_repeater_lora_ota_no_external_sensors,esp32-c3-devkitm-1,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,Tenstar_C3_sx1268_repeater,Tenstar_C3_sx1268_repeater,Tenstar_C3_sx1268_repeater,exact ordinary Full group choice,standard|Tenstar_C3_sx1268_repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,ThinkNode_M2_Repeater_lora_ota_no_external_sensors,ESP32-S3-WROOM-1-N4,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,ThinkNode_M2_Repeater,ThinkNode_M2_Repeater,ThinkNode_M2_Repeater,exact ordinary Full group choice,standard|ThinkNode_M2_Repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,ThinkNode_M2_room_server_lora_ota_no_external_sensors,ESP32-S3-WROOM-1-N4,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,ThinkNode_M2_room_server,ThinkNode_M2_room_server,ThinkNode_M2_room_server,exact ordinary Full group choice,standard|ThinkNode_M2_room_server_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,ThinkNode_M5_Repeater_lora_ota_no_external_sensors,ESP32-S3-WROOM-1-N4,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,ThinkNode_M5_Repeater,ThinkNode_M5_Repeater,ThinkNode_M5_Repeater,exact ordinary Full group choice,standard|ThinkNode_M5_Repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,ThinkNode_M5_room_server_lora_ota_no_external_sensors,ESP32-S3-WROOM-1-N4,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,ThinkNode_M5_room_server,ThinkNode_M5_room_server,ThinkNode_M5_room_server,exact ordinary Full group choice,standard|ThinkNode_M5_room_server_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,ThinkNode_M7_repeater_lora_ota_no_external_sensors,thinknode_m7,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,ThinkNode_M7_repeater,ThinkNode_M7_repeater,ThinkNode_M7_repeater_observer_mqtt,exact ordinary Full group choice,standard|ThinkNode_M7_repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,ThinkNode_M7_room_server_lora_ota_no_external_sensors,thinknode_m7,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,ThinkNode_M7_room_server,ThinkNode_M7_room_server,ThinkNode_M7_room_server_observer_mqtt,exact ordinary Full group choice,standard|ThinkNode_M7_room_server_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,ThinkNode_M9_repeater_lora_ota_no_external_sensors,thinknode_m9,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,ThinkNode_M9_repeater_,ThinkNode_M9_repeater_,ThinkNode_M9_repeater_,exact ordinary Full group choice,standard|ThinkNode_M9_repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,ThinkNode_M9_room_server_lora_ota_no_external_sensors,thinknode_m9,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,ThinkNode_M9_room_server_,ThinkNode_M9_room_server_,ThinkNode_M9_room_server_,exact ordinary Full group choice,standard|ThinkNode_M9_room_server_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,Xiao_C3_repeater_lora_ota_no_external_sensors,seeed_xiao_esp32c3,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,Xiao_C3_repeater,Xiao_C3_repeater,Xiao_C3_repeater,exact ordinary Full group choice,standard|Xiao_C3_repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,Xiao_C3_room_server_lora_ota_no_external_sensors,seeed_xiao_esp32c3,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,Xiao_C3_room_server,Xiao_C3_room_server,Xiao_C3_room_server,exact ordinary Full group choice,standard|Xiao_C3_room_server_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,Xiao_C6_repeater_lora_ota_no_external_sensors,esp32-c6-devkitm-1,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,Xiao_C6_repeater_,Xiao_C6_repeater_,Xiao_C6_repeater_,exact ordinary Full group choice,standard|Xiao_C6_repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,Meshimi_repeater_lora_ota_no_external_sensors,esp32-c6-devkitm-1,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,Meshimi_repeater_,Meshimi_repeater_,Meshimi_repeater_,exact ordinary Full group choice,standard|Meshimi_repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,WHY2025_badge_repeater_lora_ota_no_external_sensors,esp32-c6-devkitm-1,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,WHY2025_badge_repeater_,WHY2025_badge_repeater_,WHY2025_badge_repeater_,exact ordinary Full group choice,standard|WHY2025_badge_repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,Xiao_S3_repeater_lora_ota_no_external_sensors,seeed_xiao_esp32s3,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,Xiao_S3_repeater,Xiao_S3_repeater,Xiao_S3_repeater_observer_mqtt,exact ordinary Full group choice,standard|Xiao_S3_repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,Xiao_S3_room_server_lora_ota_no_external_sensors,seeed_xiao_esp32s3,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,Xiao_S3_room_server,Xiao_S3_room_server,Xiao_S3_room_server_observer_mqtt,exact ordinary Full group choice,standard|Xiao_S3_room_server_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,Xiao_S3_WIO_repeater_lora_ota_no_external_sensors,seeed_xiao_esp32s3,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,Xiao_S3_WIO_repeater,Xiao_S3_WIO_repeater,Xiao_S3_WIO_repeater_observer_mqtt,exact ordinary Full group choice,standard|Xiao_S3_WIO_repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,xiao_s3_partition_migrator_lora_repeater_lora_ota_no_external_sensors,seeed_xiao_esp32s3_migrator,development_or_migration_utility,source,False,False,False,False,False,False,False,False,True,False,False,True,xiao_s3_partition_migrator_lora_repeater,,,,standard|xiao_s3_partition_migrator_lora_repeater_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,Xiao_S3_WIO_room_server_lora_ota_no_external_sensors,seeed_xiao_esp32s3,reduced_LoRa_OTA,reduced,True,True,False,False,False,False,False,False,True,False,False,False,Xiao_S3_WIO_room_server,Xiao_S3_WIO_room_server,Xiao_S3_WIO_room_server_observer_mqtt,exact ordinary Full group choice,standard|Xiao_S3_WIO_room_server_lora_ota_no_external_sensors,not measured by this static routing audit +tracked_primary,generated_logical_alias,heltec_tracker_v2_companion_radio_full_femoff,heltec_tracker_v2,named_Full_Companion,Full,False,False,True,False,False,False,False,True,False,True,False,True,heltec_tracker_v2_companion_radio_wifi_femoff,heltec_tracker_v2_companion_radio_full_femon,heltec_tracker_v2_companion_radio_full_femon,canonical runtime FEM alias -> named Full Companion,full|heltec_tracker_v2_companion_radio_full_femoff,not measured by this static routing audit +tracked_primary,generated_logical_alias,Heltec_v2_companion_radio_full,heltec_wifi_lora_32_V2,named_Full_Companion,Full,True,True,True,False,False,False,False,False,False,True,False,False,Heltec_v2_companion_radio_wifi,Heltec_v2_companion_radio_full,Heltec_v2_companion_radio_wifi,named Full Companion,full|Heltec_v2_companion_radio_full,not measured by this static routing audit +tracked_primary,generated_logical_alias,Heltec_WSL3_companion_radio_full,esp32-s3-devkitc-1,named_Full_Companion,Full,True,True,True,False,False,False,False,False,False,True,False,False,Heltec_WSL3_companion_radio_wifi,Heltec_WSL3_companion_radio_full,Heltec_WSL3_companion_radio_wifi,named Full Companion,full|Heltec_WSL3_companion_radio_full,not measured by this static routing audit +tracked_primary,generated_logical_alias,LilyGo_TLora_V2_1_1_6_companion_radio_full,ttgo-lora32-v1,named_Full_Companion,Full,True,True,True,False,False,False,False,False,False,True,False,False,LilyGo_TLora_V2_1_1_6_companion_radio_wifi,LilyGo_TLora_V2_1_1_6_companion_radio_full,LilyGo_TLora_V2_1_1_6_companion_radio_wifi,named Full Companion,full|LilyGo_TLora_V2_1_1_6_companion_radio_full,not measured by this static routing audit +tracked_primary,generated_logical_alias,MKE_s3_companion_radio_full,esp32-s3-devkitc-1,named_Full_Companion,Full,True,True,True,False,False,False,False,False,False,True,False,False,MKE_s3_companion_radio_wifi,MKE_s3_companion_radio_full,MKE_s3_companion_radio_wifi,named Full Companion,full|MKE_s3_companion_radio_full,not measured by this static routing audit +tracked_primary,generated_logical_alias,ThinkNode_M9_companion_radio_full_,thinknode_m9,named_Full_Companion,Full,True,True,True,False,False,False,False,False,False,True,False,False,ThinkNode_M9_companion_radio_wifi_,ThinkNode_M9_companion_radio_full_,ThinkNode_M9_companion_radio_wifi_,named Full Companion,full|ThinkNode_M9_companion_radio_full_,not measured by this static routing audit +tracked_primary,generated_logical_alias,Xiao_C3_companion_radio_full,seeed_xiao_esp32c3,named_Full_Companion,Full,True,True,True,False,False,False,False,False,False,True,False,False,Xiao_C3_companion_radio_wifi,Xiao_C3_companion_radio_full,Xiao_C3_companion_radio_wifi,named Full Companion,full|Xiao_C3_companion_radio_full,not measured by this static routing audit +tracked_primary,generated_logical_alias,M5Stack_Unit_C6L_companion_radio_full,esp32-c6-devkitm-1,named_Full_Companion,Full,True,True,True,False,False,False,False,False,False,True,False,False,M5Stack_Unit_C6L_companion_radio_ble,M5Stack_Unit_C6L_companion_radio_full,M5Stack_Unit_C6L_companion_radio_ble,named Full Companion,full|M5Stack_Unit_C6L_companion_radio_full,not measured by this static routing audit +tracked_primary,generated_logical_alias,Heltec_Wireless_Tracker_companion_radio_full,esp32-s3-devkitc-1,named_Full_Companion,Full,True,True,True,False,False,False,False,False,False,True,False,False,Heltec_Wireless_Tracker_companion_radio_ble,Heltec_Wireless_Tracker_companion_radio_full,Heltec_Wireless_Tracker_companion_radio_ble,named Full Companion,full|Heltec_Wireless_Tracker_companion_radio_full,not measured by this static routing audit +tracked_primary,generated_logical_alias,LilyGo_T3S3_sx1276_companion_radio_full,t3_s3_v1_x,named_Full_Companion,Full,True,True,True,False,False,False,False,False,False,True,False,False,LilyGo_T3S3_sx1276_companion_radio_ble,LilyGo_T3S3_sx1276_companion_radio_full,LilyGo_T3S3_sx1276_companion_radio_ble,named Full Companion,full|LilyGo_T3S3_sx1276_companion_radio_full,not measured by this static routing audit +tracked_primary,generated_logical_alias,LilyGo_Tlora_C6_companion_radio_full_,esp32-c6-devkitm-1,named_Full_Companion,Full,True,True,True,False,False,False,False,False,False,True,False,False,LilyGo_Tlora_C6_companion_radio_ble_,LilyGo_Tlora_C6_companion_radio_full_,LilyGo_Tlora_C6_companion_radio_ble_,named Full Companion,full|LilyGo_Tlora_C6_companion_radio_full_,not measured by this static routing audit +tracked_primary,generated_logical_alias,Heltec_ct62_companion_radio_full,esp32-c3-devkitm-1,named_Full_Companion,Full,True,True,True,False,False,False,False,False,False,True,False,False,Heltec_ct62_companion_radio_ble,Heltec_ct62_companion_radio_full,Heltec_ct62_companion_radio_ble,named Full Companion,full|Heltec_ct62_companion_radio_full,not measured by this static routing audit +tracked_primary,generated_logical_alias,Meshadventurer_sx1262_companion_radio_full,esp32doit-devkit-v1,named_Full_Companion,Full,True,True,True,False,False,False,False,False,False,True,False,False,Meshadventurer_sx1262_companion_radio_ble,Meshadventurer_sx1262_companion_radio_full,Meshadventurer_sx1262_companion_radio_ble,named Full Companion,full|Meshadventurer_sx1262_companion_radio_full,not measured by this static routing audit +tracked_primary,generated_logical_alias,Meshadventurer_sx1268_companion_radio_full,esp32doit-devkit-v1,named_Full_Companion,Full,True,True,True,False,False,False,False,False,False,True,False,False,Meshadventurer_sx1268_companion_radio_ble,Meshadventurer_sx1268_companion_radio_full,Meshadventurer_sx1268_companion_radio_ble,named Full Companion,full|Meshadventurer_sx1268_companion_radio_full,not measured by this static routing audit +tracked_primary,generated_logical_alias,Heltec_Wireless_Paper_companion_radio_full,esp32-s3-devkitc-1,named_Full_Companion,Full,True,True,True,False,False,False,False,False,False,True,False,False,Heltec_Wireless_Paper_companion_radio_ble,Heltec_Wireless_Paper_companion_radio_full,Heltec_Wireless_Paper_companion_radio_ble,named Full Companion,full|Heltec_Wireless_Paper_companion_radio_full,not measured by this static routing audit +tracked_primary,generated_logical_alias,Heltec_E213_companion_radio_full,heltec_e213,named_Full_Companion,Full,True,True,True,False,False,False,False,False,False,True,False,False,Heltec_E213_companion_radio_ble,Heltec_E213_companion_radio_full,Heltec_E213_companion_radio_ble,named Full Companion,full|Heltec_E213_companion_radio_full,not measured by this static routing audit +tracked_primary,generated_logical_alias,Meshimi_companion_radio_full_,esp32-c6-devkitm-1,named_Full_Companion,Full,True,True,True,False,False,False,False,False,False,True,False,False,Meshimi_companion_radio_ble_,Meshimi_companion_radio_full_,Meshimi_companion_radio_ble_,named Full Companion,full|Meshimi_companion_radio_full_,not measured by this static routing audit +tracked_primary,generated_logical_alias,WHY2025_badge_companion_radio_full_,esp32-c6-devkitm-1,named_Full_Companion,Full,True,True,True,False,False,False,False,False,False,True,False,False,WHY2025_badge_companion_radio_ble_,WHY2025_badge_companion_radio_full_,WHY2025_badge_companion_radio_ble_,named Full Companion,full|WHY2025_badge_companion_radio_full_,not measured by this static routing audit +tracked_primary,generated_logical_alias,Xiao_C6_companion_radio_full_,esp32-c6-devkitm-1,named_Full_Companion,Full,True,True,True,False,False,False,False,False,False,True,False,False,Xiao_C6_companion_radio_ble_,Xiao_C6_companion_radio_full_,Xiao_C6_companion_radio_ble_,named Full Companion,full|Xiao_C6_companion_radio_full_,not measured by this static routing audit +tracked_primary,generated_logical_alias,Xiao_S3_companion_radio_full,seeed_xiao_esp32s3,named_Full_Companion,Full,True,True,True,False,False,False,False,False,False,True,False,False,Xiao_S3_companion_radio_ble,Xiao_S3_companion_radio_full,Xiao_S3_companion_radio_ble,named Full Companion,full|Xiao_S3_companion_radio_full,not measured by this static routing audit +tracked_primary,generated_logical_alias,LilyGo_TETH_Elite_sx1262_companion_radio_full,esp32s3box,named_Full_Companion,Full,True,True,True,False,False,False,False,False,False,True,False,False,LilyGo_TETH_Elite_sx1262_companion_radio_ble,LilyGo_TETH_Elite_sx1262_companion_radio_full,LilyGo_TETH_Elite_sx1262_companion_radio_ble,named Full Companion,full|LilyGo_TETH_Elite_sx1262_companion_radio_full,not measured by this static routing audit +tracked_primary,generated_logical_alias,LilyGo_T3S3_sx1262_companion_radio_full,t3_s3_v1_x,named_Full_Companion,Full,True,True,True,False,False,False,False,False,False,True,False,False,LilyGo_T3S3_sx1262_companion_radio_ble,LilyGo_T3S3_sx1262_companion_radio_full,LilyGo_T3S3_sx1262_companion_radio_ble,named Full Companion,full|LilyGo_T3S3_sx1262_companion_radio_full,not measured by this static routing audit +tracked_primary,generated_logical_alias,LilyGo_TDeck_companion_radio_full,t-deck,named_Full_Companion,Full,True,True,True,False,False,False,False,False,False,True,False,False,LilyGo_TDeck_companion_radio_ble,LilyGo_TDeck_companion_radio_full,LilyGo_TDeck_companion_radio_ble,named Full Companion,full|LilyGo_TDeck_companion_radio_full,not measured by this static routing audit +tracked_primary,generated_logical_alias,Ebyte_EoRa-S3_companion_radio_full,ebyte_eora-s3,named_Full_Companion,Full,True,True,True,False,False,False,False,False,False,True,False,False,Ebyte_EoRa-S3_companion_radio_ble,Ebyte_EoRa-S3_companion_radio_full,Ebyte_EoRa-S3_companion_radio_ble,named Full Companion,full|Ebyte_EoRa-S3_companion_radio_full,not measured by this static routing audit +tracked_primary,generated_logical_alias,Tbeam_SX1262_companion_radio_full,ttgo-t-beam,named_Full_Companion,Full,True,True,True,False,False,False,False,False,False,True,False,False,Tbeam_SX1262_companion_radio_ble,Tbeam_SX1262_companion_radio_full,Tbeam_SX1262_companion_radio_ble,named Full Companion,full|Tbeam_SX1262_companion_radio_full,not measured by this static routing audit +tracked_primary,generated_logical_alias,Tbeam_SX1276_companion_radio_full,ttgo-t-beam,named_Full_Companion,Full,True,True,True,False,False,False,False,False,False,True,False,False,Tbeam_SX1276_companion_radio_ble,Tbeam_SX1276_companion_radio_full,Tbeam_SX1276_companion_radio_ble,named Full Companion,full|Tbeam_SX1276_companion_radio_full,not measured by this static routing audit +tracked_primary,generated_logical_alias,T_Beam_S3_Supreme_SX1262_companion_radio_full,t_beams3_supreme,named_Full_Companion,Full,True,True,True,False,False,False,False,False,False,True,False,False,T_Beam_S3_Supreme_SX1262_companion_radio_ble,T_Beam_S3_Supreme_SX1262_companion_radio_full,T_Beam_S3_Supreme_SX1262_companion_radio_ble,named Full Companion,full|T_Beam_S3_Supreme_SX1262_companion_radio_full,not measured by this static routing audit +tracked_primary,generated_logical_alias,Generic_ESPNOW_companion_radio_full,esp32-c3-devkitm-1,named_Full_Companion,Full,True,True,True,False,False,False,False,False,False,True,False,False,Generic_ESPNOW_comp_radio_usb,Generic_ESPNOW_companion_radio_full,Generic_ESPNOW_comp_radio_usb,named Full Companion,full|Generic_ESPNOW_companion_radio_full,not measured by this static routing audit +tracked_primary,generated_logical_alias,Heltec_E290_companion_radio_full,heltec_e290,named_Full_Companion,Full,True,True,True,False,False,False,False,False,False,True,False,False,Heltec_E290_companion_usb_ble,Heltec_E290_companion_radio_full,Heltec_E290_companion_usb_ble,named Full Companion,full|Heltec_E290_companion_radio_full,not measured by this static routing audit +tracked_primary,generated_logical_alias,Heltec_T190_companion_radio_full_,heltec_t190,named_Full_Companion,Full,True,True,True,False,False,False,False,False,False,True,False,False,Heltec_T190_companion_radio_usb_ble_,Heltec_T190_companion_radio_full_,Heltec_T190_companion_radio_usb_ble_,named Full Companion,full|Heltec_T190_companion_radio_full_,not measured by this static routing audit +tracked_primary,generated_logical_alias,SenseCapIndicator-ESPNow_companion_radio_full,esp32-s3-devkitc-1,named_Full_Companion,Full,True,True,True,False,False,False,False,False,False,True,False,False,SenseCapIndicator-ESPNow_comp_radio_usb,SenseCapIndicator-ESPNow_companion_radio_full,SenseCapIndicator-ESPNow_comp_radio_usb,named Full Companion,full|SenseCapIndicator-ESPNow_companion_radio_full,not measured by this static routing audit +tracked_primary,generated_logical_alias,SenseCapIndicator-LoRa_companion_radio_full,esp32-s3-devkitc-1,named_Full_Companion,Full,True,True,True,False,False,False,False,False,False,True,False,False,SenseCapIndicator-LoRa_comp_radio_usb_wifi,SenseCapIndicator-LoRa_companion_radio_full,SenseCapIndicator-LoRa_comp_radio_usb_wifi,named Full Companion,full|SenseCapIndicator-LoRa_companion_radio_full,not measured by this static routing audit +tracked_primary,generated_logical_alias,SenseCapIndicator-LoRa-N16R2_companion_radio_full,esp32-s3-devkitc-1,named_Full_Companion,Full,True,True,True,False,False,False,False,False,False,True,False,False,SenseCapIndicator-LoRa-N16R2_comp_radio_usb_wifi,SenseCapIndicator-LoRa-N16R2_companion_radio_full,SenseCapIndicator-LoRa-N16R2_comp_radio_usb_wifi,named Full Companion,full|SenseCapIndicator-LoRa-N16R2_companion_radio_full,not measured by this static routing audit diff --git a/docs/research/esp32_full_release_selection_2026-10-06.json b/docs/research/esp32_full_release_selection_2026-10-06.json new file mode 100644 index 000000000..c216a2dd4 --- /dev/null +++ b/docs/research/esp32_full_release_selection_2026-10-06.json @@ -0,0 +1,1510 @@ +{ + "planned_before_slots": 317, + "planned_after_slots": 172, + "after_profiles": { + "full": 172 + }, + "after_passes": { + "run_logging_matrix_build_targets": 52, + "run_full_only_esp32_profile": 120 + }, + "duplicate_identities": [], + "reduced_targets": [], + "new_Full_targets": [], + "dropped_Full_targets": [], + "changed_existing_Full_PIO_bases": [], + "changed_existing_Full_overlay_flags": [], + "target_subset_checks": { + "LilyGo_TLora_V2_1_1_6_repeater": { + "pass": "run_full_only_esp32_profile", + "target": "LilyGo_TLora_V2_1_1_6_repeater", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_env": "LilyGo_TLora_V2_1_1_6_repeater", + "filename_infix": "full-logging" + }, + "LilyGo_TLora_V2_1_1_6_repeater_observer_mqtt_": { + "pass": "run_full_only_esp32_profile", + "target": "LilyGo_TLora_V2_1_1_6_repeater_observer_mqtt_", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_env": "LilyGo_TLora_V2_1_1_6_repeater_observer_mqtt_", + "filename_infix": "full-usb-wifi" + }, + "LilyGo_TLora_V2_1_1_6_room_server_observer_mqtt_": { + "pass": "run_full_only_esp32_profile", + "target": "LilyGo_TLora_V2_1_1_6_room_server_observer_mqtt_", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_env": "LilyGo_TLora_V2_1_1_6_room_server_observer_mqtt_", + "filename_infix": "full-usb-wifi" + }, + "Station_G2_repeater_observer_mqtt": { + "pass": "run_full_only_esp32_profile", + "target": "Station_G2_repeater_observer_mqtt", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_env": "Station_G2_repeater_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + "Station_G2_room_server_observer_mqtt": { + "pass": "run_full_only_esp32_profile", + "target": "Station_G2_room_server_observer_mqtt", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_env": "Station_G2_room_server_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + "Station_G3_ESP32_r2_repeater_observer_mqtt": { + "pass": "run_full_only_esp32_profile", + "target": "Station_G3_ESP32_r2_repeater_observer_mqtt", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_env": "Station_G3_ESP32_r2_repeater_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + "Station_G3_ESP32_r2_room_server_observer_mqtt": { + "pass": "run_full_only_esp32_profile", + "target": "Station_G3_ESP32_r2_room_server_observer_mqtt", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_env": "Station_G3_ESP32_r2_room_server_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + "Heltec_v2_companion_radio_full": { + "pass": "run_logging_matrix_build_targets", + "target": "Heltec_v2_companion_radio_full", + "build_profile": "full", + "ESP32_FULL_BUILD": "0", + "pio_env": "Heltec_v2_companion_radio_wifi", + "filename_infix": "" + } + }, + "schema_version": 1, + "date": "2026-10-06", + "source_baseline": "2ee62b981435df7dc4bcd79de39e61a4d5e98652", + "scope": "Static exact selector replay with cached PlatformIO resolution, followed by two sequential embedded builds. Full matrix was not compiled or physically flashed.", + "planned_after_selection": [ + { + "pass": "run_logging_matrix_build_targets", + "target": "heltec_rc32_without_display_companion_radio_full", + "build_profile": "full", + "ESP32_FULL_BUILD": "0", + "pio_environment": "heltec_rc32_without_display_companion_radio_full", + "filename_infix": "" + }, + { + "pass": "run_logging_matrix_build_targets", + "target": "heltec_rc32_companion_radio_full", + "build_profile": "full", + "ESP32_FULL_BUILD": "0", + "pio_environment": "heltec_rc32_companion_radio_full", + "filename_infix": "" + }, + { + "pass": "run_logging_matrix_build_targets", + "target": "heltec_tracker_v2_companion_radio_full_femon", + "build_profile": "full", + "ESP32_FULL_BUILD": "0", + "pio_environment": "heltec_tracker_v2_companion_radio_full_femon", + "filename_infix": "" + }, + { + "pass": "run_logging_matrix_build_targets", + "target": "Heltec_v3_companion_radio_full", + "build_profile": "full", + "ESP32_FULL_BUILD": "0", + "pio_environment": "Heltec_v3_companion_radio_full", + "filename_infix": "" + }, + { + "pass": "run_logging_matrix_build_targets", + "target": "heltec_v4_2_v4_3_companion_radio_full_femon", + "build_profile": "full", + "ESP32_FULL_BUILD": "0", + "pio_environment": "heltec_v4_2_v4_3_companion_radio_full_femon", + "filename_infix": "" + }, + { + "pass": "run_logging_matrix_build_targets", + "target": "heltec_v4_expansionkit_tft_companion_radio_full_femon", + "build_profile": "full", + "ESP32_FULL_BUILD": "0", + "pio_environment": "heltec_v4_expansionkit_tft_companion_radio_full_femon", + "filename_infix": "" + }, + { + "pass": "run_logging_matrix_build_targets", + "target": "heltec_v4_tft_companion_radio_full_femon", + "build_profile": "full", + "ESP32_FULL_BUILD": "0", + "pio_environment": "heltec_v4_tft_companion_radio_full_femon", + "filename_infix": "" + }, + { + "pass": "run_logging_matrix_build_targets", + "target": "heltec_v4_r8_companion_radio_full", + "build_profile": "full", + "ESP32_FULL_BUILD": "0", + "pio_environment": "heltec_v4_r8_companion_radio_full", + "filename_infix": "" + }, + { + "pass": "run_logging_matrix_build_targets", + "target": "heltec_v4_r8_tft_companion_radio_full", + "build_profile": "full", + "ESP32_FULL_BUILD": "0", + "pio_environment": "heltec_v4_r8_tft_companion_radio_full", + "filename_infix": "" + }, + { + "pass": "run_logging_matrix_build_targets", + "target": "LilyGo_TBeam_1W_companion_radio_full", + "build_profile": "full", + "ESP32_FULL_BUILD": "0", + "pio_environment": "LilyGo_TBeam_1W_companion_radio_full", + "filename_infix": "" + }, + { + "pass": "run_logging_matrix_build_targets", + "target": "meshnology_w12_companion_radio_full", + "build_profile": "full", + "ESP32_FULL_BUILD": "0", + "pio_environment": "meshnology_w12_companion_radio_full", + "filename_infix": "" + }, + { + "pass": "run_logging_matrix_build_targets", + "target": "nibble_screen_connect_companion_radio_full_", + "build_profile": "full", + "ESP32_FULL_BUILD": "0", + "pio_environment": "nibble_screen_connect_companion_radio_full_", + "filename_infix": "" + }, + { + "pass": "run_logging_matrix_build_targets", + "target": "nibble_zero_connect_companion_radio_full_", + "build_profile": "full", + "ESP32_FULL_BUILD": "0", + "pio_environment": "nibble_zero_connect_companion_radio_full_", + "filename_infix": "" + }, + { + "pass": "run_logging_matrix_build_targets", + "target": "RAK_3112_companion_radio_full", + "build_profile": "full", + "ESP32_FULL_BUILD": "0", + "pio_environment": "RAK_3112_companion_radio_full", + "filename_infix": "" + }, + { + "pass": "run_logging_matrix_build_targets", + "target": "Station_G2_companion_radio_full", + "build_profile": "full", + "ESP32_FULL_BUILD": "0", + "pio_environment": "Station_G2_companion_radio_full", + "filename_infix": "" + }, + { + "pass": "run_logging_matrix_build_targets", + "target": "Station_G3_ESP32_companion_radio_full", + "build_profile": "full", + "ESP32_FULL_BUILD": "0", + "pio_environment": "Station_G3_ESP32_companion_radio_full", + "filename_infix": "" + }, + { + "pass": "run_logging_matrix_build_targets", + "target": "ThinkNode_M2_companion_radio_full", + "build_profile": "full", + "ESP32_FULL_BUILD": "0", + "pio_environment": "ThinkNode_M2_companion_radio_full", + "filename_infix": "" + }, + { + "pass": "run_logging_matrix_build_targets", + "target": "ThinkNode_M5_companion_radio_full", + "build_profile": "full", + "ESP32_FULL_BUILD": "0", + "pio_environment": "ThinkNode_M5_companion_radio_full", + "filename_infix": "" + }, + { + "pass": "run_logging_matrix_build_targets", + "target": "ThinkNode_M7_companion_radio_full", + "build_profile": "full", + "ESP32_FULL_BUILD": "0", + "pio_environment": "ThinkNode_M7_companion_radio_full", + "filename_infix": "" + }, + { + "pass": "run_logging_matrix_build_targets", + "target": "Xiao_S3_WIO_companion_radio_full", + "build_profile": "full", + "ESP32_FULL_BUILD": "0", + "pio_environment": "Xiao_S3_WIO_companion_radio_full", + "filename_infix": "" + }, + { + "pass": "run_logging_matrix_build_targets", + "target": "Heltec_v2_companion_radio_full", + "build_profile": "full", + "ESP32_FULL_BUILD": "0", + "pio_environment": "Heltec_v2_companion_radio_wifi", + "filename_infix": "" + }, + { + "pass": "run_logging_matrix_build_targets", + "target": "Heltec_WSL3_companion_radio_full", + "build_profile": "full", + "ESP32_FULL_BUILD": "0", + "pio_environment": "Heltec_WSL3_companion_radio_wifi", + "filename_infix": "" + }, + { + "pass": "run_logging_matrix_build_targets", + "target": "LilyGo_TLora_V2_1_1_6_companion_radio_full", + "build_profile": "full", + "ESP32_FULL_BUILD": "0", + "pio_environment": "LilyGo_TLora_V2_1_1_6_companion_radio_wifi", + "filename_infix": "" + }, + { + "pass": "run_logging_matrix_build_targets", + "target": "MKE_s3_companion_radio_full", + "build_profile": "full", + "ESP32_FULL_BUILD": "0", + "pio_environment": "MKE_s3_companion_radio_wifi", + "filename_infix": "" + }, + { + "pass": "run_logging_matrix_build_targets", + "target": "ThinkNode_M9_companion_radio_full_", + "build_profile": "full", + "ESP32_FULL_BUILD": "0", + "pio_environment": "ThinkNode_M9_companion_radio_wifi_", + "filename_infix": "" + }, + { + "pass": "run_logging_matrix_build_targets", + "target": "Xiao_C3_companion_radio_full", + "build_profile": "full", + "ESP32_FULL_BUILD": "0", + "pio_environment": "Xiao_C3_companion_radio_wifi", + "filename_infix": "" + }, + { + "pass": "run_logging_matrix_build_targets", + "target": "M5Stack_Unit_C6L_companion_radio_full", + "build_profile": "full", + "ESP32_FULL_BUILD": "0", + "pio_environment": "M5Stack_Unit_C6L_companion_radio_ble", + "filename_infix": "" + }, + { + "pass": "run_logging_matrix_build_targets", + "target": "Heltec_Wireless_Tracker_companion_radio_full", + "build_profile": "full", + "ESP32_FULL_BUILD": "0", + "pio_environment": "Heltec_Wireless_Tracker_companion_radio_ble", + "filename_infix": "" + }, + { + "pass": "run_logging_matrix_build_targets", + "target": "LilyGo_T3S3_sx1276_companion_radio_full", + "build_profile": "full", + "ESP32_FULL_BUILD": "0", + "pio_environment": "LilyGo_T3S3_sx1276_companion_radio_ble", + "filename_infix": "" + }, + { + "pass": "run_logging_matrix_build_targets", + "target": "LilyGo_Tlora_C6_companion_radio_full_", + "build_profile": "full", + "ESP32_FULL_BUILD": "0", + "pio_environment": "LilyGo_Tlora_C6_companion_radio_ble_", + "filename_infix": "" + }, + { + "pass": "run_logging_matrix_build_targets", + "target": "Heltec_ct62_companion_radio_full", + "build_profile": "full", + "ESP32_FULL_BUILD": "0", + "pio_environment": "Heltec_ct62_companion_radio_ble", + "filename_infix": "" + }, + { + "pass": "run_logging_matrix_build_targets", + "target": "Meshadventurer_sx1262_companion_radio_full", + "build_profile": "full", + "ESP32_FULL_BUILD": "0", + "pio_environment": "Meshadventurer_sx1262_companion_radio_ble", + "filename_infix": "" + }, + { + "pass": "run_logging_matrix_build_targets", + "target": "Meshadventurer_sx1268_companion_radio_full", + "build_profile": "full", + "ESP32_FULL_BUILD": "0", + "pio_environment": "Meshadventurer_sx1268_companion_radio_ble", + "filename_infix": "" + }, + { + "pass": "run_logging_matrix_build_targets", + "target": "Heltec_Wireless_Paper_companion_radio_full", + "build_profile": "full", + "ESP32_FULL_BUILD": "0", + "pio_environment": "Heltec_Wireless_Paper_companion_radio_ble", + "filename_infix": "" + }, + { + "pass": "run_logging_matrix_build_targets", + "target": "Heltec_E213_companion_radio_full", + "build_profile": "full", + "ESP32_FULL_BUILD": "0", + "pio_environment": "Heltec_E213_companion_radio_ble", + "filename_infix": "" + }, + { + "pass": "run_logging_matrix_build_targets", + "target": "Meshimi_companion_radio_full_", + "build_profile": "full", + "ESP32_FULL_BUILD": "0", + "pio_environment": "Meshimi_companion_radio_ble_", + "filename_infix": "" + }, + { + "pass": "run_logging_matrix_build_targets", + "target": "WHY2025_badge_companion_radio_full_", + "build_profile": "full", + "ESP32_FULL_BUILD": "0", + "pio_environment": "WHY2025_badge_companion_radio_ble_", + "filename_infix": "" + }, + { + "pass": "run_logging_matrix_build_targets", + "target": "Xiao_C6_companion_radio_full_", + "build_profile": "full", + "ESP32_FULL_BUILD": "0", + "pio_environment": "Xiao_C6_companion_radio_ble_", + "filename_infix": "" + }, + { + "pass": "run_logging_matrix_build_targets", + "target": "Xiao_S3_companion_radio_full", + "build_profile": "full", + "ESP32_FULL_BUILD": "0", + "pio_environment": "Xiao_S3_companion_radio_ble", + "filename_infix": "" + }, + { + "pass": "run_logging_matrix_build_targets", + "target": "LilyGo_TETH_Elite_sx1262_companion_radio_full", + "build_profile": "full", + "ESP32_FULL_BUILD": "0", + "pio_environment": "LilyGo_TETH_Elite_sx1262_companion_radio_ble", + "filename_infix": "" + }, + { + "pass": "run_logging_matrix_build_targets", + "target": "LilyGo_T3S3_sx1262_companion_radio_full", + "build_profile": "full", + "ESP32_FULL_BUILD": "0", + "pio_environment": "LilyGo_T3S3_sx1262_companion_radio_ble", + "filename_infix": "" + }, + { + "pass": "run_logging_matrix_build_targets", + "target": "LilyGo_TDeck_companion_radio_full", + "build_profile": "full", + "ESP32_FULL_BUILD": "0", + "pio_environment": "LilyGo_TDeck_companion_radio_ble", + "filename_infix": "" + }, + { + "pass": "run_logging_matrix_build_targets", + "target": "Ebyte_EoRa-S3_companion_radio_full", + "build_profile": "full", + "ESP32_FULL_BUILD": "0", + "pio_environment": "Ebyte_EoRa-S3_companion_radio_ble", + "filename_infix": "" + }, + { + "pass": "run_logging_matrix_build_targets", + "target": "Tbeam_SX1262_companion_radio_full", + "build_profile": "full", + "ESP32_FULL_BUILD": "0", + "pio_environment": "Tbeam_SX1262_companion_radio_ble", + "filename_infix": "" + }, + { + "pass": "run_logging_matrix_build_targets", + "target": "Tbeam_SX1276_companion_radio_full", + "build_profile": "full", + "ESP32_FULL_BUILD": "0", + "pio_environment": "Tbeam_SX1276_companion_radio_ble", + "filename_infix": "" + }, + { + "pass": "run_logging_matrix_build_targets", + "target": "T_Beam_S3_Supreme_SX1262_companion_radio_full", + "build_profile": "full", + "ESP32_FULL_BUILD": "0", + "pio_environment": "T_Beam_S3_Supreme_SX1262_companion_radio_ble", + "filename_infix": "" + }, + { + "pass": "run_logging_matrix_build_targets", + "target": "Generic_ESPNOW_companion_radio_full", + "build_profile": "full", + "ESP32_FULL_BUILD": "0", + "pio_environment": "Generic_ESPNOW_comp_radio_usb", + "filename_infix": "" + }, + { + "pass": "run_logging_matrix_build_targets", + "target": "Heltec_E290_companion_radio_full", + "build_profile": "full", + "ESP32_FULL_BUILD": "0", + "pio_environment": "Heltec_E290_companion_usb_ble", + "filename_infix": "" + }, + { + "pass": "run_logging_matrix_build_targets", + "target": "Heltec_T190_companion_radio_full_", + "build_profile": "full", + "ESP32_FULL_BUILD": "0", + "pio_environment": "Heltec_T190_companion_radio_usb_ble_", + "filename_infix": "" + }, + { + "pass": "run_logging_matrix_build_targets", + "target": "SenseCapIndicator-ESPNow_companion_radio_full", + "build_profile": "full", + "ESP32_FULL_BUILD": "0", + "pio_environment": "SenseCapIndicator-ESPNow_comp_radio_usb", + "filename_infix": "" + }, + { + "pass": "run_logging_matrix_build_targets", + "target": "SenseCapIndicator-LoRa_companion_radio_full", + "build_profile": "full", + "ESP32_FULL_BUILD": "0", + "pio_environment": "SenseCapIndicator-LoRa_comp_radio_usb_wifi", + "filename_infix": "" + }, + { + "pass": "run_logging_matrix_build_targets", + "target": "SenseCapIndicator-LoRa-N16R2_companion_radio_full", + "build_profile": "full", + "ESP32_FULL_BUILD": "0", + "pio_environment": "SenseCapIndicator-LoRa-N16R2_comp_radio_usb_wifi", + "filename_infix": "" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "Ebyte_EoRa-S3_Repeater", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "Ebyte_EoRa-S3_repeater_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "Ebyte_EoRa-S3_room_server", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "Ebyte_EoRa-S3_room_server_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "Generic_E22_sx1262_repeater", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "Generic_E22_sx1262_repeater", + "filename_infix": "full-logging" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "Generic_E22_sx1268_repeater", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "Generic_E22_sx1268_repeater", + "filename_infix": "full-logging" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "Generic_ESPNOW_repeatr", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "Generic_ESPNOW_repeatr", + "filename_infix": "full-logging" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "Generic_ESPNOW_room_svr", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "Generic_ESPNOW_room_svr", + "filename_infix": "full-logging" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "GEPRC_Linkflow_900_repeater", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "GEPRC_Linkflow_900_repeater", + "filename_infix": "full-logging" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "Heltec_ct62_repeater", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "Heltec_ct62_repeater", + "filename_infix": "full-logging" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "Heltec_ct62_sensor", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "Heltec_ct62_sensor", + "filename_infix": "full-logging" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "Heltec_E213_repeater", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "Heltec_E213_repeater_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "Heltec_E213_room_server", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "Heltec_E213_room_server_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "Heltec_E290_repeater", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "Heltec_E290_repeater_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "Heltec_E290_room_server", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "Heltec_E290_room_server_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "heltec_rc32_without_display_repeater", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "heltec_rc32_without_display_repeater_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "heltec_rc32_without_display_room_server", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "heltec_rc32_without_display_room_server_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "heltec_rc32_without_display_sensor", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "heltec_rc32_without_display_sensor", + "filename_infix": "full-logging" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "heltec_rc32_repeater", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "heltec_rc32_repeater_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "heltec_rc32_room_server", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "heltec_rc32_room_server_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "heltec_rc32_sensor", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "heltec_rc32_sensor", + "filename_infix": "full-logging" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "Heltec_T190_repeater_", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "Heltec_T190_repeater_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "Heltec_T190_room_server_", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "Heltec_T190_room_server_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "Heltec_Wireless_Tracker_repeater", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "Heltec_Wireless_Tracker_repeater_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "Heltec_Wireless_Tracker_room_server", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "Heltec_Wireless_Tracker_room_server_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "heltec_tracker_v2_repeater", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "heltec_tracker_v2_repeater_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "heltec_tracker_v2_room_server", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "heltec_tracker_v2_room_server_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "heltec_tracker_v1_1_repeater_observer_mqtt", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "heltec_tracker_v1_1_repeater_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "heltec_tracker_v1_1_room_server_observer_mqtt", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "heltec_tracker_v1_1_room_server_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "heltec_tracker_v2_sensor", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "heltec_tracker_v2_sensor", + "filename_infix": "full-logging" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "Heltec_v2_repeater", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "Heltec_v2_repeater", + "filename_infix": "full-logging" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "Heltec_v2_room_server", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "Heltec_v2_room_server", + "filename_infix": "full-logging" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "Heltec_v3_repeater", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "Heltec_v3_repeater_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "Heltec_v3_room_server", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "Heltec_v3_room_server_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "Heltec_v3_sensor", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "Heltec_v3_sensor", + "filename_infix": "full-logging" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "Heltec_WSL3_repeater", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "Heltec_WSL3_repeater_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "Heltec_WSL3_room_server", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "Heltec_WSL3_room_server_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "Heltec_WSL3_sensor", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "Heltec_WSL3_sensor", + "filename_infix": "full-logging" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "heltec_v4_repeater", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "heltec_v4_repeater_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "heltec_v4_expansionkit_repeater", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "heltec_v4_expansionkit_repeater_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "heltec_v4_room_server", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "heltec_v4_room_server_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "heltec_v4_expansionkit_room_server_observer_mqtt", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "heltec_v4_expansionkit_room_server_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "heltec_v4_sensor", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "heltec_v4_sensor", + "filename_infix": "full-logging" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "heltec_v4_tft_repeater", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "heltec_v4_tft_repeater", + "filename_infix": "full-logging" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "heltec_v4_tft_room_server", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "heltec_v4_tft_room_server", + "filename_infix": "full-logging" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "heltec_v4_tft_sensor", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "heltec_v4_tft_sensor", + "filename_infix": "full-logging" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "heltec_v4_r8_repeater", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "heltec_v4_r8_repeater_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "heltec_v4_r8_room_server", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "heltec_v4_r8_room_server_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "heltec_v4_r8_sensor", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "heltec_v4_r8_sensor", + "filename_infix": "full-logging" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "heltec_v4_r8_tft_repeater", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "heltec_v4_r8_tft_repeater_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "heltec_v4_r8_tft_portrait_repeater_observer_mqtt", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "heltec_v4_r8_tft_portrait_repeater_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "heltec_v4_r8_tft_room_server", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "heltec_v4_r8_tft_room_server_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "heltec_v4_r8_tft_portrait_room_server_observer_mqtt", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "heltec_v4_r8_tft_portrait_room_server_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "heltec_v4_r8_tft_sensor", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "heltec_v4_r8_tft_sensor", + "filename_infix": "full-logging" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "Heltec_Wireless_Paper_repeater", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "Heltec_Wireless_Paper_repeater_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "Heltec_Wireless_Paper_room_server", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "Heltec_Wireless_Paper_room_server_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "LilyGo_T3S3_sx1262_repeater", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "LilyGo_T3S3_sx1262_repeater_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "LilyGo_T3S3_sx1262_room_server", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "LilyGo_T3S3_sx1262_room_server_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "LilyGo_T3S3_sx1276_repeater", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "LilyGo_T3S3_sx1276_repeater_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "LilyGo_T3S3_sx1276_room_server", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "LilyGo_T3S3_sx1276_room_server_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "LilyGo_TBeam_1W_repeater", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "LilyGo_TBeam_1W_repeater_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "LilyGo_TBeam_1W_room_server", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "LilyGo_TBeam_1W_room_server_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "T_Beam_S3_Supreme_SX1262_repeater", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "T_Beam_S3_Supreme_SX1262_repeater_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "T_Beam_S3_Supreme_SX1262_room_server", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "T_Beam_S3_Supreme_SX1262_room_server_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "Tbeam_SX1262_repeater_observer_mqtt", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "Tbeam_SX1262_repeater_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "Tbeam_SX1262_room_server_observer_mqtt", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "Tbeam_SX1262_room_server_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "Tbeam_SX1276_repeater_observer_mqtt", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "Tbeam_SX1276_repeater_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "Tbeam_SX1276_room_server_observer_mqtt", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "Tbeam_SX1276_room_server_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "LilyGo_TDeck_repeater", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "LilyGo_TDeck_repeater", + "filename_infix": "full-logging" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "LilyGo_TETH_Elite_sx1262_repeater", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "LilyGo_TETH_Elite_sx1262_repeater_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "LilyGo_TETH_Elite_sx1262_room_server", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "LilyGo_TETH_Elite_sx1262_room_server_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "LilyGo_Tlora_C6_repeater_", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "LilyGo_Tlora_C6_repeater_", + "filename_infix": "full-logging" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "LilyGo_Tlora_C6_room_server_", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "LilyGo_Tlora_C6_room_server_", + "filename_infix": "full-logging" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "LilyGo_TLora_V2_1_1_6_repeater", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "LilyGo_TLora_V2_1_1_6_repeater", + "filename_infix": "full-logging" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "LilyGo_TLora_V2_1_1_6_room_server_observer_mqtt_", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "LilyGo_TLora_V2_1_1_6_room_server_observer_mqtt_", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "LilyGo_TLora_V2_1_1_6_repeater_observer_mqtt_", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "LilyGo_TLora_V2_1_1_6_repeater_observer_mqtt_", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "M5Stack_Unit_C6L_repeater", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "M5Stack_Unit_C6L_repeater", + "filename_infix": "full-logging" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "M5Stack_Unit_C6L_room_server", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "M5Stack_Unit_C6L_room_server", + "filename_infix": "full-logging" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "Meshadventurer_sx1262_repeater", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "Meshadventurer_sx1262_repeater", + "filename_infix": "full-logging" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "Meshadventurer_sx1268_repeater", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "Meshadventurer_sx1268_repeater", + "filename_infix": "full-logging" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "Meshadventurer_sx1262_room_server", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "Meshadventurer_sx1262_room_server", + "filename_infix": "full-logging" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "Meshadventurer_sx1268_room_server", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "Meshadventurer_sx1268_room_server", + "filename_infix": "full-logging" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "meshnology_w12_repeater", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "meshnology_w12_repeater_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "meshnology_w12_room_server", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "meshnology_w12_room_server_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "meshnology_w12_sensor", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "meshnology_w12_sensor", + "filename_infix": "full-logging" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "MKE_s3_repeater", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "MKE_s3_repeater", + "filename_infix": "full-logging" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "MKE_s3_room_server", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "MKE_s3_room_server", + "filename_infix": "full-logging" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "MKE_s3_sensor", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "MKE_s3_sensor", + "filename_infix": "full-logging" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "nibble_screen_connect_repeater_", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "nibble_screen_connect_repeater_", + "filename_infix": "full-logging" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "nibble_screen_connect_room_server_", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "nibble_screen_connect_room_server_", + "filename_infix": "full-logging" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "nibble_zero_connect_repeater_", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "nibble_zero_connect_repeater_", + "filename_infix": "full-logging" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "nibble_zero_connect_room_server_", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "nibble_zero_connect_room_server_", + "filename_infix": "full-logging" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "RAK_3112_repeater", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "RAK_3112_repeater_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "RAK_3112_room_server", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "RAK_3112_room_server_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "RAK_3112_sensor", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "RAK_3112_sensor", + "filename_infix": "full-logging" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "Station_G2_repeater_observer_mqtt", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "Station_G2_repeater_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "Station_G2_room_server_observer_mqtt", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "Station_G2_room_server_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "Station_G3_ESP32_repeater", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "Station_G3_ESP32_repeater_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "Station_G3_ESP32_room_server", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "Station_G3_ESP32_room_server_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "Station_G3_ESP32_r2_repeater_observer_mqtt", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "Station_G3_ESP32_r2_repeater_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "Station_G3_ESP32_r2_room_server_observer_mqtt", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "Station_G3_ESP32_r2_room_server_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "Tenstar_C3_sx1262_repeater", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "Tenstar_C3_sx1262_repeater", + "filename_infix": "full-logging" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "Tenstar_C3_sx1268_repeater", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "Tenstar_C3_sx1268_repeater", + "filename_infix": "full-logging" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "ThinkNode_M2_Repeater", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "ThinkNode_M2_Repeater", + "filename_infix": "full-logging" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "ThinkNode_M2_room_server", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "ThinkNode_M2_room_server", + "filename_infix": "full-logging" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "ThinkNode_M5_Repeater", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "ThinkNode_M5_Repeater", + "filename_infix": "full-logging" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "ThinkNode_M5_room_server", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "ThinkNode_M5_room_server", + "filename_infix": "full-logging" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "ThinkNode_M7_repeater", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "ThinkNode_M7_repeater_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "ThinkNode_M7_room_server", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "ThinkNode_M7_room_server_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "ThinkNode_M9_repeater_", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "ThinkNode_M9_repeater_", + "filename_infix": "full-logging" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "ThinkNode_M9_room_server_", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "ThinkNode_M9_room_server_", + "filename_infix": "full-logging" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "Xiao_C3_repeater", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "Xiao_C3_repeater", + "filename_infix": "full-logging" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "Xiao_C3_room_server", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "Xiao_C3_room_server", + "filename_infix": "full-logging" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "Xiao_C6_repeater_", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "Xiao_C6_repeater_", + "filename_infix": "full-logging" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "Meshimi_repeater_", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "Meshimi_repeater_", + "filename_infix": "full-logging" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "WHY2025_badge_repeater_", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "WHY2025_badge_repeater_", + "filename_infix": "full-logging" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "Xiao_S3_repeater", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "Xiao_S3_repeater_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "Xiao_S3_room_server", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "Xiao_S3_room_server_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "Xiao_S3_sensor", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "Xiao_S3_sensor", + "filename_infix": "full-logging" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "Xiao_S3_WIO_repeater", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "Xiao_S3_WIO_repeater_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "Xiao_S3_WIO_room_server", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "Xiao_S3_WIO_room_server_observer_mqtt", + "filename_infix": "full-usb-wifi" + }, + { + "pass": "run_full_only_esp32_profile", + "target": "Xiao_S3_WIO_sensor", + "build_profile": "full", + "ESP32_FULL_BUILD": "1", + "pio_environment": "Xiao_S3_WIO_sensor", + "filename_infix": "full-logging" + } + ], + "fresh_builds": [ + { + "target": "LilyGo_Tlora_C6_repeater_", + "pio_environment": "LilyGo_Tlora_C6_repeater_", + "elf_sha256": "33e0749bf17f27f4ce750c600438902be424b966b9e1e4f44222be2b088a334f", + "passed": true, + "available_internal_bytes": 283088, + "required_heap_bytes": 139200, + "largest_internal_region_bytes": 283088, + "required_contiguous_bytes": 12616, + "files": { + "LilyGo_Tlora_C6_repeater_-full-logging-ota-v1.17.1.9-halo-keymind-cascade-dev-fullaudit-2ee62b98.bin": "19fee1e6622d9507c50c07175719f8a8e91d4f629655e7ba24dd599f59f4f57b", + "LilyGo_Tlora_C6_repeater_-full-logging-ota-v1.17.1.9-halo-keymind-cascade-dev-fullaudit-2ee62b98-merged.bin": "256eea0cfbfb0fa045d326fd7fabd0005763e137f2dcc8925c43cbe58bc3cdcc", + "LilyGo_Tlora_C6_repeater_-full-logging-ota-v1.17.1.9-halo-keymind-cascade-dev-fullaudit-2ee62b98.capabilities.json": "fcae0b9636f46600b57ae550f429c561910d5fd426795285604862517be9551c" + }, + "app_bytes": 2010024, + "app_slot_bytes": 2031616, + "app_margin_bytes": 21592 + }, + { + "target": "Heltec_v2_companion_radio_full", + "pio_environment": "Heltec_v2_companion_radio_wifi", + "elf_sha256": "48d04ce21281a1183a4738001b3f351e272ef2536b3cea15ef88d9ee569ad398", + "passed": true, + "available_internal_bytes": 184680, + "required_heap_bytes": 173840, + "largest_internal_region_bytes": 113840, + "required_contiguous_bytes": 16400, + "files": { + "Heltec_v2_companion_radio_full-v1.17.1.9-halo-keymind-cascade-dev-fullaudit-2ee62b98.bin": "97a0562a6ddcb1af5160dcc9a7cb31f415adf3361dc115d383f4a4efecd63730", + "Heltec_v2_companion_radio_full-v1.17.1.9-halo-keymind-cascade-dev-fullaudit-2ee62b98-merged.bin": "f357f65f5d007ae4695a78c14be7734224c901bcc0f8f76f7fecadcbdd67fe81", + "Heltec_v2_companion_radio_full-v1.17.1.9-halo-keymind-cascade-dev-fullaudit-2ee62b98.capabilities.json": "ef8971d2f632f21cba29dc245a70fca8bdebe36cce21f8a63487d002bbe7ccd1" + }, + "app_bytes": 2275368, + "app_slot_bytes": 3342336, + "app_margin_bytes": 1066968 + } + ], + "validation": { + "build_profile_shell_suite": "passed", + "linux_python_selection_partition_and_ram_tests": 58, + "windows_python_package_tests": 11, + "python_cases_passed": 69, + "test_runtime_note": "Packaging tests use Windows Python3.13; Linux Python3.10 lacks the pre-existing hashlib.file_digest API. Other focused suites use native Linux." + } +} diff --git a/scripts/build_local_release.py b/scripts/build_local_release.py index 61d4fbc41..2bc8ddfe6 100644 --- a/scripts/build_local_release.py +++ b/scripts/build_local_release.py @@ -113,6 +113,38 @@ def select_ordinary_full_records(records: list[dict]) -> list[dict]: MeshTower SD primary replaces stale internal-only artifacts on resume; those files must never be relabeled with the primary's different OTA ID. """ + # Resumed directories can contain portable or transport-specific images + # from older release policies. They are recovery inputs, not ordinary + # ESP32 choices. Full qualification failures must fail the release rather + # than silently substitute one of those smaller images. KISS is a distinct + # host-modem role and the ordinary release command skips it separately. + def ordinary_record(record: dict) -> bool: + manifest = record["manifest"] + if manifest["platform"] != "ESP32_PLATFORM": + return True + target = manifest["target"].lower() + if "kiss" in target: + return True + if ("_lora_ota_no_external_sensors" in target + or "terminal_chat" in target + or "partition_migrator" in target + or "partition_expander" in target + or "partition_legacy_seed" in target + or target.endswith(("_legacy_partition_test", "_sim")) + or target.startswith(("profile_switch_", "profile_fixed_")) + or target == "profile_four_tx_v4_rx"): + return False + if (("companion" in target or "comp_radio" in target) + and "companion_radio_full" not in target): + return False + if (re.search(r"companion_radio_.*_ps(?:_|$)", target) + or ("companion_radio_" in target and target.endswith("_femoff")) + or target.startswith(("station_g2_logging_", "station_g3_esp32_logging_"))): + return False + return manifest["build_profile"] == "full" + + records = [record for record in records if ordinary_record(record)] + tower_primary = "heltec_tower_v2_sdcard_repeater_lora_ota_no_external_sensors" tower_legacy = { "heltec_tower_v2_repeater", @@ -266,6 +298,10 @@ def select_ordinary_full_records(records: list[dict]) -> list[dict]: if requires_uart_full(manifest["target"]) and not proven_rs232(manifest): raise ValueError(manifest["target"] + ": Full release requires the verified " "RS232 bridge from its normal repeater") + for record in selected: + if not qualified_full(record["manifest"]): + raise ValueError(record["manifest"]["target"] + + ": ordinary ESP32 release requires a verified Full image") return passthrough + selected diff --git a/test/test_build_profiles.sh b/test/test_build_profiles.sh index 34b26df41..14f75c3c0 100644 --- a/test/test_build_profiles.sh +++ b/test/test_build_profiles.sh @@ -37,7 +37,7 @@ fail() { [ "$OPTION3_BUILD_WORKERS" -eq 1 ] \ || fail "logging matrix permits concurrent PlatformIO target builds" -for utility in profile_switch_t096_sx1262 xiao_s3_partition_migrator \ +for utility in profile_switch_t096_sx1262 profile_four_tx_v4_rx xiao_s3_partition_migrator \ heltec_v4_partition_migrator_test_hold xiao_s3_partition_legacy_seed \ esp32_4mb_partition_migrator_lora \ heltec_v4_partition_migrator_lora_repeater \ @@ -438,6 +438,155 @@ require(rak_usb, "build_flags", "FORCE_GPS_ALIVE") # replace each with that exact board's Full target. init_project_context >/dev/null +# Expanded partitions make Full the ordinary ESP32 node release. Legacy lean +# names still address installed firmware and must remain directly buildable, +# but cannot reappear in either the all-role or a role-specific release list. +for resolver in resolve_all_firmwares resolve_repeater_firmwares \ + resolve_room_server_firmwares resolve_sensor_firmwares; do + while IFS= read -r release_env; do + [ "${PIO_ENV_PLATFORM_BY_NAME[$release_env]:-}" = ESP32_PLATFORM ] || continue + if is_lora_ota_no_external_sensors_target "$release_env"; then + fail "$resolver republishes reduced ESP32 alias $release_env" + fi + is_redundant_bulk_build_target "$release_env" \ + && fail "$resolver republishes utility or legacy alias $release_env" + if is_kiss_modem_target "$release_env"; then + if is_esp32_full_release_build_target "$release_env"; then + fail "$release_env host modem was promoted into the node Full profile" + fi + else + is_esp32_full_release_build_target "$release_env" \ + || fail "$resolver selected ESP32 node without a Full release: $release_env" + fi + done < <("$resolver") +done + +# Cover the former allowlist gaps as well as migration hardware and a named +# Full Companion. Their ordinary release profile is Full; the older helper +# continues to describe the narrower same-partition OTA identity contract. +for release_env in Station_G3_ESP32_r2_repeater WHY2025_badge_repeater_ \ + GEPRC_Linkflow_900_repeater Generic_ESPNOW_repeatr \ + LilyGo_Tlora_C6_room_server_ Meshadventurer_sx1262_repeater \ + Ebyte_EoRa-S3_Repeater Heltec_ct62_sensor Station_G2_companion_radio_full; do + is_esp32_full_release_build_target "$release_env" \ + || fail "$release_env retained a standard ordinary ESP32 release slot" +done +if is_esp32_full_only_bulk_target Ebyte_EoRa-S3_Repeater; then + fail "release consolidation incorrectly advertised same-partition EoRa migration" +fi +if is_esp32_full_release_build_target RAK_3401_repeater; then + fail "nRF52 role acquired ESP32 Full-only release policy" +fi + +for direct_env in Heltec_v3_repeater_lora_ota_no_external_sensors \ + Ebyte_EoRa-S3_Repeater_lora_ota_no_external_sensors \ + Heltec_v3_companion_radio_usb heltec_v4_partition_migrator \ + heltec_v4_partition_migrator_lora_repeater; do + is_supported_build_env "$direct_env" \ + || fail "ordinary consolidation removed direct compatibility target $direct_env" + [ -n "$(get_pio_build_env "$direct_env")" ] \ + || fail "$direct_env no longer resolves a direct PlatformIO recipe" +done +( + BATCH_BUILD_MODE=0 + SINGLE_TARGET_FULL_BUILD=0 + EXACT_IDENTITY_FULL_BUILD=0 + BUILD_PROFILE_OVERRIDE=standard + BUILD_PROFILE_EXPLICIT=1 + RESOLVED_BUILD_TARGETS=(Ebyte_EoRa-S3_Repeater) + configure_effective_build_profile build-firmware >/dev/null + [ "$BUILD_PROFILE_EFFECTIVE" = standard ] \ + || fail "explicit standard recovery profile was promoted to Full" + [ "${RESOLVED_BUILD_TARGETS[*]}" = Ebyte_EoRa-S3_Repeater ] \ + || fail "explicit recovery profile changed its deployed target identity" + BUILD_PROFILE_OVERRIDE=auto + BUILD_PROFILE_EXPLICIT=0 + RESOLVED_BUILD_TARGETS=(Heltec_v3_repeater_lora_ota_no_external_sensors) + configure_effective_build_profile build-firmware >/dev/null + [ "$BUILD_PROFILE_EFFECTIVE" = standard ] \ + || fail "direct reduced compatibility request was promoted to Full" + [ "${RESOLVED_BUILD_TARGETS[*]}" = Heltec_v3_repeater_lora_ota_no_external_sensors ] \ + || fail "direct reduced request changed its deployed target identity" +) + +# Named Full Companion already selects its own combined profile. In a bulk +# pass it must compile the real source recipe, including generated Full names, +# without entering the infrastructure promotion path. Stop at recipe capture, +# before any dependency install, PlatformIO invocation, or artifact collection. +( + BATCH_BUILD_MODE=1 + BUILD_PROFILE_EXPLICIT=0 + BUILD_PROFILE_EFFECTIVE=standard + ESP32_FULL_BUILD=0 + FIRMWARE_VERSION=vtest-full-companion-routing + RESUME_BUILD_OUTPUT=0 + companion_probe_marker=$(mktemp) + trap 'rm -f "$companion_probe_marker"' EXIT + compute_build_recipe_digest() { + printf '%s|%s|%s\n' "$1" "$3" "$ESP32_FULL_BUILD" > "$companion_probe_marker" + return 77 + } + for full_companion in Heltec_v3_companion_radio_full Heltec_ct62_companion_radio_full; do + source_recipe=$(get_pio_build_env "$full_companion") + [ "$(get_exact_identity_full_pio_env "$full_companion")" = "$source_recipe" ] \ + || fail "$full_companion tried to compile a logical Full name as its source recipe" + : > "$companion_probe_marker" + if build_firmware_one_profile "$full_companion" >/dev/null; then + fail "$full_companion bypassed the pre-PlatformIO recipe probe" + fi + [ "$(cat "$companion_probe_marker")" = "$full_companion|$source_recipe|0" ] \ + || fail "$full_companion entered infrastructure promotion or lost its real source recipe" + done +) + +# Exercise actual matrix scheduling while replacing only its final build +# dispatch. This verifies the portable pass cannot return through an old +# allowlist gap, migration target, or later duplicate profile pass. +( + REQUIRE_OTA_UPDATES=0 + BATCH_BUILD_MODE=1 + BUILD_PROFILE_EXPLICIT=0 + BUILD_PROFILE_EFFECTIVE=standard + ESP32_FULL_BUILD=0 + matrix_builds=() + run_logged_build_targets() { + local target + for target in "$@"; do + matrix_builds+=("$target:$ESP32_FULL_BUILD") + if [ "${PIO_ENV_PLATFORM_BY_NAME[$target]:-}" = ESP32_PLATFORM ] \ + && ! is_kiss_modem_target "$target" \ + && ! is_companion_radio_full_target "$target"; then + [ "$ESP32_FULL_BUILD" = 1 ] \ + || fail "ordinary matrix scheduled a portable ESP32 node: $target" + fi + done + return 0 + } + run_logging_matrix_build_targets \ + Station_G3_ESP32_r2_repeater Ebyte_EoRa-S3_Repeater \ + Generic_ESPNOW_repeatr heltec_v4_room_server heltec_v4_sensor \ + Station_G2_companion_radio_full heltec_v4_kiss_modem \ + RAK_3401_repeater_lora_ota_no_external_sensors >/dev/null + for target in Station_G3_ESP32_r2_repeater Ebyte_EoRa-S3_Repeater \ + Generic_ESPNOW_repeatr heltec_v4_room_server heltec_v4_sensor; do + matches=0 + for call in "${matrix_builds[@]}"; do + if [ "$call" = "$target:1" ]; then matches=$((matches + 1)); fi + done + [ "$matches" -eq 1 ] \ + || fail "ordinary matrix built $target $matches times instead of one Full image" + done + for expected in Station_G2_companion_radio_full:0 heltec_v4_kiss_modem:0 \ + RAK_3401_repeater_lora_ota_no_external_sensors:0; do + found=0 + for call in "${matrix_builds[@]}"; do + if [ "$call" = "$expected" ]; then found=$((found + 1)); fi + done + [ "$found" -eq 1 ] \ + || fail "matrix changed the distinct Companion/KISS/nRF52 recipe: $expected" + done +) + # ESP32 room servers and sensors use their expanded Full image for LoRa OTA. for full_role_env in Heltec_v3_room_server Heltec_v3_sensor; do supports_esp32_full_build "$full_role_env" \ diff --git a/test/test_local_release_full_selection.py b/test/test_local_release_full_selection.py index c5cf85541..eebb04cc7 100644 --- a/test/test_local_release_full_selection.py +++ b/test/test_local_release_full_selection.py @@ -20,6 +20,96 @@ def record(target: str, profile: str = "full", platform: str = "ESP32_PLATFORM", class ReleaseFullSelectionTest(unittest.TestCase): + def test_resume_discards_everyday_esp32_standard_profiles_with_or_without_full(self): + for target in ("heltec_v4_repeater", "heltec_v4_room_server", "heltec_v4_sensor", + "Station_G3_ESP32_r2_repeater", "Ebyte_EoRa-S3_Repeater", + "Station_G2_companion_radio_full"): + primary = record(target) + for profile in ("standard", "auto", "reduced"): + stale = record(target, profile) + with self.subTest(target=target, profile=profile): + self.assertEqual(select_ordinary_full_records([stale]), []) + for inputs in ([primary, stale], [stale, primary]): + selected = select_ordinary_full_records(inputs) + self.assertEqual(selected, [primary]) + self.assertIs(selected[0], primary) + + def test_reduced_esp32_identities_are_not_relabelled_as_full_releases(self): + for base in ("heltec_v4_repeater", "Ebyte_EoRa-S3_Repeater", + "LilyGo_Tlora_C6_room_server_"): + primary = record(base) + alias = base.rstrip("_") + "_lora_ota_no_external_sensors" + for profile in ("standard", "auto", "full"): + legacy = record(alias, profile) + with self.subTest(base=base, profile=profile): + self.assertEqual(select_ordinary_full_records([legacy]), []) + self.assertEqual(select_ordinary_full_records([legacy, primary]), [primary]) + self.assertEqual(primary["manifest"]["target"], base) + self.assertEqual(legacy["manifest"]["target"], alias) + + def test_legacy_companion_transport_names_do_not_survive_resumed_releases(self): + primary = record("Station_G2_companion_radio_full") + for transport in ("usb", "ble", "wifi"): + for profile in ("standard", "full"): + legacy = record("Station_G2_companion_radio_" + transport, profile) + with self.subTest(transport=transport, profile=profile): + self.assertEqual(select_ordinary_full_records([legacy]), []) + self.assertEqual(select_ordinary_full_records([legacy, primary]), [primary]) + terminal = record("Station_G2_terminal_chat") + self.assertEqual(select_ordinary_full_records([terminal, primary]), [primary]) + + def test_migration_and_local_hil_utilities_stay_out_of_ordinary_release(self): + primary = record("heltec_v4_repeater") + for target in ("heltec_v4_partition_migrator", "Xiao_S3_WIO_partition_expander", + "xiao_s3_partition_legacy_seed", "profile_switch_heltec_v4", + "profile_fixed_esp32_tx", "profile_four_tx_v4_rx", + "heltec_v4_repeater_legacy_partition_test", + "Heltec_v3_repeater_observer_mqtt_sim"): + for profile in ("standard", "full"): + utility = record(target, profile) + with self.subTest(target=target, profile=profile): + self.assertEqual(select_ordinary_full_records([utility]), []) + self.assertEqual(select_ordinary_full_records([utility, primary]), [primary]) + + def test_kiss_is_a_distinct_host_modem_role_and_not_a_reduced_node(self): + companion = record("Station_G2_companion_radio_full") + for target in ("Station_G2_kiss_modem", "nibble_screen_connect_kiss_modem_"): + for profile in ("standard", "auto", "full"): + modem = record(target, profile) + with self.subTest(target=target, profile=profile): + self.assertEqual(select_ordinary_full_records([modem]), [modem]) + self.assertCountEqual(select_ordinary_full_records([companion, modem]), + [companion, modem]) + + def test_unverified_selected_esp32_full_image_cannot_enter_release(self): + for target in ("heltec_v4_room_server", "Station_G2_companion_radio_full"): + for verified in (False, None): + image = record(target) + image["manifest"]["verified"] = verified + with self.subTest(target=target, verified=verified): + with self.assertRaisesRegex(ValueError, "verified"): + select_ordinary_full_records([image]) + + def test_exact_hardware_and_application_roles_remain_distinct_full_records(self): + images = [record(target) for target in ( + "heltec_v4_repeater", "heltec_v4_tft_repeater", "heltec_v4_r8_repeater", + "heltec_v4_room_server", "heltec_v4_sensor", + "heltec_v4_2_v4_3_companion_radio_full_femon", + "heltec_v4_tft_companion_radio_full_femon", + )] + for inputs in (images, list(reversed(images))): + selected = select_ordinary_full_records(inputs) + self.assertCountEqual(selected, images) + self.assertEqual(len(selected), len(images)) + + def test_other_platform_profiles_and_reduced_identities_are_unchanged(self): + for platform in ("NRF52_PLATFORM", "RP2040_PLATFORM", "STM32_PLATFORM"): + for profile in ("standard", "auto", "full"): + for suffix in ("", "_lora_ota_no_external_sensors"): + image = record("other_repeater" + suffix, profile, platform) + with self.subTest(platform=platform, profile=profile, suffix=suffix): + self.assertEqual(select_ordinary_full_records([image]), [image]) + def test_full_uart_source_substitution_requires_linked_driver_proof(self): for base in ("Heltec_v3_repeater", "Heltec_WSL3_repeater", "RAK_3112_repeater", "LilyGo_TLora_V2_1_1_6_repeater"): @@ -76,7 +166,8 @@ class ReleaseFullSelectionTest(unittest.TestCase): wireless = record(base + "_bridge_espnow", profile, capabilities=("bridge.espnow",)) for inputs in ([observer, uart, wireless], [wireless, uart, observer]): with self.subTest(profile=profile): - self.assertCountEqual(select_ordinary_full_records(inputs), [observer, uart]) + expected = [observer, uart] if profile == "full" else [observer] + self.assertCountEqual(select_ordinary_full_records(inputs), expected) for fault in ("missing_capability", "missing_proof", "false_proof", "unverified"): normal = record(base, capabilities=("bridge.rs232", "bridge.espnow")) manifest = normal["manifest"] @@ -109,8 +200,12 @@ class ReleaseFullSelectionTest(unittest.TestCase): for profile in ("standard", "full"): legacy = record(base + "_bridge_espnow", profile, capabilities=("bridge.espnow",)) with self.subTest(fault=fault, profile=profile): - self.assertCountEqual(select_ordinary_full_records([observer, legacy]), - [observer, legacy]) + if fault == "unverified": + with self.assertRaisesRegex(ValueError, "verified"): + select_ordinary_full_records([observer, legacy]) + else: + expected = [observer, legacy] if profile == "full" else [observer] + self.assertCountEqual(select_ordinary_full_records([observer, legacy]), expected) def test_meshtower_sd_primary_filters_stale_internal_images_without_relabeling(self): primary = "Heltec_tower_v2_sdcard_repeater_lora_ota_no_external_sensors" @@ -151,7 +246,7 @@ class ReleaseFullSelectionTest(unittest.TestCase): variants.append(item) self.assertEqual(select_ordinary_full_records(variants), variants) - def test_resume_filters_sibling_full_images_only(self): + def test_resume_filters_standard_and_sibling_full_images(self): inputs = [ record("Heltec_v3_repeater_observer_mqtt"), record("Heltec_v3_repeater_bridge_espnow"), @@ -178,7 +273,7 @@ class ReleaseFullSelectionTest(unittest.TestCase): "Meshadventurer_sx1262_repeater_bridge_espnow", "RAK_4631_repeater", }) - self.assertEqual(len(selected), 9) # standard V3 and both TLora Full profiles remain + self.assertEqual(len(selected), 8) # both TLora Full transport profiles remain def test_mke_combined_repeater_filters_stale_bridge_identities_without_relabeling(self): primary = record("MKE_s3_repeater", capabilities=("bridge.rs232", "bridge.espnow")) @@ -237,12 +332,12 @@ class ReleaseFullSelectionTest(unittest.TestCase): with self.assertRaisesRegex(ValueError, "qualified combined repeater"): select_ordinary_full_records([primary]) - def test_mke_full_contract_does_not_apply_to_other_platforms_or_standard_profiles(self): + def test_other_platform_passthrough_and_standard_mke_is_not_a_release(self): other_platform = record("RAK_4631_repeater", platform="NRF52_PLATFORM") other_platform["manifest"].update(verified=None, capabilities=None, verification=None) standard_mke = record("MKE_s3_repeater", "standard") inputs = [other_platform, standard_mke] - self.assertEqual(select_ordinary_full_records(inputs), inputs) + self.assertEqual(select_ordinary_full_records(inputs), [other_platform]) def test_dedicated_espnow_survives_when_plain_image_lacks_the_capability(self): inputs = [record("heltec_v4_tft_repeater"), @@ -275,7 +370,12 @@ class ReleaseFullSelectionTest(unittest.TestCase): capabilities=("bridge.espnow",)) for inputs in ([primary, legacy], [legacy, primary]): with self.subTest(profile=profile, fault=fault, primary_first=inputs[0] is primary): - self.assertCountEqual(select_ordinary_full_records(inputs), inputs) + if fault == "false_verified": + with self.assertRaisesRegex(ValueError, "verified"): + select_ordinary_full_records(inputs) + else: + expected = inputs if profile == "full" else [primary] + self.assertCountEqual(select_ordinary_full_records(inputs), expected) def test_stale_plain_cannot_displace_the_observer_proving_the_combined_driver(self): for profile in ("full", "standard"): @@ -324,7 +424,8 @@ class ReleaseFullSelectionTest(unittest.TestCase): primary = record("heltec_v4_tft_repeater", capabilities=("bridge.espnow",)) primary["manifest"]["verified"] = False legacy = record("heltec_v4_tft_repeater_bridge_espnow", capabilities=("bridge.espnow",)) - self.assertEqual(select_ordinary_full_records([primary, legacy]), [primary, legacy]) + with self.assertRaisesRegex(ValueError, "verified"): + select_ordinary_full_records([primary, legacy]) if __name__ == "__main__":