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