UI work to fill SBOM sourcing management gap. UI planning remaining functionality exposure. Work on CI/Tests stabilization

Introduces CGS determinism test runs to CI workflows for Windows, macOS, Linux, Alpine, and Debian, fulfilling CGS-008 cross-platform requirements. Updates local-ci scripts to support new smoke steps, test timeouts, progress intervals, and project slicing for improved test isolation and diagnostics.
This commit is contained in:
master
2025-12-29 19:12:38 +02:00
parent 41552d26ec
commit a4badc275e
286 changed files with 50918 additions and 992 deletions

View File

@@ -118,6 +118,164 @@ public sealed record VexDeltaRationale
/// </summary>
[JsonPropertyName("justificationCode")]
public string? JustificationCode { get; init; }
/// <summary>
/// Merge trace from VexLens consensus computation (if status change was from consensus).
/// Captures how the consensus was reached, including contributing statements and conflicts.
/// </summary>
[JsonPropertyName("mergeTrace")]
public ConsensusMergeTrace? MergeTrace { get; init; }
}
/// <summary>
/// Merge trace from VexLens consensus computation.
/// Records how a consensus status was reached from multiple VEX statements.
/// </summary>
public sealed record ConsensusMergeTrace
{
/// <summary>
/// Summary of the consensus computation.
/// </summary>
[JsonPropertyName("summary")]
public required string Summary { get; init; }
/// <summary>
/// List of factors that influenced the consensus decision.
/// </summary>
[JsonPropertyName("factors")]
public required IReadOnlyList<string> Factors { get; init; }
/// <summary>
/// Weight assigned to each status by contributing statements.
/// </summary>
[JsonPropertyName("statusWeights")]
public required IReadOnlyDictionary<string, double> StatusWeights { get; init; }
/// <summary>
/// Consensus mode used (HighestWeight, WeightedVote, Lattice, AuthoritativeFirst).
/// </summary>
[JsonPropertyName("consensusMode")]
public required string ConsensusMode { get; init; }
/// <summary>
/// Outcome of the consensus (Unanimous, Majority, Plurality, ConflictResolved, NoData).
/// </summary>
[JsonPropertyName("outcome")]
public required string Outcome { get; init; }
/// <summary>
/// Confidence score (0-1) in the consensus result.
/// </summary>
[JsonPropertyName("confidenceScore")]
public required double ConfidenceScore { get; init; }
/// <summary>
/// Contributions from each VEX statement that participated in consensus.
/// </summary>
[JsonPropertyName("contributions")]
public IReadOnlyList<StatementContributionSnapshot>? Contributions { get; init; }
/// <summary>
/// Conflicts detected during consensus computation.
/// </summary>
[JsonPropertyName("conflicts")]
public IReadOnlyList<ConsensusConflictSnapshot>? Conflicts { get; init; }
/// <summary>
/// When the consensus was computed.
/// </summary>
[JsonPropertyName("computedAt")]
public required DateTimeOffset ComputedAt { get; init; }
}
/// <summary>
/// Snapshot of a VEX statement's contribution to consensus.
/// </summary>
public sealed record StatementContributionSnapshot
{
/// <summary>
/// Statement identifier.
/// </summary>
[JsonPropertyName("statementId")]
public required string StatementId { get; init; }
/// <summary>
/// Issuer identifier.
/// </summary>
[JsonPropertyName("issuerId")]
public string? IssuerId { get; init; }
/// <summary>
/// Issuer name.
/// </summary>
[JsonPropertyName("issuerName")]
public string? IssuerName { get; init; }
/// <summary>
/// Status from this statement.
/// </summary>
[JsonPropertyName("status")]
public required string Status { get; init; }
/// <summary>
/// Weight assigned to this statement.
/// </summary>
[JsonPropertyName("weight")]
public required double Weight { get; init; }
/// <summary>
/// Contribution fraction (weight / total_weight).
/// </summary>
[JsonPropertyName("contribution")]
public required double Contribution { get; init; }
/// <summary>
/// Whether this statement was the winning contributor.
/// </summary>
[JsonPropertyName("isWinner")]
public required bool IsWinner { get; init; }
}
/// <summary>
/// Snapshot of a conflict detected during consensus.
/// </summary>
public sealed record ConsensusConflictSnapshot
{
/// <summary>
/// First conflicting statement ID.
/// </summary>
[JsonPropertyName("statement1Id")]
public required string Statement1Id { get; init; }
/// <summary>
/// Second conflicting statement ID.
/// </summary>
[JsonPropertyName("statement2Id")]
public required string Statement2Id { get; init; }
/// <summary>
/// Status from first statement.
/// </summary>
[JsonPropertyName("status1")]
public required string Status1 { get; init; }
/// <summary>
/// Status from second statement.
/// </summary>
[JsonPropertyName("status2")]
public required string Status2 { get; init; }
/// <summary>
/// Conflict severity (Critical, High, Medium, Low).
/// </summary>
[JsonPropertyName("severity")]
public required string Severity { get; init; }
/// <summary>
/// How the conflict was resolved.
/// </summary>
[JsonPropertyName("resolution")]
public required string Resolution { get; init; }
}
/// <summary>