All notebook entries

A dashboard can render and still answer the wrong question

Restoring broken charts was one task. Checking backlog definitions, facility roles, date filters, and turnaround-time denominators exposed a deeper question about what each chart actually meant.

Published

In August 2026, the production ZanLIS reporting dashboard had nine broken charts. Warehouse tables and measures had changed, but parts of the Superset configuration still referred to the old schema. The failures affected every tab, including the entire turnaround-time tab.

Those errors were visible. A chart that rendered successfully could conceal a different problem: a query that ran but answered a question other than the one its title suggested.

Restore the reporting surface first

The August repair updated measures and dataset queries, moved turnaround charts to the shared test-order dataset, and rebuilt the outstanding-sample trend against the appropriate status data.

I checked all 21 charts through the reporting API and verified the coverage and effect of all seven dashboard filters. That went beyond opening the dashboard and seeing figures appear.

Later warehouse and dashboard work on staging pushed the checks further into meaning: what counted as an unresolved integration failure, which facility a filter referred to, and how summary measures behaved when combined.

These were separate stages of work. The August repair restored production reporting. The later redesign was being checked on staging with dummy data and still required stakeholder review and a coordinated production release.

An average needs its population

Turnaround time provided a concrete example. Averaging already calculated averages gives each group equal weight even when the groups contain very different numbers of samples.

Consider invented numbers for two groups:

Group Samples Average turnaround Total turnaround
A 1 100 minutes 100 minutes
B 9 10 minutes 90 minutes

The average of the two displayed averages is 55 minutes. The average across all ten samples is (100 + 90) / (1 + 9), or 19 minutes.

The reporting design therefore carries additive totals and counts into the daily aggregates. A chart combines total durations and divides by the combined sample count. The percentage within target similarly combines qualifying counts and eligible counts.

That denominator still needs a definition. In this design, turnaround reporting includes eligible verified samples for test orders with a curated target and the required timestamps. It does not represent every sample registered in the system. Missing timestamps or an absent target must not silently become a zero-minute result.

Dates and facilities change the question too

“Samples received this month” and “samples verified this month” do not necessarily describe the same set of samples. Some verified this month arrived earlier; some received this month remain in progress.

Putting those totals next to each other does not make them successive steps in a single cohort's funnel. A question about what happened during a period differs from a question about what eventually happened to samples that entered during that period.

Facility roles introduce a similar ambiguity. The facility that requested a test and the laboratory that performed it may differ. A filter labelled only “facility” can change the interpretation without making that choice visible.

Integration backlog required its own distinction: a past failed attempt that later succeeded should remain available as history without being counted as unresolved work.

Test the question behind the chart

These checks changed what I looked for during reporting review. I needed to trace the numerator, denominator, dates, and dimensions back to the operational question, then check that filters preserved that interpretation.

Staging data could exercise those rules. It could not establish real laboratory performance. Production figures would need their own validation after release.

A chart returning data is necessary evidence. Knowing which records contributed to it, which were excluded, and why its calculation remains valid under filtering is what makes the result explainable.

Share this entry

Back to the notebook