The big table in Special:ConstraintReport currently has a “claim” column with the property and value of the snak being checked. (I suppose “claim” is strictly speaking a misnomer since T168532: Check constraints on qualifiers and references.) If a violation message exists, the “status” column has a small “question mark” indicator ([?]) which, when hovered, shows the violation message.
We could replace the “claim” column with a dedicated column for the violation message (and move it out of the [?] indicator). This would make the violation message more prominent (which is probably a good idea since T163997: Improve constraint violation messages), and will let us remove the data value from the CheckResult class, which makes serializing check results for the cache easier (T185714).
However, it’s not clear what should happen for results that don’t have a violation message: compliance (complies with constraint), exception (subject entity is marked as exception to this constraint), todo (unimplemented constraint type), deprecated (statement deprecated), and not-in-scope (constraint is not checked on this kind of context). Perhaps we can just remove them from the table? Their total number would still be available in the summary line above the table.
I think we also need to add a separate column for the property with the constraint in that case, because not all messages include that, and some messages are hard or impossible to understand without it (“This property should only be used for the main value of a statement, not for qualifiers or references.”).