Engineering validation

Completed on the original device

Native code checks

tools/test_core.py passes 28 groups covering normal no-SIM operation without power cycling, call state acknowledgments versus actual active calls, incoming call events, UCS-2 SMS PDU structure, bounded UTF-8 parsing, timeout/ambiguous message handling without auto-retry, SIM removal during a send, registration/CSQ status, wraparound timing, malformed UART lines, UART write failure, CSV quoting/formula neutralization, file path validation, PCAP record headers, bounded recon-table eviction, selected and detail-page target retention, vendor database bounds and private-address handling, disconnect/BLE burst monitors, lab/attack frame construction, and bounded IR import/protocol encoding.

The same run feeds 40,000 synthetic malformed/random radio buffers through the Wi-Fi/BLE parsers. These are robustness tests, not a field detection accuracy measurement.

Startup diagnosis and display repair

Two early builds wrote successfully but left the screen blank. Restoring the original application recovered normal factory operation. The MP24 recipe now pins pioarduino 55.03.312-1 / Arduino 3.3.12 in a project-local toolchain.

Minimal USB-only and USB-plus-2-MB-PSRAM probes both booted under the existing bootloader. Added startup tracing localized the full application's stall to TFT_eSPI::init(), rather than establishing a bootloader mismatch. The application now uses a small ST7735 adapter through Espressif's queued SPI API; TFT_eSPI supplies only the framebuffer drawing operations. The adapter uses a 2,560-byte internal DMA staging buffer, bounded completion waits and a persistent transaction descriptor. A failed transfer stops further panel transfers while USB diagnostics remain available.

The replacement app subsequently reached HP_READY, mounted SD, communicated with the EG91 and identified SIM absence. Its framebuffer was captured and visually inspected. USB observed hundreds of completed display frames with zero SPI errors; that does not itself verify physical panel color, orientation or keypad usability. The dedicated SD write/read/compare test passed and removed its own temporary file. Existing card data was not formatted.

Recon testing also found a Bluetooth-controller initialization panic. Arduino 3.3.12's startup releases BLE memory unless a linked library registers that it needs it; pinned NimBLE-Arduino 2.3.6 does not include the new registration header. The radio adapter now includes the framework's esp32-hal-alloc-ble-mem.h, and initializes the default network event loop before Wi-Fi. Combined radio validation is recorded separately below.

Combined radio validation

After the BLE memory registration fix, an on-device combined scan observed 456 Wi-Fi frames and 2,090 BLE advertisements. Queue drops remained zero; four successive ten-second samples each reported 138,192 bytes free internal heap and 1,956,348 bytes free PSRAM. Modem status stayed online/No-SIM, I²C errors stayed zero, and the display completed 1,080 cumulative frames with zero transfer errors. These observations establish a short engineering smoke test, not long-term field stability or detection accuracy. The final preview is rechecked after cleanup changes.

The earlier 0.1 preview SHA-256 was 95d157ff64e52523302600bc1ba6f0b6657bc242bb068950e118e6fe94fac0da (1,238,976 application bytes). At 91.6 seconds uptime, its smoke test reported 440 Wi-Fi frames, 2,130 BLE advertisements, 42 live observations, zero queue drops, zero I²C errors, 906 completed display frames with zero transfer errors, 33,474 bytes in the SD CSV session, and a passing full heap integrity check. Free internal heap held at 138,120 bytes across the four radio samples; free PSRAM held at 1,956,348 bytes. The loop-task stack high-water mark was 5,048 bytes free. The modem remained online with SIM absent. The user subsequently confirmed the visible panel and joystick/A navigation.

0.2 toolkit validation — 2026-10-14

The final 0.2 development preview was rebuilt from the separate HackerPhone folder and flashed application-only with a matching write hash: 1,304,784 bytes, SHA-256 cf099a1755aee5e8223fc2c5b10ef29898c7eb0e57a13c5a368632e7fb1d8dc9. The final idle/UI check reported a passing heap-integrity check, 3,260 bytes of loop-task stack headroom, 296 display frames with zero transfer errors, working SD availability, and modem online/No-SIM. An empty GATT target command was rejected. This hash identifies the local tested artifact; rebuilding in another environment can change it.

0.3 attack and infrared preview — 2026-10-14

Final locally flashed 0.3 application: 1,333,248 bytes, SHA-256 7789905e16505695a3cad50d9e6709a79854f34813075ff416cd35a8c963bdfb. It was written only at 0x10000, with recovery/identity checks and write-hash verification. A final startup fix explicitly holds the inverted IR emitter off before a capture. Its repeated IR SD/start-stop/timeout check passed, with zero I²C errors, 270 error-free display transfers, working backlight initialization and heap integrity passing. A private recovery copy of this working application is retained. The owner subsequently confirmed the Infrared menu and remote capture worked. Optical transmission, carrier measurement and appliance replay remain unverified.

0.4 recon and network preview — 2026-10-14

Locally flashed application: 1,468,000 bytes, SHA-256 b11612833ce314476328d7495a7650a9456beaf9889131c344a909bd4e47589a. The flash operation verified device/recovery identity and wrote only the application at 0x10000; its write hash matched. A private recovery copy of this artifact is retained. Captures, target identifiers, test logs and recovery binaries remain excluded from Git.

