All work

Project 06

Reckoner

It refuses to answer when it cannot prove the answer.

Every analytics tool you have ever used will answer you. This one checks first whether your question deserved an answer.

Sep 2026Source is privateOpen it — it's running
A panel headed "Act One — what every other tool reports", showing revenue fell 57.6% in December 2011, with a bar chart where the final bar is highlighted in red.
Act One. The number every dashboard would give you — arithmetically correct, and completely wrong.

Every analytics tool you have ever used will answer you. That is the problem with all of them.

I pointed one at a real retailer's ledger — a million transaction lines — and asked the most ordinary question in business: what happened to revenue last month. It said revenue fell 57.6%. That number is arithmetically perfect. It is also completely wrong, and no dashboard on earth would have told me so.

It is wrong because "last month" in that file is nine days long. The data stops on the ninth. Comparing nine days against a full month measures the calendar, not the company. Somewhere right now a real person is walking into a real board meeting with exactly that number, because the query was correct and the data was correct and nothing in between was paid to be sceptical.

So I built the thing that is paid to be sceptical. Reckoner computes that same −57.6% — and then refuses to publish it. It checks whether the two periods are even comparable before it attempts any explanation, and when they are not it says so, shows you the day counts, and proposes the comparison you should have asked for instead: November against November, one year apart, both complete, seasonality held constant. One period out of twenty-five fails that gate — and it is the one everybody would have reported.

The honest answer turns out to be plus 2.7%. Which is also not the finding, because "roughly flat" is a disguise. Underneath it, four hundred and eighty-four thousand pounds of brand-new products is being eaten alive by two hundred and forty-five thousand of lost volume, a hundred and thirty-eight of mix and a hundred and thirty-five of lines that were discontinued. So it breaks the movement into named pieces — volume, price, mix, new products, discontinued — and the pieces add back up to the totals exactly. That is the sentence a CEO actually needs: not "we are flat", but "we are flat because a new range is carrying a shrinking old one".

Two things I insisted on. The data-quality check runs first, before any finding, not as a footnote underneath one — because if your file is wrong this will faithfully explain a wrong number, and you need to know that before you read the answer. And a million rows never leave your laptop; the whole thing runs in the browser, no server, no upload, no account. If you want to point a tool at a real ledger without emailing it to a vendor, that is the entire ballgame.

Why it was hard

Every analytics tool ever built will answer you. That is the problem. Run a correct query over correct data and you get "revenue fell 57.6% last month" — arithmetically perfect and completely wrong, because last month is only nine days long in the file. No dashboard on earth would tell you that. The hard part is not computing the number; it is building something that computes the number, sees why it is meaningless, and declines to show it to your CEO.

How it actually works

  • Before it explains anything at all, it asks whether your question was even fair. One period in twenty-five fails — and it is the one everybody would have put in the board pack.

    Before it explains anything, a gate checks whether the periods you are comparing are even comparable. In the sample ledger, one period out of twenty-five fails that check — December 2011, which holds nine calendar days and eight trading days against a typical month of twenty-six. The refusal is issued before any explanation is attempted.

    1 receipt
    • see it refuseAct Two is the refusal, with the day counts and the reason, and a better comparison suggested in its place.
  • Then it hands you the question you should have asked instead: the same month, one year apart, both of them complete.

    Then it proposes the comparison you should have asked for. November 2010 against November 2011 — same month, one year apart, so seasonality is held constant, and both fully observed. The real answer turns out to be plus 2.7%, not minus 57.6%.

    1 receipt
  • Even “roughly flat” turns out to be a disguise. Flat here means two much larger forces pulling against each other and very nearly cancelling.

    And "plus 2.7%" is not the finding either — it is the disguise. Underneath it, £484k of brand-new products is being swallowed by £245k of lost volume, £138k of mix and £135k of discontinued lines, with £73k of price the only other thing pushing back. Five named pieces, and they reconcile back to the totals exactly.

    1 receipt
  • The “is your data any good” check runs FIRST, not in a footnote at the bottom. If your file is wrong this tool will explain a wrong number beautifully, and you need to know that before you read the answer, not after.

    It runs a data-quality exhibit first, before any finding, rather than as a footnote afterwards — because if the source file is wrong this will faithfully explain a wrong number, and that needs saying before you read the answer, not after.

    1 receipt
    • see it liveData quality is stated before any finding, on purpose.
  • A million rows, and not one of them leaves your laptop. No server, no upload, no account — which is the only reason anybody would ever point it at a real ledger.

    A million rows and nothing leaves your machine. The whole analysis runs in the browser — no server on the data path, no account, no upload. For anyone who would like to point an analytics tool at a real ledger without emailing it to a vendor, that is the entire ballgame.

    1 receipt
    • see it live"Data sent to a server: None. Ever." — stated in the header and true of the architecture.
