using System;
using System.Collections.Generic;
using System.Linq;
namespace StellaOps.Scanner.Worker.Determinism;
///
/// Represents a determinism score report produced by the worker replay harness.
/// This mirrors the determinism.json shape used in release bundles.
///
public sealed record DeterminismReport(
string Version,
string Release,
string Platform,
string? PolicySha,
string? FeedsSha,
string? ScannerSha,
double OverallScore,
double ThresholdOverall,
double ThresholdImage,
IReadOnlyList Images)
{
public static DeterminismReport FromHarness(Harness.DeterminismReport harnessReport,
string release,
string platform,
string? policySha = null,
string? feedsSha = null,
string? scannerSha = null,
string version = "1")
{
ArgumentNullException.ThrowIfNull(harnessReport);
return new DeterminismReport(
Version: version,
Release: release,
Platform: platform,
PolicySha: policySha,
FeedsSha: feedsSha,
ScannerSha: scannerSha,
OverallScore: harnessReport.OverallScore,
ThresholdOverall: harnessReport.OverallThreshold,
ThresholdImage: harnessReport.ImageThreshold,
Images: harnessReport.Images.Select(DeterminismImageReport.FromHarness).ToList());
}
}
public sealed record DeterminismImageReport(
string Image,
int Runs,
int Identical,
double Score,
IReadOnlyDictionary ArtifactHashes,
IReadOnlyList RunsDetail)
{
public static DeterminismImageReport FromHarness(Harness.DeterminismImageReport report)
{
return new DeterminismImageReport(
Image: report.ImageDigest,
Runs: report.Runs,
Identical: report.Identical,
Score: report.Score,
ArtifactHashes: report.BaselineHashes,
RunsDetail: report.RunReports.Select(DeterminismRunReport.FromHarness).ToList());
}
}
public sealed record DeterminismRunReport(
int RunIndex,
IReadOnlyDictionary ArtifactHashes,
IReadOnlyList NonDeterministic)
{
public static DeterminismRunReport FromHarness(Harness.DeterminismRunReport report)
{
return new DeterminismRunReport(
RunIndex: report.RunIndex,
ArtifactHashes: report.ArtifactHashes,
NonDeterministic: report.NonDeterministicArtifacts);
}
}