namespace NeonSprawl.Server.Game.Contracts; /// Id normalization and idempotency keys for contract outcome audit rows (NEO-146). public static class ContractOutcomeIds { /// Stable idempotency key for contract completion delivery. public static string MakeIdempotencyKey(string? playerId, string? contractInstanceId) { var p = ContractInstanceIds.NormalizePlayerId(playerId); var i = ContractInstanceIds.NormalizeContractInstanceId(contractInstanceId); if (p.Length == 0 || i.Length == 0) { return string.Empty; } return $"{p}:contract_complete:{i}"; } }