The output of the checks run on a file before any figure from it is shown: what parsed, what is missing, what is duplicated, and whether the roll-up reconciles, with the rows behind each line.
One line per check: pass or fail, the figure, and the detail. "Every value in Net Sales is a number, 290 rows." "1 row has no region, blank Region, row 290." "Each account sits under one person, 289 accounts." "region = person = account = total, 1,403,577, 0.00 variance."
The report is the thing the visitor sees before the dashboard, because a dashboard drawn on a file that does not reconcile is a dashboard that will be contradicted in the meeting. A report that says what is wrong, by row, is the product's first useful output.
A file uploaded in the browser, posted to an API, or dropped in storage on a schedule gets the same report back.
Before any figure is shown, the file is checked: rows parsed, columns mapped, dates valid, identifiers matched, totals against the control total, duplicates. The report lists what passed, what failed and what was excluded.
41,280 rows read; 41,102 parsed; 178 excluded for an unreadable date, worth $61,400; total matches the control total once those are added back.
Bad rows dropped silently. The totals are slightly low and nobody knows why.