A failed row comes with exact rule-level reasons.

highlighted = computed this step

Spot the bad row

A bad row is not hidden; the violations table names every problem.

bad row is explained\text{bad row is explained}

Show every reason

This input has 4 violations, so allRowsPass is no.

violations=4\text{violations}=4

Check examples are tiny finite row-rule validations; SQL dialects, DDL timing, CHECK expression languages, enforcement strategy, performance, and product behavior are out of scope.

Spot the bad row: tableidstatusqty1new22NULL43bad9 row rulesnamekindcolumndetailstatus_requirednot_nullstatusnot NULLstatus_domainallowed_valuesstatus[done, new]qty_rangebetweenqty1..5 row pass/failrowstatusfailed rules0pass[]1fail[status_required, status_domain]2fail[status_domain, qty_range] violationsrowrulecolumnvaluereason1status_requiredstatusNULLNULL1status_domainstatusNULLnot_allowed2status_domainstatusbadnot_allowed2qty_rangeqty9above_max check factsfactvaluerowCount3ruleCount3passCount1failCount2violationCount4allRowsPassnonullMeansMissingyes

Follow the reasons

NULL fails required and domain checks; the large quantity fails the range.

reason per rule\text{reason per rule}

Summary

The model does not guess repairs; it only reports exact failures.

no guessed fix\text{no guessed fix}