v1.7.1 — Quality Convergence
Quality convergence wave. Hardware verification of v1.7.0 surfaced eight separate defects across audio / wifi / build infrastructure. Fixing them was straightforward; the more important deliverable is the framework that catches the next instance of each defect class.
Defects fixed (anchored to lessons)
| Defect | Where | Lesson |
|---|---|---|
| `audio tone` reported `bytes:0` despite playing | audio.c |
L1 — `esp_codec_dev_write` returns `esp_err_t`, not POSIX bytes |
| `audio mic peak_dbfs:0.0` in silent rooms | audio.c × 3 sites |
L2 — first DMA buffer is stale; needs throwaway read |
| Peak just above 0 dBFS on one-sample dropouts | audio.c × 3 sites |
L3 — `abs(INT16_MIN) = 32768` overflows |
| `wifi disconnect` immediately reconnected | wifi.c |
L4 — event handler needed user-intent flag |
| Console couldn't parse `ssid="…"` | console_protocol.c |
— — tokenizer didn't honour quotes |
| `MBEDTLS_CRYPTO=n` ignored | sdkconfig | L6 — kconfig `select` trap |
| `wifi_init ESP_ERR_NO_MEM` with 39 KB free | sdkconfig | L7 — `STATIC_TX_BUFFER_NUM=16` is huge |
| `tap_hit` EVT unobservable from host | — | L9 — async EVT framework gap (v1.8 backlog) |
Quality infrastructure
- `docs/lessons-v1.7.md` — ten lessons in the format What broke / Root cause / Why we missed it / Process change. Reference for every future release.
- `tools/smoke.ps1` — pre-release gate. 13 cases, all regression-anchored: 4 host (`doctor 8/8`, `pytest 3/3`, `sim diff 13/13`, `manifest ≥17`) + 9 device (`?ping`, `?stat` fps/scene_count, `?sys`, audio tone bytes > 0, audio mic peak in [-90,-10], `?ota info`, scene switch). Each device case that traces back to a lesson carries an `(L regression)` tag — failures surface both symptom and root-cause doc reference.
Verification
Smoke gate: 13 / 13 green on hardware. Sim diff regression: 13 / 13 identical.
🤖 Generated with Claude Code