A C6 node's CSI callbacks stopped for 473 s while Wi-Fi, ping, ESP-NOW,
the console and RUVIEW_HELLO stayed healthy. The uplink watchdog cannot
see this: adaptive-controller and mesh packets keep sendto() succeeding.
Capture watchdog (ADR-364):
- the CSI callback stamps raw-callback and CSI-send liveness (uint32 ms)
- a pure, host-tested policy (csi_stall_policy.c) escalates one
CSI_STALL_TIMEOUT_S (15 s) step at a time: re-arm the capture path,
force reassociation, restart; paused while the link is down, armed
only after first capture, off under power duty-cycling, radio-only
liveness when a source-MAC filter is active
- test-only CONFIG_CSI_STALL_INJECT_MODE to prove the ladder on silicon
Send gate: a second 20 ms gate timed from the send, not the accept,
discarded frames the mesh-aligned process gate accepted 10-20 ms apart
(seq steps were only +1/+2). It is now a burst guard at the process
gate's floor.
MEASURED on ESP32-C6 node 42 (scripts/benchmark-esp32-csi.py, new):
- sequence loss 21-28% -> 0.08-0.15%; 0 false triggers over 855 s
- injected transient stall: detected +15.0 s, re-armed, host outage
15.2-15.3 s, no reassoc/reboot (2 runs)
- injected persistent stall: re-arm, reassoc, restart; outage 52.9 s
Host tests (make host_tests) pass; ASan/UBSan clean; C6 and S3 build
with no new warnings.
Co-Authored-By: claude-flow <ruv@ruv.net>