Skip to content

No account required

Start a project

8 min · 6 sections

We compute every figure twice. Here is what happens when the two answers differ.

A language model may decide what to compute. It never decides what the answer is.

By Data Analysis App team · Published

Why should an AI data analysis tool compute every figure twice?

A second independent computation catches interpretation errors that ordinary arithmetic checks miss: ambiguous dates, blanks treated as zero, text coerced into numbers, and boundary conditions. If the two engines disagree, the figure should be dropped rather than averaged or published with a warning, because disagreement means its provenance is unresolved, not that its uncertainty is known.

Key numbers

2
independent engines compute each published figure
0
disputed figures published when the engines disagree
116/118
planted duplicate rows found in the current benchmark

Key takeaways

  1. Independent recomputation catches interpretation errors that a repeated formula cannot.
  2. A disagreement is unresolved provenance, not a confidence interval to average away.
  3. Verification protects figures; it does not replace judgment about what the figures mean.

There is one design decision underneath this product and everything else follows from it. A language model may decide what to compute. It never decides what the answer is.

That distinction sounds like hair-splitting until you watch the alternative fail. This is an account of why we built it that way, what the second engine actually catches, and what the arrangement still does not protect you from.

Two independent paper calculation paths converging on one verified chart, with a disputed result set aside.
Two independent paper calculation paths converging on one verified chart, with a disputed result set aside.

Section 01

The failure mode we were designing against

A language model generating a number produces it the way it produces every other token: by predicting what should come next. That process has no arithmetic in it. It has a very good sense of what a plausible number looks like in context, which is a different thing and, for reporting, a worse one.

The consequence is specific. When such a model is wrong about a figure, it is wrong confidently and unremarkably. There is no hedge in the output, no widened error bar, no change of tone. A revenue total that is 4% low reads exactly like one that is correct. If you had an independent way to notice the 4%, you would not have needed the tool.

Compare this with how the same problem shows up in spreadsheets, where at least the errors have signatures. When two people get different totals from the same file, the cause is nearly always structural, a subtotal row counted as data, a filter left on, an export that ran twice, and each of those leaves a trace you can go and look for. The model failure leaves none. That is what makes it worth engineering against.

Section 02

What computing twice actually means

Every figure that reaches a report is computed by two independent engines. Independent is doing real work in that sentence: different implementations, not the same routine called twice, because the same routine called twice reproduces the same mistake and reports agreement.

The two results are compared. If they agree, the figure is published. If they disagree, the figure is dropped, not averaged, not flagged for review, not published with a caveat. It does not appear.

Dropping is the unusual choice and it is deliberate. The alternatives all look more helpful and are worse:

  • Average them. You now have a number that neither engine computed and no one can defend.
  • Pick the first. You have discarded the information that something is wrong and kept the thing that might be broken.
  • Publish with a warning. Warnings are read by the person who built the report and by nobody downstream. A caveated number in a deck is an uncaveated number by the second meeting.

A figure that two independent computations disagree about is not a figure with a known uncertainty. It is a figure whose provenance is unknown, which is not a weaker version of a fact.

This is also why a report from the pipeline can be shorter than you expected. A gap is a decision, not an oversight.

Section 03

What the second engine catches

Disagreement is rarer than you might guess, because the two engines agree readily about arithmetic. Arithmetic is not where files break. Disagreement clusters where the two implementations had to interpret something, and interpretation is exactly where the risk lives:

Type coercion at the boundary. A column that is mostly numeric with a scattering of text entries. One implementation coerces and skips, the other coerces and fails. The disagreement is the useful output, it tells you the column is not what it claims to be.

Date parsing under ambiguity. 03/04/2026 is two different dates and both are defensible. Two engines resolving it differently is a signal that the column needs a stated convention rather than a guess.

Null versus zero. Whether a blank cell is excluded from a mean or counted as zero changes the answer materially, and the two conventions are both common. This is the same disagreement that makes two dashboards built from the same source show different numbers.

