46 lines
1.5 KiB
C#
46 lines
1.5 KiB
C#
namespace StellaOps.AuditPack.Services;
|
|
|
|
public sealed partial class VerdictReplayPredicate
|
|
{
|
|
private static DivergenceCategory MapDriftTypeToCategory(DriftType driftType)
|
|
{
|
|
return driftType switch
|
|
{
|
|
DriftType.Decision => DivergenceCategory.Decision,
|
|
DriftType.VerdictDigest => DivergenceCategory.VerdictHash,
|
|
DriftType.VerdictField => DivergenceCategory.VerdictField,
|
|
DriftType.InputDigest => DivergenceCategory.Input,
|
|
_ => DivergenceCategory.Other
|
|
};
|
|
}
|
|
|
|
private static string GenerateDivergenceSummary(List<DivergenceItem> divergences)
|
|
{
|
|
if (divergences.Count == 0)
|
|
{
|
|
return "Replay matched original verdict exactly.";
|
|
}
|
|
|
|
var hasDecisionChange = divergences.Any(d => d.Category == DivergenceCategory.Decision);
|
|
var hasVerdictChange = divergences.Any(d => d.Category == DivergenceCategory.VerdictHash);
|
|
var hasInputChange = divergences.Any(d => d.Category == DivergenceCategory.Input);
|
|
|
|
if (hasDecisionChange)
|
|
{
|
|
return "Replay produced a different policy decision.";
|
|
}
|
|
|
|
if (hasVerdictChange)
|
|
{
|
|
return "Replay verdict differs in content but decision is the same.";
|
|
}
|
|
|
|
if (hasInputChange)
|
|
{
|
|
return "Input digests differ but verdict is unchanged.";
|
|
}
|
|
|
|
return $"Replay detected {divergences.Count} divergence(s).";
|
|
}
|
|
}
|