rivox 1.0.0

Universal polyglot build coordination layer for Python, Rust, and Node monorepos
Documentation
use crate::graph::GraphNode;
use anyhow::{Result, bail};

pub struct ConformanceSuite;

impl ConformanceSuite {
    pub fn verify_equivalence(rivox_nodes: &[GraphNode], native_nodes: &[GraphNode]) -> Result<()> {
        if rivox_nodes.len() != native_nodes.len() {
            bail!(
                "Equivalence mismatch: Rivox resolved {} nodes but native tool resolved {}",
                rivox_nodes.len(),
                native_nodes.len()
            );
        }

        for node in rivox_nodes {
            let matched = native_nodes.iter().any(|n| {
                n.ecosystem == node.ecosystem
                    && n.package_name == node.package_name
                    && n.resolved_version == node.resolved_version
            });

            if !matched {
                bail!(
                    "Equivalence failure: Node {}:{} ({}) in Rivox graph missing from native resolution",
                    node.ecosystem,
                    node.package_name,
                    node.resolved_version
                );
            }
        }

        Ok(())
    }
}