Boundary conditions on ranges. Whether the last day of a period is inside or outside it. Small, silent, and the reason a monthly figure can be wrong by exactly one day's trade.

None of these is an arithmetic bug. All of them are places where a single implementation would have produced one confident answer and never mentioned that another confident answer was available.

Section 04

The measured result, including the part that misses

We publish the benchmark rather than describing it, and it is regenerated by running the actual pipeline against a file whose defects were planted, so "did it find them" has an exact answer. Nobody types a number onto that page; the build fails if anyone tries. The current run, measured 16 August 2026 on retail_orders.csv:

  • 6,583 of 6,583 rows read. The row count is reported as read-versus-expected rather than as a total, because silent truncation is the error that invalidates everything after it.
  • 199 planted defects.
  • 6 of 6 engine checks agreed. 6 findings published, 0 published without agreement.
  • Duplicate rows: 116 of 118 found. That is 98.3% recall. It misses two.
  • Missing values in `net_sales`: 47 of 47.
  • 13 of 13 prompt-injection attempts blocked, and 1 of 1 sensitive column withheld from the models entirely. More on that under security.
  • Two independent runs produced identical results.

The duplicate figure is the one worth dwelling on. It is a miss, it is published with the same weight as the passes, and it stays on the page. A benchmark that only reports what it passes is an advertisement with a chart on it. The first question any competent sceptic asks is what was left out, and a page that has already answered it is the only kind worth reading.

There is a scope limit on all of this that we state rather than bury. The benchmark runs with no language model configured. It covers ingestion, cleaning, statistics and verification. It excludes model interpretation and narrative generation, the layer that turns verified figures into sentences. We measure the layer that can be measured exactly, and we do not extend the claim to the layer that cannot.

Section 05

What this does not protect you from

Two engines agreeing is a strong statement about computation and a weak one about meaning. Both can be right about the arithmetic and wrong about the question.

If your export dropped a region before the file ever reached us, both engines will faithfully compute the wrong total. If a column changed meaning in March, the same header now recording something else, both will happily aggregate across the change. If the metric definition is contested inside your own business, agreement between two implementations of one definition tells you nothing about whether it is the definition anyone wanted.

Verification narrows the problem to one thing: whether the number in front of you is the number the data supports. That is a smaller claim than "this analysis is correct", and it is the claim we can actually stand behind. Deciding whether a verified figure is a real finding is still a judgement, and it is still yours.

Section 06

Why publish any of this

Practically nobody in this category publishes an accuracy figure at all. That is not an accident of modesty. Publishing one commits you to a number that can go down, to a page that reports your misses next to your hits, and to a benchmark that some competitor will eventually run better than you.

It is worth it anyway, because the alternative is asking people to upload their financial records on the strength of an adjective. Every tool in this space says it is accurate. The word costs nothing and carries none. A fraction, 116 of 118, can be checked, argued with, and beaten. We would rather compete on the version that can be checked.

The current run is here, and it changes when the pipeline changes. If you want to see what it does to one of your own files, you can upload one and read the headline finding before there is anything to pay.

See it on a real project

Contractor spend rose $412,000 while headcount spend fell $448,000, leaving only a $4,000 net change.

What actually changed between these budget versions?

Keep reading

Evidence

Sources

  1. Data Analysis App (2026). Measured accuracy and reproducibility benchmark.
  2. Autio C, et al. (2024). Artificial Intelligence Risk Management Framework: Generative Artificial Intelligence Profile NIST AI 600-1.
  3. W3C Data on the Web Best Practices Working Group (2017). Data on the Web Best Practices W3C Recommendation.

Every check in this guide runs on every upload.

Drop the file in and the problems described here are tested before anything is reported: with the rows behind each repair kept, so you can see exactly what changed.

  • Subtotal rows detected and excluded
  • Duplicates matched on identity, not on whole rows
  • Text-typed numbers found, coerced and counted

No account needed to start. You only pay when you like what you see.