You're an analyst at a family office. You have 2 to 3 weeks to read a company's documents before the family invests. Data Room Check reads them with you. It states facts. You decide.
The deck is written to sell. The data room holds the truth, across hundreds of files you don't have time to read. The vision: every claim checked, every file read, and every result one click from its source page.
The family decides on figures the seller chose to show. You can only check the ones you have time for, so a wrong one can reach the decision.
A lawsuit, a loan that must be repaid if owners change, a CFO who left. They sit in files you never had time to open.
Your associate can't see what you checked or where, so they re-read the files before signing off.


| Your job | Hypothesis | Target, then result | Expected impact |
|---|---|---|---|
| When I get a deck, I want every number checked, so I never decide on a wrong one. | If every number is checked against the data room, wrong ones get caught, because each mismatch shows both pages. | 4 of 4 wrong numbers flagged: 4 of 4 | Fewer decisions made on a wrong number |
| When I get a data room, I want every file read, so no risk depends on what I had time to open. | If one red flag list runs over every page, fewer risks are missed, because no file waits for my time. | 6 of 6 red flags: 6 of 6, including both not on the list | Fewer risks found after the deal closes |
| When I hand over my work, I want my associate to trust it, so they spot-check instead of re-reading. | If every result shows a quote code found on its page, checking takes one click. | 100% of results proven: 100% | Sign-off time down (unobserved) |
Results on prompt v3, all four search methods, scored against an answer key written before the first run. Guardrail: a result that fails the code check is never shown as fact.
At 4 times revenue, the deck's $1.8M revenue gap is $7.2M of value paid for but not there. On a 10% stake, the family overpays $0.72M.
Illustrative, on fictional numbers. The legal claim and the loan clause also surface before signing, so you can ask for a lower price or for cover.
The weak link is belief, so the fix is built in: the source page beside every result, and "Not found" instead of a guess.
The same AI and the same code checks, with four ways to choose what the AI reads. That choice decides the cost, the speed and what can be missed.
| Method | What the AI reads | Strength | How it fails |
|---|---|---|---|
| A. One model call | The whole data room, every time | Can't skip a page | Too big and costly past a few hundred pages |
| B. RAG (search, then answer) | The 8 passages closest to the number | Cheapest, scales | Silently: misses a page and still says Confirmed |
| C. PageIndex (table of contents) | Up to 6 sections the AI picks from headings | Keeps sections whole | Wrong branch when files lack clear headings |
| D. RAG + PageIndex | Search keeps 3 files, then headings | Fewest passages read | A wrong file shortlist, or a wrong branch |
Each square is one of the data room's 64 passages, one row per file.the AI read ita page that holds the answer. Hover a square for its text.
A hypothesis: all four pass on this data room. The scale test is in the next steps.
On the first prompt, RAG confirmed the deck's $38.0M. It read the monthly accounts ($38.0M, with a $1.8M one-off fee) but never the audited accounts ($36.2M). Every quote it gave was real, so the code checks passed.


