Version 2.0.1 validation

Validation date: 2026-10-20. Dependencies are pinned in platformio.ini. Earlier runtime results are preserved in 2.0.0 validation.

Builds and packages

Environment Result Application bytes
xiao_s3 PASS 1,198,352
xiao_c3 PASS 1,333,440
xiao_c6 PASS 1,493,648
xiao_c5 PASS 1,546,480
esp32 PASS 1,284,960
esp32_s2 PASS 966,784

All six applications fit the factory partition. Packaged bootloader, partition and application bytes, chip-family manifests and SHA-256 checksums pass tests/release_test.py. C5 uses the correct 0x2000 bootloader location.

Connected hardware and web UI

Both connected XIAO ESP32-S3 boards were programmed with verified writes. Their existing NVS settings migrated to only Axon/deauth alerts, threshold 60/s and mode 0 with a 120-second cycle. On one board a custom mode and Ring opt-in survived a deliberate reset, proving that the migration does not repeat. Quiet defaults were restored after testing.

Both boards passed tests/device_http.py: all eight nightlight modes, all six alert patterns and expiry, invalid-write rejection, 120 status requests, contact requests, restored settings and delayed persistence. Both ended with zero dropped observations during these runs and approximately 127 KB free heap.

The real S3 HTTP UI passed mobile-width loading, saving and all four tabs in Edge/Chromium and WebKit without page errors. Mock UI tests also pass desktop and mobile layouts, settings import/export, system controls and buzzer controls in both engines with structuredClone and AbortSignal.timeout deliberately unavailable. A startup race was fixed so Online appears only after the initial settings have loaded.

Android and Apple probe hostnames resolve through the device DNS to 192.168.4.1; their HTTP probe paths redirect to the local UI. Unknown API paths remain 404. These checks are reproducible with tests/captive_portal_test.py. The owner confirmed that the updated UI now loads on their phone. The specific phone OS was not identified, so this does not claim separate physical tests on both Android and iOS.

Detection regression tests

Native tests pass isolated departures, retry copies, short bursts, moderate traffic, many one-off clients, repeated departures spread over multiple clients, BSSID isolation, protected/truncated frames and clock wrap. Sustained broadcast, single-target and constant-sequence non-retry floods trigger after three full windows. Optional BLE spam tests cover stable crowds, short bursts, protocol separation and sustained fresh-address churn. Selected device signatures and 100,000 deterministic fuzz inputs also pass.

Runtime stability

Both final-release S3 images completed a ten-minute serial capture with 20 health records each, no unexpected uptime reset, panic or brownout, and zero queue drops. Both remained on the quiet defaults with no ambient alert events in the HTTP checks. The earlier 2.0.0 twenty-minute run remains archived separately.

Unit First / last uptime First / last free heap Final queue drops
S3 A 60 / 630 s 130,340 / 129,356 bytes 0
S3 B 90 / 660 s 131,284 / 129,464 bytes 0

Raw radio observations and backups remain private. Sanitized results are in validation-results-2.0.1.json. This finite test does not guarantee indefinite uptime or validate every power supply and RF environment.

Physical limits

Only the two S3 boards were physically available. C3, C6, C5, ESP32 DevKit and S2 are build-verified, not physically validated. S2 has no BLE; C5 monitoring is 2.4 GHz only. No buzzer or known Axon camera was available for controlled testing. No over-the-air attack traffic was generated. Parser fixtures do not establish real-world detection sensitivity or guarantee zero false alarms.