/** * Policy - Policy Model for Resolver * Sprint: SPRINT_9100_0001_0001 (Core Resolver Package) * Task: RESOLVER-9100-005 * * Represents the policy used for verdict evaluation. * Policy digest is included in FinalDigest for reproducibility. */ using System.Security.Cryptography; using System.Text; using System.Text.Json; namespace StellaOps.Resolver; /// /// Policy configuration for deterministic resolution. /// /// Policy version string. /// Policy rules as JSON. /// SHA256 digest of policy constants. public sealed record Policy( string Version, JsonElement Rules, string ConstantsDigest) { private string? _digest; /// /// SHA256 digest of the policy (version + rules + constants). /// public string Digest => _digest ??= ComputeDigest(); private string ComputeDigest() { var input = $"{Version}:{Rules.GetRawText()}:{ConstantsDigest}"; var hash = SHA256.HashData(Encoding.UTF8.GetBytes(input)); return Convert.ToHexString(hash).ToLowerInvariant(); } /// /// Creates a policy from version and rules JSON. /// public static Policy Create(string version, JsonElement rules, string constantsDigest = "") { ArgumentException.ThrowIfNullOrWhiteSpace(version); return new Policy(version, rules, constantsDigest); } /// /// Creates an empty policy for testing. /// public static Policy Empty => new("1.0.0", JsonDocument.Parse("{}").RootElement, ""); }