Commit Graph

3 Commits

Author SHA1 Message Date
ruv 409e8e2831 fix(adr-115/ci): drop multi-filter from cargo test invocation (single TESTNAME accepted only)
The mqtt-integration workflow's first cargo-test step was passing three
filters in one invocation:

    cargo test ... --lib mqtt:: semantic:: cli::tests

cargo test treats positional args after --lib as ONE TESTNAME and
errored with 'unexpected argument semantic::'. Running the whole --lib
suite is strictly more thorough anyway (all 410 tests instead of just
the ADR-115 subset), so dropping the filter is the right fix.

Refs PR #778.
2026-05-23 14:49:10 -04:00
ruv ca10df7b0d fix(adr-115): CI green — example feature-gate + mosquitto allow_anon + bench numbers
## Two CI failures on PR #778 fixed

### 1. Rust Workspace Tests (E0601: `main` not found in mqtt_publisher)

Default `cargo build --workspace` compiles examples without forwarding
`--features mqtt`. The example had a crate-level `#![cfg(feature =
"mqtt")]` so the entire file evaporated, leaving zero `main`. Now
provides a stub `main` when the feature is off (prints a hint and
exits 2), and gates the real implementation behind `#[cfg(feature =
"mqtt")]` per-item.

Local verification:
  cargo check --no-default-features --examples → clean

### 2. mqtt-integration (mosquitto never became reachable)

`eclipse-mosquitto:2.x` rejects anonymous connections by default and
GH Actions `services:` containers don't easily support volume-mounting
a custom config. Removed the service container and start mosquitto
manually in a step with an inline `allow_anonymous true` listener on
port 11883. Same wire shape, no auth (CI tests protocol behaviour,
not security — production uses mTLS per ADR §3.9).

## Benchmark numbers captured (`docs/integrations/benchmarks.md`)

Ran `cargo bench --features mqtt --bench mqtt_throughput` locally:

| Hot path                              | Measured | Target | Better by |
|---------------------------------------|----------|--------|-----------|
| state::event_fall encode              | 259 ns   | <2 µs  | 7.7×      |
| rate_limiter::allow_first             | 49.7 ns  | <100 ns| 2×        |
| rate_limiter::allow_within_gap        | 62.1 ns  | <100 ns| 1.6×      |
| privacy::decide_hr_strip              | 0.24 ns  | <50 ns | 208×      |
| privacy::decide_presence_keep         | 0.24 ns  | <50 ns | 208×      |
| semantic::bus_tick_all_10_primitives  | 717 ns   | <10 µs | 14×       |

At 1 Hz publish rate per node, the entire ADR-115 hot path costs
~1 µs per node per tick on commodity hardware. A Cognitum Seed
hosting 100 nodes would burn 100 µs/sec — 0.01% load floor. Memory:
~30 KB total FSM state for 10 primitives × 100 nodes.

The numbers exceed every target by ≥1.6×, several by 100×+. No need
to optimise further for v0.7.0.

Refs #776, PR #778.

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-05-23 14:47:46 -04:00
ruv b68f130ce4 feat(adr-115): P4 — broker integration tests + mosquitto CI workflow
Adds three integration tests (`v2/crates/wifi-densepose-sensing-server/
tests/mqtt_integration.rs`) that prove the publisher works against a
real broker, gated behind `--features mqtt` + `RUVIEW_RUN_INTEGRATION=1`:

1. `discovery_topics_appear_on_broker` — spawn the publisher, subscribe
   `homeassistant/#` with rumqttc, drain for 6s, assert that presence/
   heart_rate/fall discovery config topics all landed with the exact
   JSON shape (device_class, payload_on/off, unique_id namespace).

2. `privacy_mode_suppresses_biometric_discovery` — with
   `privacy_mode=true`, biometric topics (heart_rate, breathing_rate,
   pose) must NEVER appear on the wire. Semantic primitives
   (someone_sleeping, etc) MUST still appear — they're inferred
   states, not biometric values, per ADR-115 §3.12.3.

3. `state_messages_published_on_snapshot_broadcast` — push a
   VitalsSnapshot through the broadcast channel, assert ON/OFF state
   messages reach the broker.

Plus `.github/workflows/mqtt-integration.yml` — spins up Mosquitto
2.0.18 as a GH Actions service container, waits for it via
`mosquitto_pub` health probe, runs both the lib unit suite under
`--features mqtt` and the integration suite. Dumps broker logs on
failure for debugging.

Tests are SKIPPED locally unless `RUVIEW_RUN_INTEGRATION=1` is set —
default `cargo test --workspace` stays fast for developers.

Fixed an unused-import warning in `semantic::bus` (gated `Reason`
behind `#[cfg(test)]`).

Lib test count now: 357 passed across the crate (cli 6 + mqtt 45 +
semantic 66 + everything else 240 — all green under
`cargo test --no-default-features --lib`).

Refs #776.

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-05-23 14:14:21 -04:00