using KArtSell.Modules.ModelOperations.Domain; namespace KArtSell.ModelOperations.UnitTests; public sealed class PromotionGateEvaluatorTests { [Fact] public void Passes_evidence_gate_but_still_requires_human_approval() { var snapshot = new ModelEvaluationSnapshot( "GLOBAL", "model-1", 504, 3, 0.08m, 0.01m, 0.70m, 0.10m, 0.97m, true, 0, true, DateTimeOffset.UtcNow); var result = PromotionGateEvaluator.Evaluate(snapshot, PromotionGateThresholds.ResearchBaseline); Assert.Equal(GateDecision.Pass, result.Decision); Assert.Empty(result.BlockingReasons); Assert.True(result.RequiresIndependentValidation); Assert.True(result.RequiresHumanApproval); Assert.Equal("EVIDENCE_ONLY_NO_AUTO_PROMOTION", result.Boundary); } [Fact] public void Holds_when_any_operational_integrity_error_exists() { var snapshot = new ModelEvaluationSnapshot( "GLOBAL", "model-1", 504, 3, 0.08m, 0.01m, 0.70m, 0.10m, 0.97m, true, 1, true, DateTimeOffset.UtcNow); var result = PromotionGateEvaluator.Evaluate(snapshot, PromotionGateThresholds.ResearchBaseline); Assert.Equal(GateDecision.Hold, result.Decision); Assert.Contains(result.BlockingReasons, reason => reason.Contains("Operational integrity", StringComparison.Ordinal)); } }