Skip to main content
Community edition · open source
Validation

Two agents check your findings.
Every verdict stays visible.

With validation on, which is the default, two AI agents check what DecisionBox finds. A verifier compares each claim with the records it cites. A refuter goes back to your warehouse to try to prove it wrong. The finding keeps the verdict, so you can see what held up and what didn't.

app.decisionbox.io/insights
DecisionBox insight page: "Late-delivery rate reached 21.36% in 2018-03, above the ~8% window average", with the monthly late-delivery table and a Validation card marked Supported

A finding from a run on a public e-commerce dataset. The Validation card on the right says Supported.

How it works

Two checks, from opposite sides

Verifier

Checks each claim against its evidence

It splits the finding into separate claims: the headline, each number, each comparison. Then it puts every claim next to the row it depends on and marks it confirmed, supported, rejected or unverifiable.

Refuter

Tries to break it

It looks for evidence against the claim. It can write and run its own SQL against your warehouse, or reread the saved query results. It has to read data before it may return a verdict. If it runs out of rounds without doing so, the result is downgraded to Partial.

app.decisionbox.io/insights
Validation breakdown, Verifier section: each claim is marked Supported next to the exact row it was checked against (step 4: 7,003 delivered, 1,496 late, 21.36%)

Each claim sits next to the row it was checked against: 7,003 delivered orders, 1,496 late, 21.36%.

app.decisionbox.io/insights
Validation breakdown, Refuter section: the refuter wrote and ran its own SQL against the warehouse and got the same answer, 1,496 of 7,003 orders late (21.36%)

Here the refuter wrote a new query and got the same answer: 1,496 of 7,003 orders late.

The verdict

A label that travels with the finding

The two results combine into one verdict on the finding.

Confirmed

The rows match the claim exactly, and the refuter found nothing against it.

Supported

The rows are consistent with the claim, and the refuter found nothing against it.

Partial

Some claims are backed. Others couldn't be checked, or a check was incomplete.

Unverifiable

There were no rows to check the headline against.

Rejected

The verifier or the refuter found rows that contradict the headline.

A finding can also show Skipped, when the run reached its validation limit first, or Disabled, when validation is off for the project. You can filter your insight list by verdict.

When the check wins

A rejected finding stays in view

This finding claimed that the top price band brought in 46% of gross sales value on 24% of sales. The verifier read the rows: the band was 15.2% of sales. The total in the finding was off too, so the 46% share was wrong as well. Both agents rejected it.

The finding is labeled Rejected, not quietly dropped, with the correct figures beside it.

app.decisionbox.io/insights
A finding that did not hold up: "Top price band (1000+) carries 46% of GMV on 24% of sales" is marked Rejected, because the evidence shows the band is 15.2% of sales

A finding from a run on a public ticket-sales sample dataset, rejected with the figures from the rows.

By default, only confirmed and supported findings are used to write recommendations. You can change which verdicts count for each project. With validation on, every recommendation a run keeps is checked the same way.

Claim rules

Findings are written to be checked

A fixed set of rules shapes how each finding is written, before any check runs. A superlative such as “highest” has to name the data window it came from. A finding can't claim more than its queries covered: if the widest query spans 11 weeks, it can't talk about “last year”. Each number cites the query step it came from, so the verifier knows which rows to read.

app.decisionbox.io/insights
"How This Insight Was Found": the three SQL queries the AI ran to reach the finding, with row counts and run times

The queries behind the finding are on the record, each with its row count and run time.

Settings

You decide how it runs

On by default

Each run checks up to 30 findings, starting with the ones that affect the most records. Findings past that limit are marked Skipped.

Off per project

Turn it off under Settings → Advanced, and runs spend no model calls on validation.

On demand

Run validation on any single finding or recommendation from its page, with live progress and a cancel button.

Your models

The verifier and the refuter each have their own step in Settings → Models, so you can give them a different model from the rest of the run. Bring your own model explains how.

app.decisionbox.io/settings
Project settings, Advanced tab: the switch that runs validation on every insight and recommendation

What validation doesn't do

Validation checks a finding against your data. It can't tell you whether the data itself is right, and it doesn't decide whether a finding matters to your business. That call is still yours. The verdict, the evidence and the SQL are there to help you make it.

Common questions

Questions people ask

Does validation check every finding?

With validation on, which is the default, each run checks up to 30 findings, starting with the ones that affect the most records. Any others are marked Skipped, and you can validate each of them on demand from its page. Every recommendation the run keeps is checked as well.

What happens to a finding that fails?

It stays in your list, labeled Rejected, with the evidence that contradicts it. By default, rejected findings aren't used to write recommendations.

Does validation add cost?

Yes, some. Each check makes its own model calls, and the refuter can run queries. If you switch validation off for a project, those calls aren't made. You can also run the verifier and the refuter on a model of your choice.

Is validation in the open-source edition?

Yes. Validation is part of the open-source Community edition. Enterprise is built on the same platform, so it has validation too.

Try it in two minutes

Clone the repo, run docker compose up, and point it at your warehouse.