All projects

Case study

Finley

An AI analyst for finance teams that reads the news against a client's forecast and shows its math before anyone changes a number.

One measured scan: 8 Claude agents, 129 seconds, about 3 cents of model usage

Who had the problem#

Finley is for the people who keep a company's forecast honest: FP&A analysts, and fractional CFOs who watch several clients at once. Every forecast rests on a few bets, like "gross margin holds at 34%" or "hyperscaler capex grows 30%." Supplier price changes, competitor moves and new rules land between reforecasts, and the team finds out at the variance review.

Nobody has time to read the news for every client. Keyword alerts say that something happened, not whether it touches the numbers. And a confident AI summary without sources is a liability in finance, because an analyst can't defend a number they can't check.

What I built#

My team of 3 built Finley for the Sense AI hackathon: an AI analyst that reads the news against a client's forecast and shows its math. I led the team and gave the pitch, designed the agent pipeline and the evals, and built the deterministic math layer. You tell Finley what the forecast assumes, a planning agent maps the 5 to 10 outside forces that move that business, and one click runs the scan.

What comes back is a short list: facts kept apart from interpretation, graded sources, scores that show their math, and an illustrative impact in the client's own EBITDA. Finley flags and the analyst decides. Every finding starts as pending, and Finley never touches the forecast model.

To test whether it really works, I designed a backtest. It freezes Finley at a past date, such as Netflix on December 31, 2022, lets it read only news published by then, and scores its forecast of the next 4 quarters against what the company actually reported and did.

How it works#

Up to 24 Google News searches through Bright Data feed up to 8 Claude Haiku 5.5 agents in 3 rounds (research, analysis, judgment). The agents propose, and plain code decides. Each call must answer in a closed JSON schema before its deadline, so all agent work ends by 270 seconds, inside Base44's 5-minute function limit. After the research round, code checks every claim: the quote must appear word for word in the cited headline or snippet, and every number in the cited text. A claim that fails is marked unverified, and on its own it can never state a fact, carry a dollar figure or move an assumption. The diagram walks through one scan, from the client's assumptions to a scored finding.

One scan, from the client's assumptions to a scored findingGoogle News searches feed Claude agents in 3 rounds: research, analysis and judgment. Between the rounds, plain code decides: it checks every claim against its source, computes every dollar figure in a deterministic math layer, and caps the scores before a finding is recorded.Google Newssearchesup to 24, throughBright DataResearch roundarticle text is untrusteddataCode checksevery claimquote word for word,every number in the citedtextClient'sassumptionsthe research agentsnever see themAnalysis roundthe impact agent onlyproposes inputsMath layerdeterministic TypeScript:revenue, COGS, EBITDA,enterprise valueJudgment roundClaude Haiku5.5 agentsCode capsconfidence and urgencyScored findingobserved facts apartfrom interpretationarticle textclaimsproposed inputsOne scan, from the client's assumptions to a scored findingGoogle News searches feed Claude agents in 3 rounds: research, analysis and judgment. Between the rounds, plain code decides: it checks every claim against its source, computes every dollar figure in a deterministic math layer, and caps the scores before a finding is recorded.Google News searchesup to 24, through Bright DataResearch roundarticle text is untrusted dataCode checksevery claimquote word for word, everynumber in the cited textClient'sassumptionsthe researchagents never seethemAnalysis roundthe impact agent onlyproposes inputsMath layerdeterministic TypeScript:revenue, COGS, EBITDA,enterprise valueJudgment roundClaude Haiku 5.5 agentsCode capsconfidence and urgencyScored findingobserved facts apartfrom interpretationarticle textclaimsproposed inputs
One scan, from the client's assumptions to a scored findingDashed box: an AI model or agent
  1. Up to 24 Google News searches through Bright Data feed the research round. The research agents treat article text as untrusted data and never see the client's assumptions.
  2. Code checks every claim: the quote must appear word for word in the cited headline or snippet, and every number in the cited text. A claim that fails is marked unverified.
  3. In the analysis round, the impact agent only proposes inputs.
  4. The deterministic TypeScript math layer turns those inputs into revenue, COGS, EBITDA and enterprise value.
  5. The judgment round scores the finding, and code caps confidence and urgency.
  6. The scored finding keeps observed facts apart from interpretation, with the analyst's review status.

