Technical design document for the Axiom Cascade engineering change engine — covering the product knowledge graph traversal architecture, parallel approval orchestration, effectivity state machine, cross-system atomic propagation, and predictive change analytics pipeline.
// Cascade impact traversal — Rust implementation pub fn compute_impact( graph: &ProductKnowledgeGraph, seed: NodeId, filters: &[RelationshipType], max_depth: Option<u32>, ) -> ImpactReport { let mut visited: HashSet<NodeId> = HashSet::new(); let mut queue: VecDeque<(NodeId, u32)> = VecDeque::new(); let mut report = ImpactReport::new(seed); queue.push_back((seed, 0)); visited.insert(seed); while let Some((node, depth)) = queue.pop_front() { if max_depth.map_or(false, |d| depth >= d) { continue; } // Traverse all filtered relationships from current node for edge in graph.edges_from(node, filters) { let target = edge.target(); if visited.insert(target) { // Classify the reached node by domain match graph.node_domain(target) { Domain::BOM(view) => report.add_bom_impact(target, view), Domain::Procurement => report.add_po_impact(target), Domain::Manufacturing => report.add_wo_impact(target), Domain::Quality => report.add_qual_impact(target), Domain::Regulatory => report.add_reg_impact(target), Domain::Supplier => report.add_supplier_impact(target), } queue.push_back((target, depth + 1)); } } } report.estimate_cost(graph); // Roll up financial impact report }
// Effectivity state machine — temporal BOM resolution pub enum EffectivityMode { DateBased { start: DateTime, end: Option<DateTime> }, UnitBased { from_serial: u64, to_serial: Option<u64> }, LotBased { lot_ids: Vec<LotId> }, ProductionOrder { order_ids: Vec<OrderId> }, } pub enum DispositionAction { UseAsIs, // Existing stock acceptable under new revision Rework { instructions: WorkInstruction }, Scrap { write_off_value: Currency }, ReturnToVendor { rma_id: RmaId }, } // Resolve BOM for a specific unit at a specific time pub fn resolve_bom( product: ProductId, serial: Option<u64>, at_time: DateTime, ) -> ResolvedBOM { graph.bom_edges(product) .filter(|e| e.effectivity.is_valid_at(serial, at_time)) .collect() }
| Lifecycle Segment | Typical Time (Before) | Cascade Target | Primary Bottleneck |
|---|---|---|---|
| Initiation → Impact Analysis | 2-5 days (manual BOM trace) | <10 seconds (graph traversal) | Manual where-used analysis |
| Impact Analysis → First Approval | 1-3 days (report distribution) | Immediate (auto-dispatch) | Report formatting and routing |
| First Approval → Last Approval | 5-10 days (sequential routing) | 1-3 days (parallel DAG) | Sequential approval chains |
| Approval → ERP Release | 1-2 days (manual entry) | Immediate (atomic event) | Manual BOM re-entry in ERP |
| ERP Release → Floor Verification | 1-5 days (paper distribution) | <1 day (barcode enforcement) | Paper traveler distribution |