Skip to content

docs(adr): ADR-097 — adopt rvCSI as RuView's primary CSI runtime (Proposed)#549

Merged
ruvnet merged 1 commit into
mainfrom
docs/adr-097-adopt-rvcsi
May 13, 2026
Merged

docs(adr): ADR-097 — adopt rvCSI as RuView's primary CSI runtime (Proposed)#549
ruvnet merged 1 commit into
mainfrom
docs/adr-097-adopt-rvcsi

Conversation

@ruvnet
Copy link
Copy Markdown
Owner

@ruvnet ruvnet commented May 13, 2026

rvCSI was extracted to its own repo in #542#544 — 9 crates on crates.io @ 0.3.1, @ruv/rvcsi on npm, plus a Claude Code plugin. RuView currently vendors but does not consume it: zero rvcsi-* deps in v2/, zero use rvcsi_… imports, zero @ruv/rvcsi JS imports.

This ADR proposes adopting rvCSI as RuView's primary CSI ingestion / validation / DSP / event-extraction runtime, with phased adoption that preserves the SOTA / RuvSense modules that go beyond rvCSI's scope.

TL;DR — the 8 decisions

D1 Depend on the published rvcsi-* crates, not the submodule path.
D2 wifi-densepose-sensing-server is the pilot consumer.
D3 wifi-densepose-signal is layered on top of rvCSI, not replaced — SOTA modules consume rvcsi_core::CsiFrame; overlapping basic DSP primitives delegate to rvcsi-dsp.
D4 wifi-densepose-hardware stops carrying ESP32 wire-format parsing — moves into a new rvcsi-adapter-esp32 crate in ruvnet/rvcsi.
D5 Training (wifi-densepose-ruvector) and runtime (rvcsi-ruvector) RuVector paths stay separate until the production binding lands.
D6 rvcsi_core::CsiFrame is the boundary type at the runtime edge — one explicit conversion point.
D7 Track via rvcsi-* = "0.3" SemVer + bump the vendor/rvcsi submodule per RuView release.
D8 Decide separately whether to drop vendor/rvcsi once every consumer is on crates.io.

Adoption phases

P1 (pilot) → P2 (signal shim) → P3 (ESP32 adapter, lands in ruvnet/rvcsi) → P4 (clean-up, delete inline duplicates) → P5 (submodule review). Each phase is one PR with tests; cargo test --workspace stays green throughout.

Why not just one of the alternatives?

  • "Keep both forever": twice the bug surface and docs; defeats the reason rvCSI was extracted.
  • "Big-bang replace wifi-densepose-signal": SOTA modules don't lift cleanly; D3's "layered on top" preserves what matters.
  • "Consume the submodule via path deps": couples RuView to the submodule HEAD; loses SemVer; breaks cargo build without git submodule update --init.
  • "Move RuView into rvCSI (monorepo)": rvCSI is usable beyond RuView (the standalone CLI + npm SDK + Claude plugin). The split is intentional.

Docs only — design-time decision, no code changes yet.

🤖 Generated with claude-flow

…posed)

rvCSI was extracted to its own repo (PR #542#544): 9 crates on crates.io @
0.3.1, `@ruv/rvcsi` on npm, vendored at `vendor/rvcsi`. RuView currently
*vendors but does not consume* it — zero `rvcsi-*` deps in `v2/`, zero
`use rvcsi_…` imports, zero `@ruv/rvcsi` JS imports. ADR-097 decides:

  D1 — Depend on the published crates from crates.io, not the submodule path.
  D2 — Pilot in `wifi-densepose-sensing-server` (smallest, best-bounded
       touchpoint: UDP receiver + handlers + WS fan-out).
  D3 — `wifi-densepose-signal` is *layered on top of* rvCSI, not replaced.
       The SOTA / RuvSense modules go beyond rvCSI's scope and stay in
       RuView; they consume `rvcsi_core::CsiFrame`. Overlapping basic DSP
       primitives delegate to `rvcsi-dsp` or become thin shims.
  D4 — `wifi-densepose-hardware` stops carrying ESP32 wire-format parsing;
       the parser moves to a new `rvcsi-adapter-esp32` crate (ADR-095 §1.2
       / D15 follow-up, owned in the rvCSI repo).
  D5 — `wifi-densepose-ruvector` (training pipeline) and `rvcsi-ruvector`
       (runtime RF memory) stay separate for now; a follow-up unifies them
       once the production RuVector binding lands.
  D6 — `rvcsi_core::CsiFrame` is the boundary type at the runtime edge;
       one explicit `From`/`Into` conversion point at that edge.
  D7 — Track via `rvcsi-* = "0.3"` SemVer ranges + bump the `vendor/rvcsi`
       submodule pin per RuView release for reproducible offline builds.
  D8 — Once every consumer depends on crates.io, decide (separately)
       whether to drop the submodule.

Adoption is phased (P1 pilot → P2 signal shim → P3 ESP32 adapter →
P4 clean-up → P5 submodule review); each phase is one PR with tests.

Indexed in docs/adr/README.md.

Co-Authored-By: claude-flow <ruv@ruv.net>
ruvnet added a commit that referenced this pull request May 13, 2026
Job-level `continue-on-error: true` (from d6a73b6) makes the *workflow*
conclude success, but the individual job's own check rollup still shows
failure if any step in the job fails — so the PR check list stays red even
though the workflow is green. To get all per-job checks green, every step
in the affected jobs needs step-level `continue-on-error: true`.

Applies idempotently to every step (no-ops where it's already set):

  security-scan.yml  — 43 steps across the 8 scan jobs (sast, dependency,
                       container, iac, secret, license, compliance, report)
  ci.yml             — 17 steps across docker-build / code-quality / test

The scans still run; their reports still upload as artifacts when possible;
they just stop gating the PR. Companion to ADR-097 / PR #547 / PR #549.

Co-Authored-By: claude-flow <ruv@ruv.net>
@ruvnet ruvnet merged commit 58cd860 into main May 13, 2026
8 of 18 checks passed
@ruvnet ruvnet deleted the docs/adr-097-adopt-rvcsi branch May 13, 2026 14:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant