From bfcbf38c50f9e9bec65ada56938723d622f048d7 Mon Sep 17 00:00:00 2001 From: ruv Date: Sat, 30 May 2026 15:49:52 -0400 Subject: [PATCH] chore(swarm): clippy-clean + publish guard for ruview-swarm MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ruview-swarm src is now 0 clippy warnings across default/train/full feature sets (derive Default, targeted allows for intentional from_str + bounded casts + borrow-required index loops; removed redundant unsigned .max(0)) - publish = false until PR merges, internal path-deps publish in order, and ITAR (USML VIII(h)(12)) export sign-off — prevents accidental public publish Tests unchanged: 103 default / 108 train / 116 ruflo+itar / 120 full+train. (6 remaining clippy warnings are pre-existing in dependency wifi-densepose-core, out of scope for this crate.) Co-Authored-By: claude-flow --- v2/crates/ruview-swarm/Cargo.toml | 4 ++++ v2/crates/ruview-swarm/src/allocation/fnn.rs | 7 +++++-- v2/crates/ruview-swarm/src/bin/train_marl.rs | 2 ++ .../ruview-swarm/src/integration/swarm_sim.rs | 2 ++ v2/crates/ruview-swarm/src/marl/learning.rs | 17 +++++++---------- v2/crates/ruview-swarm/src/planning/patterns.rs | 11 ++++------- 6 files changed, 24 insertions(+), 19 deletions(-) diff --git a/v2/crates/ruview-swarm/Cargo.toml b/v2/crates/ruview-swarm/Cargo.toml index 321444f3..0e0436a4 100644 --- a/v2/crates/ruview-swarm/Cargo.toml +++ b/v2/crates/ruview-swarm/Cargo.toml @@ -4,6 +4,10 @@ version = "0.1.0" edition = "2021" description = "RuView drone swarm control system — hierarchical-mesh topology, Raft consensus, MARL, CSI sensing integration (ADR-148)" license = "Apache-2.0" +# Publishing disabled until: (1) PR #862 merges, (2) internal path-deps are +# published in dependency order, (3) export-control sign-off on the ITAR-gated +# coordination features (USML Category VIII(h)(12)). Flip to true deliberately. +publish = false [features] default = [] diff --git a/v2/crates/ruview-swarm/src/allocation/fnn.rs b/v2/crates/ruview-swarm/src/allocation/fnn.rs index f3a6985d..637dedfe 100644 --- a/v2/crates/ruview-swarm/src/allocation/fnn.rs +++ b/v2/crates/ruview-swarm/src/allocation/fnn.rs @@ -44,14 +44,17 @@ impl FnnScorer { /// Default weights initialised to a simple identity-like setup. pub fn default_weights() -> Self { // Simple: w1 diagonalish, others small constant + // Index needed: diagonal/strided init uses i for both row and column. let mut w1 = [[0.0f32; 5]; 16]; + #[allow(clippy::needless_range_loop)] for i in 0..5 { w1[i][i] = 1.0; } - for i in 5..16 { - w1[i][0] = 0.1; + for row in w1.iter_mut().take(16).skip(5) { + row[0] = 0.1; } let mut w2 = [[0.0f32; 16]; 8]; + #[allow(clippy::needless_range_loop)] for i in 0..8 { w2[i][i * 2] = 1.0; } diff --git a/v2/crates/ruview-swarm/src/bin/train_marl.rs b/v2/crates/ruview-swarm/src/bin/train_marl.rs index 93cedd0c..2f1e0504 100644 --- a/v2/crates/ruview-swarm/src/bin/train_marl.rs +++ b/v2/crates/ruview-swarm/src/bin/train_marl.rs @@ -284,6 +284,8 @@ async fn main() -> Result<(), Box> { let positions: Vec<(NodeId, Position3D)> = states.iter().map(|s| (s.id, s.position)).collect(); + // Index needed: mutates states[idx] while reading peer positions; borrow constraints. + #[allow(clippy::needless_range_loop)] for idx in 0..states.len() { let prev_pos = states[idx].position; let node_id = states[idx].id; diff --git a/v2/crates/ruview-swarm/src/integration/swarm_sim.rs b/v2/crates/ruview-swarm/src/integration/swarm_sim.rs index 9c392ff7..ba190ba8 100644 --- a/v2/crates/ruview-swarm/src/integration/swarm_sim.rs +++ b/v2/crates/ruview-swarm/src/integration/swarm_sim.rs @@ -314,6 +314,8 @@ pub async fn run_mission_with_report( // properly separated swarm records zero collision events. let min_sep = profile_config.formation.min_separation_m.max(1.5); let snapshot: Vec = drones.iter().map(|d| d.state.position).collect(); + // Index needed: mutates drones[i] while cross-indexing peers by index (i == j, i-j split). + #[allow(clippy::needless_range_loop)] for i in 0..drones.len() { let mut push = (0.0_f64, 0.0_f64); for (j, other) in snapshot.iter().enumerate() { diff --git a/v2/crates/ruview-swarm/src/marl/learning.rs b/v2/crates/ruview-swarm/src/marl/learning.rs index 989edfdf..f8cdd6bd 100644 --- a/v2/crates/ruview-swarm/src/marl/learning.rs +++ b/v2/crates/ruview-swarm/src/marl/learning.rs @@ -13,9 +13,10 @@ //! the gradient backend lives in `candle_ppo.rs` behind the `train` feature. /// Which self-learning strategy the swarm trains under. Selectable at runtime. -#[derive(Debug, Clone, Copy, PartialEq, Eq)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] pub enum LearningPattern { /// Centralized critic, decentralized execution (CTDE). + #[default] Mappo, /// Independent PPO — each agent learns alone, no shared critic. Ippo, @@ -25,15 +26,11 @@ pub enum LearningPattern { MetaRl, } -impl Default for LearningPattern { - fn default() -> Self { - LearningPattern::Mappo - } -} - impl LearningPattern { /// Parse from a short identifier. Unknown strings fall back to the default /// (Mappo). Accepts both canonical names and friendly aliases. + // Intentional inherent infallible parser (returns Self, not Result); shipped API. + #[allow(clippy::should_implement_trait)] pub fn from_str(s: &str) -> Self { match s.trim().to_ascii_lowercase().as_str() { "mappo" => LearningPattern::Mappo, @@ -122,7 +119,7 @@ impl CuriosityModule { pub fn visit_bonus(&mut self, x: f64, y: f64) -> f32 { let idx = self.cell_index(x, y); // count BEFORE increment, treated as at least 1 for the first visit. - let prior = self.counts[idx].max(0) + 1; + let prior = self.counts[idx] + 1; let bonus = self.beta / (prior as f32).sqrt(); self.counts[idx] = self.counts[idx].saturating_add(1); bonus @@ -169,8 +166,8 @@ impl MetaAdapter { /// leading dimensions; extra entries are ignored. pub fn adapt(&mut self, advantage: f32, feature_grad: &[f32]) { let n = self.fast.len().min(feature_grad.len()); - for i in 0..n { - self.fast[i] += self.inner_lr * advantage * feature_grad[i]; + for (f, &g) in self.fast.iter_mut().zip(feature_grad.iter()).take(n) { + *f += self.inner_lr * advantage * g; } } diff --git a/v2/crates/ruview-swarm/src/planning/patterns.rs b/v2/crates/ruview-swarm/src/planning/patterns.rs index 52b81bb2..506eb66a 100644 --- a/v2/crates/ruview-swarm/src/planning/patterns.rs +++ b/v2/crates/ruview-swarm/src/planning/patterns.rs @@ -10,9 +10,10 @@ use crate::types::{NodeId, Position3D}; -#[derive(Debug, Clone, Copy, PartialEq, Eq)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] pub enum FlightPattern { Boustrophedon, + #[default] PartitionedLawnmower, Spiral, Pheromone, @@ -20,13 +21,9 @@ pub enum FlightPattern { LevyFlight, } -impl Default for FlightPattern { - fn default() -> Self { - FlightPattern::PartitionedLawnmower - } -} - impl FlightPattern { + // Intentional inherent infallible parser (returns Self, not Result); shipped API. + #[allow(clippy::should_implement_trait)] pub fn from_str(s: &str) -> Self { match s.to_lowercase().as_str() { "boustrophedon" | "lawnmower" => FlightPattern::Boustrophedon,