Automated release from CI pipeline
Changes:
feat(adr-125 iter 2): real C6 feature_state UDP → HAP characteristic
scripts/c6-presence-watcher.py parses the 60-byte
rv_feature_state_t struct (RV_FEATURE_STATE_MAGIC = 0xC5110006)
emitted by firmware/esp32-csi-node/main/rv_feature_state.[ch] at
1-10 Hz from the real ESP32-C6 on ruv.net, validates the IEEE CRC32
over bytes [0..end-4], gates on RV_QFLAG_PRESENCE_VALID, applies
hysteresis (entry 0.40 / release 0.20) plus a 5 s idle-release
fallback, and toggles /tmp/ruview-motion — the same touch-file
contract that the already-paired HAP bridge consumes.
E2E validated against real hardware (no mocks, no simulation):
C6 (192.168.1.179, ch 5, RSSI -38)
└─ UDP/5005 → mac-mini (192.168.1.166)
└─ c6-presence-watcher.py (pid 8276)
└─ /tmp/ruview-motion
└─ hap-test-sensor.py (pid 84602)
└─ HAP-1.1 over mDNS
└─ iPhone Home app: RuView Test Motion = True
10 s sample: pkts=63 valid=51 crc_bad=0 motion -> True
Iter 3 next: insert wifi-densepose-bfld PrivacyGate between the
UDP parse and the threshold so only class-2/3 frames cross the HAP
boundary (ADR-118 §2.2 invariant I1 holds at the HomeKit edge —
ADR-125 §2.1.d).
Refs ADR-125, ADR-118, ADR-081.
Co-Authored-By: claude-flow ruv@ruv.net
Docker Image:
ghcr.io/ruvnet/RuView:1f13aa96c2261308a2f2b7a5ca7d9f3620284e67