This commit is contained in:
mikecarper committed 2026-10-19 09:58:31 +00:00
1 parent 7f84376aad
commit a0ce86fde3
12 files changed
+6053 -5

No files matched your search

+14 -2
View File
@@ -4008,8 +4008,20 @@ class MotaSource {
uint8_t* buf, uint16_t cap, uint16_t* len); // optional raw RFC 1951
};
</code></pre>
<p>To serve an external mota the node reads its manifest-minus-leaves + <code>leaves[]</code> into RAM (&lt;=4 KiB for &lt;=1024
blocks) and streams payload blocks from the source on demand; proofs are generated from the read leaves.</p>
<p>Legacy source paths retain the manifest-minus-leaves and four bytes per source
block, bounded by <code>OTA_PROOFGEN_SCRATCH</code>, then stream payload blocks on demand.
Non-PSRAM ESP32 Full instead retains roots of 32-leaf groups and rereads the
selected group. Its complete workspace is bounded to 1,536 bytes while retaining
4,096 blocks and byte-identical proofs. Partial groups use the same odd-node
promotion as the full tree. Receive pipelines, capture, serving and wire formats
remain unchanged; larger custom leaf limits retain the legacy path.</p>
<p>With <code>OTA_BOUNDED_SOURCE_PROOFS=1</code>, optional <code>read_quantum()</code> and
<code>read_metadata()</code> methods bound each metadata step. <code>SerialMotaSource</code> uses the
current negotiated single-response capacity and rejects a chunk that no longer
fits after a capacity change. Proof preparation yields between chunks, and
queued jobs retain their buffers across radio backpressure. See the
<a href="../test-results/heltec_v3_full_memory_2026-10-19/">V3 Full qualification</a> for
allocation bounds and regression coverage.</p>
<h3 id="102-the-mota-seeder-transport-motaseederprotoh">10.2 The <code>mota-seeder</code> transport (<code>MotaSeederProto.h</code>)</h3>
<p>A <code>MotaSource</code> is fed by a host that serves a folder over the device's <strong>USB serial</strong> (the same console the
CLI uses - no extra hardware), on an ESP32 WiFi companion or FULL ESP32 role over <strong>WiFi (TCP)</strong>, or on an
+27 -1
View File
@@ -2330,6 +2330,17 @@
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#shared-contact-index-storage" class="md-nav__link">
<span class="md-ellipsis">
Shared contact index storage
</span>
</a>
</li>
<li class="md-nav__item">
@@ -2604,8 +2615,23 @@ layout. Install the trial's merged image over USB first to install its
partition table. Subsequent WiFi updates must fit the new slots. An
application-only update from the ordinary single-slot Full layout cannot
change that layout or enable WiFi OTA.</p>
<h2 id="shared-contact-index-storage">Shared contact index storage</h2>
<p>Companion and terminal-chat builds share compact contact indexes in
<code>BaseChatMesh</code>. Tables with at most 65,535 total slots use 16-bit sort and
matching-result entries; larger configurations retain the original <code>int</code> type.
Contact limits, PSRAM allocation fallback and saved/wire formats are unchanged.</p>
<p>On the existing 32-bit platforms, a static 350-contact table saves 764 bytes
from these arrays; a static 100-contact table saves 264 bytes. A 350-contact
PSRAM configuration saves 96 internal bytes and 716 PSRAM bytes. Cached nRF52
records also shrink from 96 to 92 bytes by moving runtime storage bookkeeping
into an alignment gap. The matched RAK4631 Full build saves 2,200 static RAM
bytes in total. These figures do not describe infrastructure ACL tables.</p>
<p>See the <a href="../../test-results/contact_memory_2026-10-19/">2026-10-19 qualification report</a>
for source-bound builds, tests and remaining board-specific memory limits.</p>
<h2 id="regression-checks">Regression checks</h2>
<pre><code class="language-sh">python3 -B test/test_contact_cache.py
<pre><code class="language-sh">python3 -B test/test_contact_indices.py
python3 -B test/test_companion_contact_lifetime.py
python3 -B test/test_contact_cache.py
python3 -B test/test_companion_uncached_storage.py
python3 -B test/test_companion_contact_partial_tail.py
python3 -B test/test_companion_contact_persistence_contract.py
+63 -1
View File
@@ -2392,6 +2392,28 @@
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#shared-contact-ram-and-rak4631-full-recheck-2026-10-19-utc" class="md-nav__link">
<span class="md-ellipsis">
Shared contact RAM and RAK4631 Full recheck, 2026-10-19 UTC
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#heltec-v3-full-bounded-source-repair-2026-10-19-utc" class="md-nav__link">
<span class="md-ellipsis">
Heltec V3 Full bounded-source repair, 2026-10-19 UTC
</span>
</a>
</li>
</ul>
@@ -2679,7 +2701,12 @@ rate-window counters nor struct padding can make different rules share a slot.</
<p>OTA leaf capacity remains controlled by <code>OTA_PROOFGEN_SCRATCH</code>, independently
of output-buffer size. The maximum source buffers are 4 KiB plus one block on
ordinary nRF52, 8 KiB plus one block with SD storage, and 16 KiB plus one block
on ESP32. Generic folder sources need no output allocation for raw DATA or
on legacy ESP32 paths. Non-PSRAM ESP32 Full uses grouped source proofs instead:
the complete workspace is bounded to 1,536 bytes, while retaining the same
4,096-block source limit. The check still adds one output block and allocation
metadata; safety reserves and stacks are unchanged. PSRAM and other platforms
retain the legacy policy. Explicit larger custom leaf limits also keep the
legacy implementation. Generic folder sources need no output allocation for raw DATA or
proofs; own-image raw serving retains its caller-owned compatibility buffer.
Its nRF52 allowance remains in the budget even when the device encoder is off.
Queued DATA, PROOF and MANIFEST responses pin their buffers through radio
@@ -3486,6 +3513,41 @@ images fit. These results qualify linked capacity and host behavior, not
physical USB/RF/MQTT integration, board boot/sleep or a sustained-load soak.
The Mini Repeater remains cable-only (<code>--allow-no-ota</code>); no hardware was
flashed, no release was published and existing outputs were not overwritten.</p>
<h3 id="shared-contact-ram-and-rak4631-full-recheck-2026-10-19-utc">Shared contact RAM and RAK4631 Full recheck, 2026-10-19 UTC</h3>
<p>Companion and <code>simple_secure_chat</code> contact sort/match indexes now use <code>uint16_t</code>
when the complete table has at most 65,535 slots; larger configurations retain
<code>int</code>. Static 350-contact targets save 764 internal bytes; PSRAM targets save
96 internal and 716 external bytes; static 100-contact targets save 264 internal
bytes. Cached nRF52 record placement also saves four bytes per runtime contact.
Capacities, serialization, queues, stacks, features and fallback behavior remain.</p>
<p>At <code>aed4c22e5</code>, matched against <code>31e693ec2</code>, RAK4631 Full saves 2,200 static RAM
bytes and 488 actual DFU application bytes. Its application is 712,112 of 712,704
bytes (592 free); modeled RAM admission margin rises from 4,516 to 6,716. CRC
sharing and Reader packing preserve formats/text; Full features and existing SD
support remain enabled. These are linked/build capacities, not running-heap or
physical storage measurements.</p>
<p>Five final-source canonical packages pass across nRF52, ESP32 PSRAM, RP2040 and
STM32. RAK3x72 USB has four actual BIN bytes free, requiring unchanged hard gates.
At that revision, V3 Full fails RAM admission on both baseline and final source; its
100-contact wrapper gains 264 bytes, reducing the deficit from 21,288 to 21,024.
The direct 350-contact V3 terminal default build passes separately; it is not a
canonical Full or release-version/preset package. No hardware was flashed.
See the <a href="../../test-results/contact_memory_2026-10-19/">qualification report</a> and
its source-bound artifacts, software coverage and limits.</p>
<h3 id="heltec-v3-full-bounded-source-repair-2026-10-19-utc">Heltec V3 Full bounded-source repair, 2026-10-19 UTC</h3>
<p>At <code>eb9259f2a</code>, canonical V3 Full passes with 189,616 internal bytes available
against 183,584 required: 6,032 bytes of modeled margin. The pinned NimBLE
adapter preserves 15 saved phones and 30 CCCDs. Existing Bluedroid pairings need
one-time re-pairing. Its 100 contacts, 40 channels, 256 offline frames, MQTT slot,
Full features and stack sizes remain unchanged.</p>
<p>Grouped source proofs retain the same 4,096-block capacity with a lazy workspace
of 1,004 bytes, statically bounded to 1,536. The guard replaces only the old
16,384-byte leaf allocation with this bound; the output block, metadata,
transient margin and all other allowances remain additive. Legacy/PSRAM paths
and larger custom leaf limits retain the existing policy.</p>
<p>The clean V3 package and constrained RAK regressions pass; physical V3 testing
still awaits USB attachment. See the <a href="../../test-results/heltec_v3_full_memory_2026-10-19/">V3 qualification report</a>
for artifact hashes, tests, upgrade behavior and hardware limits.</p>
+1 -1
View File
@@ -1 +1 @@
{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"],"fields":{"title":{"boost":1000.0},"text":{"boost":1.0},"tags":{"boost":1000000.0}}},"docs":[{"location":"","title":"Home","text":"<p>View this page on MeshCore Docs.</p>"},{"location":"#meshcore-documentation","title":"MeshCore documentation","text":"<p>Choose firmware with the firmware picker. For help with a device already in service, start with the FAQ.</p>"},{"location":"#current-release","title":"Current release","text":"<ul> <li>1.17.1.8 USA Cascade release notes</li> <li>Test Results \u2014 validation archive and 1.17.1.8 Preview 1 qualification evidence</li> </ul>"},{"location":"#documentation","title":"Documentation","text":"<ul> <li>Feature switches by role and Full Companion features</li> <li>Firmware update guide, easy LoRa OTA, and scripted LoRa OTA</li> <li>CLI commands, availability by build, and radio profiles</li> <li>Private fleet management: signed filtering and secondary-radio commands for a fleet or one node</li> <li>Room history, moderation, and information board: optional persistent chat and local Wi-Fi room access</li> <li>Companion protocol, packet format, and QR codes</li> </ul> <p>The navigation groups the remaining guides under Documentation, including board-specific updates, networking, power, and protocol references.</p>"},{"location":"#tools","title":"Tools","text":"<ul> <li>Firmware picker and USB web console</li> <li>Notification builder and temporary radio test builder</li> <li>Filter policy playground, telemetry decoder, and management report decoder</li> </ul>"},{"location":"#engineering-records","title":"Engineering records","text":"<ul> <li>Research \u2014 design notes, diagnostics, and historical update-chain studies</li> <li>Old Releases \u2014 historical release notes and supporting files</li> </ul> <p>Found a mistake or missing information? Edit the documentation.</p>"},{"location":"WiFi/","title":"WiFi","text":"<p>View this page on MeshCore Docs.</p>"},{"location":"WiFi/#wifi-and-mqtt-by-firmware-type","title":"WiFi and MQTT by Firmware Type","text":"<p>MeshCore itself does not require WiFi or the internet. LoRa packet exchange, repeating, room servers, companions, and sensors can all operate without either. WiFi is added by particular ESP32 firmware targets for one or more of these purposes:</p> <ul> <li>a TCP connection between a WiFi companion and a phone or computer;</li> <li>the WebConfig browser interface;</li> <li>MQTT uplinking from the radio to internet or LAN brokers;</li> <li>WiFi-assisted OTA services on builds that include them;</li> <li>ESP-NOW bridging, which uses the ESP32's 2.4 GHz radio but is not a connection to a WiFi access point.</li> </ul> <p>The firmware role and the build profile are separate choices. USB logging does not itself provide MQTT. MQTT-capable Full Companions include that feature without <code>mqtt</code> in their filename; check the artifact capability manifest. See feature switches by role for the different Companion and infrastructure controls and the USB web console.</p>"},{"location":"WiFi/#quick-reference","title":"Quick reference","text":"Firmware target or role Infrastructure WiFi MQTT What WiFi does <code>*_repeater</code> Build-dependent on ESP32 No FULL builds provide WebConfig, browser OTA, and the TCP 5001 LoRa-OTA seeder while WiFi is active <code>*_repeater_observer_mqtt</code> Yes Yes Uplinks heard and selected transmitted LoRa packets; repeating remains enabled by default <code>*_room_server</code> Build-dependent on ESP32 No FULL builds provide WebConfig, browser OTA, and the TCP 5001 LoRa-OTA seeder while WiFi is active <code>*_room_server_observer_mqtt</code> Yes Yes Runs the room server and uplinks radio traffic <code>*_companion_radio_wifi</code> Yes No Exposes the MeshCore companion protocol on TCP port 5000 <code>*_companion_radio_wifi_mqtt</code> Yes Yes Runs both the TCP companion interface and the MQTT uplink <code>*_companion_radio_full*</code> ESP32, subject to board/transport selection Where compiled on ESP32 Includes supported USB/wireless transports; configure MQTT through WebConfig Dedicated USB, BLE, or serial companion (not Full) No No Uses the transport named by the target instead <code>*_repeater_bridge_espnow</code> Build-dependent on ESP32 No Uses ESP-NOW for its bridge; <code>bridge.format wrapped|raw</code> selects legacy bridge framing or primary-ESP-NOW compatibility; a FULL build also exposes the TCP 5001 LoRa-OTA seeder whenever WiFi is usable RS232 bridge No No Bridges through a serial interface Ethernet repeater/room server No WiFi No Uses wired Ethernet for its role-specific network interface <code>*_sensor</code> Build-dependent on ESP32 No A FULL ESP32 sensor can expose the TCP 5001 LoRa-OTA seeder through its browser-OTA setup AP Terminal-chat or KISS modem No in current targets No Uses LoRa and its role-specific local interface <code>*_lora_ota_no_external_sensors</code> On demand on ESP32 No LeaLine truncated
{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"],"fields":{"title":{"boost":1000.0},"text":{"boost":1.0},"tags":{"boost":1000000.0}}},"docs":[{"location":"","title":"Home","text":"<p>View this page on MeshCore Docs.</p>"},{"location":"#meshcore-documentation","title":"MeshCore documentation","text":"<p>Choose firmware with the firmware picker. For help with a device already in service, start with the FAQ.</p>"},{"location":"#current-release","title":"Current release","text":"<ul> <li>1.17.1.8 USA Cascade release notes</li> <li>Test Results \u2014 validation archive and 1.17.1.8 Preview 1 qualification evidence</li> </ul>"},{"location":"#documentation","title":"Documentation","text":"<ul> <li>Feature switches by role and Full Companion features</li> <li>Firmware update guide, easy LoRa OTA, and scripted LoRa OTA</li> <li>CLI commands, availability by build, and radio profiles</li> <li>Private fleet management: signed filtering and secondary-radio commands for a fleet or one node</li> <li>Room history, moderation, and information board: optional persistent chat and local Wi-Fi room access</li> <li>Companion protocol, packet format, and QR codes</li> </ul> <p>The navigation groups the remaining guides under Documentation, including board-specific updates, networking, power, and protocol references.</p>"},{"location":"#tools","title":"Tools","text":"<ul> <li>Firmware picker and USB web console</li> <li>Notification builder and temporary radio test builder</li> <li>Filter policy playground, telemetry decoder, and management report decoder</li> </ul>"},{"location":"#engineering-records","title":"Engineering records","text":"<ul> <li>Research \u2014 design notes, diagnostics, and historical update-chain studies</li> <li>Old Releases \u2014 historical release notes and supporting files</li> </ul> <p>Found a mistake or missing information? Edit the documentation.</p>"},{"location":"WiFi/","title":"WiFi","text":"<p>View this page on MeshCore Docs.</p>"},{"location":"WiFi/#wifi-and-mqtt-by-firmware-type","title":"WiFi and MQTT by Firmware Type","text":"<p>MeshCore itself does not require WiFi or the internet. LoRa packet exchange, repeating, room servers, companions, and sensors can all operate without either. WiFi is added by particular ESP32 firmware targets for one or more of these purposes:</p> <ul> <li>a TCP connection between a WiFi companion and a phone or computer;</li> <li>the WebConfig browser interface;</li> <li>MQTT uplinking from the radio to internet or LAN brokers;</li> <li>WiFi-assisted OTA services on builds that include them;</li> <li>ESP-NOW bridging, which uses the ESP32's 2.4 GHz radio but is not a connection to a WiFi access point.</li> </ul> <p>The firmware role and the build profile are separate choices. USB logging does not itself provide MQTT. MQTT-capable Full Companions include that feature without <code>mqtt</code> in their filename; check the artifact capability manifest. See feature switches by role for the different Companion and infrastructure controls and the USB web console.</p>"},{"location":"WiFi/#quick-reference","title":"Quick reference","text":"Firmware target or role Infrastructure WiFi MQTT What WiFi does <code>*_repeater</code> Build-dependent on ESP32 No FULL builds provide WebConfig, browser OTA, and the TCP 5001 LoRa-OTA seeder while WiFi is active <code>*_repeater_observer_mqtt</code> Yes Yes Uplinks heard and selected transmitted LoRa packets; repeating remains enabled by default <code>*_room_server</code> Build-dependent on ESP32 No FULL builds provide WebConfig, browser OTA, and the TCP 5001 LoRa-OTA seeder while WiFi is active <code>*_room_server_observer_mqtt</code> Yes Yes Runs the room server and uplinks radio traffic <code>*_companion_radio_wifi</code> Yes No Exposes the MeshCore companion protocol on TCP port 5000 <code>*_companion_radio_wifi_mqtt</code> Yes Yes Runs both the TCP companion interface and the MQTT uplink <code>*_companion_radio_full*</code> ESP32, subject to board/transport selection Where compiled on ESP32 Includes supported USB/wireless transports; configure MQTT through WebConfig Dedicated USB, BLE, or serial companion (not Full) No No Uses the transport named by the target instead <code>*_repeater_bridge_espnow</code> Build-dependent on ESP32 No Uses ESP-NOW for its bridge; <code>bridge.format wrapped|raw</code> selects legacy bridge framing or primary-ESP-NOW compatibility; a FULL build also exposes the TCP 5001 LoRa-OTA seeder whenever WiFi is usable RS232 bridge No No Bridges through a serial interface Ethernet repeater/room server No WiFi No Uses wired Ethernet for its role-specific network interface <code>*_sensor</code> Build-dependent on ESP32 No A FULL ESP32 sensor can expose the TCP 5001 LoRa-OTA seeder through its browser-OTA setup AP Terminal-chat or KISS modem No in current targets No Uses LoRa and its role-specific local interface <code>*_lora_ota_no_external_sensors</code> On demand on ESP32 No LeaLine truncated
+8
View File
@@ -560,6 +560,10 @@
<loc>https://mikecarper.github.io/MeshCore/test-results/companion_usb_client_validation/</loc>
<lastmod>2026-10-19</lastmod>
</url>
<url>
<loc>https://mikecarper.github.io/MeshCore/test-results/contact_memory_2026-10-19/</loc>
<lastmod>2026-10-19</lastmod>
</url>
<url>
<loc>https://mikecarper.github.io/MeshCore/test-results/double_frequency_v4_validation/</loc>
<lastmod>2026-10-19</lastmod>
@@ -620,6 +624,10 @@
<loc>https://mikecarper.github.io/MeshCore/test-results/heltec_t114_display_detection/</loc>
<lastmod>2026-10-19</lastmod>
</url>
<url>
<loc>https://mikecarper.github.io/MeshCore/test-results/heltec_v3_full_memory_2026-10-19/</loc>
<lastmod>2026-10-19</lastmod>
</url>
<url>
<loc>https://mikecarper.github.io/MeshCore/test-results/heltec_v3_preview3_ram/</loc>
<lastmod>2026-10-19</lastmod>
BIN
View File
Binary file not shown.
+414
View File
@@ -0,0 +1,414 @@
{
"schema_version": 1,
"date_utc": "2026-10-19",
"source_commit": "aed4c22e51201f0ee3586e26e1007194a74b015d",
"baseline_source_commit": "31e693ec209109a930dcf8aeef89dacbe9116a63",
"hardware_flashed": false,
"release_published": false,
"platformio_single_process": true,
"final_matrix_complete": true,
"all_final_matrix_targets_passed": false,
"packages": [
{
"requested_target": "RAK_4631_companion_radio_full",
"passed": true,
"exit_code": 0,
"packaged_target": "RAK_4631_companion_radio_full",
"build_profile": "full",
"pio_environment": "RAK_4631_companion_radio_full",
"elf_sha256": "f002455df52a9cdf4278461685eaee3082cc14752f741428f6dfe2dcdc2bb2a7",
"all_memory_bound_file_hashes_match": true,
"memory_manifest_sha256": "073bd0eca6c9b233fcb09080991850b61806fddea3a0af31c52b0feb8bed9762",
"files": {
"RAK_4631_companion_radio_full-v1.18.0.1-halo-keymind-cascade-dev-aed4c22e.uf2": "31d92e0c48378932ec1465bd5542ca696dcf133a9f6555fd9d513691e1fafec0",
"RAK_4631_companion_radio_full-v1.18.0.1-halo-keymind-cascade-dev-aed4c22e.zip": "d99d904430de75dd5e507a530267d933b8f0bda762afe86cdb150209f4df4499",
"RAK_4631_companion_radio_full-v1.18.0.1-halo-keymind-cascade-dev-aed4c22e.capabilities.json": "d74ca93392bad5ab7cdbe8e07d24a905dbb570cbea76063ad8d9ab34be9cc788",
"RAK_4631_companion_radio_full-v1.18.0.1-halo-keymind-cascade-dev-aed4c22e.meshtext-license.txt": "ba558609720fbff1481e236462eea2f9e08a73c1f3c2fd486ea4d9e1d0a6d58f"
},
"capabilities": [
"profile.full",
"companion.meshtext.channel_text",
"ota.update.bluetooth",
"companion.temp_radio",
"companion.ota_cli",
"companion.usb",
"companion.bluetooth",
"companion.usb_logging",
"companion.usb_mota_source",
"companion.mota_sender",
"companion.dedicated_usb_logging",
"companion.ble_mota_source",
"logging.usb.packets",
"logging.usb.control"
],
"capability_verification_count": 13,
"capability_verification_passed": true,
"ordinary_static_ram_bytes": 154084,
"static_sections": {
".data": 1660,
".bss": 152424
},
"static_sections_scope": "ELF .data plus ordinary .bss only; excludes separately named/reserved arenas; null when these exact sections are absent",
"available_internal_bytes": 81292,
"required_heap_bytes": 74576,
"ram_admission_margin_bytes": 6716,
"sd_fat_volume_and_files_reserve_bytes": 2048,
"application_bytes": 712112,
"application_sha256": "c2080afe8874c71eb9a5d1fb253fec06463cac8a774fc776ff46453abf2da420",
"application_source": "DFU application BIN extracted from ZIP",
"uf2_matches_DFU_application": true,
"uf2_blocks": 2782,
"initialized_ELF_flash_load_bytes_match": true,
"initialized_ELF_flash_load_bytes_compared": 712032,
"application_capacity_bytes": 712704,
"application_margin_bytes": 592
},
{
"requested_target": "RAK_3401_companion_radio_usb",
"passed": true,
"exit_code": 0,
"packaged_target": "RAK_3401_companion_radio_usb",
"build_profile": "auto",
"pio_environment": "RAK_3401_companion_radio_usb",
"elf_sha256": "0d4a8c90601fc50b4c44f6ee3f315cc2bdfb5b5365cec2efed9d09d54189b9e2",
"all_memory_bound_file_hashes_match": true,
"memory_manifest_sha256": "e22c31d59175cc10c4ecb4f8d04430a859d4e32b450d8f1cd50480f012fd690d",
"files": {
"RAK_3401_companion_radio_usb-v1.18.0.1-halo-keymind-cascade-dev-aed4c22e.uf2": "94469781e5550ff41469a5bf80f6f4dba5fc5d2aa2f9f3e073834b06137ef3d0",
"RAK_3401_companion_radio_usb-v1.18.0.1-halo-keymind-cascade-dev-aed4c22e.zip": "0709ee56d7f35ac1c9cfa8e8c997b5e2ebd5990c37d044de0e41c6e638f29587",
"RAK_3401_companion_radio_usb-v1.18.0.1-halo-keymind-cascade-dev-aed4c22e.capabilities.json": "088d17a9b1de74a851c5d17807a95a27cb4622e24fa05751ff0ef753b21f5ba7",
"RAK_3401_companion_radio_usb-v1.18.0.1-halo-keymind-cascade-dev-aed4c22e.meshtext-license.txt": "ba558609720fbff1481e236462eea2f9e08a73c1f3c2fd486ea4d9e1d0a6d58f"
},
"capabilities": [
"profile.auto",
"ota.update.bluetooth"
],
"capability_verification_count": 1,
"capability_verification_passed": true,
"ordinary_static_ram_bytes": 136564,
"static_sections": {
".data": 1536,
".bss": 135028
},
"static_sections_scope": "ELF .data plus ordinary .bss only; excludes separately named/reserved arenas; null when these exact sections are absent",
"available_internal_bytes": 98812,
"required_heap_bytes": 47872,
"ram_admission_margin_bytes": 50940,
"sd_fat_volume_and_files_reserve_bytes": 0,
"application_bytes": 523864,
"application_sha256": "a7fa19297c0a9a7f34162fbf666c2a9275794e1ff15b68aa0159817fae7a3bc2",
"application_source": "DFU application BIN extracted from ZIP",
"uf2_matches_DFU_application": true,
"uf2_blocks": 2047,
"initialized_ELF_flash_load_bytes_match": true,
"initialized_ELF_flash_load_bytes_compared": 523864
},
{
"requested_target": "Heltec_v3_companion_radio_full",
"passed": false,
"exit_code": 1
},
{
"requested_target": "heltec_v4_2_v4_3_companion_radio_full_femon",
"passed": true,
"exit_code": 0,
"packaged_target": "heltec_v4_2_v4_3_companion_radio_full_femon",
"build_profile": "full",
"pio_environment": "heltec_v4_2_v4_3_companion_radio_full_femon",
"elf_sha256": "2c50274bdc350696299819962592032fab540e63f583f2909baf227f875e8219",
"all_memory_bound_file_hashes_match": true,
"memory_manifest_sha256": "6bdcb095bed1fd784169d3986df1ff4212e84ec94bc69c032a0d2581fc79591f",
"files": {
"heltec_v4_2_v4_3_companion_radio_full_femon-v1.18.0.1-halo-keymind-cascade-dev-aed4c22e.bin": "ba264695b5093c643f726d970ef7cbfb29207f86454de8f924220276d0d26d70",
"heltec_v4_2_v4_3_companion_radio_full_femon-v1.18.0.1-halo-keymind-cascade-dev-aed4c22e-merged.bin": "f433d9275edb0b0ef470a2866f82ef948a87b7e328f2098f1e06876e8ef6641c",
"heltec_v4_2_v4_3_companion_radio_full_femon-v1.18.0.1-halo-keymind-cascade-dev-aed4c22e.capabilities.json": "08dcf0def4a66ebe628df3635cc2eb4f6e1eeea2b78abe550d1533e4601e2a26",
"heltec_v4_2_v4_3_companion_radio_full_femon-v1.18.0.1-halo-keymind-cascade-dev-aed4c22e.meshtext-license.txt": "ba558609720fbff1481e236462eea2f9e08a73c1f3c2fd486ea4d9e1d0a6d58f"
},
"capabilities": [
"profile.full",
"companion.meshtext.channel_text",
"companion.temp_radio",
"companion.ota_cli",
"companion.usb",
"companion.bluetooth",
"companion.usb_logging",
"companion.usb_mota_source",
"companion.mota_sender",
"companion.network_terminal",
"companion.wifi_ota_seeder",
"web.webconfig",
"web.unconfigured_setup_cutoff",
"companion.direct_mqtt",
"logging.usb.packets",
"logging.usb.control",
"companion.app_wifi.get_enabled",
"companion.app_wifi.set_enabled",
"companion.app_wifi.get_ssid",
"companion.app_wifi.set_ssid",
"companion.app_wifi.get_password",
"companion.app_wifi.set_password",
"companion.app_wifi.get_status",
"companion.app_wifi.get_ip",
"ota.update.wifi"
],
"capability_verification_count": 24,
"capability_verification_passed": true,
"ordinary_static_ram_bytes": null,
"static_sections": {},
"static_sections_scope": "ELF .data plus ordinary .bss only; excludes separately named/reserved arenas; null when these exact sections are absent",
"available_internal_bytes": 228872,
"required_heap_bytes": 194336,
"ram_admission_margin_bytes": 34536,
"sd_fat_volume_and_files_reserve_bytes": 0,
"application_bytes": 2558856,
"application_sha256": "ba264695b5093c643f726d970ef7cbfb29207f86454de8f924220276d0d26d70",
"application_source": "application BIN"
},
{
"requested_target": "Xiao_rp2040_companion_radio_usb",
"passed": true,
"exit_code": 0,
"packaged_target": "Xiao_rp2040_companion_radio_usb",
"build_profile": "auto",
"pio_environment": "Xiao_rp2040_companion_radio_usb",
"elf_sha256": "832133d6070f4b1b86ac6a9cbd691b5004025e19f7d853ca0cab2d0755284def",
"all_memory_bound_file_hashes_match": true,
"memory_manifest_sha256": "ecd592a61157de92ceb547984baf34f7a55f1fb8b218e6fece487f4ee4897f08",
"files": {
"Xiao_rp2040_companion_radio_usb-v1.18.0.1-halo-keymind-cascade-dev-aed4c22e.bin": "757ccb5adb387dab0fccca1793ed70e0713c8ff13e5801763c8a9250f102d806",
"Xiao_rp2040_companion_radio_usb-v1.18.0.1-halo-keymind-cascade-dev-aed4c22e.uf2": "8d9386975f8725f2f7bbe6fb1e9a5f81dff84134c710272e95759bd7872ac56e",
"Xiao_rp2040_companion_radio_usb-v1.18.0.1-halo-keymind-cascade-dev-aed4c22e.capabilities.json": "f182d520112f6667afdb45eb64197aa025df44b567dac8e370c6892de2858b34",
"Xiao_rp2040_companion_radio_usb-v1.18.0.1-halo-keymind-cascade-dev-aed4c22e.meshtext-license.txt": "ba558609720fbff1481e236462eea2f9e08a73c1f3c2fd486ea4d9e1d0a6d58f"
},
"capabilities": [
"profile.auto"
],
"capability_verification_count": 0,
"capability_verification_passed": true,
"ordinary_static_ram_bytes": 100168,
"static_sections": {
".data": 5372,
".bss": 94796
},
"static_sections_scope": "ELF .data plus ordinary .bss only; excludes separately named/reserved arenas; null when these exact sections are absent",
"available_internal_bytes": 161748,
"required_heap_bytes": 17408,
"ram_admission_margin_bytes": 144340,
"sd_fat_volume_and_files_reserve_bytes": 0,
"application_bytes": 472204,
"application_sha256": "757ccb5adb387dab0fccca1793ed70e0713c8ff13e5801763c8a9250f102d806",
"application_source": "application BIN"
},
{
"requested_target": "RAK_3x72_companion_radio_usb",
"passed": true,
"exit_code": 0,
"packaged_target": "RAK_3x72_companion_radio_usb",
"build_profile": "auto",
"pio_environment": "RAK_3x72_companion_radio_usb",
"elf_sha256": "257b0e46be99095b1e9425bdb581b4639e5ee4f126b524ac997c4ffe123865ac",
"all_memory_bound_file_hashes_match": true,
"memory_manifest_sha256": "19c042cf40b21a068dc83a7e3177c2068167379d2f9f9c1a1a431734491de0a3",
"files": {
"RAK_3x72_companion_radio_usb-v1.18.0.1-halo-keymind-cascade-dev-aed4c22e.bin": "3b45baa64a7a5a6bbcce18dc17db70c46afa4321e7fd4369fa47b45d53fa73d0",
"RAK_3x72_companion_radio_usb-v1.18.0.1-halo-keymind-cascade-dev-aed4c22e.hex": "bb8198b4e06fe0133e70db53eafc33bfe2acfcafabd26b75ddec76c214b0a861",
"RAK_3x72_companion_radio_usb-v1.18.0.1-halo-keymind-cascade-dev-aed4c22e.capabilities.json": "5df1c74616a9fbcf4253dc5294c2367551b1f78ae19e391e7238aaa4e633edcc"
},
"capabilities": [
"profile.auto"
],
"capability_verification_count": 0,
"capability_verification_passed": true,
"ordinary_static_ram_bytes": 39992,
"static_sections": {
".data": 424,
".bss": 39568
},
"static_sections_scope": "ELF .data plus ordinary .bss only; excludes separately named/reserved arenas; null when these exact sections are absent",
"available_internal_bytes": 24520,
"required_heap_bytes": 17408,
"ram_admission_margin_bytes": 7112,
"sd_fat_volume_and_files_reserve_bytes": 0,
"application_bytes": 229372,
"application_sha256": "3b45baa64a7a5a6bbcce18dc17db70c46afa4321e7fd4369fa47b45d53fa73d0",
"application_source": "application BIN",
"application_capacity_bytes": 229376,
"application_margin_bytes": 4
}
],
"linked_checks": {
"crypto": {
"passed": true,
"elf_sha256": "f002455df52a9cdf4278461685eaee3082cc14752f741428f6dfe2dcdc2bb2a7",
"base_table_bytes": 960,
"reader_data_bytes": 38293,
"vectors": [
{
"rfc8032_vector": 1,
"keypair_stack_bytes": 1152,
"sign_stack_bytes": 1928
},
{
"rfc8032_vector": 2,
"keypair_stack_bytes": 1152,
"sign_stack_bytes": 1928
}
],
"zero_initialized_path_cache_bytes": 5780,
"stack_limit_bytes": 2048,
"scope": "Crypto function frames only; excludes caller/ISR/task stacks and physical timing.",
"evidence_json_sha256": "8ba582cd89bd4d182d5f9e03c70aeeddfee337b401987debcf3f481ec7c59d4e"
},
"workspace": {
"passed": true,
"elf_sha256": "f002455df52a9cdf4278461685eaee3082cc14752f741428f6dfe2dcdc2bb2a7",
"queue_lifetimes": 4,
"workspace_address": "0x200212d4",
"protected_sd_auth_range": [
"0x20006008",
"0x20006050"
],
"scope": "Linked ARM empty-queue OTA acquisition/release; no hardware qualification.",
"evidence_json_sha256": "658e56af82decc3648a99ef432f547577faeb7139f2bd34e74d6744fb0d8a21d"
},
"reader": {
"passed": true,
"elf_sha256": "f002455df52a9cdf4278461685eaee3082cc14752f741428f6dfe2dcdc2bb2a7",
"references_fully_reconstructed": 879,
"calls": 1091,
"canonical_bytes_checked": 95689,
"maximum_reply_verse_stack_bytes": 6016,
"caller_reserve_bytes": 1536,
"loop_stack_bytes": 8192,
"total_arm_instructions": 380103543,
"checker_sha256": "02d0eb4a553c9588c698ca5013c269fae16f863d864b1cac521a18fba065f1be",
"canonical_source_sha256": "916bf9d1feae0ad410d69f61e6c5f328ac6acba10651d751b5bb29719732c49e",
"partition_count": 4,
"disjoint_reference_coverage_verified": true,
"all_pages": true,
"evidence_json_sha256": "740aa99a7a514862f6e597efe56ebca47580416dae28db48016ca333d21d2fe8"
}
},
"adjacent_native_checks": {
"Reader_tests": 16,
"Beacon_tests": 19,
"radio_profile_matrix_scenarios": 32,
"Morse_tests": 7,
"persistent_format_tests": 16
},
"canonical_V3_Full_failure": {
"stage": "runtime RAM admission",
"available_internal_bytes": 177408,
"required_heap_bytes": 198432,
"shortfall_bytes": 21024,
"largest_internal_region_bytes": 144640,
"matched_baseline_control": "verified preexisting RAM admission failure",
"baseline_source_commit": "31e693ec209109a930dcf8aeef89dacbe9116a63",
"baseline_available_internal_bytes": 177144,
"baseline_required_heap_bytes": 198432,
"baseline_shortfall_bytes": 21288,
"available_improvement_bytes": 264,
"profile_contact_capacity": 100,
"final_failed_ELF_hash": null,
"failed_ELF_evidence_scope": "final failed ELF was cleaned by later build; current failure is log-bound only",
"direct_terminal_control": "PASS; direct default build, not a canonical Full package",
"baseline_build_log_sha256": "f5f95ec53b9e472cdd5d46f5ec45d61de68e5eace3c2ead53dec7209e5d0f7c8",
"final_build_log_sha256": "732580a8d70c65b73023aec736a95e961da2451fc7ac9a38efeba9a091027dc4"
},
"focused_contact_checks": {
"unittest_methods_passed": 26,
"method_breakdown": {
"cache_and_persistence_harness": 3,
"persistence_contract": 11,
"stream_contract": 7,
"index_and_layout": 2,
"lifetime_matrix": 1,
"uncached_storage_RP2040_STM32": 2
},
"ASan_UBSan_runtime_configurations": 24,
"runtime_configuration_breakdown": {
"cache": 3,
"index": 11,
"lifetime": 8,
"uncached": 2
},
"actual_ContactInfo_compile_only_layouts": 8,
"lifetime_assertions": 284,
"contact_sources_unchanged_since": "b0f14161506e2a5f6acfbb4b0b1723e7bd7689c3",
"evidence_scope": "completed tool transcript; no standalone contact log retained"
},
"limits": [
"Software/build/linked-ARM qualification only; no board flashed",
"RAM admission and static section totals are not running free heap or physical high-water",
"Physical SD/storage, contact/client behavior, PSRAM pressure, power and radio operation untested"
],
"historical_failures": [
"Intermediate b0f141615 small STM32 build failed size admission; retained separately from final-source matrix",
"Legacy Heltec_v3_companion_radio_ble has identical five WiFiSetupPortal/WiFiOtaSeeder unresolved symbols on matched baseline and intermediate revision",
"Initial V4 invocation rejected unsupported --full-exact argument before target compilation"
],
"baseline_RAK4631_Full": {
"packaged_target": "RAK_4631_companion_radio_full",
"build_profile": "full",
"pio_environment": "RAK_4631_companion_radio_full",
"elf_sha256": "4623af75c924a830415c0a5fd186569b4bbff35a9ce1084438eafe145282058e",
"all_memory_bound_file_hashes_match": true,
"memory_manifest_sha256": "fc1dad5cab6a7deae4ea4042b26dc20231d82710e627fa6e33aef7efecf36c41",
"files": {
"RAK_4631_companion_radio_full-v1.18.0.1-halo-keymind-cascade-dev-31e693ec.uf2": "6039f7fe532f121100c1734c9f292ec5f7d7c3ead50b06e7e283fe93569f3fff",
"RAK_4631_companion_radio_full-v1.18.0.1-halo-keymind-cascade-dev-31e693ec.zip": "ef641d49dc91db61f0a49912f191f6d81c2887a69950fa66a612f81b31f0e142",
"RAK_4631_companion_radio_full-v1.18.0.1-halo-keymind-cascade-dev-31e693ec.capabilities.json": "91711e0da1a8f3ba4b99c24749c1ac78f0862534f436233ff32c867ccbeb9cc9",
"RAK_4631_companion_radio_full-v1.18.0.1-halo-keymind-cascade-dev-31e693ec.meshtext-license.txt": "ba558609720fbff1481e236462eea2f9e08a73c1f3c2fd486ea4d9e1d0a6d58f"
},
"capabilities": [
"profile.full",
"companion.meshtext.channel_text",
"ota.update.bluetooth",
"companion.temp_radio",
"companion.ota_cli",
"companion.usb",
"companion.bluetooth",
"companion.usb_logging",
"companion.usb_mota_source",
"companion.mota_sender",
"companion.dedicated_usb_logging",
"companion.ble_mota_source",
"logging.usb.packets",
"logging.usb.control"
],
"capability_verification_count": 13,
"capability_verification_passed": true,
"ordinary_static_ram_bytes": 156284,
"static_sections": {
".data": 1660,
".bss": 154624
},
"static_sections_scope": "ELF .data plus ordinary .bss only; excludes separately named/reserved arenas; null when these exact sections are absent",
"available_internal_bytes": 79092,
"required_heap_bytes": 74576,
"ram_admission_margin_bytes": 4516,
"sd_fat_volume_and_files_reserve_bytes": 2048,
"application_bytes": 712600,
"application_sha256": "520cf40ec5ada891d3fe8081b23546ce777c712383f0479292bb8fac0017d4d7",
"application_source": "DFU application BIN extracted from ZIP",
"uf2_matches_DFU_application": true,
"uf2_blocks": 2784,
"initialized_ELF_flash_load_bytes_match": true,
"initialized_ELF_flash_load_bytes_compared": 712520,
"application_capacity_bytes": 712704,
"application_margin_bytes": 104
},
"direct_terminal_build": {
"target": "Heltec_v3_terminal_chat",
"source_commit": "aed4c22e51201f0ee3586e26e1007194a74b015d",
"passed": true,
"scope": "direct PlatformIO default environment; not a firmware-picker Full or version/preset-qualified release package",
"contact_capacity": 350,
"elf_sha256": "1a193ae1bee829d0bf7d140310b8487d2a4671f0c85715d16cfb764850e06cb6",
"memory_manifest_sha256": "a74079788410d8cdf11e686b62f8aee80537a9743cd0590bf4caf069ab7d038d",
"available_internal_bytes": 263800,
"required_heap_bytes": 77856,
"ram_admission_margin_bytes": 185944,
"build_log_sha256": "31d410458e6e6cd87bce96019e1ce655ab698eeb5e5d720987461c7be07f3fdf"
}
}
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,284 @@
{
"schema_version": 1,
"date_utc": "2026-10-19",
"source_commit": "eb9259f2a97113b1d482ca9610661fb24c1c8e98",
"baseline_source_commit": "31e693ec209109a930dcf8aeef89dacbe9116a63",
"all_final_builds_passed": true,
"single_process_platformio": true,
"hardware_validation": {
"performed": false,
"flashed": false,
"status": "Awaiting physical V3 USB attachment to the VM; no V3 enumerated during inventory."
},
"v3_capacity": {
"contacts": 100,
"channels": 40,
"offline_frames": 256,
"active_ble_sessions": 1,
"saved_phone_bonds": 15,
"cccd_records": 30,
"mqtt_runtime_slots": 1
},
"v3_proof_workspace": {
"maximum_source_blocks": 4096,
"actual_xtensa_bytes": 1004,
"reserved_bytes": 1536,
"output_block_bytes": 2048,
"allocation_metadata_bytes": 32,
"legacy_source_leaf_bytes": 16384,
"legacy_larger_custom_limits_retained": true
},
"v3_baseline_memory": {
"available_internal_bytes": 177144,
"required_heap_bytes": 198432,
"margin_bytes": -21288
},
"software_checks": {
"bounded_source_proofs": {
"python_tests": 3,
"exact_wire_proofs": 22240,
"sanitizers": [
"ASan",
"UBSan"
]
},
"firmware_ram_policy": {
"python_tests": 47
},
"nimble_adapter_and_variant": {
"python_tests": 10,
"adapter_sanitizers": [
"ASan",
"UBSan"
]
},
"legacy_ota_cold_buffers": {
"configurations": 4
},
"serial_deadlines": {
"python_tests": 2
},
"source_only_folder_resume": {
"python_tests": 2
}
},
"packages": [
{
"target": "Heltec_v3_companion_radio_full",
"passed": true,
"exit_code": 0,
"elapsed_seconds": 54.22,
"elf_sha256": "3a56805b2d0216026c3710e149db43dedb677684e47ad08ebfe748094c1de55b",
"available_internal_bytes": 189616,
"required_heap_bytes": 183584,
"margin_bytes": 6032,
"memory_manifest_sha256": "dc03ea7ba74caadaf5e5fe43f64affacf14481cdadbfd37ca241eb7bb47c1548",
"memory_bound_file_hashes_verified": true,
"files": {
"Heltec_v3_companion_radio_full-v1.18.0.1-halo-keymind-cascade-dev-eb9259f2.bin": "c4f276095626560abc4c6875216c147d2fae292bf5c514e5029ef7d03454d3ce",
"Heltec_v3_companion_radio_full-v1.18.0.1-halo-keymind-cascade-dev-eb9259f2-merged.bin": "8ab56857805925666cf9c8638aa23851bea0d36f01a9f6ca270ad5776c2a0245",
"Heltec_v3_companion_radio_full-v1.18.0.1-halo-keymind-cascade-dev-eb9259f2.capabilities.json": "d03182ad9405a2cf692687de11cc686fdf3600725d2761db3198cd7236bdba4a",
"Heltec_v3_companion_radio_full-v1.18.0.1-halo-keymind-cascade-dev-eb9259f2.meshtext-license.txt": "ba558609720fbff1481e236462eea2f9e08a73c1f3c2fd486ea4d9e1d0a6d58f"
},
"capabilities": [
"profile.full",
"companion.meshtext.channel_text",
"companion.temp_radio",
"companion.ota_cli",
"companion.usb",
"companion.bluetooth",
"companion.usb_logging",
"companion.usb_mota_source",
"companion.mota_sender",
"companion.network_terminal",
"companion.wifi_ota_seeder",
"web.webconfig",
"web.unconfigured_setup_cutoff",
"companion.direct_mqtt",
"logging.usb.packets",
"logging.usb.control",
"companion.app_wifi.get_enabled",
"companion.app_wifi.set_enabled",
"companion.app_wifi.get_ssid",
"companion.app_wifi.set_ssid",
"companion.app_wifi.get_password",
"companion.app_wifi.set_password",
"companion.app_wifi.get_status",
"companion.app_wifi.get_ip",
"ota.update.wifi"
],
"feature_checks": 24,
"capabilities_verified": true,
"existing_recipe_reductions": [
"companion.capacity limited to 100 contacts for runtime RAM; 256 queued frames and all Full transports retained"
],
"components": {
"core_tasks_usb_filesystems": 24576,
"wireless_stacks": 81920,
"mqtt_startup_allowance": 24576,
"ota_source_scratch": 8192,
"browser_terminal_session": 2048,
"browser_terminal_scrollback": 4096,
"radio_packet_pool": 5120,
"ota_generic_source_buffers": 3616,
"display_pixels_and_driver": 2048,
"screen_objects_and_history": 8192,
"expanded_message_previews": 2816,
"allocation_and_transient_margin": 16384
},
"required_contiguous_bytes": 11008,
"largest_internal_region_bytes": 156848,
"application_bytes": 2114744,
"application_sha256": "c4f276095626560abc4c6875216c147d2fae292bf5c514e5029ef7d03454d3ce",
"application_capacity_bytes": 3342336,
"application_margin_bytes": 1227592
},
{
"target": "RAK_4631_companion_radio_full",
"passed": true,
"exit_code": 0,
"elapsed_seconds": 34.08,
"elf_sha256": "7f123f4c4a43200fd85fb889bb388b4f22318fd395eeafe64c014af14be3804e",
"available_internal_bytes": 81292,
"required_heap_bytes": 74576,
"margin_bytes": 6716,
"memory_manifest_sha256": "c58fdd1cf010ca8d7c5b0c33549f941482cb6ca11deb361e04c2d4770eaa4f22",
"memory_bound_file_hashes_verified": true,
"files": {
"RAK_4631_companion_radio_full-v1.18.0.1-halo-keymind-cascade-dev-eb9259f2.uf2": "b532062fec9d5fe53d490010fea26dfbad334e0ffb66a4f483def390763a31ef",
"RAK_4631_companion_radio_full-v1.18.0.1-halo-keymind-cascade-dev-eb9259f2.zip": "dd58370fe7360df078b645813d633a31567780dfab02dbde5e0ec28e120b0018",
"RAK_4631_companion_radio_full-v1.18.0.1-halo-keymind-cascade-dev-eb9259f2.capabilities.json": "a54fc3dc71fd31eb5ddfb8c4b7368fcec6446fe41729f05ef3408ca6be270e87",
"RAK_4631_companion_radio_full-v1.18.0.1-halo-keymind-cascade-dev-eb9259f2.meshtext-license.txt": "ba558609720fbff1481e236462eea2f9e08a73c1f3c2fd486ea4d9e1d0a6d58f"
},
"capabilities": [
"profile.full",
"companion.meshtext.channel_text",
"ota.update.bluetooth",
"companion.temp_radio",
"companion.ota_cli",
"companion.usb",
"companion.bluetooth",
"companion.usb_logging",
"companion.usb_mota_source",
"companion.mota_sender",
"companion.dedicated_usb_logging",
"companion.ble_mota_source",
"logging.usb.packets",
"logging.usb.control"
],
"feature_checks": 13,
"capabilities_verified": true,
"existing_recipe_reductions": [
"nRF52 Full: 256 offline frames normally; 128 while mOTA borrows queue storage"
],
"components": {
"loop_and_callback_stacks": 11264,
"core_usb_filesystems_sensors": 12288,
"sd_fat_volume_and_files": 2048,
"ota_target_name_lookup": 4112,
"bluetooth_worker_stacks": 5920,
"radio_packet_pool": 5120,
"ota_generic_source_buffers": 10272,
"ethernet_companion_worker": 4352,
"display_pixels_and_driver": 4096,
"screen_objects_and_history": 8192,
"expanded_message_previews": 2816,
"allocation_and_transient_margin": 4096
},
"required_contiguous_bytes": 11008,
"largest_internal_region_bytes": 81292,
"application_bytes": 712112,
"application_sha256": "2707606a9f4af071c9c4720465a7e7f17132292abc4af9eb468578d456480779",
"application_capacity_bytes": 712704,
"application_margin_bytes": 592
},
{
"target": "RAK_3x72_companion_radio_usb",
"passed": true,
"exit_code": 0,
"elapsed_seconds": 22.35,
"elf_sha256": "1e686c6ad520e84f2ede3f50037c5d1c4c8e4266c0e9fac605d53d67ee4bd593",
"available_internal_bytes": 24520,
"required_heap_bytes": 17408,
"margin_bytes": 7112,
"memory_manifest_sha256": "687267b1bd35019f9683b46fe52ea4c23001dc4ef1f2aa14f51a2e917a9885fc",
"memory_bound_file_hashes_verified": true,
"files": {
"RAK_3x72_companion_radio_usb-v1.18.0.1-halo-keymind-cascade-dev-eb9259f2.bin": "b2770a66e75534fb48d987d2cd1bc71ea178bd7e1e720ebf0d45788efeaa7621",
"RAK_3x72_companion_radio_usb-v1.18.0.1-halo-keymind-cascade-dev-eb9259f2.hex": "a583bc987801281c6c6eb5a4cb9a069e72fd4a5e7b5c3863d8df5f2b31abea58",
"RAK_3x72_companion_radio_usb-v1.18.0.1-halo-keymind-cascade-dev-eb9259f2.capabilities.json": "7977ab1c0bb8f7cb678ae675816dc3a12639d1b2e1d49d6f98bdac1b349bc86f"
},
"capabilities": [
"profile.auto"
],
"feature_checks": 0,
"capabilities_verified": true,
"existing_recipe_reductions": [],
"components": {
"core_filesystems_sensors": 8192,
"radio_packet_pool": 5120,
"allocation_and_transient_margin": 4096
},
"required_contiguous_bytes": 5120,
"largest_internal_region_bytes": 24520,
"application_bytes": 229372,
"application_sha256": "b2770a66e75534fb48d987d2cd1bc71ea178bd7e1e720ebf0d45788efeaa7621",
"application_capacity_bytes": 229376,
"application_margin_bytes": 4
}
],
"rak_linked_arm_checks": {
"crypto": {
"passed": true,
"elf_sha256": "7f123f4c4a43200fd85fb889bb388b4f22318fd395eeafe64c014af14be3804e",
"base_table_bytes": 960,
"reader_data_bytes": 38293,
"vectors": [
{
"rfc8032_vector": 1,
"keypair_stack_bytes": 1152,
"sign_stack_bytes": 1928
},
{
"rfc8032_vector": 2,
"keypair_stack_bytes": 1152,
"sign_stack_bytes": 1928
}
],
"zero_initialized_path_cache_bytes": 5780,
"stack_limit_bytes": 2048,
"scope": "Crypto function frames only; excludes caller/ISR/task stacks and physical timing."
},
"workspace": {
"passed": true,
"elf_sha256": "7f123f4c4a43200fd85fb889bb388b4f22318fd395eeafe64c014af14be3804e",
"queue_lifetimes": 4,
"workspace_address": "0x200212d4",
"protected_sd_auth_range": [
"0x20006008",
"0x20006050"
],
"scope": "Linked ARM empty-queue OTA acquisition/release; no hardware qualification."
},
"reader": {
"passed": true,
"elf_sha256": "7f123f4c4a43200fd85fb889bb388b4f22318fd395eeafe64c014af14be3804e",
"all_pages": true,
"references_fully_reconstructed": 879,
"disjoint_reference_coverage_verified": true,
"calls": 1091,
"canonical_bytes_checked": 95689,
"maximum_reply_verse_stack_bytes": 6016,
"caller_reserve_bytes": 1536,
"loop_stack_bytes": 8192,
"checker_sha256": "02d0eb4a553c9588c698ca5013c269fae16f863d864b1cac521a18fba065f1be",
"canonical_source_sha256": "916bf9d1feae0ad410d69f61e6c5f328ac6acba10651d751b5bb29719732c49e"
}
},
"scope": "Linked capacity and host/linked-code verification; physical V3 boot, transport/load and power-loss behavior are not qualified.",
"linked_ble_store_bytes": {
"ble_store_config_our_secs": 1320,
"ble_store_config_peer_secs": 1320,
"ble_store_config_cccds": 480
}
}
File diff suppressed because it is too large. Load diff
+2
View File
@@ -2467,6 +2467,8 @@
</ul>
<h2 id="build-storage-memory-and-checklists">Build, storage, memory, and checklists</h2>
<ul>
<li><a href="contact_memory_2026-10-19/">Shared contact RAM savings and RAK4631 Full qualification, 2026-10-19</a></li>
<li><a href="heltec_v3_full_memory_2026-10-19/">Heltec V3 Full memory qualification, 2026-10-19</a></li>
<li><a href="room_mailboxes/">Personal room mailbox checks</a></li>
<li><a href="bootloader_version_stock_audit/">Stock nRF52 bootloader version audit</a></li>
<li><a href="cli_settings_audit/">CLI setting dispatch audit</a></li>
@@ -2334,6 +2334,11 @@
<!-- meshcore-hosted-doc-link:end -->
<h1 id="esp32-s3-nimble-full-companion-trial">ESP32-S3 NimBLE Full Companion trial</h1>
<p>Canonical Heltec V3 Full now uses the same pinned NimBLE backend, preserving
its existing 15 saved phones and both notification subscriptions per phone.
Its <a href="../heltec_v3_full_memory_2026-10-19/">Full memory qualification</a> is separate
from the optional trials below. Switching from Bluedroid requires forgetting
the old phone pairing and pairing again; stored bonds are not migrated.</p>
<p>These optional builds use NimBLE-Arduino 2.5.1 with the existing ESP32 Arduino
2.0.17 toolchain. They are hardware qualification builds, outside the normal
release matrix and firmware picker.</p>