With whylogs constraints, build them against the profile view and check the per-constraint report, not just the boolean. Make sure any metric a constraint needs was actually logged in the profile.

Context: Official whylogs docs (data validation): documents how constraints actually run. Constraints are built on a profile view with ConstraintsBuilder, and each constraint evaluates the metrics already captured in the profile, not the raw data. validate() returns a single bool for the whole set; generate_constraints_report() gives a per-constraint pass/fail list. Custom checks need the metric they depend on to exist in the profile, so log with a schema that includes them.