Lookout
Skip to the catch →
A committed-spend agent · synthetic data, real engine

Your dashboard says this budget is 30% spent. It's actually at 127%.

Lookout watches a finance team's budgets. It catches the money that's promised but not yet paid: the signed contracts and email handshakes that push a healthy-looking budget over plan. On the budgets that are actually fine, it says nothing.

↓ Run it yourself. No signup, real output.
You came in from a link Watch it catch an overspend that three finance tools would miss. Then check the receipts yourself.
The catch · Seed 1

It clears three budgets and catches the one that looks fine.

These are Northwind's Q3 budgets, the way a finance dashboard shows them. Press run. Lookout stays quiet on the three that are fine, including one that looks alarming. It speaks up on the one that looks calm and isn't.

Northwind Technologies Q3 2026 budgets
as of Sep 1 · 1 mo left
Contractors & Professional Services
Owner: Priya Nair · plan $300,000
30% surface
30%
caught
$50K of this lives only in an email thread. Invisible to every finance tool.
Marketing
plan $200,000 · looks nearly maxed
95% surface
95%
clear
Software & Tools
plan $90,000
22% surface
22%
clear
Facilities
Owner: Rosa Lin · plan $60,000
63% surface
63%
clear
It reads every contract, then does the math the dashboard skips.
Lookout → the controller verbatim agent output · every figure traceable to the source data

Flag — over plan now, ~1 month left to act

Contractors & Professional Services looks 30% spent. It's actually at 127% of plan.

The dashboard shows $90,000 paid against a $300,000 quarterly plan — looks comfortably on track. What it doesn't show is $290,000 in signed-but-unbilled commitments sitting behind that number. Add the two together and the true position is $380,000$80,000 over the full-quarter plan, with one month still left in Q3.

Here's what's driving it:

VendorSignedBilledStill owedEvidence
Meridian Design Co$180,000$60,000$120,000Signed MSA on file
Lumen Dev Shop$150,000$30,000$120,000Signed SOW on file
Apex Talent Partners$50,000$0$50,000Email thread only — never logged in the finance tool

The two contracts together account for $240,000 of committed-but-unpaid spend; the retained-search deal adds another $50,000, and that one is the real blind spot — it exists only as an email agreement, invisible to anything except a manual read of the inbox.

None of the $290,000 owed has actually hit the account yet — that's the good news, it's still preventable. The bad news is timing: this is the last month of the quarter, and both contractors' remaining work plus the recruiter's placement fee (expected this month) can land as invoices before quarter close, converting "committed" into "paid" fast. Once those bills post, the choice to scope down or defer disappears.

What to do now: get Priya Nair to confirm the remaining scope on both the Meridian and Lumen engagements — is $120,000 apiece still accurate for what's left this quarter, or can either be phased into Q4? And get the Apex Talent retained-search agreement formally logged and confirmed — right now it's a $50,000 obligation finance has no system record of. Do this before month-end invoices land, not after.

My annotation · not agent output
The one nothing else can see
$50,000

This $50,000 lives in an email thread and nowhere else. Nobody entered it into a finance system, so no dashboard or spend tool would ever show it. Two of the rows in the brief are signed contracts a system can track. This one is a handshake in an inbox. That gap is the whole story: a budget that reads 30% is quietly $80,000 over. The math is easy. Finding the money is the hard part, and that is the job.

You can check this yourself. The three rows in the brief are the real commitments in the data. Two are logged contracts. The third exists only in an email thread, the one no dashboard could show you. Add the still-owed amounts to the $90,000 already paid and you get $380,000 against a $300,000 plan. The agent did the math. The checking is on you.

You just watched it work. Now take the controller's seat, and make the call yourself before you scroll to the answer.

Prototype · take the controller's seat
Legal & Compliance Q3 2026 · plan $200,000
Dashboard 30% spent
Paid to datepaid
$60,000
Vellum LLP retainer, signedcommitted, unbilled
$110,000
Specialist doc review, agreed by emailcommitted, unbilled
$60,000
Dashboard total
$60,000
30% of plan
?
You're the controller. This budget looks 30% spent, comfortably on track. Flag it, or leave it?
Commit before you see the answer. That's the whole point.
Boundary pair · same 30% surface · one decisive difference
The committed work is going aheadFlag
$230,000 · 115% over
So that $170K will still get spent. The budget is really over plan.
the call you just watched
The same work was called offSilent
$60,000 · 30% under
So that same $170K will never be spent. The budget is actually fine.
agent called this one too
Same 30% surface, opposite correct answer, and the agent gets both. This exact pair is one instance from the golden set below, hardcoded here as an exhibit, not run live.
You just failed the test the agent passes 120 times over. Here's how I proved it wasn't memorizing →

