ruv
48db60a65e
feat(adr-125 tier1 #1): multi-characteristic accessory + JSON-state IPC
The HAP accessory now carries three services on the same paired
entity (HomeKit allows multiple services per accessory; iPhone
refetches /accessories when config_number bumps):
- MotionSensor — short-window motion_score, immediate
- OccupancySensor — rolling-3s avg presence_score, sustained
- StatelessProgrammableSwitch — "Unrecognized Activity Pattern"
event (Restricted-class only; fires on
anomaly_score >= 0.7); ADR-125 §2.1.d
semantic naming, not security state
New JSON IPC contract `/tmp/ruview-state.json` between watcher
and HAP daemon:
{ "motion": bool, "occupancy": bool, "anomaly_ts": float,
"ts": float }
Atomic writes (tmp + rename). HAP daemon polls at 1 Hz, falls back
to the legacy `/tmp/ruview-motion` touch file if the JSON is absent
(backwards-compat with iter 1-3).
Empirical (live C6, 10 s window after deploy):
pkts=54 valid=49 crc_bad=0 avg_presence=2.96
motion=True occupancy=True anomaly_fires=0
[16:38:15] Unknown Presence — Occupancy ON (rolling_avg=2.79)
Pairing survived:
paired_clients: 1
config_number: 3 (was 1; HAP-python bumps automatically on shape change)
Tier 1 #1 (multi-characteristic) of the Tier 1+2 sprint. Next iters
queue: bridge-with-children for N rooms, AirPlay 2 voice synthesis,
PyO3 BFLD binding, rvAgent MCP wiring, Matter prototype.
Refs ADR-125 §2.1.c (bridge topology), §2.1.d (semantic events),
ADR-118.
Co-Authored-By: claude-flow <ruv@ruv.net>
2026-05-25 16:39:27 -04:00
..
2026-03-14 13:39:51 -04:00
2026-05-21 18:56:52 -04:00
2026-04-03 08:50:48 -04:00
2026-04-02 22:04:57 -04:00
2026-04-03 00:18:29 -04:00
2026-04-02 22:40:48 -04:00
2026-04-02 23:40:23 -04:00
2026-05-25 16:39:27 -04:00
2026-05-11 10:48:14 -04:00
2026-03-14 13:39:51 -04:00
2026-04-06 14:07:25 -04:00
2026-04-02 22:04:57 -04:00
2026-04-03 00:34:57 -04:00
2026-04-03 00:36:38 -04:00
2026-04-03 13:03:18 -04:00
2026-04-03 08:52:50 -04:00
2026-05-12 22:19:15 -04:00
2026-03-03 11:35:57 -05:00
2026-04-06 14:07:25 -04:00
2026-05-19 17:03:09 -04:00
2026-05-24 13:00:38 -04:00
2026-04-03 08:50:48 -04:00
2026-04-25 21:28:13 -04:00
2026-03-15 11:49:29 -04:00
2026-05-24 22:55:47 -04:00
2026-05-25 16:39:27 -04:00
2026-03-14 13:39:51 -04:00
2026-03-14 13:39:51 -04:00
2026-04-06 14:39:21 -04:00
2026-04-03 08:52:50 -04:00
2026-04-03 08:50:48 -04:00
2026-04-03 00:36:38 -04:00
2026-04-03 00:34:57 -04:00
2026-03-15 16:10:10 -04:00
2026-04-03 08:52:50 -04:00
2026-05-17 19:50:55 -04:00
2026-05-17 17:00:37 -04:00
2026-04-02 22:04:16 -04:00
2026-04-02 22:04:16 -04:00
2026-05-17 17:00:37 -04:00
2026-03-14 13:39:51 -04:00
2026-03-14 13:39:51 -04:00
2026-03-14 13:39:51 -04:00
2026-04-25 21:28:13 -04:00
2026-03-14 13:39:51 -04:00
2026-04-06 17:18:41 -04:00
2026-05-23 15:34:48 -04:00
2026-04-02 19:32:18 -04:00
2026-04-03 00:18:29 -04:00
2026-04-03 09:09:53 -04:00
2026-04-03 08:52:50 -04:00
2026-04-03 08:50:48 -04:00
2026-05-25 10:32:46 -04:00
2026-04-03 09:09:53 -04:00
2026-04-03 08:50:48 -04:00
2026-04-03 00:34:31 -04:00
2026-04-03 08:50:48 -04:00
2026-03-14 13:39:51 -04:00
2026-04-03 08:52:50 -04:00
2026-04-02 23:05:07 -04:00
2026-05-21 19:47:04 -04:00
2026-04-03 09:37:08 -04:00
2026-04-06 14:55:35 -04:00
2026-04-02 23:40:23 -04:00
2026-04-02 22:04:57 -04:00
2026-05-17 18:01:44 -04:00
2026-03-14 13:39:51 -04:00
2026-04-20 10:38:23 -04:00
2026-05-23 16:13:28 -04:00
2026-05-23 16:13:28 -04:00
2026-04-02 23:40:23 -04:00
2026-05-23 16:13:28 -04:00