Current Sprint
SPRINT-001 — Foundation, safety and de-risking
Goal: Make the repository trustworthy as the source of truth, remove the credential leak risk, and run the three blocking hardware experiments that determine whether the product's headline features are feasible at all.
Window: 2026-09-29 → 2026-10-10 · Status: IN_PROGRESS
Goal: Make the repository trustworthy as the source of truth, remove the credential leak risk, and run the three blocking hardware experiments that determine whether the product's headline features are feasible at all.
Window: 2026-09-29 → 2026-10-10 · Status: IN_PROGRESS
Sprint Exit Criteria
| # | Criterion |
|---|---|
| 1 | Repository initialised and committed with a clean history and no secrets [DONE: TASK-001, TASK-003; secrets scan over full history is clean] |
| 2 | Broker credential removed from tracked source and rotation flagged to the user [PARTIAL: code done and verified; rotation is a user action, TASK-004 held at VERIFICATION] |
| 3 | ADR-005 framework decision Accepted or Rejected with a written rationale [OPEN - one of its two preconditions is now met, RISK-002 retired] |
| 4 | RISK-002 PPP on the Airtel SIM produces an IP on the ESP32 [DONE: TEST-020 PASS, phase RUNNING, local=100.76.140.112] |
| 5 | RISK-003 audio hardware population confirmed [BLOCKED on physical board inspection by the user, TASK-021] |
| 6 | RISK-001 GPS cold start benchmarked [OPEN, TASK-022] |
Progress
23
Requirements
2
Verified
9
Partially verified
12
Not started
48
Tasks
8
Tasks done
10/30
Tests passing
10
Open defects
3
Critical risks
Firmware Installer
NomadLink One
Flash the ESP32-S3 router firmware directly from the browser. No command line or Python installation required.
Base plus an A7670E 4G uplink over UART (components/modem_4g) with a /modem web page to choose WiFi vs 4G. The 4G stack is started from its own task 2 s into boot, AFTER the SoftAP and web server are up, so a modem problem can never stop the AP coming up. RGB LED signalling is compiled in but DISABLED by default (the 0.2.0-4g.1 loop was traced to code running before AP start; the LED RMT allocation is the prime suspect). App console is UART0 so panics are visible on the CH343.
Source: manifest_nomadlink_esp32s3.json · Version 0.6.2-position3 · Upstream base 2.4.17
Recommended: Chrome, Edge or Opera. Close all other serial monitors first. Browser flashing writes bootloader, partition table, otadata and app.
Source: manifest_nomadlink_esp32s3.json · Version 0.6.2-position3 · Upstream base 2.4.17
Recommended: Chrome, Edge or Opera. Close all other serial monitors first. Browser flashing writes bootloader, partition table, otadata and app.
Honest Status
Hardware capabilities are substantially proven and the product has now started to build on them. The decisive gap that was open at the last update is closed: PPP over UART now negotiates end to end on the Airtel SIM, giving the ESP32 a real IP interface (100.76.140.112, gw 10.64.64.64). That was the single precondition gating the NAT router. What is still unproven is product behaviour, not hardware: end-to-end MQTT publish, any forwarding/NAT, and any web portal.
Verified and usable
| Capability |
|---|
| GNSS fix: 18.480776, 73.897998 in 69 s cold start (PWRKEY power-on sequence is mandatory; see L-1) |
| Cellular LBS fallback: +CLBS: 0,18.481703,73.897415,550, corroborated against the GNSS fix |
| 4G data bearer: +CEREG: 0,1, +CGPADDR: 1,100.90.93.199, +CSQ: 26,99 with antenna |
| PPP over UART: lwIP reaches phase RUNNING, local=100.76.140.112 gateway=10.64.64.64 mtu=1500, held stable, reproduced on a cold boot. Three fixes were needed (BUG-006): post-CONNECT settle delay, tcpip_init(), and the core lock. |
| Camera OV2640 live capture, SD card round trip (Arduino), outbound SMS, outgoing call control |
Not yet proven
| Item |
|---|
| End-to-end MQTT publish from the device to the broker (TASK-405, TEST-403 FAIL) |
| IP forwarding / NAT between SoftAP clients and the LTE link, and the 3 s dual-WAN failover target (REQ-004). The PPP interface it needs now exists; the routing above it does not. |
| Any web portal functionality |
| Audio hardware presence (RISK-003) - needs physical board inspection, still blocking for voice/ESP-SR |
| TLS on the cellular path (RISK-005) |
Traceability: Requirement → Task → Test → Verification
| Requirement | Priority | Status | Tasks | Tests | Evidence |
|---|---|---|---|---|---|
| REQ-001 Wi-Fi SoftAP with internal DHCP | P0 | PARTIALLY_VERIFIED | TASK-101, TASK-102, TASK-103 | TEST-101 | SoftAP is verified up and stable on the bench with the SSID derived from the efuse MAC, and the admin page is implemented. NOT verified: no real clien |
| REQ-002 Wi-Fi STA scan, credential entry and auto-connect | P0 | NOT_STARTED | TASK-102, TASK-105 | TEST-102 | Not yet attempted. |
| REQ-003 Cellular connection management over A7670E | P0 | PARTIALLY_VERIFIED | TASK-106, TASK-107 | TEST-103 | VERIFIED. AT+CSQ, AT+CEREG?, AT+COPS? all respond. Registered on Airtel MCC 40490 / MNC 90, +CEREG: 0,1, CSQ 26,99 with patch antenna attached. Data b |
| REQ-004 Dual-WAN automatic failover with NAT routing | P0 | PARTIALLY_VERIFIED | TASK-020, TASK-108, TASK-109, TASK-110 | TEST-104, TEST-105 | Precondition now proven, feature not yet implemented. TASK-020 (2026-09-29) verified on hardware that PPP negotiates end to end on the Airtel SIM: lwI |
| REQ-005 Camera capture and MJPEG stream over HTTP | P1 | PARTIALLY_VERIFIED | TASK-201, TASK-202 | TEST-201 | VERIFIED at sensor level. OV2640 confirmed MID 0x7fa2 PID 0x0026 VER 0x0042, SCCB addr 0x30. 320x240 RGB565 in PSRAM, luma stddev 15.4 (non-zero varia |
| REQ-006 Camera control web page | P2 | NOT_STARTED | TASK-203 | TEST-202 | Not yet attempted. |
| REQ-007 GNSS acquisition, NMEA parsing and position fix PRD defect: PRD FR-3.1 names AT+CGNSINF, which does not exist on this module. AT+CGPSINFO is valid. Corrected per ADR-002. | P0 | VERIFIED | TASK-301, TASK-302 | TEST-301 | VERIFIED. Cold-start fix 18.480816, 73.898640 (LOCK t+130s, 4 sats, hdop 7.3, 2026-09-30 17:46 local). Prior 2026-09-29: 18.480776, 73.897998 in 69 s, |
| REQ-008 Cellular LBS position fallback | P0 | VERIFIED | TASK-303 | TEST-302 | VERIFIED 2026-09-29. AT+CLBS=1,1 returned +CLBS: 0,18.481703,73.897415,550. Independently corroborated by the GPS fix at 18.480776, 73.897998 (separat |
| REQ-009 Location web page with live map | P2 | NOT_STARTED | TASK-304 | TEST-303 | Not yet attempted. |
| REQ-010 Cloud broker credential configuration UI | P1 | NOT_STARTED | TASK-401, TASK-402 | TEST-401 | Not yet attempted. Credentials must be stored in NVS and never committed to the repository. |
| REQ-011 Telemetry publish controls and interval | P1 | NOT_STARTED | TASK-403, TASK-404 | TEST-402 | Not yet attempted. |
| REQ-012 Direct MQTT telemetry publish from device over LTE | P0 | PARTIALLY_VERIFIED | TASK-405, TASK-406 | TEST-403 | NOT VERIFIED END TO END. The transport is proven: AT+CIPOPEN returns +CIPOPEN: 0,10 to broker.hivemq.com:1883, which is the command the TinyGSM A7672x |
| REQ-013 MQTT subscriber command engine | P1 | NOT_STARTED | TASK-407, TASK-408 | TEST-404 | Not yet attempted. Depends on TASK-405 completing first. |
| REQ-014 SMS receiver engine with whitelist | P1 | PARTIALLY_VERIFIED | TASK-501, TASK-502 | TEST-501 | PARTIALLY VERIFIED. Outbound SMS confirmed working: +CMGS: 2 and +CMGS: 3, both received by the user. AT+CNMI=2,1,0,1,0 is required to get delivery re |
| REQ-015 SMS command parser and auto-reply | P2 | NOT_STARTED | TASK-503 | TEST-502 | Not yet attempted. Depends on TASK-501. |
| REQ-016 Incoming call management with auto-answer and whitelist | P1 | PARTIALLY_VERIFIED | TASK-601, TASK-602 | TEST-601 | PARTIALLY VERIFIED. Outgoing call confirmed: +VOICE CALL: BEGIN, active call state +CLCC: 1,0,2, user heard audio. Poll AT+CLCC? for state 2=active, 4 |
| REQ-017 Outgoing call execution and dialpad UI | P2 | NOT_STARTED | TASK-603, TASK-604 | TEST-602 | ATD dialing is proven. The web dialpad and the full-duplex I2S audio path are NOT verified. See RISK-003: the board's audio codec/mic wiring is unconf |
| REQ-018 Offline speech recognition engine (ESP-SR) | P2 | NOT_STARTED | TASK-701, TASK-702 | TEST-701 | Not attempted. PRD NFR requires recognition latency strictly under 800 ms; that target is unvalidated. See RISK-004. |
| REQ-019 Voice contacts directory with wake-word dialing | P3 | NOT_STARTED | TASK-703 | TEST-702 | Not attempted. Depends on REQ-018 and on the audio hardware being confirmed present. |
| REQ-020 Asynchronous responsive web portal | P0 | PARTIALLY_VERIFIED | TASK-801, TASK-802, TASK-803 | TEST-801 | The async server, the seven-section navigation and the dashboard are implemented and inside the commit gate (make product), 2026-09-30. Verified only |
| REQ-021 NVS persistence of configuration and secrets | P0 | NOT_STARTED | TASK-404, TASK-402 | TEST-802 | Not started as a product feature, but the specific Rule 27 violation found during bootstrap is now closed: the hardcoded broker credential was removed |
| REQ-022 Security hardening | P0 | NOT_STARTED | TASK-804, TASK-405 | TEST-803 | Not attempted. TLS on the cellular path is untested: AT+CSSLCFG and SNI are unverified on firmware A011B04A7670M7_F. See RISK-005. ADDITION 2026-09-30 |
| REQ-023 SD card storage for captures and logs | P2 | PARTIALLY_VERIFIED | TASK-805 | TEST-804 | VERIFIED on the Arduino sketch path: 3,984,588,800-byte FAT32 card, write/read/delete round trip passed. Pins SD_MMC.setPins(5, 4, 6) with 20000 kHz. |