That's the demo, and the demo is just the doorway. It works, and it holds up on cases it has never seen, because of how it's built and how it's evaluated. That part is below, and it's the real evidence.

What this is

A worked example of how I build and evaluate an agent. Not a product pitch.

Lookout is a committed-spend finance agent, but the agent is the case study, not the point. The point is the method: how I take an AI product from a framework down to a shipped, measured system, and where I make the calls that separate a demo from something you'd trust.

So the question to hold isn't whether Lookout is a business. It's whether I can build and evaluate agents at your bar. Everything below is the evidence, laid out in the order I'd want it audited.

Act II · the build · architecture

Four decisions, each made for a reason.

Not a parts list. The judgment is in why each call was made, and what would change at scale.

Autonomy
The agent diagnoses. A human approves the fix. Sheridan Level 5 on the autonomy spectrum.

Because the math can be automated, but the decision to cut a vendor or defer scope belongs to the controller. Automating the diagnosis removes the tedious work. Automating the decision destroys trust the first time it's wrong. So the agent proposes and the human disposes, which is exactly where Ramp's and Warp's agents sit too.

Trust boundary
Code owns the math and the honesty. The model owns judgment and explanation.

Because prompts persuade and code enforces. Asking a model in the prompt not to invent a number is a hope. A validator that rejects any figure not traceable to a tool output is a guarantee. Every dollar in a brief comes from one two-bucket function, and the model is never allowed to do arithmetic.

Topology
One agent, one environment. Single-loop, deliberately.

Because multi-agent buys coordination failure modes that this problem doesn't have: orchestration, single-writer conflicts, conditional writes. A single loop is the simpler correct answer here. At real scale, with concurrent writers on shared budgets, I'd revisit it. Choosing it now and knowing when I'd change it is the point.

Data model
Two buckets: money paid and money committed, tracked apart.

Because a committed dollar and a paid dollar are not the same dollar. When a charge lands it moves from committed to paid. It's a transfer, not new spend. Keeping the buckets separate is what stops the double-counting that makes a naive "sum the spend" tool quietly wrong.

Act II · the build · data engineering

Eight scenarios by hand, before the agent. Then the pairs that test generalization.

The dataset is the spine, so it came first. Three of the eight are stay-silent cases, because restraint is the differentiator. Catching overspend is easy. Knowing when to say nothing is the hard, valuable part.

The generalization proof: boundary pairs.

The same budget and the same money on the books, but the opposite correct answer, because one decisive fact differs. If the agent were pattern-matching the surface, it could not get both. Getting both right is the line between reasoning and memorizing.

Flag
$210,000
105% of plan, over. The campaign is active, so the $30K it hasn't billed will still get spent.
one fact differs
Silent
$180,000
90% of plan, under. The campaign closed under budget, so that $30K will never be spent.

Same starting point, opposite call. The only thing that differs between the two is whether the campaign is still running; the money already on the books is identical. The mutations are built as pairs like this on purpose, so a passing score can't be memorization.

8 golden scenarios, hand-authored before the agent existed
120 mutations, template-generated, labels machine-verified
128 total cases scored in the run
The agent on four of these, in its own words. Unedited exhibit evidence.
◦ Stayed silent · 95% surface

The maxed-looking budget it ignored

Marketing · looks 95% spent

"Brightline Creative's brand campaign was signed at a $180,000 ceiling, but only $150,000 was ever billed — the engagement is closed, finished, and delivered under budget. That leftover $30,000 will never be billed or spent, so it's correctly left out of the true position."