Acceptance gates still open

  1. The user confirmed the replacement panel is visible and joystick/A navigation works. The owner also confirmed the three expanded 0.4 menu groups; other individual workflows still need acceptance.
  2. Sustained recording, removal/full-card behavior and power-loss recovery beyond the passing SD smoke test.
  3. Long-duration No-SIM and registered-cellular operation while passive Wi-Fi/BLE scans run.
  4. Field checks of device-family evidence and RSSI hunt behavior, plus sustained table/queue pressure tests.
  5. Speaker/mic/PCM audio route and cellular call states work with a compatible SIM and carrier.
  6. SMS inbox/outbox, actual sending/receiving, contacts and failure/retry UI are tested.
  7. Each Marauder feature in the inventory is ported or has a specific hardware limitation recorded.
  8. Daily power use and complete recovery/distribution checks remain required for a daily-use release. The owner-requested web installer now distributes an explicitly limited engineering preview; see the 2026-10-18 distribution record and WEB-FLASHER.md for its checks and untested paths.
  9. Optical IR replay, carrier/polarity verification, range and imported-remote appliance behavior; reception was owner-confirmed.

0.5 audio, controls and SD workflows — 2026-10-14

Physical red-button battery shutdown, long-term battery/thermal behavior, headphone music quality across real albums, and every individual device-family or attack peer effect remain separate acceptance checks. No SIM call, cellular voice bridge, inbound SMS delivery, or audible real-tracker result is claimed.

Final device checks additionally verified both AP and station MAC randomization, driver readback, and restoration of both factory addresses. The initial NULL-mode attempt was rejected with ESP_ERR_WIFI_MODE; selecting the interface mode while the driver is stopped resolved it, followed by a return to idle and driver restart. TCP open/closed tests passed through the new batch-connect path as well as the single-connect and ICMP loopback paths. An active music file and its parent directory could not be copied/renamed by the file manager. Four ten-second combined radio samples held internal heap at 54,708 bytes and PSRAM at 1,820,216 bytes, with 10,684 bytes of loop-stack headroom, zero queue/I2C/display errors and passing heap integrity. By the last sample, 378 Wi-Fi frames and 1,895 BLE advertisements had been observed. This remains a short engineering soak, not a field release test.

The owner then confirmed MP3 playback and the physical red-button short-tap lock/unlock and held shutdown/restart sequence on the connected sample. A battery-only electrical power-cut measurement remains unperformed. The final 0.5 engineering image is 1,757,792 bytes, SHA-256 9072e588c18039d143432ff62339b1839ddcbf0b1be06d24551ccc74e6d1b4f6. It was flashed only at 0x10000, verified by the flashing tool, and retained in the private recovery directory. Final UI captures were inspected for layout; the RTTTL, LED and mission screenshots are included in the repository.

The final USB check found both the application line buffer and the framework RX queue still limited long console commands. They now hold 1,152 and 2,048 bytes, respectively. A 100-note RTTTL command exceeding the former 256-byte limit saved and read back correctly; the original four tones were restored and compared. An oversized 1,200-character line was rejected, and the next command succeeded. A copy command with two long SD paths also completed and exported byte-exactly. Heap integrity and display diagnostics passed afterward. No default melody or volume was changed by this fix.

0.6 cellular, hotspot and SD preview — 2026-10-16

SMS delivery/inbox, long-duration calling, a GNSS fix, sustained hotspot use, Maker Band hardware pairing and the public dual-device web flasher remain open. Private identifiers, credentials, recovery images and captures are excluded from Git. Current modem settings are recorded in the private diagnostic logs.

After the successful two-way call, the final image again returned HTTP 200 from the PPP-bound internet test and started the hotspot with NAT enabled. Internal heap was 92,276 bytes, heap integrity passed, and display/I2C error counts were zero. The test ended with data and hotspot stopped. Modem readback retained automatic network selection, enabled IMS and the working 16 kHz PCM setting.

The tested 0.6 engineering application is 1,854,128 bytes, SHA-256 f90fc6939a417b21195b87b80c504620c6303a47c34496f30d84364285bf2942. It was written only at 0x10000 after verifying the connected chip and private full-flash recovery backup; the flashing tool verified the write. A copy of this application is retained privately alongside the original recovery files.

Battery indicator and theme logos — 2026-10-16

GitHub Pages was checked during this update: the repository reports has_pages: false and its standard Pages URL returns HTTP 404. A HackerPhone web flasher had not yet been published at that point. See the 2026-10-18 update below.

All six home-screen framebuffers were inspected on the final image. LTE remained registered, heap integrity passed, and I2C/display error counts were zero. The application is 1,885,856 bytes, SHA-256 ceb7ef73de25b7220ed98c986795fed44169084a087093f5bd18479d67e37991. The matching-chip/recovery check and application-only write at 0x10000 passed; the flashing tool verified the write. Private recovery files and unplug history remain excluded from Git. VTS Red was restored after the six-theme visual check.

Web distribution — 2026-10-18

The existing hardware-tested 0.6 battery/themes application is packaged in a static browser installer. Its 23 automated safety tests pass, including blocked wrong-chip/layout/security states, failed or unsaved backups, corrupt images, device changes, write/read-back errors and concurrent install requests. Chrome desktop and narrow-layout checks pass without JavaScript errors; cancellation and unsupported-browser states leave installation disabled.

Only web/ is deployed through Cloudflare Pages. The Shopify page and navigation tab link to the full installer for USB access. The published application is the same 1,885,856-byte image and SHA-256 recorded above. The browser serial path itself has not yet been tested against the physical sample. Daily power validation, complete recovery drills, SMS inbox and live band pairing remain unfinished.