Version 2.0.2 validation
Validation date: 2026-10-20. Dependencies remain pinned in platformio.ini.
Earlier results: 2.0.1, 2.0.0.
Builds and packaged firmware
| Environment |
Result |
Application bytes |
xiao_s3 |
PASS |
1,205,744 |
xiao_c3 |
PASS |
1,343,408 |
xiao_c6 |
PASS |
1,503,616 |
xiao_c5 |
PASS |
1,556,464 |
esp32 |
PASS |
1,292,512 |
esp32_s2 |
PASS |
975,552 |
All six images fit their factory partitions. tests/release_test.py verifies
chip families, bootloader offsets, partition/application bytes and SHA-256 hashes.
C3, C6, C5, wired ESP32 and S2 remain build-verified rather than physically tested.
Rendering and browser checks
Native tests exercise all 18 modes, six palettes, speed extremes, reverse,
clock wrap and fractional-boundary color lookup. Every animated mode changes
across sampled times; the two static modes remain static. Rendering uses bounded
storage with no allocation or blocking delays.
Chromium and WebKit tests pass on desktop and phone widths: animated preview,
preset loading, new settings submission, temporarily empty numeric input,
legacy settings import, export, system settings, buzzer controls, alert testing
and escaping of radio names. Newer structuredClone and AbortSignal.timeout
APIs are deliberately unavailable in these tests.
The real S3 UI also passes in Chromium and WebKit at phone width, including
18 mode choices, moving Aurora preview, saving, and the enabled BLE spam rule.
Wildcard DNS and Android/Apple HTTP discovery responses still pass.
Connected hardware
Both connected XIAO ESP32-S3 boards received verified writes. Their old lighting
preferences survived the upgrade; conservative Bluetooth spam alerts were enabled
alongside deauth alerts. On the first board, Aurora, speed, palette and a temporary
alert opt-out survived a deliberate reset, confirming that the upgrade policy
runs only once. Bluetooth spam alerts were then enabled again.
tests/device_http.py checks all 18 modes with speed/palette/reverse variations,
six alert patterns, deauth and Bluetooth-spam alert output routing, expiry,
invalid-write rejection, 120 status requests, settings restoration and persistence.
Manual alert tests verify output routing, not RF detection sensitivity.
The first board is left on Aurora at its existing brightness. The second keeps
its selected Rainbow wave, now with independent motion speed.
Attack-pattern tests and limits
Deauth fixtures still reject ordinary departures, retries, short bursts, many
one-off clients and traffic split across APs; sustained broadcast and repeated
single-target floods confirm after three full seconds. BLE tests recognize the
real Apple/Fast Pair/Swift Pair structures, reject stable crowds and brief bursts,
and confirm sustained churn under the configured 35/120 ms receive duty.
The former four-second scan followed by a two-second pause could interrupt the
three complete BLE confirmation windows. The scanner now runs continuously,
passively, with its receive duty and bounded queue unchanged.
No over-the-air attack was generated, and no known Axon camera or buzzer was
available for controlled testing. These are conservative pattern detectors,
not proof of malicious intent or a guarantee that every attack will be heard.
S2 has no BLE and C5 monitoring remains 2.4 GHz only.
Runtime capture
Both boards completed a five-minute serial capture with ten health records each,
no unexpected reset, panic or brownout. Heap stayed bounded while continuous
passive BLE reception and the animated lights ran.
| Unit |
First / last uptime |
First / last free heap |
First / last queue drops |
| S3 A |
30 / 300 s |
129,492 / 130,348 bytes |
0 / 0 |
| S3 B |
120 / 390 s |
131,284 / 130,000 bytes |
81 / 81 |
The second board had already recorded 81 drops by the first capture sample;
its counter did not increase during this capture, including the HTTP tests.
Queue limits preserve responsiveness but do not provide lossless reception.
The exact cause of those earlier drops was not isolated. Sanitized measurements
are in validation-results-2.0.2.json; raw radio data stays private.
A finite capture does not guarantee indefinite uptime or field detection accuracy.