diff --git a/src/Shared/AutopilotMonitor.Shared/Models/Rules/RuleProvenance.cs b/src/Shared/AutopilotMonitor.Shared/Models/Rules/RuleProvenance.cs
index b84df7ca..f4f4ad0b 100644
--- a/src/Shared/AutopilotMonitor.Shared/Models/Rules/RuleProvenance.cs
+++ b/src/Shared/AutopilotMonitor.Shared/Models/Rules/RuleProvenance.cs
@@ -31,7 +31,9 @@ namespace AutopilotMonitor.Shared.Models
/// Null/empty is treated as so pre-existing rows (written
/// before this field) keep the historical "binary owns it" semantics.
public static string Normalize(string? provenance)
- => string.IsNullOrEmpty(provenance) ? Embedded : provenance;
+ // netstandard2.0's IsNullOrEmpty lacks [NotNullWhen(false)], so the compiler can't
+ // see that the else branch is non-null (CS8603) — assert it.
+ => string.IsNullOrEmpty(provenance) ? Embedded : provenance!;
/// True when the row is a GitHub-reseeded rule not in the deployed binary's catalog
/// — i.e. exempt from the embedded catalog-based sunset and runtime filter.