using StellaOps.Policy; namespace StellaOps.Policy.Tools; public sealed record PolicySimulationScenario { public string Name { get; init; } = "scenario"; public string PolicyPath { get; init; } = string.Empty; public List Findings { get; init; } = new(); public List ExpectedDiffs { get; init; } = new(); public List? Baseline { get; init; } } public sealed record ScenarioFinding { public string FindingId { get; init; } = string.Empty; public string Severity { get; init; } = "Low"; public string? Environment { get; init; } public string? Source { get; init; } public string? Vendor { get; init; } public string? License { get; init; } public string? Image { get; init; } public string? Repository { get; init; } public string? Package { get; init; } public string? Purl { get; init; } public string? Cve { get; init; } public string? Path { get; init; } public string? LayerDigest { get; init; } public string[]? Tags { get; init; } } public sealed record ScenarioExpectedDiff { public string FindingId { get; init; } = string.Empty; public string Status { get; init; } = "Pass"; } public sealed record ScenarioBaseline { public string FindingId { get; init; } = string.Empty; public string Status { get; init; } = "Pass"; public string? RuleName { get; init; } public string? RuleAction { get; init; } public string? Notes { get; init; } public double Score { get; init; } public string? ConfigVersion { get; init; } public Dictionary? Inputs { get; init; } } public sealed record ScenarioResult(string ScenarioName) { public bool Success { get; init; } = true; public int ChangedCount { get; init; } public List Failures { get; } = new(); public Dictionary ActualStatuses { get; } = new(StringComparer.OrdinalIgnoreCase); } public sealed class NullPolicySnapshotRepository : IPolicySnapshotRepository { public Task AddAsync(PolicySnapshot snapshot, CancellationToken cancellationToken = default) => Task.CompletedTask; public Task GetLatestAsync(CancellationToken cancellationToken = default) => Task.FromResult(null); public Task> ListAsync(int limit, CancellationToken cancellationToken = default) => Task.FromResult>(Array.Empty()); } public sealed class NullPolicyAuditRepository : IPolicyAuditRepository { public Task AddAsync(PolicyAuditEntry entry, CancellationToken cancellationToken = default) => Task.CompletedTask; public Task> ListAsync(int limit, CancellationToken cancellationToken = default) => Task.FromResult>(Array.Empty()); }