v0.8.3-esp32
KlingAIResearch/LivePortraitv0.8.3-esp32Jun 27, 2026by ruvnet
AI Summary
Bug-fix release for ESP32-S3 CSI node firmware addressing multistatic fusion dimension mismatches, frame-rate metric inflation, and control packet starvation.
Key Highlights
- Resampled node frames onto a canonical 56-tone grid to fix MultistaticFusion errors caused by mixed HT20/HT40 bins.
- Added a 5 ms plausibility floor to reject burst deltas and fix `csi_fps_ema` metric inflation.
- Implemented a priority send path for control packets to prevent ENOMEM backoff from starving health/sync messages.
- Added `scripts/firmware-release-guard.sh` to validate partition tables match flash-size variants.
New Features
- Added firmware-release-guard.sh script for automated partition table validation
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` |