v1.7.0 — Connectivity + Real OTA
Connectivity + real OTA. Closes the gap between the v1.6 `?ota` skeleton (info / mark-valid / rollback only) and a device that can actually pull a new image over the air. Pairs with WiFi STA connect + NVS-backed credential persistence so the loop is one command per side: connect once, then `?ota download url=…` whenever a new build lands.
Aurora firmware
- `peripherals/wifi_creds.{h,c}` — NVS-backed credential store (namespace `wifi_cred`, 5-function API).
- `peripherals/wifi.c` — STA-mode connect: `wifi_connect(ssid, pass, timeout_ms)` with event-group + IP_GOT gate + 3 automatic retries. Plus `wifi_disconnect / wifi_is_connected / wifi_get_status`.
- `wifi` console command — rewritten as multi-subcommand: `scan | connect ssid=… pass=… save=1 | disconnect | forget | status`.
- `?ota` console command — gains `download url=…` via `esp_https_ota` streaming with integer-percent EVT progress. Does not auto-reboot — host decides when to flip slots.
- `partitions.csv` — switched from `factory 8M + storage 7M` to dual `ota_0 5M + ota_1 5M + storage 5M`. `otadata` (2 sectors) added.
- `sdkconfig.defaults` — `CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE=y`, HTTP client HTTPS, dev-friendly `OTA_ALLOW_HTTP`.
Toolkit + build infra
- `core/patches.py` — centralizes `managed_components/` patches. First entry: the `waveshare__qmi8658` upstream bug pair (missing `esp_driver_i2c` REQUIRES + `M_PI` without `#ifndef` guard).
- `build.py` — applies patches pre-build; on failure inspects stderr for known retry signatures and retries once.
- `examples/aurora/CMakeLists.txt` — `esp_harness_apply_known_patches()` CMake fallback. A fresh clone now builds without needing the toolkit at all.
Verification
- Target build: clean rebuild 65.5s, 0 warnings, all artifacts produced
- Sim diff: 13 / 13 scenes identical (no UI regression)
- pytest: 3 / 3 passing (doctor / manifest / sim-diff)
- Manifest: 17 toolkit commands surfaced
Deferred to v1.8
- BLE-peripheral WiFi provisioning UI (NimBLE GATT receiver writing to the v1.7 `wifi_creds` API). API surface is ready; only the BLE side is missing.
🤖 Generated with Claude Code