v0.8.3-esp32

kulikov0/whitelist-bypassv0.8.3-esp32Jun 27, 2026by ruvnet

AI Summary

Bug-fix release for ESP32-S3 CSI node firmware addressing multistatic fusion errors, frame-rate inflation, and control packet starvation.

Key Highlights

  • Fixed DimensionMismatch in multistatic fusion by resampling CSI to canonical 56-tone grid
  • Fixed `csi_fps_ema` inflation using a 5ms plausibility floor for burst deltas
  • Fixed ENOMEM backoff starving control packets via a priority send path

New Features

  • Added `scripts/firmware-release-guard.sh` for partition table verification

Full Release Notes

ESP32-S3 CSI node firmware **v0.8.3-esp32** — bug-fix release.

## Fixed
- **#1170 — multistatic fusion `DimensionMismatch` flood.** The live sensing-server bridge fed raw, un-canonicalized per-node CSI (HT20≈64 / HT40≈128/192 bins) into `MultistaticFuser`, so fusion errored every cycle on a mixed mesh and silently fell back to per-node sum/dedup. Node frames are now resampled onto the canonical 56-tone grid (resample-only, no z-score) before fusion.
- **#1180 — `csi_fps_ema` inflated 40–840×.** Sub-millisecond UDP burst arrivals (36 µs → ~27 kHz) polluted the per-node frame-rate EMA. A 5 ms plausibility floor now rejects burst deltas, and the arrival anchor is kept across bursts so the next genuine gap measures true cadence.
- **#1183 — ENOMEM backoff starved control packets.** Under a weak uplink the global CSI backoff also suppressed the ≤48 B/≤1 Hz `feature_state`/`HEALTH`/sync packets. A new priority send path bypasses the backoff gate (without touching the streak) for those control packets; the misleading `"HEALTH sent"` log now reports the real send result.

## Tooling
- Added `scripts/firmware-release-guard.sh` (#1194): regenerates the expected partition table from the variant's CSV and byte-compares it to the built `partition-table.bin` (+ flash-size cross-check), failing closed so a release can't ship a partition table that doesn't match its flash-size variant.

## Verification (MEASURED)
- `wifi-densepose-signal`: **501 passed, 0 failed**
- `wifi-densepose-sensing-server`: **677 passed, 0 failed**
- Firmware: both variants build clean (ESP-IDF v5.4); release guard **PASS** for 8MB (`partitions_display.csv`) and 4MB (`partitions_4mb.csv`).
- ✅ **Hardware smoke test PASS** — flashed the 8MB build to an ESP32-S3 (QFN56 rev v0.2, the #1116 board); booted clean, streamed real WiFi CSI (mixed `len=128`/`len=384`, RSSI −42…−59), emitted HEALTH/feature_state via the #1183 priority path, mesh time-sync `fail=0`, and **no #1116 edge_dsp watchdog crash** over the capture. Note: #1183 starvation needs a weak (~−78 dBm) uplink to trigger; strong-RSSI bench run shows no regression but does not reproduce that specific condition.

## Binaries
| File | Variant | SHA-256 |
|------|---------|---------|
| `esp32-csi-node-s3-8mb.bin` | 8MB/common | `ed825c52468e8ecf1cfd14417914d9e2b6acd2b1489bd60168d2559ee3ba6c88` |
| `esp32-csi-node-s3-4mb.bin` | 4MB | `94c547a033448b437a65659bbcd8c81616d5e5d83990a9f7829625a5581bad66` |
| `bootloader.bin` | 8MB/common | `74f90ff55a097539d788bef133c6fd2b13ee85f53b1e07f23d65de2d2f63941d` |
| `ota_data_initial.bin` | 8MB/common | `7d2c7ac4888bfd75cd5f56e8d61f69595121183afc81556c876732fd3782c62f` |
| `partition-table.bin` | 8MB/common | `67222c257c0477501fd4002275638dc4262b34eb68235b8289fb1337054d322b` |
| `partition-table-4mb.bin` | 4MB | `4c2cc4ffd52641e23b779bd57b3908014083ac3c1aab395756478c89e70d81f0` |