Skip to content
Cameron Mills

All projects

Tearline

Every figure cites its page

A company name or number goes in, and a tear sheet, capital structure, Excel model and references come out, with every figure tied to the document and page it came from.

Problem

Lenders and analysts working on UK private companies start from scanned accounts, and build each sheet by hand. The aim is that analysts stop assembling sheets by hand and lenders start from verified numbers instead of a scanned PDF.

Approach

Hold a cited record of UK private companies' accounts and turn it into finished work. The data comes from public registers under the Open Government Licence, and premium vendor data is never held or resold. Where a figure cannot be supported, the engine abstains rather than guesses, and an abstention counts as a feature.

Architecture

A name or company number goes in. The engine extracts the figures, enriches them from live sources, checks itself, and then builds the one-page tear sheet, the capital structure block, a supporting model and hyperlinked references. Scanned accounts are read twice, tied by arithmetic, and abstained on where the reads do not hold. Every figure sits on a ladder of reported, synthesised, labelled proxy or abstain. Each one carries an evidence card that pins it to the document, page and passage it came from. On filings with a text layer, the model may only quote figures that a plain substring search finds in the source.

Tearline architectureA company name or number goes in and its filed accounts are fetched from public registers. Extraction reads each figure, twice on scanned accounts. Every figure gets an evidence card linking it to the document, page and passage it came from. A check ties the figures by arithmetic and places each on a ladder from reported to abstain. Figures that pass go into the tear sheet, capital structure, model and references. Figures that cannot be supported are abstained on.Document inname or company numberExtractionscans read twiceFigure to its pagedocument, page, passageCheckarithmetic ties, ladderOutputsheet, model, referencesAbstainwhen not supportedpassescannot be supported
Every figure carries a link to the page it came from, and a figure that cannot be supported is abstained on rather than guessed.

What I built

I designed the engine and its verification rules and directed the build with Claude Code. The model output is a real Excel workbook with every figure tied back to its source. The written parts of each sheet pass a prose check written in plain code, with no model in the path, that blocks rather than warns. Hosting is set to the London region for UK data residency.

Results

As of 27 Sep 2026, 17 of the 18 work packages on the launch critical path were merged, with only the deploy left. The launch goal includes that nothing claims what the engine cannot back. Page-level citation on scanned accounts is new and has not yet been checked by a person.

What didn't work

Early sales copy said more than the engine could prove. So every claim now goes through a register that marks it true, roadmap or forbidden, with the proof or the reason beside it. One line promised an absolute accuracy guarantee and was cut, because nothing on disk supports it. The checkable half stays: any figure, one click back to its source.

What I'd do next

Anchor every figure on a scan to the exact words on the page, through a word-level OCR layer, rather than a page number and the text the model reported. Then publish an error rate on scanned filings from figures a person has checked.

Stack

  • TypeScript
  • Next.js
  • React 19
  • Postgres
  • exceljs
  • Playwright
  • Vercel (London region)