read the full brief
Marketing (Q3 2026) — watched, nothing to act on. Surface shows 95% of plan spent; the true position (paid plus what's still owed) is 97% — $194,000 against a $200,000 plan, $6,000 still under. One month left in the quarter. The one thing worth naming so you're not caught off guard by it later: Brightline Creative's brand campaign was signed at a $180,000 ceiling, but only $150,000 was ever billed — the engagement is closed, finished, and delivered under budget. That leftover $30,000 will never be billed or spent, so it's correctly left out of the true position. If you ever see that $180,000 signed figure surface somewhere and wonder why the numbers don't match, that's why. The only actual forward money left is a small $4,000 Evergreen Content SOW for month-3 work, not yet billed. Nothing hidden, nothing in email-only form — both remaining commitments are logged, signed contracts. Nothing to do here. Budget's in good shape.
◦ Stayed silent · 22%→89% jump

The spike it cleared

Software & Tools · a $60K renewal appears

"The true position is 89% of plan because a $60,000 Helix renewal sits unbilled — a big jump from surface. It's not a blindside: signed annual contract on file, same charge every year, finance already builds it into the plan."

read the full brief
Software & Tools — watched, nothing to act on. Surface dashboard shows 22% spent ($20,000 paid against $90,000 planned). The true position is 89% of plan ($80,000), because there's a $60,000 signed Helix Data Cloud renewal sitting unbilled. That's a big jump from surface to true — worth naming so you know I saw it, not missed it. It's not a blindside: the Helix renewal is a signed annual contract on file (recurring every year, same $60K), scheduled to invoice this quarter, and the finance team already builds it into this plan. Even fully counted, it leaves the budget under plan with $10,000 of headroom, one month still left in the quarter. Everything else on the ledger is routine monthly tool spend — Slack, GitHub, Datadog, Figma, Notion — paid on schedule each month, nothing unlogged or hiding in email. No action needed. Just flagging that the 22%-looks-light dashboard is masking an 89%-of-plan reality, and that reality is expected, not a surprise.
◦ Refused to guess · calibrated uncertainty

The unresolved thread it wouldn't put a number on.

Recruiting commitment · an unresolved email thread

"The real range is $90,000 to $115,000 against a $100,000 plan — anywhere from comfortably under to already over — because one commitment isn't settled. The thread started at $50K for two roles, someone said 'pause the second,' someone replied 'we might still want both — let me check with finance,' and it trails off. So it's $25,000 or $50,000 — not the midpoint, not anything in between as a fact."

read the full brief
Contractors & Professional Services — Can't call this over or under yet The dashboard shows this budget 55% spent. The real range is $90,000 to $115,000 against a $100,000 plan — anywhere from comfortably under to already over — because one commitment isn't settled yet. Here's what's firm: $55,000 paid out so far. On top of that, a signed Keystone Advisory SOW has $10,000 remaining and unbilled — clean, settled, not in question. Then there's a $37,500 placeholder for a recruiting-agency commitment that exists only as an email thread. That thread started at $50,000 for two engineering roles, someone said "pause the second role" (dropping it to ~$25,000), someone else replied "we might still want both — let me check with finance," and it trails off with no decision. So the real number is $25,000 or $50,000 — not the midpoint. Nothing has hit the account yet — that's exactly the moment where this is still preventable. If the recruiting spend resolves to two roles, this budget closes at 115% of plan; if one, 90%. That's a 25-point swing sitting on an unanswered email. Don't let this get counted at either end. Go to Dana Okafor and get a real number: one role or two, and is finance signing off? Get it logged as a real commitment — not an email thread — before month-end.
● Caught over time · trajectory

Fine at every snapshot, still headed for a breach.

Sales · four weekly readings, all under plan

"Sales looks 79% spent. The story is the rate: $20K → $45K → $72K → $95K over four weeks, gaining ~$25,000 a week. Run that pace one more week and it projects to $118,000 against a $120,000 plan — the breach is two weeks out, not two months. The danger is between the frames, not in any one snapshot."

read the full brief
Sales — Flag, early: pace headed to breach in ~2 weeks Sales looks 79% spent through week four. At the pace it's climbing, it's on track to run out of runway within two more weeks — not by month-end, but almost immediately. There's no hidden commitment pile here — every dollar counted is already paid. The real story is the rate: true spend went $20,000 → $45,000 → $72,000 → $95,000 over the first four weeks, gaining $25,000, then $27,000, then $23,000 each week. That's a steady climb, not a one-time spike. Run that same pace forward one more week and Sales projects to $118,000, against a $120,000 plan, with two months still left in the quarter. Runway: two months remain, but at the recent weekly pace the plan gets used up in about two weeks. That's the window to act before this becomes a "we blew the quarter's sales budget in month one" conversation instead of a "we caught it and re-paced" one. Go to Jordan Reyes now and get a straight answer on what's still planned for weeks five through eight. If nothing is pulling back the spend rate, decide now whether to trim upcoming sponsorships/ad spend or formally flag Sales for a plan increase — before the money's out the door.
Act II · the evaluation · the centerpiece

The evaluation is the actual work. Here it is, caveat first.

This is the part that answers whether it generalizes, and the part almost no portfolio shows. It follows the framework's eval process step by step.

Read this before the numbers

These scores come from a single scored pass per case, which makes them point estimates with real error bars, not a settled statistical result. That was not the plan. I built a tiered stability run: three passes on every case, with four more on any case where the verdict or the grade wobbled, because a single run tells you a score and three tell you whether the score is stable. It hit a hard budget ceiling mid-execution. 334 agent runs died on a credit wall. So I salvaged the passes that had completed, ran the rest once, and reported that. The raw records are in the repo, credit errors and all.

Fourteen cases did finish all three passes before the money ran out. Thirteen returned the same verdict every time. One, a stay-silent case, came back SILENT twice and UNCERTAIN once. That is a small and skewed sample — seven of the fourteen are mutations of one seed — so treat it as a hint rather than a measurement: the agent looks stable when it catches and less stable when it holds back. Which is the same direction as the four false positives below.

Nothing was tuned to flatter the score. The run that got scored for each case is simply the first one that did not crash, chosen by code that never sees the correct answer.

Built in strict order. Each step gates the next.
Step 1Golden datasethand-labeled ground truth
Step 2Validate the gradercheck the ruler first
Step 3Mutationsboundary pairs, verified
Step 4Scoring runevery case, one pass

I validated the grader before trusting it. A grader you haven't checked is a ruler you haven't measured. Mine agreed with my own hand-labels on 12 of 12 cases, and held the same verdict on 60 of 60 repeated runs. Only then did I use it to score anything.

The grader is neuro-symbolic. Code hard-gates the objective failures: a fabricated number or the wrong budget is an automatic fail, no model involved. An Opus judge, the most capable model, decides intent: right call, sound reasoning. Verdicts are binary with a written rationale, never a scalar, because a 7.5/10 hides which cases actually broke. The numbers below clear the launch floors I set in advance: 0.70 precision, 0.60 recall.

94.5%
Precision
100%
Recall
128
Graded cases
12/12
Grader vs. my labels
69
caught, correctly
0
missed (false neg)
4
cried wolf (false pos)
55
correctly silent

It missed nothing. Every budget that was genuinely over plan got flagged, so recall is 100%. The only errors were 4 false positives, which means the weak spot is precision, not recall. What those four have in common is the point of the next panel.

122 of 128 cases graded a clean pass. The rest were the 4 cry-wolf flags and 2 right-call-but-imperfect-framing cases.

The eval doing its job

The four false positives are one failure, and I called it before the run.

All four false positives are the same mode: the agent cries wolf on an under-plan budget that has a surprise, email-only commitment. During the build I flagged this exact edge as untested, a surprise commitment sitting under plan, where the restraint rule was thin. The scoring run confirmed it. That is not a stat to apologize for. It is the evaluation finding the specific weakness I predicted, which is the entire reason to build one. The fix is a targeted restraint case for that edge, then a re-score.

Act II · safety · the honesty guarantee

Two layers of honesty, and a reward function aimed at the real failure.

Provenance is enforced in code. The validator rejects any number in a brief that doesn't trace to a tool output. The model cannot make a figure up, because the code won't let the brief through if it does.

Semantic accuracy is measured by the eval. Provenance says the number is real. The rubric says the judgment is right. Two different guarantees, checked two different ways.

Precision over recall is a reward-function decision, not a shrug. A controller who gets flooded with false alarms turns the tool off, and then it catches nothing. The real-world failure isn't a missed flag. It's the fifth false alarm that ends the trust, the same way developers mute a noisy code reviewer. So I optimized for precision, and the eval holds me to it.

The point

Don't evaluate the idea. Audit how I build and evaluate.

Ramp's Policy Agent and Warp's compliance agent landed on the same shape I reasoned my way to: watch a stream, catch what a stretched team would miss, draft a fix, let a human approve it. The shape is table stakes. The build and the evaluation above are the part that's hard to fake, held to the bar your team would hold them to. That's the whole artifact: not a claim that Lookout is a company, but proof of how I'd work on yours.

I'm Sidharth Sundaram. I built this as a working artifact for a product role at a team like Ramp's or Warp's. It runs entirely on synthetic data, so it costs nothing to run, and every number on the page checks out against the data it reads.

Lookout · committed-spend agent synthetic data · real agent outputs · replayed, not regenerated