SPRINT-001 — Foundation, safety and de-risking
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.
Why these tasks
| Rationale |
|---|
| TASK-004 is first because tracker/tracker.ino contained a hardcoded broker credential. Committing that file before fixing it would have put a live secret into git history. The code side is now done and verified across full history; only the broker-side rotation remains, which is a human action. |
| TASK-019 is the framework decision and it blocks the entire network epic (TASK-101, TASK-103, TASK-104, TASK-108 to TASK-110). Its stated precondition - prove PPP works on this board - is now satisfied, so this is the highest-value task left in the sprint. |
| TASK-020 is complete: PPP negotiates to phase RUNNING and yields a real IP. See BUG-006 for the three defects that had to be fixed and LESSONS_LEARNED L-11/L-12 for the diagnosis traps. |
| TASK-021 remains blocked on a physical inspection of the board. No amount of code can settle whether the I2S mic and amp are populated. |
| TASK-301, TASK-303 and TASK-405 are deliberately NOT in this sprint even though they are P0, because each depends on TASK-019's outcome or on TASK-001/004 completing first. TASK-405 is the natural next sprint: nothing blocks it and it produces the first real end-to-end publish. |
Deliberately out of scope this sprint
| Any NAT routing code (blocked on TASK-019) |
| Any web portal work (integration surface, but the framework choice is unresolved) |
| ESP-SR / voice (blocked on RISK-003) |
Board
BACKLOG33
TASK-104
Dual-WAN routing integration: STA primary with LTE PPP fallback
P0REQ: REQ-004verif: NOT_VERIFIEDsha: —Integration task: once TASK-101 (SoftAP/DHCP), TASK-109 (NAPT forwarding) and TASK-105/108 (STA plus the WAN state machine) exist,
TASK-406
MQTT credential storage and broker selection
P0REQ: REQ-010, REQ-021verif: NOT_VERIFIEDsha: —Store broker host, port, client id, username, password and topics in NVS. Support HiveMQ and Adafruit IO targets.
TASK-105
Wi-Fi STA credential persistence and auto-reconnect on boot
P0REQ: REQ-002verif: NOT_VERIFIEDsha: —Load stored STA credentials from NVS at boot and auto-associate, falling back to cellular when no STA link is established.
TASK-106
Automatic APN detection and configuration
P1REQ: REQ-003verif: NOT_VERIFIEDsha: —Detect APN from the SIM (IMSI MCC/MNC or a lookup table) and configure AT+CGDCONT automatically, with a manual override in the web
TASK-108
WAN health evaluation and failover state machine
P0REQ: REQ-004verif: NOT_VERIFIEDsha: —Continuously evaluate STA link health and LTE readiness, and drive a state machine that selects the active WAN. This is the contro
TASK-109
LwIP NAT forwarding between SoftAP clients and the active WAN
P0REQ: REQ-004verif: NOT_VERIFIEDsha: —Implement packet forwarding and NAT translation between SoftAP clients and the active WAN. The RISK-002 dependency recorded here i
TASK-110
Throughput and failover-time measurement harness
P0REQ: REQ-004verif: NOT_VERIFIEDsha: —Measure actual NAT throughput and failover time and compare against the PRD NFRs of 10-15 Mbps and under 3 s. Produce evidence for
TASK-201
Camera driver and frame capture with PSRAM buffers
P1REQ: REQ-005verif: NOT_VERIFIEDsha: —Bring up the OV2640 on the V1 pinout, allocate frame buffers in PSRAM, and expose frame capture. Sensor-level capture is already V
TASK-202
MJPEG encode and HTTP /stream endpoint
P1REQ: REQ-005verif: NOT_VERIFIEDsha: —Encode frames as MJPEG and stream them over multipart HTTP to connected clients.
TASK-203
Camera control page: resolution, quality, FPS, snapshot
P2REQ: REQ-006verif: NOT_VERIFIEDsha: —Build the /camera page with interactive controls for resolution, JPEG quality, frame rate and snapshot capture.
TASK-302
Position service exposing lat/lon/alt/speed/sats with a source field
P0REQ: REQ-007verif: NOT_VERIFIEDsha: —Single position struct with an explicit source (GNSS or LBS) and accuracy. Implements the ADR-006 hierarchy: publish LBS immediate
TASK-304
Location web page with Leaflet/OpenStreetMap map
P2REQ: REQ-009verif: NOT_VERIFIEDsha: —Live lat/lon/alt/speed/sats display plus an embedded interactive Leaflet map. The map must visually distinguish an LBS fix from a
TASK-401
Cloud broker credential UI (HiveMQ and Adafruit IO)
P1REQ: REQ-010verif: NOT_VERIFIEDsha: —Form to enter broker URL, port, client id, username, password and topics for HiveMQ, plus the equivalent Adafruit IO fields. Value
TASK-402
NVS-backed configuration store
P0REQ: REQ-010, REQ-021verif: NOT_VERIFIEDsha: —Persist Wi-Fi credentials, broker credentials, APN, contacts, voice triggers and the SMS whitelist in NVS/LittleFS. Replaces the c
TASK-403
Telemetry destination selector and publish interval
P1REQ: REQ-011verif: NOT_VERIFIEDsha: —Destination selector (Disabled / HiveMQ / Adafruit IO), Start/Stop controls and a configurable interval from 5 to 3600 seconds.
TASK-404
Web portal authentication and secret handling
P0REQ: REQ-022verif: NOT_VERIFIEDsha: —Enforce HTTP Basic Auth on the admin portal, ensure no secret is ever returned in a page or log, and adopt the NVS store so no sec
TASK-407
MQTT command subscription and JSON parser
P1REQ: REQ-013verif: NOT_VERIFIEDsha: —Subscribe to the command topic, parse command_id/action/params JSON, and dispatch to handlers. Depends on TASK-405 completing firs
TASK-408
Command execution and response publishing
P1REQ: REQ-013verif: NOT_VERIFIEDsha: —Execute GET_STATUS / TOGGLE_ROUTER / REBOOT / SEND_SMS / DIAL_NUMBER and publish a matching result to the response topic.
TASK-501
SMS receive interception via +CMTI with whitelist enforcement
P1REQ: REQ-014verif: NOT_VERIFIEDsha: —Intercept +CMTI URCs, read the message with AT+CMGR, and reject any sender not on the whitelist. Outbound SMS is already VERIFIED;
TASK-502
SMS whitelist management surface
P2REQ: REQ-014verif: NOT_VERIFIEDsha: —Web UI to add and remove authorised numbers, stored in NVS.
TASK-503
SMS command parser and auto-reply
P2REQ: REQ-015verif: NOT_VERIFIEDsha: —Case-insensitive STATUS / LOCATION / STREAM ON / STREAM OFF / REBOOT / CALL <number> parsing with automatic reply to the sender.
TASK-601
Incoming call detection with auto-answer, reject and whitelist
P1REQ: REQ-016verif: NOT_VERIFIEDsha: —Detect RING/+CLIP, apply configurable auto-answer after N rings, reject unauthorised callers with ATH, and surface an Accept/Hang
TASK-602
Web telephony control surface and call status
P2REQ: REQ-016verif: NOT_VERIFIEDsha: —Real-time call state, duration display and the Accept/Hang Up popup in the web portal.
TASK-603
Web dialpad and contact-based dialling
P2REQ: REQ-017verif: NOT_VERIFIEDsha: —Dialpad UI and saved contacts issuing ATD<number>; over the API. ATD dialling is already VERIFIED at the AT level.
TASK-604
Full-duplex I2S audio path (mic capture and DAC playback)
P2REQ: REQ-017verif: NOT_VERIFIEDsha: —I2S microphone capture and I2S DAC playback routed for calls. BLOCKED on RISK-003: the presence and wiring of the audio hardware o
TASK-701
ESP-SR engine with latency benchmark
P2REQ: REQ-018verif: NOT_VERIFIEDsha: —ESP-SR WakeNet + MultiNet running fully offline, with a measured latency benchmark against the PRD sub-800ms NFR. BLOCKED on RISK-
TASK-702
Wake-word detection with audio feedback
P2REQ: REQ-018verif: NOT_VERIFIEDsha: —Wake-word recognition with a confirmation beep played through the DAC, then open a recognition window.
TASK-703
Voice contacts directory and voice-activated dialling
P3REQ: REQ-019verif: NOT_VERIFIEDsha: —Web UI to manage contacts and phonetic triggers, then the wake-word -> 5s window -> match -> verbal confirm -> ATD sequence.
TASK-803
Responsive layout and styling across all pages
P2REQ: REQ-020verif: NOT_VERIFIEDsha: —Responsive CSS and consistent component styling across every portal page.
TASK-804
TLS transport for cloud connectivity
P0REQ: REQ-022verif: NOT_VERIFIEDsha: —Configure AT+CSSLCFG with SNI and certificate installation so MQTT runs over TLS 8883 rather than plaintext 1883. BLOCKED on RISK-
TASK-805
SD card mount and storage integration
P2REQ: REQ-023verif: NOT_VERIFIEDsha: —Mount the card and use it for snapshots, GNSS track logs and device logs. BLOCKED on BUG-001: works under Arduino, fails under ESP
TASK-021
Experiment: confirm audio hardware population on the board
P0REQ: REQ-017, REQ-019verif: NOT_VERIFIEDsha: —Run RISK-003. Physically inspect whether the I2S MEMS microphone and I2S DAC are populated, and if so run a mic-to-DAC loopback te
TASK-022
Experiment: GPS cold-start benchmark harness
P1REQ: REQ-007verif: NOT_VERIFIEDsha: —Repeat the cold-start measurement several times to characterise the real distribution of time-to-first-fix, rather than relying on
READY2
TASK-002
Record hardware baseline as executable regression sketches
P0REQ: REQ-003, REQ-007, REQ-008verif: NOT_VERIFIEDsha: —Convert the surviving diagnostics (gnss_hold, lbsmatrix, cam_diag, sd_diag) into a consistent set of regression sketches with unif
TASK-303
LBS fallback integration into the location service
P0REQ: REQ-008verif: NOT_VERIFIEDsha: —Wrap the proven AT+CLBS=1,1 call. Preconditions: patch antenna attached and AT+SIMEI populated from AT+CGSN. Populate the position
IN_PROGRESS5
TASK-101
Bring up SoftAP with internal DHCP
P0REQ: REQ-001verif: NOT_VERIFIEDsha: ad5c900Bring up SoftAP with internal DHCP. NomadLink-XXXX SSID derived from the efuse MAC, 192.168.4.1 gateway, and an internal DHCP pool
TASK-103
A7670E modem driver and connection state machine
P0REQ: REQ-003verif: NOT_VERIFIEDsha: 8b09974Own the UART, run the PWRKEY power-on sequence, drive the data bearer, expose RSSI/registration/operator. Must use AT+CIPOPEN for
TASK-107
Network status monitoring surface (RSSI, registration, operator)
P1REQ: REQ-003verif: NOT_VERIFIEDsha: 8b09974Expose CSQ, CEREG/CGREG state and COPS operator to the web dashboard. Must also surface antenna state, because forgetting the 4G p
TASK-801
ESPAsyncWebServer shell and navigation layout
P0REQ: REQ-020verif: NOT_VERIFIEDsha: 018401a7Web shell with seven-section navigation (Dashboard, Network, Camera, Location, Cloud, SMS, Telephony) on the core WebServer. Async
TASK-802
Dashboard view: network, GPS quick view, system stats
P1REQ: REQ-020verif: NOT_VERIFIEDsha: 018401a7Landing page showing WAN mode, Wi-Fi signal, 4G RSSI, operator, fix status, lat/lon, free RAM, PSRAM usage and minimum-ever-free-h
BLOCKED0
CODE_REVIEW0
TESTING0
VERIFICATION0
DONE8
TASK-001
Initialise repository, .gitignore, README, and commit existing hardware baselines
P0REQ: noneverif: VERIFIEDsha: ed8bb30git init, add .gitignore excluding build output and secrets, write README describing the product, verified hardware baseline and b
TASK-003
Create project tracking validator and dashboard generator
P0REQ: noneverif: VERIFIEDsha: ed8bb30Write scripts/project-tracker/validate.py enforcing the Rule 44 invariants, and render.py generating the HTML dashboards from JSON
TASK-004
Remove hardcoded HiveMQ credentials from tracker source
P0REQ: REQ-021, REQ-022verif: VERIFIEDsha: ed8bb30tracker/tracker.ino currently contains a broker username and password as compile-time #defines. This is a Rule 27 violation and is
TASK-102
Wi-Fi STA uplink and credential storage on the vendored router base
P0REQ: REQ-002, REQ-021verif: VERIFIEDsha: 7717888Wi-Fi STA uplink and credential storage, delivered by the vendored esp32_nat_router base rather than hand-written. The base alread
TASK-405
Complete direct LTE MQTT transport over PPP (CIP path unusable on unit)
P0REQ: REQ-012verif: VERIFIEDsha: 22a0a6bCIP socket stack is not usable on the physical unit (A7670M7_V1.11.1 auto-enters PPP after AT+CGACT=1,1; historical +CIPOPEN evide
TASK-301
GNSS service with uninterrupted cold-start handling
P0REQ: REQ-007verif: VERIFIEDsha: 15e6ff9Bring up the GNSS engine once per boot, keep it powered, and parse NMEA with TinyGPS++. The existing tracker sketch has a counter
TASK-019
Choose and document the firmware framework baseline (ESP-IDF vs Arduino)
P0REQ: REQ-004, REQ-012, REQ-020verif: VERIFIEDsha: ad5c900Choose and document the firmware framework baseline. DECIDED: Option B, Arduino-ESP32 3.3.x as the product framework. The premise
TASK-020
Experiment: PPP data path on the Airtel SIM
P0REQ: REQ-004verif: VERIFIEDsha: 479dcbeRun RISK-002. Establish whether the ESP32 can obtain a real IP interface over PPP from the A7670E on the Airtel SIM. Partially ans