diff --git a/crates/engine/src/tests/robustness.rs b/crates/engine/src/tests/robustness.rs
index dc9bac2d..1d3e3c71 100644
--- a/crates/engine/src/tests/robustness.rs
+++ b/crates/engine/src/tests/robustness.rs
@@ -202,10 +202,30 @@ fn fillet_into_an_earlier_round() {
}
}
-/// Seeds that run clean: no failure, no invalid body, no volume going the wrong way.
+/// Clean seeds and the original seed 5 edge contact, now rejected without distortion.
#[test]
fn fixed_seeds_run_clean() {
for seed in FIXED_SEEDS {
+ if *seed == 5 {
+ // Seed 5 originally joined these boxes along only an edge. Accepting
+ // it required silently shifting the tool; that is now invalid input.
+ let mut s = Session::default();
+ run(&mut s, "solid.box", json!({"length": 25, "width": 15, "height": 10}));
+ let error = s
+ .execute(
+ "solid.box",
+ &json!({
+ "corner": [25, 2.5, 10], "length": 17.5, "width": 17.5,
+ "height": 20, "operation": "join"
+ }),
+ )
+ .unwrap_err();
+ assert!(error.to_string().contains("zero-thickness edge contact"), "{error}");
+ assert!((total_volume(&s) - 3750.0).abs() < 1e-6);
+ assert_eq!(s.model.state().bodies.len(), 1);
+ assert!(s.model.state().bodies.first().unwrap().body.validity().is_empty());
+ continue;
+ }
let r = fuzz::run(*seed, 8);
assert!(!r.outcome.is_bug(), "seed {seed}: {:?}\n{}", r.outcome, r.script());
}
diff --git a/crates/kernel/src/ops.rs b/crates/kernel/src/ops.rs
index 55671441..045f48ba 100644
--- a/crates/kernel/src/ops.rs
+++ b/crates/kernel/src/ops.rs
@@ -171,7 +171,7 @@ thread_local! {
/// everything or an intersection of disjoint bodies. Results are checked against volume bounds
/// and retried with shifted copies and other tolerances when they fail or look wrong.
pub fn boolean(a: &Body, b: &Body, op: BoolOp) -> Result