v2390
ruvnet/RuViewv2390Aug 26, 2026by github-actions[bot]
AI Summary
The release introduces ultrasonic support as a new field surface modality and ships the corresponding adapter.
Key Highlights
- Ultrasonic modality added as second modality
- UltrasonicReplayAdapter ships with rufield-adapters
- Struct updates for Observation and SensorDescriptor
- Coarse reduction for safety and egress gate compliance
New Features
- Ultrasonic modality support
- UltrasonicReplayAdapter
- Observation struct fields (track_id, attributes, etc.)
- SensorDescriptor struct fields (coordinate_frame, position_m, etc.)
Full Release Notes
Automated release from CI pipeline **Changes:** feat(rufield): ultrasonic as the field surface's second modality (#1716) ADR-262 §8 question 5 left the second modality open, asking whether it should be rvcsi. This answers ultrasonic instead, because the cost collapsed: rufield-adapters now ships UltrasonicReplayAdapter, the first adapter for Modality::Ultrasonic (registry code 7, empty since v0.1), which parses, validates and signs BatVu range profiles upstream. RuView only has to decide what it will put on a wire. Bumps vendor/rufield 43b1df3 -> 9955672. Two struct literals in bridge.rs gain fields added upstream (Observation: track_id, attributes, identity_evidence, channel_sounding_provenance; SensorDescriptor: coordinate_frame, position_m, orientation_xyzw). All left empty, each for a stated reason rather than a convenient default — the pose fields in particular, because a CSI link has no boresight and §6 makes no validated room-coordinate claim. The nine existing P1 gates pass unchanged. The decision this module makes is structural rather than a runtime refusal. The adapter's full per-bin frame is P0 and would be dropped by the egress gate after all the work of parsing and signing it; its 32-bin coarse reduction is P1 and egress-safe. So the module does not offer the choice — it configures the coarse mode, because a consumer cannot un-coarsen a coarse profile whereas a check can be reordered. The gate still runs and is asserted to drop nothing. 12 gates in tests/ultrasonic_gates.rs, including the honest negative result: an ultrasonic scan produces no fused inferences at all, and both independent reasons are pinned. The adapter declines to populate `presence` — one transducer pair cannot distinguish a person from a coat over the back of a chair — and the engine's feature vocabulary is entirely statements about a body, so range_m has nothing to drive. The fixture is BatVu's own emitter output, byte-identical to the one in ruvnet/rufield, so schema drift fails a build in one of three repositories rather than an ingest in a deployment. Not wired into the running server; P1 shipped as a library before P3 wired it in, and this follows the same staging. **Docker Image:** `ghcr.io/ruvnet/RuView:d42c5581f34fe8e50b053971d387fb8c56a3baf4`