using StellaOps.BinaryIndex.Core.Models; namespace StellaOps.BinaryIndex.FixIndex.Models; /// /// Evidence of a CVE fix in a distro package. /// public sealed record FixEvidence { /// Distro identifier (e.g., "debian", "ubuntu", "alpine") public required string Distro { get; init; } /// Release/codename (e.g., "bookworm", "jammy", "v3.19") public required string Release { get; init; } /// Source package name public required string SourcePkg { get; init; } /// CVE identifier (e.g., "CVE-2024-1234") public required string CveId { get; init; } /// Fix state public required FixState State { get; init; } /// Version where the fix was applied (if applicable) public string? FixedVersion { get; init; } /// Method used to detect the fix public required FixMethod Method { get; init; } /// Confidence score (0.0 - 1.0) public required decimal Confidence { get; init; } /// Evidence payload for audit trail public required FixEvidencePayload Evidence { get; init; } /// Corpus snapshot ID (if from snapshot ingestion) public Guid? SnapshotId { get; init; } /// Timestamp when this evidence was created public DateTimeOffset CreatedAt { get; init; } } /// /// Base class for evidence payloads. /// public abstract record FixEvidencePayload; /// /// Evidence from changelog parsing. /// public sealed record ChangelogEvidence : FixEvidencePayload { /// Path to changelog file public required string File { get; init; } /// Version from changelog entry public required string Version { get; init; } /// Excerpt from changelog mentioning CVE public required string Excerpt { get; init; } /// Line number where CVE was mentioned public int? LineNumber { get; init; } } /// /// Evidence from patch header parsing. /// public sealed record PatchHeaderEvidence : FixEvidencePayload { /// Path to patch file public required string PatchPath { get; init; } /// SHA-256 digest of patch file public required string PatchSha256 { get; init; } /// Excerpt from patch header public required string HeaderExcerpt { get; init; } } /// /// Evidence from official security feed. /// public sealed record SecurityFeedEvidence : FixEvidencePayload { /// Feed identifier (e.g., "alpine-secfixes", "debian-oval") public required string FeedId { get; init; } /// Entry identifier within the feed public required string EntryId { get; init; } /// Published timestamp from feed public required DateTimeOffset PublishedAt { get; init; } }