4.6 KiB
4.6 KiB
Batch Simulation Orchestration
Module
Policy
Status
IMPLEMENTED
Description
Batch simulation orchestration for running multiple policy simulations in parallel with a dedicated simulation service in the policy registry.
Implementation Details
- RiskSimulationService:
src/Policy/StellaOps.Policy.Engine/Simulation/RiskSimulationService.cs--RiskSimulationService(sealed class)Simulate(RiskSimulationRequest)runs a single risk simulation with finding scores, distributions, top movers, and aggregate metricsSimulateWithBreakdown(RiskSimulationRequest, RiskSimulationBreakdownOptions?)runs with detailed breakdown analytics per POLICY-RISK-67-003CompareProfilesWithBreakdown(baseProfileId, compareProfileId, findings)runs comparison simulation between two risk profiles with trend analysisGenerateBreakdown(result, findings)generates standalone breakdown for existing simulation results- Score formula: signal values * weights -> normalized to 0-100 range
- Signal types: Boolean (0/1), Numeric (direct), Categorical (mapped: none=0.0, low=0.3, medium=0.6, critical=1.0)
- Severity thresholds: Critical >= 90, High >= 70, Medium >= 40, Low >= 10, else Informational
- Actions: Critical/High -> Deny, Medium -> Review, Low/Info -> Allow
- Supports severity and decision overrides via predicate matching on signal values
- Produces distribution with 10 buckets and percentiles (p25, p50, p75, p90, p95, p99)
- Top 10 movers identified by score with primary driver signals
- RiskSimulationBreakdownService:
src/Policy/StellaOps.Policy.Engine/Simulation/RiskSimulationBreakdownService.cs-- generates detailed breakdown analytics and comparison breakdowns - SimulationAnalyticsService:
src/Policy/StellaOps.Policy.Engine/Simulation/SimulationAnalyticsService.cs-- simulation analytics with delta summary computation - WhatIfSimulationService:
src/Policy/StellaOps.Policy.Engine/WhatIfSimulation/WhatIfSimulationService.cs--WhatIfSimulationService(internal sealed class)SimulateAsync(WhatIfSimulationRequest)executes what-if simulation without persisting results- Supports hypothetical SBOM diffs (add/remove/upgrade/downgrade operations) and draft policy evaluation
- Computes decision changes between baseline and simulated: status_changed, severity_changed, new, removed
- Impact analysis: risk delta (increased/decreased/unchanged), blocked/warning deltas, recommendations
- VEX override handling: not_affected overrides deny to allow; unreachable downgrades deny to warn
- Uses EffectiveDecisionMap, PolicyCompilationService, PolicyPackRepository
- Simulation Endpoints:
src/Policy/StellaOps.Policy.Engine/Endpoints/RiskSimulationEndpoints.cs-- REST API for simulation runs - Overlay Simulation:
src/Policy/StellaOps.Policy.Engine/Endpoints/OverlaySimulationEndpoint.cs-- overlay-based simulation - Console Simulation:
src/Policy/StellaOps.Policy.Engine/Endpoints/ConsoleSimulationEndpoint.cs-- console surface simulation - Path Scope Simulation:
src/Policy/StellaOps.Policy.Engine/Endpoints/PathScopeSimulationEndpoint.cs-- path-scoped simulation - Batch Evaluation:
src/Policy/StellaOps.Policy.Engine/BatchEvaluation/BatchEvaluationModels.cs-- models for batch evaluation runs - Telemetry:
RiskSimulationsRuncounter viaPolicyEngineTelemetry, activity tracing withrisk_simulation.runandpolicy.whatif.simulate
E2E Test Plan
- POST to risk simulation endpoint with a profile ID and list of findings; verify response contains simulation ID, finding scores, distributions, and aggregate metrics
- POST with
IncludeContributions=trueand verify signal contribution percentages sum to ~100% and override chain is returned - POST with
IncludeDistribution=trueand verify 10 buckets, 6 percentile levels, severity breakdown covering all 5 levels - Run
SimulateWithBreakdownand verify breakdown analytics are present alongside the base simulation result - Run
CompareProfilesWithBreakdownwith two profile IDs and verify baseline vs compare results with trend analysis - POST what-if simulation with SBOM diff (add component with advisory) and verify new
denydecision appears - POST what-if simulation with SBOM diff (remove component) and verify
allowdecision andremovedchange type - POST what-if simulation with draft policy YAML and verify simulated policy reference includes computed digest
- Verify simulation IDs are deterministic (same inputs produce same
rsim-*prefix ID) - Verify simulation with 0 findings returns zeroed aggregate metrics