From 3b00d81626338f68838424fe8b6875e3cac9549b Mon Sep 17 00:00:00 2001 From: aaltshuler Date: Sun, 5 Jul 2026 05:06:26 +0300 Subject: [PATCH] =?UTF-8?q?test(engine):=20red=20=E2=80=94=20NaN/Inf/zero?= =?UTF-8?q?=20embeddings=20pass=20validation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit iss-embedding-nan-validation: validate_and_normalize_embedding checks only dimension. The normalize guard (norm > f32::EPSILON) inverts on NaN — normalization is skipped and the raw NaN vector returns Ok; an Inf component normalizes to 0s + NaN; an all-zero vector (no direction, undefined under cosine/ANN) passes. All were unpinned. Fails as predicted against current code: unwrap_err() panics on the NaN case — the poisoned vector is returned Ok. --- crates/omnigraph/src/embedding.rs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/crates/omnigraph/src/embedding.rs b/crates/omnigraph/src/embedding.rs index 246836c8..53f6584d 100644 --- a/crates/omnigraph/src/embedding.rs +++ b/crates/omnigraph/src/embedding.rs @@ -780,6 +780,24 @@ mod tests { assert!(request.get("taskType").is_none()); } + #[test] + fn validate_and_normalize_embedding_rejects_non_finite_and_zero() { + // iss-embedding-nan-validation: a NaN component must be rejected — + // not silently returned un-normalized (NaN > EPSILON is false, so the + // normalize guard inverts and the raw NaN vector came back Ok). + let err = validate_and_normalize_embedding(vec![f32::NAN, 1.0], 2).unwrap_err(); + assert!(err.contains("finite"), "NaN must be rejected, got: {err}"); + // An Inf component must be rejected — not normalized into 0s + NaN. + let err = validate_and_normalize_embedding(vec![f32::INFINITY, 1.0], 2).unwrap_err(); + assert!(err.contains("finite"), "Inf must be rejected, got: {err}"); + let err = + validate_and_normalize_embedding(vec![1.0, f32::NEG_INFINITY], 2).unwrap_err(); + assert!(err.contains("finite"), "-Inf must be rejected, got: {err}"); + // An all-zero vector has no direction — undefined under cosine/ANN. + let err = validate_and_normalize_embedding(vec![0.0, 0.0], 2).unwrap_err(); + assert!(err.contains("zero"), "zero vector must be rejected, got: {err}"); + } + #[test] fn validate_and_normalize_embedding_enforces_dimension() { let normalized = validate_and_normalize_embedding(vec![3.0, 4.0], 2).unwrap();