Legal & M&A due diligence

Top-k can't prove absence

"Check every page of this appraisal." "Confirm no contract in this data room has a change-of-control clause." These aren't retrieval questions — they need coverage, and a tool optimised for finding the best evidence can't tell you whether it checked everything.

An exhaustive review of all 9,000 documents in a data room for a change-of-control clause: one child run per document, a reduce run over all of them, and a coverage number — 9,000 of 9,000 processed — instead of a confidence score.

Sound familiar?

"Are you sure?" has no good answer today

A partner asks whether any of the 9,000 documents in the data room contains a change-of-control clause. The honest answer, with a retrieval-based tool, is "probably" — and probably isn't good enough to sign off on.

Retrieval finds the most relevant chunk, not every chunk

Top-k is built to answer "what's the best evidence for this question", which is exactly the wrong optimisation for "did we check everything".

A miss here is the failure mode that matters most

Absence of evidence is not evidence of absence — but a tool that only surfaces the most relevant passages can't tell the difference between the two, and a reviewer relying on it doesn't know which one they got.

Why the usual fixes don't move the number

Asking the retrieval system for more chunks (top-50 instead of top-5)

More relevant chunks is still relevance-ranked, not exhaustive. The 51st most relevant chunk might be the one with the clause, and nothing changes about whether it gets seen.

A junior associate reading all 9,000 documents

It's the only reliably exhaustive option today, and it costs days of billable time for a question a machine can check in the background — while the deadline doesn't move.

Keyword search for "change of control"

Clauses that matter are rarely phrased with the exact term a keyword search expects, and a synonym or a differently structured provision slips straight past a literal match.

Trusting the retrieval-based summary that came back clean

A clean-looking summary from a top-k system reports what it found, not what it checked. There's no number anywhere that says how many of the 9,000 documents it actually looked at.

How we solve it

01The task declares its coverage mode

Most tasks read top-k retrieved chunks, which is correct for "answer this question". A task can instead declare exhaustive coverage, which changes how it executes entirely.

coverage: retrieval | exhaustivedeclared per task

02One child run per document, then a reduce run

Exhaustive coverage is a map-reduce: every document in scope gets its own run against the task, and a final reduce run aggregates the results into one answer.

child run per documentreduce run aggregates

03Coverage is a reported number, bounded up front

The parent run records documents_in_scope, documents_processed, and failures — and cost and wall-clock are shown before the run launches, not discovered after.

documents_in_scope: 9,000documents_processed: 9,000failures: reported, not hidden

What you get on every document

A coverage number, not a confidence score

9,000 of 9,000 documents processed is a fact you can check against the data room's own document count — not a self-reported confidence from the model.

Every document gets its own run

A failed child run is visible and retried, not silently dropped from the aggregate — so "we checked everything" is actually true when the run says so.

Cost and time bounded before launch

9,000 child runs at a known per-run cost is a number you see and approve before it starts, not a surprise on next month's invoice.

The reduce run is itself a citable record

The final "no clause found" answer is a run like any other — reviewable, with every child result it aggregated still attached underneath it.

The obvious objections

Build your first agent with Inteleto