using System.Text.Json.Serialization; namespace StellaOps.Policy.Engine.Domain; /// /// Request for a policy decision with source evidence summaries (POLICY-ENGINE-40-003). /// public sealed record PolicyDecisionRequest( [property: JsonPropertyName("snapshot_id")] string SnapshotId, [property: JsonPropertyName("tenant_id")] string? TenantId = null, [property: JsonPropertyName("component_purl")] string? ComponentPurl = null, [property: JsonPropertyName("advisory_id")] string? AdvisoryId = null, [property: JsonPropertyName("include_evidence")] bool IncludeEvidence = true, [property: JsonPropertyName("max_sources")] int MaxSources = 5); /// /// Response containing policy decisions with source evidence summaries. /// public sealed record PolicyDecisionResponse( [property: JsonPropertyName("snapshot_id")] string SnapshotId, [property: JsonPropertyName("decisions")] IReadOnlyList Decisions, [property: JsonPropertyName("summary")] PolicyDecisionSummary Summary); /// /// A single policy decision with associated evidence. /// public sealed record PolicyDecisionItem( [property: JsonPropertyName("tenant_id")] string TenantId, [property: JsonPropertyName("component_purl")] string ComponentPurl, [property: JsonPropertyName("advisory_id")] string AdvisoryId, [property: JsonPropertyName("severity_fused")] string SeverityFused, [property: JsonPropertyName("score")] decimal Score, [property: JsonPropertyName("status")] string Status, [property: JsonPropertyName("top_sources")] IReadOnlyList TopSources, [property: JsonPropertyName("evidence")] PolicyDecisionEvidence? Evidence, [property: JsonPropertyName("conflict_count")] int ConflictCount, [property: JsonPropertyName("reason_codes")] IReadOnlyList ReasonCodes); /// /// Top severity source information for a decision. /// public sealed record PolicyDecisionSource( [property: JsonPropertyName("source")] string Source, [property: JsonPropertyName("weight")] decimal Weight, [property: JsonPropertyName("severity")] string Severity, [property: JsonPropertyName("score")] decimal Score, [property: JsonPropertyName("rank")] int Rank); /// /// Evidence summary for a policy decision. /// public sealed record PolicyDecisionEvidence( [property: JsonPropertyName("headline")] string Headline, [property: JsonPropertyName("severity")] string Severity, [property: JsonPropertyName("locator")] PolicyDecisionLocator Locator, [property: JsonPropertyName("signals")] IReadOnlyList Signals); /// /// Evidence locator information. /// public sealed record PolicyDecisionLocator( [property: JsonPropertyName("file_path")] string FilePath, [property: JsonPropertyName("digest")] string? Digest); /// /// Summary statistics for the decision response. /// public sealed record PolicyDecisionSummary( [property: JsonPropertyName("total_decisions")] int TotalDecisions, [property: JsonPropertyName("total_conflicts")] int TotalConflicts, [property: JsonPropertyName("severity_counts")] IReadOnlyDictionary SeverityCounts, [property: JsonPropertyName("top_severity_sources")] IReadOnlyList TopSeveritySources); /// /// Aggregated source rank across all decisions. /// public sealed record PolicyDecisionSourceRank( [property: JsonPropertyName("source")] string Source, [property: JsonPropertyName("total_weight")] decimal TotalWeight, [property: JsonPropertyName("decision_count")] int DecisionCount, [property: JsonPropertyName("average_score")] decimal AverageScore);