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
| Metric | Formula | Missing data and edge cases |
|---|---|---|
| Revenue growth | (current − prior) / prior | None if prior is missing or zero |
| CAGR | (last / first)^(1/years) − 1 | None for non-positive base |
| Gross margin | (revenue − COGS) / revenue | None if revenue is zero |
| Operating margin | operating income / revenue | None if revenue is zero |
| Reported EBITDA | net income + interest + tax + depreciation + amortization | Stated EBITDA line is cross-checked; a mismatch flags review |
| Checked adjusted EBITDA | reported EBITDA + accepted add-backs − accepted downward adjustments | Rejected and unsupported items stay visible but excluded; acceptances are rule-based until a reviewer records a decision |
| Enterprise value | purchase price, or equity price + debt assumed − cash acquired | Basis is an explicit deal input |
| EV / EBITDA, Debt / EBITDA | enterprise value ÷ EBITDA, funded debt ÷ EBITDA | None if EBITDA is zero; negative EBITDA is noted |
| Annual debt service | P·r / (1 − (1+r)^−n) × payments per year | Zero-rate loans amortize straight-line; balloon structures are out of scope |
| CFADS | adjusted EBITDA − maintenance capex − cash taxes − working-capital investment | The bridge is stored with every scenario |
| DSCR | CFADS ÷ annual debt service | EBITDA is never silently labeled CFADS |
| Cash-on-cash | year-1 cash flow to equity ÷ initial equity | None if equity is zero |
| IRR | rate where Σ cf_t / (1+r)^t = 0, annual periods, bisection | Periodic, not XIRR; None without a sign change |
| Break-even revenue | (fixed costs + capex + debt service) ÷ contribution margin | Pre-tax, before working capital; hidden when inputs are missing |
| Customer concentration | top customer revenue ÷ total revenue | Aggregated from the customer file with row citations |
| Recurring revenue share | contract-supported recurring revenue ÷ total revenue | Only 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.
- Every evidence chunk records document, version, page and paragraph, sheet and row, or CSV row. Citations resolve or the claim is dropped.
- Uploaded documents are untrusted. Instruction-like text inside them is stored as inert content, labeled, and surfaced as a finding. It never changes system behavior.
- Provider output must validate against a versioned schema before anything is persisted. Prompt, schema, model, and run id are stored with every extraction.
- Original AI output is immutable. Reviewer decisions are additive and audited; the report shows both.
- A report fails validation if any material statement lacks a resolvable citation or a named derivation.
- The deal chat answers deal questions only through read-only tools over stored rows; every figure it states carries a citation marker that code validates before the reply is saved.
Limitations
- Portfolio prototype with synthetic data. Not diligence software, and not financial, legal, tax, or investment advice.
- Extraction can be incomplete or wrong; every status is meant to be reviewed by a person.
- Deterministic arithmetic does not make its inputs verified. The add-back rules test an adjustment against the statement lines (for example, an owner-compensation normalization smaller than the recorded salary is accepted); they do not establish a market salary or a settlement's true cost. Every accepted add-back still deserves a reviewer's eye.
- Financial outputs depend on mapped and reviewed inputs. Interest-only and balloon debt structures are not modeled.
- The evaluation suite scores the curated Northstar fixtures with the rule-based provider. Passing it shows the pipeline is consistent, not that extraction is accurate on unfamiliar documents.
- A real deployment would need stronger identity, retention, encryption, monitoring, rate limits, and vendor-risk controls.