Claude
b116a99481
feat(rvcsi): real nexmon_csi UDP/PCAP fidelity — chanspec decode, libpcap reader, NexmonPcapAdapter
...
Raises the Nexmon path from a normalized record format to parsing what the
patched Broadcom firmware actually emits, end to end.
napi-c shim (ABI 1.0 -> 1.1, additive):
- rvcsi_nx_csi_udp_header / rvcsi_nx_csi_udp_decode — parse the real nexmon_csi
UDP payload: the 18-byte header (magic 0x1111, rssi int8, fctl, src_mac[6],
seq_cnt, core/spatial-stream, Broadcom chanspec, chip_ver) + nsub complex CSI
samples (modern int16 LE I/Q export — what CSIKit/csireader.py read for the
BCM43455c0 / 4358 / 4366c0; nsub = (len-18)/4). rvcsi_nx_csi_udp_write to
synthesize payloads for tests. rvcsi_nx_decode_chanspec — d11ac chanspec ->
channel (chanspec & 0xff) / bandwidth (bits [13:11], cross-checked against the
FFT size) / band (bits [15:14], cross-checked against the channel number).
Still allocation-free, bounds-checked, structured errors, never panics.
- ffi.rs wraps it: decode_chanspec / parse_nexmon_udp_header / decode_nexmon_udp
/ encode_nexmon_udp + DecodedChanspec / NexmonCsiHeader; every unsafe block
documented; the ABI guard now expects 1.1.
rvcsi-adapter-nexmon:
- pcap.rs — a dependency-free classic-libpcap reader (all four byte-order /
timestamp-resolution magics; Ethernet / raw-IPv4 / Linux-SLL link types;
tolerates a truncated final record; pcapng is a follow-up) + extract_udp_payload
+ a synthetic_udp_pcap / synthetic_nexmon_pcap test/example generator.
- NexmonPcapAdapter (a CsiSource) — reads the CSI UDP packets out of a
`tcpdump -i wlan0 dst port 5500 -w csi.pcap` capture, decodes each via the C
shim, stamps the frame timestamp from the pcap packet time; non-CSI packets
counted as "skipped" in health.
rvcsi-runtime: decode_nexmon_pcap, summarize_nexmon_pcap (+ NexmonPcapSummary:
link type, CSI frame count, channels, bandwidths, subcarrier counts, chip
versions, RSSI range, time span), CaptureRuntime::open_nexmon_pcap[_bytes].
rvcsi-node (napi-rs): nexmonDecodePcap, inspectNexmonPcap, decodeChanspec,
RvcsiRuntime.openNexmonPcap. @ruv/rvcsi SDK + .d.ts updated (NexmonPcapSummary,
DecodedChanspec). rvcsi-cli: `record --source nexmon-pcap`, `inspect-nexmon`,
`decode-chanspec`.
161 rvcsi tests pass (adapter-nexmon 9->22), 0 failures, clippy-clean.
ADR-096 §2.2/§2.3/§5, CHANGELOG, CLAUDE.md updated.
https://claude.ai/code/session_01CdYAPvRTjcch6YrYf42n1z
2026-05-13 01:15:22 +00:00
Claude
7393cc2b73
feat(rvcsi): rvcsi-runtime composition + rvcsi-node (napi-rs) + rvcsi-cli + @ruv/rvcsi TS SDK
...
- rvcsi-runtime — the composition layer (no FFI): CaptureRuntime (CsiSource +
validate_frame + SignalPipeline + EventPipeline, with next_validated_frame /
next_clean_frame / drain_events / health) plus one-shot helpers
(summarize_capture → CaptureSummary, decode_nexmon_records, events_from_capture,
export_capture_to_rf_memory, rf_memory_self_check). 10 tests.
- rvcsi-node — the napi-rs seam (cdylib+rlib, build.rs runs napi_build::setup):
thin #[napi] wrappers over rvcsi-runtime — rvcsiVersion / nexmonShimAbiVersion /
nexmonDecodeRecords / inspectCaptureFile / eventsFromCaptureFile /
exportCaptureToRfMemory + an RvcsiRuntime streaming class. Everything that
crosses the boundary is a validated/normalized rvCSI struct serialized to JSON
(D6). deny(clippy::all).
- @ruv/rvcsi npm package (package.json + index.js + index.d.ts + README +
__test__/api.test.cjs) — curated JS surface that JSON-parses the addon's
output into plain CsiFrame/CsiWindow/CsiEvent/SourceHealth/CaptureSummary
objects; lazy native-addon load with a helpful "not built" error.
- rvcsi-cli — the `rvcsi` binary: record (Nexmon dump → .rvcsi, validating),
inspect, replay, stream, events, health, calibrate (v0 baseline), export
ruvector. 7 tests exercising every subcommand against in-memory captures.
- rvcsi-cli no longer depends on rvcsi-node (a binary can't link the napi addon);
the shared logic moved to rvcsi-runtime. .gitignore: ignore the generated
*.node / binding.js / binding.d.ts / npm/ under rvcsi-node.
All rvcsi crates: build together OK, clippy-clean, 140 unit/integration tests +
2 doctests, 0 failures (core 29, dsp 28, events 18, adapter-file 20+1,
adapter-nexmon 9, ruvector 20+1, runtime 10, cli 7).
https://claude.ai/code/session_01CdYAPvRTjcch6YrYf42n1z
2026-05-13 00:17:45 +00:00
Claude
1e684cb208
feat(rvcsi): rvcsi-core + napi-c Nexmon shim + crate skeletons (ADR-095/096)
...
First implementation milestone for the rvCSI edge RF sensing runtime:
- rvcsi-core — the foundation: CsiFrame/CsiWindow/CsiEvent normalized schema,
ValidationStatus, AdapterProfile, CsiSource plugin trait, id newtypes +
IdGenerator, RvcsiError, and the validate_frame pipeline (length/finiteness/
subcarrier/RSSI/monotonicity hard checks + multiplicative quality scoring →
Accepted/Degraded/Recovered/Rejected). 29 unit tests, forbid(unsafe_code).
- rvcsi-adapter-nexmon — the napi-c boundary: native/rvcsi_nexmon_shim.{c,h}
(the only C in the runtime, allocation-free, bounds-checked, parses/writes a
byte-defined "rvCSI Nexmon record" — a normalized superset of the nexmon_csi
UDP payload), compiled via build.rs + cc, wrapped by a documented ffi module
and a NexmonAdapter implementing CsiSource. 9 tests round-tripping through C.
- Workspace registration in v2/Cargo.toml (8 new members + napi/cc workspace
deps) and compiling skeletons for rvcsi-dsp, rvcsi-events, rvcsi-adapter-file,
rvcsi-ruvector, rvcsi-node (napi-rs cdylib + build.rs napi_build::setup) and
rvcsi-cli (`rvcsi` binary) — to be filled in by the implementation swarm.
cargo build -p rvcsi-core -p rvcsi-adapter-nexmon -p rvcsi-node -p rvcsi-cli: OK
cargo test -p rvcsi-core -p rvcsi-adapter-nexmon: 38 passed, 0 failed
https://claude.ai/code/session_01CdYAPvRTjcch6YrYf42n1z
2026-05-12 23:49:58 +00:00