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;
}