How we check claims.

Two systems share the work. A language model reads and compares; deterministic code counts. Neither is allowed to do the other's job, and a person makes the final call on every claim.

Claim statuses

Supported
At least one citation that resolves directly confirms the claim, or the deterministic engine reproduces the number within tolerance.
Contradicted
At least one citation that resolves directly conflicts with the claim, or the engine's value differs beyond tolerance (1.0 point for percentages, 2% for currency).
Unsupported
No provided evidence addresses the claim. Absence of evidence is never treated as contradiction.
Review required
Evidence is partial, mixed, or low-confidence; a calculated input needs a human check; or a reviewer rejected the AI finding.

Guardrails apply in code regardless of provider: Supported requires a supporting citation, Contradicted requires a contradicting one, uncited output degrades to Unsupported, and low confidence routes to review. A status describes the state of the evidence, not a verdict on the deal.

What the model does, what code does

The model (a live provider, or the rule-based mock)

  • Classify documents
  • Extract material claims with a source chunk
  • Rank and compare retrieved evidence
  • Draft questions, conditions, and narrative
  • Explain persisted calculation outputs

Deterministic code

  • Validate and hash uploads; never execute content
  • Map statements with cell provenance
  • Every financial formula below
  • Scenario projections and immutable snapshots
  • Citation existence and report validation
  • Authorization, state machines, audit history

Formula contract

Every financial formula the engine computes, with how missing data is handled
MetricFormulaMissing data and edge cases
Revenue growth(current − prior) / priorNone if prior is missing or zero
CAGR(last / first)^(1/years) − 1None for non-positive base
Gross margin(revenue − COGS) / revenueNone if revenue is zero
Operating marginoperating income / revenueNone if revenue is zero
Reported EBITDAnet income + interest + tax + depreciation + amortizationStated EBITDA line is cross-checked; a mismatch flags review
Checked adjusted EBITDAreported EBITDA + accepted add-backs − accepted downward adjustmentsRejected and unsupported items stay visible but excluded; acceptances are rule-based until a reviewer records a decision
Enterprise valuepurchase price, or equity price + debt assumed − cash acquiredBasis is an explicit deal input
EV / EBITDA, Debt / EBITDAenterprise value ÷ EBITDA, funded debt ÷ EBITDANone if EBITDA is zero; negative EBITDA is noted
Annual debt serviceP·r / (1 − (1+r)^−n) × payments per yearZero-rate loans amortize straight-line; balloon structures are out of scope
CFADSadjusted EBITDA − maintenance capex − cash taxes − working-capital investmentThe bridge is stored with every scenario
DSCRCFADS ÷ annual debt serviceEBITDA is never silently labeled CFADS
Cash-on-cashyear-1 cash flow to equity ÷ initial equityNone if equity is zero
IRRrate where Σ cf_t / (1+r)^t = 0, annual periods, bisectionPeriodic, not XIRR; None without a sign change
Break-even revenue(fixed costs + capex + debt service) ÷ contribution marginPre-tax, before working capital; hidden when inputs are missing
Customer concentrationtop customer revenue ÷ total revenueAggregated from the customer file with row citations
Recurring revenue sharecontract-supported recurring revenue ÷ total revenueOnly rows typed as maintenance agreements count

All arithmetic is Decimal. A missing input yields no value and a named reason; nothing is defaulted silently. Every persisted metric stores its formula and input snapshot.

What a citation means

A citation that resolves shows where a statement came from: a page and paragraph, a sheet and row, or a CSV row in a specific version of a document. It does not show that the statement is true, and it does not show that the cited passage supports every word around it. The checks that carry the judgement are the status rules above, the recomputed numbers, and a reviewer who opens the source and reads it. A citation is the shortest path to that source, not a substitute for reading it.

Limitations