Files
git.stella-ops.org/src/__Libraries/StellaOps.Evidence.Bundle/EvidenceBundle.cs
2026-01-14 18:39:19 +02:00

57 lines
2.4 KiB
C#

namespace StellaOps.Evidence.Bundle;
/// <summary>A complete evidence bundle for a single finding/alert.</summary>
public sealed class EvidenceBundle
{
public string BundleId { get; init; } = Guid.NewGuid().ToString("N");
public string SchemaVersion { get; init; } = "1.1";
public required string AlertId { get; init; }
public required string ArtifactId { get; init; }
public ReachabilityEvidence? Reachability { get; init; }
public CallStackEvidence? CallStack { get; init; }
public ProvenanceEvidence? Provenance { get; init; }
public VexStatusEvidence? VexStatus { get; init; }
public DiffEvidence? Diff { get; init; }
public GraphRevisionEvidence? GraphRevision { get; init; }
// Sprint: SPRINT_20260112_008_LB_binary_diff_evidence_models (BINDIFF-LB-002)
public BinaryDiffEvidence? BinaryDiff { get; init; }
public required EvidenceHashSet Hashes { get; init; }
public required DateTimeOffset CreatedAt { get; init; }
public int ComputeCompletenessScore()
{
var score = 0;
if (Reachability?.Status == EvidenceStatus.Available) score++;
if (CallStack?.Status == EvidenceStatus.Available) score++;
if (Provenance?.Status == EvidenceStatus.Available) score++;
if (VexStatus?.Status == EvidenceStatus.Available) score++;
// BINDIFF-LB-002: Include binary diff in completeness scoring
if (BinaryDiff?.Status == EvidenceStatus.Available) score++;
return score;
}
public EvidenceStatusSummary CreateStatusSummary() => new()
{
Reachability = Reachability?.Status ?? EvidenceStatus.Unavailable,
CallStack = CallStack?.Status ?? EvidenceStatus.Unavailable,
Provenance = Provenance?.Status ?? EvidenceStatus.Unavailable,
VexStatus = VexStatus?.Status ?? EvidenceStatus.Unavailable,
Diff = Diff?.Status ?? EvidenceStatus.Unavailable,
GraphRevision = GraphRevision?.Status ?? EvidenceStatus.Unavailable,
// BINDIFF-LB-002: Include binary diff status
BinaryDiff = BinaryDiff?.Status ?? EvidenceStatus.Unavailable
};
public EvidenceBundlePredicate ToSigningPredicate() => new()
{
BundleId = BundleId,
AlertId = AlertId,
ArtifactId = ArtifactId,
CompletenessScore = ComputeCompletenessScore(),
Hashes = Hashes,
StatusSummary = CreateStatusSummary(),
CreatedAt = CreatedAt,
SchemaVersion = SchemaVersion
};
}