//! ADR-115 §3.12 — Semantic Automation Primitives (HA-MIND).
//!
//! Raw signals are not the product. Customers want first-class entities
//! like `binary_sensor.bedroom_someone_sleeping`, not a Node-RED flow
//! that thresholds breathing rate at night. This module owns the
//! inference layer that turns the `sensing-server` broadcast (raw
//! `edge_vitals` / `pose_data` / `sensing_update`) into the 10 v1
//! semantic primitives published as HA entities, Matter events, and
//! Apple Home scene triggers.
//!
//! ## Architectural contract
//!
//! - **Server-side inference.** All primitives run inside this process.
//!   Only the inferred *state* (true/false, scalar, event) crosses the
//!   wire. This is what makes `--privacy-mode` compatible with
//!   semantic primitives — biometric *values* can be stripped at the
//!   integration boundary while the inferred *states* still publish.
//! - **One source of truth.** Each primitive's FSM lives in one file
//!   alongside its tests. The `SemanticBus` aggregates output and
//!   broadcasts to MQTT + Matter consumers. Adding a new primitive is
//!   one file change — no new MQTT discovery schema, no new Matter
//!   cluster.
//! - **Explainability.** Every state change carries a `reason`
//!   payload so HA users can debug *why* a primitive fired.
//! - **Hysteresis everywhere.** Each primitive has explicit enter /
//!   exit thresholds + minimum dwell time so a single noisy frame
//!   never toggles state. Refractory periods prevent alert spam.
//! - **Warmup suppression.** No primitive fires during the first 60 s
//!   after start (per §3.12.4 — sensors are still settling).
//!
//! ## Primitives (v1)
//!
//! | Primitive               | Module                | Output           |
//! |-------------------------|-----------------------|------------------|
//! | someone_sleeping        | [`sleeping`]          | binary_sensor    |
//! | possible_distress       | [`distress`]          | binary_sensor + event |
//! | room_active             | [`room_active`]       | binary_sensor    |
//! | elderly_inactivity_…    | [`elderly_anomaly`]   | binary_sensor + event |
//! | meeting_in_progress     | [`meeting`]           | binary_sensor    |
//! | bathroom_occupied       | [`bathroom`]          | binary_sensor    |
//! | fall_risk_elevated      | [`fall_risk`]         | sensor (0-100)   |
//! | bed_exit                | [`bed_exit`]          | event            |
//! | no_movement             | [`no_movement`]       | binary_sensor    |
//! | multi_room_transition   | [`multi_room`]        | event            |
//!
//! Each module exports a struct implementing [`Primitive`] and a `new`
//! constructor that takes a [`PrimitiveConfig`].

mod bathroom;
mod bed_exit;
mod bus;
mod common;
mod distress;
mod elderly_anomaly;
mod fall_risk;
mod meeting;
mod multi_room;
mod no_movement;
mod room_active;
mod sleeping;

pub use bus::{SemanticBus, SemanticEvent, SemanticKind};
pub use common::{PrimitiveConfig, PrimitiveState, RawSnapshot, Reason};