The math layer is deterministic TypeScript shared by the server and the browser. The impact agent only proposes inputs (which P&L line moves, the size of the shock, the share exposed, the share passed on to customers), and the engine turns them into revenue, COGS, EBITDA and enterprise value, with materiality bands at 1, 3, 5 and 10% of EBITDA. The engine values a short shock only for the quarters it lasts instead of capitalizing it at the full multiple, because, as a comment in the code puts it, a two-quarter price spike isn't worth 9x. If no source sized the shock, Finley shows no number at all.

Code also caps what an agent can claim. Confidence tops out at 4 of 5 for a single outlet, 3 for headlines only and 2 for opinion or unverified claims, news older than 21 days can't score above 3 on urgency, and an urgent alert needs at least 4 on materiality, 3 on confidence and 4 on urgency after those caps. Each Finding record keeps observed facts apart from interpretation, with every source's outlet, type and reliability tier (set by fixed rules on the outlet and URL, never by a model), its scores and the analyst's review status. The research agents treat article text as untrusted data and never see the client's assumptions or financials, so the market picture isn't bent toward what the client hopes to hear.

The hardest part#

Making the backtest honest took the most care. A model that sees the future scores beautifully and proves nothing, and the leaks were sneaky. Google's date filter is a request, not a guarantee; a result labeled "3 weeks ago" counts back from the day of the search, years after the cutoff; and Yahoo's price history is adjusted for later stock splits, so even an old closing price hints at what came next.

So code re-dates every search result and excludes anything undated, coarsely dated or after the cutoff, keeping each exclusion on file with its reason. Backtest runs skip stock prices, earlier findings and saved questions, and the forecaster only sees a public version of the case with every outcome stripped, which a test checks. The one leak code can't screen is what the model already remembers, so the same model forecasts twice, with and without Finley's news, and blind judges score both without knowing which one had the news.

Results in numbers#

In a measured end-to-end test on October 10, 2026 (a fictional company and 10 headlines), all 8 agents finished their 3 rounds in 129 seconds: 21 for research, 38 for analysis and 70 for judgment. The scan used about 35,000 input and 52,000 output tokens, about 3 cents of Claude usage, and produced 7 findings. Every live scan stores time and tokens per agent, so the cost of any scan can be audited.

More than 50 Deno tests pass across the backend and frontend. They cover the source tiers, the date screening, the safe expression compiler behind the scenario sliders, the backtest scoring (Brier score, range coverage, precision and recall on management decisions), and the checks that refuse to publish a dry run as a result. The evals ship with 3 backtest cases and open, cited answer keys: Netflix 2023, Warner Bros. Discovery 2025, and Spotify from mid-2025 to mid-2026.

The Netflix backtest ran on October 11, 2026, and its scorecard is public. Frozen on December 31, 2022 with only news dated on or before that day, Finley forecast Netflix's 2023, and deterministic code scored it against what Netflix later reported. All 4 of its 80% quarterly revenue ranges held (2.2% average error), and its advice anticipated 3 of Netflix's 7 key decisions that year, including paid sharing and the DVD shutdown. The same model with no news did about as well, so this one-company test doesn't show the news scan improving the forecast yet. That's the number I want to move.

What's next#

First, a bigger and firmer test. 20 answer-key figures are still flagged for checking against the companies' filings, and one company with 12 questions can't separate the news from noise, so I'd confirm the key, run the Warner Bros. Discovery and Spotify cases, and repeat each run to measure how much results vary.

Then the gaps we listed in the repo ourselves. The agents read headlines and snippets only, so full-article reading through Bright Data's Web Unlocker comes next, followed by per-analyst data isolation with row-level security (today every signed-in user sees every record) and scheduled morning scans.