diff --git a/crates/attractor/src/validation/rules.rs b/crates/attractor/src/validation/rules.rs index e45df775b..971eb34fe 100644 --- a/crates/attractor/src/validation/rules.rs +++ b/crates/attractor/src/validation/rules.rs @@ -94,12 +94,24 @@ impl LintRule for TerminalNodeRule { return vec![Diagnostic { rule: self.name().to_string(), severity: Severity::Error, - message: "Pipeline must have at least one terminal node (shape=Msquare or id exit/end)".to_string(), + message: "Pipeline must have exactly one terminal node (shape=Msquare or id exit/end)".to_string(), node_id: None, edge: None, fix: Some("Add a node with shape=Msquare or id 'exit'/'end'".to_string()), }]; } + if terminal_count > 1 { + return vec![Diagnostic { + rule: self.name().to_string(), + severity: Severity::Error, + message: format!( + "Pipeline must have exactly one terminal node, found {terminal_count}" + ), + node_id: None, + edge: None, + fix: Some("Remove extra terminal nodes so exactly one remains".to_string()), + }]; + } Vec::new() } }