From 0fede72ec41a26be25168e02367c0112ec42992b Mon Sep 17 00:00:00 2001 From: ruv Date: Sun, 31 May 2026 05:22:54 -0400 Subject: [PATCH] test(cog-pose): cross-language adapter integration (Python producer -> Rust engine) Closes the last verification gap in the calibration feature: previously the Python producer and Rust consumer were proven compatible only by format matching. Now a real ~11KB adapter fitted by cog_calibrate.py on the in-repo pose_v1.safetensors is committed as a fixture, and a Rust test loads it via the engine and asserts is_calibrated() + that it changes inference output. The full Python->Rust calibration contract is verified with a real artifact. 7/7 cog-pose tests pass. Co-Authored-By: claude-flow --- .../fixtures/sample_room.adapter.safetensors | Bin 0 -> 11064 bytes v2/crates/cog-pose-estimation/tests/smoke.rs | 31 ++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 v2/crates/cog-pose-estimation/tests/fixtures/sample_room.adapter.safetensors diff --git a/v2/crates/cog-pose-estimation/tests/fixtures/sample_room.adapter.safetensors b/v2/crates/cog-pose-estimation/tests/fixtures/sample_room.adapter.safetensors new file mode 100644 index 0000000000000000000000000000000000000000..783c7b9fef4a9e612e33f6db16d071c1c732543a GIT binary patch literal 11064 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ǪkPedpd-TRf{ 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 IUZYF?508AJ=>Px# literal 0 HcmV?d00001 diff --git a/v2/crates/cog-pose-estimation/tests/smoke.rs b/v2/crates/cog-pose-estimation/tests/smoke.rs index 9d5cda7b..395e51c3 100644 --- a/v2/crates/cog-pose-estimation/tests/smoke.rs +++ b/v2/crates/cog-pose-estimation/tests/smoke.rs @@ -133,6 +133,37 @@ fn per_room_adapter_changes_inference_output() { let _ = std::fs::remove_dir_all(&dir); } +#[test] +fn python_produced_adapter_loads_in_engine() { + // Cross-language contract: an adapter fitted by `aether-arena/calibration/cog_calibrate.py` + // (real LoRA on the cog conv+MLP head) must load + activate in this Rust engine. + let base = std::path::Path::new("cog/artifacts/pose_v1.safetensors"); + if !base.exists() { + eprintln!("(skipping — cog/artifacts/pose_v1.safetensors not present in cwd)"); + return; + } + let adapter = std::path::Path::new("tests/fixtures/sample_room.adapter.safetensors"); + assert!(adapter.exists(), "committed producer-generated adapter fixture is missing"); + + let base_eng = InferenceEngine::with_weights(Some(base)).expect("base load"); + let cal_eng = + InferenceEngine::with_weights_and_adapter(Some(base), Some(adapter)).expect("calibrated load"); + assert!(!base_eng.is_calibrated()); + assert!(cal_eng.is_calibrated(), "engine should report calibrated with the producer adapter"); + + // Non-zero input so the LoRA delta is exercised. + let win = cog_pose_estimation::inference::CsiWindow { + data: (0..INPUT_SUBCARRIERS * INPUT_TIMESTEPS) + .map(|i| ((i % 7) as f32 - 3.0) * 0.2) + .collect(), + }; + let a = base_eng.infer(&win).expect("base infer"); + let b = cal_eng.infer(&win).expect("calibrated infer"); + assert!(a.is_finite() && b.is_finite()); + let diff: f32 = a.keypoints.iter().zip(&b.keypoints).map(|(x, y)| (x - y).abs()).sum(); + assert!(diff > 1e-4, "python-produced adapter must change engine output (sum|Δ| = {diff})"); +} + #[test] fn manifest_roundtrips() { let spec = ManifestSpec::embedded("pose-estimation", "0.0.1");