# Integration Roadmap: agentic-robotics into ruvector **Document Class:** Implementation Plan **Version:** 1.0.0 **Date:** 2026-02-27 **Timeline:** 18 weeks (6 phases) --- ## Phase 0: Foundation (Week 1-2) ### Objective Integrate agentic-robotics crates into the ruvector workspace with clean builds and passing tests. ### 0.1 Workspace Integration Add the 6 agentic-robotics crates as workspace members. Required changes to root `Cargo.toml`: ```toml [workspace] members = [ # ... existing 114 members ... # Agentic Robotics Integration "crates/agentic-robotics-core", "crates/agentic-robotics-rt", "crates/agentic-robotics-mcp", "crates/agentic-robotics-embedded", "crates/agentic-robotics-node", "crates/agentic-robotics-benchmarks", ] ``` ### 0.2 Dependency Resolution New workspace dependencies to add: ```toml [workspace.dependencies] # Robotics middleware zenoh = "1.0" rustdds = "0.11" cdr = "0.2" hdrhistogram = "7.5" wide = "0.7" ``` ### 0.3 Version Alignment | Dependency | Current ruvector | agentic-robotics | Action | |-----------|-----------------|-----------------|--------| | tokio | 1.41 | 1.47 | Upgrade to 1.47 | | napi | 2.16 | 3.0 | Keep separate initially | | thiserror | 2.0 | 2.0 | No action | | rkyv | 0.8 | 0.8 | No action | ### 0.4 Crate Cargo.toml Adaptation Each agentic-robotics crate needs its Cargo.toml updated to reference ruvector workspace dependencies instead of its own workspace: ```toml # Before (agentic-robotics workspace) [dependencies] tokio = { workspace = true } # After (ruvector workspace - add explicit versions where needed) [dependencies] tokio = { version = "1.47", features = ["full", "rt-multi-thread", "time"] } ``` Or better: add robotics-specific deps to the ruvector workspace `[workspace.dependencies]` section. ### 0.5 CI Pipeline Updates Add to `.github/workflows/`: - Build agentic-robotics crates in CI - Run agentic-robotics tests - Feature-gate robotics builds to avoid slowing default CI ### Deliverables - [ ] All 6 crates compile within ruvector workspace - [ ] All existing ruvector tests still pass - [ ] All agentic-robotics tests pass - [ ] CI pipeline updated --- ## Phase 1: Bridge Layer (Week 3-4) ### Objective Create adapter crate that converts between agentic-robotics and ruvector data types. ### New Crate: `ruvector-robotics-bridge` ```toml [package] name = "ruvector-robotics-bridge" version.workspace = true edition.workspace = true [dependencies] agentic-robotics-core = { path = "../agentic-robotics-core" } ruvector-core = { path = "../ruvector-core", features = ["storage"] } tokio = { workspace = true } serde = { workspace = true } tracing = { workspace = true } ``` ### 1.1 Data Type Converters ```rust //! src/converters.rs use agentic_robotics_core::message::{PointCloud, Point3D, RobotState, Pose}; /// Convert PointCloud to Vec of 3D vectors for HNSW indexing pub fn pointcloud_to_vectors(cloud: &PointCloud) -> Vec> { cloud.points.iter() .map(|p| vec![p.x, p.y, p.z]) .collect() } /// Convert PointCloud to Vec of f64 vectors (ruvector native format) pub fn pointcloud_to_f64_vectors(cloud: &PointCloud) -> Vec> { cloud.points.iter() .map(|p| vec![p.x as f64, p.y as f64, p.z as f64]) .collect() } /// Convert RobotState to 7D feature vector [px, py, pz, vx, vy, vz, t] pub fn state_to_vector(state: &RobotState) -> Vec { let mut v = Vec::with_capacity(7); v.extend_from_slice(&state.position); v.extend_from_slice(&state.velocity); v.push(state.timestamp as f64); v } /// Convert Pose to 7D feature vector [px, py, pz, qx, qy, qz, qw] pub fn pose_to_vector(pose: &Pose) -> Vec { let mut v = Vec::with_capacity(7); v.extend_from_slice(&pose.position); v.extend_from_slice(&pose.orientation); v } /// Convert HNSW search results back to Point3D pub fn vectors_to_points(vectors: &[Vec]) -> Vec { vectors.iter() .map(|v| Point3D { x: v[0] as f32, y: v[1] as f32, z: v.get(2).copied().unwrap_or(0.0) as f32, }) .collect() } ``` ### 1.2 Auto-Indexing Subscriber ```rust //! src/indexing.rs use agentic_robotics_core::subscriber::Subscriber; use agentic_robotics_core::message::PointCloud; use ruvector_core::vector_db::VectorDb; use std::sync::Arc; use tokio::sync::RwLock; /// Subscriber that automatically indexes incoming PointCloud data pub struct IndexingSubscriber { subscriber: Subscriber, db: Arc>, frame_count: u64, } impl IndexingSubscriber { pub fn new(topic: &str, db: Arc>) -> Self { Self { subscriber: Subscriber::new(topic), db, frame_count: 0, } } /// Run the indexing loop (call from RT executor) pub async fn run(&mut self) { loop { match self.subscriber.recv_async().await { Ok(cloud) => { let vectors = super::converters::pointcloud_to_f64_vectors(&cloud); let mut db = self.db.write().await; for vector in &vectors { let _ = db.insert(vector); } self.frame_count += 1; tracing::debug!("Indexed frame {} ({} points)", self.frame_count, vectors.len()); } Err(e) => { tracing::warn!("Subscriber error: {}", e); } } } } } ``` ### 1.3 Search Publisher ```rust //! src/search.rs use agentic_robotics_core::publisher::Publisher; use agentic_robotics_core::message::Message; use ruvector_core::vector_db::VectorDb; use serde::{Serialize, Deserialize}; /// Search result message published back to robot topics #[derive(Debug, Clone, Serialize, Deserialize)] pub struct SearchResult { pub query_id: u64, pub neighbors: Vec, pub latency_us: u64, } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct Neighbor { pub id: u64, pub distance: f64, pub vector: Vec, } impl Message for SearchResult { fn type_name() -> &'static str { "ruvector_msgs/SearchResult" } } ``` ### Deliverables - [ ] `ruvector-robotics-bridge` crate created - [ ] Converter functions with unit tests - [ ] IndexingSubscriber with integration test - [ ] SearchResult message type defined - [ ] Documentation with usage examples --- ## Phase 2: Perception Pipeline (Week 5-7) ### Objective Build GNN-based perception using ruvector ML modules with RT scheduling. ### New Crate: `ruvector-robotics-perception` ### 2.1 Scene Graph Builder ```rust //! Convert PointCloud + obstacles into ruvector graph for GNN processing pub struct SceneGraphBuilder { adjacency_radius: f64, max_nodes: usize, } impl SceneGraphBuilder { pub fn build(&self, cloud: &PointCloud, obstacles: &[Obstacle]) -> SceneGraph { let mut graph = SceneGraph::new(); // Add obstacle nodes with spatial features for (i, obs) in obstacles.iter().enumerate() { graph.add_node(i, obs.to_features()); } // Add edges based on spatial proximity for i in 0..obstacles.len() { for j in (i+1)..obstacles.len() { let dist = distance(&obstacles[i].position, &obstacles[j].position); if dist < self.adjacency_radius { graph.add_edge(i, j, dist); } } } graph } } ``` ### 2.2 RT-Scheduled Inference ```rust //! Schedule GNN inference on the high-priority runtime use agentic_robotics_rt::{ROS3Executor, Priority, Deadline}; pub struct PerceptionEngine { executor: ROS3Executor, scene_builder: SceneGraphBuilder, } impl PerceptionEngine { /// Process point cloud with deadline-aware inference pub fn process(&self, cloud: PointCloud, deadline_us: u64) { let builder = self.scene_builder.clone(); let deadline = Duration::from_micros(deadline_us); self.executor.spawn_rt( Priority(3), Deadline(deadline), async move { let scene = builder.build(&cloud, &[]); // GNN forward pass here tracing::info!("Scene processed: {} nodes", scene.node_count()); }, ); } } ``` ### Deliverables - [ ] SceneGraphBuilder from PointCloud data - [ ] GNN-based object classification pipeline - [ ] RT-scheduled inference with latency tracking - [ ] Attention-weighted decision fusion - [ ] Benchmark: sensor-to-decision < 2ms target --- ## Phase 3: MCP Tool Exposure (Week 8-9) ### Objective Register ruvector capabilities as MCP tools accessible to AI assistants. ### 3.1 Tool Definitions Register these 10 tools with the MCP server: ```rust use agentic_robotics_mcp::{McpServer, McpTool, ToolHandler, tool, text_response}; use serde_json::json; pub async fn register_ruvector_tools(server: &McpServer) -> anyhow::Result<()> { // 1. Vector Search server.register_tool( McpTool { name: "vector_search".into(), description: "Search for nearest vectors in HNSW index".into(), input_schema: json!({ "type": "object", "properties": { "query": { "type": "array", "items": { "type": "number" } }, "k": { "type": "integer", "default": 10 }, "metric": { "type": "string", "enum": ["l2", "cosine", "dot"] } }, "required": ["query"] }), }, tool(|args| { let query: Vec = serde_json::from_value(args["query"].clone())?; let k = args["k"].as_u64().unwrap_or(10) as usize; // Perform HNSW search Ok(text_response(format!("Found {} nearest neighbors", k))) }), ).await?; // 2. GNN Classify server.register_tool( McpTool { name: "gnn_classify".into(), description: "Classify a graph structure using GNN".into(), input_schema: json!({ "type": "object", "properties": { "nodes": { "type": "array" }, "edges": { "type": "array" } } }), }, tool(|args| Ok(text_response("Classification: obstacle"))), ).await?; // 3. Attention Focus server.register_tool( McpTool { name: "attention_focus".into(), description: "Apply attention to select important features".into(), input_schema: json!({ "type": "object", "properties": { "features": { "type": "array", "items": { "type": "array" } }, "query": { "type": "array", "items": { "type": "number" } } } }), }, tool(|args| Ok(text_response("Attention weights computed"))), ).await?; // 4. Trajectory Predict server.register_tool( McpTool { name: "trajectory_predict".into(), description: "Predict future trajectory from state history".into(), input_schema: json!({ "type": "object", "properties": { "states": { "type": "array" }, "horizon": { "type": "integer", "default": 10 } } }), }, tool(|args| Ok(text_response("Trajectory predicted: 10 waypoints"))), ).await?; // 5. Scene Graph Analyze server.register_tool( McpTool { name: "scene_analyze".into(), description: "Build and analyze scene graph from sensor data".into(), input_schema: json!({ "type": "object", "properties": { "points": { "type": "array" }, "radius": { "type": "number", "default": 1.0 } } }), }, tool(|args| Ok(text_response("Scene: 12 objects, 3 obstacles"))), ).await?; // 6. Anomaly Detect server.register_tool( McpTool { name: "anomaly_detect".into(), description: "Detect anomalies using sparse inference".into(), input_schema: json!({ "type": "object", "properties": { "data": { "type": "array", "items": { "type": "number" } }, "threshold": { "type": "number", "default": 0.95 } } }), }, tool(|args| Ok(text_response("No anomalies detected (score: 0.12)"))), ).await?; // 7. Memory Store server.register_tool( McpTool { name: "memory_store".into(), description: "Store an experience/episode in AgentDB memory".into(), input_schema: json!({ "type": "object", "properties": { "key": { "type": "string" }, "content": { "type": "string" }, "embedding": { "type": "array", "items": { "type": "number" } } }, "required": ["key", "content"] }), }, tool(|args| Ok(text_response("Episode stored successfully"))), ).await?; // 8. Memory Recall server.register_tool( McpTool { name: "memory_recall".into(), description: "Recall similar memories via semantic search".into(), input_schema: json!({ "type": "object", "properties": { "query": { "type": "string" }, "k": { "type": "integer", "default": 5 } }, "required": ["query"] }), }, tool(|args| Ok(text_response("Recalled 5 similar episodes"))), ).await?; // 9. Cluster Status server.register_tool( McpTool { name: "cluster_status".into(), description: "Get distributed cluster health and status".into(), input_schema: json!({ "type": "object", "properties": {} }), }, tool(|_| Ok(text_response("Cluster: 3 nodes, leader: node-0, healthy"))), ).await?; // 10. Model Update server.register_tool( McpTool { name: "model_update".into(), description: "Trigger online model fine-tuning with new data".into(), input_schema: json!({ "type": "object", "properties": { "model_id": { "type": "string" }, "training_data": { "type": "array" } }, "required": ["model_id"] }), }, tool(|args| { let model_id = args["model_id"].as_str().unwrap_or("default"); Ok(text_response(format!("Model {} update queued", model_id))) }), ).await?; Ok(()) } ``` ### Deliverables - [ ] 10 MCP tools registered and functional - [ ] Each tool backed by actual ruvector operations - [ ] MCP tool integration tests - [ ] TypeScript example using tools via MCP client --- ## Phase 4: Cognitive Robotics (Week 10-13) ### Objective Integrate ruvector's cognitive architecture modules for autonomous robot intelligence. ### 4.1 Nervous System Integration Connect `ruvector-nervous-system` to robot sensing/actuation cycle: - Sensory cortex: processes PointCloud and sensor data - Motor cortex: generates movement commands - Prefrontal cortex: planning and decision making - Hippocampus: spatial memory via HNSW index - Cerebellum: fine motor control calibration ### 4.2 SONA Self-Learning Integrate `sona` crate for autonomous skill acquisition: - Robot experiences stored as episodes in AgentDB - Self-optimizing neural architecture learns from rewards - Policy improvement without manual retraining - Transfer learning across robot configurations ### 4.3 Economy System Use `ruvector-economy-wasm` for resource-aware planning: - Energy budget for robot operations - Computational budget for inference tasks - Task prioritization based on resource availability - Multi-robot resource negotiation ### 4.4 Delta Consensus for Multi-Robot Use `ruvector-delta-consensus` for fleet coordination: - Shared world model across robot fleet - Consistent task assignment via distributed consensus - Fault-tolerant operation with Raft leader election - Incremental state synchronization ### Deliverables - [ ] Nervous system integration crate - [ ] SONA learning pipeline for robot skills - [ ] Resource-aware task planner - [ ] Multi-robot consensus coordination - [ ] Demo: autonomous navigation with learning --- ## Phase 5: Edge Deployment (Week 14-16) ### Objective Optimize for constrained deployment targets. ### 5.1 WASM Builds - `ruvector-robotics-bridge-wasm` for browser-based simulation - Web-based robot control interface - WASM-compiled GNN for edge inference ### 5.2 Embedded Deployment - Integrate `agentic-robotics-embedded` with `rvlite` - Minimal vector search on ARM Cortex-M - `ruvector-sparse-inference` for compact models - Feature-flag everything non-essential ### 5.3 FPGA Acceleration - `ruvector-fpga-transformer` for hardware-accelerated inference - Custom attention kernels for real-time processing - FPGA + ARM SoC deployment profile ### 5.4 Resource Profiles | Profile | Memory | CPU | Capabilities | |---------|--------|-----|-------------| | Full | 1GB+ | 4+ cores | All features | | Standard | 256MB | 2 cores | Core + GNN + search | | Lite | 64MB | 1 core | Search + sparse inference | | Embedded | 4MB | MCU | Minimal vector search | ### Deliverables - [ ] WASM build for browser simulation - [ ] Embedded build for ARM targets - [ ] FPGA deployment configuration - [ ] Resource profile documentation --- ## Phase 6: Benchmarking and Validation (Week 17-18) ### Objective Comprehensive performance validation of the integrated platform. ### 6.1 Latency Targets | Pipeline | Target | Measurement Method | |----------|--------|-------------------| | Sensor ingestion | <1us | CDR deserialization benchmark | | PointCloud -> vectors | <10us | Conversion benchmark | | HNSW search (10K vectors) | <500us | Criterion benchmark | | GNN inference (small graph) | <1ms | RT-scheduled benchmark | | End-to-end sensor->decision | <2ms | Full pipeline benchmark | | MCP tool call | <5ms | JSON-RPC round-trip | ### 6.2 Throughput Targets | Operation | Target | Conditions | |-----------|--------|-----------| | Message serialization | >1M/sec | CDR format | | Vector insertions | >100K/sec | During RT control | | Vector searches | >10K/sec | Concurrent with control | | GNN classifications | >500/sec | RT-scheduled | ### 6.3 Memory Targets | Deployment | Target | Includes | |-----------|--------|---------| | Full platform | <500MB | All modules loaded | | Core + perception | <200MB | Without cognitive | | Edge deployment | <100MB | rvlite + sparse | | Embedded | <4MB | Minimal search | ### 6.4 Competitive Comparison | Metric | ruvector+robotics | ROS2+PyTorch | Isaac Sim | Drake | |--------|------------------|-------------|-----------|-------| | Sensor->Decision | <2ms | 10-50ms | GPU-dependent | 5-20ms | | Memory (edge) | <100MB | >1GB | >4GB | >500MB | | ML native | Yes | Via bridge | CUDA only | No | | MCP support | Yes | No | No | No | | WASM deploy | Yes | No | No | No | | Language safety | Rust | C++/Python | Python | C++ | ### Deliverables - [ ] Complete benchmark suite (Criterion) - [ ] CI-gated performance regression tests - [ ] Competitive comparison report - [ ] Performance optimization guide --- ## Dependency Resolution Table | Dependency | ruvector Version | agentic-robotics Version | Unified Version | Notes | |-----------|-----------------|-------------------------|----------------|-------| | tokio | 1.41 | 1.47 | 1.47 | Minor bump, compatible | | serde | 1.0 | 1.0 | 1.0 | Identical | | serde_json | 1.0 | 1.0 | 1.0 | Identical | | rkyv | 0.8 | 0.8 | 0.8 | Identical | | crossbeam | 0.8 | 0.8 | 0.8 | Identical | | rayon | 1.10 | 1.10 | 1.10 | Identical | | parking_lot | 0.12 | 0.12 | 0.12 | Identical | | nalgebra | 0.33 | 0.33 | 0.33 | Unify features | | napi | 2.16 | 3.0 | Separate | Coordinate upgrade later | | napi-derive | 2.16 | 3.0 | Separate | Coordinate upgrade later | | criterion | 0.5 | 0.5 | 0.5 | Identical | | thiserror | 2.0 | 2.0 | 2.0 | Identical | | anyhow | 1.0 | 1.0 | 1.0 | Identical | | tracing | 0.1 | 0.1 | 0.1 | Identical | | rand | 0.8 | 0.8 | 0.8 | Identical | | zenoh | N/A | 1.0 | 1.0 | New addition | | rustdds | N/A | 0.11 | 0.11 | New addition | | cdr | N/A | 0.2 | 0.2 | New addition | | hdrhistogram | N/A | 7.5 | 7.5 | New addition | | wide | N/A | 0.7 | 0.7 | New addition | --- ## Risk Register | # | Risk | Probability | Impact | Mitigation | |---|------|------------|--------|------------| | 1 | Zenoh dependency tree adds 50+ transitive deps | High | Medium | Feature-gate behind `robotics` flag | | 2 | Tokio version mismatch causes runtime conflicts | Low | High | Upgrade to 1.47 in Phase 0 | | 3 | NAPI 2.16 vs 3.0 prevents unified Node.js package | Medium | Medium | Separate npm packages initially | | 4 | Combined workspace compile time exceeds CI limits | High | Medium | Incremental builds, feature flags, split CI | | 5 | Zenoh runtime conflicts with ruvector async code | Low | High | Isolate Zenoh in dedicated Tokio runtime | | 6 | GNN inference exceeds RT deadline budget | Medium | High | Model quantization, early exit, async fallback | | 7 | Memory pressure from combined modules on edge | Medium | Medium | rvlite profile, lazy module loading | | 8 | Benchmark API drift in agentic-robotics-benchmarks | High | Low | Fix benchmarks in Phase 0 | | 9 | MCP tool handlers need async but current API is sync | Medium | Medium | Add `AsyncToolHandler` variant | | 10 | CDR serialization overhead for large vector payloads | Low | Low | Use rkyv for internal paths, CDR only at boundary | | 11 | Embedded targets incompatible with ruvector std deps | Medium | Medium | Strict no_std boundary in rvlite | | 12 | Multi-robot consensus overhead exceeds latency budget | Low | Medium | Async consensus, eventual consistency | --- ## Success Metrics ### Phase 0 - All 6 agentic-robotics crates compile in ruvector workspace - Zero test regressions in existing ruvector tests - CI pipeline includes robotics builds ### Phase 1 - Bridge crate converts all 3 message types (PointCloud, RobotState, Pose) - IndexingSubscriber indexes 10K points/frame at >100 FPS - Search latency <500us for 10K indexed vectors ### Phase 2 - End-to-end perception pipeline: sensor -> GNN -> decision - Inference latency <1ms on standard hardware - Attention mechanism reduces feature space by >50% ### Phase 3 - 10 MCP tools registered and callable - Tool call round-trip <5ms - TypeScript client can invoke all tools ### Phase 4 - Robot learns new navigation skill from 100 episodes - Multi-robot fleet maintains consistent world model - Resource-aware planner reduces energy usage by >20% ### Phase 5 - WASM build under 5MB - Embedded build under 4MB - FPGA inference <100us ### Phase 6 - All latency targets met - All throughput targets met - Performance regression CI gates active --- ## Open Questions 1. **Zenoh vs custom transport**: Should we use Zenoh for all inter-module communication, or keep crossbeam channels for intra-process and Zenoh only for inter-process? 2. **NAPI version strategy**: Should we upgrade all ruvector -node crates to napi 3.0 in Phase 0, or maintain version separation? 3. **Workspace partitioning**: Should agentic-robotics crates live under `crates/agentic-robotics-*/` or be renamed to `crates/ruvector-robotics-*/` for consistency? 4. **Feature flag granularity**: One `robotics` feature flag or separate flags per capability (`robotics-core`, `robotics-rt`, `robotics-mcp`)? 5. **GNN model format**: What format for pre-trained GNN models? ONNX? Custom ruvector format? In-memory only? 6. **MCP async handlers**: The current `ToolHandler` type is synchronous. Should we extend to `AsyncToolHandler` for ruvector operations that are inherently async? 7. **Testing strategy**: Integration tests between robotics and ML modules -- how to mock sensor data realistically? 8. **Multi-robot consensus protocol**: Raft (agentic-robotics-core via Zenoh) vs Delta Consensus (ruvector-delta-consensus)? Or both for different consistency levels? 9. **WASM deployment scope**: Which ruvector modules should be available in the WASM robotics build? Full GNN or inference-only? 10. **Formal verification**: Can `lean-agentic` verify safety properties of the combined robotics+ML pipeline?