# Property-Based Tests (FsCheck) ## Module Policy ## Status IMPLEMENTED ## Description Property-based tests using FsCheck for canonical JSON determinism, SBOM/VEX ordering invariants, floating-point stability, digest computation determinism, smart-diff properties, and VEX lattice merge commutativity. ## Implementation Details - **DecayPropertyTests**: `src/Policy/__Tests/StellaOps.Policy.Determinization.Tests/PropertyTests/DecayPropertyTests.cs` - FsCheck properties for DecayedConfidenceCalculator: monotonicity, bounds, floor enforcement, half-life correctness - Verifies: decay factor always in [0, 1], result always >= floor, older observations have lower scores - **DeterminismPropertyTests**: `src/Policy/__Tests/StellaOps.Policy.Determinization.Tests/PropertyTests/DeterminismPropertyTests.cs` - FsCheck properties for deterministic evaluation: same inputs produce same outputs - Verifies: ObservationDecay CalculateDecay is deterministic, content-addressed ID generation is stable - **ObservationDecayTests**: `src/Policy/__Tests/StellaOps.Policy.Determinization.Tests/Models/ObservationDecayTests.cs` - Unit tests for ObservationDecay model: Create, Fresh, WithSettings, CalculateDecay, CheckIsStale - **DeterminizationResultTests**: `src/Policy/__Tests/StellaOps.Policy.Determinization.Tests/Models/DeterminizationResultTests.cs` - Unit tests for DeterminizationResult model - **DecayedConfidenceCalculatorTests**: `src/Policy/__Tests/StellaOps.Policy.Determinization.Tests/DecayedConfidenceCalculatorTests.cs` - Unit tests for DecayedConfidenceCalculator: boundary values, half-life verification, floor enforcement - **DeterminizationGateTests**: `src/Policy/__Tests/StellaOps.Policy.Engine.Tests/Gates/Determinization/DeterminizationGateTests.cs` - Integration tests for DeterminizationGate in gate pipeline - **DeterminizationPolicyTests**: `src/Policy/__Tests/StellaOps.Policy.Engine.Tests/Policies/DeterminizationPolicyTests.cs` - Policy-level tests for determinization enforcement ## E2E Test Plan - [ ] Run DecayPropertyTests; verify all FsCheck properties pass (monotonicity, bounds, floor, half-life) - [ ] Run DeterminismPropertyTests; verify deterministic evaluation property holds for 1000+ random inputs - [ ] Verify DecayedConfidenceCalculator boundary: baseConfidence=0.0 always returns floor - [ ] Verify DecayedConfidenceCalculator boundary: ageDays=0 always returns baseConfidence - [ ] Verify ObservationDecay.Fresh(now).CheckIsStale(now) == false - [ ] Verify decay monotonicity: older age always produces lower or equal score - [ ] Verify content-addressed ID generation produces same ID for identical inputs (1000 iterations) - [ ] Verify DeterminizationGate integration with DecayedConfidenceCalculator in gate pipeline - [ ] Verify all test suites pass in CI with frozen test clock (no time-dependent flakiness)