Checks catch a wrong quote. They can't catch a page that was never read.
The fix: at most 2 passages per file, so 12 look-alike monthly pages can't crowd out the one audited table.
The bar to ship: every result proven by code (lineage 100%), no missed issue (recall 100%), at least 90% of flags real (precision). The answer key (4 wrong numbers, 6 right ones, 6 red flags) was written before the first run and never changed.
| Prompt | A. One call | B. RAG | C. PageIndex | D. RAG + PageIndex |
|---|---|---|---|---|
| v1 | Fail P 82% · R 90% · L 100% | Fail P 80% · R 80% · L 100% | Fail P 82% · R 90% · L 100% | Fail P 82% · R 90% · L 100% |
| v2 | Fail P 100% · R 100% · L 95% | Fail P 100% · R 90% · L 100% | Pass P 100% · R 100% · L 100% | Pass P 100% · R 100% · L 100% |
| v3 | Pass P 100% · R 100% · L 100% | Pass P 100% · R 100% · L 100% | Pass P 100% · R 100% · L 100% | Pass P 100% · R 100% · L 100% |
P = precision, R = recall, L = lineage. v3 passed again on a fresh rerun with every AI call live.
generation = an AI call · retriever = picking passages · embedding = the search index · guardrail = the code checks. Each prompt version is a Langfuse experiment scored on precision, recall, lineage, pages found and pass.
| Method | Passages per number | Tokens in | Tokens out | Cost, 10 numbers | AI time, s |
|---|---|---|---|---|---|
| A: One model call | 64.0 | 58,917 | 24,136 | $0.135 | 91.3 |
| B: RAG | 8.0 | 11,197 | 13,103 | $0.058 | 61.4 |
| C: PageIndex | 6.5 | 26,174 | 19,726 | $0.094 | 83.2 |
| D: RAG + PageIndex | 5.3 | 13,977 | 19,971 | $0.085 | 66.4 |
One fresh run per method, every AI call live. Price from Langfuse: $0.75 per million tokens in, $3.75 out (Gemini 3.8 Flash). RAG's search index takes 36 s to build, once per data room.
| Chose | Over | Gain | Cost |
|---|---|---|---|
| Code decides every status | Letting the AI judge | A result is proven or labelled unverified | Numbers in words need parsing ("three products") |
| Read every file for red flags | Searching for them | Coverage is proven | Cost grows with every page |
| Four methods side by side | Picking one up front | You see what each misses and costs | 4 times the AI calls |
Date: 2026-10-04 Owner: Alexandre Cela Status: Go (approved by Alex 2026-10-04)
A family office (a company that invests one family's money) must decide on a deal in 2 to 3 weeks. A wrong number in the seller's slides, or a risk in an unopened file, can change that decision. Today, nobody may notice either one.
The seller shares a folder of documents, called the data room. An analyst reads it by hand and notes findings in a spreadsheet. They often rely on the lead investor's summary, and that investor wants the deal to close.
A concrete case (made up for the demo). Fintech A's slides say its largest customer is 12% of revenue. The customer list in the data room shows 31%. If that customer leaves, almost a third of revenue goes. Today, the analyst catches this only if they open that file.
An AI checker for the data room. A language model (an AI that reads and writes text) does the reading. Code checks its work. 1. Verifies every slide claim. The AI finds the matching figure in the data room. It marks each claim confirmed, contradicted or not found. 2. Hunts for every listed red flag in every file. The list is fixed: change of owner clauses, legal claims, contracts ending soon and more. The AI also notes other unusual facts. 3. Shows the lineage of every result. Each result carries its file, page and an exact quote. Code confirms the quote is on that page, and the numbers match, before the result is shown. Results that fail are labelled unverified.
The bar it must meet: 100% of results with verified lineage, and at least 95% of flags real. Below either, it doesn't ship.
It states facts and never recommends. The analyst and the associate (who signs off the analyst's work) decide.
The family office makes money by paying the right price and avoiding losses it could have seen. Every number below is made up for this example.
One row per atomic problem: one job, one hypothesis, one metric. "Today" values and impacts are assumed, not measured.
| # | Problem | Today | Hypothesis | Success metric | Expected impact |
|---|---|---|---|---|---|
| 1 | Wrong numbers in the slides reach the decision | Only numbers the analyst has time for get checked | If every slide number is checked against the data room, then wrong ones get caught, because each mismatch shows both pages | Planted wrong slide numbers flagged: 100% | Fewer deal decisions made on a wrong number. Analyst hours re-checking slides: down (unobserved) |
| 2 | Risks sit in files nobody opened | Only opened files get read | If one warning-sign list runs over every file, then fewer risks are missed, because no file waits for the analyst's time | Planted risks found: 100%, including 2 or 3 not on the list | Fewer risks discovered after the deal closes. Files skipped for lack of time: 0 |
| 3 | The associate can't see what was checked | Spreadsheet notes, no page links | If every result shows its page and a quote that code matched to that page, then the associate trusts it without re-reading, because checking is one click | Results whose quote is found on the cited page: 100% | Associate sign-off becomes spot-checks, not a re-read. Sign-off time: down (unobserved) |
Must not get worse: claims shown as fact that failed the check: 0.
Not tackled here: - Retyping numbers for the financial model: needs a set list of fields. - Trusting the lead investor's summary: needs a sample summary to check. - Asking any free question: a search can't prove a fact is absent, so it can't support "nothing was missed." - Turning findings into a lower price: this is the investor's judgment.
| Factor | Analyst (uses it) | Associate (signs off) |
|---|---|---|
| Dream outcome | "I checked everything and I can prove it." | "I can sign off without redoing the work." |
| Perceived likelihood | Low to medium. Investors distrust AI answers they can't check. | Low. They'll trust it only after spot-checking pages. |
| Time delay | Results minutes after the folder loads (unobserved). | Same day as the analyst's run. |
| Effort & sacrifice | Upload the folder, review flagged rows, learn one new screen. | Click through flagged rows instead of reading files. |
Verdict. Belief is the weak factor for both. The cheapest lever is to show the source page and quote beside every result. Another is to say "not found" instead of guessing. The outcome doesn't need improving.
Go, as a portfolio prototype. The problem is plausible, the demo needs only fake data, and it adds a trust story Deck Rank and BDC Footnote Tape don't show. A user test with 2 analysts would make it a product case, not just a demo.
Sources: conversation with Alex 2026-10-04 (brief confirmed), ~/Documents/Company Tracker/company_scorer/demo/make_sample_decks.py, outputs/portfolio/deck-rank/linkedin.md, outputs/portfolio/bdc-footnotes/linkedin.md
Stage: Team Kickoff (lightweight AI PRD)
Last Updated: 2026-10-04
Owner: Alexandre Cela
Status: Draft
Opportunity analysis: outputs/opportunity-analyses/data-room-check-opportunity.md (Go, 2026-10-04)
Disclaimer. Fintech A, its data room, its people and every number in this document are fictional, created for this prototype.
A family office (a company that invests one family's money) has 2 to 3 weeks to decide on a deal. A wrong number in the seller's slides, or a risk in an unopened file, can change that decision. Today, nobody may notice either one.
Atomic problems (carried from the opportunity analysis). "Today" values and impacts are assumed, not measured.
| # | Problem | Today | Hypothesis | Success metric | Expected impact |
|---|---|---|---|---|---|
| 1 | Wrong numbers in the slides reach the decision | Only numbers the analyst has time for get checked | If every slide number is checked against the data room, then wrong ones get caught, because each mismatch shows both pages | Known wrong slide numbers flagged: 4 of 4 | Fewer deal decisions made on a wrong number. Analyst hours re-checking slides: down (unobserved) |
| 2 | Risks sit in files nobody opened | Only opened files get read | If one warning-sign list runs over every file, then fewer risks are missed, because no file waits for the analyst's time | Known risks found: 6 of 6, including 2 not on the list | Fewer risks discovered after the deal closes. Files skipped for lack of time: 0 |
| 3 | The associate can't see what was checked | Spreadsheet notes, no page links | If every result shows its page and a quote that code matched to that page, then the associate trusts it without re-reading, because checking is one click | Results whose quote is found on the cited page: 100% | Associate sign-off becomes spot-checks, not a re-read. Sign-off time: down (unobserved) |
Must not get worse: claims shown as fact that failed the check: 0.
Supporting evidence: none from users. The problem comes from how this kind of investing works. No analyst has confirmed it.
Why this. Every result is checked by code before it's shown. Deck Rank ranks decks. BDC Footnote Tape turns lender reports into a spreadsheet. Neither one checks a seller's claims against evidence.
Why now. It extends the private capital AI offer to a new buyer: the family office, through its analyst and associate.
Impact sizing. Not done yet: no deal volume or time-per-deal data exists. Alternatives considered are in Appendix B.
If this ships, the analyst gets every slide number marked confirmed, contradicted or not found, and every file checked for the same warning signs, each with a page. The associate signs off from that record. If it doesn't ship, coverage still depends on which files the analyst had time to open. Time saved is unknown. A test with 2 analysts on one data room would measure it.
| Factor | Analyst (uses it) | Associate (signs off) |
|---|---|---|
| Dream outcome | "I checked everything and I can prove it." | "I can sign off without redoing the work." |
| Perceived likelihood | Low to medium. Investors distrust AI answers they can't check. | Low. They'll trust it only after spot-checking pages. |
| Time delay | Results minutes after the folder loads (unobserved). | Same day as the analyst's run. |
| Effort & sacrifice | Upload the folder, review flagged rows, learn one new screen. | Click through flagged rows instead of reading files. |
Verdict. Belief is the weak factor. The cheapest lever is to show the source page and quote beside every result. Another is to say "not found" instead of guessing.
Trade-offs made: - Three ways to find evidence for a slide claim, compared on the same answer key. - A. One model call. The whole data room goes to the model at once. No search. It can't skip a page, and it stops working at roughly a few hundred pages. This is the baseline. - B. RAG (search, then answer). Pages are cut into passages. Each passage is turned into numbers that capture its meaning (embeddings). For each claim, the closest passages by meaning and by keyword go to the model. - C. PageIndex (follow the table of contents). Each file becomes a tree of section headings. The model reads the headings and walks down to the pages that matter. No embeddings. - B and C are more than 13 files need. They're built to learn both methods and to measure what each misses against A. - The red flag hunt never uses search. It reads every page of every file, because search can't prove a file was covered. - Checked once, stored. Each data room is checked when it loads. Reopening shows stored results and costs nothing.
Targets are in the atomic problems table. Two extra metrics: - Correct slide numbers wrongly flagged: 0 of 6. - Evidence pages found, per method: the share of answer-key evidence pages that A, B and C each find, shown side by side. Each method also reports how many of the 4 known wrong slide numbers it flags.
The answer key lists every issue in the data room, from a full manual read before the first run. It's stored apart and never shown to the model.
Kill criteria: after 2 attempts to improve the AI's instructions, we stop and don't publish if either is true: - Lineage below 100%. Some results lack a file, a page and a quote that code finds on that page. - Precision below 90%. Of everything the tool flags (wrong slide numbers and red flags), fewer than 90% are real issues in the answer key. (Lowered from 95% by Alex on 2026-10-05.) - Recall below 100%. The tool misses any of the 4 wrong slide numbers or 6 red flags in the answer key. (Added 2026-10-05.)
Why: an unverified result sends the associate back to the files, false flags teach the analyst to ignore flags, and a missed issue is the problem this tool exists to solve.
Test set caveat: the prompts were tuned on this one data room (3 revisions, all logged in Langfuse). A pass here shows the method works on what it was tuned on. A second data room the prompts have never seen is needed to show it generalises.
/portfolio-case-study goals pass.The PM reviews each step before the next one starts.
Principle: the model reads and drafts, code checks and computes, the person decides.
| Dimension | Specification |
|---|---|
| Primary tasks | Extract slide numbers. Find the matching evidence. Run the warning-sign list. Note other unusual facts. |
| Inputs | Every page tagged with file name, page number and section heading. Slide claims: the pages found by method A, B or C. Red flags: every page of every file |
| Model output | A list of claims. Each has a value, unit, period, source page and an exact quote. |
| Code checks | The quote must appear on the cited page (close match). The number must appear in the quote with the same unit and period. Totals and shares are computed in code from cited rows. |
| Labels | Confirmed, contradicted, not found or unverified. Each fact is marked stated, computed or inferred. |
| Never | Recommend, rate the deal or guess. A claim that fails a check is shown as unverified, never as fact. |
| Logged | Every run: input files, model name, raw model output, check results |
Behavior examples:
| Case | Input | Expected output |
|---|---|---|
| Good | Slide 6: "Largest customer is 12% of revenue" | Contradicted. Computed 31% from the customer revenue list, p.2. Both pages linked. |
| Good | Slide 5: "Gross margin 68%" | Confirmed. Audited accounts FY2025, p.4, quote shown. |
| Edge | Slide 4: "Revenue FY2025 $38.0M". Monthly accounts say $38.0M. Audited accounts say $36.2M. | Conflict. Both sources shown with dates. No pick between them. |
| Edge | The model cites p.7 but the quote is on p.8 | Unverified. Shown apart from the facts. |
| Reject | "Should we invest?" | The relevant findings, then: "The decision is yours." No recommendation words. |
Fintech A: payments software for mid-size retailers, founded 2014. A buyout fund leads the deal. The family office puts in money alongside it.
Files (13): pitch deck (10 slides) · audited accounts FY2024 · audited accounts FY2025 · monthly accounts FY2025 · customer revenue list FY2024 to FY2025 · top 3 customer contracts · loan agreement · ownership table · board minutes (last 4 meetings) · law firm letter · office lease.
Answer key: known issues (9):
| # | Type | Slide says | Data room shows | On the list? |
|---|---|---|---|---|
| V1 | Wrong number | Largest customer 12% of revenue | 31%, customer list | n/a |
| V2 | Wrong number | Revenue kept from last year's customers 115% | 104%, computed from customer list | n/a |
| V3 | Wrong number | 410 customers | 372, customer list | n/a |
| V4 | Conflict | Revenue FY2025 $38.0M | Audited $36.2M; monthly accounts $38.0M | n/a |
| D1 | Risk | Loan must be repaid if owners change | Yes | |
| D2 | Risk | $2.1M claim from a former partner | Yes | |
| D3 | Risk | Largest customer's contract ends in 5 months | Yes | |
| H1 | Risk | CFO resigned, in board minutes | No | |
| H2 | Risk | Office rented from the CEO's company above market rent | No |
Correct slide numbers (6): gross margin, staff count, founding year, offices, loan size, products. They test that the tool doesn't flag correct numbers.
Warning-sign list (7 checks): change of owner clauses, legal claims, contracts ending within 12 months, unpaid taxes, loan covenant breaches (loan conditions broken), customer concentration over 20%, plus "other unusual facts."
Alternatives considered: - Open question box with search (RAG). Not chosen: a search can't prove a fact is absent, so it can't support "nothing was missed." - Typed questions turned into database queries (text-to-SQL). Not chosen: it adds a second way to be wrong. - Keep Fintech A as an early-stage startup. Not chosen: older companies with loans are closer to typical family office deals.
Risks and recovery:
| Risk | Detection | Fallback |
|---|---|---|
| The AI misses the 2 issues the red flag list doesn't name | Neither found after 2 attempts to improve its instructions | Remove that check; state the tool only finds what the list names |
| B or C misses evidence pages, so a claim reads "not found" when the data room has it | Fewer evidence pages found than A on the answer key | Show A's result; report the gap in the case study |
| The known issues are too easy, so the result proves little | All 9 found on the first run with no prompt work | Add 2 harder ones and report both runs |
| The tool marks itself correct | Scoring reads the answer key only | Answer key is written first, stored apart, and never passed to the model |
| The model invents a quote | Quote not found on the cited page | Unverified label; counted in the guardrail |
| Stage | Artifact | PM OS skill |
|---|---|---|
| Opportunity | Go/no-go: 3 problems, value equation, Go as a prototype | /opportunity-analysis |
| Requirements | Lightweight AI PRD: behaviour contract, answer key, kill criteria | /prd-draft |
| Build | Data room, 4 methods, code checks, guided demo; 69 automated tests | /code-first-draft |
| Evaluation | 3 prompt versions as Langfuse experiments; fresh benchmark run | Langfuse agent skill |
| Case study | This page | /portfolio-case-study |