namespace StellaOps.EvidenceLocker.Storage; /// /// Repository for storing and retrieving verdict attestations. /// public interface IVerdictRepository { /// /// Stores a verdict attestation. /// Task StoreVerdictAsync( VerdictAttestationRecord record, CancellationToken cancellationToken = default); /// /// Retrieves a verdict attestation by ID. /// Task GetVerdictAsync( string verdictId, CancellationToken cancellationToken = default); /// /// Lists verdict attestations for a policy run. /// Task> ListVerdictsForRunAsync( string runId, VerdictListOptions options, CancellationToken cancellationToken = default); /// /// Lists verdict attestations for a tenant with filters. /// Task> ListVerdictsAsync( string tenantId, VerdictListOptions options, CancellationToken cancellationToken = default); /// /// Counts verdict attestations for a policy run. /// Task CountVerdictsForRunAsync( string runId, VerdictListOptions options, CancellationToken cancellationToken = default); } /// /// Complete verdict attestation record (includes DSSE envelope). /// public sealed record VerdictAttestationRecord { public required string VerdictId { get; init; } public required string TenantId { get; init; } public required string RunId { get; init; } public required string PolicyId { get; init; } public required int PolicyVersion { get; init; } public required string FindingId { get; init; } public required string VerdictStatus { get; init; } public required string VerdictSeverity { get; init; } public required decimal VerdictScore { get; init; } public required DateTimeOffset EvaluatedAt { get; init; } public required string Envelope { get; init; } // JSONB as string public required string PredicateDigest { get; init; } public string? DeterminismHash { get; init; } public long? RekorLogIndex { get; init; } public required DateTimeOffset CreatedAt { get; init; } } /// /// Summary of a verdict attestation (without full envelope). /// public sealed record VerdictAttestationSummary { public required string VerdictId { get; init; } public required string TenantId { get; init; } public required string RunId { get; init; } public required string PolicyId { get; init; } public required int PolicyVersion { get; init; } public required string FindingId { get; init; } public required string VerdictStatus { get; init; } public required string VerdictSeverity { get; init; } public required decimal VerdictScore { get; init; } public required DateTimeOffset EvaluatedAt { get; init; } public required string PredicateDigest { get; init; } public string? DeterminismHash { get; init; } public long? RekorLogIndex { get; init; } public DateTimeOffset CreatedAt { get; init; } } /// /// Options for filtering verdict lists. /// public sealed class VerdictListOptions { public string? Status { get; set; } public string? Severity { get; set; } public int Limit { get; set; } = 50; public int Offset { get; set; } = 0; }