canonicalPredicate
One predicate object folded the way Geyser's readers fold it. Unknown types or properties fall back to the full sorted JSON so they still dedup on byte-identical content but never unify two entries Geyser might treat as distinct. Public because the backend registry also uses it to describe a matcher in its dedup summary.