A panel headed "Act Two — we refuse to publish it", explaining that December 2011 contains only 9 calendar days and 8 trading days against a typical 26-day month.
Act Two. It computed the answer, then refused to show it as a finding — and told you exactly which comparison to make instead. I have never seen another analytics tool do this.
A waterfall chart decomposing a revenue change into volume, price, mix and interaction, new products and discontinued lines.
Act Three. The honest comparison looks flat at +2.7% — until the waterfall opens it up: £484k of new products, £245k of lost volume, £138k of mix, £135k of lines discontinued, £73k of price. A company holding still because two much larger forces pull against each other is not the same company as one that is genuinely flat.
A panel headed "The ledger", showing eight named countries carrying the movement and 11.1% of it sitting outside them across twenty-three others.
Where the money actually moved. Eight countries carry it; the remaining 11.1% is spread across twenty-three more, and it says so rather than rounding them away.
A panel headed "Before you trust any of it", listing five defects found in the source file, each with the number of rows affected.
This runs BEFORE the finding, not as a footnote under it. Five defects in the file, each one big enough to have moved the numbers above — because if your data is wrong, a good tool will explain a wrong answer beautifully.
A panel headed "The proof" listing the checks a finding must pass before it is allowed to render, each with a pass state.
Every check the finding had to survive before it was allowed on screen. These run at render time in your browser, so you are watching the real gate, not a screenshot of one.
A table headed "The evidence" with columns for check, scale and result, including a bridge reconciliation row.
What was actually run, and what came back. The bridge reconciles to the movement exactly — if it ever did not, the finding would not render.
A panel headed "Method", describing four mechanisms by which the numbers can be verified, in descending order of strength.
Four ways to check the numbers without taking my word for anything, ordered by how strong each one is. The weakest is listed as the weakest.
A panel headed "The limits", stating plainly what the product cannot do and where it could still mislead.
The limits, written into the product rather than into a README nobody opens. A tool that cannot say what it is bad at should not be trusted about what it is good at.
A panel headed "Your turn" inviting the visitor to upload their own CSV, stating that the data never leaves the browser.
Point it at your own ledger. A million rows, no upload, no account, no server on the data path — which is the only reason anyone would ever try it with real numbers.

The numbers

1,033,036
transaction rows analysed, entirely in the browser
receipts
  • see it liveRow count printed in the header alongside the period covered.
−57.6% → +2.7%
the difference between the answer every tool gives and the true one
receipts
  • see it liveAct One computes the first, Act Two refuses it, Act Three earns the second.
1 of 25
periods that fail the comparability gate — and it is the one everybody would have reported
receipts
  • see it liveThe gate runs across every period, not just the one you asked about.
5
named effects the movement decomposes into, reconciling exactly to the totals
receipts
  • see it liveVolume, price, mix and interaction, new products, discontinued.
0
bytes of your data sent anywhere
receipts

The part most people would have skipped

It only supports one shape of question: two periods, one money metric. I considered forecasting, cohort retention and multi-metric models, and cut all three rather than ship them shallow — a narrow tool that is right beats a broad one that is plausible. And the limits are written on the page itself, including the ones that cost me: the sample ledger is real but it is from 2009 to 2011 and the interface says so on every exhibit rather than quietly implying freshness; two periods are two points, so a movement between them is not a trend and nothing here should be read as one; and no actual CEO has evaluated it, which I say plainly rather than letting anyone assume otherwise.

What it can't do

  • One question shape only: two periods, one money metric. Forecasting, cohorts and multi-metric models were considered and cut rather than shipped shallow.
  • The sample ledger is genuine but historical — 2009 to 2011 — and the interface says so on every exhibit.
  • Two periods are two points. A movement between them is not a trend.
  • If the source file is wrong, it will faithfully explain a wrong number. That is why the data-quality exhibit runs first.
  • No real executive has evaluated it. It has been driven end to end in a browser at desktop and phone widths and audited against published research on what executives reject — which is the strongest evaluation available without access to one, and not the same thing.
Built with
  • TypeScript
  • in-browser analysis
  • no backend
  • print/PDF export
  • UCI Online Retail II (CC BY 4.0)

The Pillars of Creation

They may not exist any more. We are looking at seven-thousand-year-old light.

There is reasonable evidence a supernova destroyed these pillars around six thousand years ago — meaning the image is real, current, correctly captured, and possibly a photograph of something that is already gone. Correct data, wrong conclusion, unless somebody checks.

The Pillars of Creation, Eagle Nebula · NASA, ESA and the Hubble Heritage Team (STScI/AURA) · CC BY 4.0