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