The verification engine, in plain English

Why you can trust
the numbers.

Most AI tools ask you to trust a number because the model sounds confident. Columnly is built the opposite way: correctness is plain, deterministic code that always runs โ€” not an instruction buried in a prompt a model could ignore. Here's exactly how a figure earns its place on the screen.

The doctrine, in one line

Fail open where a wrong guess would drop your data. Fail closed where a wrong guess would fabricate a number.

Mechanism 0 ยท a genuine second opinion

Two models. One answer. It ships only when they agree.

Every data question is solved twice, by two different-class models. One understands and decomposes it; a second, independent model re-derives the whole thing from scratch โ€” blind to the first one's code. The answer ships only when the two agree within a strict numeric tolerance.

Model A ยท understands & solves

Reads the question and the data profile, decomposes it into computed sub-goals, and produces a figure.

Model B ยท re-derives from scratch

Never sees Model A's work. Writes its own independent solution to the same question.

โ–ผ reconcile โ–ผ

Agree within tolerance โ†’ ship the verified figure ยท Disagree โ†’ pause and ask you ยท Can't back it โ†’ refuse, offer real options

The three mechanisms underneath

Proof by construction โ€” not a promise.

01

The results store โ€” cite or nothing

Every number that will ever be displayed is registered in an immutable store, keyed by identity. It's immutable by key (a later step can't silently overwrite a figure), it auto-captures the code line that produced it (so lineage can't be faked), and it records the unit, scope, denominator, and what it was derived from. If a number isn't in the store, it cannot be shown.

02

Server-owned figures (web app)

In the web app the browser is structurally incapable of producing a number. Every figure crosses from server to client inside a sealed envelope with its verification state and snapshot id; the client-side handle that reads it has no setter. Structural data โ€” names, labels, chart types โ€” crosses freely; anything that could be wrong crosses only inside the envelope. A new number can appear only via a fresh, verified server round-trip.

03

Deterministic verification

The parts that must be correct are plain code that always runs. "You cannot sum an order ID." "You cannot divide a per-order total by a per-week count." "No join without real value overlap." Number-matching, the aggregate-legality rules, the grain guard, the join resolver โ€” all deterministic. The model is used only where judgment is genuinely needed; everywhere correctness is at stake, code decides.

Before any artifact ships

Deterministic verifiers gate every dashboard and brief.

These run on the rendered output itself โ€” a number that doesn't trace is deleted before ship.

Numbers

Every figure cites & matches

Each figure must point to a stored, machine-computed value and equal it exactly under a strict formatting grammar ($/โ‚ฌ/ยฃ/ยฅ, western & Indian number formats, K/M/B โ€” plus lakh/crore where you need it, %).

Charts

Bars equal the stored series

Every chart's plotted values must equal the verified series behind it โ€” a chart can't quietly disagree with its own data.

Claims

Claims can't contradict charts

A "highest" or "lowest" claim is checked against the very chart it sits on. If they disagree, it doesn't ship.

Filters

Honest in every state

Interactive filters must stay verified per state โ€” every slice recomputes and re-verifies, not just the default view.

Access

Contrast & accessibility

Themes are contrast-checked to WCAG-AA; a beautiful chart that can't be read isn't a passing chart.

Safety

A safety smoke test

A final pass catches the failure modes that would embarrass a number before it ever reaches you.

When it can't be sure
A wrong number is worse than no number.

No prior period โ†’ no "% change." No target column โ†’ no "vs target." A source that shares no join key โ†’ its rows are not counted, and the answer says so. When an insight can't be backed by the data, it's dropped from the artifact โ€” and Columnly shows a plain, number-free "Not in this dataset" card that names exactly what your data can't answer. Only when the gap is real.

Security & data posture

Privacy-first by design โ€” stated honestly per product.

Google Sheets

Nothing stored at rest

The Sheets add-on reads your open sheet synchronously and stores nothing at rest. It never edits your original sheet unless you ask for a write โ€” and every write has full undo.

Web App

Your data, persisted โ€” and versioned

The web app keeps a per-organization database so your data can stay live, be refreshed daily and re-sliced. It's versioned and retained with atomic swaps โ€” a strength, and we say so plainly rather than hiding it behind a blanket "no data at rest" claim.

GDPR-compliant

Built for EU data-protection obligations; all data hosted in the EU.

Read-only CRM

Connectors cannot write back to HubSpot or Pipedrive.

Not used for training

Sample data to the model is never used to train it.

Full detail lives in our Privacy Policy and Terms.

Numbers you can defend in the meeting.

Every figure traceable, every figure verified โ€” and an honest "we can't tell" when that's the truth.